From 12d052c6d2b630f9c327a265fccb9424c00c4396 Mon Sep 17 00:00:00 2001 From: lihuilin Date: Thu, 21 Aug 2025 10:14:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=89=E8=BD=AE=E6=92=AD=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App.vue | 10 + common/css/commonStyle.css | 3 + common/images/cu某.jpg | Bin 0 -> 12261 bytes common/images/你是这么大的猪!.jpg | Bin 0 -> 95745 bytes common/images/你的发言仿佛没有脑子.jpg | Bin 0 -> 67015 bytes common/images/原始黄其振.jpg | Bin 0 -> 7676 bytes common/images/我不是黄其振的狗.jpg | Bin 0 -> 6045 bytes common/images/我小点声哭.jpg | Bin 0 -> 36065 bytes common/images/无腿黄其振.jpg | Bin 0 -> 9883 bytes common/images/桑qriu忒.jpg | Bin 0 -> 11290 bytes common/images/爱莉1.jpg | Bin 0 -> 29019 bytes common/images/爱莉2.jpg | Bin 0 -> 15881 bytes common/images/真我光锥.jpg | Bin 0 -> 8496 bytes common/images/西装黄其振.jpg | Bin 0 -> 55094 bytes common/images/证件照黄其振.jpg | Bin 0 -> 28361 bytes common/images/赵文康竖中指.jpg | Bin 0 -> 93399 bytes components/aa/aa.vue | 13 + index.html | 20 + main.js | 25 + manifest.json | 60 + pages.json | 17 + pages/index/index.vue | 112 + pages/login/login.vue | 11 + static/c1.png | Bin 0 -> 401 bytes static/c2.png | Bin 0 -> 470 bytes static/c3.png | Bin 0 -> 511 bytes static/c4.png | Bin 0 -> 476 bytes static/c5.png | Bin 0 -> 472 bytes static/c6.png | Bin 0 -> 545 bytes static/c7.png | Bin 0 -> 365 bytes static/c8.png | Bin 0 -> 587 bytes static/c9.png | Bin 0 -> 565 bytes static/customicons.css | 20 + static/customicons.ttf | Bin 0 -> 2416 bytes static/logo.png | Bin 0 -> 4023 bytes static/uni.png | Bin 0 -> 4162 bytes uni.scss | 1 + uni_modules/uni-badge/changelog.md | 33 + .../uni-badge/components/uni-badge/uni-badge.vue | 268 + uni_modules/uni-badge/package.json | 85 + uni_modules/uni-badge/readme.md | 10 + uni_modules/uni-breadcrumb/changelog.md | 6 + .../uni-breadcrumb-item/uni-breadcrumb-item.vue | 126 + .../components/uni-breadcrumb/uni-breadcrumb.vue | 46 + uni_modules/uni-breadcrumb/package.json | 88 + uni_modules/uni-breadcrumb/readme.md | 66 + uni_modules/uni-calendar/changelog.md | 28 + .../components/uni-calendar/calendar.js | 546 ++ .../components/uni-calendar/i18n/en.json | 12 + .../components/uni-calendar/i18n/index.js | 8 + .../components/uni-calendar/i18n/zh-Hans.json | 12 + .../components/uni-calendar/i18n/zh-Hant.json | 12 + .../components/uni-calendar/uni-calendar-item.vue | 187 + .../components/uni-calendar/uni-calendar.vue | 567 ++ .../uni-calendar/components/uni-calendar/util.js | 360 + uni_modules/uni-calendar/package.json | 85 + uni_modules/uni-calendar/readme.md | 103 + uni_modules/uni-card/changelog.md | 26 + .../uni-card/components/uni-card/uni-card.vue | 270 + uni_modules/uni-card/package.json | 90 + uni_modules/uni-card/readme.md | 12 + uni_modules/uni-collapse/changelog.md | 38 + .../uni-collapse-item/uni-collapse-item.vue | 402 + .../components/uni-collapse/uni-collapse.vue | 147 + uni_modules/uni-collapse/package.json | 86 + uni_modules/uni-collapse/readme.md | 12 + uni_modules/uni-combox/changelog.md | 15 + .../components/uni-combox/uni-combox.vue | 275 + uni_modules/uni-combox/package.json | 90 + uni_modules/uni-combox/readme.md | 11 + uni_modules/uni-countdown/changelog.md | 26 + .../components/uni-countdown/i18n/en.json | 6 + .../components/uni-countdown/i18n/index.js | 8 + .../components/uni-countdown/i18n/zh-Hans.json | 6 + .../components/uni-countdown/i18n/zh-Hant.json | 6 + .../components/uni-countdown/uni-countdown.vue | 281 + uni_modules/uni-countdown/package.json | 83 + uni_modules/uni-countdown/readme.md | 10 + uni_modules/uni-data-checkbox/changelog.md | 49 + .../uni-data-checkbox/uni-data-checkbox.vue | 849 +++ uni_modules/uni-data-checkbox/package.json | 84 + uni_modules/uni-data-checkbox/readme.md | 18 + uni_modules/uni-data-picker/changelog.md | 77 + .../components/uni-data-picker/keypress.js | 45 + .../uni-data-picker/uni-data-picker.uvue | 380 + .../components/uni-data-picker/uni-data-picker.vue | 551 ++ .../components/uni-data-pickerview/loading.uts | 1 + .../uni-data-pickerview/uni-data-picker.js | 622 ++ .../uni-data-pickerview/uni-data-picker.uts | 693 ++ .../uni-data-pickerview/uni-data-pickerview.css | 76 + .../uni-data-pickerview/uni-data-pickerview.uvue | 69 + .../uni-data-pickerview/uni-data-pickerview.vue | 323 + uni_modules/uni-data-picker/package.json | 91 + uni_modules/uni-data-picker/readme.md | 22 + uni_modules/uni-data-select/changelog.md | 39 + .../components/uni-data-select/uni-data-select.vue | 562 ++ uni_modules/uni-data-select/package.json | 86 + uni_modules/uni-data-select/readme.md | 8 + uni_modules/uni-dateformat/changelog.md | 10 + .../components/uni-dateformat/date-format.js | 200 + .../components/uni-dateformat/uni-dateformat.vue | 88 + uni_modules/uni-dateformat/package.json | 88 + uni_modules/uni-dateformat/readme.md | 11 + uni_modules/uni-datetime-picker/changelog.md | 160 + .../uni-datetime-picker/calendar-item.vue | 177 + .../components/uni-datetime-picker/calendar.vue | 947 +++ .../components/uni-datetime-picker/i18n/en.json | 22 + .../components/uni-datetime-picker/i18n/index.js | 8 + .../uni-datetime-picker/i18n/zh-Hans.json | 22 + .../uni-datetime-picker/i18n/zh-Hant.json | 22 + .../components/uni-datetime-picker/time-picker.vue | 940 +++ .../uni-datetime-picker/uni-datetime-picker.vue | 1057 +++ .../components/uni-datetime-picker/util.js | 421 ++ uni_modules/uni-datetime-picker/package.json | 88 + uni_modules/uni-datetime-picker/readme.md | 21 + uni_modules/uni-drawer/changelog.md | 13 + .../uni-drawer/components/uni-drawer/keypress.js | 45 + .../components/uni-drawer/uni-drawer.vue | 183 + uni_modules/uni-drawer/package.json | 87 + uni_modules/uni-drawer/readme.md | 10 + uni_modules/uni-easyinput/changelog.md | 113 + .../components/uni-easyinput/common.js | 54 + .../components/uni-easyinput/uni-easyinput.vue | 693 ++ uni_modules/uni-easyinput/package.json | 88 + uni_modules/uni-easyinput/readme.md | 11 + uni_modules/uni-fab/changelog.md | 23 + uni_modules/uni-fab/components/uni-fab/uni-fab.vue | 491 ++ uni_modules/uni-fab/package.json | 84 + uni_modules/uni-fab/readme.md | 9 + uni_modules/uni-fav/changelog.md | 19 + .../uni-fav/components/uni-fav/i18n/en.json | 4 + .../uni-fav/components/uni-fav/i18n/index.js | 8 + .../uni-fav/components/uni-fav/i18n/zh-Hans.json | 4 + .../uni-fav/components/uni-fav/i18n/zh-Hant.json | 4 + uni_modules/uni-fav/components/uni-fav/uni-fav.vue | 161 + uni_modules/uni-fav/package.json | 89 + uni_modules/uni-fav/readme.md | 10 + uni_modules/uni-file-picker/changelog.md | 75 + .../uni-file-picker/choose-and-upload-file.js | 287 + .../components/uni-file-picker/uni-file-picker.vue | 678 ++ .../components/uni-file-picker/upload-file.vue | 325 + .../components/uni-file-picker/upload-image.vue | 292 + .../components/uni-file-picker/utils.js | 110 + uni_modules/uni-file-picker/package.json | 83 + uni_modules/uni-file-picker/readme.md | 11 + uni_modules/uni-forms/changelog.md | 94 + .../components/uni-forms-item/uni-forms-item.vue | 627 ++ .../uni-forms/components/uni-forms/uni-forms.vue | 397 + .../uni-forms/components/uni-forms/utils.js | 293 + .../uni-forms/components/uni-forms/validate.js | 486 ++ uni_modules/uni-forms/package.json | 88 + uni_modules/uni-forms/readme.md | 23 + uni_modules/uni-goods-nav/changelog.md | 18 + .../components/uni-goods-nav/i18n/en.json | 6 + .../components/uni-goods-nav/i18n/index.js | 8 + .../components/uni-goods-nav/i18n/zh-Hans.json | 6 + .../components/uni-goods-nav/i18n/zh-Hant.json | 6 + .../components/uni-goods-nav/uni-goods-nav.vue | 231 + uni_modules/uni-goods-nav/package.json | 88 + uni_modules/uni-goods-nav/readme.md | 10 + uni_modules/uni-grid/changelog.md | 13 + .../components/uni-grid-item/uni-grid-item.vue | 127 + .../uni-grid/components/uni-grid/uni-grid.vue | 142 + uni_modules/uni-grid/package.json | 86 + uni_modules/uni-grid/readme.md | 11 + uni_modules/uni-group/changelog.md | 16 + .../uni-group/components/uni-group/uni-group.vue | 134 + uni_modules/uni-group/package.json | 87 + uni_modules/uni-group/readme.md | 9 + uni_modules/uni-icons/changelog.md | 42 + .../uni-icons/components/uni-icons/uni-icons.uvue | 91 + .../uni-icons/components/uni-icons/uni-icons.vue | 110 + .../uni-icons/components/uni-icons/uniicons.css | 664 ++ .../uni-icons/components/uni-icons/uniicons.ttf | Bin 0 -> 35824 bytes .../components/uni-icons/uniicons_file.ts | 664 ++ .../components/uni-icons/uniicons_file_vue.js | 649 ++ uni_modules/uni-icons/package.json | 89 + uni_modules/uni-icons/readme.md | 8 + uni_modules/uni-indexed-list/changelog.md | 17 + .../uni-indexed-list/uni-indexed-list-item.vue | 144 + .../uni-indexed-list/uni-indexed-list.vue | 367 + uni_modules/uni-indexed-list/package.json | 89 + uni_modules/uni-indexed-list/readme.md | 11 + uni_modules/uni-link/changelog.md | 17 + .../uni-link/components/uni-link/uni-link.vue | 128 + uni_modules/uni-link/package.json | 87 + uni_modules/uni-link/readme.md | 11 + uni_modules/uni-list/changelog.md | 46 + .../components/uni-list-ad/uni-list-ad.vue | 107 + .../components/uni-list-chat/uni-list-chat.scss | 58 + .../components/uni-list-chat/uni-list-chat.vue | 593 ++ .../components/uni-list-item/uni-list-item.vue | 534 ++ .../uni-list/components/uni-list/uni-list.vue | 123 + .../uni-list/components/uni-list/uni-refresh.vue | 65 + .../uni-list/components/uni-list/uni-refresh.wxs | 87 + uni_modules/uni-list/package.json | 88 + uni_modules/uni-list/readme.md | 346 + uni_modules/uni-load-more/changelog.md | 19 + .../components/uni-load-more/i18n/en.json | 5 + .../components/uni-load-more/i18n/index.js | 8 + .../components/uni-load-more/i18n/zh-Hans.json | 5 + .../components/uni-load-more/i18n/zh-Hant.json | 5 + .../components/uni-load-more/uni-load-more.vue | 399 + uni_modules/uni-load-more/package.json | 86 + uni_modules/uni-load-more/readme.md | 14 + uni_modules/uni-nav-bar/changelog.md | 51 + .../components/uni-nav-bar/uni-nav-bar.vue | 357 + .../components/uni-nav-bar/uni-status-bar.vue | 24 + uni_modules/uni-nav-bar/package.json | 86 + uni_modules/uni-nav-bar/readme.md | 15 + uni_modules/uni-notice-bar/changelog.md | 20 + .../components/uni-notice-bar/uni-notice-bar.vue | 431 ++ uni_modules/uni-notice-bar/package.json | 87 + uni_modules/uni-notice-bar/readme.md | 13 + uni_modules/uni-number-box/changelog.md | 39 + .../components/uni-number-box/uni-number-box.vue | 232 + uni_modules/uni-number-box/package.json | 83 + uni_modules/uni-number-box/readme.md | 13 + uni_modules/uni-pagination/changelog.md | 27 + .../components/uni-pagination/i18n/en.json | 5 + .../components/uni-pagination/i18n/es.json | 5 + .../components/uni-pagination/i18n/fr.json | 5 + .../components/uni-pagination/i18n/index.js | 12 + .../components/uni-pagination/i18n/zh-Hans.json | 5 + .../components/uni-pagination/i18n/zh-Hant.json | 5 + .../components/uni-pagination/uni-pagination.vue | 465 ++ uni_modules/uni-pagination/package.json | 83 + uni_modules/uni-pagination/readme.md | 11 + uni_modules/uni-popup/changelog.md | 84 + .../components/uni-popup-dialog/keypress.js | 45 + .../uni-popup-dialog/uni-popup-dialog.vue | 316 + .../uni-popup-message/uni-popup-message.vue | 143 + .../components/uni-popup-share/uni-popup-share.vue | 187 + .../uni-popup/components/uni-popup/i18n/en.json | 7 + .../uni-popup/components/uni-popup/i18n/index.js | 8 + .../components/uni-popup/i18n/zh-Hans.json | 7 + .../components/uni-popup/i18n/zh-Hant.json | 7 + .../uni-popup/components/uni-popup/keypress.js | 45 + .../uni-popup/components/uni-popup/popup.js | 26 + .../uni-popup/components/uni-popup/uni-popup.uvue | 90 + .../uni-popup/components/uni-popup/uni-popup.vue | 503 ++ uni_modules/uni-popup/package.json | 88 + uni_modules/uni-popup/readme.md | 17 + uni_modules/uni-rate/changelog.md | 25 + .../uni-rate/components/uni-rate/uni-rate.vue | 361 + uni_modules/uni-rate/package.json | 88 + uni_modules/uni-rate/readme.md | 12 + uni_modules/uni-row/changelog.md | 10 + uni_modules/uni-row/components/uni-col/uni-col.vue | 317 + uni_modules/uni-row/components/uni-row/uni-row.vue | 190 + uni_modules/uni-row/package.json | 87 + uni_modules/uni-row/readme.md | 10 + uni_modules/uni-scss/changelog.md | 8 + uni_modules/uni-scss/index.scss | 1 + uni_modules/uni-scss/package.json | 82 + uni_modules/uni-scss/readme.md | 4 + uni_modules/uni-scss/styles/index.scss | 7 + uni_modules/uni-scss/styles/setting/_border.scss | 3 + uni_modules/uni-scss/styles/setting/_color.scss | 66 + uni_modules/uni-scss/styles/setting/_radius.scss | 55 + uni_modules/uni-scss/styles/setting/_space.scss | 56 + uni_modules/uni-scss/styles/setting/_styles.scss | 167 + uni_modules/uni-scss/styles/setting/_text.scss | 24 + .../uni-scss/styles/setting/_variables.scss | 146 + uni_modules/uni-scss/styles/tools/functions.scss | 19 + uni_modules/uni-scss/theme.scss | 31 + uni_modules/uni-scss/variables.scss | 62 + uni_modules/uni-search-bar/changelog.md | 47 + .../components/uni-search-bar/i18n/en.json | 4 + .../components/uni-search-bar/i18n/index.js | 8 + .../components/uni-search-bar/i18n/zh-Hans.json | 4 + .../components/uni-search-bar/i18n/zh-Hant.json | 4 + .../components/uni-search-bar/uni-search-bar.vue | 309 + uni_modules/uni-search-bar/package.json | 87 + uni_modules/uni-search-bar/readme.md | 14 + uni_modules/uni-section/changelog.md | 2 + .../components/uni-section/uni-section.vue | 167 + uni_modules/uni-section/package.json | 87 + uni_modules/uni-section/readme.md | 8 + uni_modules/uni-segmented-control/changelog.md | 15 + .../uni-segmented-control.vue | 146 + uni_modules/uni-segmented-control/package.json | 85 + uni_modules/uni-segmented-control/readme.md | 13 + uni_modules/uni-steps/changelog.md | 18 + .../uni-steps/components/uni-steps/uni-steps.vue | 280 + uni_modules/uni-steps/package.json | 87 + uni_modules/uni-steps/readme.md | 13 + uni_modules/uni-swipe-action/changelog.md | 47 + .../components/uni-swipe-action-item/bindingx.js | 302 + .../components/uni-swipe-action-item/isPC.js | 12 + .../components/uni-swipe-action-item/mpalipay.js | 195 + .../components/uni-swipe-action-item/mpother.js | 260 + .../components/uni-swipe-action-item/mpwxs.js | 84 + .../components/uni-swipe-action-item/render.js | 270 + .../uni-swipe-action-item.vue | 348 + .../components/uni-swipe-action-item/wx.wxs | 341 + .../uni-swipe-action/uni-swipe-action.vue | 60 + uni_modules/uni-swipe-action/package.json | 84 + uni_modules/uni-swipe-action/readme.md | 11 + uni_modules/uni-swiper-dot/changelog.md | 12 + .../components/uni-swiper-dot/uni-swiper-dot.vue | 218 + uni_modules/uni-swiper-dot/package.json | 87 + uni_modules/uni-swiper-dot/readme.md | 11 + uni_modules/uni-table/changelog.md | 29 + .../uni-table/components/uni-table/uni-table.vue | 455 ++ .../uni-table/components/uni-tbody/uni-tbody.vue | 29 + uni_modules/uni-table/components/uni-td/uni-td.vue | 90 + .../components/uni-th/filter-dropdown.vue | 511 ++ uni_modules/uni-table/components/uni-th/uni-th.vue | 285 + .../uni-table/components/uni-thead/uni-thead.vue | 137 + .../uni-table/components/uni-tr/table-checkbox.vue | 179 + uni_modules/uni-table/components/uni-tr/uni-tr.vue | 184 + uni_modules/uni-table/i18n/en.json | 9 + uni_modules/uni-table/i18n/es.json | 9 + uni_modules/uni-table/i18n/fr.json | 9 + uni_modules/uni-table/i18n/index.js | 12 + uni_modules/uni-table/i18n/zh-Hans.json | 9 + uni_modules/uni-table/i18n/zh-Hant.json | 9 + uni_modules/uni-table/package.json | 83 + uni_modules/uni-table/readme.md | 13 + uni_modules/uni-tag/changelog.md | 23 + uni_modules/uni-tag/components/uni-tag/uni-tag.vue | 252 + uni_modules/uni-tag/package.json | 84 + uni_modules/uni-tag/readme.md | 13 + uni_modules/uni-test/changelog.md | 39 + .../uni-test/components/uni-test/uni-test.vue | 26 + uni_modules/uni-test/package.json | 83 + uni_modules/uni-test/readme.md | 10 + uni_modules/uni-title/changelog.md | 10 + .../uni-title/components/uni-title/uni-title.vue | 171 + uni_modules/uni-title/package.json | 88 + uni_modules/uni-title/readme.md | 14 + uni_modules/uni-tooltip/changelog.md | 16 + .../components/uni-tooltip/uni-tooltip.vue | 109 + uni_modules/uni-tooltip/package.json | 86 + uni_modules/uni-tooltip/readme.md | 8 + uni_modules/uni-transition/changelog.md | 24 + .../components/uni-transition/createAnimation.js | 131 + .../components/uni-transition/uni-transition.vue | 286 + uni_modules/uni-transition/package.json | 85 + uni_modules/uni-transition/readme.md | 11 + uni_modules/uni-ui/changelog.md | 578 ++ uni_modules/uni-ui/components/uni-ui/uni-ui.vue | 7 + uni_modules/uni-ui/package.json | 130 + uni_modules/uni-ui/readme.md | 247 + unpackage/dist/cache/.vite/deps/_metadata.json | 8 + unpackage/dist/cache/.vite/deps/package.json | 3 + unpackage/dist/dev/.sourcemap/mp-weixin/app.js.map | 1 + .../dev/.sourcemap/mp-weixin/common/vendor.js.map | 1 + .../.sourcemap/mp-weixin/pages/index/index.js.map | 1 + .../uni-link/components/uni-link/uni-link.js.map | 1 + unpackage/dist/dev/mp-weixin/app.js | 27 + unpackage/dist/dev/mp-weixin/app.json | 13 + unpackage/dist/dev/mp-weixin/app.wxss | 2362 ++++++ unpackage/dist/dev/mp-weixin/common/vendor.js | 7893 ++++++++++++++++++++ unpackage/dist/dev/mp-weixin/pages/index/index.js | 29 + .../dist/dev/mp-weixin/pages/index/index.json | 6 + .../dist/dev/mp-weixin/pages/index/index.wxml | 1 + .../dist/dev/mp-weixin/pages/index/index.wxss | 6 + unpackage/dist/dev/mp-weixin/project.config.json | 36 + unpackage/dist/dev/mp-weixin/static/c1.png | Bin 0 -> 401 bytes unpackage/dist/dev/mp-weixin/static/c2.png | Bin 0 -> 470 bytes unpackage/dist/dev/mp-weixin/static/c3.png | Bin 0 -> 511 bytes unpackage/dist/dev/mp-weixin/static/c4.png | Bin 0 -> 476 bytes unpackage/dist/dev/mp-weixin/static/c5.png | Bin 0 -> 472 bytes unpackage/dist/dev/mp-weixin/static/c6.png | Bin 0 -> 545 bytes unpackage/dist/dev/mp-weixin/static/c7.png | Bin 0 -> 365 bytes unpackage/dist/dev/mp-weixin/static/c8.png | Bin 0 -> 587 bytes unpackage/dist/dev/mp-weixin/static/c9.png | Bin 0 -> 565 bytes .../dist/dev/mp-weixin/static/customicons.css | 20 + .../dist/dev/mp-weixin/static/customicons.ttf | Bin 0 -> 2416 bytes unpackage/dist/dev/mp-weixin/static/logo.png | Bin 0 -> 4023 bytes unpackage/dist/dev/mp-weixin/static/uni.png | Bin 0 -> 4162 bytes .../uni-link/components/uni-link/uni-link.js | 89 + .../uni-link/components/uni-link/uni-link.json | 4 + .../uni-link/components/uni-link/uni-link.wxml | 1 + .../uni-link/components/uni-link/uni-link.wxss | 7 + 377 files changed, 50923 insertions(+) create mode 100644 App.vue create mode 100644 common/css/commonStyle.css create mode 100644 common/images/cu某.jpg create mode 100644 common/images/你是这么大的猪!.jpg create mode 100644 common/images/你的发言仿佛没有脑子.jpg create mode 100644 common/images/原始黄其振.jpg create mode 100644 common/images/我不是黄其振的狗.jpg create mode 100644 common/images/我小点声哭.jpg create mode 100644 common/images/无腿黄其振.jpg create mode 100644 common/images/桑qriu忒.jpg create mode 100644 common/images/爱莉1.jpg create mode 100644 common/images/爱莉2.jpg create mode 100644 common/images/真我光锥.jpg create mode 100644 common/images/西装黄其振.jpg create mode 100644 common/images/证件照黄其振.jpg create mode 100644 common/images/赵文康竖中指.jpg create mode 100644 components/aa/aa.vue create mode 100644 index.html create mode 100644 main.js create mode 100644 manifest.json create mode 100644 pages.json create mode 100644 pages/index/index.vue create mode 100644 pages/login/login.vue create mode 100644 static/c1.png create mode 100644 static/c2.png create mode 100644 static/c3.png create mode 100644 static/c4.png create mode 100644 static/c5.png create mode 100644 static/c6.png create mode 100644 static/c7.png create mode 100644 static/c8.png create mode 100644 static/c9.png create mode 100644 static/customicons.css create mode 100644 static/customicons.ttf create mode 100644 static/logo.png create mode 100644 static/uni.png create mode 100644 uni.scss create mode 100644 uni_modules/uni-badge/changelog.md create mode 100644 uni_modules/uni-badge/components/uni-badge/uni-badge.vue create mode 100644 uni_modules/uni-badge/package.json create mode 100644 uni_modules/uni-badge/readme.md create mode 100644 uni_modules/uni-breadcrumb/changelog.md create mode 100644 uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue create mode 100644 uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue create mode 100644 uni_modules/uni-breadcrumb/package.json create mode 100644 uni_modules/uni-breadcrumb/readme.md create mode 100644 uni_modules/uni-calendar/changelog.md create mode 100644 uni_modules/uni-calendar/components/uni-calendar/calendar.js create mode 100644 uni_modules/uni-calendar/components/uni-calendar/i18n/en.json create mode 100644 uni_modules/uni-calendar/components/uni-calendar/i18n/index.js create mode 100644 uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json create mode 100644 uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json create mode 100644 uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue create mode 100644 uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue create mode 100644 uni_modules/uni-calendar/components/uni-calendar/util.js create mode 100644 uni_modules/uni-calendar/package.json create mode 100644 uni_modules/uni-calendar/readme.md create mode 100644 uni_modules/uni-card/changelog.md create mode 100644 uni_modules/uni-card/components/uni-card/uni-card.vue create mode 100644 uni_modules/uni-card/package.json create mode 100644 uni_modules/uni-card/readme.md create mode 100644 uni_modules/uni-collapse/changelog.md create mode 100644 uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue create mode 100644 uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue create mode 100644 uni_modules/uni-collapse/package.json create mode 100644 uni_modules/uni-collapse/readme.md create mode 100644 uni_modules/uni-combox/changelog.md create mode 100644 uni_modules/uni-combox/components/uni-combox/uni-combox.vue create mode 100644 uni_modules/uni-combox/package.json create mode 100644 uni_modules/uni-combox/readme.md create mode 100644 uni_modules/uni-countdown/changelog.md create mode 100644 uni_modules/uni-countdown/components/uni-countdown/i18n/en.json create mode 100644 uni_modules/uni-countdown/components/uni-countdown/i18n/index.js create mode 100644 uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hans.json create mode 100644 uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hant.json create mode 100644 uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue create mode 100644 uni_modules/uni-countdown/package.json create mode 100644 uni_modules/uni-countdown/readme.md create mode 100644 uni_modules/uni-data-checkbox/changelog.md create mode 100644 uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue create mode 100644 uni_modules/uni-data-checkbox/package.json create mode 100644 uni_modules/uni-data-checkbox/readme.md create mode 100644 uni_modules/uni-data-picker/changelog.md create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/keypress.js create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/loading.uts create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue create mode 100644 uni_modules/uni-data-picker/package.json create mode 100644 uni_modules/uni-data-picker/readme.md create mode 100644 uni_modules/uni-data-select/changelog.md create mode 100644 uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue create mode 100644 uni_modules/uni-data-select/package.json create mode 100644 uni_modules/uni-data-select/readme.md create mode 100644 uni_modules/uni-dateformat/changelog.md create mode 100644 uni_modules/uni-dateformat/components/uni-dateformat/date-format.js create mode 100644 uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue create mode 100644 uni_modules/uni-dateformat/package.json create mode 100644 uni_modules/uni-dateformat/readme.md create mode 100644 uni_modules/uni-datetime-picker/changelog.md create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js create mode 100644 uni_modules/uni-datetime-picker/package.json create mode 100644 uni_modules/uni-datetime-picker/readme.md create mode 100644 uni_modules/uni-drawer/changelog.md create mode 100644 uni_modules/uni-drawer/components/uni-drawer/keypress.js create mode 100644 uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue create mode 100644 uni_modules/uni-drawer/package.json create mode 100644 uni_modules/uni-drawer/readme.md create mode 100644 uni_modules/uni-easyinput/changelog.md create mode 100644 uni_modules/uni-easyinput/components/uni-easyinput/common.js create mode 100644 uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue create mode 100644 uni_modules/uni-easyinput/package.json create mode 100644 uni_modules/uni-easyinput/readme.md create mode 100644 uni_modules/uni-fab/changelog.md create mode 100644 uni_modules/uni-fab/components/uni-fab/uni-fab.vue create mode 100644 uni_modules/uni-fab/package.json create mode 100644 uni_modules/uni-fab/readme.md create mode 100644 uni_modules/uni-fav/changelog.md create mode 100644 uni_modules/uni-fav/components/uni-fav/i18n/en.json create mode 100644 uni_modules/uni-fav/components/uni-fav/i18n/index.js create mode 100644 uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json create mode 100644 uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json create mode 100644 uni_modules/uni-fav/components/uni-fav/uni-fav.vue create mode 100644 uni_modules/uni-fav/package.json create mode 100644 uni_modules/uni-fav/readme.md create mode 100644 uni_modules/uni-file-picker/changelog.md create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/utils.js create mode 100644 uni_modules/uni-file-picker/package.json create mode 100644 uni_modules/uni-file-picker/readme.md create mode 100644 uni_modules/uni-forms/changelog.md create mode 100644 uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue create mode 100644 uni_modules/uni-forms/components/uni-forms/uni-forms.vue create mode 100644 uni_modules/uni-forms/components/uni-forms/utils.js create mode 100644 uni_modules/uni-forms/components/uni-forms/validate.js create mode 100644 uni_modules/uni-forms/package.json create mode 100644 uni_modules/uni-forms/readme.md create mode 100644 uni_modules/uni-goods-nav/changelog.md create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue create mode 100644 uni_modules/uni-goods-nav/package.json create mode 100644 uni_modules/uni-goods-nav/readme.md create mode 100644 uni_modules/uni-grid/changelog.md create mode 100644 uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue create mode 100644 uni_modules/uni-grid/components/uni-grid/uni-grid.vue create mode 100644 uni_modules/uni-grid/package.json create mode 100644 uni_modules/uni-grid/readme.md create mode 100644 uni_modules/uni-group/changelog.md create mode 100644 uni_modules/uni-group/components/uni-group/uni-group.vue create mode 100644 uni_modules/uni-group/package.json create mode 100644 uni_modules/uni-group/readme.md create mode 100644 uni_modules/uni-icons/changelog.md create mode 100644 uni_modules/uni-icons/components/uni-icons/uni-icons.uvue create mode 100644 uni_modules/uni-icons/components/uni-icons/uni-icons.vue create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.css create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.ttf create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons_file.ts create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js create mode 100644 uni_modules/uni-icons/package.json create mode 100644 uni_modules/uni-icons/readme.md create mode 100644 uni_modules/uni-indexed-list/changelog.md create mode 100644 uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue create mode 100644 uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue create mode 100644 uni_modules/uni-indexed-list/package.json create mode 100644 uni_modules/uni-indexed-list/readme.md create mode 100644 uni_modules/uni-link/changelog.md create mode 100644 uni_modules/uni-link/components/uni-link/uni-link.vue create mode 100644 uni_modules/uni-link/package.json create mode 100644 uni_modules/uni-link/readme.md create mode 100644 uni_modules/uni-list/changelog.md create mode 100644 uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue create mode 100644 uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss create mode 100644 uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue create mode 100644 uni_modules/uni-list/components/uni-list-item/uni-list-item.vue create mode 100644 uni_modules/uni-list/components/uni-list/uni-list.vue create mode 100644 uni_modules/uni-list/components/uni-list/uni-refresh.vue create mode 100644 uni_modules/uni-list/components/uni-list/uni-refresh.wxs create mode 100644 uni_modules/uni-list/package.json create mode 100644 uni_modules/uni-list/readme.md create mode 100644 uni_modules/uni-load-more/changelog.md create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/en.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/index.js create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue create mode 100644 uni_modules/uni-load-more/package.json create mode 100644 uni_modules/uni-load-more/readme.md create mode 100644 uni_modules/uni-nav-bar/changelog.md create mode 100644 uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue create mode 100644 uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue create mode 100644 uni_modules/uni-nav-bar/package.json create mode 100644 uni_modules/uni-nav-bar/readme.md create mode 100644 uni_modules/uni-notice-bar/changelog.md create mode 100644 uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue create mode 100644 uni_modules/uni-notice-bar/package.json create mode 100644 uni_modules/uni-notice-bar/readme.md create mode 100644 uni_modules/uni-number-box/changelog.md create mode 100644 uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue create mode 100644 uni_modules/uni-number-box/package.json create mode 100644 uni_modules/uni-number-box/readme.md create mode 100644 uni_modules/uni-pagination/changelog.md create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/en.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/es.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/index.js create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue create mode 100644 uni_modules/uni-pagination/package.json create mode 100644 uni_modules/uni-pagination/readme.md create mode 100644 uni_modules/uni-popup/changelog.md create mode 100644 uni_modules/uni-popup/components/uni-popup-dialog/keypress.js create mode 100644 uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue create mode 100644 uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue create mode 100644 uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/en.json create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/index.js create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json create mode 100644 uni_modules/uni-popup/components/uni-popup/keypress.js create mode 100644 uni_modules/uni-popup/components/uni-popup/popup.js create mode 100644 uni_modules/uni-popup/components/uni-popup/uni-popup.uvue create mode 100644 uni_modules/uni-popup/components/uni-popup/uni-popup.vue create mode 100644 uni_modules/uni-popup/package.json create mode 100644 uni_modules/uni-popup/readme.md create mode 100644 uni_modules/uni-rate/changelog.md create mode 100644 uni_modules/uni-rate/components/uni-rate/uni-rate.vue create mode 100644 uni_modules/uni-rate/package.json create mode 100644 uni_modules/uni-rate/readme.md create mode 100644 uni_modules/uni-row/changelog.md create mode 100644 uni_modules/uni-row/components/uni-col/uni-col.vue create mode 100644 uni_modules/uni-row/components/uni-row/uni-row.vue create mode 100644 uni_modules/uni-row/package.json create mode 100644 uni_modules/uni-row/readme.md create mode 100644 uni_modules/uni-scss/changelog.md create mode 100644 uni_modules/uni-scss/index.scss create mode 100644 uni_modules/uni-scss/package.json create mode 100644 uni_modules/uni-scss/readme.md create mode 100644 uni_modules/uni-scss/styles/index.scss create mode 100644 uni_modules/uni-scss/styles/setting/_border.scss create mode 100644 uni_modules/uni-scss/styles/setting/_color.scss create mode 100644 uni_modules/uni-scss/styles/setting/_radius.scss create mode 100644 uni_modules/uni-scss/styles/setting/_space.scss create mode 100644 uni_modules/uni-scss/styles/setting/_styles.scss create mode 100644 uni_modules/uni-scss/styles/setting/_text.scss create mode 100644 uni_modules/uni-scss/styles/setting/_variables.scss create mode 100644 uni_modules/uni-scss/styles/tools/functions.scss create mode 100644 uni_modules/uni-scss/theme.scss create mode 100644 uni_modules/uni-scss/variables.scss create mode 100644 uni_modules/uni-search-bar/changelog.md create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue create mode 100644 uni_modules/uni-search-bar/package.json create mode 100644 uni_modules/uni-search-bar/readme.md create mode 100644 uni_modules/uni-section/changelog.md create mode 100644 uni_modules/uni-section/components/uni-section/uni-section.vue create mode 100644 uni_modules/uni-section/package.json create mode 100644 uni_modules/uni-section/readme.md create mode 100644 uni_modules/uni-segmented-control/changelog.md create mode 100644 uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue create mode 100644 uni_modules/uni-segmented-control/package.json create mode 100644 uni_modules/uni-segmented-control/readme.md create mode 100644 uni_modules/uni-steps/changelog.md create mode 100644 uni_modules/uni-steps/components/uni-steps/uni-steps.vue create mode 100644 uni_modules/uni-steps/package.json create mode 100644 uni_modules/uni-steps/readme.md create mode 100644 uni_modules/uni-swipe-action/changelog.md create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue create mode 100644 uni_modules/uni-swipe-action/package.json create mode 100644 uni_modules/uni-swipe-action/readme.md create mode 100644 uni_modules/uni-swiper-dot/changelog.md create mode 100644 uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue create mode 100644 uni_modules/uni-swiper-dot/package.json create mode 100644 uni_modules/uni-swiper-dot/readme.md create mode 100644 uni_modules/uni-table/changelog.md create mode 100644 uni_modules/uni-table/components/uni-table/uni-table.vue create mode 100644 uni_modules/uni-table/components/uni-tbody/uni-tbody.vue create mode 100644 uni_modules/uni-table/components/uni-td/uni-td.vue create mode 100644 uni_modules/uni-table/components/uni-th/filter-dropdown.vue create mode 100644 uni_modules/uni-table/components/uni-th/uni-th.vue create mode 100644 uni_modules/uni-table/components/uni-thead/uni-thead.vue create mode 100644 uni_modules/uni-table/components/uni-tr/table-checkbox.vue create mode 100644 uni_modules/uni-table/components/uni-tr/uni-tr.vue create mode 100644 uni_modules/uni-table/i18n/en.json create mode 100644 uni_modules/uni-table/i18n/es.json create mode 100644 uni_modules/uni-table/i18n/fr.json create mode 100644 uni_modules/uni-table/i18n/index.js create mode 100644 uni_modules/uni-table/i18n/zh-Hans.json create mode 100644 uni_modules/uni-table/i18n/zh-Hant.json create mode 100644 uni_modules/uni-table/package.json create mode 100644 uni_modules/uni-table/readme.md create mode 100644 uni_modules/uni-tag/changelog.md create mode 100644 uni_modules/uni-tag/components/uni-tag/uni-tag.vue create mode 100644 uni_modules/uni-tag/package.json create mode 100644 uni_modules/uni-tag/readme.md create mode 100644 uni_modules/uni-test/changelog.md create mode 100644 uni_modules/uni-test/components/uni-test/uni-test.vue create mode 100644 uni_modules/uni-test/package.json create mode 100644 uni_modules/uni-test/readme.md create mode 100644 uni_modules/uni-title/changelog.md create mode 100644 uni_modules/uni-title/components/uni-title/uni-title.vue create mode 100644 uni_modules/uni-title/package.json create mode 100644 uni_modules/uni-title/readme.md create mode 100644 uni_modules/uni-tooltip/changelog.md create mode 100644 uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue create mode 100644 uni_modules/uni-tooltip/package.json create mode 100644 uni_modules/uni-tooltip/readme.md create mode 100644 uni_modules/uni-transition/changelog.md create mode 100644 uni_modules/uni-transition/components/uni-transition/createAnimation.js create mode 100644 uni_modules/uni-transition/components/uni-transition/uni-transition.vue create mode 100644 uni_modules/uni-transition/package.json create mode 100644 uni_modules/uni-transition/readme.md create mode 100644 uni_modules/uni-ui/changelog.md create mode 100644 uni_modules/uni-ui/components/uni-ui/uni-ui.vue create mode 100644 uni_modules/uni-ui/package.json create mode 100644 uni_modules/uni-ui/readme.md create mode 100644 unpackage/dist/cache/.vite/deps/_metadata.json create mode 100644 unpackage/dist/cache/.vite/deps/package.json create mode 100644 unpackage/dist/dev/.sourcemap/mp-weixin/app.js.map create mode 100644 unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map create mode 100644 unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map create mode 100644 unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-link/components/uni-link/uni-link.js.map create mode 100644 unpackage/dist/dev/mp-weixin/app.js create mode 100644 unpackage/dist/dev/mp-weixin/app.json create mode 100644 unpackage/dist/dev/mp-weixin/app.wxss create mode 100644 unpackage/dist/dev/mp-weixin/common/vendor.js create mode 100644 unpackage/dist/dev/mp-weixin/pages/index/index.js create mode 100644 unpackage/dist/dev/mp-weixin/pages/index/index.json create mode 100644 unpackage/dist/dev/mp-weixin/pages/index/index.wxml create mode 100644 unpackage/dist/dev/mp-weixin/pages/index/index.wxss create mode 100644 unpackage/dist/dev/mp-weixin/project.config.json create mode 100644 unpackage/dist/dev/mp-weixin/static/c1.png create mode 100644 unpackage/dist/dev/mp-weixin/static/c2.png create mode 100644 unpackage/dist/dev/mp-weixin/static/c3.png create mode 100644 unpackage/dist/dev/mp-weixin/static/c4.png create mode 100644 unpackage/dist/dev/mp-weixin/static/c5.png create mode 100644 unpackage/dist/dev/mp-weixin/static/c6.png create mode 100644 unpackage/dist/dev/mp-weixin/static/c7.png create mode 100644 unpackage/dist/dev/mp-weixin/static/c8.png create mode 100644 unpackage/dist/dev/mp-weixin/static/c9.png create mode 100644 unpackage/dist/dev/mp-weixin/static/customicons.css create mode 100644 unpackage/dist/dev/mp-weixin/static/customicons.ttf create mode 100644 unpackage/dist/dev/mp-weixin/static/logo.png create mode 100644 unpackage/dist/dev/mp-weixin/static/uni.png create mode 100644 unpackage/dist/dev/mp-weixin/uni_modules/uni-link/components/uni-link/uni-link.js create mode 100644 unpackage/dist/dev/mp-weixin/uni_modules/uni-link/components/uni-link/uni-link.json create mode 100644 unpackage/dist/dev/mp-weixin/uni_modules/uni-link/components/uni-link/uni-link.wxml create mode 100644 unpackage/dist/dev/mp-weixin/uni_modules/uni-link/components/uni-link/uni-link.wxss diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..e3fceae --- /dev/null +++ b/App.vue @@ -0,0 +1,10 @@ + + + + diff --git a/common/css/commonStyle.css b/common/css/commonStyle.css new file mode 100644 index 0000000..4adb672 --- /dev/null +++ b/common/css/commonStyle.css @@ -0,0 +1,3 @@ +view,swiper,swiper-item{ + box-sizing: border-box; +} \ No newline at end of file diff --git a/common/images/cu某.jpg b/common/images/cu某.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9582b211cc04907beaa8569d5b78a0deaf0f3e49 GIT binary patch literal 12261 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 JlypDyzW~_pZJ_`F literal 0 HcmV?d00001 diff --git a/common/images/你是这么大的猪!.jpg b/common/images/你是这么大的猪!.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8922814154a4f994c2c6d121dc28882a1df3e3fb GIT binary patch literal 95745 zcmb@u1y~%9hxpEDX58ZrKr_V-|6>EZf!`k!3y%RQU? zt8@SuZEJ=5X+>FIu7`F&%p?&*g%|3>@%MZfwtI`%KxT~}N7o+s;` zeq!?<=vV)N_VIM}yyxlti{H}K{V#g{p4N48^!lr=zrtTFCbV{j>fB!q?oSZl0cZn? z!1H_h|7rNg^K{7p0MSzbz=-=t+N)0hQ1=c1sAvC?#*zg9ByRzrcF5Jj-QsVJ!Mu;r zU%v)`;{pI6G6aAJ!vKJ9{P%|b^TmKOpk=a{uq^-5ekb;N#%n;$Y+B;^GqE;}Z~5lM)jV5z|pnl2J1=u(B{QFg<4D ze8$W6ROsnrCO#Q{Au+I|q$DekoU$xL>6wHi_^(3H@CgWriHJd@q#*DUrYGS4b+~H- z$Z#>3FxoKCm;iJ#Gz>DdyRQ3=-4ArEzXtsO7qHPVFtKpZaqn}rNdYtr40H@EY;ypF~5u!4!MO}=mVzs?27h>0u;=G&$UN%Ub!zHQnCmM%X%Oxk61-4 zJ;M^H1D6{4JV5Kp z7o@j+bl6556TE^qyh@vNTXSlC2ABtx{n#Y|cZSvOm(>P5K7B#ytuSTyktGqm)vhFm zTV89ViMm4p9ywK|3N0m>EL>#bz<68$4(Ne$WTW8UJcCQ~# zu9=Vs(8Pj8glxSfGcSDsGl51S7~EvYD6GbXEU@j*r0>oRW<2Qc_GX{xrk4gX8ot+F z?OziR;CRi^`_WNmb_$P$lSpwUzhQvzwX)Y7HCHOct=EG{6(Prx#hdCsP9rb1UJ(_& zxjbcKPJ2V8NWzaoaenj;EqGO9LIYLkc42iMp zjmUDvDig)L1Tn}De4LmFNHa-*_%Ntp%IVr8nOG>~Ml)Z*|7(b`vMTdzz$v?A zl$gZrrA|H>|Z?I8xnZH#PIwdOcUkdq%*PV5rkYULxdB$`N7tJ&{f z->yuc`Xxzvm_NM_W2rT?)|jz+<VC*5Q>i_PhqU#-|0R?ugswJ3z4amdi`Bf^pP8 zn7T`?TE|C`eEmH7gq?$`BtX>4F(~K*oQt+kBQ_3)T>O#;cKMlFOz(v&O`EZqm}SrM ziQp&aslgFdVXoaIDseGOS5FsOQkh<66o(%YtWnlt@TBl*dx3yr>c-bN)lfzu&@M5W zq&>>k$gSFoyHQ)P>4moYA@+~p%jGtDNk4p2W{;l{x7Gu0m0Q0dCeyznD`PD)Zg+gk zsRqk^0hS#iS4lFRv zu4(tkMwL-mHzmv>4Iw>!6&pC-?P}J2kQq8bZfq6ITpk+{_9mzaZes0|r7xNB1DV70 z78w;ILqVz-Zb{UJkHL&&-DfjxR@Fj3h4O1h-Yz|b6` zR8saSkK3^sg?-E6aUU25;hYFcOLLVQJf{g-WnCc^{tqf=O1bD8JDD-e|B*eFu0;lf*Me7GUiu z{!X`)WzFW9Cu0dX!d!wMO(=QmCuj|1oXfvuT!~m}KX`ufU?_Ax z@Z?BGxO7~IX|+)qNP5xg=JQr!`eXB z+#AS;ceQMc*OVXFaJB4E6Cn^5BW~M96ouQi3ACZwEjVl3Y1o)uA4#Khrfz(T17i+) z>?Ji2*VgvwP*M*$D=u*Qld?Khb!pa4=C0T{%2$GD+g8T3$Pgps3#<+rf+$-bcMT@j zH>nxu*;g@A4@6O!sCg!5;@gF$1PHK~df(9}AS>T9tZw9X$;j7y5bBjdR zXlfGlGY~_(6juJ8IDGo&Dor) zE2F;tq&2e&#pFY3C)FWJ^C!%faJ8r4Rmb6ej6-8)CCOa)*m~CF*?{x6ZZeuc4@y#z zUNIVa>IL;V3m>>$WgHL-;3Iz_jf5 z1&6s8VF|g2n$HdH^+h3Fa5Rg!ig-j*rrRaXYTHe+q_6ROfEhz_gy_}Uj1kzXRkLl@ zztP^mM*%}NJqZ$8y9Ro&*~pW$C(u`9{m_v&x0rb$<`v+#Io6hm)ls}Fe0D}P-nP_v zy<|nA)ovlf_3^mY*31$i076wSeGQLOl&xH^94wwfiG7?8a!TU}@0R~foOcI2{oNwr z`0iV@1^>8^yDvCXQ|44Vbl~}juAE#{(MK6wIca&guo@|RN>`CmtYIlgkJH7wh|QC* zVYF3qbfxD9UfYT*v8H3Z-K&XIfAdv}<9F@3EHM$g5-R74MJ3RaYkbufmQj~|0dw_v zzpS|&R7^fzAL+Q_V~{L89s_!L7V^K9C;0BV(6z$w(f^j|e-=p`)>v9(XjI9fLe^bq zpO+Zr{ zGg6JhA>#*D<{i=plyL$cU;Ah_!z03!#8wo4au%K0ka(yM@rtoy45QslahbYQ)%tiQ zC~pW34F@GP>(pg#EV!|JN5*7(wYqFahGl*KjotfPJ`WB0{TNA+ZC)B<|Hfr6=wt90 z^}%YO-_d&6vKA}rNTp-cXUW3o2~u4T1FwlNZ0hNtjP;y}KTTh)Yj^m2xNoqgTa9()cM6yY-aV zS9_%05~$r0b;p#XnGK~>nf)b_m8DNh@ajB|eZTpu z7>vgzC~u7%q~MVThfX~n7Wd}id%+{#s}M{eNylyeHXtcQnW0Cu^^2M7Y{wlCzY1fb z{<#b#!eDedGW}uTcyR|nwOyIdEJO7c@=IJWX|9gHV87&+Gsw5Lo-ZLR?qTPg9Ruk3HGb^ra_mSuaBq>5f!Z( z3}?-&{a21HP(2|E{y_nh&2HuMpM>i=ZmL{YNG8rKIXO%@>3et=7HU6bfRz z1#?c>HovmI&})&bwFF})-vK%KcfgFxv2rimroX?;mZ)FT89F&hhARsct`{Py9DT_)UCsO`pmN6c>`?8( zhzZSNE@XpR~00LF@6pJCq~@R})Ys9HFU z)q#t;=~yalGCe~#eFOCz`Fp0SDc8{Xk4)o$M;JzvLaq(~V3S4bY0~Vg>Sb0S_31`i z8C>QgJ7cmI?pm)%;4RUEesYE{E1xCwhn`?H^-Cu_a48VDE_#GfVJZl-+pt+bw!T7r zsT&@KpQv#7Dy>hqNzqFQziHjaM0&~FMeq;!x%cluM#zlREWu7VnDTP-`YKuM$eb*l zYP(Hdfo=*lo-p6pi$y-80$1ojyh=BqvuPBJfks=yqs{vHnei3pQdp@UZx%DRY^gig_8)^H>Bf|AA(TI7#U9me50+}Kd6i8 z%mhbJc3&KQvPM>Dd89s!;g!YtWDN72>`VN`}wk<)1m31vOcbc%%e|UN27@ky<#+`3u zV?-j?#FJ|r{_K1s;)2!bfI@m<^or4|n-3Z5n-QysV7o(43E4TK_2r*2(=^T@dvUT~ zn9F=gWD?O!>h<*1x3;(Q3O!)^i08_uoHiCCQv-4`b(+1KLo^xSSo#8ZzP{qv0!&k8 zA@$r~yUtOK57Fa~5D4Nc@`$H(=df3aDU#EazRYu@wxl*uK15S#t_adi!zDK&iT^{&51XzGmWvHeLB!zk8Oz#m9Wz~$fxxo%&$%E82x*Z=xD06aVDEvm|Q-GI!g~g3moSChNqy8O&R$zD;1?dy%R3C{eiC&r zw$EGtWn0?U?M1q8Py1PES^MOO<~vx~P0Yq}bNurD&?A+x+`rddNd#ri%HULdQCAG!yKnmWXIlkK48qYC!o(0RK3JsG!Iry|iE- zbj7R%%Vcml19@=u;CM2XO{2jO8%bl$mH)=~0{T$(E%4*F<`WBfEbcHq!R3U;A2wFC zdbj@DD9bLAEa>f<+qw)9!K1;?g*=wAOP3+#-9_88{4831+lnLVuXhpCyVnHi#!|Jz z2U!G$&>7YMJfUP!YslO9B%38%VvYLeONyvSVS`Q{03` z(C{I)tGo117@8SJlf?LVR%V+(c5a#gM&=86pW?Rdw(X*!&I=(P9M>~4xK3m9F`JIs z#(UT^H#@H@8i^VTNY=(TTDpxm{53S?lGMSR2;43Em9ya<04F>IR9POO;|R&%OiR7d zm=L2V%^ufl3PBf707ag^ejF)*!&J+eZ)o|W*-v#gU5mm;JHMKVQL8m3zk^5+*};kdBc#+t(|N=5IK{H zKB_oO5|fBE*z~aIER{z|Fab+v?g;oZC2ulh76>IHWBTVGH~-Nr;&6xR%BTZtB}T|e z=}~2xHSuDvI_wStBN-q0ynvsA{Ta$z->`o9nK|~DxLs{8FE#iC^9<;-bp7fgRvD9l z2($>0-=bM70_J9vfuD{|XZJJe)l<}CtACm0rgUmfk;|&1F?f0V9(RV;&vQZ6KyFI~ zkzmxv!u~%;qdK(VsklF_w;Y^=B}aKyVXM|v1l#pu>}=$yTS_x8FfG;rlyN!fL zWeZmm$_=3>tpAJNf!!Joy~Igj|T8kS?3J%_To_d!W<6DG*j{3sCmNo+=l8++gLQy2TQ zYiUH%prNS&HbMIjtxR&_jW!-(-*GD1JqP4I)TJ=)ux}wnyKH!`B;1Y6Qk5Mqe=J`LQH7uOa+10x7?@=abNJ7cfRGEJBOSi=p2Z~(OIvCTMnX>-y*uE62K;x_w{x5mgI|3v zT9l>|{2!vTKiJ+ICc;?&j?9QZe(2H$CaJi~J7>e`Hdh~mIhP5Zjfv&Xm?M@C=6$|c z4nOsdm4FbxVittDvZOt$_S%q_2e#|*feEL2X+R{|p+QV;s?&?90wrZJcFsYMt}OXS z3fnDEvWLu`G6SR@GMdG8tkTGY>>o|?ku%$tjI^ris6afN%?i)llZyzO_cHXK2m)rk zcxatVG2p>e48+X)x#DJKzfkq+Ll*Q|8{1SxD~t1H>foLN?@!?2MgbqY-qYLD3Xo_i ztI)TIB65s~^mLf?9S~BNrXWN8*q_0Svc@)wGIbBRclP5e8B}zxzB2?e#8g$QQR>>U z;YFJ)5nr7w3Sh6LIZd&fS5ukVxMUH-;!+zFx`asE0yU)M2^+T`?KJhJKJP{0PP+ov z#gxVJJtt3LF^R`$6@Jv_N30f^JgpMMyi{c~R1zAljgVTyAC9*lK9gvQmN*2})^6~{ z#H1?Ed!M7B?mblKX+}-r`Qc66gV__r)RH|?Ug1BEn3uj(e{Gk=jX`^#A=cLCSZBY#Te`{&4akjbAO znPr$3le5vBRM(@>3zf#k499RJ3_aAP;JX8qBv~C2`6?HTOhv+S1VntH4}=bVFG}?& z6#Q6fz)s<_zM>pqB>YE4Stg>QH&8ja3l2lf<66CfynlYA@XA$&hs3g4y_FtU4 zXYf}Y(nLeFjmgGjJ$8R;Oi@W@u#YJDb+}66JeJ*W`Ly_?X(%hu>*zxpM*SfK)^$lS zKBG5=vi7UupT{+_?6=;dRJmNY_fLJQrqjtHfYD@yN!LumAki^BC(PY56;bJ8M>;q2 z%?(btPvuflJ7V&Re^R?!bF8j)SR=b9*q$V4w-K*t%#i(zXLa|rm~$Wr*>)q}G4-!b zn3}O(Ro%pLBI9VUD;~J|>iB~Dn!b;A(K0;Mm#p2rI6Z0AHm%z&7ePf7ew4&Os?ZfU z;Z)cEu3~9SeSbp)?CP_rZ$>ZIqEEv6E_h|TH@EhKjl2n_mv8=Oi*IX^%`Li7JfE!7 zAvg8M9oxw0zK4Z5OiWFb2&9V>IE}b#$&cjd#8`Z$<%3xJdHUBofc_=)3;w7b<(^w+ z`nT0~_ni}o^!=K2R@ck2obG{BU9%yriC9N7x+9wFvS7Qh$vc21pkgcl_j8MV({qir zLd%d7I|l2CDcapfjv9gC5INpEAcd#5e(~nNTwVXi8W;x$lJVHvfZ`ktm)oKr-lyH# z{CspW&h)pDzSyW}LsvrL+GVgw$Gr;JSz0=4`bOcAcJQNImg-HPHZ|x3Az~P7X}~91 zPSU);Q^%DrsHLayi0UiF1CHB@p;N_YjHQ7`J|Lwfyl0fCq3Z2>SInPd*s2hnfiTEUX2?c$#0uWiiAR5_2 zBCJUg8*MXDh|R>Sv8KkoKYHssxQLXvXU;ovqp}fV<)2RK|A;-KPlhMgK60X#!SB{Q zrz#{?_~lo8^B#7imf9ChvPZiviPWN6!{;U0Gyao(svY%>(F}D_K1r{?a&LM&_53H( zJI7r!-FjC3+Y7lXdmlx8R|wO++BxzALF%*O7Y@9y=^pIxP!LA2?KQN!ZQ_szCX-D{ z6q*Q=RDY>!7}qyqZ=-&bwQ=A!@dab0{a#Rv&m8p+hIAWRN|nz&khYTHM991oYo zSl2VO@hPnS(4tV9U893fCnXQktTq?@S`G5Rh?ZnIKzZdS-2wjfkeZ1x(Csc`=pk*< zi(+YQofVbK7qSs}mfo)e{SuptQb!7&49Jz<8|`2Bzv77g1_%?DawiwJ{WC!ewE-=P ztxxTL;k3b#L=xUsK?fr>5@UBjgva3u<;t&FM+B9kV;w zjTdD{GXsO*ZXxnb_4Mr8`yxxV$aFmvUU8i2%Hc+3@kPa;>2pMd%aq%Fdyuyc!ZuYq zQ-g%IUy?Tj5y=)6TPCnCxJsHQoL!YoLHNhV`Y^L7l}4w+TV*icuy#A^3K%@v53!V$X(~_!;>FEsgsf~I)wP#2pO0mRBAEReD(UR1fDZ+HRx-SYW4Hw(c zZrT{$P?V(lvH5wzSP~L9-#`)yK0#ESM>!WOi%JhTu?pbw9XLZ^my zpE7!mx)af$J}sdy8hBbejn^85*cGWuoD=mPGPpN#*N({BgijB*QRAWwLX@|a=P!fw z+1W)F=1l~tV`c)tVUoM&(QnJCr6OaONYMSR9P>40D1^`-*&2e(%?0=X`d}&H14PcR zhS^Po`a7-4Ecx^zUAly)eFBAvV#s&u_Sq_C@j4vYN=!^2@12YIF}dAZq%W=2VyTJQ z>7eV-nx84=rv@qwGY>c=ZOw~Ax`otI1^A2(aha#WB3^>|vWpK??czpNe8|9T0{%8p z+G@qa6Mghu=aEFW-A2|HV^O9h`kdU#5zA^93f{p2V=E*i*(ZjSK^m?#q{DZBlSb_; zZ>1hT5Bm4Ds&uR!I5PSV*rGeJ;50awPl(Q|a2Oo4UVV0!iiq0{M7s^(DU)IvDydpV ziOsQ%Af3(?qPoIp;MdR6YS?&eZMnR|8xKHwhNV_e7HmN@L#s73b>8Cv|C;z^ zS+q4A%*FEz8tVFaR^5nrVA`)lX24&X;>(s&aqv#Y4#Rb)*4od@=bOyd7?Yh;8y7vD z#|G{<{+X+9_P;EIH{H%Q#U2&J-hiI(g{Lm3zx#f+tr}~(%l|th>Gbgu#uh?C-vc!D zVAG~s>%VfS{$1qfAan4&44@NX8B8+gu+FZMx{MuVt;U#et;g{Tt|P-#htzSRTGMEKAexoyuzEGeWA!Yj5 z4HbJRM=i`Bcf3@j%v+fT2Gb>(j6{AtH9Fa^hnXW+6FbE$9j*H5SdJjd)XZLP_Kp*D z>*C~ZcvkzI^v4g~)zw)2{8o1oV_>-9VeZC-HO!dtNg4LfAg`Zh;NBFtu(C5F#uv5@ zG22|HFL?zAmu}UbNzu`Z1UJ}!WlC;pRp&$Wnh~o%ujveHqF_08jlE0{J3Lw%;w%X2 z$D5tU5ESxq)sAo+*{m5C`DS%s$6V=$*2bMOXWsIY0M%@;e|wMkQBL%ili%X|$9Dil z1B;a-Pe8a4wlX`lp2N;oX*B{msWxpMYklC>hUWUgWA?@C+`x}QJVIyd2m;wC&$bhv z$S^#ShCRcIXs1ShY16nFj`m)VJI(k-nKH|<+Ig#@Puj6EySwtbhTzwq_~SAsD$^;W z=k+0vp0T7In>xsy88Dye(sdbt6 z;*hraUZy82loi!(?zmMMFny@9ByTp4^RGYg8F4zL*as5x0dm8NfpvjNW2>OheAeVdzoPiQfzu%%fK+Iyt3ia5!*Dd+@;t~9dJ zVM$!av=RDF(CbsRXr4@@=4oaF81X2Rnc=!POADf;)Ham;usxIeSOOuLPNkep-x!dA;HA8aREyCz0)S?+SBQwI$1Sg?``;HS*g<)d6eUk@a9iFuemu?Hgis;`w+R;@MtUEYm)dBtHrNJ}rGz0oDU1^CK zZ3a9<4yOw%?5xuTi!#m?_oWsG7qLA3Ig%!ZWi&x}f##Wzw3{j698_h(fF}XfRZ{Xb z^<`p&y0hIF7)fkjuiG)uQ@9ip6H+8QYJn!LNrr=|c@KmVD`mX{RJC8W#qaY?eD#qV zpy>snZA-rQnb5(vuH5I?=&Z7DJ6Wh7OFHFdEFvmUnB7Z3C_HLF9rU6B7sO~Thaub& zds~nAQp`fsI7|}g-70wvbWs$BI!sZ~Z&jibO*nv%n0htFe9ec<)*GJmp-`M|U(nRo z@ZlL!#-+c(2SeY=$!IEpDZIra1w%Q$vvoUD&N=O;b-LzTg@8_RzNlhOf8}D>Wu%^-jmHO)gNIQsn(jJ7x-#XemhL-|6z)+evY$b0`{dWwr44* zvu_n5vrgqhB6ap_ed&|j+8a0n1B>RI*M5Ff2;H9L(3;!eA`bH7h`!8AlInL$>6N2C z^qF2iVIEJ8{d{?zxgi?Ps=d7kb0O62hiIOxgI*q0h4v6!mp04Ys$Um7cL41j;Kjeo zCV7_I(03yg5@<#;fp4SLRAgyXZtO>!2R6jujxRb1cEs&!Z5+`_SYz8 z4L&`>VR0tec1&LWUITBIcP9-2ZVLv#c?8AkXO0H(v0l+M&HEK!&c)O|bL9Fehg&Xr z?`Nj#XhXsqkC)p@PMv+bVkMvgpQBOSdK6qec(X@oPMNGM(JKn*#4=iu=mO&0HTeZC zG|?#UKU80CrFu_WYck^_HmaQzHbbdemvm^%Oxn)kmT)BrW;tfKCe#`&6=gByl6uf2 z@edso0g*$q3BDrHqf90r`)o3b-yBgfy?>W;_T~EhL1Bwm{ck&-q~g+A)gJ>Mk_1#b z_NjFI(%UgbIDznq=OitUH*p@XwEB-X=C2kx^AweROv1RTmw8+P%knx}3AZWpTIhsA z8<_|n5=#COWg!>vc>|ARWvH3s`m-Xh0h!D4hCKEXvn_Op+Xp-PF;MF#;-jhOy@Z1IKl$t_`dn zOo=u12Ble@0Bf1r`O|Y@KjCyQYQC5DF+YwTRgyJoM`$oUGf}t$d=QsDsg;W08HAh~ z#HdXj=SL=Vyrx@!St#8h{Jkl&oD*{~jEa^(C5>%omV@J6MmhuR-HekU7DeDi7yKh% zCLkdB#S<-rkBVyaD#ld8WDCQT71D;6LQIS{9Xf7x8NQS+=$&b2rOww06$%drhvtqa zgr4XnM)=MdJK4EgSG}01&kXjaw#4}4%e*EKMD@rJrNQ|5b5p9n3U0e2yQIeNn(IRS!58Z)DfeK-t>u%Xv1r!^w z37RiSVp4e=%jV}VgYV&E9A|5MQ7PI^FXB9)9Y9D_4EWv|s>ZRb#YD(P_Ard;$uJw4 z075qkTjvQWUkFo~CV=<$dx0*xh?#2(vE5sGY5XjXWt@k=-^bs-q5K|(RhYWuG>$YT zHKMUthW6}9D9Wx-oZc_XND}K8d0Lx(Y|QyAEM&FTOqle>Ht2$zh}){#J+ke13S;WV zif2t$l>iqj&pf;h_SW-IbKpgGP7z62)mKGHfo=DoQAPgY3!V%f2cBZcVUlodaTmoN z8G=T1rNj3EmfJ2}ethk)V0_Y}AEa??=wkJC(D*=+#U^kK1Wz5;J^$03eg_Ps-wX*f z@v>Lz_bjJaJ9?S5EuSBF+yRX?H{IUCKbi=0&x~F*meess6*JOjmtt(IY!y@GQpm|E z{c}|Jzj?CobC}TczZd4p()-)4+hG!xazhE0SgOe%zJ2F(golQSk%$^vwd~_HtzG?9 z|MQla+YjfJyJ$&@&0tsYY3&N0r-j4eIyo+5SnHc)RDVnhp*sp8!u=-ZjM$fpI=`o@ zBuR;Q32B*hg|vS6zA%&`k&Ns)HI&~Rf!*z!pVG}3M^_cTLTNI+PZ3^wU2-(I+{fh< z`^gfCkUnCOX*T(3!rz8;~ZXWp!RzauL6X_>Qsh{5>YL06~wAG#Kk7AN*(v20@e zk^1a*Oft@oB{{xu#K||hGdh+0@`>L@>XTa=u84eTInwYZ*me3D#;2E%pDxh4>)6C8 z{BV{suv;6=5)Nbd!nLLe@3|N!=WE`0)WZA>?oIs9(Rk6>7LOv9H~jI)2; zK@cILM`zMT;^Qv*G{LqxKDp2FiLG_~08I4#T3pCHar0z+oxZ{k0Y17L8!^c_n%!BR=`Y7OvU$Dg}D)-6@6N?#DdI=vdZj98a%4_K^Ct<;&$FT zOI?_MTgRs2vS#gQxpbru#ysKnxV3h&^JL2}5~W1-i2sn4l;iMMq&GAv8~vU!;>3^s zI4tLtsJV~K^-U5%lgjHq{e}{PJi-0M^!*3NB$LW7aBmlbL#+fWi}N-78$SkW%&-Xr zK^46db-uaJke%rchQ{xQii2e;qLI`{VtHD?Uwbg#PyZb1YP&ZeZfP>UB>`3 zj8qv+blmk;+j`^eQm9K_acs>|n#a7&D-!;dFSF08lMU?NVa@kzDe*CX1hq<`i^l&p z)!uii1tp)(p~(-@%)L&9*zL@1kls45rdQfM(}_0K(ws_wTkmT4`ewWo=B~|Tit3#8 zh9|b?oIFroKa{4oA@EWybUcOckD1!BxzV5@!rYGJ_G;vv%83{9$i^vlLD@VLa=LQJ z|16!u(h@14q|kp?NhCbBjA4|mWs5Ut+yFhNRpE0~LL|L%F(nH8VP1hHdbqwiyh7LU ztt*GDupld@D0=mT-nmRNANj~P_<1==?_nj%hw6Ug$9MadPCl@WmoKQ)d;{g8#yRp` zx<{FTyq;|X`lZ8c70lV6@d%G&supn8hl(X+%-*H$$6SHOSRg4z&HJ2_;a3k(_RNOlm*5-*C1y;v7jX8Z7Hm_)2rL^eWjxqp^V%!aM9dUeP$&wB$) zLKq=9VKbWp4Ejj>mi^yC{An+=U@XBq9$lFT+ZG0`qMd-D14WluxRZ$J9iZu((VXm> zRX1k*#4;~8`fEEbS}caS_(j5x6X^GCk=50@x>S682PcrHryFioEI{2J>znW+!`kXt zw*$FR=lsKM^sSe{aaE%-2)|FyW{J{U?B)~K?Dx@adj=<^*?f{onK-wB0(d99i+l8m zpYN|7Eh6xn!b)gUBjNZl*-tn)Vce55d+wB|ab;xJJ_Yo~4TZ@7eNZ+w0&SUixG~+= z>L+yNu6cEJ7QJbAAW2;4dZ zspjvF8wgD{z9#$8gLjcWsaot7hyL{{@|&0&Ns`yRA+0|E+^URiThg@m z(cxSW0L}Y&qSD?gMU8eJ9o*s`L8}Z_(}Xzj!^7dy%EvlQ=FRqbV&@^JW-nw1-B0Ph zOq|6O! ziSy8Tz&3FJqPtZ^&+m6E!PM1kTk*|UC+TvoO2Ffe8s&#(?VhZ4ye@FN#qmM4l}hN_ zcsXH?=%E;IX^a=7xQcG)klbw0N3a*hU&^cf&VG}`=LUYYabc_(c>$H@vBe24PkB z?@zA`C!od=Igbh@O2{h}Ncjw8=oI?yKZ+`$pBfRej%Xwt5l2Q zQ-@u^$KI}Z=yZDh4@Ew$r#hZwUHo=0d_5=5Pf2n|ghPITO z66wO8!$W-uQjHpMU?ixh%_` z-DtSRW?=P}s8YblXItcwYgiQ3$+QPogm0qR!3H! zl|t9LQbCCee02dcFN%mA=L&SHoV;}=m2$cRkiq@s1bbx3+#P{)$=7&Nxl-ui-)M;G z*5lj4p6?&e*{S+Tq4p|dAgN7GIY~N z`?HI^xWX^qO6woe`@pzR4@o>kpR#;78A*I}^Q6%H&jpDugUq)+Tee&TPLeWhuB+(d z0md7V$2M*iQ*a)d!15Bi?N>!ns+d1g1@8A1pyQqpFuJ~cGJA@(*vDR7XY%^(hhEEG zoFA?n0akmB8yX9+17!+bSzv%>Uy9DHo_z^9X=vK_FhG5WK%}66+!)#Z5$)%@HJrL1 zHu%!f|E|IB_ncu-+$(f{Ik|_r&t1QodKOql@v!&WY*zLsgM!EVTzXue5bHspajKVA z^orI&d1P_!kTKBFcP~{ge>uFEL6W*-&aQ$W1$t zQ*cZXjLYa;FLuM_{u#BC3r}60P`FLu7>8fMRBnK4)X$5;CgpenkE|%2-BS6?@C| zOO0l~zVVY7+#VAR43vvNC5JszUI8M%&4|K0-i4U&6{(x8_k-FQtHj}XtWpNtz#G|E_eY{5U)BUAX9;iD%# zJECVS)xS>L)KFGoY@t^`MX`xiuz`J3tnA#XN^6=ser|IXQw^i}hOl?vD#Plg9?RHs z4o(nITs!;7*tAugK`zWtKIadnDZI8ST@1Xd!ni8W9D=wM&#g zghXdReO>ASt8~dil5lqA;`R^N^z|c;5XiibWXRKj#wl6*5E+*|SbB(g5`cHa4ufvl z8x09ZUDbgiVu_2v>1HnkO<5dqSU_BUoY=UwGq0!`X8JfnIOc56wiZ|1SDMK+s2*a# zv2Ax!b{01lLL({8^}Wy0eCGFF*kd3_XXbrD+E&q3uiLIw6k__9NkCMXK>aB!gf)n_u371D3!tgrVZ zS=(BpjsYM!imYGa9%7xLg!Cj1cp z)=I2^@v7Xyoj@e3tg3I1F~vu)nV02j?8y+u3YC1Ny%D${T#;$53Glw#a9bfkr*Q8y z?fSmJM2uTu@NctGo}t(hHffJs$qpIdrzMIM@W;Y0uh($>*spo4;5zAUyNTZ7*U-4E zEvtN{g`w_F=&CS>u@5{3^M|us zVttYbJ5qk|C1XZ+^4a@XKa8c?6wmD>rA~J1r7SR0HG(}L#zNV1zrKE^-=Zjf!ZRc^ zGOZ=N?c`W1PlxAY{oaBd=jQ(8k%Zt3M1bg603t&d_|W?_dkfh#Iye9H%j#}#Ki=VH z;73k{ZN+Jx7gjK-&_dBqEqJ0N7@e76yZjC1QIz+))6qfCdLv|eWP&zJHS$d&hDCN*(v=Ua^ z?#bVG-}aP6!AQd0z-BS7%8qV<9_t5h4Md95d^my++Y;-^1yO~EhV7Q6V$LE#_ihyJ z!l)QI2ZJpO|2zua5Rq0uNoo|Wl_cudpPeMw3By2{-6!vO*{Uc!@3-5+r@6xv%NL%Sp*nQ?&7 z-pfN%^)Zi_9T_@Z7OT)jI$X0l5|)b9OA`^(TY-2omzL&J8OB|e8XaY2qmJ3{21qpO z^I5^8p6B%x(ldIioN8hMs9$o<3u$vZ)LYz$R6}An+DgMU60#Fb)xqS38D$F3GO`VH zz1Xi;@WwsncIcm(Tu<$aN(BW1dI6GbgJ0deC?AsajAw>EAj%kI*_^>_jPg$nh|S|& z7W43N_e-9gnGHLBdxP%AUkec%)NPE*Rj}ObLrtfb+2&!1Q=GD@mT*4{F^Q4Z)r^Pu zG+%OytmPpvm~VQ@;{6{nKs@@xe$`K(i#8On%m+E+BjK9^^7IA&ho-X(YBO59b|{h- zC{jv+5~L8IxVOQfXo?jH#ih8rJ1r0>?oiwlthiI$-QC^YX}_HFe&gSPz9Kq)^t_y^N#xml_54iZi?(sF zsZropm1lS#)Y25zQf=M{dNrlGIwXR)toM#N2R}fBum>$Wf*i6p30!-Hqy}iP_Y4-A zwE2nmQRlO$$Dxso$muf~w+qQYMY{;4Fh4IfL+$6YWr~p*c+e?_MXUQu2n|!o)_it0 zk~*6y`~OSY|Gq4>YpZn}SVvpBY?6HFl~RIh4awbkC<`*gwgdR)P0iREh97uql;3CB zTSb~bm19JRwBvV)v8pvRPPH>(KX1-GCwR;42Uv%0VnOM?`P7&`&~rC~g8^tU(5=9Q zOT5Up-@Y$QRq<~qqeY!v8^!`B(@h85YULqk*Ch#w6RMiuCj0pvsF?kDiJ}8;D188S zI8N~2wKj+LlZ1pY146eHH$+y9`=*t>)c8(w4*&okU<_MwM-&xg<;EZp>yQnM*iMm$6*wE_Bj~cf0aLjZrUovX0BlGhm$=z z8^_%u*Nw+HC7KnZx%n>RFIjma!w^5fbeQ48wJtrn#yM+Nq(T{d)20Cp9nmqRRA%TF9AMH^R?FJ|)#9ID2JSY$* z36t2BkPzlL{s#zsB2qO|ylV}65UxKx)9(H*t9OFW_4k$31=pl!vM{)`ddlr<;^z}H zV-izBZmNhfdjaDpKeW>miYL3;=_5{)n&yfQIk_3t2$!Oi@wq6&*Tdq@h)yPqJ8<; zbKQE6n4p~bEfj%g=|>%bLFulIiYVnX9XceEyg=yO8JjKiMo`}}r?{%Y)LZ>GMO z(&o~w84`nUKMs(Ytg&x7i;Xz%FgS->*Nrdk{kV*MK`J^7`92!Kry-zUTwLyq2E$ar z&a}$(0C82njren#aAGv`Fp<6!0m;~`>1RM1T_-}afMz*;7vPM{7xW8uL(@U-=wyCw z5xb}RY6K@Di>BLP0AGx|*VKG$vS;Su=(8&uFMAzEx}?9Q{6T!nVjYJhQbbC78i*_3bIs82sturr%GOnBIQ91n5n|4C$C8HjaSP_xUmKnc{Swq~Kq)GLLq+k{z@~OX z8|?W-!&*>Yx~F_=%s3SpjZ|6%S{tT(R&qQ+je0Mu9R`)KtVY@4HeXJC>*5Ri%2;&& zwzhM@H*exgG0(sB9{u5Q-|Beh=pfJB7g@C^Ge&5#Nk~YIxh>OK&d(hN(ckn=%!3I? zItanOIj66I!^|HAkA;T*m?+YCQ0iT&Rc&2svASqO13qDdZ`9)YPdPnIRWRqhjyoa4 zv%y=$r`^U|b6`$u@HB4!tl^Jg2bt?A)bZlmOQh!-;vck)kXZmL3_74_H@uDg=Jzh} zmIu)TdD$C4(u;M)4?Ek!6tBBHl8ozXgNJ(TkUu0e`8p*eUDdXuqdVTYVGu~+3!YzT zD?iviQ8*XoVTvfCsGlATq#|hK(BpUce5Wx_2MAlMkY+YIGc$nP`nCMjo;n#A z&j~=EKE0&gqu##AEV(Uuu9-Ijy^X(FrKcxFT z!JQzy0pip80&3!N48j_Mpy+^SKR;9rcO&LN@b*878axc9uYfcaMu9(G0s7lxxZ3U8 z6v(!ET$!NJTrdLQV}zl9PD}tdk#b#jBK|XCd$I$ z%~&X({eM^|lY?fnm{0CRP4Y3UtW)WwpFsU$is0v$Y)#V~ds=*)2@MUIgo=clt^*N| zz$vd2*jFJP)p%mA28~>BeP;|*U`L4iLhGfZZ}DWJ`!OtnZUkb;U1hZb@D1-@xpvO! zx~`v^3Kz-QgWt&X)VK-Yze}6cDoiywj=>vr`noo|B<5&)kjgEK)3XJ<=@qEg<5Z%Ru5lBoG#GBZqFoi7d^==;Xj(KxmER1&+1w$x=*g%1C1FqQ zEz;2~Ii@*PRVkrWeH^Tre&3n9yTu;?SNmV}0w894a~OnhLw&Sj0IHEqJz<~UQmBFd zEu=Mq8nEEtj#7&6jleMup9f;ud)H%a9VY8HgG?#hi*(J(_e*(r{8Cct)IER!K7is) zT?32z_g88awH*l)(sbf==zeWy0`bL&>8tT)?+Stl+=vpXN{MqVA=dIRQJi!UWu5$9 zUR$%>R^ZL!G;TbMC}xkrtDq=E#H+}oM9}j=hi>YU^ZOCAz6~Unn#$SW=0QULrf37~ zi={XxYEUyh89Ajq!VqWl_`5QD{9~U8U5!3IxBnG1uxJ?9bUvO!$%L#+JTlJo7$r;M zUA%mz6`v}qSV!;uS01Cx&Z6)euKs?~>v`+;4{-CW_H48E%)XWZHvjR-Dm_fZdFQdT z5;Zeo_&cZBeeLVzyUlZU*Q+?nN;f}p&y+V=@l~8B^VJyvZG$w8A}?jieR4QEpX#!JUrTU%o%r{r;7|q?zUYsH6<{$+-|3kC z_c7G-|Mw*XHdp$ZlgxsV0;KQ1%s|WFH(TssVUFA}dVRQJ%X-a zyFz_;lVW#y2Cu|U#Cas|w=Q*W!kjAq+K>hd#4d$sG+-qrPu?2*1qZiqf9bKXw;*5U#uQ-2mdD)feBW$j&N zKb|WV@ZUX%2(J$3z)!|&E{|-Qr0$I@0ylahvvGKu(#!YopByk%7--^CAyEt_dS|&b zk3y*W{B3WWIT_|BUdkX&;FQL!ku8ZzTJKJ+(pr~7w0VS!(@)w6Et{zti%KC-U@7pG zgku2Osh(3T%I+|*b*e^FFC{A^j zl|;(+aMnCmm^#%PJG|tqS%~78e%`i`GZR$-~cmvcjLET1@Ynr1$Ic=l=Ay4O#7 z%Ak*b{`^=yi4yFjs!JVR(FV%ggp%?dL}6doFKWnZ($EA-?85^>X^V~j_I|%RVmhWpEzbXqKZ?L<~jY&5dAY*Zqp$>;rpWOyd6}zhG92FzXDaY!pN_JO2 zUT$Z3v~=Bmj@CmLQTpPm4m@s(5C%Lsu9iD>?P{`R_S!3Q9{2J;a}m~mOf1+q_xVZ^ z+i?`JGov7}ihp_rjHZwdAmPodOA9zjv|raSuJ{Sl(lnxn^c|lvl-=RkS*6P~? zM{ZbnMhou>r5app%0CLeqvG;S`Nig0WO_Zb=f_9r*S6;8bAYEKo%dIO{KV38c0=I) zFN5K=(>N82pYXvhZ>IoG&UNBLyt$2p>NECO%6MdrpAj z5V>OZdA&%F%|f`d;g-fVt^bZ6ohP0P-VTna^9NqZ zzemI^sZ?$z(*DupSe+U2I>ag410C`=(MS}cj%!bwO^@X!AH?cXL8o5 zfsscPy+}`K`u#a~M;&&4wcnuVcx3bPFSA;x=0CvTQjV#zPYd&#C&X^?>&`)piC&Sf z3V3(>9+*RHH}eNm(3Fx^+#~W2meQitJ>=K*e1bm{yFn8J8p?MjLU#qR;4^US)k?s= z2Y=f=_M#qGbb1&KRYakG3^)ZnI*vJd(vvwwl#F>wjc+S#)REu;P{Yl4#eWvrsB0_& zXjX7dIwQ z_kfSQ`_B2utJ0R=LYWFe`Q0|igr{yHd)w6nLSdeALnqSF(Ss2dlEu8V$JIeGX`M=) z{{T*r*FTJmZk?2>GiN9IYfD z$2@W_VP9&e{ydI<^(|ElGP|W zeNwgmOz=!aV$URs>qA%~g&$7Jez-lWZB=&7pZd>h-#O;a-6_Sl6MCzDnOYoK%{J$? zOi^>`hnNE2HHiT(gazZ?1cf4ZV26zJMhW6E(1XqxH$3d8nhBx#+zwQqWXt&nvxDt| z=>ZroGKmZ8`#bce^N+4KZY(xOwh_68b1Xd5h0xxVO#fu~FuqtidY3hfP%e$ul6Nw^ zPRoK(FHB|}=ubv{>v-9|U3D=at~uAO#VXM4Zi9z%cSw}Jq#0PfzRGXmyhjY<0k_3X{;?D-~6r7!jh*srIFs#OS0!@ia^2on}Etn0joJ@R_)21 z2o6eM*2;GN0+T+|;x`jm-!VnnvN_aQAgjoX53>N3;ENQYsUrS>+$TwxQkKW@U%!q% zrL|4gaXCY<)~KiM*LQ5v(!8;`*z0vKwf30)NIv63U#Bu2TO|*O5rjUllycU**_tvK z)3b3oC#Qf$=b+bfoZvcP9KX3v)KcjM6z4j*Kke31)-Oq@El=dzka#dM?dsr!DZAn- zfKh!El%O8o^w>m7#=Mu_bdCa(Q!k?og+}e9{XuG)+wnZGgnEJMFY=#HUBHAH1fp$} z%m!jb%zJ)T5!MohaJLl-G$8GIj)GT{_akCNbpg}7uv)&M`1$gU7y~E$^V`50!|%Tm zqE_7q9I(U9hY~5(k)h3BFx5QDQ8|8&?zTV1DjrczYPvn znsS@+FsMy>DbFq8Tps=h73`ka7`7Lveg6$s#P#bC`#mS-+;Ig*7U zvxY!0fHlzoesn7p=LKv+GnD-3qjRS;j1=w6ZUm0v&n;nc^9@i0__2Z~0)z)~-*FC1 zDRHZqGP~Tho}RIvI44Y2HwqR^g>2;CUiJsJ@V!fyp*M(-N!8p=rw$MU_UL=7od+Sc zf?* zjyVJoV5&Z^it6r9f(`fo$bGHDT}dvz#>%xsN19N-@C?G4>nEh3i1eRjQPDfLAMJkb zM_?L--#hA45OY)&ccwHUt%xp8iy{^%0HjosR)&@_8_PCK|(vx*IiYj!_|JQUvvv;K57TON~f{5y!BGPM8uh_wqD-ArSCTin&V zIr0}p|73~r(Kv`nz*O6lcxEiUU|-~AA(X@V($NQ-cq9xZSqTB9ni~H2VK-tugq>7D z{{X}b7T>PNUWst5t$*^jB$r7^`r0Y9%K`5BU>b4;+-!h2OsNf3RLP&5IpJrbz|rD- zGK_SVweyGKePksktNFW}kp23pm)cdl)`cOR5Gzqg@9L*iF=o?{7>&g%Wfo)TWmB>*e3W;(h)sX|@dy>^bJE(eJ~_EcnU#r;V9tNPV|qPdG4=+j%yFU* zcKy|7e~);(Q})f77(@&MV!~eh7tAHbMrMghNWPVUhw?m!!-+YPVG6oBh?UM>T9a3tto$6qpXKbFNLKT<VO#@y zYQRS}2>MLScZ-)kG@g4_n=(?}S&L}9V}ov|O4cf67AKOElXC%4R-|~x!l`#v|0A0EHc^lIp^V$l&HlQz`Qro&DTA zZ|Sv%oOw!&CW_zO6U_PZPR8l8;=dG+wm?*Dx96Z|+i%FTDwhxkL9&LBC_K90$aDb1 zm`j8EFCO{mA8(pa@EvyP269LtQL_~#@PX9L`UWJyy|jj@=jft+OhzjEb?D5$4utgg z!V(UgethDZqceYe5)}+qE-Jdpv5-JTZ-Qr!!BHUB;Rk%YJP9+ieKu}5V-9=NEpp43 z*2?~=jOTI!HayF?!6kF#2b!$-C8wmU{JDST;d3zVE6B%z0c2lJ?svtBq_uZfwp7JY z{&^Sr0+=L%~l`w049@>1FAo!osy;8$3$(0iVViS&JT%CAb9omT!DOZP$4 z@;0eQZ1VlkOJd3PTrqhvPk0}s)eO|PDX7+cl5cVJC0UQfLFxm$LE9}=MRMIwy8DBw zuS}Y^5>*owQqi5DV)E&ntP0T`g};xvp5;}W8Ji^JdBsJ!o_V>2F(eTEgjZbn?Ahlx zL)?S0GDcBno_*jVPtEQ%h68)ADdO6CndEH}rZM4|QdgVRw#HXc`i&O5JQbU|Rs1h|BJ`rzk=+XyIQ9*&=#J3o8^ zlcy7GPacfY|4!+mDaaJ~c8*_{NPud(w{6#>G%LG07Z!I^ySV)lY4(hd(*8)A^}bXY zVh;m?UO?+Kn0J>?RlUN)1BdMZ_TW-7MZ}5fDLkuDl{fR0q4`2EKD4OITGy9IN3iqU zahUk#AE48hyiEHlEoOEGI9+27e7<(mcSVk`oOx3^dhFaaHX7M3;nK_JPU!{A-zPOS z8)@Lax>C#F&WKU~iWXTTl4Sa0TxD*A%_(SyH)Eg-rE1RTM-&&g^C5Mnby!$lw2?D zO?!`pUbp#sZo+aCIBNPgzUt7rR|WHHIttQ45(spDZ;LLnFgq`oE}vYu%WC2s@=<3{ z2Csf~*w6WzMr_%5lZX2#1f{ADLyKL95X%ObI9w?$*c9d#cRHib%KlzF^j15|3H8^# ztZwgNPE#H+M-x!xc(uYkTK1+yQpe_9*57%;TKgWzO7v!Vo%#qHpJ&KFfG+$u>(_qS zB*N}9P~GxJeJTa%F)I#45$Fbo-GatW0r6UikT~wE(~=SaOrknJ$-13Ehmll-n3P@$ z?LnXKE|7JjuQ=>6>`C|1 zF~yvH(x0dV<1ddo@gdQE)?|XMyFQYZJX_nc6hpCC&1Zr^{ex#1XFa;<%sO(}yr%Xd zlP+auFTGy&p}#^Kbb#!qNZrr#$yZcT1!b6!9KThV<=a%-f3aTZC(};#dI%^e2F#d~ zvi%VINnS#~;hBT<=}GIYlaQM7{fsG|XG(G7KY*!&)XlU8o>pp#ihtyr*h}H09o+O6 zjK)s994%yGOOfWl5g`0*$%&P-D4EJ7V1xceYlLA(E9Lj>M3~m@v63f$gP8@bNcX6Z zrTIq+^78gE=lUwFv>1}^`H!EpSJ!tJ9XMN`Ir^`b_n6dBnJ%5cZZoU{yslMp?m)!} z0cgVtt!Q0P7JjS)x8s4YDQ|VlC?9(Kwzhq6avnVu(9Jyp zdwkb^V5(`pl&h8du#cX55|nYaU6Z2Q$mUEmqP%pEhvSYo(u=GmQ(qjy+CX<$JQlon ze@_QG&MUMU1oLxeBtNi=2MZ0=dqwai@Q&K~yBDOzb8wjuXi)=a{O`&PJYF4Juik4U zL<_loT?$QyQ}RWxh+Q&q8`qLIZwD=oLJ@^Vo(>qtK4co2>6K@Rp~25&)y1_UzS|}* z$qKxw{L8H>@8CA@o@Rm8=HVPz%2ij{SXOvuceN3{^v>{GczJmyuODwtCOO*qS0Dz6 zSk0yo)vqP5`H%DmjZAYeEBWffTnVJf2j z|L7N{!snun)M=jjVZh5i!6?bA>q48v2}jlPR@ITDy?I~w4nyzDe}MfK8_y-~#T|jB zbtpp!_(`?4DqML9T9{{rPalz#lm&th<22hxuNKV>|9awd;hpG~rz6DUBNuuM^1$7^ zHIQt8*DCRkHdtO#L_q}r#YJcr){Uf`LHP2I&~s%c$)5P7C5J6nn1rUcJc7|_3%@#X zIYrbvPP=d4>ov4OzG+`bMY_QJXFf|zR%_BK5aTws*K3BV#e)CfNF%-U+vy8jeTXH{ zukZFk-Bln>a=i3&XtM04Jvhb%T>x#hCPiFY+gV4$>LurRPgUh=lpxkZ2Ig4M+xr!e zhn*fh^x*6-QA$TM9vd5< z-@~vgFPFm7R+vLi{vxF0{SiBaw!r>%`QeM%7`{7ZXzr0#^X;HRTgk;@z zCANQv)1@5ajZeSFKoFx{ePnG+IYZi<_4U1KljbxuG#K4ogr8sc5IZD4_1yS69i8ct zgx@ITHY)hH@Nb#DuKa__h=p&aCVq^5@L>G5s)n;9iEQ8xbzF*XByf54F-aK1anp6P z0R}YxV3B||RexEwjUyYJMgAxX)z}LEL&T$maK26p{E>40=wM_6zBjOB@>Hspj+TeQ z`1VEhMTjzDY?${{pjjx;2ULu28T6c%y3`lJgKK5De}qT4;i$0T=XQ+GPFGy#^2;TI zH79^cDjg%@p~cfH?pw{7j-9)+vvws>-!RxPAHuYxmb7L%lOQzc>mAAJsHjcwDOQs= zEUc4+%SgYK2#rK(ciBHN zUy58F^&^ksH~!Y=l=b7rs5r17%MIH#S7xBU@~Z~sOYVIpN-}aOD3gF*sde0gN+L`k zI!xaqw(Zk#?Ly$b0~6jipqb_i^!&yCyv=Cy$ZOr>m}NHnv_ops#@AjlfKyt;uwqKo z9P9dujiolQIu#HRs z#HZnKKNOEc%|!FACclD^LOclQe7Dtme*2inJ((~vmiVzcyptR60S{tyEQJ4`V3~SZ z@Vxjkx=Uecc8yPL72l8{bUx)FjY z5o8;-v2%nmpY}i-G0;Aplk#6;nPb}}N1gHK$&Qgr0D!Q>eJK$X%ImGI8pVT36cGMK z8;l~Ea%mtfNocTmE=oAjIok^2z!DxHch&9YR*~CO1re*#qXPAB{yR7MzuOG(iZtA9 z^nqD8X203OhnSl`xwE7Fmo@XtKexIA4;W_}a*L3$&5whAi@^Wawd)riIR*6^b_ujD-iZ-FISOmtF` zgf+uO(Imc8dz_$(WEbEj~G4cm5szUT?H<7q;gz6?c77HeMvQ1F?5TGMC#1?%oaEiqvd!!KYR8rc) z6kefD5nMY+(S9eA^6Ofoz_ew*F4uB}g7*!5@)6h+X!5-`HbYbiKhySOr~q+=R=87I z@3$T||JZtTgKags#INeMgIEhr1!hhDV44IH1E1T)X84MM)9drk;>K}8rU_IjF*#(P9il#=v9EYc_On0?7s+Idf z8?F=TzBk!Zgj@&$k-xN=&5vsC4lH!1CDCz~H+pen4{E!-`U+2~`2((09FPpnv=QWK zNoWxCR_i}p-*uq!bk0UjryLC$%Wu2=Q)BFJa9T823DiqC7BbPV^vNi~H{BOA;KE7R zz&YJ?A}H&4~@7WbHeX|h&-mR85de%O#bI<&r=9ew6gsO5-S{=zB zJ9w@G^76P}!F8TL_8TSI?~jG4>7X(+0waL$?|^)iI!>km>1bw(7S^?d~97Q0J0 zA%KK*V0L>-IyOAav9nLz<=rY3GN#_Y^?RGah;@XhoN1lUXO{W%JyPp{(LV1Svv%sE1EUwfFh{YzW*jfDx zUJ2Sqp~T;QwxX}Q(l8r1Mn+fFEKWj_nYj&?`6r-=c6iH(Hyqt)99#EFFk5|jyZ1Tu z_lPFd9mTITCm887*KwP?J8vcY@G>+GctBw0nc5PLg3FSQb`J|HKg0F|(sYBr z<%mi|K&V2)WnW6RAjXD!I+Vy(9iF$Xqq?u!a@Gj;wCs9F-}(qV%`|Q&XSTFzD3QKG zJMJF~z)vYFT~B1RL1LOr>0?dk$N=@3fWo@Bn}TkPvLMRVRdIhZ%mV6&dhNe=1qW8d zSWNjO?Y^cQK;TTY?%~Y+Pn8Z3?qu%C8wcs1itKDuUd81RUdqF8F z`q$Ix&4EcvmP$Gz3+i+gsFN!NW6HYu&+cTnixi@?}ZIh-c#04{~wNCw+9GnRL_E zC$EIMl{S&zI@!&d>qQ37npk%$SWimk~L&e#_2s9NmM#_`*8<4`&!{jy-X@)v%8 ziDFOHvqRTju)Urlj2`m)ey-w&r1)`NvJ>q*k7rm{NARtPHjABkP_1F_qcJ!=hYH4j zlIc-ZtEc!x^(bjxwPfW-mf9=L;VObE8!}_LtfFPL)O&}{?yHB^ikX(02?_`iskUVu z$oojiv_Z=beBO;`@gRe)pWpQRK}^(A;)1_)uV8R~j434w zh*Vt$v1oW1nWDJ?BACH;d}_;WEziOs^ZP_b3AjPKc?BX zVV1l3W^Iw4Lol_R2%CKdI8nx72x{|0BDjnP+q1UEMNY@|y<_pqrnr}$_c*?X6= z*!LMq$tpmVaFB3urlYQ#xRF+n7CDQ8v@Fhan7J_i0GGYA zfeJ85lDR|3S@UXwXA`0H$AW^-Cc4iq`j3Z`&rLbgxb_$qFhtS*aAiMb?|1Kc3xT8l zJl3{C(OHuKsz{;nWp?b0CLLEZFAW2;tM{A{CCw#V`^xfEnMy1nxc2_#hbp4D(k#o zk=4L43EXr|I*YP%5H=7mdY~SMl{sz{q(}Fpazz2NFy3zgZJi=o>*h?tE;v4efLZOa zqb|)kmT=3`SIW(cs2hXuxwwSQK3pGhDq7TvNlLyWXl?Bd=6Gi33JwFsytrVBtQ{h3 zBkMyKQgd$nqEVXZ6WO3VS$9g<`{LG=*|=eNgKW`|G9kL^EXeQ0wwe^7U9;i5OHSp1 zKptI1eMx?R5^4AuXDb0fAUd7;LIoTWBj7AaC!~VI#JHZ^4Ays@a?j1p%l4Cm$`cEU z+w~^BMH5Ch?y`Pr(#b}vC5Q2ff^={OUR?5F%Ze}LXJkC92(5{`pnd_k!k~(YYj8k@ zj=IF=vVoto#~sA2Y1Rn&1h~qCAa+BPxXgN69oxm;dfk=W(oL$*8Tg`4#QD$U z*a|~QLdBYGQG^DT7-tME$Pd!pv7HmjG_ekc7v-Iex{&GSnEL|4!eakm#`ShcbvS9+ zZxy%d1`Uiam^VBxDiztmi#$E^9Cz&{+ZAjmtdenx|8?q=5s9!p*cast5HabvWZ12( z6meWHN7_z@8k}fnog196O58V$&m?j|^Qk7o0Kyg=549xmjlATk5rr?>$duf9t2ufj zVoaUDeoej!hl>@(^>nJ1qJ^=v5C5NV7R ziyBG()r0{PrJ>|reIhXThQGh9%(8_QXpif;x~-2+wX2I$$iBsp8HK9xMTU1p;E_@X zN;;f)B%tQQA(;^$4JlUzB0(2t>bi5Y8x0C+T-^#p&cU~do5vX;u^`yyN3tY27Ea~A z#;P!Zl(>r1B=rEqV*4diBnN!q-5Ur3)Lw}Ckn2ersRkgKuwK*Jc?;;pVBzZ)k(~(( zZdy;7d@zYFUsA2lC6MaJYNA9osmbnjw6V?>yGo&Ie<1q-D6IvDGeKD3e`tC@ZzO!9 zO=E5w6OyU^rl1BTTi^Zx;#ez2&5}FsKl|+n%{~N=MqeufO2QnsuD<2RVE4ODOiIjs zi!vCp>!s~vGeBHQTnF4YI_fD&cMUDJunFh7l@>Q81oH%N;lqS0I^~M(7M!Q^m)?7^ zLj=WEr9bf_s*x9pj_@~-4`LA)_=M~HfxfC{GRXP+A}t9=doOCMi%BOD*zibgHqy!V zq=Uzlv<-v6jWXj?{dte9@sDBWtBGi7tCVd1;EI$w_?F9Cs($g&OQuhS8v{6@MLLd@ zk2augVc^4bn}K%E;p51hT#Cs|8Fza>Qp0@Hj5WG>To7+yni!Th&YV2+1uCvZ$AX%+ zV;n`d;3tS=(2em3?Jky>#AMAOa{)$a%R|4tWM-*2syw<^jt~pF-4A1)75et(tBTS0 zC3qPP(J<}3)rwE*0};o#701?57n_qW zF@RnR{sS-sS=#R~#)~?9_d+%;F%?f%{`tIpUxW<73ZAPz6K1G-)AS}v%HcWfqZ@HI zTO5~`jWdsfDW{C+2xsqo81ce>_O(Nup+Vg_bLw@tEeoQcp2M0O2TU96Uf+YjwC(YI zv(a3j6S|Mzt-f6`xNe+n@1>v4S+`>ga6HoyWlySNecU_J5Z8nf)VDMGZTCdIpiTcE zY`Hhpm=9AT{0#fw1bWNkKQRCaN%W2!%QiefKyk`@{0GicjrWxUk)W2&fo}`6mRN5A z=xtv?U#ojP)sBc}E98aDeqBXizy=||eg9*YvVn$KBZ$ZlFROHrmj3_~&TJJ6bRvEQ zE_9v>6HP=DH)7<@0_S8~`-R16IL6;HjmK}K#c4ap1P2Y570@+h`WT|nnKj`I_ZM0! zOSC@~X8nQ&J_(fjABVt)Uw~S-(it2wpNEbT>IS4}B9bu(8=yvZmZW1bs2e4ek%!%F z1x{5TU&`v~D1N!Aj(KZ0Qyw_iicSVWcg&Eajm=K=jpp~L^^~ful~Ke}liGJsl)w0s z-JMZM@ui#0yfC{A?(;+;P6r$XJw{0oS``(O{4}R&m{XCHzWkl=^l3Vih6XQj))=_% z>@8`4T6Bz1+h1@hxzfk_kNP!#x6*g)Sld!uI`O}Z#r^|u9efVmv(O;NRgAuUX($_V zN+x1_E;L_0gVXG68A6}!+Uu>Yxa2KRQuIg4Y@zxKgtfp9*cpbOtjBD04CgO<4`+hi zd(`iNPbL&u*gzZZ=9F3LOrgqgT8+|EHH**Ls};>w=X&FO?~I{^0*;d$2Gx^JFvCKu zk5pe|?%2M;1>*nI{xb6Wux5_*JEccu`On&vL-D4ZoZVlN*efWaDUq2DhI!2lA`68Z zvl_KZSx%I+8TX|=aLQ0z(wUS+tS6|aQh-VggP)Cy-LX#LRZmVYV#{u6>-+3Q)p_B4 z`Xr3h)ap*C)-`Z~@o>7rJB;;lJ-y(IcNB@B%Ig7SpeoNqO~mis(^fqayBGzmBWgS$ z5^q~f#)X}QqiikWc`dJFK7#>@z9WWjLc;E{&JlagkgUuU+XE~DVFufjqpLT}-mp<^ zCPu>)yEalTyi>p{2eeh!^*3E5FU?SF0|4u_xph6Pw&Ea96t5H+6kkAjAm&+q4!B3i z?8x)#ooC~auOHZmiYR_)kuLnia9%ve-q0WP{O=(Z>{38M zN}4xp!JCMVt0FY5Lf~hoKGC*)OpZi<4|YMdwk00p(G}N@zY!blMwr+1^e-_KGv-)G zj-!Ywk$J>As4C*--R532V@ObVZ3(Tl`S3(#Z}?O98?ZI@62}wYI9|DuYjGp8RYGwv zo;9G2*))74I!0UYFATnSjh^7#iB5wTS^$lO{-$8>vL&lPG&hZ&lg++-&tKQF& z{h9%GnGy?g`DvhUsdt00ZWqS_RDou{AS&3f^qKHom34Fap36VLqnXHjbkA|K?ZFQGHJ&?pyC+_+nu{4*S z;$kmL>y^(;@swbGk$$khuto3FZw9x?Iy8P`ns9DqvijIB82VFQ1+YyE zM&&7gQ_#+?&jfQ0tv^RypS`;ktYV#6YHkf97HmEA&eh*pCxXUbJTO4!=5zza7WuN; zP{WR)%PkXGMyk&j52J#S(Y<%?pY)6($(&!#(8ki62pitL*Rmg3S$Z06Vx+J&y^r__ zR>lsBu!}m3WMdW=61*&9K?KNX<2`p{y(7H&q*FpeL-)n4sGI_>_Nkt%?G#pS?zESd zxYRg0rD^1H7R|yZsOc6d9vQkTu3z`EW=*J~fvI0Z+$dy@{7{<1BjAI|J>|q+u0FBL zU5*QuEC}>s$G_)Aq}+M?LS07o50R<^LkBXb>InyMvc&kS1+g?u#1bheZ2XlEIu*>; zthl}5bC|^tx1?JEH%X78>e#WI4B!@YhK;XLW_!hFX_1Vh_+BH-BQ`!8QLpwD(ol*t z581vUI;T^f`*yo#Jja8VpDqJtWe;0Ts3Y8!>SVo&RS`~neO1c-Q=ckr;jt%@aJ}lo zyxNTR9)ju}T%Ow03pWbdx{$uf(%76{(IZk`Y%;ve2N0SA>}{;N?pBP?8L%9U&e0l~ zdCEA-U=X-4V{f|ZkEmS!{rv9RpFS%ZK4?r*^zn|+2tn?}WS5#2m@b`3) zO3+W}^WK9#Qav$F0)`=>RKeE%arlkY2enno{f2y@GIBDGSqKeHm9uR5e-Qr95)xvP zYeyKwjxm|Aas@f>@(FwlqI5~%v*srK__ZeN;K06!l2Dpb;@4hAGmF5MiAlp%RZF#n zKTz}ee6+-gNNds_@fIPjyxKSD@~Dw_lvi7?W-)Io?=7oc+Zm8LG6+`Qfau<@`*!as zzVr_uzk6Wq7-7T_B;(k1G#k4Uc3<|(=2D?{$pQg-&e^Le=noNA*ZKN;V8kP(Wr#LH zT~baoUD_1&?_BAq)YqzgEYJlJD-kFBkI`cXpXnwBJEHE^e*KJw=2MHzpPkF60k3tW z*gwFwZ_NE-Sv32fgNMYwHhOpcpLlnR0wv$WoP36Otm%uY^)U5czAKJ+VINC=!w1ao zpv~UF*;VLbZI2cI``&-07~z$CN@_+$dnQq*vpuF^&>(M95>{ab#c-gFrVzuyEMbEH zVn^AQ7MvSqttM+<$Qssr>X{OnEvxCr;QP&fAAoGv<#IzYN>UgSWZFS9=mF39Fc?Ez zDF+1jp9o*O9#m-eWmapoJ>^Em`Huont3xX82-y-j zH@>p=s0~274YH;c-Ihj`*rtrTAP~FGAF>JxYvqjdLX%6(S*Zh{U;?l9=O1}vF^yrg z9SBrUX6vD0RG2$~8WST$Wu=a|7G6}-3h&GQ?27c{RVgMgJ0CjunS%oq%|W)gU#n|8 ze@#GrjtR`hs^5wpMG4Ty2jop9lt>(pSUX*+-R0Kwtsv87n%8e`-~j(R0PgoXzJ7lP zfy@G!1F2EES`WEw`uW>Y;41}yTB5?C>1Uk0qnU=nw!BOToUn3>)^HuLGWdhSQrvtk zpQnWGcOAc4z#V*5S3$AEU^n+OJPXftLB}n33@b?hzqrs4u#ctforUXUZslG_J_gLtTEfO7nE*8q3EatXaevVK4HM~9z59>9>;aKQKEvQwpxgd zM3Kny1*VYoGyDqsD+Bb+LZ+%}1@G#HmXO78UeWlLtW~O%(d?JERkQmdW7W9!m)1Jm zvtAX;r&kcwe*iF>L&gOyRGaUuMZVx87k;1F=WN{l0m=U5b!OHpp4-0(B;5ONUd=1* zlMlW28BRF*N(3S8?5Xp9(bMNyH0gYU{Z&k@9~!d8zGi6ky|49I9_uH1LX3jSQ2cTJ z>yZ~Wnth$al(?94ckG4FR?~vMJa}uVs7XokG6HVv{4as)jq`Cy+6C1woeQhFrr$E# z6$GWYNrWYJ%l2Uee1wp;ZVfpb4?h@}Meh2@8RUw`ilw&1wh+5EoCMm;r{_^ zL6p81&)tmQ{{Tj6r(0%zAh@(JXE+iK+I@E(WG|plFsXrs={YDu*?SsrTmk4v3agLy z@f?vGHC$3Tg!@>|2^>45XXd$OKBB!+e!}fr9yoU@96p6YW9wWX3+2jg(RF<`1b6zP z2PcsK0H`aac1x{q+KTU0Lw2kc5yemK7))(x&v*=E0iB5|G>2J4M1X}5tH4A|prR&I zD3uXYD5NrpgxyAxWl<4A6huV{QDfEH=_{i#)zZaK++z|jJL(F_L=h{GX8L}!E`}*6 zo_WCH2dFt83@E+FvdfeVbM5tT)bEhV0b%&=7gSYKB4w|i>+JU%Q_F4?GgIS(h{!&p zY%EZ|hn5)TjIv1D_MM1u$UcfIb^uRwm)2+p zWSf0hCzB=^+*qZbQB#@O=O%2&n#{MaNB*CS5k-%_9UI!3&&f-3sb3>xH4E(GBFM#!Gxhhk}f-`&E`% zsGlt?_m;qeQ#!8>ZHR%*8VR{Q?$D-fVv~-ay~>U&UA@e^h8)B zL`4xXkxX_WUK~otrZ^-lfy}GNv*Tqh8W93vS~|o`B9KHyDG?C?5feiiVYybv0cgUqe=kVwvWIP+RXzHbwirJ0`2X&MH>#1AZ=vPzGRZ`u_P zvAacD*88-(4fZeRJz`t5UlDcPJ>>%C3x^4R97 zeM8>_Bi>|SxRB%3*gilaV}#r-^;XK0O;;14lr$2@3=jwe0y!KIu-5NaTn*DzU24h5 zlBxaE{ZL3BAQq7mp?y)LsUx#!dt?%j#=%I}$WH;0-X#1=`IgH?`bPCdLIFRBosr|N zNDHy{$E%xewl_`C$Xh)~26DssA{oO^Fi8W@c%mbm>#b2HtkiPWHRMxA`nqNwOa$+a zq~!X6$whf8BAAg?Nc3fc^xb_#v$UEUd=9CpBb!y`9Imas#n>@>E>K>brek=Vz5=W>2OEDlSVb_G|8 zi@gy$7Dp%^M1%DUv+^nhQAM?ey0_@#NBHV_<`qT2dmLq;VwUOf;-)nb)YLvkx(5kH z2_$aPc?F@G3E^=QK={u`G>m!_(loHQcD+}6w9^V&O42FvNrFh*D+xSu*8&g0X%RGO zDgOW~XzDh&>5EN4=ICQ}JG}D327L%#MA{;+_LO&PYmYdlWlI6_A*be}3cQm>l5wW2 zHIDxPv$b^)Cxa^>k^|+O5%XSM+4i7#E~0`9ivZcwRScItfam0+OWPjyI61E^AnZZG z^i3LM*4gfM*AZQAs-?!q+d}4J;sV1QHe1RqXQ?P~*e`W~qk|tQdwvec`7Ar7)~4}O z_^Q8RW$u7XP_{5}oyceal+f0ysvad2A>BI#p!Rkvoq28y^$m<3p@TnH71fkGvZ@cj zc7JXJVbh09e0$C~`2eOWQY>2PSgYu#q@AJBPZ^EijN}kU1(cmoe2aIt%WAvT+vWsG zO(~7p=YmFkK+medT_?7iFW_}sE)k4JT@Z1={q~X${#Ys(Ytz?@0pBx~44*dXM66sY#2t66ZKsvE3~WX~@Uya%!{PH+Jm0mEgT zKV+ACcAl%d-K(jn+f50OLfpvb5H@Ke01|Kp3EZxI3QmjQ#?~C)i8jFwOWT!TeQ`+)z=Aw7&dDG_nvwI%&8k> zT+c^#wM%`vK8EcKbT5_U(mX#bAf1@vPR{Yz9vB+~(-A6TigGHXY*&-bLKH+r0Emc@ z6DgG-iImC{roN_t?)ZlM$6p||&tr#qu4|8bVjeO+1xQtyso66~AZL+LrKQpfa?y5+ zfODdZ(oTPV9maZ=sAbnmT`fK79T2F16N#Y&fCo{;F1I}lk>umN(ZGdZeX+wi@WEBm z(zv27lXub9>zkb=J4GD-0K~w1g!qnLV`T)pSu5=G80#S*AIm5Nu=sN2<-Td=o0Mi*b~{N$9X7d3hyiYaDk_{Zpe^T4lIe*c(vnnIQlHA>)zI{Zt8# zmYQPW-i}5b9D)cVk?2=yQO!-IV!JWbRIL%#0lwQwjz`C#SXs96Zfc{J+mkC88c1Y- zZqB|Vui0k>4Ib8-pt1RmNZrqo2Z8WXOHIwS%GdPdp@gK=kT61#ne#C!VMT+`a zhxM=Y&V)ok>Nj^>vl>AQ3kxO}WwgjYUfT$Hm1!(mYRa8~vtrGHxh>;Nx z5S#9aU`z+IFwNE`7+*CsECTJ)gB91a*q>-<7WYnF}Lzt zHHUF$>RSH*90Z*qrmLrIT?IuehD7Wv^(61{-_>z>SYwgwe#NAMJVr)7L3Z`Y^^GUt zH7#pHaM=lwxai@Zu2$T4@uwZ_HSFWG${Pi>mTS8tYz%oY%)yYrPDmp;#z{E?p9R(} zI*!wOV0E_P4C5Rc@DIS8{Flp7MEL`Y8s`R#oCC1y;1{T8nwn80622#ckmeH8p1B*Y zheWTgl~(}My|3yESZr4i+m$#V67z`w@FQ}3!s=Rgv~4}8nAXEu+Io|KY3c}Lv*DA2 z=t`JGxfKTmRVfh>1s8(7uLT9fL_kDD6k4rCTrHY*<62HX4@~!i;sM9c3u>UfuUGyD zv-;M9ht){P2K;hzen6sQ=Mv&cB;=Em=DeyZqFe17ai_HET6>*H4rLo(Fk#~(gHLs% z#GHKA1>)sB-sw?aQvUq&yuIg^Pa)t20PqV7xwpl6K}C8fpEQCtG`Y?=XagjZz$-y@ z4#zZzxZPcStdBIbP680&koid1_<#<4$Vem=)+T6<#_QmITUlEh1nwM5-azj80g>@s zJ$GK+tNWUI-$D)y^+rMmFvgI6ZVQDe1tHRwcHLie?*K(Dx_QQV5HJtKg&tjFv5QEm zwrV=3f3&CkGfp^Vt|#oIa&%ta(#JWch$J6H;Ri?TLa@QE9|myRnn$#bq!35Yub`LA zU71z>540;o^N#$+Gyedn7X8=Lss{w^&fsU&G_)Y)w6wsT`Mi>TKrUjXou*YwS+B0M zNgLP%-pPT(84LlSj{}VQsG5=Ok92MhV~bo4#B5e{H@loo?uyx5-{E_^!{BljzXzhC z4XC@tBRjQLsws~*v4$rf_y`{*K{b+W`$}rMbJi&u@$euYn$@BWu(sRg-kR?aCxa>@ zbZ6o+K5NT#{d|C$cEwYV=p}2X<0`gjY4oAsd7q`40#8OezbuvN$__qh@+K zr)#P;g{qpOig=o8m|W+?afY0o$j1Ot8hs~eqHVgq4kHBnlqnY8dp zGruftE4`@$mO@fi!Y_BU_*CWMMt3_7M~N<6Xv`Y5)w?SfwPw(U08MCjaE zC1isH;~<7K?hbjK{5hcH4`ZWoW5Eswa95qx`RA6VXU|hB<(5N|_Yz4t;z`|D>WEPS z>Uw{(TMnwed1ZQjy@PdYlPt;4Fg#}VPTQ{%(U5|nE# zb#2l#pXUw}*2q6qO4GSLN#s0FqTm{nQ(Uz*#nqQ8gC`LjU}2GtKo7ax^IE#v%8L5A zDyrvv^T=}f9&%iIlCk=!f`N7}&3jV8ipQvGGB#~JWQT_U81vJH3GzKx9z;*$>~2fR zZxzowCYw@8Vl2DF;X@b#j#)A#aNBHiXyi}PbW~SQJKjQ+>5EH%AYg5rkUrsM zEGwJ_rr$Jd{LTP@)Pe~5DAHc2s+(6#*_bd7EahI`b*!-*(mp32dN~Ln>_Nu@7SF0A z%4JayS1FZ5K~SnV6+o&u6iI+V&jpP=3nc~37(NRvqbtw=d8*m8T8~Xm_}oL&XKuU zSYIwDfE)*~XC7mc&dWQEWtM8Xyt0QhfI;%zSX^Ez>bN(8rdY@IBq01UuDan}AU*2Y z-RAT6QSDPPk=JFcrGOJPOi_+`cn9H}tzA~EvQn^*}`MnT*|QosJaXd|p42#MXLtYb|fI0KS}pBA2e`W8?K&TV2k3ReW{SjsfgD zf_5PB2dKifw;pdV9hYvVVS3pUWUnZg zME2=ivyAa1 za=NJY_oH)9F@y2SNHj~I_K!{7uB4~~X(B8q#2n+`LZ7IoXq5f?9WyQ@*kNYdRMh8)q}eQQ8yYe zK<>TRdj@$PK8GQ89XGA)nwlZ_8lcI59qM^VYr*gY?mV)%efvV(Ej{VsZ{n$e+DL&U z4-v$D6ls%71nrV17CtfvaM+A=JeC$&_3Lr+W1QTtu7?Fx#58|wRa7E6Ek++z0KjcS z0QQU@)*0M*@m+%3bECS_GOmW9lfxhduVKjb=zI?7(pGx#SH4TZP?f|)Ktx0oTz|L9 z{88Gi?K?V0%;DDq1L{{`UpscsU--RsB``T<9Xlh&b_9a+{{S!^h?hM?L_@N6XQC}y zheFgk=Sm#u>Rs%mZUfof0AwCKbFtY)^^ay3Z8PmE;Ai74;F2bdzWYD6IeCnaCE7bY zx0`N+v{Sjg*O&y32dl|(`l&VtL`&n=F|Lul_jg;63FD0O@#?;e(weJ9(po9)cFV;y zanrCht(2I_JV_wqa&k|JTqjq?$hC#)IGENlI_W@bMgRfiU=Ky2%1)B$J+xmb?wW?0 zmXfA9;-r8AV|GV<#FMz#>;mS=lv4qH5!lVV(da0qBL=Q{B|ak|p!^!XcVAcOJ8P{P zQrAF69St)B#y@y~Pt27g<=ebJhP&3mjC(qVvmQ<(?68*q09;eLms{SUaKAF}%4d~niQK?H&h#eI2es1=r)I-qhUfszB%7K8Ut zJ2uI%4P*D$tQ9XKcVq00#M1Sv`2qMe}Xi1fyoo}fRwRWLEr zH#?V*Mtp$Z;D~(rs_CuNI-0(Y)DPg`n8z7&i6MTm3ndS5=kVUIbIZ{ayZ{B z!y{>PoIn5#$txnR*Iz(!Swm4yfAM22`h_j*n!s;b$_Zp=dY*(Cz0le0k1bI^`qe3rJ9_uGv%ntM!DayE*0hsh8-5&`*e$mfC44L1Ft z>gVdsK_tUl4wBaM*6$fIa$7z0`d00zK( zf(|`P*oA!+>W-*gX{sq>m5-1X7CeAKAPf+89LQam4f2@TV^-WLZIrL7t)4g`VBPXK zG!IfxWi2M7)fTNYNNR3%Y>W_lk%O1WLEsuUK70o?&h=MqF-PB}({TwOxcpqrA)|=P zT6ZVJ{0iikD~)B+t@Tya5>!s}lKBo#J+Z)fA*8=q_N8^yhDu68>I-q$v8UgVe_VsZ zegkhc171~76;&3_$zi!_3gJa;rhM|86M?fwQh5b1V8;}bJ+a3dq;rk~S_vfh0J|=M z?2)m1JD#P8IoJ-0i0~Z?`kxPvMI_N(o7=RcZK{|GtBC`>IU6&<645iFWaEFT2}q z&3C&LE|tTnaUgtw_@A#hH_?Sivd$yo93(bJcY z?Kp;yk#hP6lCHW$x^tLp7Ps81DJG_A_HM}BvuyY*w&{yIcv25nl8{a9FY?R%A$xv# z`z^B1)-{&tiw&xR0s5*aNB)3*Wn*d=wjDiITEGKbl13JvC$3P*Ys#UrSXGd`}p22;<^9 z9~H;7PL``l6HaL!lpP80F-~ zR|3=b+3Z&q)kb^JIDsrj_rN@S$0NwDwMkb6eIqKVWDkwt5JBVN;8qpWvMV)7be8F+ zqIuxJd-3^T@AF#AR+-dVQmN5XUflPH;$$KvxQb9T;0ioV&J;ev2h7*zy> zbm8RL^_T4%zUl2-g@_3%pqwL5{aG)%ZXjV=G83KGjrT=XIdf%~)ekeB(Gz71cA_FE zR76BVqnfDTs5z>R3eZP(!qV$1Q&XiXz#GI`@#Y)>KLS?nQQekC^l={oRyD>C#agSW z$jFkNm9c=5;w?zk&>`i0rF zjYs0Ny%dDxv89L5k@Uj!{CoJ}{{SP7@s>9&3(*@YG^&!imOcrHnP)3sI_*F`%{GE8p+VmgoH zxpL#Oz5f6k%AAu|>*%d5s%`qF*xKqDFmMEsIQ!9_gmmb6t=V5N=?zm;rLS>T!by$9 zGNvq$Bw#!Gjv)2(UrW(fL2#mmvX((46R8<*3N@O*&Z1~hm9f$~`h zh(1r&4)5z5+q&E*{{Wn=BJX#u#cj7b+N#=nwM9I&GCoHK#@QGNB%Xu}o~kWd*j4g8 znme5pKpTMI=*jXJBj$sbBAv_F=Cq8E+887Qn<^MSq!pWN>{C+I%EMmzS{O<9kF*bX z9sq28N|=^|v)wxVN2@6yF_TLR#MLJm0fT%W0&qQ7)9XQ{G@Z9fTZJ7132^|+Gl#z+ z>Q7FClHaKu(@=Ij4xrSPmuW8UfweCW_Dp~h4|D^$INXAGb5`lQ39(0mQE;uFs0FP1 z71R+xfkD{Ljf4*UB~3ve(p0!-{v0Wt1tc^y6!dh_`#2zsM;kIu8U_H#-+&7#at_pW zzNfI=1-gt!MM*qG(A35We1mXCPQZi642*-F&`$MEwzFwEXGvX9A5cbPrHtlB`f?s8 zW%JIc)iwI6=<3?n5CHB&2qzJ@I{-TMJl3XqiE3qh)e^p09&+cs#FOGl$v+j0q*EnT zQB@UnF2(gV4XWW&X{+u;`ts8p$85Z01{2Wa5|2sk8h7#QDu^OQ_OON*RbPD$LaD2S0% z5)MJaq9EJQ>TB(|kHOw+Ap?^pc0L)wTQBnN<5Py*=@uJUAbSTU!=~vg-+FgHPRSVV))jn5(IV03;90!gIOk6bW{& z!Du_Qmura!FOiV6^#Brnp#}z@?0)|MXw{b5+NV-aNl#G8WPDN_j_Jt2ARZtt+;}P~ zs1bhAE5Ao*JG|iG&Va-Yco&e*xju{K_1^n(xO)vLOGMM}Rn&q<^;ii%G8Y3MOkpAZ8ZxI4`&&9^)4iQ08I|psckmv&5EXm z=vc~W8-pW=9?bG^CtyKeE?nqYZn;#^vZ^Yk!t%j1CoGd3!RWFsnu_syd3DC)QBlvj z`44n?0kB%M(5Et)JyB5*s>-+9>TY$hQBlNYo@WNJfNn`xtFrbV`VGvf{{ZhuyyIh9-;*o!oi>%&8fZO&vT=mRE*G z!IwG500G33xX)-Etv;|xY14ALI5!hk4V@>0If2yiJg_%0-ErD2$5l-FNF3^GV_k;A z4)S9=ypBC_z$iv`ME)x0ImD7laXBQM<$21dR7GV}FKq?H00}38$hO-nF4c^pp{IRB z@_tq@WSUu|v zzA$l;e}o=A-=gShnM|On!mPX7?eaw(ZEO_pn2{KkK;H2f&NJpdD>ZO#-7EdJr=y|- zmeW%AkDJ_2&;%XQDdU}i@W{y+e|dxv@daI9A<|qcXkH&jSv@;}$T7%UkAYGe9@8~_ z1_XDhC1~X{L;hrE=7Z_1BH>gWyI$eIuC`KD0mQ~kNA5mKO>gbi$uom%t+jNgo0>#` zd@z1UI(qq^wEK~{>&uJ7vdA7FZVwLN!TIHOnqJg2jb%IKj_k$7rolmN5`c8s6%Yc>al2IF32nFQel5j}a07*QC7WWH+ z_SJvAkjU&V@Rb8LD!un!* z_YVI60;1iXc8yo7>ZPQpw1{5=1LUZNLRd0(1RcRU^E?S%3mYogFV$`{NUb$9>SQco z0|O+jymn~2fIO0X75W-MOB;pwP!L3E}S6cv!wLUHfJ@ZrB)9lcg( zai@qGPe@)kiVc-k?xxig*(~=R$8H5`XQq~sz&IQejPVOBu(P&z4K4C2jpnP!syCXZ zkrh>tX6j2p$sDOxyDis{nM+HI6RB%>@<3T_AOyBPh)T%R@tl#M~ zf4o0ZsIP_9M7_AZ!Us}Zs;S&CVwudxks)-x&E^v6>WB&68L~V91MUigYbZU2tF8cH zu6TI$0O#UVpR(GVzTrx9yIUaiBz@PRq4rg5qHPV*s3BTCqlx#+9~gp z5>ZYEdj-+F{{XXhBjwd*mjE{)dF-(!xknyA9plvS^y;f-=WV#NxaBNyJCzL9`q^pf z8e1f8Ep|pX1dRDE!PuUneOQ3VxI5K$2kDk7@oov&)y zs41ecTjzW=69FvGV~8wfa0W);lb=9?sUrEuN!&F>;`d8yroP;p9IqbKiQIdv98L-8 z^B^yxB8)`Fv80gJfC=23XPOJSRLN9MsFNjn2W8``!n)O(N+&tLncELD&(Ta7kkm47 zY281wd13PkG1>-{k5uWoplAlN9Lq{b$G!pge2Cck9!n=pnN0GKPqPEioc(yI8V`>o ziSa$ryb$J+*EI129Ao0FuD{wZW;ZK_t8Hb5kUlElT{hvYiQ|bUkUV_ywz^}nItmcU z@AG~(alf#SA|QGb#or|(o9OKYb=B1)*fZEsG~!CPgWYcY0R7|OHtIsv>ODPMrmnMF z>smvYF<41CUIDz`PS}^#} zA`dSv3J1zax;~`ra{X*BlGX*zoNtC8(bLymH zA|fi?*tI==pEC+r=_ZPD46xKwvPQcZ#}Sdl@F8u+t<&|SewNX64=0Q0rF}6TI0TQ9 zhax32WIdhNk&3&;rRS8fvUWGrZbza!Lfb0;0M$Cm(^O9eR1-||;e(N%RSZNDs-DgD zT{M2xwx`v_$@GtGz>fgZPsw(^%B<5_v^_jkFggl}4i2 z)Rl8U;lRfsX&(ZlR6V8Z3KQ<%Czy1f5`A|>zM6a5#uqq-v<#9?08kxS+Rd9!x=LCS zE;X&#hC30k@5R~Q$Y;@d)Ag7AN7=2yvh?W0)pW9oaTI;hS==BJGsK+m#@Jsvs1glH ztM2-)s7-UJ4{T)nC|Jz(DmK z;p^bJa+T;UV=j@s3EUkeB;YotAb5as96Uz;V3ExPQ>tXG?yshzhf!5aY^aWEDwlhB zOAqC1@_VFmAmn4gXi$1okB_Ovz;h$+# zKsfMd-{cTMk$nxPJ0R2ce(crFbp>S-t z4W2CT8^;mHf#N(0kgu2YR;{Yica~K|OQ3!mQ5JtYGxZ$49wX^nZGAn?f*RUc1dzUT+3O@>UyHzo0tu>+X|{0Zoy`cJWojmS2p`ysc} zoDm4#W6uO|Z>~>(UFB15s!| zCvvPQf}K?n5EPF}Xv?;&tq@T}84GdkDjq$?1LMs24b-PY_DxlKEV$oWB^?gVY#?Gu zhp*)xCv(fH?UZzs7J6u?sUn7&AOmBKpfnTEbw3h_YP61vwdpDm9UDERLxA?x4<7V~ z;jrie-&EB@M^7b1L&GDCWzIYRSBEvvHO*ZA0E~4!ul-+e7}>yXPW~kp#%}3u;o2PU zxW;KC?$9;BJUC_Y4C6i?N_}svj=GVP#^C0-0th@oTvmE1;etAc!tZAw1V4T7RMWGo zljf45h3@YN7z};@o&7V9imv<9T)6c&6ZP{aX?G9OI`Zo%Ic#$XTaJt!)AI#=HokGa z_HC^VeMMZBlQ*`J(i2Z3AGsv(2R!;KF+uvOEro5G=WdX)y4_Vy;lxP^Z`1{^K+2*b zAVpO~1yw~*gm#-hZZ^tlI4P?vl@T&1!vUv|KL88?gN{IRQoDC*`aa+QH&aUUk8-9m z&xzc8*Uf6EKDVR2TJB&9E0r}tJOpxrPoOzl1@YS?bZ+l7kVh~`D{*huI*QofXzz8g zfxsDyhrp6PNSD>Cz>YBP_i?%Fjn~gq9klA|Og3pLYZ?#xXmC%fNL_2Q{aID3?9*H- zXqieQoWu(xE)O6ANXW?C@KK~C%aab=sUfbYf~L(Oia8v{%M8Gh0U#0x7|)+I(eL%G zw`uEzbB;ZQJLCt%1CN*s^(9S*4VMYYcV?E{3rPoO%6Okm zhnOp?c7du}rL@%54R{rEgB>tD+;hL6-F(k1j*>?`?k;nQB)H_0les-pO2$pL>u|JB z?d|oF)5s4P-bQ@+5$3v1p6$xvPu+(907%NV3=eMz40!P)f%L-V9M(l8EcMk;J z{5oq+(%RwxzBY$U{{Z88-N!zBJOEp%qxR7`o#Nb#WGJ(8qRqr*dWsjyOJiwq9C5nX zHq7S9yp3}@?ho=?C@JHGxL^avs>Wfqa|yoM$ZZn1W=94NoJ!Av-vk38z2^>PU7BdA zp>(s%$fIu;y}_V)ldw>0{{U z^BG!d>L*h?xx2>WvFYHo+7DertZAonqHQ%)4juRd^M;+l1mK=HJ8VaYQw~Zp!dcq4 z8BwuCQbt4$An-U=T^V65drL^-3Y9EssyOOeasYNVI9c8~u9UoUT_b~r$g=4u9W?H2 zp6gr0eU|DPXyI>lpa7{j?NV{nXykFv!7>z;)Ns5U#y9X*A8Ds>IB6bA(~73?pmTqu z&HnKHO7awrZ6@p=WmTQY_uGy>A!#b8XQFv!L}jFKIN9Duo<8X?v+FyBj$_(1JF=_}jfh!S_M#x5#Whg>)Xm=p1VYQ0_7)j z#eE^!&4Jo?NK#Ww&g}A!Zzv-KIop7IK*01|8C~7Jua6&GWJ}QzQK*QB2#A1)h$x7N zmLA}4*&@IuCLohqBPVH zSYUo6tHhIcPT_!%0q`Urh8HZ;R$1@*hK|_@AWa|=I1kFea!;THpzD2)X>o6|zWGwY z?d$L%&+fzy$JC7ZVRV&hmX<0ySZN_>Y;dqN0muP?^jA?Z>ZqMj5-6qav{u{<3?#=1 zE!&yr{FFPiKGWRS%V*Ql0l8$=K=C}rb1&Z>qd)lTYKVeO_4kdSe}9Q7nA zh<6)BAf%v;gl=~}XNu1Xh@^W6h@l3_whAJIDb--t+O79UjCTqedZv+#O&ESWvKD$N zN(FQ5e@R>eofRb1Pdw@5J9-?261a8^C@wbZ+Z;JEq7o0p9DJ8*MA-ShX)Ug`)zjmTw1vQYafS7|@<4FG0FHzv$HwTst-0vUH+RXd zveHQ7`{FRyd`1t=Ml1Ui(v?8Em{n0Y@A|oW!{Fd{O^=>d^GVoc)S8Nt*BeiESA!#m z?yzp-@cH3%O76hwM|j(>ki2qjL?yp4Pti#GG3@@UNzGeVb@nc*mT`e}*i|#f!u5Hf3NuI(!2M5$GDj@B;ceQ;NZ-?13#U-TUb59E# z51AMz)G3_@Xqrmk2eH1>0&%pY#7Cca1@ihJ`vwY_Dx>ey&m7G><9KlRg|5_A8cj)L zskT*sSui2419muYBg7x%zF2~`rj`BrYMEeg=NrpU$gTYcXu7)GL4x~G@IQ89Bp(L? zgI9jC)>tm{+pA+OmKS3<*~62EffzokR-}55SXb(i1MYP6rg#AYc;oIp;PQ432pqQC zC#t`ru9{xeSZZ(9x{BwtgBW22fcUiIC)AGw8%-J6b&9OtZl6NHaQJN0dv~^Fq>e(p|NueNoMnaKWbv1(O;M;xT zj(59*88|NZ6Q7a|$VKI7uX@tMr<(85R|uk!qdvqqIz!~qzsCv&{YSMnv$JVRV4!ueX-J9R9T6FZX{NFF5c1H|mQJ*JCCc6{?K z{$|}TQSJCxBk#5YjN^O^_@6+!#-Gzxtv5sXTV*R^X&(E?%iemE#I8%*cAhlXN^9gX z{;sHdDTo{%0U)0-pMsHM``c~iv%ejtmKq4i$Fy(~NsapKJ_SN1)K^-YoL4HE`KPLe zK_euQKU94T6&C2^gL+-UIhuHY3o27MrviU$?ai)(?7^ z@BM?tL3mms(4mGiRiouVKb_+;|blto6m2_}x2qYncB4XFMk$a*%ZK z1TL*)yg_)kvZfadk%zaN95{leWw$<9SlGFZdq{gjns|Z%9=Tdd{S~IJd39Zmjqf~M zA`L$f0b8(1&jnGHd0DyjZ(^EKtP=xj=-haFDY6Hnfl;ddz@-^B`{Nzal@O8h1pOCi z3LV;RrW$8T%Op<%uB$N9j$n{-??InZ6s-BivX}6cv(kH5sYx&zO16$3&Qb~VARy;zszG0&bw#ifRbs0R9A3!F+C5v4v~P*=JhDjK z$2W*@!5)PYw7!+>s)z7hpIfpp>HE_kGUJ2r1LD4Jjwed?v747TG!CSk1@*O_g|_QO z9SZ;go)$-s5CHoX2u1r{t~5QLR<(x?sBe;7I1ANION4VeXsc;m%zz{V*C70qmV>liA76nD z`j`{JvlAK5{-77j$cCR_Q`FN{#w4bwj%FSXjp4xhgN1TX=SD*v-EkWnXC63TAi+~n zODD9ao=9K(QM|PLL0?zcsph4y(9_gR`K68q2_$=qi`{{eN!*fix{WKR&YI@osK3f8 zyM6lMHACs-AT*pXw}>I5U=LC$RAzc-(k}^xSt^87)n@iiQeP5S!YQfEY${Pa%c!BHquc z?(^yBEHA2e;2`A zQ&h!QPZdND5<@cs*!J*qNXR3@82GP{S4hzPsvR$4mfc-VC1Yc7G{8ySAQSHbaCRFJ zw@{-)zV~)f{cEWmr8La+|&z=bRubT6*R92Hi>#Kd*-*k=7ps%N^X#B<*1F`3VaI9YF zqpG(}-X8R9FKO`rkf6PVP#83=ZD}9rRX83YfDfrFq{$m*iP5}euLY!d9D)>CwKAKI zBd_RZtF+P@dU+<1vycNCTyQ}-+sQ($)RlJIr8%plngi_{w6T_R9YXqkl7g0royvHc zz)nd6a(d-by4y!_fz=r|8AH6&c` zUs`%ZMF|lR0TB=p5d{?$RA*n_-D1(z)lrZqdqgnj_?~f}L6hi-aGiB}{X46xt6Jh= zY@W&k{YK;iE_;j=4tW8;n2-lNlbyb6 z>Rl~pZHrA%TR;KOL<7hiUUw(rN)5+VPOH+Q4?R~O?I*Nu@s`15m)+r0P!AvKH2qJa z%mwH%1=I4>+fIg)OHnDB0s1(KK zcjqH)?4-1^nILPO#Ej)eXxoY=j<_e$NT~k+(IWoHMfKAsJW)|us;h#Eo%7U4BZ-40 z#NY)e()wj`okyx_FH@MJbEBni1_Ofg)c*h_wbM4L%rds&RZ!^g3^2Y&pHegM3O2ms zy4#=y1EcKDgzEc_p}B_D8Rs(7z~BoSNCz$)&U3c~HHL2T$qHps%~z4)tBsQis5JNO zH*3_CMv~`B*;oPYIBez<%pOH@Jww=)(vj|x$5P7JM&c=mWPoq5JP*sscO+6iPPpmo z&7_fVwpCN(_n#2}`r`-UwJYprF|stZ%?<~MBOt8}&qC>Yw|Ldq=^XRL>}Rua^==9e zmC<+Gmtp#Hr!JwWtfFz?(BUHop&9w8wZpKBya2j_>q}Gz0V7OA{YT9QD@851_GhcD z!OoJ)G^`)JPl-YF1fPzQpsQ|R zqjz?k9uAa^&!8jJj*FVm(amtKf{K}i^HfOK<7ga7I0NRssnfPfeLZ5NwNsCBoq!Y7 z#N?k-l8IvLJAC&&C2^*wk@3!9E{L(j65+TR9dVCU^2?m(lHziCudx@)dgjh-TE^u< z8e15Y$rtt=?+kbVap;0LIi^Z=L_&y)sE1Y1koI+LG1XizO{%VL2o*5BkudlIFmcqM zMc1hHC62g%nce87{>1Gk;he9NLZU4nVlqa^-t$}>IS{lu(!$+GrE9I-&}DNA;3t%g z+<9c}DXjN8Ta7!2mYP<`H^y*tk0Lfc zYwCL?(hJR=mgP?D$5R-PZ=7d{^f?}j+G)MK~G;h6|%_?3$NEoqv(*3?omX-h!&#zxuS95dpp zC0ge!Z0RZ^si%&3oE;pE4g_z-UtVL4tYB+e02lxP!wW^IwT+`oQu|w#OGJgaWDIaG zkn{s=4--_qhdZ2Y*!4S%8od*v#Awli=the=dhZf~=#1V)iQY#SE&33I=tA_~dpAn7 zAbJh?=6S!pkNxidVD96X`?}9-oooG8Nb7Wfdn1)e30?MvV1I`z0fd0Z6`~<6yqYIl zao1*IKXhgNWV}bZ{NY#X6xkg$?p+?+#IxP+3kGy%hN=^MTDV(pC8ai8rF_Wk` z^%uPiu580!M^o>jQegox^&LMdzpqrH2yxt(a}0mpqkP}PZN}5f z&V6N;6$Op5Dh7hm@umFI{kY;bph#wr1`%T0$R_4DMw&tDW zHJcMf_UxQ!ixVA6uPuruU|`by)4=WSJDpfm*2GWwtW>n$rs;>VOg})}9h;d18Ii&b zCFrQ=F@n11vA?VUbGiS50c=FXFR-zv0*W{#Qftg%A3b}q39(Tj1R)c=hU-25%n|qM zY{VV2_qr0jtO#%rvr^Mey`qRCrb4sazzpMSG+gu(zv>N00mXL39`gvqT+&n9k#%ba zsyO=+T3HvXXo_0i%KYw40J(84_eE^pJLi}jQxG&xP4iQ$YQno(nDOz^aX0#;ca>v~ zk~@Sc2M73iQX+6J#VZ3feGeW5zcegHHP*tAs+1S@U&!ZGQ*mau2mg^yik)Y^`2^25K<7 zYntvK<=xXaT{DL`uYti13NXNqu%SnTj@E2lVVl*ISZwe^nUPc#thM}z5E za$=MHFU2KsiWpq@mVizG52x2XK40c|mQqw~I}=mz{{vMdH}!53Zy`0|=JFaNEKdSX zgt?!xc(GhW+Iyp!)KpW8I!U>a{N$a=&tlK)I(k~TH!)d0P;saIa6Jv|X&rmALOXq@ z&cm?iNz^zicvWnrqtj3|VUQ<eR}yVqn@4{1AraE z9NO}?PRxi7ysDA|WrGZ<9rL%ky!RsNGdpxidCfPicvLvJbpuM-#agdyEZ49}-S4I#kMiaCfCL5*FVfyWAo&G9aS8MOn#b-`?FJX;3RPjbofo} zU+`4*$@Nep5}#vv0bj~tJ$uF+#h5VZ=og|7Vh$wlNgrNb)SiB5@fr7FPoJwBwj?hO z8K>c4I1&jT~1=_(zT1pdfC?k|0b(Yg+$=MuB1Innq%`(^j58wqM89sLMhI! z#TK(I?5@U_M2Oe6u#4c)ONO^jGpg_JMNlX-F3-58p~d?kJ+* zNB@SGw0UYsZ(RD`WZKfapcy7h_X`3iE|^*kX?*NYOH zbHfx{ZZ@f7fh+8%Oxd7Jne*;f#T9KYrqYyzA$sEy|Xa(d#@%K=qc$V z%&j{nLBRf(2G^7<$}# zo5J+GP_wQXI9sc!wp4O%=W-G0m(=0gYXAB8pm&vLPABXk;tkFIRIntTTDaMBPj2}Y zr{!;Av@EZ=&*<8}pWbOC%A9g$&+E^ba^&k7X`#*qP%9J!m9(mSmL;p4C?J23+^QJC zS2FI}35@2Lq#lsys=|Ov1Du=uGF0{Lq7jT$)bP@*??|E{xQyKy^<8!TQsf7?=HSTH zHQ}+Wk|#H3#94CJ$=P;DZgcLf)%C`EL9gcyKh#E3`6;0x4~cvG(zj{gPfVV2dK+!D zbMJp!2`Oj2Hh42>IkYxqWqwbV$i1eeK%7sq+u8T&GB#xby}s3TcTs;OI0+G3YPRpy)Gyy$oI22wSFM!LTBp zR3{2yB+`qo{Q7F9HNABaslw#Tm-kh?{x2`2o2908erA=2bWTTeKo%6qgtMw*g2Y|Z z5Py!kSQh>n|2_+iaYz92dpQ=t0#M0obt*v`gZEjdgG-hy)fO1U-WZ^;y*i>=Dzf84 z|cYlpCx@DmT+^4P%H{Zspw zC8yU$IF|s_*Xjj(uAZjXQ&&~LxZe2g?$h#z?jGb6T++hY>%irD`8~X$Y6MXs3*D#3 zxeqRuNH^(g`~KSjCR=7#?&W(k1pXE7T_5Y)yiZ&IqQwLD@Zs)Tq|^R0qD&G;?sWg~ zt#a)Z_Fst1GY8rn!eW$)j^u8vn9{pf;9!{M@3;Btkn{e-(jqLKYHIo|#7dEx6Eh$gw;^Q zoHB@M3o~o`F7BMz@Md_)#e>4z20!oeOCjjoJc!UQ&z8SU=%``8vMR z645fJr8!IwJ%PSfm$4l@iSrPhhzZf2)-{;xgF;Eteb;Geu}L*p?8cch$Zooi1L6CL zQ}tCpSBn^8%3bchgQTo!fB|mI0cdCX4S6Eab`~)zXjk!(S}{PfLRGR<>tO;MEP)M> z@I@#sk?8rN7}K~Yi_QO(DE$}O7udmxXsz9;9T>g{~O&$6R5IDYJyYg$kUG(pf#@yc;bK1hYVnER8r{ zSTJxmKzVp7-POGf_k*3lWpnZqGhO6BVrXJ@M!^B5;HOaqI_-1sU9`@JG}G$BmNj|7 zE5nG+Md~B5LjABU0CQpjIc1-N=ivj?(R`>pQ{Wa|0eaf6ym1|?cg!PDAAF22u>~=E z?Bs5GKVQ>(XdD|BVT8hXGQ<4Gv8&N;D=hW8j~7a;v?d4y061GG!oVbI;6C~)H=e|O z`Nm&uY_iQ9%blhXrKtlF3V1oHL9+ad8Aq0`bn$d~h$sc1<i)M91KTrV^o?ePu%&a9lh40gObZq(y$(KToL^KhQQH2N=is zaR%>#OX^!Y#wwiV1PD?VHNbchac!hZi=kd%DT)bWGpMG_poa^pS%HN{G z`CZ3AR-1nS{}Q7ACi=~AsSMq4ly?!F_pv!HA@7-nyr#V!IJ19$q?4t3i+rR}RPAj> z3Y?9FBOC>LFK`77Uo(TcPh;dKY$19v6^jQ<{7PO(Y`tUK>hD234fSe|)7V*3gRC>9 z=jjz<<+PkKXgwkvr;K}^@2OWXUc~nU(ER1>JS=I6E53Fp^pO?&cG{x00rz(H)l`hT zqu1Yv&(T0cEM#?ZIUK}9Bxw%I6#J0vm^6QLy@TI^FjVv!D&&*VJsl)6y!H5P|Bw^E z-kVbo7ke1s)4^4`R_AQ?GZ&M7pl$=pRB3(H8wMIkYo( zTWRZ}1=^=MtISrGb!$sX*=Zt(QMTe1`mo4u#hUsRL7ogmG5(mGISO9`0XCI0`yn`Y ztbG173$p>)Xx=8jO0lry{}65MatVf&wy1`zK3MscKkS` z6Ve?|s8V(rzo(;iROO+b{Ii`i0_^fRVLgn+YmH(l@Vn{_Cr6LN3HQb_$%&jFFFkhe zpPkaw)YMDev9e;6Xu}IwTm%4o(CV6C&0UT~@QUJQMe3mwf#!ThVI7hcQHK-#eV+8z zSWgvTVR>BtS%RYYU4o=Nn8-FUaQ4C2e3_p9faU0^_7H;pS!aR{#dV^JtVKmE2N^Ha z(hcuav=oD>*pHTu~MRqR=TwY^AT{5>M z6a_E(A*8x?@~t!35qqW8s?8=P-2O27Zm;BaoL$LSzd3BxXpBaZOdpDjP8~^6QI7;~W(enJ zc3sGjuebftMFud?MFU-PV8iW85nrdT$5>pf#6 zq~5LdckIy7DCNFP^@NQNSA?Fw_wjiV7T7gFg$ayAvBYQnahkFk1f6{8k0pdX7^p-7 zLrlh31#TLOOMZ5bZA$jLVT1DyBo!TR!_yWee#nPB^)S}LyfdEi}@a;{}J zuJB?u@TQ|HqN4zY%oMl*spWMJw!aF#mKWug)OEdxN1ih#1;tWes~%bE#Oj?psL5rP zR@-qiBXN!S`F7FhL!|!*R=2EkRuj6Sx(SBz`IYXtghWRrcAG=RK(BDv>t4RxFfgDH z@b55)5bjM0x!~wdy>@bWWT~m*O-`?KvH!!0{^y&_WdkOd-RbhuHJBDdHNL15fIa1p zD2u7cHulYC09A3hYw*fo1mGG!>=xA@v}$R2eRUG2S2AaWpNj&7*+3cKIlB7!`J02w zzX~znBzxvA)B+0#+sKj;oqb-WdL8I2;Gx;g5j^VQfkf9}Iu{|N&AsO#`8eA|r|1?K z*l)=k$t1M57Uuy>y1y7+P=n09mb5Dgs8jkcONcUgtfpC3JmV<5oEU`+%wa2q)jG60 zuTFAR$KQ*K5w%u5Yc6Zfm=tVPFrWG=-4a!?%k zmx49l%~U*k;&D)lOXRG0OOvKB8?sEC`l%)0DElb#W^4jL&RY{cFv2 zJp2!{>(84PXu-ZD&9{j7rdngKda++#$tSxnw*dj_hu0-X3mV2Axx;lhWu9sREJyyo z*f2;2@jc~K%LY1z1lt3LTU99LtL6y#vR>vruJiR3U#z(1g?r9j2;1n05%^nkiSU$j zOUf5BB)?Ows75tKF)^Y4U&bu__ZIJ(0~5p&;U6d)_3)~SYIN<3Nqmjjngth^BRp$+ z0-fGH`B3Rnt~YzEV#VUf^(gesa%(oi{1Y&gUxsaxA$vD0Vr0pG^bP+FWqpPKSq@on zP>8jrNvl({?cAsrGK$lg_d8SD|+QEmmA$ zhW1ftu=f6a>mHF`U2(96P`%}$^7bqL;^c8QmfnKzR0}<>QpZR7b=c!M z)5cEbP{if(3g5r$OGw^RwvM121I6JjZ)h=mPk)JFqqoL6AV=}`LU*{n+p7Uzkm~t- z@5H>CKx85)k2z18U?TLOQAJh1f^w#J{bCSH@q!I;ru7JPpzl`63A;*kP2l%Mi%Z`1 zI$cxc_>FK9aH;s3$}fZt-3d*Xo%L}G$~&d;VVQH@otOK%%kmLFbvc9&;foOF&h z@!@lnE4hTG53?iy+05Yv`REB?3n&rN;#JJ`0nRjhxnCo-)HO{z1mUDJdoW?*D}&;@ig@b7}R}Cg&hr{tR7MSkgc4B1{T4%V2df4 z_tu@QgY!c%fV&@CoDK?{xW(VwE(H_u`=sIK%FpT<&NVm|1`nQU0G^A$i)?cn7AjVg z)#!JU)J5}RImV#3e$Ee(9sdA?z`}&Vn<37!l-MY?F=g<wA7~k1(Q8<;E=K5E5fO zkKzUyDS)(R&pM04st(SbiozoWtdtP*g?<$SPb6+ReLKa~`9JTcdov2GZ zp!V=YS6A(io_?RYSUWOMcQ~G_bp#mw3U09TbP;Xz)jU3=AO|g+A^)vitD9`KQ&J)l zbAy+%Wes77C2egq@I?G%Z>?fo;StzoprbRh%J7;NqhqQ%Dp*|x!z!$HJP=#ngf)C7 z9V<-M;gb^J(J>75_>kPL^KKo7DnTu@RI>teAhQ%Vqfc1ttm%W!_bKlzSq;H}Fy{+t zOCrR^&S!-R6ra%a?eArYr(Musu{FNpjX4G>1iB$J?p-DHtsE^qpRYQ zYV17zqDo?M^*GK3f_pIY*Rnt$vWanr!p?Nb()##pJKI z*{>AU!*&=zx7~Sh*zD;^q1I8YtUSn|0delx_E%!O;~b7)%HB5v!sa|#-}&XO(2S;G zHZv!vVn?4LMK6UPB#+LE^z?-)s;WbmaC_mFSlUvq9TFNZw%V@fFaU8s}?^e>X%mJTX1For$do<529(dN2;n=q@?#-=h_O7*3WF~<^JnSj-~cJG4N+8b3>2(G2j zUHC**d%HHA#`F8#j{$o3>CP?sfond(E6|9Fk3S$dopM|01vf6jB%a7_q3U5Zvs51 zPIU|Gtox7@gef38V1Jq3E?9_cG~PEab~00uxmN3X5e$dY=AQMY^%y7}$LeUm{qs#r zb9AZTOI#S3sP*j@?tmr$IKlb3G{jTAt7`1CrYR56>Wof=fX6FH5CM43tzqMVpfQL_ zX;%M-#atS5*jyEWDBl-L*oD0B-hNFV>vS%i47r%IOENFMnuE>vk8OLz?{+0Sx~wr!M|Wb~C=5A!ST zbm9KZq0X>Vj_KsqFLT+U!C`8CRZ)ZhRi#_9@SjD;-iF#1H8nAaA{w$cGx_|yLH76+ zVTdKcUy|kRQ!6~n3NxDb2#gOO1ir-`so#n8`y!5VQx0Se2z1HariaMmlM7#}<6?k_ z-T1zley?rwsap6pybE6zVGvGUD%$;Z`F0%#NUcc#EqK`=S?W3c+kkCzJHB>6gSbls zBgyRN>mfA`&Z0=h+^KC2*bl=<7j z5|9<=i?0q?z&GjQ?{Q0r0H-W=ZL*&i_f@_}5BRb6L!dqkZ}d;f?4y>&tmWE_E3U0Yf2Z!%~ExO*y=f5!IFJ-gMrkFYk|+d%t=c8 z@Ac-N1_=_LqAv-X&T*|BN#6ePw8P!r^ybLKx0QuVtde@AGa1>HVNPc&_Lw?(G^-v~ z=E*rJaRAYjE)~JGMs9FvRrY(f2j!Sh2af!|a*o(Z8}uqaUwsx=Z>7y^YZk2@_2|_Z z=um7M*j2_?!&SDKO&0B8qHNi7Ha8DIY2I41&zwYINjVHw#wZ+KAg-447@{k$wKzU| zUVwoVHQKf;xcN))@lG5wTLxJ@W=OP+s5^L@cE#~a)F$w}_(>Li`Q4Iy_SG92nBxTeDZfpb_ zN*bu%zqA`Csd1Bf=y^76xv` zw4*Vta`>~LB9vb0QB@qQJIDue?M3s>0-Co3E@4gRT_63kA;RHCrAZ}=e(@ThA zjC$&!gP(&4-RBC(Ywvt6t_dcn6uyOp!4jt}n#VWMDHOzr$mb((;i`-B_Q+8D`s87y z+$lP8@*3rQ$C3ocd{;k?;?P(qoLzhQeA@m6NI1E`l}-`flM-7sP_*r31<2-f( z=dbYBnK)dXdF?(JiU!;we=ZynpnIKnGdIW&ebI90lOMWP36ooVk8cYQ08q>cl_^tU)wc`)@KccF z_H|!ZITBEvu)$(yYwy}t%{a#d2t~$0imzve-p{-NyLkS94oN6iUuID{WUX5Hn8ac% z6_cbiGbeJTRkRSfN%7aL6nntVN>awpl;|H~%`S*2mk)KxH8C40*EzfA0`j5dol#0Z?8Rk{ z{yDrcyOo5S>ugp*Vcat0AAnwY8=0Uf1LWL$a2ju%5pHOjmBhAT7C@41iBL#>^D15v z|Mt%OnunSpDv_o73>kW&Ze z7Ub<8{6cy^vr#e8Fau;~f6yR{kj-@ap=YvL5k1w8I$*jmtQdF;)!0_t^@6fXpEuKT zkz)5FaTtHuH4rA$9ez;Y5eS)x`UU^K=7VvB#NP{UMf^ zpS?Kk5UU&4r<+)u3KE6$9tCuEtCR>n3SXusY0cE-<*~|>n`6}$0SIGmSSTtNyuNi0 zLr3BCgk1o_wzIdFRqmzNrxK4_N+~tcK^)UZ(@#z5h;05tTO{0WL)~y*VS4+IqY^MM zgl#IIO9FzbU!TBF7IE`e(ddk;shO9Mr{K24<3N1LEql*w4!a9y4+tf%k>1}pAO5YS zaF{VYfGL_ZJdcgM2?m5J^pXZrxixz^6!QRDO+Z|(d+Mq-JJN42J3iGPh-GJ01uX`# ze5odF76*`eF#;#@d@ylV(#`yd+a`Os-GI-hMs-rpg}(LX&es$wJsD>8;91VBkDEy?tHn zCUMGgRUr3iDZhWoehV1QM=Hr^q0&au^u%f0Q6ATrp7v+xP|5a=wAd^D-9LbPjno~@ z#~sd{tE=>ChNr~#k2|dY07*3|y3GF>mt^#=oMRh;!lx;RvGJiG0)C?3$tf2sF!eEk znFiLcrKAdGib`^G7;&L!gLbEEKsx@8^!`DC=krq%H%hBcsbdy-KAmw8q?HIs%1CIK zT}Q7iBGz6I)1+dfR^SYM-j}TR&&;zw4)=K%rN14|jh#t#XlP#5+X5PHx%y===-Ddb zO#Izu$#;ZW;R#hm?~&6344SUzGV_9D`}O0oEh{L5yJ6UH%46Cqy;Y zZ$!1{&W@V)4R8~VJ&0K@qsP|h6;^=)a}sdxTHs3yCJzFa0Z0JjQ4vm9Vc!bDu>J#Q zL;9SX#rE-wF7TG(khwj9T5hc43(Hs<)0QyVLLae2yMeL>C zxepCo{}EqH4t62cnB*D!Gq{Z`kceGDeZvd3bK=D6Y=$*7i97H}QAIh*)ja0Ct!4w;8w;=bhMM@UDV<~t8_@|5^W@)Y z+&+7D8Wvs`EX%0cTb6I#gV_P5sGbL&*_M9*OZ}Ru``2gA^pD-%YCBUWA?Iv!9+(8% z(@gA2|6dR{4Y5Na!(7dXB>)cqumt485T2g>g;fKrcKI)^m{Cso%k>%rdA7o_Rt}{$ zG?9NAd$cA4YnW(2@#sEB{(ZV-zuhYzP$ zI{ix#y3z>l8Ag6d8NELdV%Hy;#2viik%LvModyK)Q#RG67i+&a zVVQkeBzkI2c(e0DGq{{Djs08br-B{%eZrrc@prI}krnyeSYbx?5*vu6W6ML5#clZd z%0@|BMb1~}6b$eG0qS0}3#5gA-Ylj(+q^m0ZS>SlDC1@+=;Opl`gxnJI2e|saJaUW z+4_Q)_8amx?1{fbOdrlIU-YZ-$5vs4>=ASeZPkyiyXP}5&-VP;9joD3qcQrQ;{y21 z>-PP?TlcX~ClW-1UnM7*2wJ8`{<@N!iawN&zN)G>H38#B6z1NE4h~^cgEPU0#n}mU zv}^G6U$|(egO zR`odp>?=QBFC=TPk#5-8!XbY^14wBp&lJRG)e(X2VqkLA9r4kTBD^%)UwLNv%JCd^ zXeg>`Gy>5b&*&h3byGC7hzIl_&c~nga&^I~Mmw!$vNF9|$iWkHk1I1tk;l(K6e>Fy zlvcWEjhHp4m|k;k9+MCqNf?LSzoJqZ96311aqpTqKvGtxQ$cQW)5MvVFG=Wz)_PCs zifrw#K<2_My7;7D>}Du;UIR501GU%vCn@t3@#bJ-;2$`g&$8<{sM*rL`~y_lVq8fA zdn^8`H_g>Kz^~_P-O@fx9-oZt;%zJvRPJaK3(c zH>unI+rXr=^aYED1Vhgt>PDLDOPJp!EXoJwj416u5OMo9j1=^n~ZAq#}df2Ni2m^IbM#G5o*XDNy{R z=4h}xjtFBYRhmgp{B7c6%S3sy9Y!QNQB-&73IZ})e-X+YN45|`U#Vi^3{NXL9@)nB zwhTs*%5J}&h>JiF8G7M!S|pZb9;gGWO8qk@-P7j#9H_h~!NhMc^UYg`;ydEj_3U}d zM;QRVYs^=)jk2Ht2}P}~X80BDPK^Et-UcX+G4flIVic-T?2*JIuBPZ)y>~mOjJIWu z;fwOF-mf4cZPD`ixMSS3uJnhIUOjP~L)^}!OVk@u9US+yu6b^E%-}->?`(X+*$*31 zBErZnr8cp&Kh>3lq6AR@2c7tofrdFxuesII`|T!r~=}Prn}2~jwWeE zFelr5Qo+!~EKuuK=rp`wAbm$iYyTxc{&))*LPIZJt!B1}ySh?S1p2H+w8~I-qEBNR5ipR0v=uWaOCUszIR z0XNE_?oY7FK|6a9$PGai^p3NH6ccq$rr$)8p7Z4!5Pu0w_43t%>W<0!mR-Bpj)91% zVQe>pJFYoIAOyB!6GPX&s5xOzC99P*p*iXHKL7_&?i@N3!ESnG?X>9{Ye5mbI*p0jQON-Sz9~!nHWFgd zU`aNd(s$IlANQ;1pX~*Hoe1nQbn#8b0ZX1zzuK?i&noivAK!*oHVNkbc>c|ey893O z+Z}V(vBQ8wFrMJ8CEgESicG_!42cfK!Yr-Qe7(0tGk*5f?Y%U>z#Q%gsy4;|ERDju zU3j)bc>i-R(mQ)=d~6z)agmA9G|^)RZM^Wc#!QAxc3e{PGgS61iPra*m6vGgSoa;v zuGj8!0ESh3T(P<3AZfs$zQd=3Wp4f3Dz9OC9019T+~P`t5A_4r+zv;%9p^F=yXpU% zJdl%97Oq)75a9k*MZ=UfKyM^veZha4*qqKC%c z&ZONuIVN~>YQf(2iRaJyQ!4O(ck4bVQ&b*$7wSix{y#d{J zkYe)FsqSZSiU~)(hz;);MaL!F7`c4%Sm$V#s5vyEe% zw4nn4#VC}qo6>JZ#aY<3c$%_>-Enh{pm**SsfZ_f}1Ta>ZLu&T!5> z#t&Nhl)(QFAdUO*GATi&nuj5Ac1}dp3h-v#r{DboW$9qBbpD_~_o~Bd$BTib$kkIP z=Z4fOYX|NN*H}}|oE&W^TC*jfmvyN-+REkMU5(kcPI3IC@eae;Stf~WhtU08AB*?< z*P^GHI3luhj=vdYQiPPVC_*VX5;M@Gbim`TvJwuOF?hqo$(J0fFQpF|4xe3FGw}-m zL}dI((m?1afB$YWn?_hU^4r>-=ylkX37&VE!P#i-oPXPaM$bwy-)yw00#Jo7Kkv8J zQmzj2CsbvfZfJ|~w!I9zqr5nHx4Uc?m%k!vtcDuqExy_m~7yXrt4Srcdff{GZW031e!x0qh0oH{yv;`r`zL(hFsyR1u2 z_*g5em)Z+4-1YwSO@V?sVxvEKG=Q+5UG_CiG&Ku+AV5oS)Ta5NI)A|ZrHO=&pZgws zMdhRiw>K=(=knax!6`t$snrMZSfap3mgi*-@!Hk3^WCr;t4ohnTkg!$uO07#D}t!n zs2|v?{us^a4esw}zYl4_pnvu2r*uQgkb8$7e0NA7G8h=VkImTBSVh3q33X3tUQ4XC zAwg=8Pa(uBg(~iq_Zm>3a~rl(NE`!r%w_WvuXDY(8KxG__56}*r^`|CfR8U(?H#wC z(3iI55?(#tAHtRt(u|2rz5#k3S=P7N$Dvd?+f|z9#rBHGUcv(y9R~jq4T~^ zN(^CSh@jBF{cO9&YWL7Y8!MBF93Y{&woI1faE}WQcl^Avf=tcH0y{)s0KU!@C#aqr zj?O4zXr%woYBpt%ki~Tj>W32x=3IPwfO~-0ruEz}Bqu-hOw?Ha0wXaU$TXu!k@bn4Q)eWr{9t&JX^* z6JGF3Hm0h`u)dnFD-BLUUqV)ICVU%AtRy4d=Fu2$&2NP6ywROVf{*t0b`CwT6$ zJFttI@j@p-U+-gr^-OBWLa6t1pRW&nI86(!tTs!@=}v>^7a&UP(8F}2MxnQ2lcu(6 z%q`}RItlC8Urzr4%JQCu%Gf>4S~kMU|FTTyyw{iVQWX^k1)PncTnJ8T;)P!P3MNQJ z^oC{oJ(h$EOgpwVyis?;f+V8Fdy27yk{N%tyIl0$U>bYgaQVPc*pqJy>mMMaCWAq6%(B}0 zvB0)+^~5^M+qVpZE()AXrzcu5IIZ*SW8u{UqCL0q?4^f^5J#w+$sjg;9tQ>q_mtIl zy~&10^U5DHeY9ak3B+!MGR!;qTo%fgPK+fp0>}OMy~Ba(iX(XNshhUszPsGusY4k0 z@g-kfUV@kxabOq_2lNeHxg}3c7Cm*P;52DHB0(8sfj_pjY6bo#u`bzc zMI^mk4Lh+v5d`g_BARXjuk&T9K+7>9VV4if#E5$@ad7yD3KvUinD-AQ-~cmGtE@)q z;o`2I`a+QTIqnb}WAa3h%KrG6C%Ipk()3TMniBH}bDvPGfm!qWn*5rn2MJmCM27Tg znSX#C-I4DcOLhm9pLn>E6CA?2`jKdf+^H*w<@AH~Yf)-UbN$6CD#~OthvIVV=yb}q zL;fP-L;pB`NS(~YT7M9p7@fI~nsUJMpIwA6v(4Y+t)Ni>C)u{~+U}lzfQUWb0JQG0 z2HW`8)~RYT)+Gu0C(K-bntiFP65rGnbWD$q-~52^r5!A^x^~q_Wx^3n)%uiiL9>@A9tw`LuZ@|TYv zKlr_AFNRu`#pUrta)FU=;tjlL%l3x8R8N*4hSgFyyRwX#wV8P1f(>I@bH9nfA&&w{_A2(P6%VE z@48?>M+5G@3Fm2AWcm5iz10+Fncav?BQ`C0N83&cCo zEol*&i>)9|(Z>A3{KO7Vf(Nkc{YW7PRLEPD|7P+6r$h1hWL~2Lm<(5 zprwNA>Y5;&gbPvc^}yR7m|S6=2ujFZ`c3?#f>oqqw_Ffdl^4HsK+Pb}f53mxj}X^I z`BeS^8Zc0Q3`*WVb!%GJo8=Zg_WQOKVo7*JrG(_;HQxz1^;NQz?%jNQUeMlw!s(m6 zSnxuGM%uz!guKv+A{4ffIu0syxg;dz|4R;|0vuaHgFbb19H;||nw#O+lp{IK<}mE2 zi|*gXZH7~J%0T8`72VUocoFgDD+$11N6_qZ_-1*fnE@=PIWD4~pO$(8RieOd_o2_j zv*MWIgND0ElBb<`VqxCz2>v2v6)qQ20i_}8&CXDziO#f9MRjE@tM(_>9uxCQ@8cIz z5xzSLn?FhFN^*~LbC2m7Mvi!9Q}*b`3x#clkdGPD60i=NxO7kg_+!Y#QXq>wFXBsC zIqidO7F!-ld$65hh#eWOz^JlO8oN5vlq@Z@c@SBaDE0Fp(ky9})to*w!S}46z#L^2 zH5sc0B_`lVR_0u{Yl6Rg2}uCVDnS|MY}r0)*GpvBrym?EyyRf+WAP>V$%d9V{`@4^ zhB2R9LH#KzMmH5T*+xYbqnGRA2+0fzN;F-1J~aY(hd@>?$s53}H~W4ZKNjqUKiVR# zqNq2JGK>M=>LrRz`d{)8fJU`JZmWr{y+`N!i#)G2RbdOpT##JipVd|z<2kNJgLGVdqrCER_OPzrt*wh#mXmTN|-8|Ki%zSjCl@LL+$dDj$ z*d}cb$?LTRY%B((_>26!A04P-i6#+lC*7C7e`t@-)2dENu^Z{{uh2O<17WUbOFlal z;~y#Bs?4cF3@4(w`OwDg#N7-+It>M8uxqQa-GlWl7?Hpsx9ya$q0P2c|B0B2bG{+t zZ1edWMGB!7*w*+O?+KYVsx|Js2{?LGL_ZO;yn2W$IY_D``Z2+m3*RZNhT;0kbvuQQ z>w&lax#OPRWLp(fidZ+oz}v3$qXO9}rd_?6=w}_R9Gj&KsY!vjzjG~;Z2yO;vy6%= z?AQKKQc@Cvz<>;hq=3ZGprmvRLo3qV-5@DBNJ=+DcO%{1-8poZ;5*NA&ROgIzCX;K zwbyJgi@iJ@J5*54Y4Yaq_i(v+xbFeEol??nCGGf4|Ctfj7il#=Z&cV; zcy{DFW7A$9hBhRdo|>CAEGJHiOo|sGG1089`I?0dZLypfE*$6|e9 zV?|gIzNZp^!yQy=?~v>0w<-ClNjXUb z3;mj2q5Th})HgQ!`FtDChKxV_-p{^<;w|g+Zzc?urod9N*L$IY%~+HHcG&w$l9A=d zb%Pf3d6_o`mlcm@^Dg9qG%vURl8NDd_4?)wGNwuXLGU@FjaZ1!r5ydbNzqfJ>349v zKN4jwFOPrT%i)90B+WDO$O30AZcvUpX)R68>87HI#mx;uT4kiof=kD1>SqPuF}&$5 zFK^oyl`!$!grJONS@61(}V7Ae9rWm9&#J8DY~T z3LrM4^obRu_q`CuUBUT=58K$YnrdvVi;AE_>dG1%9MH6R!j6hH04$*S5HSB9%2czE zOSWwX(YC}h^^VH%-Ho>M2x?I69qmSTe54%k!c29%I4n{^C{EG>^gW^b%Ii!N2!Qsi z7V^>4eC(`d-JSJ!kdhsF(y3eInE2F)r7AvVvDVSG_X_ej-(B^g&uCh9v3^VHN*=P~ z#Wsda79VV%o4DmE9e0kQ3B^Gc^IWbUoY{n^6}|1mADQ>g6B+xYfmp>sk|Qn~b;q@J z&79xPaXHQRO>Ug=%mt|vR-}%!wVN>{YPyqTD0-znrW%{nJ%L=j08v?MBbM=0pS5*m z0C+Q%qdn)Ny&H)Lp93yT4t%%gYY*I&woHR~c_6_OA`9XyWlF{!)9!k%p;f7^D0lAO zAB&*&EV$ZM)V{2oZByOPJ|Pb!>KWB=h2j>I4|v=#n|$em%MCtC+qvDhFM{}{ZrlijhI_i zlhA!{P6u`#4Q4*#o}*CCzG;Aur3Ewf-P-qMS83AZAmda-b0r&_T1ID6Rm8=K!W!B{ zdq&EtSsDd?L{?#5aPhhRstvMV=p`5HMN`DaBo{pHF47?7?7)Y2H$DJ0ss!=00Ps$le{(1h4%P>n9LTC)d{{f$Q?GX~5N@`R;8& z($<~S5KqKQa+FMz$Y4?rxVaqp_ccOHz@2B`J&T%Hf4d>d=^q<@t!nwV28@pF_{BKn zKT}N;FM()T`*{jN;kIdq@t;RXtMf%SK+kj~kNlhNgbn?ebYya)FHlx2 zZ08EOM*_-rG@dW(Z>-jh+}9^IZU*TT7(zqyCjU<-&SrdbDfg{LT^GI*x?v+mrMp#u z)}2ZKsn!M6j;PwWu8mJ$5X*|$zr!E<6_|Pr_~srECgF^C1OEqbNpC9J8I4JOxy{)K zHanxZD^fD`PWuP=rDQ#dm>lvlHL>HtJX!-L`47Mg6G_sgXb*7NyVO&we2lKC)3uHg>|!yAa3UZFU!!eiJ4t_*z@F=1k@c{D zo+<88gd20X=t!e!d-c=*4OMQhzQ(g}una-c8rb@h78j1dvnHA#p2q&e??@Zjy& z7TcbPcDpko%+f8cb@^ICQN$|xBVB&^y_iv>V1Gx2+j)D(ImK@N;Z8B$MX}<_Mw4+S0VA({5|Pgi+#bhLA;$E8gRaI+zC#}s)_pR;AJXGsSvhJ>gZIiO(zHd@oSzy?uN zp{i!L1xGe#Gm_VaI>eq8GZD>bHg}uCQphEs&gA?*fMTS1S=5$QKouRXiJ99O<9{Jc z{ElU#<)8S!n#MnGRnt=l5%A)-VBeL6!j99`pkIo)D$B!$eRu5GM5I9{<;+YH_Jy0g z#REZ0K5uL`E(RVA>pgLYEZ!`06(!O8lFw%d8GNmiy=%f+R%!uQw)8IDA9+J1 z##C1NTz@iyheOZ;#)4Bg_%>Umu`plmRv+w(Q7|%?CTNs8#36=Nj{Robq-nP`9O(>S zw11Fpj=~k@zt~PZFMqOh>|3u~eSY>RZKE7#Ay$=sCqpj$DN^laWugnHT8->BBPb|h zo9%LbSEzPK3o8HJ-BFb3-i__<;;+*Ht9d!W4etVntNY8l)F;$|BScKfVpEINELO)Q zeMY8s+Gi%1##CU@<>_b*I6|{fR9ap6swQW|sJB^7dpcxEq-&J73Zz{_HYrvw)=q=C7%7@U%#*b5 zE%HEC0AX2CO0k#c1ThNWQ(x;t@kC;9Fw6srBS5LKzaK%hwFt~mFl{Cf0!TwQ$ z&)#5p>r}hI^$c+8k81_$V+eBuXu}Dl)*oU-4&@+SA$5EvWhaP`sG8A-pjp&iz2wU5 zTMapf4S6hAF};TC_B-~JhL8UM`N<=CELC)@(-J(hNw0_O3;lD>Yu1~D2uAsal%l|H z8xD7xDY<@{%jnUn#rNlJI*p#EzNBkrB5$%FvAQqV+#Om}_lp&O*huTY8X+cYmuvR@|Sv zxfm3TOdw;AEk83)R^&;|Hw=AA`Gd&TmTbBt|NpwXzpYq`Vk-rw_CJOAA*z3A@2FZJ zwjBwY2%LZ4olDe{F&V-9cU5Iy5q|6=r|~KoOz!3+j$IWb*sa`fw62N#5s~00vn#t? zg3aJn#_rB|6dcmh+S7gFR?eIgaIse#;Z$yCsm-PD0&q(gr=$8@Bl>viaB2HD%WYg0 z>skm;h(7Z8o@Tq{Fr|T|*4i7wCgDujul?q3fYxsuj67gFv>)-@>hz0P(&xy!Xiri4 zn#3{Z&9i_URbhtk6S z1h{Kpf4_{#w^UYd-P@>UZuZCpj={bYf`)ZhYL5C!!9T>h{C;gtR+G}{+flX&YoF?Q z(+s_83~FYoM7SKZ-kt^s*fw0f6^+i-7dXkXu(W*nqqoyD^Lp!P5M+HU8?PC>rO2dL z!PNts+670atVwdKamc)O6W21?oEW=ne9qOKUTIVYPY+*@W! z;~}fB6h>cO$h`v2ogy1_iNHFbqj`SoRj)lcI2fGH7Tf;t>h<&ug?C$8y0ET5KC#Mf;96PyUJR|5#)PHy*P6mh8r2HR>)xcgKMOPZMVkKr8s%!hw3?R# zAZdrUiRq@WDIMq0vGDXI}=nSC;O_1Mm3&KzMS9vqjsCV`@i zwHTr)K@88ow-3c1;nl1o=)pCK$PM)jq{P=!bvZHelphe>U|FLD{Vp(D|ZUYizq= zh7A4vNZ;)l8~qBL?*GN)Ls2Y|oXY<)4lF;^%N*5xS^Aa4mLD_*$QTxz_dwPL7c-F0 zh<9F>;KqxFfwzqRA$eVQpiP&pEJ3Cx4m3-Tz|KzX)OVFXUWw4Ni{`Vf<<+uP{Ww`b zXi{-jn(>R$%QfHFezOjd73-@fh4`r}%5-3~6AHh;Ojj>=vV1fC<^`G7YSE|=%$0!zq_4V(XlqF%AQY^>t`o@x9W9ZJQx^nYuw67<9cHBMxJF_`?wO(qE zw6HD9GEVO}dz0V2n^K;tjC8Fwc*PMJMxPqvb_8Wq9fEisJNBs%Hv+W!qr%BAbVN9L z^fR0jYMRL6WO?NXsDKOw-Clk0KiSTaim{E!!#oD&tZ*!XznB2;>l&FYfqx#|L;ot%ilK#BeJd>!ZeGO?Cvo5rZ!t~*@ zx*H4K#0;O*tBcP{xz@31QaZ{zm73)0I|I=$yhk2VHdfuLDDNqIw*q$sf=K_U94%(9 zR8YQK4!P@`SDBEb)YLRI}1DwR71mWUAb>JOt!@20}u z3i=qt2!HybYavl90Gno?H9rVOPdb%2va=f%5h6&*oY64sZQ|UEDLmFPvi%3>@Aj(x z3p^5=snksKn;7H4> zg}7G^F$a=Bw|)Xn#~iRMsV_Qm&W3Zzo1#jYeqU`skTOi(*jO(#cfnl)dXWSwp5c`; zK;XK2`IpJ6DM(RiM(%OhjUiX3=lNFpQnX5j?tAN~>a**7Mi?k{{i5rh1}!a7N_j=H zKrl{LPkwEtVOPq(LA0B6=im>%HX_%_>a=xqUy5ub6Oi-9MqXs~Q2t zLF-?@SrcS3>{y752ma@N3_3{NtWdHIoQOz+i!hti49N`oUk(b2v~$f1Jw9crU9PzY zR4yM1RfaJ8JZtN=?4*b=Lq`$XAHjT(VW;J^#pKQB_Z`5H$Ju`X95$<%4m+L!!{_2;StC7eCGzL>i*|fDk z0efRC9-)H+*HY79d&&>iMYgCoElj_oP}If7!5FeEaYA;3e+@;fqMZ#OkI?p$t*5Oz z4~$B07DYK(jPGrH95HGx+*@5QeL&HX6R* zi;D?%?2N>&LG(|bGT88AGXK6v%eM@sq2&@3mhB(QM_t1husKW=Y(c^i)8QncZHpKKCn~n+lE>6@YO7 z0OME1QXnrFLclH`BZ?iwtX$>Or~+W}&?;=3NS9j(wu@)2&uC!@esP>i6L z&ybc_A5u~n>YDUyY-v&+7Wb&V*sx`Ldb^4_W2k-;lxNO`*Db#>NIq2MHH!L9>y@d@ z0hL_T;b0j4v{U&%07T^<;BVi3DSpEGO!> z`lc-ZVLG#6&LdBw1z@o0E$<| z!>eihmnAR$X@UP^K}PuL4V$R>)YT@7Gl_i!U~m0(a}oWCS0Y=RDvsbt=P&LW>{Kxj zIXX<_OCmVcw04p|uSQ`BG9w@$g>|q6PRYAxGvA7^XY6oZ5;YPq2_R%)+AjZXbGc)W zCIT=t)*sZvwYsj9zW=S3=uv}m#q0q)s)ow^c#7X&xI}7BD>F{E?H&tj*D4;c(Q>PG z^9p>nrIiJb8S|yEfI-etlG;LFlEQfJ9iH+}-`He!Ip%m$rt*q$^`Q(CJ8~YwY8Ji|vxPg^t{z`1yno*LVZL_1xYSw}bX*mz!BlN$s-^CvT^TWRZ<`Q_u$Re$`=n|9F@4d;S3$7#ldP(UuH)^jst^NuWcJazVmSQZ7 z;j1+~GkSsB!>=Y5e@bmBI3=16$6_(U>6?uYgMsh)?m`=@v*|y;MXf`ymJx{Ek@E79 zai3kZ#I%D)r9j8lMnhKWT^&?{fJ4*g(AnZxP-+&13i?*&axkB3#Enu|!TEqfe*JOLeci`r$^k~~|`pOf?FYLZGQGgfE09ug9o|Emw8Qmgl9jGUa2kw)m?ZetdQbnn z185+v$TZp~Ceyg)lcYR~^Zo_1M_?i0;h+n#ztF2*FBw4ey~>9y`yMxY%Qw2405tk? z3(E4^*ZYs|^=hJ|JhUN%_RA*gr_*OZX10lUCo#ugeV%w+;^zO5OfMKw)AM)umT?FP z4R%i@Kvx*kT~Q74-}XIpr};hHvl(#=K~?+d%$;ChZU7kO=58-4B3Ghg9iwHHMYTQdCX0x+1=;5x7LfvDT< zs42L)QFZ3VSqJ)A$Wd+Pk+K(izT+^rdUE$*SU;m)21nyRp70*|+0+woE#0I$?eK z;d`>Q6T!Tg@0yFV;E=GOL2tnD!|%p4^x48}O422p?QQj^^HZLs^($eVh_5C2QEEbL z!vy^3J_qM#=T{n5iLz|*{4VkYZ>#XrMZCR8EmQQo3=j&h*;>nr>q6w@x+_lh{{fOz zmJ~+Y#&j2lyiS9&xj5Ek`l&+Kr9(*PHE-10b;msT@cNMPI6SEwY8Fi21K#zbY3r?! zqsPMRhn%gf@AkI_SBo>vOI_Ks0?Jq-iQgFFVVtF6nhLI;2|BaPHP8JuHuGe!m9@`p zZsJFiw~6?6+0SgMP+*Y^q4Cggb-=#B41qWQi9)c+8I+mWwVyJCu(efjY~E458J7i* za^%ZFi!2m`qa5&G236i~?;WY@|(KR%M zqMXxu&lv}E^mkjYj{`0!nNQ7z%FB$&l3Ip3!-k(1&=B<+X;|mrlsy(;$DgWb5Mvg- zo!U1z@fZEos$_kx;&`)2VP-HUDi%6X1T$I>6rQZ|E+xGA{QxX!qtAf=wUV}^Fw5Nl z{pHEjSbq_vUL}TRdK9zY=S42}4V?w+XAK5n1mn@)in}wd$Og3rYZj$4vL-oDuqVtk zUkVav4Bs}?NMJh*xmgl9kOPV*+D|!$@LUJdy&pJd(2DBe|9gQvlZ|-Eb(#n4&zTxY ztFa%ZDVR?PXpPq&Fp{mOl+|Wa9!eCH6}8g3cz4nndu%px!^t)x0B$VZ2FS@{zPo8# zc6ebpoH;bqpNJ%Yj_LnA7FeNy@rY*k`ZWaF3ks2U(Ft6xG=#Y~1&@|a&Q#lIBEHvJ z9&O_`8f%ugf-@w~mtvdJ968!joBId_lI}+i++cTLhO@he^Z8DTC{kyeWZv~ci4->B z=g?Af)N0Diy*IezDU8IQ!kPK~+XGOp^kccx4&d+t&W3gCp>9^DEURJKEm7yTl(!%( z@EAjG@=-qK;-BWd9*LB)GOBv+XpQM`ZD_wtKRJ-TR57*gck3#64c5Lv-l~O*v=|$C5qUCDD&ugXZnf(%xVKlK4)Cv$5 zNEi81YxNG%WHGwbx(QClHjBvqy#o$zc~!ffVZo_MF52U!cmt`Ua>*KNx>pg@JJb%@*POvHVg zsE2$gRS|$2amYTErUs$cXy>G0GaOjR@jf4pFPsz3oODAhUx9hm2mMj6Vm!SL>vu6&~zk1%h<7 z;c|%z-0IN%L{$cY}dHCSNX#VwyN@k+t#Em9<-U=bfp9*B*^WjXpN!w-_y_0##fT2 zbPS`mJPj>ar~|1*$v(N87Tsfv`#LtS+-d^=cI0P@#^2?1js`5n=&8JB-HmH)QM(gU`GC($dqox4Cpm;=l_AmoumopM9HSeXY^C zh{c&kT6ZbEs!$0_WLwIixG;vU_?bF)<$6?0-zV^1Ic!AVPR-t0L8?p;L9v4yXxLd`5@yPqbr2=I%9N51@7NgAq{MV_zlSodRDuX`n?R7JJ`o z2}P{)4%)kKWn@`$)N++W-b}d-x(KEmu0Gl*etjgvUIv(J)5Kc4zAdFR{+`eHs5i>7 zX}aZp9gt^Wm}c4cE|KQr4t?u(T#p*;0$y=knnu@}t8i4~G(2{kAL@lIYCOpHG{N#S ziAoIJGy!Wx(Nnw3x3*rVE7Z&~KL)Lm-tXg1;JI=**<+Obt{7&!?cYSxmj}U6s6r0& zO2F#LswPy6&lhC;gFw=OX0(Z3&8kXPKSc(UITDlvp=W|oB7+eS3_sOu12SK|0r@J6 z49W6*%yKvU2WXy(f6WfWw z_X;@qn>h0HOEslzg00)mze?u6yZ~Tf@&D)f;)mL}+>RJ$HdGkbR3`{s5s+hUjtfKS zD_8QW^o!W-VAKkc5!nT`wR!BjLwJWG?XOK_B&B!Lb^c9>y>NKPN*zRl$6-zb|c2<9?$3&kJWY@C=A5kP6-eK zXzNhll;sa$BxosBRwn__UZP4I*ATgq)v8zt^D z^c`i4hr8Q*h9RZpQg%9c+Ods`8+za-&c22Ku^J~l=~e%zlr-^>2(IV-zxC7>FWU9***gdKCK z#f8)-VJ000QO;ZwK`gY34BWkpIJoyh@z6vWnA+y`zDx;oyd$1+q`3q#W9vUZS>*yT zfq};PqT2SWE1xS(zRw_cfhlhxn^#xZx9b?4FgRRSUy=A}Q)Z+8FN8sIv+p7|tNrXP zl$n|OD<-C_KcbB5R0}xTaY-%vu?1XPn#u)AQhM7bewu3mqOCMxb7*=HnT*TzWdkKhk>$$HhrjaOg z#u2TO8c9{$6v1c&|9vTU4XL^kBRWch-6%=jKY(t*KY*$;gd+F=O4ie{)nkM^{ddbY zOF691(yMSUIHJL?=0h_?hGTNp!`M*xniSM@D|7n!hiDWMUZXJk0(Cb1vEkeMQm?of zNHc|F*gQUfZJ4Y8h8u+(_A3AhkHek>+h-CGeeDAkGesa?R)x*bpr& zvNT(u&7m@-hBLj zfa>>askST~^LMDVDZs8f#FSme6EJD#&#dpQ{T-V^!kC&*0~Wc=H{pX^(FW{|O(n(R zQswau+dN|)?(g7v4gf@_h=&3zJT(e2X)dXv<2BLQd9OdqR|KXRFhArmPKf~v)RxoR)cktYoRdpS;HRnT66EOOoksQYAd&cQoE@x*03tb(R(5K< z_aZH)lglUX+ce_vsMK?$V}ctgbLS@bI3S;2TrjIKwRAuahsRe+lG8WDaA3Yow+wXg zFW;LX#m~xR4_`xhTZ##s5A;(Cp~5Jb76>Ri6wKj)$r6Hxqx;`47N?skUBhDOC2WQnT20j(p#2UM>vd6okq-oi6T*$77T|<+33wP0j^IW9`Pj z3hBPu=V#HjRZ`Vt%Z~bmDcnx+4&;t?zKtnat9yT8Tev$Ua@DrjDCMwYUyuEwoBP4Q z0AAu+%lB0MTc5vvw-skTlpmeVgMRwc)irw@n~m65w_6F=B;3VyBfg6JjEx`X^67>@ zqZ>;^g7js@bX&kbfH3ht0Bba7dNQWrvp}BwpRn+HHCzjG`U2mb*r0+gLDLCcb(vI~ zvgIZ-8U-~rp=A7s)ce4QC!E6v-ixKyaJoI8wp6Tq^zChw0IyyGcz`9YZ&kYB4@2{c z1rGj*^$gBS4Q}JJ1zY)>s2(11qLFcY1f)mx;b&4r?k+v$xyH^I3dj(W>h8OKp$>F!?St( zUC?zB<%cBaNYM@FNCYhhrN%7*oh*&|C+`LI)~AmUEWthv*$XzB{-Uzij7PJ_S_-aD zl-LFZB{A42$aB{5+oc zrR;N#ak{mFg!b#`<(;_n8pPCP69NcAw&JB7xFn8Q#n4*w$$NF>I;sKB{&bHI z#z=-TI;X8#;$txs7lo&!bKRT7a7JK;F{14jS?H-%G&6lDZQ$+=S)n7(igNAfXYq9kbPHF8>7kJz6KmeA;UBP*Zz zQx+_vhm><%^j@X#|^FrD`B0aF3DfDYWK`@S4QFfSr ztltZ%z3#hmlN7e6-oLMFRXTV%jk665nX{=r!k58u#Bc)I4`J9f54;?pVP*Tds0I2@ zpz0Na)k*Kwt158k>}@XfC7+xFA7^Dy2+?l7lF+ zsz(rs7ucdTXi4YDY@uICHtHi#;RHRF$nf*!6+JW~jm2hVJB@AhGpK#lg_JrD$F~n& zi3vdvnoxC{G7c7NoXZ!3cg2?T5|Y^g|KW84)-@PwH79xGRu?T08*>{ zUPKOWS2%3yab&E$bVws1t!=b2^XT(WrTkATJjV6bcSxAJKhbAO(jYBdJ+vF(KD~QT zN(;aLFdOJQmKrg8$|2Rt;uO*PMtzd1$QMRySBEW%bI?{*e9bligIQmK%T*9zDTs)O zh%OsW0%(cf|9~$9ah2&!NT85C<)FI8rMc4My^FA^CU}*kP@AkJQu$jF&5g6!jioe- z_vMRdv1nhX%r$4d>65v9|3JUUUPVGXmVUus^Eai_(>=0idxf!;J>=|;%XR?V#VN#3 zuS7Wv1y<3Tc1PF$B*5t!&U`6!{s+(+b37IQq^BhBGU|PMe+9%Qpv80rhpVU>9 zJCiXRd!<1U(R<6eEZ&)>>8ud2@@3IQoJSN&1XEJ|RCcTJJ1#e2z@z}lgH1`x0V6@2 zj*YN7PiJi@i$khF)W#fPZRrL285hkh#}QBJ6^brb#(sO|sXVLF?y5dq-0j#BvrSz) z5`pWoA0Ie%3||3(6I-_8WBWOCD_X*%(vqv3-S}uP=C`^pnV&+WG*&#TXMIzqE}r=a zP>{s&cln13Pr>73_Z^J@fu z_cj9NvHg_LMQy(i$>yWFz{7BgyP2Ho6q04!sajBTaa9C-ocnV6q6X!1F!_B#<}ss^ zIig-wUGW}HzT5_u@+`;_LP3Bd<5e6cx12B%-o>%jqNBj%{Q#IBtF}@Q_f~~XZ2>(= z``@VNT7)vJq&d^SLMmrhie@d|<6$&0PN)!vVY&W!zb~^+qN8|#IF{8lH(LaJ!%z6c z8`*rKw3HGZamt|DWl%f~eK#@DD@M*Gb2>!nfi(BdSygBj9`W9&s&t}NysRc_3894f z_-hQA=2R{HmXsv7GDL5t>_0KOb92xk4R(K)7I9z9rejSC4TWQc7JP5{#Rr*qBUj=| zo~pSZLmydjJ~kJfq(&O%oM}C}!uIie6~rn`1*VBwm6UG=&0rYXkZ?jcB4l1jf8qsg z;{2%t7pBLTJ5#IQ3=Bk8z0$;=cbgB~tGrU}VUbK(Mk^Y2pFvtf#W{(ZtK$CXQ#P-_-V;UCjZTw*^ykB-YGhKzNWSwRoS`y0t zomTbhGj)&#_@H6-`B-Q)ct;%zr|(g#({B?3N0rPs38Iy#*axf{K0D+XOR(cx`U#Rw z_5G?=xa`xb{usYq>w)5dtKm603NBCL`PG@Dsh^8UJJUiyh)rXBRlC^4Vx3=AXZoTF zOZP&F742{0pxW?5SYBZa>|S5@luPy@KaRzqz(&4Suc#OZ)OlIzjyJzfoa#ZC&$Ck8 zvaNHR>Eu;qx=n&gF5iqV*N5>{@1~~7`oyE@-j!Z`wzV?j#{SXo-oM9uI!AB5$f|nD zxW2ksN$m^P8hs2O{Tcl>X;y)yQAA*mwk%1#xv%MKI1Y`ixXMbDMZil(Vm}XVB&ra8 zAm=YjoaN?8B~FE?j{A6^BPO5Y(3_O$~Fo@EW6J{j)?ecu?@( z2H7A>D!a*d1So~BfBK<&bnTKH;Y^faqDV=*OtjaMy|QTee33KO26!;-ft-vHct=+(d6O5=&qr0@|xkxzbH{)ibe7l;-{P6 zO!_QB5ntw8`v;;T%P5H-$0&CCJ?`EEH^+=id}Qk@*hm3CUaOHGQ$F88Y!Bc9^uG#nq# zm4C9$<_|d)G)&skqx(&|*zu#&pmGuZp?)C$9{heID68^Qdw=^9lIfCt+tgdD$5hVS zU&dXA0Yi!HuDQg_8XWB0s@7=aYMmjh;V&~^CKSJ5F3kDT+qCdKw@zJFg^1yF{&i}M z0Ks05Rbsqy);nU{amsfjR_<8qz&?&MLDEC4-*4b4pMi2n$6bkWn>L~e$n{BRQ6%S{ z1*D+RDUR0!SM{a;;2Mj^c!Xq7l+_p0-0AV@>f&NYNTF=O#6)SKY;~#vO^31);IWUO zYepL9a!Q*I<#|^-H2Y59!f2( z4WO?E?etmb)*`&l+RLHpc*MZ#*W{y2u9HKr3qNfD0S(VM_iSl+6Yu0)EVUBg1XbP< z36RtBtdQ2HR#8M_1}xjXa=#K0nif8C`oQYjw3|*DfVErwyJyNoD0WF)o$^d~wxfi( zv~}L{qY9uMliw55f0yJrU`x)(C`hI03biKfQlBt@#HiBKB`qBtZTb@M??St=OTdNuvw<8Wajp4ZbC^b~MALrge6tM0y1C_!B}?Tk7(>T=KtC63uCd9_AkmuV#bQg*FG2&cH`IWL zOXC(4#m7ob!1kyJ!dveoTpn|28-%AO8b0%{EKpefY5mO33olkLi^{6prf!Cz)hE(~ zFYDLlNkTm+?YPg+xMEK;SkE2`8wc#&?P1bs7qawE5NLR@@Uuv|kDRkY?xBS@BFwPB z_7m6EUKEaDeoZ7PT98#`n^xbplb`h_Cd#!2QuguYm??)EcgeoxR)bcB-)u z2IR#7AgyRctKzD+l_@OLeS>X}l4%sz&lH}eS71q;&-y1g$L%#vyAB1Fq0PN(#@ns! zHeb&b(DGhGLmW)kK~`vB*JZyxWl4ov4sKC~(%nAi2}a?+MQI0(IU>r<+1{!YA|8?b zde#qr?iDXg)r152vZMz~ISqusnlY}t(-B~ZlakxbnKAq5=BF@ef`5%V(F-ZSsUT&) zJIp-;|I0N-TgrkYH697wdk_Hd0$XT6XaG9LtNXjjak&moE19qm8k&jZ@c!rfU?LLM zvvn5Q+{1cX1)%SpcU$+CBHQe7v>pvAr}vcd1AZKK)M46)%1_Z`_~uA&>)akidv&gC zVcTuqd{_j>W{pGTb8s6Y+M4TT3JaUOBJb;4@pKEo66#oTHevdW%v2Y{N1~OAyO?FI znnN)jh7Tcf&6!E`Dv9A0hVH@~N^wS97LQBo2<3Fk_GCs5hCMm|)y-k>s|Am}g` z845}y=%g4rQ`D0HV%D;fQYotRGZ@Fp9#i1dg(K6IW4Mn*)Zjs*Z}^(@hC|v z=!>it$N~ZbLedk3Zsp6;_lf@>z+=k7XZ$n;=Gtp9!bZD+&Q43T=>}`Euj)Z2q!9yW zuSa+!-%iyXBs00=7kT1~0bt}3PSPSigyNK+x`_goB^cag@MVj-S*I#S)?Vo z&L?eVCP6wlgo2jdgz=RW|5lbB*I1EteK0}SG}iVKN57pnKaFH}`}XVnfunkjKG*bwA8`F#5kiRQRjuGpkM;b{vTXbdH0gm+XyW~bGE}vi8 zz+|y3HOFP?kNpJ7HWunlBP%NOPAWrmbI}%h{3MV>)#oP3ELb!3Igl4+-%DA`;sFF5lI+;h{XxB?e$tt&&Y?gb2SB%5Eo^&?BJD za@xb8UT$Tl9$J&gvCAaA6Z_*x`eNImtx#8~-dyzfr^M%5^VQRzevfo23V21uC5bXj zN%FsHUj+}*5Mt9}qVz{+A6o_-$avQk*Yx%ASc&)r-sl}T?!CL&9d*femOxaRW~tk$ zL$H{^bof|>SfPHYv80)SF2$gw1A1Hfw6;Hh)^7h;GE-FXht6$aBR~ZF zEN8{5@Bv*y8CT1-Qf(!PY7fhl3iyJ{1DIts1F>4XGd5mInwB!RG|f)(7h(rg3pqA` z3VWaB-Yq%6Yp1b`7+7hyt3&PfrFp22-${QiMWpuemvMHBV^V2~!dmk)beyvbSI;2(nZ@{)MkH{aP-Y#+1~3FPZbT18n8`zK0(SoM>bd z5&o1oIokmxgkdMM$jsNam)ckL@oH-JOGr9PNT|mCk4jh|vr-M$G~Y`)&>!dHmrFUV z6_;+{!QB?KhDP|chm{@m<%$}3DTIkF@j7)9Yt$=VqiIDODExDD-O3}VLaP_q zh88LkeTOP6`?u4$1z=vPnZG;KlM&AI^!y$8R>TjM$ND$({Zmv%EB~*^95b|Gqz^-t zsBUonrZ17nCOszeQ%%GV2??ZnAE#!cM{m1@s7LuHy}iB?k5d%OD7es^tQ~;lmO?rW zK8+Dj;C4|2Kqg56n{ZYQ4e`%%43hHxvAtZfoAy&hXS#osE%;A)=wVuD1P!B~yQ56^ ztFBAW=9U%c*+n{0rEgNf85P>acnO{}Jr$DoIxW%v3Hbfk&thw|U%hZ>tCm!_bn^T- zI%0<0#r?X8Qyf1)fR6g=;BiQ&FqgEl00E%BZpoMp9`>uI1TQkvep89d3)(a&1ral} z2Vv4iX(@mf^0IPycmQdOE6X0~;o^PK9ol&X)sz^ zT296~TP_SmFVea2vDlH&efxN3U1;4>QDNJJw)Wqu1Q6&?-G$o&%DEb8AqH%Y2XTnk zmWbyxMw!+nwj8(q0_tA7WNz(5q&z7_K>|SOj~hmJ#_xuk&bT9S<6CR#4 zR!H**SA^XQ@k!#*c{MLOY3kkZD!e?H#2O@*M_skqAcjuK&Eqv;IcQ59)@x{iz5G$W zq(K%<&#YLvc2+so_xD$#Tcf6COYSNf2Vt}^BE>JtqL}+%sy+a}T?3i-FBd$>5kCfp zYS<5KQ(^>|{G4nkh44bp_r3TFBaLgP)AqP;f6o=99L^|*IIdVr69n{>QTznK25gV|VsKWJN4P^WbrvQcg z*={Wp)(oAp8iJ#aCEoF++OsiIT!F8&MiXL*{GaYpHpY$hO<#TKu5acfO9wrN>{s;# z%xdKxlop4~58B`BHK?UgSX5g)3YJ1&cv8mGzIziI(snlnkVXrT>Dc}hHY<5dOK)$3 zNb$Mm3BQ(e_>tOqehdJgR;2ZHf!3=BnM#Eb3W6fZ%>rvGEbneVC$pfSjPQ4?*?IA4 zSS2t&i91@itq{UY@z2ry(8MVi1q}oCg^S1QHq7f0IJWMQsC?j;0dpr)JE{J=S&R4x zE2NTJU6v?Wg3GP)kw!cQLT6aH?=!;oU{G3Cj9RuWcKg_1q_s&-FnzjR5a=uhFTp7c zf0el#%AbvcgyjEkwoUfNN)yl84o2zTMan14B=@mt_RU62o9S&y(?T?xtICE4RLmJ- zDkOaE>~7bG*lQ?CJ4jOL&}f?VI7A;%c>4e zBOir%uYe=(Xq_NnXjE=JL0SCeD|bIT5pg?{FcwBUvs1Z`6_~1uA_Xi6K|Db1e4+LF zH#M~?E+Mgw`yJ&4`2mydE!pN~W1x4tDDuE7E9I zzwzCPXdS-&2OxOuJBGOv;ZdBH?3<_SyHbsSSmMhS{)Q+|&2oq3pv*69eHYD$y=TL- zF3XPKAE7h57tTBqlBQA0hGlp5fE!O<{|R-27FjZzrPJpZ!d|1rXv&Nwt=B^u zp3-{GE<`>b)ily3#E9?WgjwBP+3j?R#8E=c;%n}rHgK8Ad2b@RbcH`g`>XzTsjG(i zi4q^_y2}gx5y6GQOHCP`xHfuksaN^6SkRKzcVlD3`$gcJ8`DtFpw=e@5^j$`iy}x8 zWWr!Hb9J+0)*?Bkw82#r*tRO?2jO-ZA55!AS}$HqslQp+c4iIvPA}-?#)KzqM9PXE z;I?DF+lO`qO_p+{6sb}{WkD7*B>G<|jm$0mK;6ck>f70)vF9{pwX(#+zZPgu#5RQz z=poL8z{9E|DnggHUqVMUgr@C=v0xlt5biago`Oci3d0UL(Abc`QuBGs`{+oCmL#lh z(d6uhM@jH!$`^0OG5tCt+1yR9YQ^OjEeyyzKw$`vk{>`UG8po5ao(pxS4CDZNU%O~ zLL^h%5E8HwrZE_aV6&Aq`%sXJ3eU^IN9k(n+C+{gs7=b+H2QTP_By8?V;*y;xr(eJ zITD&4*d?V)K3p}RHVjS-ej^wQk6mh(HbALoRvkrKlyVU2-z0TqzI~IrVO|Rv)-G`z zokL;itBxK%&QKWa&u&{{nb%X$!)@OboCgh4&k4__gbTJ>e#_%8$ftL$u3ojn2BM+6 z?{LdnfL}&~E#+2a%+Rc0c9`8kb5|p=b(XqzU^Kx#52z!%kdy~LiunI)>#U;U3c79G zxCAE<2pYNx!8OphOQXR_=d(^H~ zYt1=7F6=@b)_ilQyxKQ`YgS$WRr0m20u;!4peCVVav@g8TO2PsMvzTIqpr_sshx44 zYvNQg4mD*m6+qp=@(8>R>@WPXVsSVG5Pg$7A%-CQtzFXyR8(Z?AP*bl5f~C4W1iJy zENZZs{3V=o?furI(W{J;KS3_a^`al~Ph?`4o3?@iHa`G6jJwtyA-cM;v8JV*%+>tY za5*7nc1TFpfBqgcG%*sAfGm$3rDm9_LxVq%j)UvR!36&1wW_2=LCZ17+>AQ1Yp;TV z=>V^KbzNiVLjs5KcXa9<{2ut_=Y*qFTwGOfS1<-X{uqq=v1%Q@QI)O$SBR5H7k*C99bLg z#@olKuI}7hkAu-}e(H9kN|Y!n6dR=bnAe*4vU3%IG-G{AB8+RNaa)l);P%B)JX>+1M?&LND6C7#;QO5n*Cl~z~crd#~(CdJb&%@ z3r4M)bsp{{XMcYg=o7#W?jH!S}3`3w5k&YaPn z>MdhRs!r*}v1yBcX+$PA=o|!bG(6~(3Y^-;8Y0o<`N=Ypbl zk)jJpnV!6FmWrJlE%&P>x{-`mu0<6bFb8ZleBmBYk6flRtyw(EYg(b#rL7m!*(4eA zg*l+_@KGZ9`{JU==T;FronckPXSDsf(!yWuqAE2&D`bQ%-qfi#w4msFlqY?|%J2^8 zjB7j>rsb};Ak&@e`V|k5k@Acp5$3$wXgVe4z3lJpi?UoMhuccINCp@oPRlRoId)oXp8jbS&3JvY#T>1T`E7vLwO?7?zESe_gX5PFA14d&Uo=N8S+^W2P;Z8_j zoTO&P@6|aZtqhVl?>dX#t0Urje}W^=8e~5bu5|geUQk=x3X!g94iAxIAeA^8X^{S; z`a;q9m;%?o*RBTCxpW$t3FS(RxgVcwg& zuwA7R{gl8ciV~@f2lPC@6<#Y>`;|!Te3Ul^U6?ucmJE(}1?jHCdNSlMoCQTF5XihV z+M5(tXELH0i+@eKMA{}I=3`_EjPv*G)Xy$gk0|>N-**Y5%LsoST{mp(#{m-H9^z?` z9qfiAj1VSCf5}&V^RRE8wUya#6bbAV_x|Ab@5 zge52}RdQMka_^7WMrEe%EOcBNmC=_2{M+o=ZTDA~RFg5|HNE_|;PQgeWAK}zkqKDNA0WyE7(k%pt33R>O;T=kF=OqF zavv#ls5^Oi;nQha+Ls?>O3h_sJ%>9i6E{*lr`~F121|u~?L*>{eo5bqa8_jiR4JoS z$V~bze6vgJgbtzoQWwGhv|v`J|8tTj8KH|U2>bpngi5RtHN|i4eaZ@+jc8Fs>?|V2 z17b_C`z@v=nT5**&R>tWCoL?{Hwr;|= zeKx`cZubOl2js~YKb(68j~42VtsSLlH;=+yTRUp&3el$D@~L_;?qM4B*CER+O2vk! z7SM}%!ynXC%|~w%kEC2bD`@a0@NZ2$$GeqZ+V(|=sA{BBYPrGmR)N^4MzgV_t70TAclCG}vVHMfZh;i|7mDwx9ts+bup0Hg+c!hTBqnI3+?M^p^D7DfI85w_tm; ztR2m9z7g4pT-$188LSu?&+8dG-0yBw_?^${Rw`o!9(vcT30=TJczc7qCmHC6l=Zj^ zDJ*^pUTRH003%-t3M9Up;YrkDIW9aSR6Hl;7u~|>_ZlEtcz@fLHEQRngMb4cB#lc4 z(*}JtpGci?c~>r{ub{csL+P@CE15ElK1dyyP@CPP7xert7!k}+wWh9ei{8aTjf$uQ zC!@Bzv@Y;%yOx#F3H>o`r9xB`l50Lpxw4v0l+Cm|Gt?rT;K4&1Eyos@v4ofHwtMLs zQi3v6>QjB6xmPd>AL(j-Yg)fa`iLR^Vstv^NI?}FMV0F8kMhOx zj_+$N11aMZ7>L9G>&SB22AHH(laaf#Yo3I(%MAQ)u zW`DUpAVvAaKla=KqO>5Cb}r7M?qNTLGelOshz}Fh#6Oa$BN%M{F<4B`WwLTOQ`lG6 zC_4OBWa@#TO%3$rk5>Gkr#|&@7BlM$!%uy(;ss4DgCbNJd#skf

|vp%>~arnsmw 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 bH?jKcN literal 0 HcmV?d00001 diff --git a/common/images/你的发言仿佛没有脑子.jpg b/common/images/你的发言仿佛没有脑子.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3d19f13505c3e6fa4450e541ce5f0ad01610c578 GIT binary patch literal 67015 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 literal 0 HcmV?d00001 diff --git a/common/images/原始黄其振.jpg b/common/images/原始黄其振.jpg new file mode 100644 index 0000000000000000000000000000000000000000..36ab3c6da2c2c32f3a6c491dfb739b327bee16ec GIT binary patch literal 7676 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 I>3rsY0HBxnKmY&$ literal 0 HcmV?d00001 diff --git a/common/images/我小点声哭.jpg b/common/images/我小点声哭.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6f047f1c5e5970bdcf61846f7bfba9a34578fab1 GIT binary patch literal 36065 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 literal 0 HcmV?d00001 diff --git a/common/images/爱莉1.jpg b/common/images/爱莉1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..883f69f04cb4b4d55940550f90b9e21f0bb0606d GIT binary patch literal 29019 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 literal 0 HcmV?d00001 diff --git a/common/images/爱莉2.jpg b/common/images/爱莉2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0992ec1d5a83b3e55241e07e91f03e6a5d31e068 GIT binary patch literal 15881 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 R+tB6Yq+G#8vlP59{XccZ1~6jdUv@jdVyiO5gGK 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 literal 0 HcmV?d00001 diff --git a/common/images/西装黄其振.jpg b/common/images/西装黄其振.jpg new file mode 100644 index 0000000000000000000000000000000000000000..24eb334596eeb7c88b0c471730d951e22be5ba0c GIT binary patch literal 55094 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 literal 0 HcmV?d00001 diff --git a/common/images/证件照黄其振.jpg b/common/images/证件照黄其振.jpg new file mode 100644 index 0000000000000000000000000000000000000000..832d0afd00900e58597592a9d3b86f80448ffa85 GIT binary patch literal 28361 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 literal 0 HcmV?d00001 diff --git a/common/images/赵文康竖中指.jpg b/common/images/赵文康竖中指.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ebc6f2c6f7540cc62e900eb73621f983cb822d2f GIT binary patch literal 93399 zcmb5V1yoy2_cxl-Qbme872HB`ho?{^XmKYk9-QD7o|XbFT7skmD+CBmaT4rlDH4La zQ!GG`qQ&9z{J-_C_q%s}cinaOS?A0zv-iy2XEN)YJ$v@Kp1l4Ac&w=gQUlz&1pwT- zIRMv7B!7WaRKTwd^wdDws{g|vc>%Z~lE(mmyN55-KwbH%nYqQ&f9w83Z|!`%{)7Jy zQ79#@gRtTBrYo1OLUg{|m?ci=jpa zDmOA;Z!oXZ|AuY87xZ5|dxMSK-TeO5^)LNvF`0vhvEfZ=c5|`< zd;kUjb$~M9DL@sV2QUJt-Jk#f1mFvBzCo{UkPpBM;0AaL2)g1pqw6{I`x*4gjEf1ORmRdcB3d z{h!Y6++0Z<9RYxSGyp(u4gk;$-n6m&kD~v!{qKMA|8lR=H*HvNZ1uc3oNjD)xUn1r z@Br8WfHz1K@B$zLko-@-|IhMz=H`wc-n)1I-ra}y@85s)@Zlp0#>W)o

al^i+%- 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%0DLx4dupF; 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 literal 0 HcmV?d00001 diff --git a/components/aa/aa.vue b/components/aa/aa.vue new file mode 100644 index 0000000..eb87fef --- /dev/null +++ b/components/aa/aa.vue @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..c3ff205 --- /dev/null +++ b/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + +

+ + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..cb25a2f --- /dev/null +++ b/main.js @@ -0,0 +1,25 @@ + +// #ifndef VUE3 +import Vue from 'vue' +import App from './App' + +Vue.config.productionTip = false + +App.mpType = 'app' + +const app = new Vue({ + ...App +}) +app.$mount() +// #endif + +// #ifdef VUE3 +import { createSSRApp } from 'vue' +import App from './App.vue' +export function createApp() { + const app = createSSRApp(App) + return { + app + } +} +// #endif \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..bacaeb4 --- /dev/null +++ b/manifest.json @@ -0,0 +1,60 @@ +{ + "name" : "studyPlan", + "appid" : "", + "description" : "", + "versionName" : "1.0.0", + "versionCode" : "100", + "transformPx" : false, + "app-plus" : { + /* 5+App特有相关 */ + "usingComponents" : true, + "nvueCompiler" : "uni-app", + "nvueStyleCompiler" : "uni-app", + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + "modules" : {}, + /* 模块配置 */ + "distribute" : { + /* 应用发布信息 */ + "android" : { + /* android打包配置 */ + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "ios" : {}, + /* ios打包配置 */ + "sdkConfigs" : {} + } + }, + /* SDK配置 */ + "quickapp" : {}, + /* 快应用特有相关 */ + "mp-weixin" : { + /* 小程序特有相关 */ + "appid" : "", + "setting" : { + "urlCheck" : false + }, + "usingComponents" : true + }, + "vueVersion" : "3" +} diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..27973fb --- /dev/null +++ b/pages.json @@ -0,0 +1,17 @@ +{ + "pages": [{ + "path": "pages/index/index", + "style": { + "navigationBarTitleText": "uni-app" + } + }], + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "uni-app", + "navigationBarBackgroundColor": "#F8F8F8", + "backgroundColor": "#F8F8F8", + "app-plus": { + "background": "#efeff4" + } + } +} diff --git a/pages/index/index.vue b/pages/index/index.vue new file mode 100644 index 0000000..b44738a --- /dev/null +++ b/pages/index/index.vue @@ -0,0 +1,112 @@ + + + + + \ No newline at end of file diff --git a/pages/login/login.vue b/pages/login/login.vue new file mode 100644 index 0000000..f93ca81 --- /dev/null +++ b/pages/login/login.vue @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/static/c1.png b/static/c1.png new file mode 100644 index 0000000000000000000000000000000000000000..9d38fdc45f54393919608143278902961ebfc03e GIT binary patch literal 401 zcmeAS@N?(olHy`uVBq!ia0vp^DImv+@EMfolJl@2-tdeIgiE72V3$+1a&#<;nGqB*6-wd0Dfno2^$& z7L}LYx}4kkKI1~4j2xSM#i^{e>mxFDC0DcwoaERsZFdmo&xZb=|e; zVChPF@z}uo`_jyFigEMR=cKgdY*81V{;5gJlXF9MvNaZ^cipGtGKCwGwYFdLih#FiI|b%1`}h zcD?9wzL;(MG`RGl!=KdO=X$Ia3G&T>{3@pZ$E>nWT~vAlEaktaqI1klarbacw7TzPB-Tm@A?1# z=DKt1Tm@&jBni*W72Dq8$U1XQ@j1)qcYd?AM-~6vdS%zgB|W!|l9z8;VdkK15fZWZ z0_Xa#{=&Tl?+&}Myixw!c0&2Cz{(%uYaLfyIpx20a+b;i&8Hu}PrN-Tsf8gx{xaWd zSEda)?3G(j%z6CKKWpOGAAJoS5gg_&aw+l?Pq*dmh)8I56YfnYkc%|gRM+fjvg@w| z$E(g+E=n8A7O8TmM)@~hDG@eQ_vn5n5wpR0%`A=`87W~$m7>*=T~gqVW%D$JmT%Wy00-NUV`g= zPWq+lU_K79dVw=Ll(hEL%sa^y|HiF3Bqng#c7b&Xt+%gdOo& V%D;5ZBtB5oc)I$ztaD0e0stIlwo?EA literal 0 HcmV?d00001 diff --git a/static/c3.png b/static/c3.png new file mode 100644 index 0000000000000000000000000000000000000000..216202ad01c5d093a15c247cf791bf66759cf54d GIT binary patch literal 511 zcmeAS@N?(olHy`uVBq!ia0vp^DImqEwn3#C`6axcex~Gd{NX4zUH%{jrQQ%<>_`I#L<;VZ} zZHv8>O^d80dDUJWN}qZ5sw(5+2E$_#$vr=hznV9v_(!hA^s)ehHzYuO_$GPFaj>L^Z^8*-5pGM3JjCnSB#oUXR4yIck*z;L5euG4hrQnMaF=Mr^If6ezqfPO{rmaH zG`Recv6gZBZ^h$ro*MqgZ`L;0*JWSQ?4MdEEc#Ycl^2Ku*&||7ybYSKxgR(e zUi8LbW#8LW_O;o`+{cdv9h)e%;+1X1dv+zh{}-wmlY4-{_IaWH_ctMZlX+XXL2>Bm L>gTe~DWM4f<{`=m literal 0 HcmV?d00001 diff --git a/static/c4.png b/static/c4.png new file mode 100644 index 0000000000000000000000000000000000000000..fb8b4770c323cc87544a502c4efcd9792ec6047a GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^DIm!v{Zmph6H*@EOQ`c;Jj35m?s8tsB!ig_bOsad3NWyNKsO#%u4s6f}!WF<$1wue~HTU+T}QZ;Gq4 z+^p*LR=oRR<2>VYrDayznw7JEgn9(s4mmKdKH{5e^24HIn&xXKq`oqWXf4s;nPY6> zl5RSUO)+g!*Qq{!;a&O8LAO2%J{IadS>Y&oFLd#-`B8Zi;r0eCLdRUCfQpstnaz}|9;&C$edE%qT=zMqcbI`S>(i_Uwsp-Jh?$Zac<}T=h6;^ V(bfHGPg+0`|eiw2lA( literal 0 HcmV?d00001 diff --git a/static/c5.png b/static/c5.png new file mode 100644 index 0000000000000000000000000000000000000000..310bfb123ba811240a23883c589557cced22af97 GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^DImMU#{OfDLKp{`iu-m;URIy-X0%w>4GPR z_aE3Db+En7Vpp-?y{8>c_3j;K1E(wImUzhRpIo-4)yng0f9$<4bN?NcJ+$)R>Cmd5 zPnT-Q*3a3qRzbM)VHC^C!+&Q!2$x98T^XQ1{a2U4m97Z?l}kQ1avTGN#j9nTb Uw;LB#rGg^I)78&qol`;+04O}Qp#T5? literal 0 HcmV?d00001 diff --git a/static/c6.png b/static/c6.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c45d8814b2657a1c603b1a44c8207da134cb40 GIT binary patch literal 545 zcmeAS@N?(olHy`uVBq!ia0vp^DImqbxJT^6j8j=}L4 z`U~zp;jZGGq_3%#*Y{@jiL-*|KAoCX9M=6tMV3p`Xx_9LpK6YHtIv61@a%(@?tX{a zixmsYle>5975wq9?fBo`FZ<0Z_ST1U_$og>`Bwh@oq)-Q*IY8`n6H2IUEezHG>gnR z4m?JSR+TGA8lKK}%#OUITJo;LRm!DE@lpDwn1HB=DfxjiElxjmC-aCcb$n6qV?vwH z70D$Ac9y-Kb4tS6k2yc|sk#5)HGj$%vfgZBIOdhE(svqtDm`(*VzL-mu^Hy19AKPf2Xw<}^wvyk3;W5tc1>eFM@ s<<*_%cP|y0-yh@^lK=|O<{9 literal 0 HcmV?d00001 diff --git a/static/c7.png b/static/c7.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e73908c282c8ce053a037a9b0d0ff2bcdb5f28 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^DIm6ZD L`njxgN@xNA8ryiD literal 0 HcmV?d00001 diff --git a/static/c8.png b/static/c8.png new file mode 100644 index 0000000000000000000000000000000000000000..c32633c0b399d119fe940b19fb48ee0efd986ca1 GIT binary patch literal 587 zcmeAS@N?(olHy`uVBq!ia0vp^DImtDWKw)GSgG z<{?!7vyg^n3M^01LJZ}7srr_TW_zQ?t87k(~wwf+9)vT z%KQIoiZ6ORmsqxitIvdcU#@t4EXP6v-^(UI#Jk~jfg$H7CzX--mMU=ckjl- zO_N=n{=9#BNIpzt0(^6iu(G%&IbVv*qm>1hi!XSEd0U$OB}=(W(sDW)~2<6brG`eb|Eywk@UH2a9_S~2ou;@L{mE;Re4S!9(w0H>~IdYlxQPbf~&0B26{}evs0SCD6 b<@sM36JAtSn%f$@0;LB}S3j3^P6r-DwW=|@#WR(W@( zZdqJkeNu(zZcxH)-rk0j)>6#pwJ%5 z({0I4*ENL;Hg>s)Wo2yHMQWq+YVK10K1LEVCnUj62Kls6uex~DF( zmCs;?h^>{Qb=Fc@o?qGaU(P$0_Dg@wVQpV1_%AL~YBQ@%pW7wIWu-GZ7%RRBC{J)$ zYTez|@_3zqf=Wi}%JdkW31MA*>f4V5YcgIo@dcs(Z~1ke=Y_pcHP{M@c~4hAmvv4F FO#nHb*8Bhf literal 0 HcmV?d00001 diff --git a/static/customicons.css b/static/customicons.css new file mode 100644 index 0000000..14ed5fa --- /dev/null +++ b/static/customicons.css @@ -0,0 +1,20 @@ +@font-face { + font-family: "customicons"; /* Project id 2878519 */ + src:url('/static/customicons.ttf') format('truetype'); +} + +.customicons { + font-family: "customicons" !important; +} + +.youxi:before { + content: "\e60e"; +} + +.wenjian:before { + content: "\e60f"; +} + +.zhuanfa:before { + content: "\e610"; +} diff --git a/static/customicons.ttf b/static/customicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a3c8ab9f22d18d5d605503eda314e5d2a31fdfc0 GIT binary patch literal 2416 zcmd^A%WoS+82@H>?IgD2#K~q|hdkDH>bQB>&f0O>=25F@5|GlQX`8fENObGiPEx<* zIHl>yDoB8U!lAtvAt9k$df{KC1gT1(TA*@aKU;Z8A_c6Yj%<0Ab$%Pq=pKvad z-A@0oKRQn&-bGc{Qu=Do+{0<;!iM5&AR2xX-va&;wQns~zS&B(8f^c>xHVfy>O!2V zuzd$(TTZ`OWbJet@*^0lc|DhE{bb?+k@a&TAyX`DmiI>vrzUh9wW#VtLONPQPcgH{GfcG%HCo!>rVIv8K7)wAe(G9W~W6s*} z5MlL3;c^>AXo`e0v-20pnbpgA>V(Zx`M)vCu4i=kuX|?D<5C8Ok=0}+EcYWmqwucq z9k>tcJ$p@N7UdY3K%*@M)z9zF77#b3%z!fxHdq^cAvWrY zjm5{}(W73UQ-HKbh-#b|iyQiGC8|vcP=ZB(`A1^`pS7F$eO6f+XC1Pl#U~jwSS-Z6 zoYdm6fFb2Ts4UG+2aoy3eJ4h)WHMJqPWZ+ggv;Y`8Ne>v?K0a?dV7a@d%xnHstS*S!80>UHNq5P zcT^Cf-6E!7v@~-j7+e|8elTC7!G#HLb7P0n=yWzJ9gWT2iG@K%Yp-64j#evA{TmZG zWJPwUm;la=mS?v1K>SNwq9YWdlSr<&p0z19Zlu(!^)Mr=JSzZ7)T_mjuz=s|>kl!c zB@l~)Q)H`{IH*LH!r`TeI(%*{!Lr8Sps0GoVXsi(ZM7mhk8cX!KdH!FU9!mAbI=zO zP#q6W0#>gAiixoIV3!-P``)ng_~q*Du3#5l{`J@HiH~s`$rPj0xaF>5@3G|gDTd`t z2}&`saAq1brJKoCUtp5O z;^K01ht1M-_H0vw)#X+iuR9#q9aYKR<`5;DCw%I1?(O?_+2N4wrR4G}CnNsOmL?^| z?r41nJAO^`vqW__v>3uGEQc3DyKNq9yhk|YJmP6uSZGw-E=vQP_BpOMS9fi$j;5~R zmD%KpS-b3(?Z^BHZ8{R|>1<(-tEK86+@Y}Cr!9vT!UsEbw=A*jY1`o&ywm0}zN$9* z)x4>Q+QHOsI)0nBn^>R*ddb8hc%O+S-~kg`@aNM^Yz04QVjB(OyQ}-O!($Prh)GSD zCqQqSm{BWzW@3Sy^o5B<@ZXwP0{+Rw7E);6#8&VJCbrQEYc{c+0xUUQO6ld)s(Ni( zT~8MB=|aAI*q={jwz7KZaCq3Sq)MCXg}gcviX2jNseGz*=w|aqMk|-oYPwX&sk88x z%4Q2{u~gVdCCj0;a=Cai9OmS z&fu!b!m{+7^jYf_XqRXcdfcZoHN+IGM+T-)9_ZH9MG(} zz7$rH1y-?vT($u}Noa>?&9ExsItb%AjOS24WW<@{KiqoZ|NR#gi3v<(60?v^AJ&GW i+l8&0>&^ObYFtuIC+Gpxs*A((`E@KK=o#Msw}} literal 0 HcmV?d00001 diff --git a/static/logo.png b/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b5771e209bb677e2ebd5ff766ad5ee11790f305a GIT binary patch literal 4023 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 literal 0 HcmV?d00001 diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..c24ca6b --- /dev/null +++ b/uni.scss @@ -0,0 +1 @@ +@import '@/uni_modules/uni-scss/variables.scss'; \ No newline at end of file diff --git a/uni_modules/uni-badge/changelog.md b/uni_modules/uni-badge/changelog.md new file mode 100644 index 0000000..e352c60 --- /dev/null +++ b/uni_modules/uni-badge/changelog.md @@ -0,0 +1,33 @@ +## 1.2.2(2023-01-28) +- 修复 运行/打包 控制台警告问题 +## 1.2.1(2022-09-05) +- 修复 当 text 超过 max-num 时,badge 的宽度计算是根据 text 的长度计算,更改为 css 计算实际展示宽度,详见:[https://ask.dcloud.net.cn/question/150473](https://ask.dcloud.net.cn/question/150473) +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-badge](https://uniapp.dcloud.io/component/uniui/uni-badge) +## 1.1.7(2021-11-08) +- 优化 升级ui +- 修改 size 属性默认值调整为 small +- 修改 type 属性,默认值调整为 error,info 替换 default +## 1.1.6(2021-09-22) +- 修复 在字节小程序上样式不生效的 bug +## 1.1.5(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.4(2021-07-29) +- 修复 去掉 nvue 不支持css 的 align-self 属性,nvue 下不暂支持 absolute 属性 +## 1.1.3(2021-06-24) +- 优化 示例项目 +## 1.1.1(2021-05-12) +- 新增 组件示例地址 +## 1.1.0(2021-05-12) +- 新增 uni-badge 的 absolute 属性,支持定位 +- 新增 uni-badge 的 offset 属性,支持定位偏移 +- 新增 uni-badge 的 is-dot 属性,支持仅显示有一个小点 +- 新增 uni-badge 的 max-num 属性,支持自定义封顶的数字值,超过 99 显示99+ +- 优化 uni-badge 属性 custom-style, 支持以对象形式自定义样式 +## 1.0.7(2021-05-07) +- 修复 uni-badge 在 App 端,数字小于10时不是圆形的bug +- 修复 uni-badge 在父元素不是 flex 布局时,宽度缩小的bug +- 新增 uni-badge 属性 custom-style, 支持自定义样式 +## 1.0.6(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-badge/components/uni-badge/uni-badge.vue b/uni_modules/uni-badge/components/uni-badge/uni-badge.vue new file mode 100644 index 0000000..956354b --- /dev/null +++ b/uni_modules/uni-badge/components/uni-badge/uni-badge.vue @@ -0,0 +1,268 @@ + + + + + diff --git a/uni_modules/uni-badge/package.json b/uni_modules/uni-badge/package.json new file mode 100644 index 0000000..b0bac93 --- /dev/null +++ b/uni_modules/uni-badge/package.json @@ -0,0 +1,85 @@ +{ + "id": "uni-badge", + "displayName": "uni-badge 数字角标", + "version": "1.2.2", + "description": "数字角标(徽章)组件,在元素周围展示消息提醒,一般用于列表、九宫格、按钮等地方。", + "keywords": [ + "", + "badge", + "uni-ui", + "uniui", + "数字角标", + "徽章" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-badge/readme.md b/uni_modules/uni-badge/readme.md new file mode 100644 index 0000000..bdf175d --- /dev/null +++ b/uni_modules/uni-badge/readme.md @@ -0,0 +1,10 @@ +## Badge 数字角标 +> **组件名:uni-badge** +> 代码块: `uBadge` + +数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-badge) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-breadcrumb/changelog.md b/uni_modules/uni-breadcrumb/changelog.md new file mode 100644 index 0000000..209e5c5 --- /dev/null +++ b/uni_modules/uni-breadcrumb/changelog.md @@ -0,0 +1,6 @@ +## 0.1.2(2022-06-08) +- 修复 微信小程序 separator 不显示的Bug +## 0.1.1(2022-06-02) +- 新增 支持 uni.scss 修改颜色 +## 0.1.0(2022-04-21) +- 初始化 diff --git a/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue b/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue new file mode 100644 index 0000000..420aaf5 --- /dev/null +++ b/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue @@ -0,0 +1,126 @@ + + + diff --git a/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue b/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue new file mode 100644 index 0000000..81fb63e --- /dev/null +++ b/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue @@ -0,0 +1,46 @@ + + + diff --git a/uni_modules/uni-breadcrumb/package.json b/uni_modules/uni-breadcrumb/package.json new file mode 100644 index 0000000..0a04e50 --- /dev/null +++ b/uni_modules/uni-breadcrumb/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-breadcrumb", + "displayName": "uni-breadcrumb 面包屑", + "version": "0.1.2", + "description": "Breadcrumb 面包屑", + "keywords": [ + "uni-breadcrumb", + "breadcrumb", + "uni-ui", + "面包屑导航", + "面包屑" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} diff --git a/uni_modules/uni-breadcrumb/readme.md b/uni_modules/uni-breadcrumb/readme.md new file mode 100644 index 0000000..6976b8d --- /dev/null +++ b/uni_modules/uni-breadcrumb/readme.md @@ -0,0 +1,66 @@ + +## breadcrumb 面包屑导航 +> **组件名:uni-breadcrumb** +> 代码块: `ubreadcrumb` + +显示当前页面的路径,快速返回之前的任意页面。 + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + +在 ``template`` 中使用组件 + +```html + + {{route.name}} + +``` + +```js +export default { + name: "uni-stat-breadcrumb", + data() { + return { + routes: [{ + to: '/A', + name: 'A页面' + }, { + to: '/B', + name: 'B页面' + }, { + to: '/C', + name: 'C页面' + }] + }; + } + } +``` + + +## API + +### Breadcrumb Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|separator |String |斜杠'/' |分隔符 | +|separatorClass |String | |图标分隔符 class | + +### Breadcrumb Item Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|to |String | |路由跳转页面路径 | +|replace|Boolean | |在使用 to 进行路由跳转时,启用 replace 将不会向 history 添加新记录(仅 h5 支持) | + + + + +## 组件示例 + +点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/breadcrumb/breadcrumb](https://hellouniapp.dcloud.net.cn/pages/extUI/breadcrumb/breadcrumb) \ No newline at end of file diff --git a/uni_modules/uni-calendar/changelog.md b/uni_modules/uni-calendar/changelog.md new file mode 100644 index 0000000..a728bb8 --- /dev/null +++ b/uni_modules/uni-calendar/changelog.md @@ -0,0 +1,28 @@ +## 1.4.11(2024-01-10) +- 修复 回到今天时,月份显示不一致问题 +## 1.4.10(2023-04-10) +- 修复 某些情况 monthSwitch 未触发的Bug +## 1.4.9(2023-02-02) +- 修复 某些情况切换月份错误的Bug +## 1.4.8(2023-01-30) +- 修复 某些情况切换月份错误的Bug [详情](https://ask.dcloud.net.cn/question/161964) +## 1.4.7(2022-09-16) +- 优化 支持使用 uni-scss 控制主题色 +## 1.4.6(2022-09-08) +- 修复 表头年月切换,导致改变当前日期为选择月1号,且未触发change事件的Bug +## 1.4.5(2022-02-25) +- 修复 条件编译 nvue 不支持的 css 样式的Bug +## 1.4.4(2022-02-25) +- 修复 条件编译 nvue 不支持的 css 样式的Bug +## 1.4.3(2021-09-22) +- 修复 startDate、 endDate 属性失效的Bug +## 1.4.2(2021-08-24) +- 新增 支持国际化 +## 1.4.1(2021-08-05) +- 修复 弹出层被 tabbar 遮盖的Bug +## 1.4.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.3.16(2021-05-12) +- 新增 组件示例地址 +## 1.3.15(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-calendar/components/uni-calendar/calendar.js b/uni_modules/uni-calendar/components/uni-calendar/calendar.js new file mode 100644 index 0000000..b8d7d6f --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/calendar.js @@ -0,0 +1,546 @@ +/** +* @1900-2100区间内的公历、农历互转 +* @charset UTF-8 +* @github https://github.com/jjonline/calendar.js +* @Author Jea杨(JJonline@JJonline.Cn) +* @Time 2014-7-21 +* @Time 2016-8-13 Fixed 2033hex、Attribution Annals +* @Time 2016-9-25 Fixed lunar LeapMonth Param Bug +* @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year +* @Version 1.0.3 +* @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0] +* @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0] +*/ +/* eslint-disable */ +var calendar = { + + /** + * 农历1900-2100的润大小信息表 + * @Array Of Property + * @return Hex + */ + lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, // 1900-1909 + 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919 + 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929 + 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939 + 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949 + 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959 + 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969 + 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979 + 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989 + 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999 + 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009 + 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019 + 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029 + 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039 + 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049 + /** Add By JJonline@JJonline.Cn**/ + 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059 + 0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069 + 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079 + 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089 + 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099 + 0x0d520], // 2100 + + /** + * 公历每个月份的天数普通表 + * @Array Of Property + * @return Number + */ + solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + + /** + * 天干地支之天干速查表 + * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] + * @return Cn string + */ + Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'], + + /** + * 天干地支之地支速查表 + * @Array Of Property + * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] + * @return Cn string + */ + Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', '\u620c', '\u4ea5'], + + /** + * 天干地支之地支速查表<=>生肖 + * @Array Of Property + * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] + * @return Cn string + */ + Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', '\u72d7', '\u732a'], + + /** + * 24节气速查表 + * @Array Of Property + * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] + * @return Cn string + */ + solarTerm: ['\u5c0f\u5bd2', '\u5927\u5bd2', '\u7acb\u6625', '\u96e8\u6c34', '\u60ca\u86f0', '\u6625\u5206', '\u6e05\u660e', '\u8c37\u96e8', '\u7acb\u590f', '\u5c0f\u6ee1', '\u8292\u79cd', '\u590f\u81f3', '\u5c0f\u6691', '\u5927\u6691', '\u7acb\u79cb', '\u5904\u6691', '\u767d\u9732', '\u79cb\u5206', '\u5bd2\u9732', '\u971c\u964d', '\u7acb\u51ac', '\u5c0f\u96ea', '\u5927\u96ea', '\u51ac\u81f3'], + + /** + * 1900-2100各年的24节气日期速查表 + * @Array Of Property + * @return 0x string For splice + */ + sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa', + '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2', + '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35', + '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'], + + /** + * 数字转中文速查表 + * @Array Of Property + * @trans ['日','一','二','三','四','五','六','七','八','九','十'] + * @return Cn string + */ + nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341'], + + /** + * 日期转农历称呼速查表 + * @Array Of Property + * @trans ['初','十','廿','卅'] + * @return Cn string + */ + nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'], + + /** + * 月份转农历称呼速查表 + * @Array Of Property + * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] + * @return Cn string + */ + nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', '\u51ac', '\u814a'], + + /** + * 返回农历y年一整年的总天数 + * @param lunar Year + * @return Number + * @eg:var count = calendar.lYearDays(1987) ;//count=387 + */ + lYearDays: function (y) { + var i; var sum = 348 + for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 } + return (sum + this.leapDays(y)) + }, + + /** + * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 + * @param lunar Year + * @return Number (0-12) + * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 + */ + leapMonth: function (y) { // 闰字编码 \u95f0 + return (this.lunarInfo[y - 1900] & 0xf) + }, + + /** + * 返回农历y年闰月的天数 若该年没有闰月则返回0 + * @param lunar Year + * @return Number (0、29、30) + * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 + */ + leapDays: function (y) { + if (this.leapMonth(y)) { + return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29) + } + return (0) + }, + + /** + * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 + * @param lunar Year + * @return Number (-1、29、30) + * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 + */ + monthDays: function (y, m) { + if (m > 12 || m < 1) { return -1 }// 月份参数从1至12,参数错误返回-1 + return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29) + }, + + /** + * 返回公历(!)y年m月的天数 + * @param solar Year + * @return Number (-1、28、29、30、31) + * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 + */ + solarDays: function (y, m) { + if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1 + var ms = m - 1 + if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29 + return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28) + } else { + return (this.solarMonth[ms]) + } + }, + + /** + * 农历年份转换为干支纪年 + * @param lYear 农历年的年份数 + * @return Cn string + */ + toGanZhiYear: function (lYear) { + var ganKey = (lYear - 3) % 10 + var zhiKey = (lYear - 3) % 12 + if (ganKey == 0) ganKey = 10// 如果余数为0则为最后一个天干 + if (zhiKey == 0) zhiKey = 12// 如果余数为0则为最后一个地支 + return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1] + }, + + /** + * 公历月、日判断所属星座 + * @param cMonth [description] + * @param cDay [description] + * @return Cn string + */ + toAstro: function (cMonth, cDay) { + var s = '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf' + var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22] + return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7'// 座 + }, + + /** + * 传入offset偏移量返回干支 + * @param offset 相对甲子的偏移量 + * @return Cn string + */ + toGanZhi: function (offset) { + return this.Gan[offset % 10] + this.Zhi[offset % 12] + }, + + /** + * 传入公历(!)y年获得该年第n个节气的公历日期 + * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 + * @return day Number + * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 + */ + getTerm: function (y, n) { + if (y < 1900 || y > 2100) { return -1 } + if (n < 1 || n > 24) { return -1 } + var _table = this.sTermInfo[y - 1900] + var _info = [ + parseInt('0x' + _table.substr(0, 5)).toString(), + parseInt('0x' + _table.substr(5, 5)).toString(), + parseInt('0x' + _table.substr(10, 5)).toString(), + parseInt('0x' + _table.substr(15, 5)).toString(), + parseInt('0x' + _table.substr(20, 5)).toString(), + parseInt('0x' + _table.substr(25, 5)).toString() + ] + var _calday = [ + _info[0].substr(0, 1), + _info[0].substr(1, 2), + _info[0].substr(3, 1), + _info[0].substr(4, 2), + + _info[1].substr(0, 1), + _info[1].substr(1, 2), + _info[1].substr(3, 1), + _info[1].substr(4, 2), + + _info[2].substr(0, 1), + _info[2].substr(1, 2), + _info[2].substr(3, 1), + _info[2].substr(4, 2), + + _info[3].substr(0, 1), + _info[3].substr(1, 2), + _info[3].substr(3, 1), + _info[3].substr(4, 2), + + _info[4].substr(0, 1), + _info[4].substr(1, 2), + _info[4].substr(3, 1), + _info[4].substr(4, 2), + + _info[5].substr(0, 1), + _info[5].substr(1, 2), + _info[5].substr(3, 1), + _info[5].substr(4, 2) + ] + return parseInt(_calday[n - 1]) + }, + + /** + * 传入农历数字月份返回汉语通俗表示法 + * @param lunar month + * @return Cn string + * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' + */ + toChinaMonth: function (m) { // 月 => \u6708 + if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1 + var s = this.nStr3[m - 1] + s += '\u6708'// 加上月字 + return s + }, + + /** + * 传入农历日期数字返回汉字表示法 + * @param lunar day + * @return Cn string + * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' + */ + toChinaDay: function (d) { // 日 => \u65e5 + var s + switch (d) { + case 10: + s = '\u521d\u5341'; break + case 20: + s = '\u4e8c\u5341'; break + break + case 30: + s = '\u4e09\u5341'; break + break + default : + s = this.nStr2[Math.floor(d / 10)] + s += this.nStr1[d % 10] + } + return (s) + }, + + /** + * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” + * @param y year + * @return Cn string + * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' + */ + getAnimal: function (y) { + return this.Animals[(y - 4) % 12] + }, + + /** + * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON + * @param y solar year + * @param m solar month + * @param d solar day + * @return JSON object + * @eg:console.log(calendar.solar2lunar(1987,11,01)); + */ + solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31 + // 年份限定、上限 + if (y < 1900 || y > 2100) { + return -1// undefined转换为数字变为NaN + } + // 公历传参最下限 + if (y == 1900 && m == 1 && d < 31) { + return -1 + } + // 未传参 获得当天 + if (!y) { + var objDate = new Date() + } else { + var objDate = new Date(y, parseInt(m) - 1, d) + } + var i; var leap = 0; var temp = 0 + // 修正ymd参数 + var y = objDate.getFullYear() + var m = objDate.getMonth() + 1 + var d = objDate.getDate() + var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000 + for (i = 1900; i < 2101 && offset > 0; i++) { + temp = this.lYearDays(i) + offset -= temp + } + if (offset < 0) { + offset += temp; i-- + } + + // 是否今天 + var isTodayObj = new Date() + var isToday = false + if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) { + isToday = true + } + // 星期几 + var nWeek = objDate.getDay() + var cWeek = this.nStr1[nWeek] + // 数字表示周几顺应天朝周一开始的惯例 + if (nWeek == 0) { + nWeek = 7 + } + // 农历年 + var year = i + var leap = this.leapMonth(i) // 闰哪个月 + var isLeap = false + + // 效验闰月 + for (i = 1; i < 13 && offset > 0; i++) { + // 闰月 + if (leap > 0 && i == (leap + 1) && isLeap == false) { + --i + isLeap = true; temp = this.leapDays(year) // 计算农历闰月天数 + } else { + temp = this.monthDays(year, i)// 计算农历普通月天数 + } + // 解除闰月 + if (isLeap == true && i == (leap + 1)) { isLeap = false } + offset -= temp + } + // 闰月导致数组下标重叠取反 + if (offset == 0 && leap > 0 && i == leap + 1) { + if (isLeap) { + isLeap = false + } else { + isLeap = true; --i + } + } + if (offset < 0) { + offset += temp; --i + } + // 农历月 + var month = i + // 农历日 + var day = offset + 1 + // 天干地支处理 + var sm = m - 1 + var gzY = this.toGanZhiYear(year) + + // 当月的两个节气 + // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year` + var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始 + var secondNode = this.getTerm(y, (m * 2))// 返回当月「节」为几日开始 + + // 依据12节气修正干支月 + var gzM = this.toGanZhi((y - 1900) * 12 + m + 11) + if (d >= firstNode) { + gzM = this.toGanZhi((y - 1900) * 12 + m + 12) + } + + // 传入的日期的节气与否 + var isTerm = false + var Term = null + if (firstNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 2] + } + if (secondNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 1] + } + // 日柱 当月一日与 1900/1/1 相差天数 + var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10 + var gzD = this.toGanZhi(dayCyclical + d - 1) + // 该日期所属的星座 + var astro = this.toAstro(m, d) + + return { 'lYear': year, 'lMonth': month, 'lDay': day, 'Animal': this.getAnimal(year), 'IMonthCn': (isLeap ? '\u95f0' : '') + this.toChinaMonth(month), 'IDayCn': this.toChinaDay(day), 'cYear': y, 'cMonth': m, 'cDay': d, 'gzYear': gzY, 'gzMonth': gzM, 'gzDay': gzD, 'isToday': isToday, 'isLeap': isLeap, 'nWeek': nWeek, 'ncWeek': '\u661f\u671f' + cWeek, 'isTerm': isTerm, 'Term': Term, 'astro': astro } + }, + + /** + * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON + * @param y lunar year + * @param m lunar month + * @param d lunar day + * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] + * @return JSON object + * @eg:console.log(calendar.lunar2solar(1987,9,10)); + */ + lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1 + var isLeapMonth = !!isLeapMonth + var leapOffset = 0 + var leapMonth = this.leapMonth(y) + var leapDay = this.leapDays(y) + if (isLeapMonth && (leapMonth != m)) { return -1 }// 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 + if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1 }// 超出了最大极限值 + var day = this.monthDays(y, m) + var _day = day + // bugFix 2016-9-25 + // if month is leap, _day use leapDays method + if (isLeapMonth) { + _day = this.leapDays(y, m) + } + if (y < 1900 || y > 2100 || d > _day) { return -1 }// 参数合法性效验 + + // 计算农历的时间差 + var offset = 0 + for (var i = 1900; i < y; i++) { + offset += this.lYearDays(i) + } + var leap = 0; var isAdd = false + for (var i = 1; i < m; i++) { + leap = this.leapMonth(y) + if (!isAdd) { // 处理闰月 + if (leap <= i && leap > 0) { + offset += this.leapDays(y); isAdd = true + } + } + offset += this.monthDays(y, i) + } + // 转换闰月农历 需补充该年闰月的前一个月的时差 + if (isLeapMonth) { offset += day } + // 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) + var stmap = Date.UTC(1900, 1, 30, 0, 0, 0) + var calObj = new Date((offset + d - 31) * 86400000 + stmap) + var cY = calObj.getUTCFullYear() + var cM = calObj.getUTCMonth() + 1 + var cD = calObj.getUTCDate() + + return this.solar2lunar(cY, cM, cD) + } +} + +export default calendar diff --git a/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json b/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json new file mode 100644 index 0000000..fcbd13c --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json @@ -0,0 +1,12 @@ +{ + "uni-calender.ok": "ok", + "uni-calender.cancel": "cancel", + "uni-calender.today": "today", + "uni-calender.MON": "MON", + "uni-calender.TUE": "TUE", + "uni-calender.WED": "WED", + "uni-calender.THU": "THU", + "uni-calender.FRI": "FRI", + "uni-calender.SAT": "SAT", + "uni-calender.SUN": "SUN" +} diff --git a/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js b/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json b/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json new file mode 100644 index 0000000..1ca43de --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json @@ -0,0 +1,12 @@ +{ + "uni-calender.ok": "确定", + "uni-calender.cancel": "取消", + "uni-calender.today": "今日", + "uni-calender.SUN": "日", + "uni-calender.MON": "一", + "uni-calender.TUE": "二", + "uni-calender.WED": "三", + "uni-calender.THU": "四", + "uni-calender.FRI": "五", + "uni-calender.SAT": "六" +} diff --git a/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json b/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json new file mode 100644 index 0000000..e0fe33b --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json @@ -0,0 +1,12 @@ +{ + "uni-calender.ok": "確定", + "uni-calender.cancel": "取消", + "uni-calender.today": "今日", + "uni-calender.SUN": "日", + "uni-calender.MON": "一", + "uni-calender.TUE": "二", + "uni-calender.WED": "三", + "uni-calender.THU": "四", + "uni-calender.FRI": "五", + "uni-calender.SAT": "六" +} diff --git a/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue new file mode 100644 index 0000000..a54135e --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue new file mode 100644 index 0000000..0beebfb --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue @@ -0,0 +1,567 @@ + + + + + diff --git a/uni_modules/uni-calendar/components/uni-calendar/util.js b/uni_modules/uni-calendar/components/uni-calendar/util.js new file mode 100644 index 0000000..5ec8a92 --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/util.js @@ -0,0 +1,360 @@ +import CALENDAR from './calendar.js' + +class Calendar { + constructor({ + date, + selected, + startDate, + endDate, + range + } = {}) { + // 当前日期 + this.date = this.getDate(new Date()) // 当前初入日期 + // 打点信息 + this.selected = selected || []; + // 范围开始 + this.startDate = startDate + // 范围结束 + this.endDate = endDate + this.range = range + // 多选状态 + this.cleanMultipleStatus() + // 每周日期 + this.weeks = {} + // this._getWeek(this.date.fullDate) + } + /** + * 设置日期 + * @param {Object} date + */ + setDate(date) { + this.selectDate = this.getDate(date) + this._getWeek(this.selectDate.fullDate) + } + + /** + * 清理多选状态 + */ + cleanMultipleStatus() { + this.multipleStatus = { + before: '', + after: '', + data: [] + } + } + + /** + * 重置开始日期 + */ + resetSatrtDate(startDate) { + // 范围开始 + this.startDate = startDate + + } + + /** + * 重置结束日期 + */ + resetEndDate(endDate) { + // 范围结束 + this.endDate = endDate + } + + /** + * 获取任意时间 + */ + getDate(date, AddDayCount = 0, str = 'day') { + if (!date) { + date = new Date() + } + if (typeof date !== 'object') { + date = date.replace(/-/g, '/') + } + const dd = new Date(date) + switch (str) { + case 'day': + dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期 + break + case 'month': + if (dd.getDate() === 31 && AddDayCount>0) { + dd.setDate(dd.getDate() + AddDayCount) + } else { + const preMonth = dd.getMonth() + dd.setMonth(preMonth + AddDayCount) // 获取AddDayCount天后的日期 + const nextMonth = dd.getMonth() + // 处理 pre 切换月份目标月份为2月没有当前日(30 31) 切换错误问题 + if(AddDayCount<0 && preMonth!==0 && nextMonth-preMonth>AddDayCount){ + dd.setMonth(nextMonth+(nextMonth-preMonth+AddDayCount)) + } + // 处理 next 切换月份目标月份为2月没有当前日(30 31) 切换错误问题 + if(AddDayCount>0 && nextMonth-preMonth>AddDayCount){ + dd.setMonth(nextMonth-(nextMonth-preMonth-AddDayCount)) + } + } + break + case 'year': + dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期 + break + } + const y = dd.getFullYear() + const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0 + const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0 + return { + fullDate: y + '-' + m + '-' + d, + year: y, + month: m, + date: d, + day: dd.getDay() + } + } + + + /** + * 获取上月剩余天数 + */ + _getLastMonthDays(firstDay, full) { + let dateArr = [] + for (let i = firstDay; i > 0; i--) { + const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate() + dateArr.push({ + date: beforeDate, + month: full.month - 1, + lunar: this.getlunar(full.year, full.month - 1, beforeDate), + disable: true + }) + } + return dateArr + } + /** + * 获取本月天数 + */ + _currentMonthDys(dateData, full) { + let dateArr = [] + let fullDate = this.date.fullDate + for (let i = 1; i <= dateData; i++) { + let nowDate = full.year + '-' + (full.month < 10 ? + full.month : full.month) + '-' + (i < 10 ? + '0' + i : i) + // 是否今天 + let isDay = fullDate === nowDate + // 获取打点信息 + let info = this.selected && this.selected.find((item) => { + if (this.dateEqual(nowDate, item.date)) { + return item + } + }) + + // 日期禁用 + let disableBefore = true + let disableAfter = true + if (this.startDate) { + // let dateCompBefore = this.dateCompare(this.startDate, fullDate) + // disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate) + disableBefore = this.dateCompare(this.startDate, nowDate) + } + + if (this.endDate) { + // let dateCompAfter = this.dateCompare(fullDate, this.endDate) + // disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate) + disableAfter = this.dateCompare(nowDate, this.endDate) + } + let multiples = this.multipleStatus.data + let checked = false + let multiplesStatus = -1 + if (this.range) { + if (multiples) { + multiplesStatus = multiples.findIndex((item) => { + return this.dateEqual(item, nowDate) + }) + } + if (multiplesStatus !== -1) { + checked = true + } + } + let data = { + fullDate: nowDate, + year: full.year, + date: i, + multiple: this.range ? checked : false, + beforeMultiple: this.dateEqual(this.multipleStatus.before, nowDate), + afterMultiple: this.dateEqual(this.multipleStatus.after, nowDate), + month: full.month, + lunar: this.getlunar(full.year, full.month, i), + disable: !(disableBefore && disableAfter), + isDay + } + if (info) { + data.extraInfo = info + } + + dateArr.push(data) + } + return dateArr + } + /** + * 获取下月天数 + */ + _getNextMonthDays(surplus, full) { + let dateArr = [] + for (let i = 1; i < surplus + 1; i++) { + dateArr.push({ + date: i, + month: Number(full.month) + 1, + lunar: this.getlunar(full.year, Number(full.month) + 1, i), + disable: true + }) + } + return dateArr + } + + /** + * 获取当前日期详情 + * @param {Object} date + */ + getInfo(date) { + if (!date) { + date = new Date() + } + const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate) + return dateInfo + } + + /** + * 比较时间大小 + */ + dateCompare(startDate, endDate) { + // 计算截止时间 + startDate = new Date(startDate.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + endDate = new Date(endDate.replace('-', '/').replace('-', '/')) + if (startDate <= endDate) { + return true + } else { + return false + } + } + + /** + * 比较时间是否相等 + */ + dateEqual(before, after) { + // 计算截止时间 + before = new Date(before.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + after = new Date(after.replace('-', '/').replace('-', '/')) + if (before.getTime() - after.getTime() === 0) { + return true + } else { + return false + } + } + + + /** + * 获取日期范围内所有日期 + * @param {Object} begin + * @param {Object} end + */ + geDateAll(begin, end) { + var arr = [] + var ab = begin.split('-') + var ae = end.split('-') + var db = new Date() + db.setFullYear(ab[0], ab[1] - 1, ab[2]) + var de = new Date() + de.setFullYear(ae[0], ae[1] - 1, ae[2]) + var unixDb = db.getTime() - 24 * 60 * 60 * 1000 + var unixDe = de.getTime() - 24 * 60 * 60 * 1000 + for (var k = unixDb; k <= unixDe;) { + k = k + 24 * 60 * 60 * 1000 + arr.push(this.getDate(new Date(parseInt(k))).fullDate) + } + return arr + } + /** + * 计算阴历日期显示 + */ + getlunar(year, month, date) { + return CALENDAR.solar2lunar(year, month, date) + } + /** + * 设置打点 + */ + setSelectInfo(data, value) { + this.selected = value + this._getWeek(data) + } + + /** + * 获取多选状态 + */ + setMultiple(fullDate) { + let { + before, + after + } = this.multipleStatus + + if (!this.range) return + if (before && after) { + this.multipleStatus.before = '' + this.multipleStatus.after = '' + this.multipleStatus.data = [] + } else { + if (!before) { + this.multipleStatus.before = fullDate + } else { + this.multipleStatus.after = fullDate + if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after); + } else { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before); + } + } + } + this._getWeek(fullDate) + } + + /** + * 获取每周数据 + * @param {Object} dateData + */ + _getWeek(dateData) { + const { + year, + month + } = this.getDate(dateData) + let firstDay = new Date(year, month - 1, 1).getDay() + let currentDay = new Date(year, month, 0).getDate() + let dates = { + lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天 + currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数 + nextMonthDays: [], // 下个月开始几天 + weeks: [] + } + let canlender = [] + const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length) + dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData)) + canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays) + let weeks = {} + // 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天 + for (let i = 0; i < canlender.length; i++) { + if (i % 7 === 0) { + weeks[parseInt(i / 7)] = new Array(7) + } + weeks[parseInt(i / 7)][i % 7] = canlender[i] + } + this.canlender = canlender + this.weeks = weeks + } + + //静态方法 + // static init(date) { + // if (!this.instance) { + // this.instance = new Calendar(date); + // } + // return this.instance; + // } +} + + +export default Calendar diff --git a/uni_modules/uni-calendar/package.json b/uni_modules/uni-calendar/package.json new file mode 100644 index 0000000..bceaed3 --- /dev/null +++ b/uni_modules/uni-calendar/package.json @@ -0,0 +1,85 @@ +{ + "id": "uni-calendar", + "displayName": "uni-calendar 日历", + "version": "1.4.11", + "description": "日历组件", + "keywords": [ + "uni-ui", + "uniui", + "日历", + "", + "打卡", + "日历选择" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-calendar/readme.md b/uni_modules/uni-calendar/readme.md new file mode 100644 index 0000000..4e1748c --- /dev/null +++ b/uni_modules/uni-calendar/readme.md @@ -0,0 +1,103 @@ + + +## Calendar 日历 +> **组件名:uni-calendar** +> 代码块: `uCalendar` + + +日历组件 + +> **注意事项** +> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 +> - 本组件农历转换使用的js是 [@1900-2100区间内的公历、农历互转](https://github.com/jjonline/calendar.js) +> - 仅支持自定义组件模式 +> - `date`属性传入的应该是一个 String ,如: 2019-06-27 ,而不是 new Date() +> - 通过 `insert` 属性来确定当前的事件是 @change 还是 @confirm 。理应合并为一个事件,但是为了区分模式,现使用两个事件,这里需要注意 +> - 弹窗模式下无法阻止后面的元素滚动,如有需要阻止,请在弹窗弹出后,手动设置滚动元素为不可滚动 + + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + +在 ``template`` 中使用组件 + +```html + + + +``` + +### 通过方法打开日历 + +需要设置 `insert` 为 `false` + +```html + + + + +``` + +```javascript + +export default { + data() { + return {}; + }, + methods: { + open(){ + this.$refs.calendar.open(); + }, + confirm(e) { + console.log(e); + } + } +}; + +``` + + +## API + +### Calendar Props + +| 属性名 | 类型 | 默认值| 说明 | +| - | - | - | - | +| date | String |- | 自定义当前时间,默认为今天 | +| lunar | Boolean | false | 显示农历 | +| startDate | String |- | 日期选择范围-开始日期 | +| endDate | String |- | 日期选择范围-结束日期 | +| range | Boolean | false | 范围选择 | +| insert | Boolean | false | 插入模式,可选值,ture:插入模式;false:弹窗模式;默认为插入模式 | +|clearDate |Boolean |true |弹窗模式是否清空上次选择内容 | +| selected | Array |- | 打点,期待格式[{date: '2019-06-27', info: '签到', data: { custom: '自定义信息', name: '自定义消息头',xxx:xxx... }}] | +|showMonth | Boolean | true | 是否显示月份为背景 | + +### Calendar Events + +| 事件名 | 说明 |返回值| +| - | - | - | +| open | 弹出日历组件,`insert :false` 时生效|- | + + + + + +## 组件示例 + +点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/calendar/calendar](https://hellouniapp.dcloud.net.cn/pages/extUI/calendar/calendar) diff --git a/uni_modules/uni-card/changelog.md b/uni_modules/uni-card/changelog.md new file mode 100644 index 0000000..c3cd8c4 --- /dev/null +++ b/uni_modules/uni-card/changelog.md @@ -0,0 +1,26 @@ +## 1.3.1(2021-12-20) +- 修复 在vue页面下略缩图显示不正常的bug +## 1.3.0(2021-11-19) +- 重构插槽的用法 ,header 替换为 title +- 新增 actions 插槽 +- 新增 cover 封面图属性和插槽 +- 新增 padding 内容默认内边距离 +- 新增 margin 卡片默认外边距离 +- 新增 spacing 卡片默认内边距 +- 新增 shadow 卡片阴影属性 +- 取消 mode 属性,可使用组合插槽代替 +- 取消 note 属性 ,使用actions插槽代替 +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-card](https://uniapp.dcloud.io/component/uniui/uni-card) +## 1.2.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.2.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.8(2021-07-01) +- 优化 图文卡片无图片加载时,提供占位图标 +- 新增 header 插槽,自定义卡片头部( 图文卡片 mode="style" 时,不支持) +- 修复 thumbnail 不存在仍然占位的 bug +## 1.1.7(2021-05-12) +- 新增 组件示例地址 +## 1.1.6(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-card/components/uni-card/uni-card.vue b/uni_modules/uni-card/components/uni-card/uni-card.vue new file mode 100644 index 0000000..38cf594 --- /dev/null +++ b/uni_modules/uni-card/components/uni-card/uni-card.vue @@ -0,0 +1,270 @@ + + + + + diff --git a/uni_modules/uni-card/package.json b/uni_modules/uni-card/package.json new file mode 100644 index 0000000..f16224d --- /dev/null +++ b/uni_modules/uni-card/package.json @@ -0,0 +1,90 @@ +{ + "id": "uni-card", + "displayName": "uni-card 卡片", + "version": "1.3.1", + "description": "Card 组件,提供常见的卡片样式。", + "keywords": [ + "uni-ui", + "uniui", + "card", + "", + "卡片" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-icons", + "uni-scss" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-card/readme.md b/uni_modules/uni-card/readme.md new file mode 100644 index 0000000..7434e71 --- /dev/null +++ b/uni_modules/uni-card/readme.md @@ -0,0 +1,12 @@ + + +## Card 卡片 +> **组件名:uni-card** +> 代码块: `uCard` + +卡片视图组件。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-card) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-collapse/changelog.md b/uni_modules/uni-collapse/changelog.md new file mode 100644 index 0000000..455308a --- /dev/null +++ b/uni_modules/uni-collapse/changelog.md @@ -0,0 +1,38 @@ +## 1.4.4(2024-03-20) +- 修复 titleBorder类型修正 +## 1.4.3(2022-01-25) +- 修复 初始化的时候 ,open 属性失效的bug +## 1.4.2(2022-01-21) +- 修复 微信小程序resize后组件收起的bug +## 1.4.1(2021-11-22) +- 修复 vue3中个别scss变量无法找到的问题 +## 1.4.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-collapse](https://uniapp.dcloud.io/component/uniui/uni-collapse) +## 1.3.3(2021-08-17) +- 优化 show-arrow 属性默认为true +## 1.3.2(2021-08-17) +- 新增 show-arrow 属性,控制是否显示右侧箭头 +## 1.3.1(2021-07-30) +- 优化 vue3下小程序事件警告的问题 +## 1.3.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.2.2(2021-07-21) +- 修复 由1.2.0版本引起的 change 事件返回 undefined 的Bug +## 1.2.1(2021-07-21) +- 优化 组件示例 +## 1.2.0(2021-07-21) +- 新增 组件折叠动画 +- 新增 value\v-model 属性 ,动态修改面板折叠状态 +- 新增 title 插槽 ,可定义面板标题 +- 新增 border 属性 ,显示隐藏面板内容分隔线 +- 新增 title-border 属性 ,显示隐藏面板标题分隔线 +- 修复 resize 方法失效的Bug +- 修复 change 事件返回参数不正确的Bug +- 优化 H5、App 平台自动更具内容更新高度,无需调用 reszie() 方法 +## 1.1.7(2021-05-12) +- 新增 组件示例地址 +## 1.1.6(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.1.5(2021-02-05) +- 调整为uni_modules目录规范 \ No newline at end of file diff --git a/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue b/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue new file mode 100644 index 0000000..2f0862e --- /dev/null +++ b/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue @@ -0,0 +1,402 @@ + + + + + diff --git a/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue b/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue new file mode 100644 index 0000000..384c39a --- /dev/null +++ b/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue @@ -0,0 +1,147 @@ + + + diff --git a/uni_modules/uni-collapse/package.json b/uni_modules/uni-collapse/package.json new file mode 100644 index 0000000..65c5c2e --- /dev/null +++ b/uni_modules/uni-collapse/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-collapse", + "displayName": "uni-collapse 折叠面板", + "version": "1.4.4", + "description": "Collapse 组件,可以折叠 / 展开的内容区域。", + "keywords": [ + "uni-ui", + "折叠", + "折叠面板", + "手风琴" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-collapse/readme.md b/uni_modules/uni-collapse/readme.md new file mode 100644 index 0000000..bc758eb --- /dev/null +++ b/uni_modules/uni-collapse/readme.md @@ -0,0 +1,12 @@ + + +## Collapse 折叠面板 +> **组件名:uni-collapse** +> 代码块: `uCollapse` +> 关联组件:`uni-collapse-item`、`uni-icons`。 + + +折叠面板用来折叠/显示过长的内容或者是列表。通常是在多内容分类项使用,折叠不重要的内容,显示重要内容。点击可以展开折叠部分。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-collapse) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-combox/changelog.md b/uni_modules/uni-combox/changelog.md new file mode 100644 index 0000000..23c2748 --- /dev/null +++ b/uni_modules/uni-combox/changelog.md @@ -0,0 +1,15 @@ +## 1.0.1(2021-11-23) +- 优化 label、label-width 属性 +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-combox](https://uniapp.dcloud.io/component/uniui/uni-combox) +## 0.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.0.6(2021-05-12) +- 新增 组件示例地址 +## 0.0.5(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 0.0.4(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 0.0.3(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-combox/components/uni-combox/uni-combox.vue b/uni_modules/uni-combox/components/uni-combox/uni-combox.vue new file mode 100644 index 0000000..d4cb79d --- /dev/null +++ b/uni_modules/uni-combox/components/uni-combox/uni-combox.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/uni_modules/uni-combox/package.json b/uni_modules/uni-combox/package.json new file mode 100644 index 0000000..4a05c3f --- /dev/null +++ b/uni_modules/uni-combox/package.json @@ -0,0 +1,90 @@ +{ + "id": "uni-combox", + "displayName": "uni-combox 组合框", + "version": "1.0.1", + "description": "可以选择也可以输入的表单项 ", + "keywords": [ + "uni-ui", + "uniui", + "combox", + "组合框", + "select" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-combox/readme.md b/uni_modules/uni-combox/readme.md new file mode 100644 index 0000000..ffa2cc8 --- /dev/null +++ b/uni_modules/uni-combox/readme.md @@ -0,0 +1,11 @@ + + +## Combox 组合框 +> **组件名:uni-combox** +> 代码块: `uCombox` + + +组合框组件。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-combox) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-countdown/changelog.md b/uni_modules/uni-countdown/changelog.md new file mode 100644 index 0000000..16fc324 --- /dev/null +++ b/uni_modules/uni-countdown/changelog.md @@ -0,0 +1,26 @@ +## 1.2.3(2024-02-20) +- 新增 支持控制小时,分钟的显隐:showHour showMinute +## 1.2.2(2022-01-19) +- 修复 在微信小程序中样式不生效的bug +## 1.2.1(2022-01-18) +- 新增 update 方法 ,在动态更新时间后,刷新组件 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-countdown](https://uniapp.dcloud.io/component/uniui/uni-countdown) +## 1.1.3(2021-10-18) +- 重构 +- 新增 font-size 支持自定义字体大小 +## 1.1.2(2021-08-24) +- 新增 支持国际化 +## 1.1.1(2021-07-30) +- 优化 vue3下小程序事件警告的问题 +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.5(2021-06-18) +- 修复 uni-countdown 重复赋值跳两秒的 bug +## 1.0.4(2021-05-12) +- 新增 组件示例地址 +## 1.0.3(2021-05-08) +- 修复 uni-countdown 不能控制倒计时的 bug +## 1.0.2(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-countdown/components/uni-countdown/i18n/en.json b/uni_modules/uni-countdown/components/uni-countdown/i18n/en.json new file mode 100644 index 0000000..06309cb --- /dev/null +++ b/uni_modules/uni-countdown/components/uni-countdown/i18n/en.json @@ -0,0 +1,6 @@ +{ + "uni-countdown.day": "day", + "uni-countdown.h": "h", + "uni-countdown.m": "m", + "uni-countdown.s": "s" +} diff --git a/uni_modules/uni-countdown/components/uni-countdown/i18n/index.js b/uni_modules/uni-countdown/components/uni-countdown/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-countdown/components/uni-countdown/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hans.json b/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hans.json new file mode 100644 index 0000000..358cdd1 --- /dev/null +++ b/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hans.json @@ -0,0 +1,6 @@ +{ + "uni-countdown.day": "天", + "uni-countdown.h": "时", + "uni-countdown.m": "分", + "uni-countdown.s": "秒" +} diff --git a/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hant.json b/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hant.json new file mode 100644 index 0000000..e5a63de --- /dev/null +++ b/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hant.json @@ -0,0 +1,6 @@ +{ + "uni-countdown.day": "天", + "uni-countdown.h": "時", + "uni-countdown.m": "分", + "uni-countdown.s": "秒" +} diff --git a/uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue b/uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue new file mode 100644 index 0000000..1e28dda --- /dev/null +++ b/uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue @@ -0,0 +1,281 @@ + + + diff --git a/uni_modules/uni-countdown/package.json b/uni_modules/uni-countdown/package.json new file mode 100644 index 0000000..6622074 --- /dev/null +++ b/uni_modules/uni-countdown/package.json @@ -0,0 +1,83 @@ +{ + "id": "uni-countdown", + "displayName": "uni-countdown 倒计时", + "version": "1.2.3", + "description": "CountDown 倒计时组件", + "keywords": [ + "uni-ui", + "uniui", + "countdown", + "倒计时" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-countdown/readme.md b/uni_modules/uni-countdown/readme.md new file mode 100644 index 0000000..4bcb1aa --- /dev/null +++ b/uni_modules/uni-countdown/readme.md @@ -0,0 +1,10 @@ + + +## CountDown 倒计时 +> **组件名:uni-countdown** +> 代码块: `uCountDown` + +倒计时组件。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-countdown) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-data-checkbox/changelog.md b/uni_modules/uni-data-checkbox/changelog.md new file mode 100644 index 0000000..b475fcb --- /dev/null +++ b/uni_modules/uni-data-checkbox/changelog.md @@ -0,0 +1,49 @@ +## 1.0.5(2024-03-20) +- 修复 单选模式下选中样式不生效的bug +## 1.0.4(2024-01-27) +- 修复 修复错别字chagne为change +## 1.0.3(2022-09-16) +- 可以使用 uni-scss 控制主题色 +## 1.0.2(2022-06-30) +- 优化 在 uni-forms 中的依赖注入方式 +## 1.0.1(2022-02-07) +- 修复 multiple 为 true 时,v-model 的值为 null 报错的 bug +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-data-checkbox](https://uniapp.dcloud.io/component/uniui/uni-data-checkbox) +## 0.2.5(2021-08-23) +- 修复 在uni-forms中 modelValue 中不存在当前字段,当前字段必填写也不参与校验的问题 +## 0.2.4(2021-08-17) +- 修复 单选 list 模式下 ,icon 为 left 时,选中图标不显示的问题 +## 0.2.3(2021-08-11) +- 修复 在 uni-forms 中重置表单,错误信息无法清除的问题 +## 0.2.2(2021-07-30) +- 优化 在uni-forms组件,与label不对齐的问题 +## 0.2.1(2021-07-27) +- 修复 单选默认值为0不能选中的Bug +## 0.2.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.1.11(2021-07-06) +- 优化 删除无用日志 +## 0.1.10(2021-07-05) +- 修复 由 0.1.9 引起的非 nvue 端图标不显示的问题 +## 0.1.9(2021-07-05) +- 修复 nvue 黑框样式问题 +## 0.1.8(2021-06-28) +- 修复 selectedTextColor 属性不生效的Bug +## 0.1.7(2021-06-02) +- 新增 map 属性,可以方便映射text/value属性 +## 0.1.6(2021-05-26) +- 修复 不关联服务空间的情况下组件报错的Bug +## 0.1.5(2021-05-12) +- 新增 组件示例地址 +## 0.1.4(2021-04-09) +- 修复 nvue 下无法选中的问题 +## 0.1.3(2021-03-22) +- 新增 disabled属性 +## 0.1.2(2021-02-24) +- 优化 默认颜色显示 +## 0.1.1(2021-02-24) +- 新增 支持nvue +## 0.1.0(2021-02-18) +- “暂无数据”显示居中 diff --git a/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue b/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue new file mode 100644 index 0000000..81d3f07 --- /dev/null +++ b/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue @@ -0,0 +1,849 @@ + + + + + diff --git a/uni_modules/uni-data-checkbox/package.json b/uni_modules/uni-data-checkbox/package.json new file mode 100644 index 0000000..fc15e8b --- /dev/null +++ b/uni_modules/uni-data-checkbox/package.json @@ -0,0 +1,84 @@ +{ + "id": "uni-data-checkbox", + "displayName": "uni-data-checkbox 数据选择器", + "version": "1.0.5", + "description": "通过数据驱动的单选框和复选框", + "keywords": [ + "uni-ui", + "checkbox", + "单选", + "多选", + "单选多选" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.1" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-load-more","uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-data-checkbox/readme.md b/uni_modules/uni-data-checkbox/readme.md new file mode 100644 index 0000000..6eb253d --- /dev/null +++ b/uni_modules/uni-data-checkbox/readme.md @@ -0,0 +1,18 @@ + + +## DataCheckbox 数据驱动的单选复选框 +> **组件名:uni-data-checkbox** +> 代码块: `uDataCheckbox` + + +本组件是基于uni-app基础组件checkbox的封装。本组件要解决问题包括: + +1. 数据绑定型组件:给本组件绑定一个data,会自动渲染一组候选内容。再以往,开发者需要编写不少代码实现类似功能 +2. 自动的表单校验:组件绑定了data,且符合[uni-forms](https://ext.dcloud.net.cn/plugin?id=2773)组件的表单校验规范,搭配使用会自动实现表单校验 +3. 本组件合并了单选多选 +4. 本组件有若干风格选择,如普通的单选多选框、并列button风格、tag风格。开发者可以快速选择需要的风格。但作为一个封装组件,样式代码虽然不用自己写了,却会牺牲一定的样式自定义性 + +在uniCloud开发中,`DB Schema`中配置了enum枚举等类型后,在web控制台的[自动生成表单](https://uniapp.dcloud.io/uniCloud/schema?id=autocode)功能中,会自动生成``uni-data-checkbox``组件并绑定好data + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-checkbox) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-data-picker/changelog.md b/uni_modules/uni-data-picker/changelog.md new file mode 100644 index 0000000..8aaad24 --- /dev/null +++ b/uni_modules/uni-data-picker/changelog.md @@ -0,0 +1,77 @@ +## 2.0.0(2023-12-14) +- 新增 支持 uni-app-x +## 1.1.2(2023-04-11) +- 修复 更改 modelValue 报错的 bug +- 修复 v-for 未使用 key 值控制台 warning +## 1.1.1(2023-02-21) +- 修复代码合并时引发 value 属性为空时不渲染数据的问题 +## 1.1.0(2023-02-15) +- 修复 localdata 不支持动态更新的bug +## 1.0.9(2023-02-15) +- 修复 localdata 不支持动态更新的bug +## 1.0.8(2022-09-16) +- 可以使用 uni-scss 控制主题色 +## 1.0.7(2022-07-06) +- 优化 pc端图标位置不正确的问题 +## 1.0.6(2022-07-05) +- 优化 显示样式 +## 1.0.5(2022-07-04) +- 修复 uni-data-picker 在 uni-forms-item 中宽度不正确的bug +## 1.0.4(2022-04-19) +- 修复 字节小程序 本地数据无法选择下一级的Bug +## 1.0.3(2022-02-25) +- 修复 nvue 不支持的 v-show 的 bug +## 1.0.2(2022-02-25) +- 修复 条件编译 nvue 不支持的 css 样式 +## 1.0.1(2021-11-23) +- 修复 由上个版本引发的map、v-model等属性不生效的bug +## 1.0.0(2021-11-19) +- 优化 组件 UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-data-picker](https://uniapp.dcloud.io/component/uniui/uni-data-picker) +## 0.4.9(2021-10-28) +- 修复 VUE2 v-model 概率无效的 bug +## 0.4.8(2021-10-27) +- 修复 v-model 概率无效的 bug +## 0.4.7(2021-10-25) +- 新增 属性 spaceInfo 服务空间配置 HBuilderX 3.2.11+ +- 修复 树型 uniCloud 数据类型为 int 时报错的 bug +## 0.4.6(2021-10-19) +- 修复 非 VUE3 v-model 为 0 时无法选中的 bug +## 0.4.5(2021-09-26) +- 新增 清除已选项的功能(通过 clearIcon 属性配置是否显示按钮),同时提供 clear 方法以供调用,二者等效 +- 修复 readonly 为 true 时报错的 bug +## 0.4.4(2021-09-26) +- 修复 上一版本造成的 map 属性失效的 bug +- 新增 ellipsis 属性,支持配置 tab 选项长度过长时是否自动省略 +## 0.4.3(2021-09-24) +- 修复 某些情况下级联未触发的 bug +## 0.4.2(2021-09-23) +- 新增 提供 show 和 hide 方法,开发者可以通过 ref 调用 +- 新增 选项内容过长自动添加省略号 +## 0.4.1(2021-09-15) +- 新增 map 属性 字段映射,将 text/value 映射到数据中的其他字段 +## 0.4.0(2021-07-13) +- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.3.5(2021-06-04) +- 修复 无法加载云端数据的问题 +## 0.3.4(2021-05-28) +- 修复 v-model 无效问题 +- 修复 loaddata 为空数据组时加载时间过长问题 +- 修复 上个版本引出的本地数据无法选择带有 children 的 2 级节点 +## 0.3.3(2021-05-12) +- 新增 组件示例地址 +## 0.3.2(2021-04-22) +- 修复 非树形数据有 where 属性查询报错的问题 +## 0.3.1(2021-04-15) +- 修复 本地数据概率无法回显时问题 +## 0.3.0(2021-04-07) +- 新增 支持云端非树形表结构数据 +- 修复 根节点 parent_field 字段等于 null 时选择界面错乱问题 +## 0.2.0(2021-03-15) +- 修复 nodeclick、popupopened、popupclosed 事件无法触发的问题 +## 0.1.9(2021-03-09) +- 修复 微信小程序某些情况下无法选择的问题 +## 0.1.8(2021-02-05) +- 优化 部分样式在 nvue 上的兼容表现 +## 0.1.7(2021-02-05) +- 调整为 uni_modules 目录规范 diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js b/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js new file mode 100644 index 0000000..6ef26a2 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue new file mode 100644 index 0000000..82031e1 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue @@ -0,0 +1,380 @@ + + + + + diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue new file mode 100644 index 0000000..179a4e0 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue @@ -0,0 +1,551 @@ + + + + + diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/loading.uts b/uni_modules/uni-data-picker/components/uni-data-pickerview/loading.uts new file mode 100644 index 0000000..baa0dff --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/loading.uts @@ -0,0 +1 @@ +export const imgbase : string = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzlBMzU3OTlEOUM0MTFFOUI0NTZDNERBQURBQzI4RkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzlBMzU3OUFEOUM0MTFFOUI0NTZDNERBQURBQzI4RkUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDOUEzNTc5N0Q5QzQxMUU5QjQ1NkM0REFBREFDMjhGRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDOUEzNTc5OEQ5QzQxMUU5QjQ1NkM0REFBREFDMjhGRSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pt+ALSwAAA6CSURBVHja1FsLkFZV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' \ No newline at end of file diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js new file mode 100644 index 0000000..cfae22a --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js @@ -0,0 +1,622 @@ +export default { + props: { + localdata: { + type: [Array, Object], + default () { + return [] + } + }, + spaceInfo: { + type: Object, + default () { + return {} + } + }, + collection: { + type: String, + default: '' + }, + action: { + type: String, + default: '' + }, + field: { + type: String, + default: '' + }, + orderby: { + type: String, + default: '' + }, + where: { + type: [String, Object], + default: '' + }, + pageData: { + type: String, + default: 'add' + }, + pageCurrent: { + type: Number, + default: 1 + }, + pageSize: { + type: Number, + default: 500 + }, + getcount: { + type: [Boolean, String], + default: false + }, + getone: { + type: [Boolean, String], + default: false + }, + gettree: { + type: [Boolean, String], + default: false + }, + manual: { + type: Boolean, + default: false + }, + value: { + type: [Array, String, Number], + default () { + return [] + } + }, + modelValue: { + type: [Array, String, Number], + default () { + return [] + } + }, + preload: { + type: Boolean, + default: false + }, + stepSearh: { + type: Boolean, + default: true + }, + selfField: { + type: String, + default: '' + }, + parentField: { + type: String, + default: '' + }, + multiple: { + type: Boolean, + default: false + }, + map: { + type: Object, + default () { + return { + text: "text", + value: "value" + } + } + } + }, + data() { + return { + loading: false, + errorMessage: '', + loadMore: { + contentdown: '', + contentrefresh: '', + contentnomore: '' + }, + dataList: [], + selected: [], + selectedIndex: 0, + page: { + current: this.pageCurrent, + size: this.pageSize, + count: 0 + } + } + }, + computed: { + isLocalData() { + return !this.collection.length; + }, + isCloudData() { + return this.collection.length > 0; + }, + isCloudDataList() { + return (this.isCloudData && (!this.parentField && !this.selfField)); + }, + isCloudDataTree() { + return (this.isCloudData && this.parentField && this.selfField); + }, + dataValue() { + let isModelValue = Array.isArray(this.modelValue) ? (this.modelValue.length > 0) : (this.modelValue !== null || + this.modelValue !== undefined); + return isModelValue ? this.modelValue : this.value; + }, + hasValue() { + if (typeof this.dataValue === 'number') { + return true + } + return (this.dataValue != null) && (this.dataValue.length > 0) + } + }, + created() { + this.$watch(() => { + var al = []; + ['pageCurrent', + 'pageSize', + 'spaceInfo', + 'value', + 'modelValue', + 'localdata', + 'collection', + 'action', + 'field', + 'orderby', + 'where', + 'getont', + 'getcount', + 'gettree' + ].forEach(key => { + al.push(this[key]) + }); + return al + }, (newValue, oldValue) => { + let needReset = false + for (let i = 2; i < newValue.length; i++) { + if (newValue[i] != oldValue[i]) { + needReset = true + break + } + } + if (newValue[0] != oldValue[0]) { + this.page.current = this.pageCurrent + } + this.page.size = this.pageSize + + this.onPropsChange() + }) + this._treeData = [] + }, + methods: { + onPropsChange() { + this._treeData = []; + }, + + // 填充 pickview 数据 + async loadData() { + if (this.isLocalData) { + this.loadLocalData(); + } else if (this.isCloudDataList) { + this.loadCloudDataList(); + } else if (this.isCloudDataTree) { + this.loadCloudDataTree(); + } + }, + + // 加载本地数据 + async loadLocalData() { + this._treeData = []; + this._extractTree(this.localdata, this._treeData); + + let inputValue = this.dataValue; + if (inputValue === undefined) { + return; + } + + if (Array.isArray(inputValue)) { + inputValue = inputValue[inputValue.length - 1]; + if (typeof inputValue === 'object' && inputValue[this.map.value]) { + inputValue = inputValue[this.map.value]; + } + } + + this.selected = this._findNodePath(inputValue, this.localdata); + }, + + // 加载 Cloud 数据 (单列) + async loadCloudDataList() { + if (this.loading) { + return; + } + this.loading = true; + + try { + let response = await this.getCommand(); + let responseData = response.result.data; + + this._treeData = responseData; + + this._updateBindData(); + this._updateSelected(); + + this.onDataChange(); + } catch (e) { + this.errorMessage = e; + } finally { + this.loading = false; + } + }, + + // 加载 Cloud 数据 (树形) + async loadCloudDataTree() { + if (this.loading) { + return; + } + this.loading = true; + + try { + let commandOptions = { + field: this._cloudDataPostField(), + where: this._cloudDataTreeWhere() + }; + if (this.gettree) { + commandOptions.startwith = `${this.selfField}=='${this.dataValue}'`; + } + + let response = await this.getCommand(commandOptions); + let responseData = response.result.data; + + this._treeData = responseData; + this._updateBindData(); + this._updateSelected(); + + this.onDataChange(); + } catch (e) { + this.errorMessage = e; + } finally { + this.loading = false; + } + }, + + // 加载 Cloud 数据 (节点) + async loadCloudDataNode(callback) { + if (this.loading) { + return; + } + this.loading = true; + + try { + let commandOptions = { + field: this._cloudDataPostField(), + where: this._cloudDataNodeWhere() + }; + + let response = await this.getCommand(commandOptions); + let responseData = response.result.data; + + callback(responseData); + } catch (e) { + this.errorMessage = e; + } finally { + this.loading = false; + } + }, + + // 回显 Cloud 数据 + getCloudDataValue() { + if (this.isCloudDataList) { + return this.getCloudDataListValue(); + } + + if (this.isCloudDataTree) { + return this.getCloudDataTreeValue(); + } + }, + + // 回显 Cloud 数据 (单列) + getCloudDataListValue() { + // 根据 field's as value标识匹配 where 条件 + let where = []; + let whereField = this._getForeignKeyByField(); + if (whereField) { + where.push(`${whereField} == '${this.dataValue}'`) + } + + where = where.join(' || '); + + if (this.where) { + where = `(${this.where}) && (${where})` + } + + return this.getCommand({ + field: this._cloudDataPostField(), + where + }).then((res) => { + this.selected = res.result.data; + return res.result.data; + }); + }, + + // 回显 Cloud 数据 (树形) + getCloudDataTreeValue() { + return this.getCommand({ + field: this._cloudDataPostField(), + getTreePath: { + startWith: `${this.selfField}=='${this.dataValue}'` + } + }).then((res) => { + let treePath = []; + this._extractTreePath(res.result.data, treePath); + this.selected = treePath; + return treePath; + }); + }, + + getCommand(options = {}) { + /* eslint-disable no-undef */ + let db = uniCloud.database(this.spaceInfo) + + const action = options.action || this.action + if (action) { + db = db.action(action) + } + + const collection = options.collection || this.collection + db = db.collection(collection) + + const where = options.where || this.where + if (!(!where || !Object.keys(where).length)) { + db = db.where(where) + } + + const field = options.field || this.field + if (field) { + db = db.field(field) + } + + const orderby = options.orderby || this.orderby + if (orderby) { + db = db.orderBy(orderby) + } + + const current = options.pageCurrent !== undefined ? options.pageCurrent : this.page.current + const size = options.pageSize !== undefined ? options.pageSize : this.page.size + const getCount = options.getcount !== undefined ? options.getcount : this.getcount + const getTree = options.gettree !== undefined ? options.gettree : this.gettree + + const getOptions = { + getCount, + getTree + } + if (options.getTreePath) { + getOptions.getTreePath = options.getTreePath + } + + db = db.skip(size * (current - 1)).limit(size).get(getOptions) + + return db + }, + + _cloudDataPostField() { + let fields = [this.field]; + if (this.parentField) { + fields.push(`${this.parentField} as parent_value`); + } + return fields.join(','); + }, + + _cloudDataTreeWhere() { + let result = [] + let selected = this.selected + let parentField = this.parentField + if (parentField) { + result.push(`${parentField} == null || ${parentField} == ""`) + } + if (selected.length) { + for (var i = 0; i < selected.length - 1; i++) { + result.push(`${parentField} == '${selected[i].value}'`) + } + } + + let where = [] + if (this.where) { + where.push(`(${this.where})`) + } + + if (result.length) { + where.push(`(${result.join(' || ')})`) + } + + return where.join(' && ') + }, + + _cloudDataNodeWhere() { + let where = [] + let selected = this.selected; + if (selected.length) { + where.push(`${this.parentField} == '${selected[selected.length - 1].value}'`); + } + + where = where.join(' || '); + + if (this.where) { + return `(${this.where}) && (${where})` + } + + return where + }, + + _getWhereByForeignKey() { + let result = [] + let whereField = this._getForeignKeyByField(); + if (whereField) { + result.push(`${whereField} == '${this.dataValue}'`) + } + + if (this.where) { + return `(${this.where}) && (${result.join(' || ')})` + } + + return result.join(' || ') + }, + + _getForeignKeyByField() { + let fields = this.field.split(','); + let whereField = null; + for (let i = 0; i < fields.length; i++) { + const items = fields[i].split('as'); + if (items.length < 2) { + continue; + } + if (items[1].trim() === 'value') { + whereField = items[0].trim(); + break; + } + } + return whereField; + }, + + _updateBindData(node) { + const { + dataList, + hasNodes + } = this._filterData(this._treeData, this.selected) + + let isleaf = this._stepSearh === false && !hasNodes + + if (node) { + node.isleaf = isleaf + } + + this.dataList = dataList + this.selectedIndex = dataList.length - 1 + + if (!isleaf && this.selected.length < dataList.length) { + this.selected.push({ + value: null, + text: "请选择" + }) + } + + return { + isleaf, + hasNodes + } + }, + + _updateSelected() { + let dl = this.dataList + let sl = this.selected + let textField = this.map.text + let valueField = this.map.value + for (let i = 0; i < sl.length; i++) { + let value = sl[i].value + let dl2 = dl[i] + for (let j = 0; j < dl2.length; j++) { + let item2 = dl2[j] + if (item2[valueField] === value) { + sl[i].text = item2[textField] + break + } + } + } + }, + + _filterData(data, paths) { + let dataList = [] + let hasNodes = true + + dataList.push(data.filter((item) => { + return (item.parent_value === null || item.parent_value === undefined || item.parent_value === '') + })) + for (let i = 0; i < paths.length; i++) { + let value = paths[i].value + let nodes = data.filter((item) => { + return item.parent_value === value + }) + + if (nodes.length) { + dataList.push(nodes) + } else { + hasNodes = false + } + } + + return { + dataList, + hasNodes + } + }, + + _extractTree(nodes, result, parent_value) { + let list = result || [] + let valueField = this.map.value + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + + let child = {} + for (let key in node) { + if (key !== 'children') { + child[key] = node[key] + } + } + if (parent_value !== null && parent_value !== undefined && parent_value !== '') { + child.parent_value = parent_value + } + result.push(child) + + let children = node.children + if (children) { + this._extractTree(children, result, node[valueField]) + } + } + }, + + _extractTreePath(nodes, result) { + let list = result || [] + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + + let child = {} + for (let key in node) { + if (key !== 'children') { + child[key] = node[key] + } + } + result.push(child) + + let children = node.children + if (children) { + this._extractTreePath(children, result) + } + } + }, + + _findNodePath(key, nodes, path = []) { + let textField = this.map.text + let valueField = this.map.value + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + let children = node.children + let text = node[textField] + let value = node[valueField] + + path.push({ + value, + text + }) + + if (value === key) { + return path + } + + if (children) { + const p = this._findNodePath(key, children, path) + if (p.length) { + return p + } + } + + path.pop() + } + return [] + } + } +} diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts new file mode 100644 index 0000000..372795d --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts @@ -0,0 +1,693 @@ +export type PaginationType = { + current : number, + size : number, + count : number +} + +export type LoadMoreType = { + contentdown : string, + contentrefresh : string, + contentnomore : string +} + +export type SelectedItemType = { + name : string, + value : string, +} + +export type GetCommandOptions = { + collection ?: UTSJSONObject, + field ?: string, + orderby ?: string, + where ?: any, + pageData ?: string, + pageCurrent ?: number, + pageSize ?: number, + getCount ?: boolean, + getTree ?: any, + getTreePath ?: UTSJSONObject, + startwith ?: string, + limitlevel ?: number, + groupby ?: string, + groupField ?: string, + distinct ?: boolean, + pageIndistinct ?: boolean, + foreignKey ?: string, + loadtime ?: string, + manual ?: boolean +} + +const DefaultSelectedNode = { + text: '请选择', + value: '' +} + +export const dataPicker = defineMixin({ + props: { + localdata: { + type: Array as PropType>, + default: [] as Array + }, + collection: { + type: Object, + default: '' + }, + field: { + type: String, + default: '' + }, + orderby: { + type: String, + default: '' + }, + where: { + type: Object, + default: '' + }, + pageData: { + type: String, + default: 'add' + }, + pageCurrent: { + type: Number, + default: 1 + }, + pageSize: { + type: Number, + default: 20 + }, + getcount: { + type: Boolean, + default: false + }, + gettree: { + type: Object, + default: '' + }, + gettreepath: { + type: Object, + default: '' + }, + startwith: { + type: String, + default: '' + }, + limitlevel: { + type: Number, + default: 10 + }, + groupby: { + type: String, + default: '' + }, + groupField: { + type: String, + default: '' + }, + distinct: { + type: Boolean, + default: false + }, + pageIndistinct: { + type: Boolean, + default: false + }, + foreignKey: { + type: String, + default: '' + }, + loadtime: { + type: String, + default: 'auto' + }, + manual: { + type: Boolean, + default: false + }, + preload: { + type: Boolean, + default: false + }, + stepSearh: { + type: Boolean, + default: true + }, + selfField: { + type: String, + default: '' + }, + parentField: { + type: String, + default: '' + }, + multiple: { + type: Boolean, + default: false + }, + value: { + type: Object, + default: '' + }, + modelValue: { + type: Object, + default: '' + }, + defaultProps: { + type: Object as PropType, + } + }, + data() { + return { + loading: false, + error: null as UniCloudError | null, + treeData: [] as Array, + selectedIndex: 0, + selectedNodes: [] as Array, + selectedPages: [] as Array[], + selectedValue: '', + selectedPaths: [] as Array, + pagination: { + current: 1, + size: 20, + count: 0 + } as PaginationType + } + }, + computed: { + mappingTextName() : string { + // TODO + return (this.defaultProps != null) ? this.defaultProps!.getString('text', 'text') : 'text' + }, + mappingValueName() : string { + // TODO + return (this.defaultProps != null) ? this.defaultProps!.getString('value', 'value') : 'value' + }, + currentDataList() : Array { + if (this.selectedIndex > this.selectedPages.length - 1) { + return [] as Array + } + return this.selectedPages[this.selectedIndex] + }, + isLocalData() : boolean { + return this.localdata.length > 0 + }, + isCloudData() : boolean { + return this._checkIsNotNull(this.collection) + }, + isCloudDataList() : boolean { + return (this.isCloudData && (this.parentField.length == 0 && this.selfField.length == 0)) + }, + isCloudDataTree() : boolean { + return (this.isCloudData && this.parentField.length > 0 && this.selfField.length > 0) + }, + dataValue() : any { + return this.hasModelValue ? this.modelValue : this.value + }, + hasCloudTreeData() : boolean { + return this.treeData.length > 0 + }, + hasModelValue() : boolean { + if (typeof this.modelValue == 'string') { + const valueString = this.modelValue as string + return (valueString.length > 0) + } else if (Array.isArray(this.modelValue)) { + const valueArray = this.modelValue as Array + return (valueArray.length > 0) + } + return false + }, + hasCloudDataValue() : boolean { + if (typeof this.dataValue == 'string') { + const valueString = this.dataValue as string + return (valueString.length > 0) + } + return false + } + }, + created() { + this.pagination.current = this.pageCurrent + this.pagination.size = this.pageSize + + this.$watch( + () : any => [ + this.pageCurrent, + this.pageSize, + this.localdata, + this.value, + this.collection, + this.field, + this.getcount, + this.orderby, + this.where, + this.groupby, + this.groupField, + this.distinct + ], + (newValue : Array, oldValue : Array) => { + this.pagination.size = this.pageSize + if (newValue[0] !== oldValue[0]) { + this.pagination.current = this.pageCurrent + } + + this.onPropsChange() + } + ) + }, + methods: { + onPropsChange() { + this.selectedIndex = 0 + this.treeData.length = 0 + this.selectedNodes.length = 0 + this.selectedPages.length = 0 + this.selectedPaths.length = 0 + + // 加载数据 + this.$nextTick(() => { + this.loadData() + }) + }, + + onTabSelect(index : number) { + this.selectedIndex = index + }, + + onNodeClick(nodeData : UTSJSONObject) { + if (nodeData.getBoolean('disable', false)) { + return + } + + const isLeaf = this._checkIsLeafNode(nodeData) + + this._trimSelectedNodes(nodeData) + + this.$emit('nodeclick', nodeData) + + if (this.isLocalData) { + if (isLeaf || !this._checkHasChildren(nodeData)) { + this.onFinish() + } + } else if (this.isCloudDataList) { + this.onFinish() + } else if (this.isCloudDataTree) { + if (isLeaf) { + this.onFinish() + } else if (!this._checkHasChildren(nodeData)) { + // 尝试请求一次,如果没有返回数据标记为叶子节点 + this.loadCloudDataNode(nodeData) + } + } + }, + + getChangeNodes(): Array { + const nodes: Array = [] + this.selectedNodes.forEach((node : UTSJSONObject) => { + const newNode: UTSJSONObject = {} + newNode[this.mappingTextName] = node.getString(this.mappingTextName) + newNode[this.mappingValueName] = node.getString(this.mappingValueName) + nodes.push(newNode) + }) + return nodes + }, + + onFinish() { }, + + // 加载数据(自动判定环境) + loadData() { + if (this.isLocalData) { + this.loadLocalData() + } else if (this.isCloudDataList) { + this.loadCloudDataList() + } else if (this.isCloudDataTree) { + this.loadCloudDataTree() + } + }, + + // 加载本地数据 + loadLocalData() { + this.treeData = this.localdata + if (Array.isArray(this.dataValue)) { + const value = this.dataValue as Array + this.selectedPaths = value.slice(0) + this._pushSelectedTreeNodes(value, this.localdata) + } else { + this._pushSelectedNodes(this.localdata) + } + }, + + // 加载 Cloud 数据 (单列) + loadCloudDataList() { + this._loadCloudData(null, (data : Array) => { + this.treeData = data + this._pushSelectedNodes(data) + }) + }, + + // 加载 Cloud 数据 (树形) + loadCloudDataTree() { + let commandOptions = { + field: this._cloudDataPostField(), + where: this._cloudDataTreeWhere(), + getTree: true + } as GetCommandOptions + if (this._checkIsNotNull(this.gettree)) { + commandOptions.startwith = `${this.selfField}=='${this.dataValue as string}'` + } + this._loadCloudData(commandOptions, (data : Array) => { + this.treeData = data + if (this.selectedPaths.length > 0) { + this._pushSelectedTreeNodes(this.selectedPaths, data) + } else { + this._pushSelectedNodes(data) + } + }) + }, + + // 加载 Cloud 数据 (节点) + loadCloudDataNode(nodeData : UTSJSONObject) { + const commandOptions = { + field: this._cloudDataPostField(), + where: this._cloudDataNodeWhere() + } as GetCommandOptions + this._loadCloudData(commandOptions, (data : Array) => { + nodeData['children'] = data + if (data.length == 0) { + nodeData['isleaf'] = true + this.onFinish() + } else { + this._pushSelectedNodes(data) + } + }) + }, + + // 回显 Cloud Tree Path + loadCloudDataPath() { + if (!this.hasCloudDataValue) { + return + } + + const command : GetCommandOptions = {} + + // 单列 + if (this.isCloudDataList) { + // 根据 field's as value标识匹配 where 条件 + let where : Array = []; + let whereField = this._getForeignKeyByField(); + if (whereField.length > 0) { + where.push(`${whereField} == '${this.dataValue as string}'`) + } + + let whereString = where.join(' || ') + if (this._checkIsNotNull(this.where)) { + whereString = `(${this.where}) && (${whereString})` + } + + command.field = this._cloudDataPostField() + command.where = whereString + } + + // 树形 + if (this.isCloudDataTree) { + command.field = this._cloudDataPostField() + command.getTreePath = { + startWith: `${this.selfField}=='${this.dataValue as string}'` + } + } + + this._loadCloudData(command, (data : Array) => { + this._extractTreePath(data, this.selectedPaths) + }) + }, + + _loadCloudData(options ?: GetCommandOptions, callback ?: ((data : Array) => void)) { + if (this.loading) { + return + } + this.loading = true + + this.error = null + + this._getCommand(options).then((response : UniCloudDBGetResult) => { + callback?.(response.data) + }).catch((err : any | null) => { + this.error = err as UniCloudError + }).finally(() => { + this.loading = false + }) + }, + + _cloudDataPostField() : string { + let fields = [this.field]; + if (this.parentField.length > 0) { + fields.push(`${this.parentField} as parent_value`) + } + return fields.join(',') + }, + + _cloudDataTreeWhere() : string { + let result : Array = [] + let selectedNodes = this.selectedNodes.length > 0 ? this.selectedNodes : this.selectedPaths + let parentField = this.parentField + if (parentField.length > 0) { + result.push(`${parentField} == null || ${parentField} == ""`) + } + if (selectedNodes.length > 0) { + for (var i = 0; i < selectedNodes.length - 1; i++) { + const parentFieldValue = selectedNodes[i].getString('value', '') + result.push(`${parentField} == '${parentFieldValue}'`) + } + } + + let where : Array = [] + if (this._checkIsNotNull(this.where)) { + where.push(`(${this.where as string})`) + } + + if (result.length > 0) { + where.push(`(${result.join(' || ')})`) + } + + return where.join(' && ') + }, + + _cloudDataNodeWhere() : string { + const where : Array = [] + if (this.selectedNodes.length > 0) { + const value = this.selectedNodes[this.selectedNodes.length - 1].getString('value', '') + where.push(`${this.parentField} == '${value}'`) + } + + let whereString = where.join(' || ') + if (this._checkIsNotNull(this.where)) { + return `(${this.where as string}) && (${whereString})` + } + + return whereString + }, + + _getWhereByForeignKey() : string { + let result : Array = [] + let whereField = this._getForeignKeyByField(); + if (whereField.length > 0) { + result.push(`${whereField} == '${this.dataValue as string}'`) + } + + if (this._checkIsNotNull(this.where)) { + return `(${this.where}) && (${result.join(' || ')})` + } + + return result.join(' || ') + }, + + _getForeignKeyByField() : string { + const fields = this.field.split(',') + let whereField = '' + for (let i = 0; i < fields.length; i++) { + const items = fields[i].split('as') + if (items.length < 2) { + continue + } + if (items[1].trim() === 'value') { + whereField = items[0].trim() + break + } + } + return whereField + }, + + _getCommand(options ?: GetCommandOptions) : Promise { + let db = uniCloud.databaseForJQL() + + let collection = Array.isArray(this.collection) ? db.collection(...(this.collection as Array)) : db.collection(this.collection) + + let filter : UniCloudDBFilter | null = null + if (this.foreignKey.length > 0) { + filter = collection.foreignKey(this.foreignKey) + } + + const where : any = options?.where ?? this.where + if (typeof where == 'string') { + const whereString = where as string + if (whereString.length > 0) { + filter = (filter != null) ? filter.where(where) : collection.where(where) + } + } else { + filter = (filter != null) ? filter.where(where) : collection.where(where) + } + + let query : UniCloudDBQuery | null = null + if (this.field.length > 0) { + query = (filter != null) ? filter.field(this.field) : collection.field(this.field) + } + if (this.groupby.length > 0) { + if (query != null) { + query = query.groupBy(this.groupby) + } else if (filter != null) { + query = filter.groupBy(this.groupby) + } + } + if (this.groupField.length > 0) { + if (query != null) { + query = query.groupField(this.groupField) + } else if (filter != null) { + query = filter.groupField(this.groupField) + } + } + if (this.distinct == true) { + if (query != null) { + query = query.distinct(this.field) + } else if (filter != null) { + query = filter.distinct(this.field) + } + } + if (this.orderby.length > 0) { + if (query != null) { + query = query.orderBy(this.orderby) + } else if (filter != null) { + query = filter.orderBy(this.orderby) + } + } + + const size = this.pagination.size + const current = this.pagination.current + if (query != null) { + query = query.skip(size * (current - 1)).limit(size) + } else if (filter != null) { + query = filter.skip(size * (current - 1)).limit(size) + } else { + query = collection.skip(size * (current - 1)).limit(size) + } + + const getOptions = {} + const treeOptions = { + limitLevel: this.limitlevel, + startWith: this.startwith + } + if (this.getcount == true) { + getOptions['getCount'] = this.getcount + } + + const getTree : any = options?.getTree ?? this.gettree + if (typeof getTree == 'string') { + const getTreeString = getTree as string + if (getTreeString.length > 0) { + getOptions['getTree'] = treeOptions + } + } else if (typeof getTree == 'object') { + getOptions['getTree'] = treeOptions + } else { + getOptions['getTree'] = getTree + } + + const getTreePath = options?.getTreePath ?? this.gettreepath + if (typeof getTreePath == 'string') { + const getTreePathString = getTreePath as string + if (getTreePathString.length > 0) { + getOptions['getTreePath'] = getTreePath + } + } else { + getOptions['getTreePath'] = getTreePath + } + + return query.get(getOptions) + }, + + _checkIsNotNull(value : any) : boolean { + if (typeof value == 'string') { + const valueString = value as string + return (valueString.length > 0) + } else if (value instanceof UTSJSONObject) { + return true + } + return false + }, + + _checkIsLeafNode(nodeData : UTSJSONObject) : boolean { + if (this.selectedIndex >= this.limitlevel) { + return true + } + + if (nodeData.getBoolean('isleaf', false)) { + return true + } + + return false + }, + + _checkHasChildren(nodeData : UTSJSONObject) : boolean { + const children = nodeData.getArray('children') ?? ([] as Array) + return children.length > 0 + }, + + _pushSelectedNodes(nodes : Array) { + this.selectedNodes.push(DefaultSelectedNode) + this.selectedPages.push(nodes) + this.selectedIndex = this.selectedPages.length - 1 + }, + + _trimSelectedNodes(nodeData : UTSJSONObject) { + this.selectedNodes.splice(this.selectedIndex) + this.selectedNodes.push(nodeData) + + if (this.selectedPages.length > 0) { + this.selectedPages.splice(this.selectedIndex + 1) + } + + const children = nodeData.getArray('children') ?? ([] as Array) + if (children.length > 0) { + this.selectedNodes.push(DefaultSelectedNode) + this.selectedPages.push(children) + } + + this.selectedIndex = this.selectedPages.length - 1 + }, + + _pushSelectedTreeNodes(paths : Array, nodes : Array) { + let children : Array = nodes + paths.forEach((node : UTSJSONObject) => { + const findNode = children.find((item : UTSJSONObject) : boolean => { + return (item.getString(this.mappingValueName) == node.getString(this.mappingValueName)) + }) + if (findNode != null) { + this.selectedPages.push(children) + this.selectedNodes.push(node) + children = findNode.getArray('children') ?? ([] as Array) + } + }) + this.selectedIndex = this.selectedPages.length - 1 + }, + + _extractTreePath(nodes : Array, result : Array) { + if (nodes.length == 0) { + return + } + + const node = nodes[0] + result.push(node) + + const children = node.getArray('children') + if (Array.isArray(children) && children!.length > 0) { + this._extractTreePath(children, result) + } + } + } +}) diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css new file mode 100644 index 0000000..39fe1c3 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css @@ -0,0 +1,76 @@ +.uni-data-pickerview { + position: relative; + flex-direction: column; + overflow: hidden; +} + +.loading-cover { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + align-items: center; + justify-content: center; + background-color: rgba(150, 150, 150, .1); +} + +.error { + background-color: #fff; + padding: 15px; +} + +.error-text { + color: #DD524D; +} + +.selected-node-list { + flex-direction: row; + flex-wrap: nowrap; +} + +.selected-node-item { + margin-left: 10px; + margin-right: 10px; + padding: 8px 10px 8px 10px; + border-bottom: 2px solid transparent; +} + +.selected-node-item-active { + color: #007aff; + border-bottom-color: #007aff; +} + +.list-view { + flex: 1; +} + +.list-item { + flex-direction: row; + justify-content: space-between; + padding: 12px 15px; + border-bottom: 1px solid #f0f0f0; +} + +.item-text { + color: #333333; +} + +.item-text-disabled { + opacity: .5; +} + +.item-text-overflow { + overflow: hidden; +} + +.check { + margin-right: 5px; + border: 2px solid #007aff; + border-left: 0; + border-top: 0; + height: 12px; + width: 6px; + transform-origin: center; + transform: rotate(45deg); +} diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue new file mode 100644 index 0000000..f4780f3 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue @@ -0,0 +1,69 @@ + + + + + diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue new file mode 100644 index 0000000..6ebced9 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue @@ -0,0 +1,323 @@ + + + + + diff --git a/uni_modules/uni-data-picker/package.json b/uni_modules/uni-data-picker/package.json new file mode 100644 index 0000000..a508162 --- /dev/null +++ b/uni_modules/uni-data-picker/package.json @@ -0,0 +1,91 @@ +{ + "id": "uni-data-picker", + "displayName": "uni-data-picker 数据驱动的picker选择器", + "version": "2.0.0", + "description": "单列、多列级联选择器,常用于省市区城市选择、公司部门选择、多级分类等场景", + "keywords": [ + "uni-ui", + "uniui", + "picker", + "级联", + "省市区", + "" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [ + "uni-load-more", + "uni-icons", + "uni-scss" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y", + "app-uvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-data-picker/readme.md b/uni_modules/uni-data-picker/readme.md new file mode 100644 index 0000000..19dd0e8 --- /dev/null +++ b/uni_modules/uni-data-picker/readme.md @@ -0,0 +1,22 @@ +## DataPicker 级联选择 +> **组件名:uni-data-picker** +> 代码块: `uDataPicker` +> 关联组件:`uni-data-pickerview`、`uni-load-more`。 + + +`` 是一个选择类[datacom组件](https://uniapp.dcloud.net.cn/component/datacom)。 + +支持单列、和多列级联选择。列数没有限制,如果屏幕显示不全,顶部tab区域会左右滚动。 + +候选数据支持一次性加载完毕,也支持懒加载,比如示例图中,选择了“北京”后,动态加载北京的区县数据。 + +`` 组件尤其适用于地址选择、分类选择等选择类。 + +`` 支持本地数据、云端静态数据(json),uniCloud云数据库数据。 + +`` 可以通过JQL直连uniCloud云数据库,配套[DB Schema](https://uniapp.dcloud.net.cn/uniCloud/schema),可在schema2code中自动生成前端页面,还支持服务器端校验。 + +在uniCloud数据表中新建表“uni-id-address”和“opendb-city-china”,这2个表的schema自带foreignKey关联。在“uni-id-address”表的表结构页面使用schema2code生成前端页面,会自动生成地址管理的维护页面,自动从“opendb-city-china”表包含的中国所有省市区信息里选择地址。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-picker) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-data-select/changelog.md b/uni_modules/uni-data-select/changelog.md new file mode 100644 index 0000000..016e3d2 --- /dev/null +++ b/uni_modules/uni-data-select/changelog.md @@ -0,0 +1,39 @@ +## 1.0.8(2024-03-28) +- 修复 在vue2下:style动态绑定导致编译失败的bug +## 1.0.7(2024-01-20) +- 修复 长文本回显超过容器的bug,超过容器部分显示省略号 +## 1.0.6(2023-04-12) +- 修复 微信小程序点击时会改变背景颜色的 bug +## 1.0.5(2023-02-03) +- 修复 禁用时会显示清空按钮 +## 1.0.4(2023-02-02) +- 优化 查询条件短期内多次变更只查询最后一次变更后的结果 +- 调整 内部缓存键名调整为 uni-data-select-lastSelectedValue +## 1.0.3(2023-01-16) +- 修复 不关联服务空间报错的问题 +## 1.0.2(2023-01-14) +- 新增 属性 `format` 可用于格式化显示选项内容 +## 1.0.1(2022-12-06) +- 修复 当where变化时,数据不会自动更新的问题 +## 0.1.9(2022-09-05) +- 修复 微信小程序下拉框出现后选择会点击到蒙板后面的输入框 +## 0.1.8(2022-08-29) +- 修复 点击的位置不准确 +## 0.1.7(2022-08-12) +- 新增 支持 disabled 属性 +## 0.1.6(2022-07-06) +- 修复 pc端宽度异常的bug +## 0.1.5 +- 修复 pc端宽度异常的bug +## 0.1.4(2022-07-05) +- 优化 显示样式 +## 0.1.3(2022-06-02) +- 修复 localdata 赋值不生效的 bug +- 新增 支持 uni.scss 修改颜色 +- 新增 支持选项禁用(数据选项设置 disabled: true 即禁用) +## 0.1.2(2022-05-08) +- 修复 当 value 为 0 时选择不生效的 bug +## 0.1.1(2022-05-07) +- 新增 记住上次的选项(仅 collection 存在时有效) +## 0.1.0(2022-04-22) +- 初始化 diff --git a/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue new file mode 100644 index 0000000..edab65a --- /dev/null +++ b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue @@ -0,0 +1,562 @@ + + + + + diff --git a/uni_modules/uni-data-select/package.json b/uni_modules/uni-data-select/package.json new file mode 100644 index 0000000..5864594 --- /dev/null +++ b/uni_modules/uni-data-select/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-data-select", + "displayName": "uni-data-select 下拉框选择器", + "version": "1.0.8", + "description": "通过数据驱动的下拉框选择器", + "keywords": [ + "uni-ui", + "select", + "uni-data-select", + "下拉框", + "下拉选" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.1" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-load-more"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "u", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-data-select/readme.md b/uni_modules/uni-data-select/readme.md new file mode 100644 index 0000000..eb58de3 --- /dev/null +++ b/uni_modules/uni-data-select/readme.md @@ -0,0 +1,8 @@ +## DataSelect 下拉框选择器 +> **组件名:uni-data-select** +> 代码块: `uDataSelect` + +当选项过多时,使用下拉菜单展示并选择内容 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-select) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-dateformat/changelog.md b/uni_modules/uni-dateformat/changelog.md new file mode 100644 index 0000000..d551d7b --- /dev/null +++ b/uni_modules/uni-dateformat/changelog.md @@ -0,0 +1,10 @@ +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-dateformat](https://uniapp.dcloud.io/component/uniui/uni-dateformat) +## 0.0.5(2021-07-08) +- 调整 默认时间不再是当前时间,而是显示'-'字符 +## 0.0.4(2021-05-12) +- 新增 组件示例地址 +## 0.0.3(2021-02-04) +- 调整为uni_modules目录规范 +- 修复 iOS 平台日期格式化出错的问题 diff --git a/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js b/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js new file mode 100644 index 0000000..e00d559 --- /dev/null +++ b/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js @@ -0,0 +1,200 @@ +// yyyy-MM-dd hh:mm:ss.SSS 所有支持的类型 +function pad(str, length = 2) { + str += '' + while (str.length < length) { + str = '0' + str + } + return str.slice(-length) +} + +const parser = { + yyyy: (dateObj) => { + return pad(dateObj.year, 4) + }, + yy: (dateObj) => { + return pad(dateObj.year) + }, + MM: (dateObj) => { + return pad(dateObj.month) + }, + M: (dateObj) => { + return dateObj.month + }, + dd: (dateObj) => { + return pad(dateObj.day) + }, + d: (dateObj) => { + return dateObj.day + }, + hh: (dateObj) => { + return pad(dateObj.hour) + }, + h: (dateObj) => { + return dateObj.hour + }, + mm: (dateObj) => { + return pad(dateObj.minute) + }, + m: (dateObj) => { + return dateObj.minute + }, + ss: (dateObj) => { + return pad(dateObj.second) + }, + s: (dateObj) => { + return dateObj.second + }, + SSS: (dateObj) => { + return pad(dateObj.millisecond, 3) + }, + S: (dateObj) => { + return dateObj.millisecond + }, +} + +// 这都n年了iOS依然不认识2020-12-12,需要转换为2020/12/12 +function getDate(time) { + if (time instanceof Date) { + return time + } + switch (typeof time) { + case 'string': + { + // 2020-12-12T12:12:12.000Z、2020-12-12T12:12:12.000 + if (time.indexOf('T') > -1) { + return new Date(time) + } + return new Date(time.replace(/-/g, '/')) + } + default: + return new Date(time) + } +} + +export function formatDate(date, format = 'yyyy/MM/dd hh:mm:ss') { + if (!date && date !== 0) { + return '' + } + date = getDate(date) + const dateObj = { + year: date.getFullYear(), + month: date.getMonth() + 1, + day: date.getDate(), + hour: date.getHours(), + minute: date.getMinutes(), + second: date.getSeconds(), + millisecond: date.getMilliseconds() + } + const tokenRegExp = /yyyy|yy|MM|M|dd|d|hh|h|mm|m|ss|s|SSS|SS|S/ + let flag = true + let result = format + while (flag) { + flag = false + result = result.replace(tokenRegExp, function(matched) { + flag = true + return parser[matched](dateObj) + }) + } + return result +} + +export function friendlyDate(time, { + locale = 'zh', + threshold = [60000, 3600000], + format = 'yyyy/MM/dd hh:mm:ss' +}) { + if (time === '-') { + return time + } + if (!time && time !== 0) { + return '' + } + const localeText = { + zh: { + year: '年', + month: '月', + day: '天', + hour: '小时', + minute: '分钟', + second: '秒', + ago: '前', + later: '后', + justNow: '刚刚', + soon: '马上', + template: '{num}{unit}{suffix}' + }, + en: { + year: 'year', + month: 'month', + day: 'day', + hour: 'hour', + minute: 'minute', + second: 'second', + ago: 'ago', + later: 'later', + justNow: 'just now', + soon: 'soon', + template: '{num} {unit} {suffix}' + } + } + const text = localeText[locale] || localeText.zh + let date = getDate(time) + let ms = date.getTime() - Date.now() + let absMs = Math.abs(ms) + if (absMs < threshold[0]) { + return ms < 0 ? text.justNow : text.soon + } + if (absMs >= threshold[1]) { + return formatDate(date, format) + } + let num + let unit + let suffix = text.later + if (ms < 0) { + suffix = text.ago + ms = -ms + } + const seconds = Math.floor((ms) / 1000) + const minutes = Math.floor(seconds / 60) + const hours = Math.floor(minutes / 60) + const days = Math.floor(hours / 24) + const months = Math.floor(days / 30) + const years = Math.floor(months / 12) + switch (true) { + case years > 0: + num = years + unit = text.year + break + case months > 0: + num = months + unit = text.month + break + case days > 0: + num = days + unit = text.day + break + case hours > 0: + num = hours + unit = text.hour + break + case minutes > 0: + num = minutes + unit = text.minute + break + default: + num = seconds + unit = text.second + break + } + + if (locale === 'en') { + if (num === 1) { + num = 'a' + } else { + unit += 's' + } + } + + return text.template.replace(/{\s*num\s*}/g, num + '').replace(/{\s*unit\s*}/g, unit).replace(/{\s*suffix\s*}/g, + suffix) +} diff --git a/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue b/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue new file mode 100644 index 0000000..c5ed030 --- /dev/null +++ b/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/uni_modules/uni-dateformat/package.json b/uni_modules/uni-dateformat/package.json new file mode 100644 index 0000000..786a670 --- /dev/null +++ b/uni_modules/uni-dateformat/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-dateformat", + "displayName": "uni-dateformat 日期格式化", + "version": "1.0.0", + "description": "日期格式化组件,可以将日期格式化为1分钟前、刚刚等形式", + "keywords": [ + "uni-ui", + "uniui", + "日期格式化", + "时间格式化", + "格式化时间", + "" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-dateformat/readme.md b/uni_modules/uni-dateformat/readme.md new file mode 100644 index 0000000..37ddb6e --- /dev/null +++ b/uni_modules/uni-dateformat/readme.md @@ -0,0 +1,11 @@ + + +### DateFormat 日期格式化 +> **组件名:uni-dateformat** +> 代码块: `uDateformat` + + +日期格式化组件。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-dateformat) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/changelog.md b/uni_modules/uni-datetime-picker/changelog.md new file mode 100644 index 0000000..8798e93 --- /dev/null +++ b/uni_modules/uni-datetime-picker/changelog.md @@ -0,0 +1,160 @@ +## 2.2.34(2024-04-24) +- 新增 日期点击事件,在点击日期时会触发该事件。 +## 2.2.33(2024-04-15) +- 修复 抖音小程序事件传递失效bug +## 2.2.32(2024-02-20) +- 修复 日历的close事件触发异常的bug [详情](https://github.com/dcloudio/uni-ui/issues/844) +## 2.2.31(2024-02-20) +- 修复 h5平台 右边日历的月份默认+1的bug [详情](https://github.com/dcloudio/uni-ui/issues/841) +## 2.2.30(2024-01-31) +- 修复 隐藏“秒”时,在IOS15及以下版本时出现 结束时间在开始时间之前 的bug [详情](https://github.com/dcloudio/uni-ui/issues/788) +## 2.2.29(2024-01-20) +- 新增 show事件,弹窗弹出时触发该事件 [详情](https://github.com/dcloudio/uni-app/issues/4694) +## 2.2.28(2024-01-18) +- 去除 noChange事件,当进行日期范围选择时,若只选了一天,则开始结束日期都为同一天 [详情](https://github.com/dcloudio/uni-ui/issues/815) +## 2.2.27(2024-01-10) +- 优化 增加noChange事件,当进行日期范围选择时,若有空值,则触发该事件 [详情](https://github.com/dcloudio/uni-ui/issues/815) +## 2.2.26(2024-01-08) +- 修复 字节小程序时间选择范围器失效问题 [详情](https://github.com/dcloudio/uni-ui/issues/834) +## 2.2.25(2023-10-18) +- 修复 PC端初次修改时间,开始时间未更新的Bug [详情](https://github.com/dcloudio/uni-ui/issues/737) +## 2.2.24(2023-06-02) +- 修复 部分情况修改时间,开始、结束时间显示异常的Bug [详情](https://ask.dcloud.net.cn/question/171146) +- 优化 当前月可以选择上月、下月的日期的Bug +## 2.2.23(2023-05-02) +- 修复 部分情况修改时间,开始时间未更新的Bug [详情](https://github.com/dcloudio/uni-ui/issues/737) +- 修复 部分平台及设备第一次点击无法显示弹框的Bug +- 修复 ios 日期格式未补零显示及使用异常的Bug [详情](https://ask.dcloud.net.cn/question/162979) +## 2.2.22(2023-03-30) +- 修复 日历 picker 修改年月后,自动选中当月1日的Bug [详情](https://ask.dcloud.net.cn/question/165937) +- 修复 小程序端 低版本 ios NaN的Bug [详情](https://ask.dcloud.net.cn/question/162979) +## 2.2.21(2023-02-20) +- 修复 firefox 浏览器显示区域点击无法拉起日历弹框的Bug [详情](https://ask.dcloud.net.cn/question/163362) +## 2.2.20(2023-02-17) +- 优化 值为空依然选中当天问题 +- 优化 提供 default-value 属性支持配置选择器打开时默认显示的时间 +- 优化 非范围选择未选择日期时间,点击确认按钮选中当前日期时间 +- 优化 字节小程序日期时间范围选择,底部日期换行的Bug +## 2.2.19(2023-02-09) +- 修复 2.2.18 引起范围选择配置 end 选择无效的Bug [详情](https://github.com/dcloudio/uni-ui/issues/686) +## 2.2.18(2023-02-08) +- 修复 移动端范围选择change事件触发异常的Bug [详情](https://github.com/dcloudio/uni-ui/issues/684) +- 优化 PC端输入日期格式错误时返回当前日期时间 +- 优化 PC端输入日期时间超出 start、end 限制的Bug +- 优化 移动端日期时间范围用法时间展示不完整问题 +## 2.2.17(2023-02-04) +- 修复 小程序端绑定 Date 类型报错的Bug [详情](https://github.com/dcloudio/uni-ui/issues/679) +- 修复 vue3 time-picker 无法显示绑定时分秒的Bug +## 2.2.16(2023-02-02) +- 修复 字节小程序报错的Bug +## 2.2.15(2023-02-02) +- 修复 某些情况切换月份错误的Bug +## 2.2.14(2023-01-30) +- 修复 某些情况切换月份错误的Bug [详情](https://ask.dcloud.net.cn/question/162033) +## 2.2.13(2023-01-10) +- 修复 多次加载组件造成内存占用的Bug +## 2.2.12(2022-12-01) +- 修复 vue3 下 i18n 国际化初始值不正确的Bug +## 2.2.11(2022-09-19) +- 修复 支付宝小程序样式错乱的Bug [详情](https://github.com/dcloudio/uni-app/issues/3861) +## 2.2.10(2022-09-19) +- 修复 反向选择日期范围,日期显示异常的Bug [详情](https://ask.dcloud.net.cn/question/153401?item_id=212892&rf=false) +## 2.2.9(2022-09-16) +- 可以使用 uni-scss 控制主题色 +## 2.2.8(2022-09-08) +- 修复 close事件无效的Bug +## 2.2.7(2022-09-05) +- 修复 移动端 maskClick 无效的Bug [详情](https://ask.dcloud.net.cn/question/140824) +## 2.2.6(2022-06-30) +- 优化 组件样式,调整了组件图标大小、高度、颜色等,与uni-ui风格保持一致 +## 2.2.5(2022-06-24) +- 修复 日历顶部年月及底部确认未国际化的Bug +## 2.2.4(2022-03-31) +- 修复 Vue3 下动态赋值,单选类型未响应的Bug +## 2.2.3(2022-03-28) +- 修复 Vue3 下动态赋值未响应的Bug +## 2.2.2(2021-12-10) +- 修复 clear-icon 属性在小程序平台不生效的Bug +## 2.2.1(2021-12-10) +- 修复 日期范围选在小程序平台,必须多点击一次才能取消选中状态的Bug +## 2.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源 [详情](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移 [https://uniapp.dcloud.io/component/uniui/uni-datetime-picker](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker) +## 2.1.5(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 2.1.4(2021-09-10) +- 修复 hide-second 在移动端的Bug +- 修复 单选赋默认值时,赋值日期未高亮的Bug +- 修复 赋默认值时,移动端未正确显示时间的Bug +## 2.1.3(2021-09-09) +- 新增 hide-second 属性,支持只使用时分,隐藏秒 +## 2.1.2(2021-09-03) +- 优化 取消选中时(范围选)直接开始下一次选择, 避免多点一次 +- 优化 移动端支持清除按钮,同时支持通过 ref 调用组件的 clear 方法 +- 优化 调整字号大小,美化日历界面 +- 修复 因国际化导致的 placeholder 失效的Bug +## 2.1.1(2021-08-24) +- 新增 支持国际化 +- 优化 范围选择器在 pc 端过宽的问题 +## 2.1.0(2021-08-09) +- 新增 适配 vue3 +## 2.0.19(2021-08-09) +- 新增 支持作为 uni-forms 子组件相关功能 +- 修复 在 uni-forms 中使用时,选择时间报 NAN 错误的Bug +## 2.0.18(2021-08-05) +- 修复 type 属性动态赋值无效的Bug +- 修复 ‘确认’按钮被 tabbar 遮盖 bug +- 修复 组件未赋值时范围选左、右日历相同的Bug +## 2.0.17(2021-08-04) +- 修复 范围选未正确显示当前值的Bug +- 修复 h5 平台(移动端)报错 'cale' of undefined 的Bug +## 2.0.16(2021-07-21) +- 新增 return-type 属性支持返回 date 日期对象 +## 2.0.15(2021-07-14) +- 修复 单选日期类型,初始赋值后不在当前日历的Bug +- 新增 clearIcon 属性,显示框的清空按钮可配置显示隐藏(仅 pc 有效) +- 优化 移动端移除显示框的清空按钮,无实际用途 +## 2.0.14(2021-07-14) +- 修复 组件赋值为空,界面未更新的Bug +- 修复 start 和 end 不能动态赋值的Bug +- 修复 范围选类型,用户选择后再次选择右侧日历(结束日期)显示不正确的Bug +## 2.0.13(2021-07-08) +- 修复 范围选择不能动态赋值的Bug +## 2.0.12(2021-07-08) +- 修复 范围选择的初始时间在一个月内时,造成无法选择的bug +## 2.0.11(2021-07-08) +- 优化 弹出层在超出视窗边缘定位不准确的问题 +## 2.0.10(2021-07-08) +- 修复 范围起始点样式的背景色与今日样式的字体前景色融合,导致日期字体看不清的Bug +- 优化 弹出层在超出视窗边缘被遮盖的问题 +## 2.0.9(2021-07-07) +- 新增 maskClick 事件 +- 修复 特殊情况日历 rpx 布局错误的Bug,rpx -> px +- 修复 范围选择时清空返回值不合理的bug,['', ''] -> [] +## 2.0.8(2021-07-07) +- 新增 日期时间显示框支持插槽 +## 2.0.7(2021-07-01) +- 优化 添加 uni-icons 依赖 +## 2.0.6(2021-05-22) +- 修复 图标在小程序上不显示的Bug +- 优化 重命名引用组件,避免潜在组件命名冲突 +## 2.0.5(2021-05-20) +- 优化 代码目录扁平化 +## 2.0.4(2021-05-12) +- 新增 组件示例地址 +## 2.0.3(2021-05-10) +- 修复 ios 下不识别 '-' 日期格式的Bug +- 优化 pc 下弹出层添加边框和阴影 +## 2.0.2(2021-05-08) +- 修复 在 admin 中获取弹出层定位错误的bug +## 2.0.1(2021-05-08) +- 修复 type 属性向下兼容,默认值从 date 变更为 datetime +## 2.0.0(2021-04-30) +- 支持日历形式的日期+时间的范围选择 + > 注意:此版本不向后兼容,不再支持单独时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker) +## 1.0.6(2021-03-18) +- 新增 hide-second 属性,时间支持仅选择时、分 +- 修复 选择跟显示的日期不一样的Bug +- 修复 chang事件触发2次的Bug +- 修复 分、秒 end 范围错误的Bug +- 优化 更好的 nvue 适配 diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue new file mode 100644 index 0000000..dba9887 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue new file mode 100644 index 0000000..0f9e121 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue @@ -0,0 +1,947 @@ + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json new file mode 100644 index 0000000..024f22f --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json @@ -0,0 +1,22 @@ +{ + "uni-datetime-picker.selectDate": "select date", + "uni-datetime-picker.selectTime": "select time", + "uni-datetime-picker.selectDateTime": "select date and time", + "uni-datetime-picker.startDate": "start date", + "uni-datetime-picker.endDate": "end date", + "uni-datetime-picker.startTime": "start time", + "uni-datetime-picker.endTime": "end time", + "uni-datetime-picker.ok": "ok", + "uni-datetime-picker.clear": "clear", + "uni-datetime-picker.cancel": "cancel", + "uni-datetime-picker.year": "-", + "uni-datetime-picker.month": "", + "uni-calender.MON": "MON", + "uni-calender.TUE": "TUE", + "uni-calender.WED": "WED", + "uni-calender.THU": "THU", + "uni-calender.FRI": "FRI", + "uni-calender.SAT": "SAT", + "uni-calender.SUN": "SUN", + "uni-calender.confirm": "confirm" +} diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json new file mode 100644 index 0000000..d2df5e7 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json @@ -0,0 +1,22 @@ +{ + "uni-datetime-picker.selectDate": "选择日期", + "uni-datetime-picker.selectTime": "选择时间", + "uni-datetime-picker.selectDateTime": "选择日期时间", + "uni-datetime-picker.startDate": "开始日期", + "uni-datetime-picker.endDate": "结束日期", + "uni-datetime-picker.startTime": "开始时间", + "uni-datetime-picker.endTime": "结束时间", + "uni-datetime-picker.ok": "确定", + "uni-datetime-picker.clear": "清除", + "uni-datetime-picker.cancel": "取消", + "uni-datetime-picker.year": "年", + "uni-datetime-picker.month": "月", + "uni-calender.SUN": "日", + "uni-calender.MON": "一", + "uni-calender.TUE": "二", + "uni-calender.WED": "三", + "uni-calender.THU": "四", + "uni-calender.FRI": "五", + "uni-calender.SAT": "六", + "uni-calender.confirm": "确认" +} \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json new file mode 100644 index 0000000..d23fa3c --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json @@ -0,0 +1,22 @@ +{ + "uni-datetime-picker.selectDate": "選擇日期", + "uni-datetime-picker.selectTime": "選擇時間", + "uni-datetime-picker.selectDateTime": "選擇日期時間", + "uni-datetime-picker.startDate": "開始日期", + "uni-datetime-picker.endDate": "結束日期", + "uni-datetime-picker.startTime": "開始时间", + "uni-datetime-picker.endTime": "結束时间", + "uni-datetime-picker.ok": "確定", + "uni-datetime-picker.clear": "清除", + "uni-datetime-picker.cancel": "取消", + "uni-datetime-picker.year": "年", + "uni-datetime-picker.month": "月", + "uni-calender.SUN": "日", + "uni-calender.MON": "一", + "uni-calender.TUE": "二", + "uni-calender.WED": "三", + "uni-calender.THU": "四", + "uni-calender.FRI": "五", + "uni-calender.SAT": "六", + "uni-calender.confirm": "確認" +} \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue new file mode 100644 index 0000000..1817692 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue @@ -0,0 +1,940 @@ + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue new file mode 100644 index 0000000..11fc45a --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue @@ -0,0 +1,1057 @@ + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js new file mode 100644 index 0000000..01802fa --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js @@ -0,0 +1,421 @@ +class Calendar { + constructor({ + selected, + startDate, + endDate, + range, + } = {}) { + // 当前日期 + this.date = this.getDateObj(new Date()) // 当前初入日期 + // 打点信息 + this.selected = selected || []; + // 起始时间 + this.startDate = startDate + // 终止时间 + this.endDate = endDate + // 是否范围选择 + this.range = range + // 多选状态 + this.cleanMultipleStatus() + // 每周日期 + this.weeks = {} + this.lastHover = false + } + /** + * 设置日期 + * @param {Object} date + */ + setDate(date) { + const selectDate = this.getDateObj(date) + this.getWeeks(selectDate.fullDate) + } + + /** + * 清理多选状态 + */ + cleanMultipleStatus() { + this.multipleStatus = { + before: '', + after: '', + data: [] + } + } + + setStartDate(startDate) { + this.startDate = startDate + } + + setEndDate(endDate) { + this.endDate = endDate + } + + getPreMonthObj(date) { + date = fixIosDateFormat(date) + date = new Date(date) + + const oldMonth = date.getMonth() + date.setMonth(oldMonth - 1) + const newMonth = date.getMonth() + if (oldMonth !== 0 && newMonth - oldMonth === 0) { + date.setMonth(newMonth - 1) + } + return this.getDateObj(date) + } + getNextMonthObj(date) { + date = fixIosDateFormat(date) + date = new Date(date) + + const oldMonth = date.getMonth() + date.setMonth(oldMonth + 1) + const newMonth = date.getMonth() + if (newMonth - oldMonth > 1) { + date.setMonth(newMonth - 1) + } + return this.getDateObj(date) + } + + /** + * 获取指定格式Date对象 + */ + getDateObj(date) { + date = fixIosDateFormat(date) + date = new Date(date) + + return { + fullDate: getDate(date), + year: date.getFullYear(), + month: addZero(date.getMonth() + 1), + date: addZero(date.getDate()), + day: date.getDay() + } + } + + /** + * 获取上一个月日期集合 + */ + getPreMonthDays(amount, dateObj) { + const result = [] + for (let i = amount - 1; i >= 0; i--) { + const month = dateObj.month - 1 + result.push({ + date: new Date(dateObj.year, month, -i).getDate(), + month, + disable: true + }) + } + return result + } + /** + * 获取本月日期集合 + */ + getCurrentMonthDays(amount, dateObj) { + const result = [] + const fullDate = this.date.fullDate + for (let i = 1; i <= amount; i++) { + const currentDate = `${dateObj.year}-${dateObj.month}-${addZero(i)}` + const isToday = fullDate === currentDate + // 获取打点信息 + const info = this.selected && this.selected.find((item) => { + if (this.dateEqual(currentDate, item.date)) { + return item + } + }) + + // 日期禁用 + let disableBefore = true + let disableAfter = true + if (this.startDate) { + disableBefore = dateCompare(this.startDate, currentDate) + } + + if (this.endDate) { + disableAfter = dateCompare(currentDate, this.endDate) + } + + let multiples = this.multipleStatus.data + let multiplesStatus = -1 + if (this.range && multiples) { + multiplesStatus = multiples.findIndex((item) => { + return this.dateEqual(item, currentDate) + }) + } + const checked = multiplesStatus !== -1 + + result.push({ + fullDate: currentDate, + year: dateObj.year, + date: i, + multiple: this.range ? checked : false, + beforeMultiple: this.isLogicBefore(currentDate, this.multipleStatus.before, this.multipleStatus.after), + afterMultiple: this.isLogicAfter(currentDate, this.multipleStatus.before, this.multipleStatus.after), + month: dateObj.month, + disable: (this.startDate && !dateCompare(this.startDate, currentDate)) || (this.endDate && !dateCompare( + currentDate, this.endDate)), + isToday, + userChecked: false, + extraInfo: info + }) + } + return result + } + /** + * 获取下一个月日期集合 + */ + _getNextMonthDays(amount, dateObj) { + const result = [] + const month = dateObj.month + 1 + for (let i = 1; i <= amount; i++) { + result.push({ + date: i, + month, + disable: true + }) + } + return result + } + + /** + * 获取当前日期详情 + * @param {Object} date + */ + getInfo(date) { + if (!date) { + date = new Date() + } + + return this.calendar.find(item => item.fullDate === this.getDateObj(date).fullDate) + } + + /** + * 比较时间是否相等 + */ + dateEqual(before, after) { + before = new Date(fixIosDateFormat(before)) + after = new Date(fixIosDateFormat(after)) + return before.valueOf() === after.valueOf() + } + + /** + * 比较真实起始日期 + */ + + isLogicBefore(currentDate, before, after) { + let logicBefore = before + if (before && after) { + logicBefore = dateCompare(before, after) ? before : after + } + return this.dateEqual(logicBefore, currentDate) + } + + isLogicAfter(currentDate, before, after) { + let logicAfter = after + if (before && after) { + logicAfter = dateCompare(before, after) ? after : before + } + return this.dateEqual(logicAfter, currentDate) + } + + /** + * 获取日期范围内所有日期 + * @param {Object} begin + * @param {Object} end + */ + geDateAll(begin, end) { + var arr = [] + var ab = begin.split('-') + var ae = end.split('-') + var db = new Date() + db.setFullYear(ab[0], ab[1] - 1, ab[2]) + var de = new Date() + de.setFullYear(ae[0], ae[1] - 1, ae[2]) + var unixDb = db.getTime() - 24 * 60 * 60 * 1000 + var unixDe = de.getTime() - 24 * 60 * 60 * 1000 + for (var k = unixDb; k <= unixDe;) { + k = k + 24 * 60 * 60 * 1000 + arr.push(this.getDateObj(new Date(parseInt(k))).fullDate) + } + return arr + } + + /** + * 获取多选状态 + */ + setMultiple(fullDate) { + if (!this.range) return + + let { + before, + after + } = this.multipleStatus + if (before && after) { + if (!this.lastHover) { + this.lastHover = true + return + } + this.multipleStatus.before = fullDate + this.multipleStatus.after = '' + this.multipleStatus.data = [] + this.multipleStatus.fulldate = '' + this.lastHover = false + } else { + if (!before) { + this.multipleStatus.before = fullDate + this.multipleStatus.after = undefined; + this.lastHover = false + } else { + this.multipleStatus.after = fullDate + if (dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus + .after); + } else { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus + .before); + } + this.lastHover = true + } + } + this.getWeeks(fullDate) + } + + /** + * 鼠标 hover 更新多选状态 + */ + setHoverMultiple(fullDate) { + //抖音小程序点击会触发hover事件,需要避免一下 + // #ifndef MP-TOUTIAO + if (!this.range || this.lastHover) return + const { + before + } = this.multipleStatus + + if (!before) { + this.multipleStatus.before = fullDate + } else { + this.multipleStatus.after = fullDate + if (dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after); + } else { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before); + } + } + this.getWeeks(fullDate) + // #endif + + } + + /** + * 更新默认值多选状态 + */ + setDefaultMultiple(before, after) { + this.multipleStatus.before = before + this.multipleStatus.after = after + if (before && after) { + if (dateCompare(before, after)) { + this.multipleStatus.data = this.geDateAll(before, after); + this.getWeeks(after) + } else { + this.multipleStatus.data = this.geDateAll(after, before); + this.getWeeks(before) + } + } + } + + /** + * 获取每周数据 + * @param {Object} dateData + */ + getWeeks(dateData) { + const { + year, + month, + } = this.getDateObj(dateData) + + const preMonthDayAmount = new Date(year, month - 1, 1).getDay() + const preMonthDays = this.getPreMonthDays(preMonthDayAmount, this.getDateObj(dateData)) + + const currentMonthDayAmount = new Date(year, month, 0).getDate() + const currentMonthDays = this.getCurrentMonthDays(currentMonthDayAmount, this.getDateObj(dateData)) + + const nextMonthDayAmount = 42 - preMonthDayAmount - currentMonthDayAmount + const nextMonthDays = this._getNextMonthDays(nextMonthDayAmount, this.getDateObj(dateData)) + + const calendarDays = [...preMonthDays, ...currentMonthDays, ...nextMonthDays] + + const weeks = new Array(6) + for (let i = 0; i < calendarDays.length; i++) { + const index = Math.floor(i / 7) + if (!weeks[index]) { + weeks[index] = new Array(7) + } + weeks[index][i % 7] = calendarDays[i] + } + + this.calendar = calendarDays + this.weeks = weeks + } +} + +function getDateTime(date, hideSecond) { + return `${getDate(date)} ${getTime(date, hideSecond)}` +} + +function getDate(date) { + date = fixIosDateFormat(date) + date = new Date(date) + const year = date.getFullYear() + const month = date.getMonth() + 1 + const day = date.getDate() + return `${year}-${addZero(month)}-${addZero(day)}` +} + +function getTime(date, hideSecond) { + date = fixIosDateFormat(date) + date = new Date(date) + const hour = date.getHours() + const minute = date.getMinutes() + const second = date.getSeconds() + return hideSecond ? `${addZero(hour)}:${addZero(minute)}` : `${addZero(hour)}:${addZero(minute)}:${addZero(second)}` +} + +function addZero(num) { + if (num < 10) { + num = `0${num}` + } + return num +} + +function getDefaultSecond(hideSecond) { + return hideSecond ? '00:00' : '00:00:00' +} + +function dateCompare(startDate, endDate) { + startDate = new Date(fixIosDateFormat(startDate)) + endDate = new Date(fixIosDateFormat(endDate)) + return startDate <= endDate +} + +function checkDate(date) { + const dateReg = /((19|20)\d{2})(-|\/)\d{1,2}(-|\/)\d{1,2}/g + return date.match(dateReg) +} +//ios低版本15及以下,无法匹配 没有 ’秒‘ 时的情况,所以需要在末尾 秒 加上 问号 +const dateTimeReg = /^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])( [0-5]?[0-9]:[0-5]?[0-9](:[0-5]?[0-9])?)?$/; + +function fixIosDateFormat(value) { + if (typeof value === 'string' && dateTimeReg.test(value)) { + value = value.replace(/-/g, '/') + } + return value +} + +export { + Calendar, + getDateTime, + getDate, + getTime, + addZero, + getDefaultSecond, + dateCompare, + checkDate, + fixIosDateFormat +} diff --git a/uni_modules/uni-datetime-picker/package.json b/uni_modules/uni-datetime-picker/package.json new file mode 100644 index 0000000..4d1b05c --- /dev/null +++ b/uni_modules/uni-datetime-picker/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-datetime-picker", + "displayName": "uni-datetime-picker 日期选择器", + "version": "2.2.34", + "description": "uni-datetime-picker 日期时间选择器,支持日历,支持范围选择", + "keywords": [ + "uni-datetime-picker", + "uni-ui", + "uniui", + "日期时间选择器", + "日期时间" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-datetime-picker/readme.md b/uni_modules/uni-datetime-picker/readme.md new file mode 100644 index 0000000..162fbef --- /dev/null +++ b/uni_modules/uni-datetime-picker/readme.md @@ -0,0 +1,21 @@ + + +> `重要通知:组件升级更新 2.0.0 后,支持日期+时间范围选择,组件 ui 将使用日历选择日期,ui 变化较大,同时支持 PC 和 移动端。此版本不向后兼容,不再支持单独的时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker)。若仍需使用旧版本,可在插件市场下载*非uni_modules版本*,旧版本将不再维护` + +## DatetimePicker 时间选择器 + +> **组件名:uni-datetime-picker** +> 代码块: `uDatetimePicker` + + +该组件的优势是,支持**时间戳**输入和输出(起始时间、终止时间也支持时间戳),可**同时选择**日期和时间。 + +若只是需要单独选择日期和时间,不需要时间戳输入和输出,可使用原生的 picker 组件。 + +**_点击 picker 默认值规则:_** + +- 若设置初始值 value, 会显示在 picker 显示框中 +- 若无初始值 value,则初始值 value 为当前本地时间 Date.now(), 但不会显示在 picker 显示框中 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-drawer/changelog.md b/uni_modules/uni-drawer/changelog.md new file mode 100644 index 0000000..6d2488c --- /dev/null +++ b/uni_modules/uni-drawer/changelog.md @@ -0,0 +1,13 @@ +## 1.2.1(2021-11-22) +- 修复 vue3中个别scss变量无法找到的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-drawer](https://uniapp.dcloud.io/component/uniui/uni-drawer) +## 1.1.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-05-12) +- 新增 组件示例地址 +## 1.0.6(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-drawer/components/uni-drawer/keypress.js b/uni_modules/uni-drawer/components/uni-drawer/keypress.js new file mode 100644 index 0000000..62dda46 --- /dev/null +++ b/uni_modules/uni-drawer/components/uni-drawer/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + // this.$once('hook:beforeDestroy', () => { + // document.removeEventListener('keyup', listener) + // }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue b/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue new file mode 100644 index 0000000..2471521 --- /dev/null +++ b/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/uni_modules/uni-drawer/package.json b/uni_modules/uni-drawer/package.json new file mode 100644 index 0000000..dd056e4 --- /dev/null +++ b/uni_modules/uni-drawer/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-drawer", + "displayName": "uni-drawer 抽屉", + "version": "1.2.1", + "description": "抽屉式导航,用于展示侧滑菜单,侧滑导航。", + "keywords": [ + "uni-ui", + "uniui", + "drawer", + "抽屉", + "侧滑导航" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-drawer/readme.md b/uni_modules/uni-drawer/readme.md new file mode 100644 index 0000000..dcf6e6b --- /dev/null +++ b/uni_modules/uni-drawer/readme.md @@ -0,0 +1,10 @@ + + +## Drawer 抽屉 +> **组件名:uni-drawer** +> 代码块: `uDrawer` + +抽屉侧滑菜单。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-drawer) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-easyinput/changelog.md b/uni_modules/uni-easyinput/changelog.md new file mode 100644 index 0000000..6677b07 --- /dev/null +++ b/uni_modules/uni-easyinput/changelog.md @@ -0,0 +1,113 @@ +## 1.1.18(2024-04-11) +- 修复 easyinput组件双向绑定问题 +## 1.1.17(2024-03-28) +- 修复 在头条小程序下丢失事件绑定的问题 +## 1.1.16(2024-03-20) +- 修复 在密码输入情况下 清除和小眼睛覆盖bug 在edge浏览器下显示双眼睛bug +## 1.1.15(2024-02-21) +- 新增 左侧插槽:left +## 1.1.14(2024-02-19) +- 修复 onBlur的emit传值错误 +## 1.1.12(2024-01-29) +- 补充 adjust-position文档属性补充 +## 1.1.11(2024-01-29) +- 补充 adjust-position属性传递值:(Boolean)当键盘弹起时,是否自动上推页面 +## 1.1.10(2024-01-22) +- 去除 移除无用的log输出 +## 1.1.9(2023-04-11) +- 修复 vue3 下 keyboardheightchange 事件报错的bug +## 1.1.8(2023-03-29) +- 优化 trim 属性默认值 +## 1.1.7(2023-03-29) +- 新增 cursor-spacing 属性 +## 1.1.6(2023-01-28) +- 新增 keyboardheightchange 事件,可监听键盘高度变化 +## 1.1.5(2022-11-29) +- 优化 主题样式 +## 1.1.4(2022-10-27) +- 修复 props 中背景颜色无默认值的bug +## 1.1.0(2022-06-30) + +- 新增 在 uni-forms 1.4.0 中使用可以在 blur 时校验内容 +- 新增 clear 事件,点击右侧叉号图标触发 +- 新增 change 事件 ,仅在输入框失去焦点或用户按下回车时触发 +- 优化 组件样式,组件获取焦点时高亮显示,图标颜色调整等 + +## 1.0.5(2022-06-07) + +- 优化 clearable 显示策略 + +## 1.0.4(2022-06-07) + +- 优化 clearable 显示策略 + +## 1.0.3(2022-05-20) + +- 修复 关闭图标某些情况下无法取消的 bug + +## 1.0.2(2022-04-12) + +- 修复 默认值不生效的 bug + +## 1.0.1(2022-04-02) + +- 修复 value 不能为 0 的 bug + +## 1.0.0(2021-11-19) + +- 优化 组件 UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-easyinput](https://uniapp.dcloud.io/component/uniui/uni-easyinput) + +## 0.1.4(2021-08-20) + +- 修复 在 uni-forms 的动态表单中默认值校验不通过的 bug + +## 0.1.3(2021-08-11) + +- 修复 在 uni-forms 中重置表单,错误信息无法清除的问题 + +## 0.1.2(2021-07-30) + +- 优化 vue3 下事件警告的问题 + +## 0.1.1 + +- 优化 errorMessage 属性支持 Boolean 类型 + +## 0.1.0(2021-07-13) + +- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) + +## 0.0.16(2021-06-29) + +- 修复 confirmType 属性(仅 type="text" 生效)导致多行文本框无法换行的 bug + +## 0.0.15(2021-06-21) + +- 修复 passwordIcon 属性拼写错误的 bug + +## 0.0.14(2021-06-18) + +- 新增 passwordIcon 属性,当 type=password 时是否显示小眼睛图标 +- 修复 confirmType 属性不生效的问题 + +## 0.0.13(2021-06-04) + +- 修复 disabled 状态可清出内容的 bug + +## 0.0.12(2021-05-12) + +- 新增 组件示例地址 + +## 0.0.11(2021-05-07) + +- 修复 input-border 属性不生效的问题 + +## 0.0.10(2021-04-30) + +- 修复 ios 遮挡文字、显示一半的问题 + +## 0.0.9(2021-02-05) + +- 调整为 uni_modules 目录规范 +- 优化 兼容 nvue 页面 diff --git a/uni_modules/uni-easyinput/components/uni-easyinput/common.js b/uni_modules/uni-easyinput/components/uni-easyinput/common.js new file mode 100644 index 0000000..fde8d3c --- /dev/null +++ b/uni_modules/uni-easyinput/components/uni-easyinput/common.js @@ -0,0 +1,54 @@ +/** + * @desc 函数防抖 + * @param func 目标函数 + * @param wait 延迟执行毫秒数 + * @param immediate true - 立即执行, false - 延迟执行 + */ +export const debounce = function(func, wait = 1000, immediate = true) { + let timer; + return function() { + let context = this, + args = arguments; + if (timer) clearTimeout(timer); + if (immediate) { + let callNow = !timer; + timer = setTimeout(() => { + timer = null; + }, wait); + if (callNow) func.apply(context, args); + } else { + timer = setTimeout(() => { + func.apply(context, args); + }, wait) + } + } +} +/** + * @desc 函数节流 + * @param func 函数 + * @param wait 延迟执行毫秒数 + * @param type 1 使用表时间戳,在时间段开始的时候触发 2 使用表定时器,在时间段结束的时候触发 + */ +export const throttle = (func, wait = 1000, type = 1) => { + let previous = 0; + let timeout; + return function() { + let context = this; + let args = arguments; + if (type === 1) { + let now = Date.now(); + + if (now - previous > wait) { + func.apply(context, args); + previous = now; + } + } else if (type === 2) { + if (!timeout) { + timeout = setTimeout(() => { + timeout = null; + func.apply(context, args) + }, wait) + } + } + } +} diff --git a/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue b/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue new file mode 100644 index 0000000..d41411b --- /dev/null +++ b/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue @@ -0,0 +1,693 @@ + + + + + diff --git a/uni_modules/uni-easyinput/package.json b/uni_modules/uni-easyinput/package.json new file mode 100644 index 0000000..62bbff5 --- /dev/null +++ b/uni_modules/uni-easyinput/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-easyinput", + "displayName": "uni-easyinput 增强输入框", + "version": "1.1.18", + "description": "Easyinput 组件是对原生input组件的增强", + "keywords": [ + "uni-ui", + "uniui", + "input", + "uni-easyinput", + "输入框" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-easyinput/readme.md b/uni_modules/uni-easyinput/readme.md new file mode 100644 index 0000000..f1faf8f --- /dev/null +++ b/uni_modules/uni-easyinput/readme.md @@ -0,0 +1,11 @@ + + +### Easyinput 增强输入框 +> **组件名:uni-easyinput** +> 代码块: `uEasyinput` + + +easyinput 组件是对原生input组件的增强 ,是专门为配合表单组件[uni-forms](https://ext.dcloud.net.cn/plugin?id=2773)而设计的,easyinput 内置了边框,图标等,同时包含 input 所有功能 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-easyinput) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-fab/changelog.md b/uni_modules/uni-fab/changelog.md new file mode 100644 index 0000000..9bd4729 --- /dev/null +++ b/uni_modules/uni-fab/changelog.md @@ -0,0 +1,23 @@ +## 1.2.5(2023-03-29) +- 新增 pattern.icon 属性,可自定义图标 +## 1.2.4(2022-09-07) +小程序端由于 style 使用了对象导致报错,[详情](https://ask.dcloud.net.cn/question/152790?item_id=211778&rf=false) +## 1.2.3(2022-09-05) +- 修复 nvue 环境下,具有 tabBar 时,fab 组件下部位置无法正常获取 --window-bottom 的bug,详见:[https://ask.dcloud.net.cn/question/110638?notification_id=826310](https://ask.dcloud.net.cn/question/110638?notification_id=826310) +## 1.2.2(2021-12-29) +- 更新 组件依赖 +## 1.2.1(2021-11-19) +- 修复 阴影颜色不正确的bug +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-fab](https://uniapp.dcloud.io/component/uniui/uni-fab) +## 1.1.1(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-05-12) +- 新增 组件示例地址 +## 1.0.6(2021-02-05) +- 调整为uni_modules目录规范 +- 优化 按钮背景色调整 +- 优化 兼容pc端 diff --git a/uni_modules/uni-fab/components/uni-fab/uni-fab.vue b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue new file mode 100644 index 0000000..dfa65c1 --- /dev/null +++ b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue @@ -0,0 +1,491 @@ + + + + + diff --git a/uni_modules/uni-fab/package.json b/uni_modules/uni-fab/package.json new file mode 100644 index 0000000..18c0810 --- /dev/null +++ b/uni_modules/uni-fab/package.json @@ -0,0 +1,84 @@ +{ + "id": "uni-fab", + "displayName": "uni-fab 悬浮按钮", + "version": "1.2.5", + "description": "悬浮按钮 fab button ,点击可展开一个图标按钮菜单。", + "keywords": [ + "uni-ui", + "uniui", + "按钮", + "悬浮按钮", + "fab" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss","uni-icons"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-fab/readme.md b/uni_modules/uni-fab/readme.md new file mode 100644 index 0000000..9a444e8 --- /dev/null +++ b/uni_modules/uni-fab/readme.md @@ -0,0 +1,9 @@ +## Fab 悬浮按钮 +> **组件名:uni-fab** +> 代码块: `uFab` + + +点击可展开一个图形按钮菜单 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-fab) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-fav/changelog.md b/uni_modules/uni-fav/changelog.md new file mode 100644 index 0000000..d8a08d4 --- /dev/null +++ b/uni_modules/uni-fav/changelog.md @@ -0,0 +1,19 @@ +## 1.2.1(2022-05-30) +- 新增 stat 属性 ,是否开启uni统计功能 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-fav](https://uniapp.dcloud.io/component/uniui/uni-fav) +## 1.1.1(2021-08-24) +- 新增 支持国际化 +## 1.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.6(2021-05-12) +- 新增 组件示例地址 +## 1.0.5(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.4(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.0.3(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.0.2(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-fav/components/uni-fav/i18n/en.json b/uni_modules/uni-fav/components/uni-fav/i18n/en.json new file mode 100644 index 0000000..9a0759e --- /dev/null +++ b/uni_modules/uni-fav/components/uni-fav/i18n/en.json @@ -0,0 +1,4 @@ +{ + "uni-fav.collect": "collect", + "uni-fav.collected": "collected" +} diff --git a/uni_modules/uni-fav/components/uni-fav/i18n/index.js b/uni_modules/uni-fav/components/uni-fav/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-fav/components/uni-fav/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json b/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json new file mode 100644 index 0000000..67c89bf --- /dev/null +++ b/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json @@ -0,0 +1,4 @@ +{ + "uni-fav.collect": "收藏", + "uni-fav.collected": "已收藏" +} diff --git a/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json b/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json new file mode 100644 index 0000000..67c89bf --- /dev/null +++ b/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json @@ -0,0 +1,4 @@ +{ + "uni-fav.collect": "收藏", + "uni-fav.collected": "已收藏" +} diff --git a/uni_modules/uni-fav/components/uni-fav/uni-fav.vue b/uni_modules/uni-fav/components/uni-fav/uni-fav.vue new file mode 100644 index 0000000..d2c58df --- /dev/null +++ b/uni_modules/uni-fav/components/uni-fav/uni-fav.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/uni_modules/uni-fav/package.json b/uni_modules/uni-fav/package.json new file mode 100644 index 0000000..cc14697 --- /dev/null +++ b/uni_modules/uni-fav/package.json @@ -0,0 +1,89 @@ +{ + "id": "uni-fav", + "displayName": "uni-fav 收藏按钮", + "version": "1.2.1", + "description": " Fav 收藏组件,可自定义颜色、大小。", + "keywords": [ + "fav", + "uni-ui", + "uniui", + "收藏" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-fav/readme.md b/uni_modules/uni-fav/readme.md new file mode 100644 index 0000000..4de125d --- /dev/null +++ b/uni_modules/uni-fav/readme.md @@ -0,0 +1,10 @@ + + +## Fav 收藏按钮 +> **组件名:uni-fav** +> 代码块: `uFav` + +用于收藏功能,可点击切换选中、不选中的状态。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-fav) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-file-picker/changelog.md b/uni_modules/uni-file-picker/changelog.md new file mode 100644 index 0000000..81e43b9 --- /dev/null +++ b/uni_modules/uni-file-picker/changelog.md @@ -0,0 +1,75 @@ +## 1.0.8(2024-03-20) +- 补充 删除文件时返回文件下标 +## 1.0.7(2024-02-21) +- 新增 微信小程序选择视频时改用chooseMedia,并返回视频缩略图 +## 1.0.6(2024-01-06) +- 新增 微信小程序不再调用chooseImage,而是调用chooseMedia +## 1.0.5(2024-01-03) +- 新增 上传文件至云存储携带本地文件名称 +## 1.0.4(2023-03-29) +- 修复 手动上传删除一个文件后不能再上传的bug +## 1.0.3(2022-12-19) +- 新增 sourceType 属性, 可以自定义图片和视频选择的来源 +## 1.0.2(2022-07-04) +- 修复 在uni-forms下样式不生效的bug +## 1.0.1(2021-11-23) +- 修复 参数为对象的情况下,url在某些情况显示错误的bug +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-file-picker](https://uniapp.dcloud.io/component/uniui/uni-file-picker) +## 0.2.16(2021-11-08) +- 修复 传入空对象 ,显示错误的Bug +## 0.2.15(2021-08-30) +- 修复 return-type="object" 时且存在v-model时,无法删除文件的Bug +## 0.2.14(2021-08-23) +- 新增 参数中返回 fileID 字段 +## 0.2.13(2021-08-23) +- 修复 腾讯云传入fileID 不能回显的bug +- 修复 选择图片后,不能放大的问题 +## 0.2.12(2021-08-17) +- 修复 由于 0.2.11 版本引起的不能回显图片的Bug +## 0.2.11(2021-08-16) +- 新增 clearFiles(index) 方法,可以手动删除指定文件 +- 修复 v-model 值设为 null 报错的Bug +## 0.2.10(2021-08-13) +- 修复 return-type="object" 时,无法删除文件的Bug +## 0.2.9(2021-08-03) +- 修复 auto-upload 属性失效的Bug +## 0.2.8(2021-07-31) +- 修复 fileExtname属性不指定值报错的Bug +## 0.2.7(2021-07-31) +- 修复 在某种场景下图片不回显的Bug +## 0.2.6(2021-07-30) +- 修复 return-type为object下,返回值不正确的Bug +## 0.2.5(2021-07-30) +- 修复(重要) H5 平台下如果和uni-forms组件一同使用导致页面卡死的问题 +## 0.2.3(2021-07-28) +- 优化 调整示例代码 +## 0.2.2(2021-07-27) +- 修复 vue3 下赋值错误的Bug +- 优化 h5平台下上传文件导致页面卡死的问题 +## 0.2.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.1.1(2021-07-02) +- 修复 sourceType 缺少默认值导致 ios 无法选择文件 +## 0.1.0(2021-06-30) +- 优化 解耦与uniCloud的强绑定关系 ,如不绑定服务空间,默认autoUpload为false且不可更改 +## 0.0.11(2021-06-30) +- 修复 由 0.0.10 版本引发的 returnType 属性失效的问题 +## 0.0.10(2021-06-29) +- 优化 文件上传后进度条消失时机 +## 0.0.9(2021-06-29) +- 修复 在uni-forms 中,删除文件 ,获取的值不对的Bug +## 0.0.8(2021-06-15) +- 修复 删除文件时无法触发 v-model 的Bug +## 0.0.7(2021-05-12) +- 新增 组件示例地址 +## 0.0.6(2021-04-09) +- 修复 选择的文件非 file-extname 字段指定的扩展名报错的Bug +## 0.0.5(2021-04-09) +- 优化 更新组件示例 +## 0.0.4(2021-04-09) +- 优化 file-extname 字段支持字符串写法,多个扩展名需要用逗号分隔 +## 0.0.3(2021-02-05) +- 调整为uni_modules目录规范 +- 修复 微信小程序不指定 fileExtname 属性选择失败的Bug diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js b/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js new file mode 100644 index 0000000..9c6bcdf --- /dev/null +++ b/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js @@ -0,0 +1,287 @@ +'use strict'; + +const ERR_MSG_OK = 'chooseAndUploadFile:ok'; +const ERR_MSG_FAIL = 'chooseAndUploadFile:fail'; + +function chooseImage(opts) { + const { + count, + sizeType = ['original', 'compressed'], + sourceType, + extension + } = opts + return new Promise((resolve, reject) => { + // 微信由于旧接口不再维护,针对微信小程序平台改用chooseMedia接口 + // #ifdef MP-WEIXIN + uni.chooseMedia({ + count, + sizeType, + sourceType, + mediaType: ['image'], + extension, + success(res) { + res.tempFiles.forEach(item => { + item.path = item.tempFilePath; + }) + resolve(normalizeChooseAndUploadFileRes(res, 'image')); + }, + fail(res) { + reject({ + errMsg: res.errMsg.replace('chooseImage:fail', ERR_MSG_FAIL), + }); + }, + }) + // #endif + // #ifndef MP-WEIXIN + uni.chooseImage({ + count, + sizeType, + sourceType, + extension, + success(res) { + resolve(normalizeChooseAndUploadFileRes(res, 'image')); + }, + fail(res) { + reject({ + errMsg: res.errMsg.replace('chooseImage:fail', ERR_MSG_FAIL), + }); + }, + }); + // #endif + + }); +} + +function chooseVideo(opts) { + const { + count, + camera, + compressed, + maxDuration, + sourceType, + extension + } = opts; + return new Promise((resolve, reject) => { + // 微信由于旧接口不再维护,针对微信小程序平台改用chooseMedia接口 + // #ifdef MP-WEIXIN + uni.chooseMedia({ + count, + compressed, + maxDuration, + sourceType, + extension, + mediaType: ['video'], + success(res) { + const { + tempFiles, + } = res; + resolve(normalizeChooseAndUploadFileRes({ + errMsg: 'chooseVideo:ok', + tempFiles: tempFiles.map(item => { + return { + name: item.name || '', + path: item.tempFilePath, + thumbTempFilePath: item.thumbTempFilePath, + size:item.size, + type: (res.tempFile && res.tempFile.type) || '', + width:item.width, + height:item.height, + duration:item.duration, + fileType: 'video', + cloudPath: '', + } + }), + }, 'video')); + }, + fail(res) { + reject({ + errMsg: res.errMsg.replace('chooseVideo:fail', ERR_MSG_FAIL), + }); + }, + }) + // #endif + // #ifndef MP-WEIXIN + uni.chooseVideo({ + camera, + compressed, + maxDuration, + sourceType, + extension, + success(res) { + const { + tempFilePath, + duration, + size, + height, + width + } = res; + resolve(normalizeChooseAndUploadFileRes({ + errMsg: 'chooseVideo:ok', + tempFilePaths: [tempFilePath], + tempFiles: [{ + name: (res.tempFile && res.tempFile.name) || '', + path: tempFilePath, + size, + type: (res.tempFile && res.tempFile.type) || '', + width, + height, + duration, + fileType: 'video', + cloudPath: '', + }, ], + }, 'video')); + }, + fail(res) { + reject({ + errMsg: res.errMsg.replace('chooseVideo:fail', ERR_MSG_FAIL), + }); + }, + }); + // #endif + }); +} + +function chooseAll(opts) { + const { + count, + extension + } = opts; + return new Promise((resolve, reject) => { + let chooseFile = uni.chooseFile; + if (typeof wx !== 'undefined' && + typeof wx.chooseMessageFile === 'function') { + chooseFile = wx.chooseMessageFile; + } + if (typeof chooseFile !== 'function') { + return reject({ + errMsg: ERR_MSG_FAIL + ' 请指定 type 类型,该平台仅支持选择 image 或 video。', + }); + } + chooseFile({ + type: 'all', + count, + extension, + success(res) { + resolve(normalizeChooseAndUploadFileRes(res)); + }, + fail(res) { + reject({ + errMsg: res.errMsg.replace('chooseFile:fail', ERR_MSG_FAIL), + }); + }, + }); + }); +} + +function normalizeChooseAndUploadFileRes(res, fileType) { + res.tempFiles.forEach((item, index) => { + if (!item.name) { + item.name = item.path.substring(item.path.lastIndexOf('/') + 1); + } + if (fileType) { + item.fileType = fileType; + } + item.cloudPath = + Date.now() + '_' + index + item.name.substring(item.name.lastIndexOf('.')); + }); + if (!res.tempFilePaths) { + res.tempFilePaths = res.tempFiles.map((file) => file.path); + } + return res; +} + +function uploadCloudFiles(files, max = 5, onUploadProgress) { + files = JSON.parse(JSON.stringify(files)) + const len = files.length + let count = 0 + let self = this + return new Promise(resolve => { + while (count < max) { + next() + } + + function next() { + let cur = count++ + if (cur >= len) { + !files.find(item => !item.url && !item.errMsg) && resolve(files) + return + } + const fileItem = files[cur] + const index = self.files.findIndex(v => v.uuid === fileItem.uuid) + fileItem.url = '' + delete fileItem.errMsg + + uniCloud + .uploadFile({ + filePath: fileItem.path, + cloudPath: fileItem.cloudPath, + fileType: fileItem.fileType, + onUploadProgress: res => { + res.index = index + onUploadProgress && onUploadProgress(res) + } + }) + .then(res => { + fileItem.url = res.fileID + fileItem.index = index + if (cur < len) { + next() + } + }) + .catch(res => { + fileItem.errMsg = res.errMsg || res.message + fileItem.index = index + if (cur < len) { + next() + } + }) + } + }) +} + + + + + +function uploadFiles(choosePromise, { + onChooseFile, + onUploadProgress +}) { + return choosePromise + .then((res) => { + if (onChooseFile) { + const customChooseRes = onChooseFile(res); + if (typeof customChooseRes !== 'undefined') { + return Promise.resolve(customChooseRes).then((chooseRes) => typeof chooseRes === 'undefined' ? + res : chooseRes); + } + } + return res; + }) + .then((res) => { + if (res === false) { + return { + errMsg: ERR_MSG_OK, + tempFilePaths: [], + tempFiles: [], + }; + } + return res + }) +} + +function chooseAndUploadFile(opts = { + type: 'all' +}) { + if (opts.type === 'image') { + return uploadFiles(chooseImage(opts), opts); + } else if (opts.type === 'video') { + return uploadFiles(chooseVideo(opts), opts); + } + return uploadFiles(chooseAll(opts), opts); +} + +export { + chooseAndUploadFile, + uploadCloudFiles +}; diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue b/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue new file mode 100644 index 0000000..fb83f63 --- /dev/null +++ b/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue @@ -0,0 +1,678 @@ + + + + + diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue b/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue new file mode 100644 index 0000000..625d92e --- /dev/null +++ b/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue @@ -0,0 +1,325 @@ + + + + + diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue b/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue new file mode 100644 index 0000000..2a29bc2 --- /dev/null +++ b/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue @@ -0,0 +1,292 @@ + + + + + diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/utils.js b/uni_modules/uni-file-picker/components/uni-file-picker/utils.js new file mode 100644 index 0000000..1bc9259 --- /dev/null +++ b/uni_modules/uni-file-picker/components/uni-file-picker/utils.js @@ -0,0 +1,110 @@ +/** + * 获取文件名和后缀 + * @param {String} name + */ +export const get_file_ext = (name) => { + const last_len = name.lastIndexOf('.') + const len = name.length + return { + name: name.substring(0, last_len), + ext: name.substring(last_len + 1, len) + } +} + +/** + * 获取扩展名 + * @param {Array} fileExtname + */ +export const get_extname = (fileExtname) => { + if (!Array.isArray(fileExtname)) { + let extname = fileExtname.replace(/(\[|\])/g, '') + return extname.split(',') + } else { + return fileExtname + } + return [] +} + +/** + * 获取文件和检测是否可选 + */ +export const get_files_and_is_max = (res, _extname) => { + let filePaths = [] + let files = [] + if(!_extname || _extname.length === 0){ + return { + filePaths, + files + } + } + res.tempFiles.forEach(v => { + let fileFullName = get_file_ext(v.name) + const extname = fileFullName.ext.toLowerCase() + if (_extname.indexOf(extname) !== -1) { + files.push(v) + filePaths.push(v.path) + } + }) + if (files.length !== res.tempFiles.length) { + uni.showToast({ + title: `当前选择了${res.tempFiles.length}个文件 ,${res.tempFiles.length - files.length} 个文件格式不正确`, + icon: 'none', + duration: 5000 + }) + } + + return { + filePaths, + files + } +} + + +/** + * 获取图片信息 + * @param {Object} filepath + */ +export const get_file_info = (filepath) => { + return new Promise((resolve, reject) => { + uni.getImageInfo({ + src: filepath, + success(res) { + resolve(res) + }, + fail(err) { + reject(err) + } + }) + }) +} +/** + * 获取封装数据 + */ +export const get_file_data = async (files, type = 'image') => { + // 最终需要上传数据库的数据 + let fileFullName = get_file_ext(files.name) + const extname = fileFullName.ext.toLowerCase() + let filedata = { + name: files.name, + uuid: files.uuid, + extname: extname || '', + cloudPath: files.cloudPath, + fileType: files.fileType, + thumbTempFilePath: files.thumbTempFilePath, + url: files.path || files.path, + size: files.size, //单位是字节 + image: {}, + path: files.path, + video: {} + } + if (type === 'image') { + const imageinfo = await get_file_info(files.path) + delete filedata.video + filedata.image.width = imageinfo.width + filedata.image.height = imageinfo.height + filedata.image.location = imageinfo.path + } else { + delete filedata.image + } + return filedata +} diff --git a/uni_modules/uni-file-picker/package.json b/uni_modules/uni-file-picker/package.json new file mode 100644 index 0000000..004d330 --- /dev/null +++ b/uni_modules/uni-file-picker/package.json @@ -0,0 +1,83 @@ +{ + "id": "uni-file-picker", + "displayName": "uni-file-picker 文件选择上传", + "version": "1.0.8", + "description": "文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间", + "keywords": [ + "uni-ui", + "uniui", + "图片上传", + "文件上传" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-file-picker/readme.md b/uni_modules/uni-file-picker/readme.md new file mode 100644 index 0000000..c8399a5 --- /dev/null +++ b/uni_modules/uni-file-picker/readme.md @@ -0,0 +1,11 @@ + +## FilePicker 文件选择上传 + +> **组件名:uni-file-picker** +> 代码块: `uFilePicker` + + +文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-file-picker) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-forms/changelog.md b/uni_modules/uni-forms/changelog.md new file mode 100644 index 0000000..3d998bc --- /dev/null +++ b/uni_modules/uni-forms/changelog.md @@ -0,0 +1,94 @@ +## 1.4.10(2023-11-03) +- 优化 labelWidth 描述错误 +## 1.4.9(2023-02-10) +- 修复 required 参数无法动态绑定 +## 1.4.8(2022-08-23) +- 优化 根据 rules 自动添加 required 的问题 +## 1.4.7(2022-08-22) +- 修复 item 未设置 require 属性,rules 设置 require 后,星号也显示的 bug,详见:[https://ask.dcloud.net.cn/question/151540](https://ask.dcloud.net.cn/question/151540) +## 1.4.6(2022-07-13) +- 修复 model 需要校验的值没有声明对应字段时,导致第一次不触发校验的bug +## 1.4.5(2022-07-05) +- 新增 更多表单示例 +- 优化 子表单组件过期提示的问题 +- 优化 子表单组件uni-datetime-picker、uni-data-select、uni-data-picker的显示样式 +## 1.4.4(2022-07-04) +- 更新 删除组件日志 +## 1.4.3(2022-07-04) +- 修复 由 1.4.0 引发的 label 插槽不生效的bug +## 1.4.2(2022-07-04) +- 修复 子组件找不到 setValue 报错的bug +## 1.4.1(2022-07-04) +- 修复 uni-data-picker 在 uni-forms-item 中报错的bug +- 修复 uni-data-picker 在 uni-forms-item 中宽度不正确的bug +## 1.4.0(2022-06-30) +- 【重要】组件逻辑重构,部分用法用旧版本不兼容,请注意兼容问题 +- 【重要】组件使用 Provide/Inject 方式注入依赖,提供了自定义表单组件调用 uni-forms 校验表单的能力 +- 新增 model 属性,等同于原 value/modelValue 属性,旧属性即将废弃 +- 新增 validateTrigger 属性的 blur 值,仅 uni-easyinput 生效 +- 新增 onFieldChange 方法,可以对子表单进行校验,可替代binddata方法 +- 新增 子表单的 setRules 方法,配合自定义校验函数使用 +- 新增 uni-forms-item 的 setRules 方法,配置动态表单使用可动态更新校验规则 +- 优化 动态表单校验方式,废弃拼接name的方式 +## 1.3.3(2022-06-22) +- 修复 表单校验顺序无序问题 +## 1.3.2(2021-12-09) +- +## 1.3.1(2021-11-19) +- 修复 label 插槽不生效的bug +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-forms](https://uniapp.dcloud.io/component/uniui/uni-forms) +## 1.2.7(2021-08-13) +- 修复 没有添加校验规则的字段依然报错的Bug +## 1.2.6(2021-08-11) +- 修复 重置表单错误信息无法清除的问题 +## 1.2.5(2021-08-11) +- 优化 组件文档 +## 1.2.4(2021-08-11) +- 修复 表单验证只生效一次的问题 +## 1.2.3(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.2.2(2021-07-26) +- 修复 vue2 下条件编译导致destroyed生命周期失效的Bug +- 修复 1.2.1 引起的示例在小程序平台报错的Bug +## 1.2.1(2021-07-22) +- 修复 动态校验表单,默认值为空的情况下校验失效的Bug +- 修复 不指定name属性时,运行报错的Bug +- 优化 label默认宽度从65调整至70,使required为true且四字时不换行 +- 优化 组件示例,新增动态校验示例代码 +- 优化 组件文档,使用方式更清晰 +## 1.2.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.2(2021-06-25) +- 修复 pattern 属性在微信小程序平台无效的问题 +## 1.1.1(2021-06-22) +- 修复 validate-trigger属性为submit且err-show-type属性为toast时不能弹出的Bug +## 1.1.0(2021-06-22) +- 修复 只写setRules方法而导致校验不生效的Bug +- 修复 由上个办法引发的错误提示文字错位的Bug +## 1.0.48(2021-06-21) +- 修复 不设置 label 属性 ,无法设置label插槽的问题 +## 1.0.47(2021-06-21) +- 修复 不设置label属性,label-width属性不生效的bug +- 修复 setRules 方法与rules属性冲突的问题 +## 1.0.46(2021-06-04) +- 修复 动态删减数据导致报错的问题 +## 1.0.45(2021-06-04) +- 新增 modelValue 属性 ,value 即将废弃 +## 1.0.44(2021-06-02) +- 新增 uni-forms-item 可以设置单独的 rules +- 新增 validate 事件增加 keepitem 参数,可以选择那些字段不过滤 +- 优化 submit 事件重命名为 validate +## 1.0.43(2021-05-12) +- 新增 组件示例地址 +## 1.0.42(2021-04-30) +- 修复 自定义检验器失效的问题 +## 1.0.41(2021-03-05) +- 更新 校验器 +- 修复 表单规则设置类型为 number 的情况下,值为0校验失败的Bug +## 1.0.40(2021-03-04) +- 修复 动态显示uni-forms-item的情况下,submit 方法获取值错误的Bug +## 1.0.39(2021-02-05) +- 调整为uni_modules目录规范 +- 修复 校验器传入 int 等类型 ,返回String类型的Bug diff --git a/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue b/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue new file mode 100644 index 0000000..0aef9cc --- /dev/null +++ b/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue @@ -0,0 +1,627 @@ + + + + + diff --git a/uni_modules/uni-forms/components/uni-forms/uni-forms.vue b/uni_modules/uni-forms/components/uni-forms/uni-forms.vue new file mode 100644 index 0000000..9bb9ae7 --- /dev/null +++ b/uni_modules/uni-forms/components/uni-forms/uni-forms.vue @@ -0,0 +1,397 @@ + + + + + diff --git a/uni_modules/uni-forms/components/uni-forms/utils.js b/uni_modules/uni-forms/components/uni-forms/utils.js new file mode 100644 index 0000000..6da2421 --- /dev/null +++ b/uni_modules/uni-forms/components/uni-forms/utils.js @@ -0,0 +1,293 @@ +/** + * 简单处理对象拷贝 + * @param {Obejct} 被拷贝对象 + * @@return {Object} 拷贝对象 + */ +export const deepCopy = (val) => { + return JSON.parse(JSON.stringify(val)) +} +/** + * 过滤数字类型 + * @param {String} format 数字类型 + * @@return {Boolean} 返回是否为数字类型 + */ +export const typeFilter = (format) => { + return format === 'int' || format === 'double' || format === 'number' || format === 'timestamp'; +} + +/** + * 把 value 转换成指定的类型,用于处理初始值,原因是初始值需要入库不能为 undefined + * @param {String} key 字段名 + * @param {any} value 字段值 + * @param {Object} rules 表单校验规则 + */ +export const getValue = (key, value, rules) => { + const isRuleNumType = rules.find(val => val.format && typeFilter(val.format)); + const isRuleBoolType = rules.find(val => (val.format && val.format === 'boolean') || val.format === 'bool'); + // 输入类型为 number + if (!!isRuleNumType) { + if (!value && value !== 0) { + value = null + } else { + value = isNumber(Number(value)) ? Number(value) : value + } + } + + // 输入类型为 boolean + if (!!isRuleBoolType) { + value = isBoolean(value) ? value : false + } + + return value; +} + +/** + * 获取表单数据 + * @param {String|Array} name 真实名称,需要使用 realName 获取 + * @param {Object} data 原始数据 + * @param {any} value 需要设置的值 + */ +export const setDataValue = (field, formdata, value) => { + formdata[field] = value + return value || '' +} + +/** + * 获取表单数据 + * @param {String|Array} field 真实名称,需要使用 realName 获取 + * @param {Object} data 原始数据 + */ +export const getDataValue = (field, data) => { + return objGet(data, field) +} + +/** + * 获取表单类型 + * @param {String|Array} field 真实名称,需要使用 realName 获取 + */ +export const getDataValueType = (field, data) => { + const value = getDataValue(field, data) + return { + type: type(value), + value + } +} + +/** + * 获取表单可用的真实name + * @param {String|Array} name 表单name + * @@return {String} 表单可用的真实name + */ +export const realName = (name, data = {}) => { + const base_name = _basePath(name) + if (typeof base_name === 'object' && Array.isArray(base_name) && base_name.length > 1) { + const realname = base_name.reduce((a, b) => a += `#${b}`, '_formdata_') + return realname + } + return base_name[0] || name +} + +/** + * 判断是否表单可用的真实name + * @param {String|Array} name 表单name + * @@return {String} 表单可用的真实name + */ +export const isRealName = (name) => { + const reg = /^_formdata_#*/ + return reg.test(name) +} + +/** + * 获取表单数据的原始格式 + * @@return {Object|Array} object 需要解析的数据 + */ +export const rawData = (object = {}, name) => { + let newData = JSON.parse(JSON.stringify(object)) + let formData = {} + for(let i in newData){ + let path = name2arr(i) + objSet(formData,path,newData[i]) + } + return formData +} + +/** + * 真实name还原为 array + * @param {*} name + */ +export const name2arr = (name) => { + let field = name.replace('_formdata_#', '') + field = field.split('#').map(v => (isNumber(v) ? Number(v) : v)) + return field +} + +/** + * 对象中设置值 + * @param {Object|Array} object 源数据 + * @param {String| Array} path 'a.b.c' 或 ['a',0,'b','c'] + * @param {String} value 需要设置的值 + */ +export const objSet = (object, path, value) => { + if (typeof object !== 'object') return object; + _basePath(path).reduce((o, k, i, _) => { + if (i === _.length - 1) { + // 若遍历结束直接赋值 + o[k] = value + return null + } else if (k in o) { + // 若存在对应路径,则返回找到的对象,进行下一次遍历 + return o[k] + } else { + // 若不存在对应路径,则创建对应对象,若下一路径是数字,新对象赋值为空数组,否则赋值为空对象 + o[k] = /^[0-9]{1,}$/.test(_[i + 1]) ? [] : {} + return o[k] + } + }, object) + // 返回object + return object; +} + +// 处理 path, path有三种形式:'a[0].b.c'、'a.0.b.c' 和 ['a','0','b','c'],需要统一处理成数组,便于后续使用 +function _basePath(path) { + // 若是数组,则直接返回 + if (Array.isArray(path)) return path + // 若有 '[',']',则替换成将 '[' 替换成 '.',去掉 ']' + return path.replace(/\[/g, '.').replace(/\]/g, '').split('.') +} + +/** + * 从对象中获取值 + * @param {Object|Array} object 源数据 + * @param {String| Array} path 'a.b.c' 或 ['a',0,'b','c'] + * @param {String} defaultVal 如果无法从调用链中获取值的默认值 + */ +export const objGet = (object, path, defaultVal = 'undefined') => { + // 先将path处理成统一格式 + let newPath = _basePath(path) + // 递归处理,返回最后结果 + let val = newPath.reduce((o, k) => { + return (o || {})[k] + }, object); + return !val || val !== undefined ? val : defaultVal +} + + +/** + * 是否为 number 类型 + * @param {any} num 需要判断的值 + * @return {Boolean} 是否为 number + */ +export const isNumber = (num) => { + return !isNaN(Number(num)) +} + +/** + * 是否为 boolean 类型 + * @param {any} bool 需要判断的值 + * @return {Boolean} 是否为 boolean + */ +export const isBoolean = (bool) => { + return (typeof bool === 'boolean') +} +/** + * 是否有必填字段 + * @param {Object} rules 规则 + * @return {Boolean} 是否有必填字段 + */ +export const isRequiredField = (rules) => { + let isNoField = false; + for (let i = 0; i < rules.length; i++) { + const ruleData = rules[i]; + if (ruleData.required) { + isNoField = true; + break; + } + } + return isNoField; +} + + +/** + * 获取数据类型 + * @param {Any} obj 需要获取数据类型的值 + */ +export const type = (obj) => { + var class2type = {}; + + // 生成class2type映射 + "Boolean Number String Function Array Date RegExp Object Error".split(" ").map(function(item, index) { + class2type["[object " + item + "]"] = item.toLowerCase(); + }) + if (obj == null) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[Object.prototype.toString.call(obj)] || "object" : + typeof obj; +} + +/** + * 判断两个值是否相等 + * @param {any} a 值 + * @param {any} b 值 + * @return {Boolean} 是否相等 + */ +export const isEqual = (a, b) => { + //如果a和b本来就全等 + if (a === b) { + //判断是否为0和-0 + return a !== 0 || 1 / a === 1 / b; + } + //判断是否为null和undefined + if (a == null || b == null) { + return a === b; + } + //接下来判断a和b的数据类型 + var classNameA = toString.call(a), + classNameB = toString.call(b); + //如果数据类型不相等,则返回false + if (classNameA !== classNameB) { + return false; + } + //如果数据类型相等,再根据不同数据类型分别判断 + switch (classNameA) { + case '[object RegExp]': + case '[object String]': + //进行字符串转换比较 + return '' + a === '' + b; + case '[object Number]': + //进行数字转换比较,判断是否为NaN + if (+a !== +a) { + return +b !== +b; + } + //判断是否为0或-0 + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + return +a === +b; + } + //如果是对象类型 + if (classNameA == '[object Object]') { + //获取a和b的属性长度 + var propsA = Object.getOwnPropertyNames(a), + propsB = Object.getOwnPropertyNames(b); + if (propsA.length != propsB.length) { + return false; + } + for (var i = 0; i < propsA.length; i++) { + var propName = propsA[i]; + //如果对应属性对应值不相等,则返回false + if (a[propName] !== b[propName]) { + return false; + } + } + return true; + } + //如果是数组类型 + if (classNameA == '[object Array]') { + if (a.toString() == b.toString()) { + return true; + } + return false; + } +} diff --git a/uni_modules/uni-forms/components/uni-forms/validate.js b/uni_modules/uni-forms/components/uni-forms/validate.js new file mode 100644 index 0000000..1834c6c --- /dev/null +++ b/uni_modules/uni-forms/components/uni-forms/validate.js @@ -0,0 +1,486 @@ +var pattern = { + email: /^\S+?@\S+?\.\S+?$/, + idcard: /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/, + url: new RegExp( + "^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$", + 'i') +}; + +const FORMAT_MAPPING = { + "int": 'integer', + "bool": 'boolean', + "double": 'number', + "long": 'number', + "password": 'string' + // "fileurls": 'array' +} + +function formatMessage(args, resources = '') { + var defaultMessage = ['label'] + defaultMessage.forEach((item) => { + if (args[item] === undefined) { + args[item] = '' + } + }) + + let str = resources + for (let key in args) { + let reg = new RegExp('{' + key + '}') + str = str.replace(reg, args[key]) + } + return str +} + +function isEmptyValue(value, type) { + if (value === undefined || value === null) { + return true; + } + + if (typeof value === 'string' && !value) { + return true; + } + + if (Array.isArray(value) && !value.length) { + return true; + } + + if (type === 'object' && !Object.keys(value).length) { + return true; + } + + return false; +} + +const types = { + integer(value) { + return types.number(value) && parseInt(value, 10) === value; + }, + string(value) { + return typeof value === 'string'; + }, + number(value) { + if (isNaN(value)) { + return false; + } + return typeof value === 'number'; + }, + "boolean": function(value) { + return typeof value === 'boolean'; + }, + "float": function(value) { + return types.number(value) && !types.integer(value); + }, + array(value) { + return Array.isArray(value); + }, + object(value) { + return typeof value === 'object' && !types.array(value); + }, + date(value) { + return value instanceof Date; + }, + timestamp(value) { + if (!this.integer(value) || Math.abs(value).toString().length > 16) { + return false + } + return true; + }, + file(value) { + return typeof value.url === 'string'; + }, + email(value) { + return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255; + }, + url(value) { + return typeof value === 'string' && !!value.match(pattern.url); + }, + pattern(reg, value) { + try { + return new RegExp(reg).test(value); + } catch (e) { + return false; + } + }, + method(value) { + return typeof value === 'function'; + }, + idcard(value) { + return typeof value === 'string' && !!value.match(pattern.idcard); + }, + 'url-https'(value) { + return this.url(value) && value.startsWith('https://'); + }, + 'url-scheme'(value) { + return value.startsWith('://'); + }, + 'url-web'(value) { + return false; + } +} + +class RuleValidator { + + constructor(message) { + this._message = message + } + + async validateRule(fieldKey, fieldValue, value, data, allData) { + var result = null + + let rules = fieldValue.rules + + let hasRequired = rules.findIndex((item) => { + return item.required + }) + if (hasRequired < 0) { + if (value === null || value === undefined) { + return result + } + if (typeof value === 'string' && !value.length) { + return result + } + } + + var message = this._message + + if (rules === undefined) { + return message['default'] + } + + for (var i = 0; i < rules.length; i++) { + let rule = rules[i] + let vt = this._getValidateType(rule) + + Object.assign(rule, { + label: fieldValue.label || `["${fieldKey}"]` + }) + + if (RuleValidatorHelper[vt]) { + result = RuleValidatorHelper[vt](rule, value, message) + if (result != null) { + break + } + } + + if (rule.validateExpr) { + let now = Date.now() + let resultExpr = rule.validateExpr(value, allData, now) + if (resultExpr === false) { + result = this._getMessage(rule, rule.errorMessage || this._message['default']) + break + } + } + + if (rule.validateFunction) { + result = await this.validateFunction(rule, value, data, allData, vt) + if (result !== null) { + break + } + } + } + + if (result !== null) { + result = message.TAG + result + } + + return result + } + + async validateFunction(rule, value, data, allData, vt) { + let result = null + try { + let callbackMessage = null + const res = await rule.validateFunction(rule, value, allData || data, (message) => { + callbackMessage = message + }) + if (callbackMessage || (typeof res === 'string' && res) || res === false) { + result = this._getMessage(rule, callbackMessage || res, vt) + } + } catch (e) { + result = this._getMessage(rule, e.message, vt) + } + return result + } + + _getMessage(rule, message, vt) { + return formatMessage(rule, message || rule.errorMessage || this._message[vt] || message['default']) + } + + _getValidateType(rule) { + var result = '' + if (rule.required) { + result = 'required' + } else if (rule.format) { + result = 'format' + } else if (rule.arrayType) { + result = 'arrayTypeFormat' + } else if (rule.range) { + result = 'range' + } else if (rule.maximum !== undefined || rule.minimum !== undefined) { + result = 'rangeNumber' + } else if (rule.maxLength !== undefined || rule.minLength !== undefined) { + result = 'rangeLength' + } else if (rule.pattern) { + result = 'pattern' + } else if (rule.validateFunction) { + result = 'validateFunction' + } + return result + } +} + +const RuleValidatorHelper = { + required(rule, value, message) { + if (rule.required && isEmptyValue(value, rule.format || typeof value)) { + return formatMessage(rule, rule.errorMessage || message.required); + } + + return null + }, + + range(rule, value, message) { + const { + range, + errorMessage + } = rule; + + let list = new Array(range.length); + for (let i = 0; i < range.length; i++) { + const item = range[i]; + if (types.object(item) && item.value !== undefined) { + list[i] = item.value; + } else { + list[i] = item; + } + } + + let result = false + if (Array.isArray(value)) { + result = (new Set(value.concat(list)).size === list.length); + } else { + if (list.indexOf(value) > -1) { + result = true; + } + } + + if (!result) { + return formatMessage(rule, errorMessage || message['enum']); + } + + return null + }, + + rangeNumber(rule, value, message) { + if (!types.number(value)) { + return formatMessage(rule, rule.errorMessage || message.pattern.mismatch); + } + + let { + minimum, + maximum, + exclusiveMinimum, + exclusiveMaximum + } = rule; + let min = exclusiveMinimum ? value <= minimum : value < minimum; + let max = exclusiveMaximum ? value >= maximum : value > maximum; + + if (minimum !== undefined && min) { + return formatMessage(rule, rule.errorMessage || message['number'][exclusiveMinimum ? + 'exclusiveMinimum' : 'minimum' + ]) + } else if (maximum !== undefined && max) { + return formatMessage(rule, rule.errorMessage || message['number'][exclusiveMaximum ? + 'exclusiveMaximum' : 'maximum' + ]) + } else if (minimum !== undefined && maximum !== undefined && (min || max)) { + return formatMessage(rule, rule.errorMessage || message['number'].range) + } + + return null + }, + + rangeLength(rule, value, message) { + if (!types.string(value) && !types.array(value)) { + return formatMessage(rule, rule.errorMessage || message.pattern.mismatch); + } + + let min = rule.minLength; + let max = rule.maxLength; + let val = value.length; + + if (min !== undefined && val < min) { + return formatMessage(rule, rule.errorMessage || message['length'].minLength) + } else if (max !== undefined && val > max) { + return formatMessage(rule, rule.errorMessage || message['length'].maxLength) + } else if (min !== undefined && max !== undefined && (val < min || val > max)) { + return formatMessage(rule, rule.errorMessage || message['length'].range) + } + + return null + }, + + pattern(rule, value, message) { + if (!types['pattern'](rule.pattern, value)) { + return formatMessage(rule, rule.errorMessage || message.pattern.mismatch); + } + + return null + }, + + format(rule, value, message) { + var customTypes = Object.keys(types); + var format = FORMAT_MAPPING[rule.format] ? FORMAT_MAPPING[rule.format] : (rule.format || rule.arrayType); + + if (customTypes.indexOf(format) > -1) { + if (!types[format](value)) { + return formatMessage(rule, rule.errorMessage || message.typeError); + } + } + + return null + }, + + arrayTypeFormat(rule, value, message) { + if (!Array.isArray(value)) { + return formatMessage(rule, rule.errorMessage || message.typeError); + } + + for (let i = 0; i < value.length; i++) { + const element = value[i]; + let formatResult = this.format(rule, element, message) + if (formatResult !== null) { + return formatResult + } + } + + return null + } +} + +class SchemaValidator extends RuleValidator { + + constructor(schema, options) { + super(SchemaValidator.message); + + this._schema = schema + this._options = options || null + } + + updateSchema(schema) { + this._schema = schema + } + + async validate(data, allData) { + let result = this._checkFieldInSchema(data) + if (!result) { + result = await this.invokeValidate(data, false, allData) + } + return result.length ? result[0] : null + } + + async validateAll(data, allData) { + let result = this._checkFieldInSchema(data) + if (!result) { + result = await this.invokeValidate(data, true, allData) + } + return result + } + + async validateUpdate(data, allData) { + let result = this._checkFieldInSchema(data) + if (!result) { + result = await this.invokeValidateUpdate(data, false, allData) + } + return result.length ? result[0] : null + } + + async invokeValidate(data, all, allData) { + let result = [] + let schema = this._schema + for (let key in schema) { + let value = schema[key] + let errorMessage = await this.validateRule(key, value, data[key], data, allData) + if (errorMessage != null) { + result.push({ + key, + errorMessage + }) + if (!all) break + } + } + return result + } + + async invokeValidateUpdate(data, all, allData) { + let result = [] + for (let key in data) { + let errorMessage = await this.validateRule(key, this._schema[key], data[key], data, allData) + if (errorMessage != null) { + result.push({ + key, + errorMessage + }) + if (!all) break + } + } + return result + } + + _checkFieldInSchema(data) { + var keys = Object.keys(data) + var keys2 = Object.keys(this._schema) + if (new Set(keys.concat(keys2)).size === keys2.length) { + return '' + } + + var noExistFields = keys.filter((key) => { + return keys2.indexOf(key) < 0; + }) + var errorMessage = formatMessage({ + field: JSON.stringify(noExistFields) + }, SchemaValidator.message.TAG + SchemaValidator.message['defaultInvalid']) + return [{ + key: 'invalid', + errorMessage + }] + } +} + +function Message() { + return { + TAG: "", + default: '验证错误', + defaultInvalid: '提交的字段{field}在数据库中并不存在', + validateFunction: '验证无效', + required: '{label}必填', + 'enum': '{label}超出范围', + timestamp: '{label}格式无效', + whitespace: '{label}不能为空', + typeError: '{label}类型无效', + date: { + format: '{label}日期{value}格式无效', + parse: '{label}日期无法解析,{value}无效', + invalid: '{label}日期{value}无效' + }, + length: { + minLength: '{label}长度不能少于{minLength}', + maxLength: '{label}长度不能超过{maxLength}', + range: '{label}必须介于{minLength}和{maxLength}之间' + }, + number: { + minimum: '{label}不能小于{minimum}', + maximum: '{label}不能大于{maximum}', + exclusiveMinimum: '{label}不能小于等于{minimum}', + exclusiveMaximum: '{label}不能大于等于{maximum}', + range: '{label}必须介于{minimum}and{maximum}之间' + }, + pattern: { + mismatch: '{label}格式不匹配' + } + }; +} + + +SchemaValidator.message = new Message(); + +export default SchemaValidator diff --git a/uni_modules/uni-forms/package.json b/uni_modules/uni-forms/package.json new file mode 100644 index 0000000..464b4e6 --- /dev/null +++ b/uni_modules/uni-forms/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-forms", + "displayName": "uni-forms 表单", + "version": "1.4.10", + "description": "由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据", + "keywords": [ + "uni-ui", + "表单", + "校验", + "表单校验", + "表单验证" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-forms/readme.md b/uni_modules/uni-forms/readme.md new file mode 100644 index 0000000..63d5a04 --- /dev/null +++ b/uni_modules/uni-forms/readme.md @@ -0,0 +1,23 @@ + + +## Forms 表单 + +> **组件名:uni-forms** +> 代码块: `uForms`、`uni-forms-item` +> 关联组件:`uni-forms-item`、`uni-easyinput`、`uni-data-checkbox`、`uni-group`。 + + +uni-app的内置组件已经有了 `
`组件,用于提交表单内容。 + +然而几乎每个表单都需要做表单验证,为了方便做表单验证,减少重复开发,`uni ui` 又基于 ``组件封装了 ``组件,内置了表单验证功能。 + +`` 提供了 `rules`属性来描述校验规则、``子组件来包裹具体的表单项,以及给原生或三方组件提供了 `binddata()` 来设置表单值。 + +每个要校验的表单项,不管input还是checkbox,都必须放在``组件中,且一个``组件只能放置一个表单项。 + +``组件内部预留了显示error message的区域,默认是在表单项的底部。 + +另外,``组件下面的各个表单项,可以通过``包裹为不同的分组。同一``下的不同表单项目将聚拢在一起,同其他group保持垂直间距。``仅影响视觉效果。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-forms) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-goods-nav/changelog.md b/uni_modules/uni-goods-nav/changelog.md new file mode 100644 index 0000000..c6264c6 --- /dev/null +++ b/uni_modules/uni-goods-nav/changelog.md @@ -0,0 +1,18 @@ +## 1.2.1(2022-05-30) +- 新增 stat属性,是否开启uni统计功能 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-goods-nav](https://uniapp.dcloud.io/component/uniui/uni-goods-nav) +## 1.1.1(2021-08-24) +- 新增 支持国际化 +## 1.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-05-12) +- 新增 组件示例地址 +## 1.0.6(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.5(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json new file mode 100644 index 0000000..dcdba41 --- /dev/null +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json @@ -0,0 +1,6 @@ +{ + "uni-goods-nav.options.shop": "shop", + "uni-goods-nav.options.cart": "cart", + "uni-goods-nav.buttonGroup.addToCart": "add to cart", + "uni-goods-nav.buttonGroup.buyNow": "buy now" +} diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json new file mode 100644 index 0000000..48ee344 --- /dev/null +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json @@ -0,0 +1,6 @@ +{ + "uni-goods-nav.options.shop": "店铺", + "uni-goods-nav.options.cart": "购物车", + "uni-goods-nav.buttonGroup.addToCart": "加入购物车", + "uni-goods-nav.buttonGroup.buyNow": "立即购买" +} diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json new file mode 100644 index 0000000..d0a0255 --- /dev/null +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json @@ -0,0 +1,6 @@ +{ + "uni-goods-nav.options.shop": "店鋪", + "uni-goods-nav.options.cart": "購物車", + "uni-goods-nav.buttonGroup.addToCart": "加入購物車", + "uni-goods-nav.buttonGroup.buyNow": "立即購買" +} diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue b/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue new file mode 100644 index 0000000..e79a0fa --- /dev/null +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue @@ -0,0 +1,231 @@ + + + + + diff --git a/uni_modules/uni-goods-nav/package.json b/uni_modules/uni-goods-nav/package.json new file mode 100644 index 0000000..636e45e --- /dev/null +++ b/uni_modules/uni-goods-nav/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-goods-nav", + "displayName": "uni-goods-nav 商品导航", + "version": "1.2.1", + "description": "商品导航组件主要用于电商类应用底部导航,可自定义加入购物车,购买等操作", + "keywords": [ + "uni-ui", + "uniui", + "商品导航" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-goods-nav/readme.md b/uni_modules/uni-goods-nav/readme.md new file mode 100644 index 0000000..07df93f --- /dev/null +++ b/uni_modules/uni-goods-nav/readme.md @@ -0,0 +1,10 @@ + + +## GoodsNav 商品导航 +> **组件名:uni-goods-nav** +> 代码块: `uGoodsNav` + +商品加入购物车,立即购买等。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-goods-nav) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-grid/changelog.md b/uni_modules/uni-grid/changelog.md new file mode 100644 index 0000000..d301166 --- /dev/null +++ b/uni_modules/uni-grid/changelog.md @@ -0,0 +1,13 @@ +## 1.4.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-grid](https://uniapp.dcloud.io/component/uniui/uni-grid) +## 1.3.2(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 1.3.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.3.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.2.4(2021-05-12) +- 新增 组件示例地址 +## 1.2.3(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue b/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue new file mode 100644 index 0000000..19c08d7 --- /dev/null +++ b/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/uni_modules/uni-grid/components/uni-grid/uni-grid.vue b/uni_modules/uni-grid/components/uni-grid/uni-grid.vue new file mode 100644 index 0000000..0edc7ff --- /dev/null +++ b/uni_modules/uni-grid/components/uni-grid/uni-grid.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/uni_modules/uni-grid/package.json b/uni_modules/uni-grid/package.json new file mode 100644 index 0000000..ccb2c91 --- /dev/null +++ b/uni_modules/uni-grid/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-grid", + "displayName": "uni-grid 宫格", + "version": "1.4.0", + "description": "Grid 宫格组件,提供移动端常见的宫格布局,如九宫格。", + "keywords": [ + "uni-ui", + "uniui", + "九宫格", + "表格" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss","uni-icons"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-grid/readme.md b/uni_modules/uni-grid/readme.md new file mode 100644 index 0000000..0aa44cc --- /dev/null +++ b/uni_modules/uni-grid/readme.md @@ -0,0 +1,11 @@ + + +## Grid 宫格 +> **组件名:uni-grid** +> 代码块: `uGrid` + + +宫格组件。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-grid) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-group/changelog.md b/uni_modules/uni-group/changelog.md new file mode 100644 index 0000000..a7024fd --- /dev/null +++ b/uni_modules/uni-group/changelog.md @@ -0,0 +1,16 @@ +## 1.2.2(2022-05-30) +- 新增 stat属性,是否开启uni统计功能 +## 1.2.1(2021-11-22) +- 修复 vue3中某些scss变量无法找到的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-group](https://uniapp.dcloud.io/component/uniui/uni-group) +## 1.1.7(2021-11-08) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +- 优化 组件文档 +## 1.0.3(2021-05-12) +- 新增 组件示例地址 +## 1.0.2(2021-02-05) +- 调整为uni_modules目录规范 +- 优化 兼容 nvue 页面 diff --git a/uni_modules/uni-group/components/uni-group/uni-group.vue b/uni_modules/uni-group/components/uni-group/uni-group.vue new file mode 100644 index 0000000..3425ecd --- /dev/null +++ b/uni_modules/uni-group/components/uni-group/uni-group.vue @@ -0,0 +1,134 @@ + + + + diff --git a/uni_modules/uni-group/package.json b/uni_modules/uni-group/package.json new file mode 100644 index 0000000..ea00a08 --- /dev/null +++ b/uni_modules/uni-group/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-group", + "displayName": "uni-group 分组", + "version": "1.2.2", + "description": "分组组件可用于将组件用于分组,添加间隔,以产生明显的区块", + "keywords": [ + "uni-ui", + "uniui", + "group", + "分组", + "" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-group/readme.md b/uni_modules/uni-group/readme.md new file mode 100644 index 0000000..bae67f4 --- /dev/null +++ b/uni_modules/uni-group/readme.md @@ -0,0 +1,9 @@ + +## Group 分组 +> **组件名:uni-group** +> 代码块: `uGroup` + +分组组件可用于将组件分组,添加间隔,以产生明显的区块。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-group) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-icons/changelog.md b/uni_modules/uni-icons/changelog.md new file mode 100644 index 0000000..0261131 --- /dev/null +++ b/uni_modules/uni-icons/changelog.md @@ -0,0 +1,42 @@ +## 2.0.10(2024-06-07) +- 优化 uni-app x 中,size 属性的类型 +## 2.0.9(2024-01-12) +fix: 修复图标大小默认值错误的问题 +## 2.0.8(2023-12-14) +- 修复 项目未使用 ts 情况下,打包报错的bug +## 2.0.7(2023-12-14) +- 修复 size 属性为 string 时,不加单位导致尺寸异常的bug +## 2.0.6(2023-12-11) +- 优化 兼容老版本icon类型,如 top ,bottom 等 +## 2.0.5(2023-12-11) +- 优化 兼容老版本icon类型,如 top ,bottom 等 +## 2.0.4(2023-12-06) +- 优化 uni-app x 下示例项目图标排序 +## 2.0.3(2023-12-06) +- 修复 nvue下引入组件报错的bug +## 2.0.2(2023-12-05) +-优化 size 属性支持单位 +## 2.0.1(2023-12-05) +- 新增 uni-app x 支持定义图标 +## 1.3.5(2022-01-24) +- 优化 size 属性可以传入不带单位的字符串数值 +## 1.3.4(2022-01-24) +- 优化 size 支持其他单位 +## 1.3.3(2022-01-17) +- 修复 nvue 有些图标不显示的bug,兼容老版本图标 +## 1.3.2(2021-12-01) +- 优化 示例可复制图标名称 +## 1.3.1(2021-11-23) +- 优化 兼容旧组件 type 值 +## 1.3.0(2021-11-19) +- 新增 更多图标 +- 优化 自定义图标使用方式 +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-icons](https://uniapp.dcloud.io/component/uniui/uni-icons) +## 1.1.7(2021-11-08) +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.5(2021-05-12) +- 新增 组件示例地址 +## 1.1.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue b/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue new file mode 100644 index 0000000..8740559 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue @@ -0,0 +1,91 @@ + + + + + diff --git a/uni_modules/uni-icons/components/uni-icons/uni-icons.vue b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue new file mode 100644 index 0000000..7da5356 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.css b/uni_modules/uni-icons/components/uni-icons/uniicons.css new file mode 100644 index 0000000..0a6b6fe --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uniicons.css @@ -0,0 +1,664 @@ + +.uniui-cart-filled:before { + content: "\e6d0"; +} + +.uniui-gift-filled:before { + content: "\e6c4"; +} + +.uniui-color:before { + content: "\e6cf"; +} + +.uniui-wallet:before { + content: "\e6b1"; +} + +.uniui-settings-filled:before { + content: "\e6ce"; +} + +.uniui-auth-filled:before { + content: "\e6cc"; +} + +.uniui-shop-filled:before { + content: "\e6cd"; +} + +.uniui-staff-filled:before { + content: "\e6cb"; +} + +.uniui-vip-filled:before { + content: "\e6c6"; +} + +.uniui-plus-filled:before { + content: "\e6c7"; +} + +.uniui-folder-add-filled:before { + content: "\e6c8"; +} + +.uniui-color-filled:before { + content: "\e6c9"; +} + +.uniui-tune-filled:before { + content: "\e6ca"; +} + +.uniui-calendar-filled:before { + content: "\e6c0"; +} + +.uniui-notification-filled:before { + content: "\e6c1"; +} + +.uniui-wallet-filled:before { + content: "\e6c2"; +} + +.uniui-medal-filled:before { + content: "\e6c3"; +} + +.uniui-fire-filled:before { + content: "\e6c5"; +} + +.uniui-refreshempty:before { + content: "\e6bf"; +} + +.uniui-location-filled:before { + content: "\e6af"; +} + +.uniui-person-filled:before { + content: "\e69d"; +} + +.uniui-personadd-filled:before { + content: "\e698"; +} + +.uniui-arrowthinleft:before { + content: "\e6d2"; +} + +.uniui-arrowthinup:before { + content: "\e6d3"; +} + +.uniui-arrowthindown:before { + content: "\e6d4"; +} + +.uniui-back:before { + content: "\e6b9"; +} + +.uniui-forward:before { + content: "\e6ba"; +} + +.uniui-arrow-right:before { + content: "\e6bb"; +} + +.uniui-arrow-left:before { + content: "\e6bc"; +} + +.uniui-arrow-up:before { + content: "\e6bd"; +} + +.uniui-arrow-down:before { + content: "\e6be"; +} + +.uniui-arrowthinright:before { + content: "\e6d1"; +} + +.uniui-down:before { + content: "\e6b8"; +} + +.uniui-bottom:before { + content: "\e6b8"; +} + +.uniui-arrowright:before { + content: "\e6d5"; +} + +.uniui-right:before { + content: "\e6b5"; +} + +.uniui-up:before { + content: "\e6b6"; +} + +.uniui-top:before { + content: "\e6b6"; +} + +.uniui-left:before { + content: "\e6b7"; +} + +.uniui-arrowup:before { + content: "\e6d6"; +} + +.uniui-eye:before { + content: "\e651"; +} + +.uniui-eye-filled:before { + content: "\e66a"; +} + +.uniui-eye-slash:before { + content: "\e6b3"; +} + +.uniui-eye-slash-filled:before { + content: "\e6b4"; +} + +.uniui-info-filled:before { + content: "\e649"; +} + +.uniui-reload:before { + content: "\e6b2"; +} + +.uniui-micoff-filled:before { + content: "\e6b0"; +} + +.uniui-map-pin-ellipse:before { + content: "\e6ac"; +} + +.uniui-map-pin:before { + content: "\e6ad"; +} + +.uniui-location:before { + content: "\e6ae"; +} + +.uniui-starhalf:before { + content: "\e683"; +} + +.uniui-star:before { + content: "\e688"; +} + +.uniui-star-filled:before { + content: "\e68f"; +} + +.uniui-calendar:before { + content: "\e6a0"; +} + +.uniui-fire:before { + content: "\e6a1"; +} + +.uniui-medal:before { + content: "\e6a2"; +} + +.uniui-font:before { + content: "\e6a3"; +} + +.uniui-gift:before { + content: "\e6a4"; +} + +.uniui-link:before { + content: "\e6a5"; +} + +.uniui-notification:before { + content: "\e6a6"; +} + +.uniui-staff:before { + content: "\e6a7"; +} + +.uniui-vip:before { + content: "\e6a8"; +} + +.uniui-folder-add:before { + content: "\e6a9"; +} + +.uniui-tune:before { + content: "\e6aa"; +} + +.uniui-auth:before { + content: "\e6ab"; +} + +.uniui-person:before { + content: "\e699"; +} + +.uniui-email-filled:before { + content: "\e69a"; +} + +.uniui-phone-filled:before { + content: "\e69b"; +} + +.uniui-phone:before { + content: "\e69c"; +} + +.uniui-email:before { + content: "\e69e"; +} + +.uniui-personadd:before { + content: "\e69f"; +} + +.uniui-chatboxes-filled:before { + content: "\e692"; +} + +.uniui-contact:before { + content: "\e693"; +} + +.uniui-chatbubble-filled:before { + content: "\e694"; +} + +.uniui-contact-filled:before { + content: "\e695"; +} + +.uniui-chatboxes:before { + content: "\e696"; +} + +.uniui-chatbubble:before { + content: "\e697"; +} + +.uniui-upload-filled:before { + content: "\e68e"; +} + +.uniui-upload:before { + content: "\e690"; +} + +.uniui-weixin:before { + content: "\e691"; +} + +.uniui-compose:before { + content: "\e67f"; +} + +.uniui-qq:before { + content: "\e680"; +} + +.uniui-download-filled:before { + content: "\e681"; +} + +.uniui-pyq:before { + content: "\e682"; +} + +.uniui-sound:before { + content: "\e684"; +} + +.uniui-trash-filled:before { + content: "\e685"; +} + +.uniui-sound-filled:before { + content: "\e686"; +} + +.uniui-trash:before { + content: "\e687"; +} + +.uniui-videocam-filled:before { + content: "\e689"; +} + +.uniui-spinner-cycle:before { + content: "\e68a"; +} + +.uniui-weibo:before { + content: "\e68b"; +} + +.uniui-videocam:before { + content: "\e68c"; +} + +.uniui-download:before { + content: "\e68d"; +} + +.uniui-help:before { + content: "\e679"; +} + +.uniui-navigate-filled:before { + content: "\e67a"; +} + +.uniui-plusempty:before { + content: "\e67b"; +} + +.uniui-smallcircle:before { + content: "\e67c"; +} + +.uniui-minus-filled:before { + content: "\e67d"; +} + +.uniui-micoff:before { + content: "\e67e"; +} + +.uniui-closeempty:before { + content: "\e66c"; +} + +.uniui-clear:before { + content: "\e66d"; +} + +.uniui-navigate:before { + content: "\e66e"; +} + +.uniui-minus:before { + content: "\e66f"; +} + +.uniui-image:before { + content: "\e670"; +} + +.uniui-mic:before { + content: "\e671"; +} + +.uniui-paperplane:before { + content: "\e672"; +} + +.uniui-close:before { + content: "\e673"; +} + +.uniui-help-filled:before { + content: "\e674"; +} + +.uniui-paperplane-filled:before { + content: "\e675"; +} + +.uniui-plus:before { + content: "\e676"; +} + +.uniui-mic-filled:before { + content: "\e677"; +} + +.uniui-image-filled:before { + content: "\e678"; +} + +.uniui-locked-filled:before { + content: "\e668"; +} + +.uniui-info:before { + content: "\e669"; +} + +.uniui-locked:before { + content: "\e66b"; +} + +.uniui-camera-filled:before { + content: "\e658"; +} + +.uniui-chat-filled:before { + content: "\e659"; +} + +.uniui-camera:before { + content: "\e65a"; +} + +.uniui-circle:before { + content: "\e65b"; +} + +.uniui-checkmarkempty:before { + content: "\e65c"; +} + +.uniui-chat:before { + content: "\e65d"; +} + +.uniui-circle-filled:before { + content: "\e65e"; +} + +.uniui-flag:before { + content: "\e65f"; +} + +.uniui-flag-filled:before { + content: "\e660"; +} + +.uniui-gear-filled:before { + content: "\e661"; +} + +.uniui-home:before { + content: "\e662"; +} + +.uniui-home-filled:before { + content: "\e663"; +} + +.uniui-gear:before { + content: "\e664"; +} + +.uniui-smallcircle-filled:before { + content: "\e665"; +} + +.uniui-map-filled:before { + content: "\e666"; +} + +.uniui-map:before { + content: "\e667"; +} + +.uniui-refresh-filled:before { + content: "\e656"; +} + +.uniui-refresh:before { + content: "\e657"; +} + +.uniui-cloud-upload:before { + content: "\e645"; +} + +.uniui-cloud-download-filled:before { + content: "\e646"; +} + +.uniui-cloud-download:before { + content: "\e647"; +} + +.uniui-cloud-upload-filled:before { + content: "\e648"; +} + +.uniui-redo:before { + content: "\e64a"; +} + +.uniui-images-filled:before { + content: "\e64b"; +} + +.uniui-undo-filled:before { + content: "\e64c"; +} + +.uniui-more:before { + content: "\e64d"; +} + +.uniui-more-filled:before { + content: "\e64e"; +} + +.uniui-undo:before { + content: "\e64f"; +} + +.uniui-images:before { + content: "\e650"; +} + +.uniui-paperclip:before { + content: "\e652"; +} + +.uniui-settings:before { + content: "\e653"; +} + +.uniui-search:before { + content: "\e654"; +} + +.uniui-redo-filled:before { + content: "\e655"; +} + +.uniui-list:before { + content: "\e644"; +} + +.uniui-mail-open-filled:before { + content: "\e63a"; +} + +.uniui-hand-down-filled:before { + content: "\e63c"; +} + +.uniui-hand-down:before { + content: "\e63d"; +} + +.uniui-hand-up-filled:before { + content: "\e63e"; +} + +.uniui-hand-up:before { + content: "\e63f"; +} + +.uniui-heart-filled:before { + content: "\e641"; +} + +.uniui-mail-open:before { + content: "\e643"; +} + +.uniui-heart:before { + content: "\e639"; +} + +.uniui-loop:before { + content: "\e633"; +} + +.uniui-pulldown:before { + content: "\e632"; +} + +.uniui-scan:before { + content: "\e62a"; +} + +.uniui-bars:before { + content: "\e627"; +} + +.uniui-checkbox:before { + content: "\e62b"; +} + +.uniui-checkbox-filled:before { + content: "\e62c"; +} + +.uniui-shop:before { + content: "\e62f"; +} + +.uniui-headphones:before { + content: "\e630"; +} + +.uniui-cart:before { + content: "\e631"; +} diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.ttf b/uni_modules/uni-icons/components/uni-icons/uniicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..14696d038d828073edac09ea4e5ba1dec2f58115 GIT binary patch literal 35824 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 F{2S@rCxHL} literal 0 HcmV?d00001 diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons_file.ts b/uni_modules/uni-icons/components/uni-icons/uniicons_file.ts new file mode 100644 index 0000000..98e93aa --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uniicons_file.ts @@ -0,0 +1,664 @@ + +export type IconsData = { + id : string + name : string + font_family : string + css_prefix_text : string + description : string + glyphs : Array +} + +export type IconsDataItem = { + font_class : string + unicode : string +} + + +export const fontData = [ + { + "font_class": "arrow-down", + "unicode": "\ue6be" + }, + { + "font_class": "arrow-left", + "unicode": "\ue6bc" + }, + { + "font_class": "arrow-right", + "unicode": "\ue6bb" + }, + { + "font_class": "arrow-up", + "unicode": "\ue6bd" + }, + { + "font_class": "auth", + "unicode": "\ue6ab" + }, + { + "font_class": "auth-filled", + "unicode": "\ue6cc" + }, + { + "font_class": "back", + "unicode": "\ue6b9" + }, + { + "font_class": "bars", + "unicode": "\ue627" + }, + { + "font_class": "calendar", + "unicode": "\ue6a0" + }, + { + "font_class": "calendar-filled", + "unicode": "\ue6c0" + }, + { + "font_class": "camera", + "unicode": "\ue65a" + }, + { + "font_class": "camera-filled", + "unicode": "\ue658" + }, + { + "font_class": "cart", + "unicode": "\ue631" + }, + { + "font_class": "cart-filled", + "unicode": "\ue6d0" + }, + { + "font_class": "chat", + "unicode": "\ue65d" + }, + { + "font_class": "chat-filled", + "unicode": "\ue659" + }, + { + "font_class": "chatboxes", + "unicode": "\ue696" + }, + { + "font_class": "chatboxes-filled", + "unicode": "\ue692" + }, + { + "font_class": "chatbubble", + "unicode": "\ue697" + }, + { + "font_class": "chatbubble-filled", + "unicode": "\ue694" + }, + { + "font_class": "checkbox", + "unicode": "\ue62b" + }, + { + "font_class": "checkbox-filled", + "unicode": "\ue62c" + }, + { + "font_class": "checkmarkempty", + "unicode": "\ue65c" + }, + { + "font_class": "circle", + "unicode": "\ue65b" + }, + { + "font_class": "circle-filled", + "unicode": "\ue65e" + }, + { + "font_class": "clear", + "unicode": "\ue66d" + }, + { + "font_class": "close", + "unicode": "\ue673" + }, + { + "font_class": "closeempty", + "unicode": "\ue66c" + }, + { + "font_class": "cloud-download", + "unicode": "\ue647" + }, + { + "font_class": "cloud-download-filled", + "unicode": "\ue646" + }, + { + "font_class": "cloud-upload", + "unicode": "\ue645" + }, + { + "font_class": "cloud-upload-filled", + "unicode": "\ue648" + }, + { + "font_class": "color", + "unicode": "\ue6cf" + }, + { + "font_class": "color-filled", + "unicode": "\ue6c9" + }, + { + "font_class": "compose", + "unicode": "\ue67f" + }, + { + "font_class": "contact", + "unicode": "\ue693" + }, + { + "font_class": "contact-filled", + "unicode": "\ue695" + }, + { + "font_class": "down", + "unicode": "\ue6b8" + }, + { + "font_class": "bottom", + "unicode": "\ue6b8" + }, + { + "font_class": "download", + "unicode": "\ue68d" + }, + { + "font_class": "download-filled", + "unicode": "\ue681" + }, + { + "font_class": "email", + "unicode": "\ue69e" + }, + { + "font_class": "email-filled", + "unicode": "\ue69a" + }, + { + "font_class": "eye", + "unicode": "\ue651" + }, + { + "font_class": "eye-filled", + "unicode": "\ue66a" + }, + { + "font_class": "eye-slash", + "unicode": "\ue6b3" + }, + { + "font_class": "eye-slash-filled", + "unicode": "\ue6b4" + }, + { + "font_class": "fire", + "unicode": "\ue6a1" + }, + { + "font_class": "fire-filled", + "unicode": "\ue6c5" + }, + { + "font_class": "flag", + "unicode": "\ue65f" + }, + { + "font_class": "flag-filled", + "unicode": "\ue660" + }, + { + "font_class": "folder-add", + "unicode": "\ue6a9" + }, + { + "font_class": "folder-add-filled", + "unicode": "\ue6c8" + }, + { + "font_class": "font", + "unicode": "\ue6a3" + }, + { + "font_class": "forward", + "unicode": "\ue6ba" + }, + { + "font_class": "gear", + "unicode": "\ue664" + }, + { + "font_class": "gear-filled", + "unicode": "\ue661" + }, + { + "font_class": "gift", + "unicode": "\ue6a4" + }, + { + "font_class": "gift-filled", + "unicode": "\ue6c4" + }, + { + "font_class": "hand-down", + "unicode": "\ue63d" + }, + { + "font_class": "hand-down-filled", + "unicode": "\ue63c" + }, + { + "font_class": "hand-up", + "unicode": "\ue63f" + }, + { + "font_class": "hand-up-filled", + "unicode": "\ue63e" + }, + { + "font_class": "headphones", + "unicode": "\ue630" + }, + { + "font_class": "heart", + "unicode": "\ue639" + }, + { + "font_class": "heart-filled", + "unicode": "\ue641" + }, + { + "font_class": "help", + "unicode": "\ue679" + }, + { + "font_class": "help-filled", + "unicode": "\ue674" + }, + { + "font_class": "home", + "unicode": "\ue662" + }, + { + "font_class": "home-filled", + "unicode": "\ue663" + }, + { + "font_class": "image", + "unicode": "\ue670" + }, + { + "font_class": "image-filled", + "unicode": "\ue678" + }, + { + "font_class": "images", + "unicode": "\ue650" + }, + { + "font_class": "images-filled", + "unicode": "\ue64b" + }, + { + "font_class": "info", + "unicode": "\ue669" + }, + { + "font_class": "info-filled", + "unicode": "\ue649" + }, + { + "font_class": "left", + "unicode": "\ue6b7" + }, + { + "font_class": "link", + "unicode": "\ue6a5" + }, + { + "font_class": "list", + "unicode": "\ue644" + }, + { + "font_class": "location", + "unicode": "\ue6ae" + }, + { + "font_class": "location-filled", + "unicode": "\ue6af" + }, + { + "font_class": "locked", + "unicode": "\ue66b" + }, + { + "font_class": "locked-filled", + "unicode": "\ue668" + }, + { + "font_class": "loop", + "unicode": "\ue633" + }, + { + "font_class": "mail-open", + "unicode": "\ue643" + }, + { + "font_class": "mail-open-filled", + "unicode": "\ue63a" + }, + { + "font_class": "map", + "unicode": "\ue667" + }, + { + "font_class": "map-filled", + "unicode": "\ue666" + }, + { + "font_class": "map-pin", + "unicode": "\ue6ad" + }, + { + "font_class": "map-pin-ellipse", + "unicode": "\ue6ac" + }, + { + "font_class": "medal", + "unicode": "\ue6a2" + }, + { + "font_class": "medal-filled", + "unicode": "\ue6c3" + }, + { + "font_class": "mic", + "unicode": "\ue671" + }, + { + "font_class": "mic-filled", + "unicode": "\ue677" + }, + { + "font_class": "micoff", + "unicode": "\ue67e" + }, + { + "font_class": "micoff-filled", + "unicode": "\ue6b0" + }, + { + "font_class": "minus", + "unicode": "\ue66f" + }, + { + "font_class": "minus-filled", + "unicode": "\ue67d" + }, + { + "font_class": "more", + "unicode": "\ue64d" + }, + { + "font_class": "more-filled", + "unicode": "\ue64e" + }, + { + "font_class": "navigate", + "unicode": "\ue66e" + }, + { + "font_class": "navigate-filled", + "unicode": "\ue67a" + }, + { + "font_class": "notification", + "unicode": "\ue6a6" + }, + { + "font_class": "notification-filled", + "unicode": "\ue6c1" + }, + { + "font_class": "paperclip", + "unicode": "\ue652" + }, + { + "font_class": "paperplane", + "unicode": "\ue672" + }, + { + "font_class": "paperplane-filled", + "unicode": "\ue675" + }, + { + "font_class": "person", + "unicode": "\ue699" + }, + { + "font_class": "person-filled", + "unicode": "\ue69d" + }, + { + "font_class": "personadd", + "unicode": "\ue69f" + }, + { + "font_class": "personadd-filled", + "unicode": "\ue698" + }, + { + "font_class": "personadd-filled-copy", + "unicode": "\ue6d1" + }, + { + "font_class": "phone", + "unicode": "\ue69c" + }, + { + "font_class": "phone-filled", + "unicode": "\ue69b" + }, + { + "font_class": "plus", + "unicode": "\ue676" + }, + { + "font_class": "plus-filled", + "unicode": "\ue6c7" + }, + { + "font_class": "plusempty", + "unicode": "\ue67b" + }, + { + "font_class": "pulldown", + "unicode": "\ue632" + }, + { + "font_class": "pyq", + "unicode": "\ue682" + }, + { + "font_class": "qq", + "unicode": "\ue680" + }, + { + "font_class": "redo", + "unicode": "\ue64a" + }, + { + "font_class": "redo-filled", + "unicode": "\ue655" + }, + { + "font_class": "refresh", + "unicode": "\ue657" + }, + { + "font_class": "refresh-filled", + "unicode": "\ue656" + }, + { + "font_class": "refreshempty", + "unicode": "\ue6bf" + }, + { + "font_class": "reload", + "unicode": "\ue6b2" + }, + { + "font_class": "right", + "unicode": "\ue6b5" + }, + { + "font_class": "scan", + "unicode": "\ue62a" + }, + { + "font_class": "search", + "unicode": "\ue654" + }, + { + "font_class": "settings", + "unicode": "\ue653" + }, + { + "font_class": "settings-filled", + "unicode": "\ue6ce" + }, + { + "font_class": "shop", + "unicode": "\ue62f" + }, + { + "font_class": "shop-filled", + "unicode": "\ue6cd" + }, + { + "font_class": "smallcircle", + "unicode": "\ue67c" + }, + { + "font_class": "smallcircle-filled", + "unicode": "\ue665" + }, + { + "font_class": "sound", + "unicode": "\ue684" + }, + { + "font_class": "sound-filled", + "unicode": "\ue686" + }, + { + "font_class": "spinner-cycle", + "unicode": "\ue68a" + }, + { + "font_class": "staff", + "unicode": "\ue6a7" + }, + { + "font_class": "staff-filled", + "unicode": "\ue6cb" + }, + { + "font_class": "star", + "unicode": "\ue688" + }, + { + "font_class": "star-filled", + "unicode": "\ue68f" + }, + { + "font_class": "starhalf", + "unicode": "\ue683" + }, + { + "font_class": "trash", + "unicode": "\ue687" + }, + { + "font_class": "trash-filled", + "unicode": "\ue685" + }, + { + "font_class": "tune", + "unicode": "\ue6aa" + }, + { + "font_class": "tune-filled", + "unicode": "\ue6ca" + }, + { + "font_class": "undo", + "unicode": "\ue64f" + }, + { + "font_class": "undo-filled", + "unicode": "\ue64c" + }, + { + "font_class": "up", + "unicode": "\ue6b6" + }, + { + "font_class": "top", + "unicode": "\ue6b6" + }, + { + "font_class": "upload", + "unicode": "\ue690" + }, + { + "font_class": "upload-filled", + "unicode": "\ue68e" + }, + { + "font_class": "videocam", + "unicode": "\ue68c" + }, + { + "font_class": "videocam-filled", + "unicode": "\ue689" + }, + { + "font_class": "vip", + "unicode": "\ue6a8" + }, + { + "font_class": "vip-filled", + "unicode": "\ue6c6" + }, + { + "font_class": "wallet", + "unicode": "\ue6b1" + }, + { + "font_class": "wallet-filled", + "unicode": "\ue6c2" + }, + { + "font_class": "weibo", + "unicode": "\ue68b" + }, + { + "font_class": "weixin", + "unicode": "\ue691" + } +] as IconsDataItem[] + +// export const fontData = JSON.parse(fontDataJson) diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js b/uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js new file mode 100644 index 0000000..1cd11e1 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js @@ -0,0 +1,649 @@ + +export const fontData = [ + { + "font_class": "arrow-down", + "unicode": "\ue6be" + }, + { + "font_class": "arrow-left", + "unicode": "\ue6bc" + }, + { + "font_class": "arrow-right", + "unicode": "\ue6bb" + }, + { + "font_class": "arrow-up", + "unicode": "\ue6bd" + }, + { + "font_class": "auth", + "unicode": "\ue6ab" + }, + { + "font_class": "auth-filled", + "unicode": "\ue6cc" + }, + { + "font_class": "back", + "unicode": "\ue6b9" + }, + { + "font_class": "bars", + "unicode": "\ue627" + }, + { + "font_class": "calendar", + "unicode": "\ue6a0" + }, + { + "font_class": "calendar-filled", + "unicode": "\ue6c0" + }, + { + "font_class": "camera", + "unicode": "\ue65a" + }, + { + "font_class": "camera-filled", + "unicode": "\ue658" + }, + { + "font_class": "cart", + "unicode": "\ue631" + }, + { + "font_class": "cart-filled", + "unicode": "\ue6d0" + }, + { + "font_class": "chat", + "unicode": "\ue65d" + }, + { + "font_class": "chat-filled", + "unicode": "\ue659" + }, + { + "font_class": "chatboxes", + "unicode": "\ue696" + }, + { + "font_class": "chatboxes-filled", + "unicode": "\ue692" + }, + { + "font_class": "chatbubble", + "unicode": "\ue697" + }, + { + "font_class": "chatbubble-filled", + "unicode": "\ue694" + }, + { + "font_class": "checkbox", + "unicode": "\ue62b" + }, + { + "font_class": "checkbox-filled", + "unicode": "\ue62c" + }, + { + "font_class": "checkmarkempty", + "unicode": "\ue65c" + }, + { + "font_class": "circle", + "unicode": "\ue65b" + }, + { + "font_class": "circle-filled", + "unicode": "\ue65e" + }, + { + "font_class": "clear", + "unicode": "\ue66d" + }, + { + "font_class": "close", + "unicode": "\ue673" + }, + { + "font_class": "closeempty", + "unicode": "\ue66c" + }, + { + "font_class": "cloud-download", + "unicode": "\ue647" + }, + { + "font_class": "cloud-download-filled", + "unicode": "\ue646" + }, + { + "font_class": "cloud-upload", + "unicode": "\ue645" + }, + { + "font_class": "cloud-upload-filled", + "unicode": "\ue648" + }, + { + "font_class": "color", + "unicode": "\ue6cf" + }, + { + "font_class": "color-filled", + "unicode": "\ue6c9" + }, + { + "font_class": "compose", + "unicode": "\ue67f" + }, + { + "font_class": "contact", + "unicode": "\ue693" + }, + { + "font_class": "contact-filled", + "unicode": "\ue695" + }, + { + "font_class": "down", + "unicode": "\ue6b8" + }, + { + "font_class": "bottom", + "unicode": "\ue6b8" + }, + { + "font_class": "download", + "unicode": "\ue68d" + }, + { + "font_class": "download-filled", + "unicode": "\ue681" + }, + { + "font_class": "email", + "unicode": "\ue69e" + }, + { + "font_class": "email-filled", + "unicode": "\ue69a" + }, + { + "font_class": "eye", + "unicode": "\ue651" + }, + { + "font_class": "eye-filled", + "unicode": "\ue66a" + }, + { + "font_class": "eye-slash", + "unicode": "\ue6b3" + }, + { + "font_class": "eye-slash-filled", + "unicode": "\ue6b4" + }, + { + "font_class": "fire", + "unicode": "\ue6a1" + }, + { + "font_class": "fire-filled", + "unicode": "\ue6c5" + }, + { + "font_class": "flag", + "unicode": "\ue65f" + }, + { + "font_class": "flag-filled", + "unicode": "\ue660" + }, + { + "font_class": "folder-add", + "unicode": "\ue6a9" + }, + { + "font_class": "folder-add-filled", + "unicode": "\ue6c8" + }, + { + "font_class": "font", + "unicode": "\ue6a3" + }, + { + "font_class": "forward", + "unicode": "\ue6ba" + }, + { + "font_class": "gear", + "unicode": "\ue664" + }, + { + "font_class": "gear-filled", + "unicode": "\ue661" + }, + { + "font_class": "gift", + "unicode": "\ue6a4" + }, + { + "font_class": "gift-filled", + "unicode": "\ue6c4" + }, + { + "font_class": "hand-down", + "unicode": "\ue63d" + }, + { + "font_class": "hand-down-filled", + "unicode": "\ue63c" + }, + { + "font_class": "hand-up", + "unicode": "\ue63f" + }, + { + "font_class": "hand-up-filled", + "unicode": "\ue63e" + }, + { + "font_class": "headphones", + "unicode": "\ue630" + }, + { + "font_class": "heart", + "unicode": "\ue639" + }, + { + "font_class": "heart-filled", + "unicode": "\ue641" + }, + { + "font_class": "help", + "unicode": "\ue679" + }, + { + "font_class": "help-filled", + "unicode": "\ue674" + }, + { + "font_class": "home", + "unicode": "\ue662" + }, + { + "font_class": "home-filled", + "unicode": "\ue663" + }, + { + "font_class": "image", + "unicode": "\ue670" + }, + { + "font_class": "image-filled", + "unicode": "\ue678" + }, + { + "font_class": "images", + "unicode": "\ue650" + }, + { + "font_class": "images-filled", + "unicode": "\ue64b" + }, + { + "font_class": "info", + "unicode": "\ue669" + }, + { + "font_class": "info-filled", + "unicode": "\ue649" + }, + { + "font_class": "left", + "unicode": "\ue6b7" + }, + { + "font_class": "link", + "unicode": "\ue6a5" + }, + { + "font_class": "list", + "unicode": "\ue644" + }, + { + "font_class": "location", + "unicode": "\ue6ae" + }, + { + "font_class": "location-filled", + "unicode": "\ue6af" + }, + { + "font_class": "locked", + "unicode": "\ue66b" + }, + { + "font_class": "locked-filled", + "unicode": "\ue668" + }, + { + "font_class": "loop", + "unicode": "\ue633" + }, + { + "font_class": "mail-open", + "unicode": "\ue643" + }, + { + "font_class": "mail-open-filled", + "unicode": "\ue63a" + }, + { + "font_class": "map", + "unicode": "\ue667" + }, + { + "font_class": "map-filled", + "unicode": "\ue666" + }, + { + "font_class": "map-pin", + "unicode": "\ue6ad" + }, + { + "font_class": "map-pin-ellipse", + "unicode": "\ue6ac" + }, + { + "font_class": "medal", + "unicode": "\ue6a2" + }, + { + "font_class": "medal-filled", + "unicode": "\ue6c3" + }, + { + "font_class": "mic", + "unicode": "\ue671" + }, + { + "font_class": "mic-filled", + "unicode": "\ue677" + }, + { + "font_class": "micoff", + "unicode": "\ue67e" + }, + { + "font_class": "micoff-filled", + "unicode": "\ue6b0" + }, + { + "font_class": "minus", + "unicode": "\ue66f" + }, + { + "font_class": "minus-filled", + "unicode": "\ue67d" + }, + { + "font_class": "more", + "unicode": "\ue64d" + }, + { + "font_class": "more-filled", + "unicode": "\ue64e" + }, + { + "font_class": "navigate", + "unicode": "\ue66e" + }, + { + "font_class": "navigate-filled", + "unicode": "\ue67a" + }, + { + "font_class": "notification", + "unicode": "\ue6a6" + }, + { + "font_class": "notification-filled", + "unicode": "\ue6c1" + }, + { + "font_class": "paperclip", + "unicode": "\ue652" + }, + { + "font_class": "paperplane", + "unicode": "\ue672" + }, + { + "font_class": "paperplane-filled", + "unicode": "\ue675" + }, + { + "font_class": "person", + "unicode": "\ue699" + }, + { + "font_class": "person-filled", + "unicode": "\ue69d" + }, + { + "font_class": "personadd", + "unicode": "\ue69f" + }, + { + "font_class": "personadd-filled", + "unicode": "\ue698" + }, + { + "font_class": "personadd-filled-copy", + "unicode": "\ue6d1" + }, + { + "font_class": "phone", + "unicode": "\ue69c" + }, + { + "font_class": "phone-filled", + "unicode": "\ue69b" + }, + { + "font_class": "plus", + "unicode": "\ue676" + }, + { + "font_class": "plus-filled", + "unicode": "\ue6c7" + }, + { + "font_class": "plusempty", + "unicode": "\ue67b" + }, + { + "font_class": "pulldown", + "unicode": "\ue632" + }, + { + "font_class": "pyq", + "unicode": "\ue682" + }, + { + "font_class": "qq", + "unicode": "\ue680" + }, + { + "font_class": "redo", + "unicode": "\ue64a" + }, + { + "font_class": "redo-filled", + "unicode": "\ue655" + }, + { + "font_class": "refresh", + "unicode": "\ue657" + }, + { + "font_class": "refresh-filled", + "unicode": "\ue656" + }, + { + "font_class": "refreshempty", + "unicode": "\ue6bf" + }, + { + "font_class": "reload", + "unicode": "\ue6b2" + }, + { + "font_class": "right", + "unicode": "\ue6b5" + }, + { + "font_class": "scan", + "unicode": "\ue62a" + }, + { + "font_class": "search", + "unicode": "\ue654" + }, + { + "font_class": "settings", + "unicode": "\ue653" + }, + { + "font_class": "settings-filled", + "unicode": "\ue6ce" + }, + { + "font_class": "shop", + "unicode": "\ue62f" + }, + { + "font_class": "shop-filled", + "unicode": "\ue6cd" + }, + { + "font_class": "smallcircle", + "unicode": "\ue67c" + }, + { + "font_class": "smallcircle-filled", + "unicode": "\ue665" + }, + { + "font_class": "sound", + "unicode": "\ue684" + }, + { + "font_class": "sound-filled", + "unicode": "\ue686" + }, + { + "font_class": "spinner-cycle", + "unicode": "\ue68a" + }, + { + "font_class": "staff", + "unicode": "\ue6a7" + }, + { + "font_class": "staff-filled", + "unicode": "\ue6cb" + }, + { + "font_class": "star", + "unicode": "\ue688" + }, + { + "font_class": "star-filled", + "unicode": "\ue68f" + }, + { + "font_class": "starhalf", + "unicode": "\ue683" + }, + { + "font_class": "trash", + "unicode": "\ue687" + }, + { + "font_class": "trash-filled", + "unicode": "\ue685" + }, + { + "font_class": "tune", + "unicode": "\ue6aa" + }, + { + "font_class": "tune-filled", + "unicode": "\ue6ca" + }, + { + "font_class": "undo", + "unicode": "\ue64f" + }, + { + "font_class": "undo-filled", + "unicode": "\ue64c" + }, + { + "font_class": "up", + "unicode": "\ue6b6" + }, + { + "font_class": "top", + "unicode": "\ue6b6" + }, + { + "font_class": "upload", + "unicode": "\ue690" + }, + { + "font_class": "upload-filled", + "unicode": "\ue68e" + }, + { + "font_class": "videocam", + "unicode": "\ue68c" + }, + { + "font_class": "videocam-filled", + "unicode": "\ue689" + }, + { + "font_class": "vip", + "unicode": "\ue6a8" + }, + { + "font_class": "vip-filled", + "unicode": "\ue6c6" + }, + { + "font_class": "wallet", + "unicode": "\ue6b1" + }, + { + "font_class": "wallet-filled", + "unicode": "\ue6c2" + }, + { + "font_class": "weibo", + "unicode": "\ue68b" + }, + { + "font_class": "weixin", + "unicode": "\ue691" + } +] + +// export const fontData = JSON.parse(fontDataJson) diff --git a/uni_modules/uni-icons/package.json b/uni_modules/uni-icons/package.json new file mode 100644 index 0000000..6b681b4 --- /dev/null +++ b/uni_modules/uni-icons/package.json @@ -0,0 +1,89 @@ +{ + "id": "uni-icons", + "displayName": "uni-icons 图标", + "version": "2.0.10", + "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。", + "keywords": [ + "uni-ui", + "uniui", + "icon", + "图标" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.2.14" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y", + "app-uvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "钉钉": "y", + "快手": "y", + "飞书": "y", + "京东": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-icons/readme.md b/uni_modules/uni-icons/readme.md new file mode 100644 index 0000000..86234ba --- /dev/null +++ b/uni_modules/uni-icons/readme.md @@ -0,0 +1,8 @@ +## Icons 图标 +> **组件名:uni-icons** +> 代码块: `uIcons` + +用于展示 icons 图标 。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-indexed-list/changelog.md b/uni_modules/uni-indexed-list/changelog.md new file mode 100644 index 0000000..08fa71c --- /dev/null +++ b/uni_modules/uni-indexed-list/changelog.md @@ -0,0 +1,17 @@ +## 1.2.1(2021-11-22) +- 修复 vue3中某些scss变量无法找到的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-indexed-list](https://uniapp.dcloud.io/component/uniui/uni-indexed-list) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.11(2021-05-12) +- 新增 组件示例地址 +## 1.0.10(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.9(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.8(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 支持 PC 端 diff --git a/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue b/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue new file mode 100644 index 0000000..19284bd --- /dev/null +++ b/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue b/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue new file mode 100644 index 0000000..ee3a7ec --- /dev/null +++ b/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue @@ -0,0 +1,367 @@ + + + diff --git a/uni_modules/uni-indexed-list/package.json b/uni_modules/uni-indexed-list/package.json new file mode 100644 index 0000000..125c0e7 --- /dev/null +++ b/uni_modules/uni-indexed-list/package.json @@ -0,0 +1,89 @@ +{ + "id": "uni-indexed-list", + "displayName": "uni-indexed-list 索引列表", + "version": "1.2.1", + "description": "索引列表组件,右侧带索引的列表,方便快速定位到具体内容,通常用于城市/机场选择等场景", + "keywords": [ + "uni-ui", + "索引列表", + "索引", + "列表" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-indexed-list/readme.md b/uni_modules/uni-indexed-list/readme.md new file mode 100644 index 0000000..44ad84b --- /dev/null +++ b/uni_modules/uni-indexed-list/readme.md @@ -0,0 +1,11 @@ + + +## IndexedList 索引列表 +> **组件名:uni-indexed-list** +> 代码块: `uIndexedList` + + +用于展示索引列表。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-indexed-list) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-link/changelog.md b/uni_modules/uni-link/changelog.md new file mode 100644 index 0000000..2cfbf59 --- /dev/null +++ b/uni_modules/uni-link/changelog.md @@ -0,0 +1,17 @@ +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-link](https://uniapp.dcloud.io/component/uniui/uni-link) +## 1.1.7(2021-11-08) +## 0.0.7(2021-09-03) +- 修复 在 nvue 下不显示的 bug +## 0.0.6(2021-07-30) +- 新增 支持自定义插槽 +## 0.0.5(2021-06-21) +- 新增 download 属性,H5平台下载文件名 +## 0.0.4(2021-05-12) +- 新增 组件示例地址 +## 0.0.3(2021-03-09) +- 新增 href 属性支持 tel:|mailto: + +## 0.0.2(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-link/components/uni-link/uni-link.vue b/uni_modules/uni-link/components/uni-link/uni-link.vue new file mode 100644 index 0000000..27c5468 --- /dev/null +++ b/uni_modules/uni-link/components/uni-link/uni-link.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/uni_modules/uni-link/package.json b/uni_modules/uni-link/package.json new file mode 100644 index 0000000..77b1986 --- /dev/null +++ b/uni_modules/uni-link/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-link", + "displayName": "uni-link 超链接", + "version": "1.0.0", + "description": "uni-link是一个外部网页超链接组件,在小程序内复制url,在app内打开外部浏览器,在h5端打", + "keywords": [ + "uni-ui", + "uniui", + "link", + "超链接", + "" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-link/readme.md b/uni_modules/uni-link/readme.md new file mode 100644 index 0000000..7f09e94 --- /dev/null +++ b/uni_modules/uni-link/readme.md @@ -0,0 +1,11 @@ + + +## Link 链接 +> **组件名:uni-link** +> 代码块: `uLink` + + +uni-link是一个外部网页超链接组件,在小程序内复制url,在app内打开外部浏览器,在h5端打开新网页。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-link) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-list/changelog.md b/uni_modules/uni-list/changelog.md new file mode 100644 index 0000000..8254a18 --- /dev/null +++ b/uni_modules/uni-list/changelog.md @@ -0,0 +1,46 @@ +## 1.2.14(2023-04-14) +- 优化 uni-list-chat 具名插槽`header` 非app端套一层元素,方便使用时通过外层元素定位实现样式修改 +## 1.2.13(2023-03-03) +- uni-list-chat 新增 支持具名插槽`header` +## 1.2.12(2023-02-01) +- 新增 列表图标新增 customPrefix 属性 ,用法 [详见](https://uniapp.dcloud.net.cn/component/uniui/uni-icons.html#icons-props) +## 1.2.11(2023-01-31) +- 修复 无反馈效果呈现的bug +## 1.2.9(2022-11-22) +- 修复 uni-list-chat 在vue3下跳转报错的bug +## 1.2.8(2022-11-21) +- 修复 uni-list-chat avatar属性 值为本地路径时错误的问题 +## 1.2.7(2022-11-21) +- 修复 uni-list-chat avatar属性 在腾讯云版uniCloud下错误的问题 +## 1.2.6(2022-11-18) +- 修复 uni-list-chat note属性 支持:“草稿”字样功能 文本少1位的问题 +## 1.2.5(2022-11-15) +- 修复 uni-list-item 的 customStyle 属性 padding值在 H5端 无效的bug +## 1.2.4(2022-11-15) +- 修复 uni-list-item 的 customStyle 属性 padding值在nvue(vue2)下无效的bug +## 1.2.3(2022-11-14) +- uni-list-chat 新增 avatar 支持 fileId +## 1.2.2(2022-11-11) +- uni-list 新增属性 render-reverse 详情参考:[https://uniapp.dcloud.net.cn/component/list.html](https://uniapp.dcloud.net.cn/component/list.html) +- uni-list-chat note属性 支持:“草稿”字样 加红显示 详情参考uni-im:[https://ext.dcloud.net.cn/plugin?name=uni-im](https://ext.dcloud.net.cn/plugin?name=uni-im) +- uni-list-item 新增属性 customStyle 支持设置padding、backgroundColor +## 1.2.1(2022-03-30) +- 删除无用文件 +## 1.2.0(2021-11-23) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-list](https://uniapp.dcloud.io/component/uniui/uni-list) +## 1.1.3(2021-08-30) +- 修复 在vue3中to属性在发行应用的时候报错的bug +## 1.1.2(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.1.1(2021-07-21) +- 修复 与其他组件嵌套使用时,点击失效的Bug +## 1.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.17(2021-05-12) +- 新增 组件示例地址 +## 1.0.16(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.0.15(2021-02-05) +- 调整为uni_modules目录规范 +- 修复 uni-list-chat 角标显示不正常的问题 diff --git a/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue b/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue new file mode 100644 index 0000000..b9349c2 --- /dev/null +++ b/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss new file mode 100644 index 0000000..311f8d9 --- /dev/null +++ b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss @@ -0,0 +1,58 @@ +/** + * 这里是 uni-list 组件内置的常用样式变量 + * 如果需要覆盖样式,这里提供了基本的组件样式变量,您可以尝试修改这里的变量,去完成样式替换,而不用去修改源码 + * + */ + +// 背景色 +$background-color : #fff; +// 分割线颜色 +$divide-line-color : #e5e5e5; + +// 默认头像大小,如需要修改此值,注意同步修改 js 中的值 const avatarWidth = xx ,目前只支持方形头像 +// nvue 页面不支持修改头像大小 +$avatar-width : 45px ; + +// 头像边框 +$avatar-border-radius: 5px; +$avatar-border-color: #eee; +$avatar-border-width: 1px; + +// 标题文字样式 +$title-size : 16px; +$title-color : #3b4144; +$title-weight : normal; + +// 描述文字样式 +$note-size : 12px; +$note-color : #999; +$note-weight : normal; + +// 右侧额外内容默认样式 +$right-text-size : 12px; +$right-text-color : #999; +$right-text-weight : normal; + +// 角标样式 +// nvue 页面不支持修改圆点位置以及大小 +// 角标在左侧时,角标的位置,默认为 0 ,负数左/下移动,正数右/上移动 +$badge-left: 0px; +$badge-top: 0px; + +// 显示圆点时,圆点大小 +$dot-width: 10px; +$dot-height: 10px; + +// 显示角标时,角标大小和字体大小 +$badge-size : 18px; +$badge-font : 12px; +// 显示角标时,角标前景色 +$badge-color : #fff; +// 显示角标时,角标背景色 +$badge-background-color : #ff5a5f; +// 显示角标时,角标左右间距 +$badge-space : 6px; + +// 状态样式 +// 选中颜色 +$hover : #f5f5f5; diff --git a/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue new file mode 100644 index 0000000..d49fd7c --- /dev/null +++ b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue @@ -0,0 +1,593 @@ + + + + + diff --git a/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue b/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue new file mode 100644 index 0000000..6402508 --- /dev/null +++ b/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue @@ -0,0 +1,534 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uni-list/components/uni-list/uni-list.vue b/uni_modules/uni-list/components/uni-list/uni-list.vue new file mode 100644 index 0000000..6ef5972 --- /dev/null +++ b/uni_modules/uni-list/components/uni-list/uni-list.vue @@ -0,0 +1,123 @@ + + + + diff --git a/uni_modules/uni-list/components/uni-list/uni-refresh.vue b/uni_modules/uni-list/components/uni-list/uni-refresh.vue new file mode 100644 index 0000000..3b4c5a2 --- /dev/null +++ b/uni_modules/uni-list/components/uni-list/uni-refresh.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/uni_modules/uni-list/components/uni-list/uni-refresh.wxs b/uni_modules/uni-list/components/uni-list/uni-refresh.wxs new file mode 100644 index 0000000..818a6b7 --- /dev/null +++ b/uni_modules/uni-list/components/uni-list/uni-refresh.wxs @@ -0,0 +1,87 @@ +var pullDown = { + threshold: 95, + maxHeight: 200, + callRefresh: 'onrefresh', + callPullingDown: 'onpullingdown', + refreshSelector: '.uni-refresh' +}; + +function ready(newValue, oldValue, ownerInstance, instance) { + var state = instance.getState() + state.canPullDown = newValue; + // console.log(newValue); +} + +function touchStart(e, instance) { + var state = instance.getState(); + state.refreshInstance = instance.selectComponent(pullDown.refreshSelector); + state.canPullDown = (state.refreshInstance != null && state.refreshInstance != undefined); + if (!state.canPullDown) { + return + } + + // console.log("touchStart"); + + state.height = 0; + state.touchStartY = e.touches[0].pageY || e.changedTouches[0].pageY; + state.refreshInstance.setStyle({ + 'height': 0 + }); + state.refreshInstance.callMethod("onchange", true); +} + +function touchMove(e, ownerInstance) { + var instance = e.instance; + var state = instance.getState(); + if (!state.canPullDown) { + return + } + + var oldHeight = state.height; + var endY = e.touches[0].pageY || e.changedTouches[0].pageY; + var height = endY - state.touchStartY; + if (height > pullDown.maxHeight) { + return; + } + + var refreshInstance = state.refreshInstance; + refreshInstance.setStyle({ + 'height': height + 'px' + }); + + height = height < pullDown.maxHeight ? height : pullDown.maxHeight; + state.height = height; + refreshInstance.callMethod(pullDown.callPullingDown, { + height: height + }); +} + +function touchEnd(e, ownerInstance) { + var state = e.instance.getState(); + if (!state.canPullDown) { + return + } + + state.refreshInstance.callMethod("onchange", false); + + var refreshInstance = state.refreshInstance; + if (state.height > pullDown.threshold) { + refreshInstance.callMethod(pullDown.callRefresh); + return; + } + + refreshInstance.setStyle({ + 'height': 0 + }); +} + +function propObserver(newValue, oldValue, instance) { + pullDown = newValue; +} + +module.exports = { + touchmove: touchMove, + touchstart: touchStart, + touchend: touchEnd, + propObserver: propObserver +} diff --git a/uni_modules/uni-list/package.json b/uni_modules/uni-list/package.json new file mode 100644 index 0000000..8350efc --- /dev/null +++ b/uni_modules/uni-list/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-list", + "displayName": "uni-list 列表", + "version": "1.2.14", + "description": "List 组件 ,帮助使用者快速构建列表。", + "keywords": [ + "", + "uni-ui", + "uniui", + "列表", + "", + "list" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [ + "uni-badge", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-list/readme.md b/uni_modules/uni-list/readme.md new file mode 100644 index 0000000..32c2865 --- /dev/null +++ b/uni_modules/uni-list/readme.md @@ -0,0 +1,346 @@ +## List 列表 +> **组件名:uni-list** +> 代码块: `uList`、`uListItem` +> 关联组件:`uni-list-item`、`uni-badge`、`uni-icons`、`uni-list-chat`、`uni-list-ad` + + +List 列表组件,包含基本列表样式、可扩展插槽机制、长列表性能优化、多端兼容。 + +在vue页面里,它默认使用页面级滚动。在app-nvue页面里,它默认使用原生list组件滚动。这样的长列表,在滚动出屏幕外后,系统会回收不可见区域的渲染内存资源,不会造成滚动越长手机越卡的问题。 + +uni-list组件是父容器,里面的核心是uni-list-item子组件,它代表列表中的一个可重复行,子组件可以无限循环。 + +uni-list-item有很多风格,uni-list-item组件通过内置的属性,满足一些常用的场景。当内置属性不满足需求时,可以通过扩展插槽来自定义列表内容。 + +内置属性可以覆盖的场景包括:导航列表、设置列表、小图标列表、通信录列表、聊天记录列表。 + +涉及很多大图或丰富内容的列表,比如类今日头条的新闻列表、类淘宝的电商列表,需要通过扩展插槽实现。 + +下文均有样例给出。 + +uni-list不包含下拉刷新和上拉翻页。上拉翻页另见组件:[uni-load-more](https://ext.dcloud.net.cn/plugin?id=29) + + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +> **注意事项** +> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 +> - 组件需要依赖 `sass` 插件 ,请自行手动安装 +> - 组件内部依赖 `'uni-icons'` 、`uni-badge` 组件 +> - `uni-list` 和 `uni-list-item` 需要配套使用,暂不支持单独使用 `uni-list-item` +> - 只有开启点击反馈后,会有点击选中效果 +> - 使用插槽时,可以完全自定义内容 +> - note 、rightText 属性暂时没做限制,不支持文字溢出隐藏,使用时应该控制长度显示或通过默认插槽自行扩展 +> - 支付宝小程序平台需要在支付宝小程序开发者工具里开启 component2 编译模式,开启方式: 详情 --> 项目配置 --> 启用 component2 编译 +> - 如果需要修改 `switch`、`badge` 样式,请使用插槽自定义 +> - 在 `HBuilderX` 低版本中,可能会出现组件显示 `undefined` 的问题,请升级最新的 `HBuilderX` 或者 `cli` +> - 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + +### 基本用法 + +- 设置 `title` 属性,可以显示列表标题 +- 设置 `disabled` 属性,可以禁用当前项 + +```html + + + + + +``` + +### 多行内容显示 + +- 设置 `note` 属性 ,可以在第二行显示描述文本信息 + +```html + + + + + +``` + +### 右侧显示角标、switch + +- 设置 `show-badge` 属性 ,可以显示角标内容 +- 设置 `show-switch` 属性,可以显示 switch 开关 + +```html + + + + + +``` + +### 左侧显示略缩图、图标 + +- 设置 `thumb` 属性 ,可以在列表左侧显示略缩图 +- 设置 `show-extra-icon` 属性,并指定 `extra-icon` 可以在左侧显示图标 + +```html + + + + +``` + +### 开启点击反馈和右侧箭头 +- 设置 `clickable` 为 `true` ,则表示这是一个可点击的列表,会默认给一个点击效果,并可以监听 `click` 事件 +- 设置 `link` 属性,会自动开启点击反馈,并给列表右侧添加一个箭头 +- 设置 `to` 属性,可以跳转页面,`link` 的值表示跳转方式,如果不指定,默认为 `navigateTo` + +```html + + + + + + + +``` + + +### 聊天列表示例 +- 设置 `clickable` 为 `true` ,则表示这是一个可点击的列表,会默认给一个点击效果,并可以监听 `click` 事件 +- 设置 `link` 属性,会自动开启点击反馈,`link` 的值表示跳转方式,如果不指定,默认为 `navigateTo` +- 设置 `to` 属性,可以跳转页面 +- `time` 属性,通常会设置成时间显示,但是这个属性不仅仅可以设置时间,你可以传入任何文本,注意文本长度可能会影响显示 +- `avatar` 和 `avatarList` 属性同时只会有一个生效,同时设置的话,`avatarList` 属性的长度大于1 ,`avatar` 属性将失效 +- 可以通过默认插槽自定义列表右侧内容 + +```html + + + + + + + + + + + + + + + + + 刚刚 + + + + + + + +``` + +```javascript + +export default { + components: {}, + data() { + return { + avatarList: [{ + url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png' + }, { + url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png' + }, { + url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png' + }] + } + } +} + +``` + + +```css + +.chat-custom-right { + flex: 1; + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: column; + justify-content: space-between; + align-items: flex-end; +} + +.chat-custom-text { + font-size: 12px; + color: #999; +} + +``` + +## API + +### List Props + +属性名 |类型 |默认值 | 说明 +:-: |:-: |:-: | :-: +border |Boolean |true | 是否显示边框 + + +### ListItem Props + +属性名 |类型 |默认值 | 说明 +:-: |:-: |:-: | :-: +title |String |- | 标题 +note |String |- | 描述 +ellipsis |Number |0 | title 是否溢出隐藏,可选值,0:默认; 1:显示一行; 2:显示两行;【nvue 暂不支持】 +thumb |String |- | 左侧缩略图,若thumb有值,则不会显示扩展图标 +thumbSize |String |medium | 略缩图尺寸,可选值,lg:大图; medium:一般; sm:小图; +showBadge |Boolean |false | 是否显示数字角标 +badgeText |String |- | 数字角标内容 +badgeType |String |- | 数字角标类型,参考[uni-icons](https://ext.dcloud.net.cn/plugin?id=21) +badgeStyle |Object |- | 数字角标样式,使用uni-badge的custom-style参数 +rightText |String |- | 右侧文字内容 +disabled |Boolean |false | 是否禁用 +showArrow |Boolean |true | 是否显示箭头图标 +link |String |navigateTo | 新页面跳转方式,可选值见下表 +to |String |- | 新页面跳转地址,如填写此属性,click 会返回页面是否跳转成功 +clickable |Boolean |false | 是否开启点击反馈 +showSwitch |Boolean |false | 是否显示Switch +switchChecked |Boolean |false | Switch是否被选中 +showExtraIcon |Boolean |false | 左侧是否显示扩展图标 +extraIcon |Object |- | 扩展图标参数,格式为 ``{color: '#4cd964',size: '22',type: 'spinner'}``,参考 [uni-icons](https://ext.dcloud.net.cn/plugin?id=28) +direction | String |row | 排版方向,可选值,row:水平排列; column:垂直排列; 3个插槽是水平排还是垂直排,也受此属性控制 + + +#### Link Options + +属性名 | 说明 +:-: | :-: +navigateTo | 同 uni.navigateTo() +redirectTo | 同 uni.reLaunch() +reLaunch | 同 uni.reLaunch() +switchTab | 同 uni.switchTab() + +### ListItem Events + +事件称名 |说明 |返回参数 +:-: |:-: |:-: +click |点击 uniListItem 触发事件,需开启点击反馈 |- +switchChange |点击切换 Switch 时触发,需显示 switch |e={value:checked} + + + +### ListItem Slots + +名称 | 说明 +:-: | :-: +header | 左/上内容插槽,可完全自定义默认显示 +body | 中间内容插槽,可完全自定义中间内容 +footer | 右/下内容插槽,可完全自定义右侧内容 + + +> **通过插槽扩展** +> 需要注意的是当使用插槽时,内置样式将会失效,只保留排版样式,此时的样式需要开发者自己实现 +> 如果 `uni-list-item` 组件内置属性样式无法满足需求,可以使用插槽来自定义uni-list-item里的内容。 +> uni-list-item提供了3个可扩展的插槽:`header`、`body`、`footer` +> - 当 `direction` 属性为 `row` 时表示水平排列,此时 `header` 表示列表的左边部分,`body` 表示列表的中间部分,`footer` 表示列表的右边部分 +> - 当 `direction` 属性为 `column` 时表示垂直排列,此时 `header` 表示列表的上边部分,`body` 表示列表的中间部分,`footer` 表示列表的下边部分 +> 开发者可以只用1个插槽,也可以3个一起使用。在插槽中可自主编写view标签,实现自己所需的效果。 + + +**示例** + +```html + + + + + + + + + 自定义插槽 + + + + +``` + + + + + +### ListItemChat Props + +属性名 |类型 |默认值 | 说明 +:-: |:-: |:-: | :-: +title |String |- | 标题 +note |String |- | 描述 +clickable |Boolean |false | 是否开启点击反馈 +badgeText |String |- | 数字角标内容,设置为 `dot` 将显示圆点 +badgePositon |String |right | 角标位置 +link |String |navigateTo | 是否展示右侧箭头并开启点击反馈,可选值见下表 +clickable |Boolean |false | 是否开启点击反馈 +to |String |- | 跳转页面地址,如填写此属性,click 会返回页面是否跳转成功 +time |String |- | 右侧时间显示 +avatarCircle |Boolean |false | 是否显示圆形头像 +avatar |String |- | 头像地址,avatarCircle 不填时生效 +avatarList |Array |- | 头像组,格式为 [{url:''}] + +#### Link Options + +属性名 | 说明 +:-: | :-: +navigateTo | 同 uni.navigateTo() +redirectTo | 同 uni.reLaunch() +reLaunch | 同 uni.reLaunch() +switchTab | 同 uni.switchTab() + +### ListItemChat Slots + +名称 | 说明 +:- | :- +default | 自定义列表右侧内容(包括时间和角标显示) + +### ListItemChat Events +事件称名 | 说明 | 返回参数 +:-: | :-: | :-: +@click | 点击 uniListChat 触发事件 | {data:{}} ,如有 to 属性,会返回页面跳转信息 + + + + + + +## 基于uni-list扩展的页面模板 + +通过扩展插槽,可实现多种常见样式的列表 + +**新闻列表类** + +1. 云端一体混合布局:[https://ext.dcloud.net.cn/plugin?id=2546](https://ext.dcloud.net.cn/plugin?id=2546) +2. 云端一体垂直布局,大图模式:[https://ext.dcloud.net.cn/plugin?id=2583](https://ext.dcloud.net.cn/plugin?id=2583) +3. 云端一体垂直布局,多行图文混排:[https://ext.dcloud.net.cn/plugin?id=2584](https://ext.dcloud.net.cn/plugin?id=2584) +4. 云端一体垂直布局,多图模式:[https://ext.dcloud.net.cn/plugin?id=2585](https://ext.dcloud.net.cn/plugin?id=2585) +5. 云端一体水平布局,左图右文:[https://ext.dcloud.net.cn/plugin?id=2586](https://ext.dcloud.net.cn/plugin?id=2586) +6. 云端一体水平布局,左文右图:[https://ext.dcloud.net.cn/plugin?id=2587](https://ext.dcloud.net.cn/plugin?id=2587) +7. 云端一体垂直布局,无图模式,主标题+副标题:[https://ext.dcloud.net.cn/plugin?id=2588](https://ext.dcloud.net.cn/plugin?id=2588) + +**商品列表类** + +1. 云端一体列表/宫格视图互切:[https://ext.dcloud.net.cn/plugin?id=2651](https://ext.dcloud.net.cn/plugin?id=2651) +2. 云端一体列表(宫格模式):[https://ext.dcloud.net.cn/plugin?id=2671](https://ext.dcloud.net.cn/plugin?id=2671) +3. 云端一体列表(列表模式):[https://ext.dcloud.net.cn/plugin?id=2672](https://ext.dcloud.net.cn/plugin?id=2672) + +## 组件示例 + +点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/list/list](https://hellouniapp.dcloud.net.cn/pages/extUI/list/list) \ No newline at end of file diff --git a/uni_modules/uni-load-more/changelog.md b/uni_modules/uni-load-more/changelog.md new file mode 100644 index 0000000..8f03f1d --- /dev/null +++ b/uni_modules/uni-load-more/changelog.md @@ -0,0 +1,19 @@ +## 1.3.3(2022-01-20) +- 新增 showText属性 ,是否显示文本 +## 1.3.2(2022-01-19) +- 修复 nvue 平台下不显示文本的bug +## 1.3.1(2022-01-19) +- 修复 微信小程序平台样式选择器报警告的问题 +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-load-more](https://uniapp.dcloud.io/component/uniui/uni-load-more) +## 1.2.1(2021-08-24) +- 新增 支持国际化 +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.8(2021-05-12) +- 新增 组件示例地址 +## 1.1.7(2021-03-30) +- 修复 uni-load-more 在首页使用时,h5 平台报 'uni is not defined' 的 bug +## 1.1.6(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json new file mode 100644 index 0000000..a4f14a5 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "Pull up to show more", + "uni-load-more.contentrefresh": "loading...", + "uni-load-more.contentnomore": "No more data" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json new file mode 100644 index 0000000..f15d510 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "上拉显示更多", + "uni-load-more.contentrefresh": "正在加载...", + "uni-load-more.contentnomore": "没有更多数据了" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json new file mode 100644 index 0000000..a255c6d --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "上拉顯示更多", + "uni-load-more.contentrefresh": "正在加載...", + "uni-load-more.contentnomore": "沒有更多數據了" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue new file mode 100644 index 0000000..e5eff4d --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue @@ -0,0 +1,399 @@ + + + + + diff --git a/uni_modules/uni-load-more/package.json b/uni_modules/uni-load-more/package.json new file mode 100644 index 0000000..2fa6f04 --- /dev/null +++ b/uni_modules/uni-load-more/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-load-more", + "displayName": "uni-load-more 加载更多", + "version": "1.3.3", + "description": "LoadMore 组件,常用在列表里面,做滚动加载使用。", + "keywords": [ + "uni-ui", + "uniui", + "加载更多", + "load-more" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-load-more/readme.md b/uni_modules/uni-load-more/readme.md new file mode 100644 index 0000000..54dc1fa --- /dev/null +++ b/uni_modules/uni-load-more/readme.md @@ -0,0 +1,14 @@ + + +### LoadMore 加载更多 +> **组件名:uni-load-more** +> 代码块: `uLoadMore` + + +用于列表中,做滚动加载使用,展示 loading 的各种状态。 + + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-load-more) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-nav-bar/changelog.md b/uni_modules/uni-nav-bar/changelog.md new file mode 100644 index 0000000..0f9a2f1 --- /dev/null +++ b/uni_modules/uni-nav-bar/changelog.md @@ -0,0 +1,51 @@ +## 1.3.11(2023-03-29) +- 修复 自定义状态栏高度闪动BUG +## 1.3.10(2023-03-29) +- 修复 暗黑模式下边线颜色错误的bug +## 1.3.9(2022-10-13) +- 修复 条件编译错误的bug +## 1.3.8(2022-10-12) +- 修复 nvue 环境 fixed 为 true 的情况下,无法置顶的 bug +## 1.3.7(2022-08-11) +- 修复 nvue 环境下 fixed 为 true 的情况下,无法置顶的 bug +## 1.3.6(2022-06-30) +- 修复 组件示例中插槽用法无法显示内容的bug +## 1.3.5(2022-05-24) +- 新增 stat 属性 ,可开启统计title 上报 ,仅使用了title 属性且项目开启了uni统计生效 +## 1.3.4(2022-01-24) +- 更新 组件示例 +## 1.3.3(2022-01-24) +- 新增 left-width/right-width属性 ,可修改左右两侧的宽度 +## 1.3.2(2022-01-18) +- 修复 在vue下,标题不垂直居中的bug +## 1.3.1(2022-01-18) +- 修复 height 属性类型错误 +## 1.3.0(2022-01-18) +- 新增 height 属性,可修改组件高度 +- 新增 dark 属性可可开启暗黑模式 +- 优化 标题字数过多显示省略号 +- 优化 插槽,插入内容可完全覆盖 +## 1.2.1(2022-01-10) +- 修复 color 属性不生效的bug +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-nav-bar](https://uniapp.dcloud.io/component/uniui/uni-nav-bar) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.11(2021-05-12) +- 新增 组件示例地址 +## 1.0.10(2021-04-30) +- 修复 在nvue下fixed为true,宽度不能撑满的Bug +## 1.0.9(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.8(2021-04-14) +- uni-ui 修复 uni-nav-bar 当 fixed 属性为 true 时铺不满屏幕的 bug + +## 1.0.7(2021-02-25) +- 修复 easycom 下,找不到 uni-status-bar 的bug + +## 1.0.6(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.5(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue new file mode 100644 index 0000000..46806c1 --- /dev/null +++ b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue @@ -0,0 +1,357 @@ + + + + + diff --git a/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue new file mode 100644 index 0000000..4ac73ae --- /dev/null +++ b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/uni_modules/uni-nav-bar/package.json b/uni_modules/uni-nav-bar/package.json new file mode 100644 index 0000000..240ae95 --- /dev/null +++ b/uni_modules/uni-nav-bar/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-nav-bar", + "displayName": "uni-nav-bar 自定义导航栏", + "version": "1.3.11", + "description": "自定义导航栏组件,主要用于头部导航。", + "keywords": [ + "uni-ui", + "导航", + "导航栏", + "自定义导航栏" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-nav-bar/readme.md b/uni_modules/uni-nav-bar/readme.md new file mode 100644 index 0000000..3934b32 --- /dev/null +++ b/uni_modules/uni-nav-bar/readme.md @@ -0,0 +1,15 @@ + + +## NavBar 导航栏 +> **组件名:uni-nav-bar** +> 代码块: `uNavBar` + +导航栏组件,主要用于头部导航。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-nav-bar) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + + + + diff --git a/uni_modules/uni-notice-bar/changelog.md b/uni_modules/uni-notice-bar/changelog.md new file mode 100644 index 0000000..ce50674 --- /dev/null +++ b/uni_modules/uni-notice-bar/changelog.md @@ -0,0 +1,20 @@ +## 1.2.2(2023-12-20) +- 修复动态绑定title时,滚动速度不一致的问题 +## 1.2.1(2022-09-05) +- 新增 属性 fontSize,可修改文字大小。 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-notice-bar](https://uniapp.dcloud.io/component/uniui/uni-notice-bar) +## 1.1.1(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.9(2021-05-12) +- 新增 组件示例地址 +## 1.0.8(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.7(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.6(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue b/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue new file mode 100644 index 0000000..47fb9b3 --- /dev/null +++ b/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue @@ -0,0 +1,431 @@ + + + + + diff --git a/uni_modules/uni-notice-bar/package.json b/uni_modules/uni-notice-bar/package.json new file mode 100644 index 0000000..1e9762c --- /dev/null +++ b/uni_modules/uni-notice-bar/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-notice-bar", + "displayName": "uni-notice-bar 通告栏", + "version": "1.2.2", + "description": "NoticeBar 通告栏组件,常用于展示公告信息,可设为滚动公告", + "keywords": [ + "uni-ui", + "uniui", + "通告栏", + "公告", + "跑马灯" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-notice-bar/readme.md b/uni_modules/uni-notice-bar/readme.md new file mode 100644 index 0000000..fb2ede2 --- /dev/null +++ b/uni_modules/uni-notice-bar/readme.md @@ -0,0 +1,13 @@ + + +## NoticeBar 通告栏 +> **组件名:uni-notice-bar** +> 代码块: `uNoticeBar` + + +通告栏组件 。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-notice-bar) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-number-box/changelog.md b/uni_modules/uni-number-box/changelog.md new file mode 100644 index 0000000..adf9221 --- /dev/null +++ b/uni_modules/uni-number-box/changelog.md @@ -0,0 +1,39 @@ +## 1.2.8(2024-04-26) +- 修复 在vue2下H5黑边的bug +## 1.2.7(2024-04-26) +- 修复 在vue2手动输入后失焦导致清空数值的严重bug +## 1.2.6(2024-02-22) +- 新增 设置宽度属性width(单位:px) +## 1.2.5(2024-02-21) +- 修复 step步长小于1时,键盘类型为number的bug +## 1.2.4(2024-02-02) +- 修复 加减号垂直位置偏移样式问题 +## 1.2.3(2023-05-23) +- 更新示例工程 +## 1.2.2(2023-05-08) +- 修复 change 事件执行顺序错误的问题 +## 1.2.1(2021-11-22) +- 修复 vue3中某些scss变量无法找到的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-number-box](https://uniapp.dcloud.io/component/uniui/uni-number-box) +## 1.1.2(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 1.1.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-05-12) +- 新增 组件示例地址 +## 1.0.6(2021-04-20) +- 修复 uni-number-box 浮点数运算不精确的 bug +- 修复 uni-number-box change 事件触发不正确的 bug +- 新增 uni-number-box v-model 双向绑定 +## 1.0.5(2021-02-05) +- 调整为uni_modules目录规范 + +## 1.0.7(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 支持 v-model +- 新增 支持 focus、blur 事件 +- 新增 支持 PC 端 diff --git a/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue b/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue new file mode 100644 index 0000000..4e203cc --- /dev/null +++ b/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue @@ -0,0 +1,232 @@ + + + diff --git a/uni_modules/uni-number-box/package.json b/uni_modules/uni-number-box/package.json new file mode 100644 index 0000000..4ac9047 --- /dev/null +++ b/uni_modules/uni-number-box/package.json @@ -0,0 +1,83 @@ +{ + "id": "uni-number-box", + "displayName": "uni-number-box 数字输入框", + "version": "1.2.8", + "description": "NumberBox 带加减按钮的数字输入框组件,用户可以控制每次点击增加的数值,支持小数。", + "keywords": [ + "uni-ui", + "uniui", + "数字输入框" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-number-box/readme.md b/uni_modules/uni-number-box/readme.md new file mode 100644 index 0000000..affc56f --- /dev/null +++ b/uni_modules/uni-number-box/readme.md @@ -0,0 +1,13 @@ + + +## NumberBox 数字输入框 +> **组件名:uni-number-box** +> 代码块: `uNumberBox` + + +带加减按钮的数字输入框。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-number-box) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-pagination/changelog.md b/uni_modules/uni-pagination/changelog.md new file mode 100644 index 0000000..2e94adc --- /dev/null +++ b/uni_modules/uni-pagination/changelog.md @@ -0,0 +1,27 @@ +## 1.2.4(2022-09-19) +- 修复,未对主题色设置默认色,导致未引入 uni-scss 变量文件报错。 +- 修复,未对移动端当前页文字做主题色适配。 +## 1.2.3(2022-09-15) +- 修复未使用 uni-scss 主题色的 bug。 +## 1.2.2(2022-07-06) +- 修复 es 语言 i18n 错误 +## 1.2.1(2021-11-22) +- 修复 vue3中某些scss变量无法找到的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-pagination](https://uniapp.dcloud.io/component/uniui/uni-pagination) +## 1.1.2(2021-10-08) +- 修复 current 、value 属性未监听,导致高亮样式失效的 bug +## 1.1.1(2021-08-20) +- 新增 支持国际化 +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-05-12) +- 新增 组件示例地址 +## 1.0.6(2021-04-12) +- 新增 PC 和 移动端适配不同的 ui +## 1.0.5(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-pagination/components/uni-pagination/i18n/en.json b/uni_modules/uni-pagination/components/uni-pagination/i18n/en.json new file mode 100644 index 0000000..d6e2897 --- /dev/null +++ b/uni_modules/uni-pagination/components/uni-pagination/i18n/en.json @@ -0,0 +1,5 @@ +{ + "uni-pagination.prevText": "prev", + "uni-pagination.nextText": "next", + "uni-pagination.piecePerPage": "piece/page" +} diff --git a/uni_modules/uni-pagination/components/uni-pagination/i18n/es.json b/uni_modules/uni-pagination/components/uni-pagination/i18n/es.json new file mode 100644 index 0000000..604a113 --- /dev/null +++ b/uni_modules/uni-pagination/components/uni-pagination/i18n/es.json @@ -0,0 +1,5 @@ +{ + "uni-pagination.prevText": "anterior", + "uni-pagination.nextText": "prxima", + "uni-pagination.piecePerPage": "Artculo/Pgina" +} diff --git a/uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json b/uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json new file mode 100644 index 0000000..a7a0c77 --- /dev/null +++ b/uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json @@ -0,0 +1,5 @@ +{ + "uni-pagination.prevText": "précédente", + "uni-pagination.nextText": "suivante", + "uni-pagination.piecePerPage": "Articles/Pages" +} diff --git a/uni_modules/uni-pagination/components/uni-pagination/i18n/index.js b/uni_modules/uni-pagination/components/uni-pagination/i18n/index.js new file mode 100644 index 0000000..2469dd0 --- /dev/null +++ b/uni_modules/uni-pagination/components/uni-pagination/i18n/index.js @@ -0,0 +1,12 @@ +import en from './en.json' +import es from './es.json' +import fr from './fr.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + es, + fr, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json b/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json new file mode 100644 index 0000000..782bbe4 --- /dev/null +++ b/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json @@ -0,0 +1,5 @@ +{ + "uni-pagination.prevText": "上一页", + "uni-pagination.nextText": "下一页", + "uni-pagination.piecePerPage": "条/页" +} diff --git a/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json b/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json new file mode 100644 index 0000000..180fddb --- /dev/null +++ b/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json @@ -0,0 +1,5 @@ +{ + "uni-pagination.prevText": "上一頁", + "uni-pagination.nextText": "下一頁", + "uni-pagination.piecePerPage": "條/頁" +} diff --git a/uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue b/uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue new file mode 100644 index 0000000..5305b5f --- /dev/null +++ b/uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue @@ -0,0 +1,465 @@ + + + + + diff --git a/uni_modules/uni-pagination/package.json b/uni_modules/uni-pagination/package.json new file mode 100644 index 0000000..862d5ab --- /dev/null +++ b/uni_modules/uni-pagination/package.json @@ -0,0 +1,83 @@ +{ + "id": "uni-pagination", + "displayName": "uni-pagination 分页器", + "version": "1.2.4", + "description": "Pagination 分页器组件,用于展示页码、请求数据等。", + "keywords": [ + "uni-ui", + "uniui", + "分页器", + "页码" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss","uni-icons"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-pagination/readme.md b/uni_modules/uni-pagination/readme.md new file mode 100644 index 0000000..97ea1d6 --- /dev/null +++ b/uni_modules/uni-pagination/readme.md @@ -0,0 +1,11 @@ + + +## Pagination 分页器 +> **组件名:uni-pagination** +> 代码块: `uPagination` + + +分页器组件,用于展示页码、请求数据等。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-pagination) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-popup/changelog.md b/uni_modules/uni-popup/changelog.md new file mode 100644 index 0000000..decd775 --- /dev/null +++ b/uni_modules/uni-popup/changelog.md @@ -0,0 +1,84 @@ +## 1.9.1(2024-04-02) +- 修复 uni-popup-dialog vue3下使用value无法进行绑定的bug(双向绑定兼容旧写法) +## 1.9.0(2024-03-28) +- 修复 uni-popup-dialog 双向绑定时初始化逻辑修正 +## 1.8.9(2024-03-20) +- 修复 uni-popup-dialog 数据输入时修正为双向绑定 +## 1.8.8(2024-02-20) +- 修复 uni-popup 在微信小程序下出现文字向上闪动的bug +## 1.8.7(2024-02-02) +- 新增 uni-popup-dialog 新增属性focus:input模式下,是否自动自动聚焦 +## 1.8.6(2024-01-30) +- 新增 uni-popup-dialog 新增属性maxLength:限制输入框字数 +## 1.8.5(2024-01-26) +- 新增 uni-popup-dialog 新增属性showClose:控制关闭按钮的显示 +## 1.8.4(2023-11-15) +- 新增 uni-popup 支持uni-app-x 注意暂时仅支持 `maskClick` `@open` `@close` +## 1.8.3(2023-04-17) +- 修复 uni-popup 重复打开时的 bug +## 1.8.2(2023-02-02) +- uni-popup-dialog 组件新增 inputType 属性 +## 1.8.1(2022-12-01) +- 修复 nvue 下 v-show 报错 +## 1.8.0(2022-11-29) +- 优化 主题样式 +## 1.7.9(2022-04-02) +- 修复 弹出层内部无法滚动的bug +## 1.7.8(2022-03-28) +- 修复 小程序中高度错误的bug +## 1.7.7(2022-03-17) +- 修复 快速调用open出现问题的Bug +## 1.7.6(2022-02-14) +- 修复 safeArea 属性不能设置为false的bug +## 1.7.5(2022-01-19) +- 修复 isMaskClick 失效的bug +## 1.7.4(2022-01-19) +- 新增 cancelText \ confirmText 属性 ,可自定义文本 +- 新增 maskBackgroundColor 属性 ,可以修改蒙版颜色 +- 优化 maskClick属性 更新为 isMaskClick ,解决微信小程序警告的问题 +## 1.7.3(2022-01-13) +- 修复 设置 safeArea 属性不生效的bug +## 1.7.2(2021-11-26) +- 优化 组件示例 +## 1.7.1(2021-11-26) +- 修复 vuedoc 文字错误 +## 1.7.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-popup](https://uniapp.dcloud.io/component/uniui/uni-popup) +## 1.6.2(2021-08-24) +- 新增 支持国际化 +## 1.6.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.6.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.5.0(2021-06-23) +- 新增 mask-click 遮罩层点击事件 +## 1.4.5(2021-06-22) +- 修复 nvue 平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug +## 1.4.4(2021-06-18) +- 修复 H5平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug +## 1.4.3(2021-06-08) +- 修复 错误的 watch 字段 +- 修复 safeArea 属性不生效的问题 +- 修复 点击内容,再点击遮罩无法关闭的Bug +## 1.4.2(2021-05-12) +- 新增 组件示例地址 +## 1.4.1(2021-04-29) +- 修复 组件内放置 input 、textarea 组件,无法聚焦的问题 +## 1.4.0 (2021-04-29) +- 新增 type 属性的 left\right 值,支持左右弹出 +- 新增 open(String:type) 方法参数 ,可以省略 type 属性 ,直接传入类型打开指定弹窗 +- 新增 backgroundColor 属性,可定义主窗口背景色,默认不显示背景色 +- 新增 safeArea 属性,是否适配底部安全区 +- 修复 App\h5\微信小程序底部安全区占位不对的Bug +- 修复 App 端弹出等待的Bug +- 优化 提升低配设备性能,优化动画卡顿问题 +- 优化 更简单的组件自定义方式 +## 1.2.9(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.2.8(2021-02-05) +- 调整为uni_modules目录规范 +## 1.2.7(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 支持 PC 端 +- 新增 uni-popup-message 、uni-popup-dialog扩展组件支持 PC 端 diff --git a/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js b/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js new file mode 100644 index 0000000..6ef26a2 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue b/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue new file mode 100644 index 0000000..08707d4 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue @@ -0,0 +1,316 @@ + + + + + diff --git a/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue new file mode 100644 index 0000000..91370a8 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue @@ -0,0 +1,143 @@ + + + + diff --git a/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue new file mode 100644 index 0000000..f7e667c --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue @@ -0,0 +1,187 @@ + + + + diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/en.json b/uni_modules/uni-popup/components/uni-popup/i18n/en.json new file mode 100644 index 0000000..7f1bd06 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/en.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "cancel", + "uni-popup.ok": "ok", + "uni-popup.placeholder": "pleace enter", + "uni-popup.title": "Hint", + "uni-popup.shareTitle": "Share to" +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/index.js b/uni_modules/uni-popup/components/uni-popup/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json new file mode 100644 index 0000000..5e3003c --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "取消", + "uni-popup.ok": "确定", + "uni-popup.placeholder": "请输入", + "uni-popup.title": "提示", + "uni-popup.shareTitle": "分享到" +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json new file mode 100644 index 0000000..13e39eb --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "取消", + "uni-popup.ok": "確定", + "uni-popup.placeholder": "請輸入", + "uni-popup.title": "提示", + "uni-popup.shareTitle": "分享到" +} diff --git a/uni_modules/uni-popup/components/uni-popup/keypress.js b/uni_modules/uni-popup/components/uni-popup/keypress.js new file mode 100644 index 0000000..62dda46 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + // this.$once('hook:beforeDestroy', () => { + // document.removeEventListener('keyup', listener) + // }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-popup/components/uni-popup/popup.js b/uni_modules/uni-popup/components/uni-popup/popup.js new file mode 100644 index 0000000..c4e5781 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/popup.js @@ -0,0 +1,26 @@ + +export default { + data() { + return { + + } + }, + created(){ + this.popup = this.getParent() + }, + methods:{ + /** + * 获取父元素实例 + */ + getParent(name = 'uniPopup') { + let parent = this.$parent; + let parentName = parent.$options.name; + while (parentName !== name) { + parent = parent.$parent; + if (!parent) return false + parentName = parent.$options.name; + } + return parent; + }, + } +} diff --git a/uni_modules/uni-popup/components/uni-popup/uni-popup.uvue b/uni_modules/uni-popup/components/uni-popup/uni-popup.uvue new file mode 100644 index 0000000..5eb8d5b --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/uni-popup.uvue @@ -0,0 +1,90 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uni-popup/components/uni-popup/uni-popup.vue b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue new file mode 100644 index 0000000..8349e99 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue @@ -0,0 +1,503 @@ + + + + diff --git a/uni_modules/uni-popup/package.json b/uni_modules/uni-popup/package.json new file mode 100644 index 0000000..3cfa384 --- /dev/null +++ b/uni_modules/uni-popup/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-popup", + "displayName": "uni-popup 弹出层", + "version": "1.9.1", + "description": " Popup 组件,提供常用的弹层", + "keywords": [ + "uni-ui", + "弹出层", + "弹窗", + "popup", + "弹框" + ], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-transition" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-popup/readme.md b/uni_modules/uni-popup/readme.md new file mode 100644 index 0000000..fdad4b3 --- /dev/null +++ b/uni_modules/uni-popup/readme.md @@ -0,0 +1,17 @@ + + +## Popup 弹出层 +> **组件名:uni-popup** +> 代码块: `uPopup` +> 关联组件:`uni-transition` + + +弹出层组件,在应用中弹出一个消息提示窗口、提示框等 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-popup) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + + + + diff --git a/uni_modules/uni-rate/changelog.md b/uni_modules/uni-rate/changelog.md new file mode 100644 index 0000000..8a98a61 --- /dev/null +++ b/uni_modules/uni-rate/changelog.md @@ -0,0 +1,25 @@ +## 1.3.1(2022-02-25) +- 修复 条件判断 `NaN` 错误的 bug +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-rate](https://uniapp.dcloud.io/component/uniui/uni-rate) +## 1.2.2(2021-09-10) +- 优化 默认值修改为 0 颗星 +## 1.2.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.2.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.2(2021-05-12) +- 新增 组件示例地址 +## 1.1.1(2021-04-21) +- 修复 布局变化后 uni-rate 星星计算不准确的 bug +- 优化 添加依赖 uni-icons, 导入 uni-rate 自动下载依赖 +## 1.1.0(2021-04-16) +- 修复 uni-rate 属性 margin 值为 string 组件失效的 bug + +## 1.0.9(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.8(2021-02-05) +- 调整为uni_modules目录规范 +- 支持 pc 端 diff --git a/uni_modules/uni-rate/components/uni-rate/uni-rate.vue b/uni_modules/uni-rate/components/uni-rate/uni-rate.vue new file mode 100644 index 0000000..857f5f9 --- /dev/null +++ b/uni_modules/uni-rate/components/uni-rate/uni-rate.vue @@ -0,0 +1,361 @@ + + + + + diff --git a/uni_modules/uni-rate/package.json b/uni_modules/uni-rate/package.json new file mode 100644 index 0000000..64e8e33 --- /dev/null +++ b/uni_modules/uni-rate/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-rate", + "displayName": "uni-rate 评分", + "version": "1.3.1", + "description": "Rate 评分组件,可自定义评分星星图标的大小、间隔、评分数。", + "keywords": [ + "uni-ui", + "uniui", + "评分" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-rate/readme.md b/uni_modules/uni-rate/readme.md new file mode 100644 index 0000000..eae7b5c --- /dev/null +++ b/uni_modules/uni-rate/readme.md @@ -0,0 +1,12 @@ + + +## Rate 评分 +> **组件名:uni-rate** +> 代码块: `uRate` +> 关联组件:`uni-icons` + + +评分组件,多用于购买商品后,对商品进行评价等场景 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-rate) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-row/changelog.md b/uni_modules/uni-row/changelog.md new file mode 100644 index 0000000..5b465bc --- /dev/null +++ b/uni_modules/uni-row/changelog.md @@ -0,0 +1,10 @@ +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-row](https://uniapp.dcloud.io/component/uniui/uni-row) +## 0.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.0.4(2021-05-12) +- 新增 组件示例地址 +## 0.0.3(2021-02-05) +- 调整为uni_modules目录规范 +- 新增uni-row组件 diff --git a/uni_modules/uni-row/components/uni-col/uni-col.vue b/uni_modules/uni-row/components/uni-col/uni-col.vue new file mode 100644 index 0000000..84e2deb --- /dev/null +++ b/uni_modules/uni-row/components/uni-col/uni-col.vue @@ -0,0 +1,317 @@ + + + + + diff --git a/uni_modules/uni-row/components/uni-row/uni-row.vue b/uni_modules/uni-row/components/uni-row/uni-row.vue new file mode 100644 index 0000000..f8e8542 --- /dev/null +++ b/uni_modules/uni-row/components/uni-row/uni-row.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/uni_modules/uni-row/package.json b/uni_modules/uni-row/package.json new file mode 100644 index 0000000..3f52fa6 --- /dev/null +++ b/uni_modules/uni-row/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-row", + "displayName": "uni-row 布局-行", + "version": "1.0.0", + "description": "流式栅格系统,随着屏幕或视口分为 24 份,可以迅速简便地创建布局。", + "keywords": [ + "uni-ui", + "uniui", + "栅格", + "布局", + "layout" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-row/readme.md b/uni_modules/uni-row/readme.md new file mode 100644 index 0000000..3c9c8b9 --- /dev/null +++ b/uni_modules/uni-row/readme.md @@ -0,0 +1,10 @@ +## Layout 布局 + +> **组件名 uni-row、uni-col** +> 代码块: `uRow`、`uCol` + + +流式栅格系统,随着屏幕或视口分为 24 份,可以迅速简便地创建布局。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-row) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-scss/changelog.md b/uni_modules/uni-scss/changelog.md new file mode 100644 index 0000000..b863bb0 --- /dev/null +++ b/uni_modules/uni-scss/changelog.md @@ -0,0 +1,8 @@ +## 1.0.3(2022-01-21) +- 优化 组件示例 +## 1.0.2(2021-11-22) +- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题 +## 1.0.1(2021-11-22) +- 修复 vue3中scss语法兼容问题 +## 1.0.0(2021-11-18) +- init diff --git a/uni_modules/uni-scss/index.scss b/uni_modules/uni-scss/index.scss new file mode 100644 index 0000000..1744a5f --- /dev/null +++ b/uni_modules/uni-scss/index.scss @@ -0,0 +1 @@ +@import './styles/index.scss'; diff --git a/uni_modules/uni-scss/package.json b/uni_modules/uni-scss/package.json new file mode 100644 index 0000000..7cc0ccb --- /dev/null +++ b/uni_modules/uni-scss/package.json @@ -0,0 +1,82 @@ +{ + "id": "uni-scss", + "displayName": "uni-scss 辅助样式", + "version": "1.0.3", + "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。", + "keywords": [ + "uni-scss", + "uni-ui", + "辅助样式" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "JS SDK", + "通用 SDK" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "n", + "联盟": "n" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-scss/readme.md b/uni_modules/uni-scss/readme.md new file mode 100644 index 0000000..b7d1c25 --- /dev/null +++ b/uni_modules/uni-scss/readme.md @@ -0,0 +1,4 @@ +`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/index.scss b/uni_modules/uni-scss/styles/index.scss new file mode 100644 index 0000000..ffac4fe --- /dev/null +++ b/uni_modules/uni-scss/styles/index.scss @@ -0,0 +1,7 @@ +@import './setting/_variables.scss'; +@import './setting/_border.scss'; +@import './setting/_color.scss'; +@import './setting/_space.scss'; +@import './setting/_radius.scss'; +@import './setting/_text.scss'; +@import './setting/_styles.scss'; diff --git a/uni_modules/uni-scss/styles/setting/_border.scss b/uni_modules/uni-scss/styles/setting/_border.scss new file mode 100644 index 0000000..12a11c3 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_border.scss @@ -0,0 +1,3 @@ +.uni-border { + border: 1px $uni-border-1 solid; +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_color.scss b/uni_modules/uni-scss/styles/setting/_color.scss new file mode 100644 index 0000000..1ededd9 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_color.scss @@ -0,0 +1,66 @@ + +// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐 +// @mixin get-styles($k,$c) { +// @if $k == size or $k == weight{ +// font-#{$k}:#{$c} +// }@else{ +// #{$k}:#{$c} +// } +// } +$uni-ui-color:( + // 主色 + primary: $uni-primary, + primary-disable: $uni-primary-disable, + primary-light: $uni-primary-light, + // 辅助色 + success: $uni-success, + success-disable: $uni-success-disable, + success-light: $uni-success-light, + warning: $uni-warning, + warning-disable: $uni-warning-disable, + warning-light: $uni-warning-light, + error: $uni-error, + error-disable: $uni-error-disable, + error-light: $uni-error-light, + info: $uni-info, + info-disable: $uni-info-disable, + info-light: $uni-info-light, + // 中性色 + main-color: $uni-main-color, + base-color: $uni-base-color, + secondary-color: $uni-secondary-color, + extra-color: $uni-extra-color, + // 背景色 + bg-color: $uni-bg-color, + // 边框颜色 + border-1: $uni-border-1, + border-2: $uni-border-2, + border-3: $uni-border-3, + border-4: $uni-border-4, + // 黑色 + black:$uni-black, + // 白色 + white:$uni-white, + // 透明 + transparent:$uni-transparent +) !default; +@each $key, $child in $uni-ui-color { + .uni-#{"" + $key} { + color: $child; + } + .uni-#{"" + $key}-bg { + background-color: $child; + } +} +.uni-shadow-sm { + box-shadow: $uni-shadow-sm; +} +.uni-shadow-base { + box-shadow: $uni-shadow-base; +} +.uni-shadow-lg { + box-shadow: $uni-shadow-lg; +} +.uni-mask { + background-color:$uni-mask; +} diff --git a/uni_modules/uni-scss/styles/setting/_radius.scss b/uni_modules/uni-scss/styles/setting/_radius.scss new file mode 100644 index 0000000..9a0428b --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_radius.scss @@ -0,0 +1,55 @@ +@mixin radius($r,$d:null ,$important: false){ + $radius-value:map-get($uni-radius, $r) if($important, !important, null); + // Key exists within the $uni-radius variable + @if (map-has-key($uni-radius, $r) and $d){ + @if $d == t { + border-top-left-radius:$radius-value; + border-top-right-radius:$radius-value; + }@else if $d == r { + border-top-right-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == b { + border-bottom-left-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == l { + border-top-left-radius:$radius-value; + border-bottom-left-radius:$radius-value; + }@else if $d == tl { + border-top-left-radius:$radius-value; + }@else if $d == tr { + border-top-right-radius:$radius-value; + }@else if $d == br { + border-bottom-right-radius:$radius-value; + }@else if $d == bl { + border-bottom-left-radius:$radius-value; + } + }@else{ + border-radius:$radius-value; + } +} + +@each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $key} { + @include radius($key) + } + }@else{ + .uni-radius { + @include radius($key) + } + } +} + +@each $direction in t, r, b, l,tl, tr, br, bl { + @each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $direction}-#{"" + $key} { + @include radius($key,$direction,false) + } + }@else{ + .uni-radius-#{$direction} { + @include radius($key,$direction,false) + } + } + } +} diff --git a/uni_modules/uni-scss/styles/setting/_space.scss b/uni_modules/uni-scss/styles/setting/_space.scss new file mode 100644 index 0000000..3c89528 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_space.scss @@ -0,0 +1,56 @@ + +@mixin fn($space,$direction,$size,$n) { + @if $n { + #{$space}-#{$direction}: #{$size*$uni-space-root}px + } @else { + #{$space}-#{$direction}: #{-$size*$uni-space-root}px + } +} +@mixin get-styles($direction,$i,$space,$n){ + @if $direction == t { + @include fn($space, top,$i,$n); + } + @if $direction == r { + @include fn($space, right,$i,$n); + } + @if $direction == b { + @include fn($space, bottom,$i,$n); + } + @if $direction == l { + @include fn($space, left,$i,$n); + } + @if $direction == x { + @include fn($space, left,$i,$n); + @include fn($space, right,$i,$n); + } + @if $direction == y { + @include fn($space, top,$i,$n); + @include fn($space, bottom,$i,$n); + } + @if $direction == a { + @if $n { + #{$space}:#{$i*$uni-space-root}px; + } @else { + #{$space}:#{-$i*$uni-space-root}px; + } + } +} + +@each $orientation in m,p { + $space: margin; + @if $orientation == m { + $space: margin; + } @else { + $space: padding; + } + @for $i from 0 through 16 { + @each $direction in t, r, b, l, x, y, a { + .uni-#{$orientation}#{$direction}-#{$i} { + @include get-styles($direction,$i,$space,true); + } + .uni-#{$orientation}#{$direction}-n#{$i} { + @include get-styles($direction,$i,$space,false); + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_styles.scss b/uni_modules/uni-scss/styles/setting/_styles.scss new file mode 100644 index 0000000..689afec --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_styles.scss @@ -0,0 +1,167 @@ +/* #ifndef APP-NVUE */ + +$-color-white:#fff; +$-color-black:#000; +@mixin base-style($color) { + color: #fff; + background-color: $color; + border-color: mix($-color-black, $color, 8%); + &:not([hover-class]):active { + background: mix($-color-black, $color, 10%); + border-color: mix($-color-black, $color, 20%); + color: $-color-white; + outline: none; + } +} +@mixin is-color($color) { + @include base-style($color); + &[loading] { + @include base-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &[loading], + &:not([hover-class]):active { + color: $-color-white; + border-color: mix(darken($color,10%), $-color-white); + background-color: mix($color, $-color-white); + } + } + +} +@mixin base-plain-style($color) { + color:$color; + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 70%); + &:not([hover-class]):active { + background: mix($-color-white, $color, 80%); + color: $color; + outline: none; + border-color: mix($-color-white, $color, 50%); + } +} +@mixin is-plain($color){ + &[plain] { + @include base-plain-style($color); + &[loading] { + @include base-plain-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &:active { + color: mix($-color-white, $color, 40%); + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 80%); + } + } + } +} + + +.uni-btn { + margin: 5px; + color: #393939; + border:1px solid #ccc; + font-size: 16px; + font-weight: 200; + background-color: #F9F9F9; + // TODO 暂时处理边框隐藏一边的问题 + overflow: visible; + &::after{ + border: none; + } + + &:not([type]),&[type=default] { + color: #999; + &[loading] { + background: none; + &::before { + margin-right:5px; + } + } + + + + &[disabled]{ + color: mix($-color-white, #999, 60%); + &, + &[loading], + &:active { + color: mix($-color-white, #999, 60%); + background-color: mix($-color-white,$-color-black , 98%); + border-color: mix($-color-white, #999, 85%); + } + } + + &[plain] { + color: #999; + background: none; + border-color: $uni-border-1; + &:not([hover-class]):active { + background: none; + color: mix($-color-white, $-color-black, 80%); + border-color: mix($-color-white, $-color-black, 90%); + outline: none; + } + &[disabled]{ + &, + &[loading], + &:active { + background: none; + color: mix($-color-white, #999, 60%); + border-color: mix($-color-white, #999, 85%); + } + } + } + } + + &:not([hover-class]):active { + color: mix($-color-white, $-color-black, 50%); + } + + &[size=mini] { + font-size: 16px; + font-weight: 200; + border-radius: 8px; + } + + + + &.uni-btn-small { + font-size: 14px; + } + &.uni-btn-mini { + font-size: 12px; + } + + &.uni-btn-radius { + border-radius: 999px; + } + &[type=primary] { + @include is-color($uni-primary); + @include is-plain($uni-primary) + } + &[type=success] { + @include is-color($uni-success); + @include is-plain($uni-success) + } + &[type=error] { + @include is-color($uni-error); + @include is-plain($uni-error) + } + &[type=warning] { + @include is-color($uni-warning); + @include is-plain($uni-warning) + } + &[type=info] { + @include is-color($uni-info); + @include is-plain($uni-info) + } +} +/* #endif */ diff --git a/uni_modules/uni-scss/styles/setting/_text.scss b/uni_modules/uni-scss/styles/setting/_text.scss new file mode 100644 index 0000000..a34d08f --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_text.scss @@ -0,0 +1,24 @@ +@mixin get-styles($k,$c) { + @if $k == size or $k == weight{ + font-#{$k}:#{$c} + }@else{ + #{$k}:#{$c} + } +} + +@each $key, $child in $uni-headings { + /* #ifndef APP-NVUE */ + .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ + /* #ifdef APP-NVUE */ + .container .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ +} diff --git a/uni_modules/uni-scss/styles/setting/_variables.scss b/uni_modules/uni-scss/styles/setting/_variables.scss new file mode 100644 index 0000000..557d3d7 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_variables.scss @@ -0,0 +1,146 @@ +// @use "sass:math"; +@import '../tools/functions.scss'; +// 间距基础倍数 +$uni-space-root: 2 !default; +// 边框半径默认值 +$uni-radius-root:5px !default; +$uni-radius: () !default; +// 边框半径断点 +$uni-radius: map-deep-merge( + ( + 0: 0, + // TODO 当前版本暂时不支持 sm 属性 + // 'sm': math.div($uni-radius-root, 2), + null: $uni-radius-root, + 'lg': $uni-radius-root * 2, + 'xl': $uni-radius-root * 6, + 'pill': 9999px, + 'circle': 50% + ), + $uni-radius +); +// 字体家族 +$body-font-family: 'Roboto', sans-serif !default; +// 文本 +$heading-font-family: $body-font-family !default; +$uni-headings: () !default; +$letterSpacing: -0.01562em; +$uni-headings: map-deep-merge( + ( + 'h1': ( + size: 32px, + weight: 300, + line-height: 50px, + // letter-spacing:-0.01562em + ), + 'h2': ( + size: 28px, + weight: 300, + line-height: 40px, + // letter-spacing: -0.00833em + ), + 'h3': ( + size: 24px, + weight: 400, + line-height: 32px, + // letter-spacing: normal + ), + 'h4': ( + size: 20px, + weight: 400, + line-height: 30px, + // letter-spacing: 0.00735em + ), + 'h5': ( + size: 16px, + weight: 400, + line-height: 24px, + // letter-spacing: normal + ), + 'h6': ( + size: 14px, + weight: 500, + line-height: 18px, + // letter-spacing: 0.0125em + ), + 'subtitle': ( + size: 12px, + weight: 400, + line-height: 20px, + // letter-spacing: 0.00937em + ), + 'body': ( + font-size: 14px, + font-weight: 400, + line-height: 22px, + // letter-spacing: 0.03125em + ), + 'caption': ( + 'size': 12px, + 'weight': 400, + 'line-height': 20px, + // 'letter-spacing': 0.03333em, + // 'text-transform': false + ) + ), + $uni-headings +); + + + +// 主色 +$uni-primary: #2979ff !default; +$uni-primary-disable:lighten($uni-primary,20%) !default; +$uni-primary-light: lighten($uni-primary,25%) !default; + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37 !default; +$uni-success-disable:lighten($uni-success,20%) !default; +$uni-success-light: lighten($uni-success,25%) !default; + +$uni-warning: #f3a73f !default; +$uni-warning-disable:lighten($uni-warning,20%) !default; +$uni-warning-light: lighten($uni-warning,25%) !default; + +$uni-error: #e43d33 !default; +$uni-error-disable:lighten($uni-error,20%) !default; +$uni-error-light: lighten($uni-error,25%) !default; + +$uni-info: #8f939c !default; +$uni-info-disable:lighten($uni-info,20%) !default; +$uni-info-light: lighten($uni-info,25%) !default; + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a !default; // 主要文字 +$uni-base-color: #6a6a6a !default; // 常规文字 +$uni-secondary-color: #909399 !default; // 次要文字 +$uni-extra-color: #c7c7c7 !default; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0 !default; +$uni-border-2: #EDEDED !default; +$uni-border-3: #DCDCDC !default; +$uni-border-4: #B9B9B9 !default; + +// 常规色 +$uni-black: #000000 !default; +$uni-white: #ffffff !default; +$uni-transparent: rgba($color: #000000, $alpha: 0) !default; + +// 背景色 +$uni-bg-color: #f7f7f7 !default; + +/* 水平间距 */ +$uni-spacing-sm: 8px !default; +$uni-spacing-base: 15px !default; +$uni-spacing-lg: 30px !default; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default; +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default; +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default; + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4) !default; diff --git a/uni_modules/uni-scss/styles/tools/functions.scss b/uni_modules/uni-scss/styles/tools/functions.scss new file mode 100644 index 0000000..ac6f63e --- /dev/null +++ b/uni_modules/uni-scss/styles/tools/functions.scss @@ -0,0 +1,19 @@ +// 合并 map +@function map-deep-merge($parent-map, $child-map){ + $result: $parent-map; + @each $key, $child in $child-map { + $parent-has-key: map-has-key($result, $key); + $parent-value: map-get($result, $key); + $parent-type: type-of($parent-value); + $child-type: type-of($child); + $parent-is-map: $parent-type == map; + $child-is-map: $child-type == map; + + @if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){ + $result: map-merge($result, ( $key: $child )); + }@else { + $result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) )); + } + } + @return $result; +}; diff --git a/uni_modules/uni-scss/theme.scss b/uni_modules/uni-scss/theme.scss new file mode 100644 index 0000000..80ee62f --- /dev/null +++ b/uni_modules/uni-scss/theme.scss @@ -0,0 +1,31 @@ +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; +// 主色 +$uni-primary: #2979ff; +// 辅助色 +$uni-success: #4cd964; +// 警告色 +$uni-warning: #f0ad4e; +// 错误色 +$uni-error: #dd524d; +// 描述色 +$uni-info: #909399; +// 中性色 +$uni-main-color: #303133; +$uni-base-color: #606266; +$uni-secondary-color: #909399; +$uni-extra-color: #C0C4CC; +// 背景色 +$uni-bg-color: #f5f5f5; +// 边框颜色 +$uni-border-1: #DCDFE6; +$uni-border-2: #E4E7ED; +$uni-border-3: #EBEEF5; +$uni-border-4: #F2F6FC; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); diff --git a/uni_modules/uni-scss/variables.scss b/uni_modules/uni-scss/variables.scss new file mode 100644 index 0000000..1c062d4 --- /dev/null +++ b/uni_modules/uni-scss/variables.scss @@ -0,0 +1,62 @@ +@import './styles/setting/_variables.scss'; +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; + +// 主色 +$uni-primary: #2979ff; +$uni-primary-disable:mix(#fff,$uni-primary,50%); +$uni-primary-light: mix(#fff,$uni-primary,80%); + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37; +$uni-success-disable:mix(#fff,$uni-success,50%); +$uni-success-light: mix(#fff,$uni-success,80%); + +$uni-warning: #f3a73f; +$uni-warning-disable:mix(#fff,$uni-warning,50%); +$uni-warning-light: mix(#fff,$uni-warning,80%); + +$uni-error: #e43d33; +$uni-error-disable:mix(#fff,$uni-error,50%); +$uni-error-light: mix(#fff,$uni-error,80%); + +$uni-info: #8f939c; +$uni-info-disable:mix(#fff,$uni-info,50%); +$uni-info-light: mix(#fff,$uni-info,80%); + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a; // 主要文字 +$uni-base-color: #6a6a6a; // 常规文字 +$uni-secondary-color: #909399; // 次要文字 +$uni-extra-color: #c7c7c7; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0; +$uni-border-2: #EDEDED; +$uni-border-3: #DCDCDC; +$uni-border-4: #B9B9B9; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); + +// 背景色 +$uni-bg-color: #f7f7f7; + +/* 水平间距 */ +$uni-spacing-sm: 8px; +$uni-spacing-base: 15px; +$uni-spacing-lg: 30px; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5); +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2); +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5); + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4); diff --git a/uni_modules/uni-search-bar/changelog.md b/uni_modules/uni-search-bar/changelog.md new file mode 100644 index 0000000..2c6571c --- /dev/null +++ b/uni_modules/uni-search-bar/changelog.md @@ -0,0 +1,47 @@ +## 1.3.0(2024-04-22) +- 修复 textColor默认值导致的文字不显示的bug +## 1.2.9(2024-04-17) +- 修复 textColor不生效的bug +## 1.2.8(2024-02-22) +- 修复 清空按钮emit值错误的bug +## 1.2.7(2024-02-21) +- 新增 设置输入框字体颜色:textColor +## 1.2.6(2024-02-20) +- 修复 uni-search-bar在支付宝小程序下样式兼容问题 +## 1.2.5(2024-01-31) +- 修复 uni-search-bar居中问题,现在默认居左,并修复样式偏移问题 +## 1.2.4(2023-05-09) +- 修复 i18n 国际化不正确的 Bug +## 1.2.3(2022-05-24) +- 新增 readonly 属性,组件只读 +## 1.2.2(2022-05-06) +- 修复 vue3 input 事件不生效的bug +## 1.2.1(2022-05-06) +- 修复 多余代码导致的bug +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-search-bar](https://uniapp.dcloud.io/component/uniui/uni-search-bar) +## 1.1.2(2021-08-30) +- 修复 value 属性与 modelValue 属性不兼容的Bug +## 1.1.1(2021-08-24) +- 新增 支持国际化 +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.9(2021-05-12) +- 新增 项目示例地址 +## 1.0.8(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.7(2021-04-15) +- uni-ui 新增 uni-search-bar 的 focus 事件 + +## 1.0.6(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.5(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 支持双向绑定 +- 更改 input 事件的返回值,e={value:Number} --> e=value +- 新增 支持图标插槽 +- 新增 支持 clear、blur 事件 +- 新增 支持 focus 属性 +- 去掉组件背景色 diff --git a/uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json new file mode 100644 index 0000000..dd083a5 --- /dev/null +++ b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json @@ -0,0 +1,4 @@ +{ + "uni-search-bar.cancel": "cancel", + "uni-search-bar.placeholder": "Search enter content" +} \ No newline at end of file diff --git a/uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json new file mode 100644 index 0000000..d2a1ced --- /dev/null +++ b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json @@ -0,0 +1,4 @@ +{ + "uni-search-bar.cancel": "取消", + "uni-search-bar.placeholder": "请输入搜索内容" +} diff --git a/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json new file mode 100644 index 0000000..f1c96bc --- /dev/null +++ b/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json @@ -0,0 +1,4 @@ +{ + "uni-search-bar.cancel": "取消", + "uni-search-bar.placeholder": "請輸入搜索內容" +} diff --git a/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue b/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue new file mode 100644 index 0000000..6b9b9c1 --- /dev/null +++ b/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue @@ -0,0 +1,309 @@ + + + + + diff --git a/uni_modules/uni-search-bar/package.json b/uni_modules/uni-search-bar/package.json new file mode 100644 index 0000000..1730d9d --- /dev/null +++ b/uni_modules/uni-search-bar/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-search-bar", + "displayName": "uni-search-bar 搜索栏", + "version": "1.3.0", + "description": "搜索栏组件,通常用于搜索商品、文章等", + "keywords": [ + "uni-ui", + "uniui", + "搜索框", + "搜索栏" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-search-bar/readme.md b/uni_modules/uni-search-bar/readme.md new file mode 100644 index 0000000..253092f --- /dev/null +++ b/uni_modules/uni-search-bar/readme.md @@ -0,0 +1,14 @@ + + +## SearchBar 搜索栏 + +> **组件名:uni-search-bar** +> 代码块: `uSearchBar` + + +搜索栏组件 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-search-bar) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-section/changelog.md b/uni_modules/uni-section/changelog.md new file mode 100644 index 0000000..738f2b3 --- /dev/null +++ b/uni_modules/uni-section/changelog.md @@ -0,0 +1,2 @@ +## 0.0.1(2022-07-22) +- 初始化 diff --git a/uni_modules/uni-section/components/uni-section/uni-section.vue b/uni_modules/uni-section/components/uni-section/uni-section.vue new file mode 100644 index 0000000..9a52e0b --- /dev/null +++ b/uni_modules/uni-section/components/uni-section/uni-section.vue @@ -0,0 +1,167 @@ + + + + diff --git a/uni_modules/uni-section/package.json b/uni_modules/uni-section/package.json new file mode 100644 index 0000000..0a31fb5 --- /dev/null +++ b/uni_modules/uni-section/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-section", + "displayName": "uni-section 标题栏", + "version": "0.0.1", + "description": "标题栏组件", + "keywords": [ + "uni-ui", + "uniui", + "标题栏" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-section/readme.md b/uni_modules/uni-section/readme.md new file mode 100644 index 0000000..d47faab --- /dev/null +++ b/uni_modules/uni-section/readme.md @@ -0,0 +1,8 @@ +## Section 标题栏 +> **组件名:uni-section** +> 代码块: `uSection` + +uni-section 组件主要用于文章、列表详情等标题展示 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-section) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-segmented-control/changelog.md b/uni_modules/uni-segmented-control/changelog.md new file mode 100644 index 0000000..02d0c8a --- /dev/null +++ b/uni_modules/uni-segmented-control/changelog.md @@ -0,0 +1,15 @@ +## 1.2.3(2024-04-02) +- 修复 修复在微信小程序下inactiveColor失效bug +## 1.2.2(2024-03-28) +- 修复 在vue2下:style动态绑定导致编译失败的bug +## 1.2.1(2024-03-20) +- 新增 inActiveColor属性,可供配置未激活时的颜色 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-segmented-control](https://uniapp.dcloud.io/component/uniui/uni-segmented-control) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.5(2021-05-12) +- 新增 项目示例地址 +## 1.0.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue b/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue new file mode 100644 index 0000000..a69366a --- /dev/null +++ b/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/uni_modules/uni-segmented-control/package.json b/uni_modules/uni-segmented-control/package.json new file mode 100644 index 0000000..49f9eff --- /dev/null +++ b/uni_modules/uni-segmented-control/package.json @@ -0,0 +1,85 @@ +{ + "id": "uni-segmented-control", + "displayName": "uni-segmented-control 分段器", + "version": "1.2.3", + "description": "分段器由至少 2 个分段控件组成,用作不同视图的显示", + "keywords": [ + "uni-ui", + "uniui", + "分段器", + "segement", + "顶部选择" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-segmented-control/readme.md b/uni_modules/uni-segmented-control/readme.md new file mode 100644 index 0000000..3527b03 --- /dev/null +++ b/uni_modules/uni-segmented-control/readme.md @@ -0,0 +1,13 @@ + + +## SegmentedControl 分段器 +> **组件名:uni-segmented-control** +> 代码块: `uSegmentedControl` + + +用作不同视图的显示 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-segmented-control) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-steps/changelog.md b/uni_modules/uni-steps/changelog.md new file mode 100644 index 0000000..04367d8 --- /dev/null +++ b/uni_modules/uni-steps/changelog.md @@ -0,0 +1,18 @@ +## 1.1.2(2024-03-28) +- 修复 uni-steps为竖排列时,文本长度过长引起点错乱的bug +## 1.1.1(2021-11-22) +- 修复 vue3中某些scss变量无法找到的问题 +## 1.1.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-steps](https://uniapp.dcloud.io/component/uniui/uni-steps) +## 1.0.8(2021-05-12) +- 新增 项目示例地址 +## 1.0.7(2021-05-06) +- 修复 uni-steps 横向布局时,多行文字高度不合理的 bug +## 1.0.6(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.5(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-steps/components/uni-steps/uni-steps.vue b/uni_modules/uni-steps/components/uni-steps/uni-steps.vue new file mode 100644 index 0000000..81017fc --- /dev/null +++ b/uni_modules/uni-steps/components/uni-steps/uni-steps.vue @@ -0,0 +1,280 @@ + + + + + diff --git a/uni_modules/uni-steps/package.json b/uni_modules/uni-steps/package.json new file mode 100644 index 0000000..4145ce9 --- /dev/null +++ b/uni_modules/uni-steps/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-steps", + "displayName": "uni-steps 步骤条", + "version": "1.1.2", + "description": "步骤条组件,提供横向和纵向两种布局格式。", + "keywords": [ + "uni-ui", + "uniui", + "步骤条", + "时间轴" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-steps/readme.md b/uni_modules/uni-steps/readme.md new file mode 100644 index 0000000..da7a4bf --- /dev/null +++ b/uni_modules/uni-steps/readme.md @@ -0,0 +1,13 @@ + + +## Steps 步骤条 +> **组件名:uni-steps** +> 代码块: `uSteps` + + +步骤条,常用于显示进度 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-steps) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-swipe-action/changelog.md b/uni_modules/uni-swipe-action/changelog.md new file mode 100644 index 0000000..e28472f --- /dev/null +++ b/uni_modules/uni-swipe-action/changelog.md @@ -0,0 +1,47 @@ +## 1.3.10(2024-01-17) +- 修复 点击按钮时,按钮会被点击穿透导致自动收缩的 bug(兼容阿里/百度/抖音小程序) +## 1.3.9(2024-01-17) +- 修复 点击按钮时,按钮会被点击穿透导致自动收缩的 bug +## 1.3.8(2023-04-13) +- 修复`uni-swipe-action`和`uni-swipe-action-item`不同时使用导致 closeOther 方法报错的 bug +## 1.3.7(2022-06-06) +- 修复 vue3 下使用组件不能正常运行的Bug +## 1.3.6(2022-05-31) +- 修复 h5端点击click触发两次的Bug +## 1.3.5(2022-05-23) +- 修复 isPC 找不到的Bug +## 1.3.4(2022-05-19) +- 修复 在 nvue 下 disabled 失效的bug +## 1.3.3(2022-03-31) +- 修复 按钮字体大小不能设置的bug +## 1.3.2(2022-03-16) +- 修复 h5和app端下报el错误的bug +## 1.3.1(2022-03-07) +- 修复 HBuilderX 1.4.X 版本中,h5和app端下报错的bug +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-swipe-action](https://uniapp.dcloud.io/component/uniui/uni-swipe-action) +## 1.2.4(2021-08-20) +- 优化 close-all 方法 +## 1.2.3(2021-08-20) +- 新增 close-all 方法,关闭所有已打开的组件 +## 1.2.2(2021-08-17) +- 新增 resize() 方法,在非微信小程序、h5、app-vue端出现不能滑动的问题的时候,重置组件 +- 修复 app 端偶尔出现类似 Page[x][-x,xx;-x,xx,x,x-x] 的问题 +- 优化 微信小程序、h5、app-vue 滑动逻辑,避免出现动态新增组件后不能滑动的问题 +## 1.2.1(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +- 修复 跨页面修改组件数据 ,导致不能滑动的问题 +## 1.1.10(2021-06-17) +- 修复 按钮点击执行两次的bug +## 1.1.9(2021-05-12) +- 新增 项目示例地址 +## 1.1.8(2021-03-26) +- 修复 微信小程序 nv_navigator is not defined 报错的bug +## 1.1.7(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 左侧滑动 +- 新增 插槽使用方式 +- 新增 threshold 属性,可以控制滑动缺省值 +- 优化 长列表滚动性能 +- 修复 滚动页面时触发组件滑动的Bug diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js new file mode 100644 index 0000000..707e432 --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js @@ -0,0 +1,302 @@ +let bindIngXMixins = {} + +// #ifdef APP-NVUE +const BindingX = uni.requireNativePlugin('bindingx'); +const dom = uni.requireNativePlugin('dom'); +const animation = uni.requireNativePlugin('animation'); + +bindIngXMixins = { + data() { + return {} + }, + + watch: { + show(newVal) { + if (this.autoClose) return + if (this.stop) return + this.stop = true + if (newVal) { + this.open(newVal) + } else { + this.close() + } + }, + leftOptions() { + this.getSelectorQuery() + this.init() + }, + rightOptions(newVal) { + this.init() + } + }, + created() { + this.swipeaction = this.getSwipeAction() + if (this.swipeaction && Array.isArray(this.swipeaction.children)) { + this.swipeaction.children.push(this) + } + }, + mounted() { + this.box = this.getEl(this.$refs['selector-box--hock']) + this.selector = this.getEl(this.$refs['selector-content--hock']); + this.leftButton = this.getEl(this.$refs['selector-left-button--hock']); + this.rightButton = this.getEl(this.$refs['selector-right-button--hock']); + this.init() + }, + // beforeDestroy() { + // this.swipeaction.children.forEach((item, index) => { + // if (item === this) { + // this.swipeaction.children.splice(index, 1) + // } + // }) + // }, + methods: { + init() { + this.$nextTick(() => { + this.x = 0 + this.button = { + show: false + } + setTimeout(() => { + this.getSelectorQuery() + }, 200) + }) + }, + onClick(index, item, position) { + this.$emit('click', { + content: item, + index, + position + }) + }, + touchstart(e) { + // fix by mehaotian 禁止滑动 + if (this.disabled) return + // 每次只触发一次,避免多次监听造成闪烁 + if (this.stop) return + this.stop = true + if (this.autoClose && this.swipeaction) { + this.swipeaction.closeOther(this) + } + + const leftWidth = this.button.left.width + const rightWidth = this.button.right.width + let expression = this.range(this.x, -rightWidth, leftWidth) + let leftExpression = this.range(this.x - leftWidth, -leftWidth, 0) + let rightExpression = this.range(this.x + rightWidth, 0, rightWidth) + + this.eventpan = BindingX.bind({ + anchor: this.box, + eventType: 'pan', + props: [{ + element: this.selector, + property: 'transform.translateX', + expression + }, { + element: this.leftButton, + property: 'transform.translateX', + expression: leftExpression + }, { + element: this.rightButton, + property: 'transform.translateX', + expression: rightExpression + }, ] + }, (e) => { + // nope + if (e.state === 'end') { + this.x = e.deltaX + this.x; + this.isclick = true + this.bindTiming(e.deltaX) + } + }); + }, + touchend(e) { + if (this.isopen !== 'none' && !this.isclick) { + this.open('none') + } + }, + bindTiming(x) { + const left = this.x + const leftWidth = this.button.left.width + const rightWidth = this.button.right.width + const threshold = this.threshold + if (!this.isopen || this.isopen === 'none') { + if (left > threshold) { + this.open('left') + } else if (left < -threshold) { + this.open('right') + } else { + this.open('none') + } + } else { + if ((x > -leftWidth && x < 0) || x > rightWidth) { + if ((x > -threshold && x < 0) || (x - rightWidth > threshold)) { + this.open('left') + } else { + this.open('none') + } + } else { + if ((x < threshold && x > 0) || (x + leftWidth < -threshold)) { + this.open('right') + } else { + this.open('none') + } + } + } + }, + + /** + * 移动范围 + * @param {Object} num + * @param {Object} mix + * @param {Object} max + */ + range(num, mix, max) { + return `min(max(x+${num}, ${mix}), ${max})` + }, + + /** + * 开启swipe + */ + open(type) { + this.animation(type) + }, + + /** + * 关闭swipe + */ + close() { + this.animation('none') + }, + + /** + * 开启关闭动画 + * @param {Object} type + */ + animation(type) { + const time = 300 + const leftWidth = this.button.left.width + const rightWidth = this.button.right.width + if (this.eventpan && this.eventpan.token) { + BindingX.unbind({ + token: this.eventpan.token, + eventType: 'pan' + }) + } + + switch (type) { + case 'left': + Promise.all([ + this.move(this.selector, leftWidth), + this.move(this.leftButton, 0), + this.move(this.rightButton, rightWidth * 2) + ]).then(() => { + this.setEmit(leftWidth, type) + }) + break + case 'right': + Promise.all([ + this.move(this.selector, -rightWidth), + this.move(this.leftButton, -leftWidth * 2), + this.move(this.rightButton, 0) + ]).then(() => { + this.setEmit(-rightWidth, type) + }) + break + default: + Promise.all([ + this.move(this.selector, 0), + this.move(this.leftButton, -leftWidth), + this.move(this.rightButton, rightWidth) + ]).then(() => { + this.setEmit(0, type) + }) + + } + }, + setEmit(x, type) { + const leftWidth = this.button.left.width + const rightWidth = this.button.right.width + this.isopen = this.isopen || 'none' + this.stop = false + this.isclick = false + // 只有状态不一致才会返回结果 + if (this.isopen !== type && this.x !== x) { + if (type === 'left' && leftWidth > 0) { + this.$emit('change', 'left') + } + if (type === 'right' && rightWidth > 0) { + this.$emit('change', 'right') + } + if (type === 'none') { + this.$emit('change', 'none') + } + } + this.x = x + this.isopen = type + }, + move(ref, value) { + return new Promise((resolve, reject) => { + animation.transition(ref, { + styles: { + transform: `translateX(${value})`, + }, + duration: 150, //ms + timingFunction: 'linear', + needLayout: false, + delay: 0 //ms + }, function(res) { + resolve(res) + }) + }) + + }, + + /** + * 获取ref + * @param {Object} el + */ + getEl(el) { + return el.ref + }, + /** + * 获取节点信息 + */ + getSelectorQuery() { + Promise.all([ + this.getDom('left'), + this.getDom('right'), + ]).then((data) => { + let show = 'none' + if (this.autoClose) { + show = 'none' + } else { + show = this.show + } + + if (show === 'none') { + // this.close() + } else { + this.open(show) + } + + }) + + }, + getDom(str) { + return new Promise((resolve, reject) => { + dom.getComponentRect(this.$refs[`selector-${str}-button--hock`], (data) => { + if (data) { + this.button[str] = data.size + resolve(data) + } else { + reject() + } + }) + }) + } + } +} + +// #endif + +export default bindIngXMixins diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js new file mode 100644 index 0000000..917cb48 --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js @@ -0,0 +1,12 @@ +export function isPC() { + var userAgentInfo = navigator.userAgent; + var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; + var flag = true; + for (let v = 0; v < Agents.length - 1; v++) { + if (userAgentInfo.indexOf(Agents[v]) > 0) { + flag = false; + break; + } + } + return flag; +} diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js new file mode 100644 index 0000000..35c796b --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js @@ -0,0 +1,195 @@ +export default { + data() { + return { + x: 0, + transition: false, + width: 0, + viewWidth: 0, + swipeShow: 0 + } + }, + watch: { + show(newVal) { + if (this.autoClose) return + if (newVal && newVal !== 'none') { + this.transition = true + this.open(newVal) + } else { + this.close() + } + } + }, + created() { + this.swipeaction = this.getSwipeAction() + if (this.swipeaction && Array.isArray(this.swipeaction.children)) { + this.swipeaction.children.push(this) + } + }, + mounted() { + this.isopen = false + setTimeout(() => { + this.getQuerySelect() + }, 50) + }, + methods: { + appTouchStart(e) { + const { + clientX + } = e.changedTouches[0] + this.clientX = clientX + this.timestamp = new Date().getTime() + }, + appTouchEnd(e, index, item, position) { + const { + clientX + } = e.changedTouches[0] + // fixed by xxxx 模拟点击事件,解决 ios 13 点击区域错位的问题 + let diff = Math.abs(this.clientX - clientX) + let time = (new Date().getTime()) - this.timestamp + if (diff < 40 && time < 300) { + this.$emit('click', { + content: item, + index, + position + }) + } + }, + /** + * 移动触发 + * @param {Object} e + */ + onChange(e) { + this.moveX = e.detail.x + this.isclose = false + }, + touchstart(e) { + this.transition = false + this.isclose = true + if (this.autoClose && this.swipeaction) { + this.swipeaction.closeOther(this) + } + }, + touchmove(e) {}, + touchend(e) { + // 0的位置什么都不执行 + if (this.isclose && this.isopen === 'none') return + if (this.isclose && this.isopen !== 'none') { + this.transition = true + this.close() + } else { + this.move(this.moveX + this.leftWidth) + } + }, + + /** + * 移动 + * @param {Object} moveX + */ + move(moveX) { + // 打开关闭的处理逻辑不太一样 + this.transition = true + // 未打开状态 + if (!this.isopen || this.isopen === 'none') { + if (moveX > this.threshold) { + this.open('left') + } else if (moveX < -this.threshold) { + this.open('right') + } else { + this.close() + } + } else { + if (moveX < 0 && moveX < this.rightWidth) { + const rightX = this.rightWidth + moveX + if (rightX < this.threshold) { + this.open('right') + } else { + this.close() + } + } else if (moveX > 0 && moveX < this.leftWidth) { + const leftX = this.leftWidth - moveX + if (leftX < this.threshold) { + this.open('left') + } else { + this.close() + } + } + + } + + }, + + /** + * 打开 + */ + open(type) { + this.x = this.moveX + this.animation(type) + }, + + /** + * 关闭 + */ + close() { + this.x = this.moveX + // TODO 解决 x 值不更新的问题,所以会多触发一次 nextTick ,待优化 + this.$nextTick(() => { + this.x = -this.leftWidth + if (this.isopen !== 'none') { + this.$emit('change', 'none') + } + this.isopen = 'none' + }) + }, + + /** + * 执行结束动画 + * @param {Object} type + */ + animation(type) { + this.$nextTick(() => { + if (type === 'left') { + this.x = 0 + } else { + this.x = -this.rightWidth - this.leftWidth + } + + if (this.isopen !== type) { + this.$emit('change', type) + } + this.isopen = type + }) + + }, + getSlide(x) {}, + getQuerySelect() { + const query = uni.createSelectorQuery().in(this); + query.selectAll('.movable-view--hock').boundingClientRect(data => { + this.leftWidth = data[1].width + this.rightWidth = data[2].width + this.width = data[0].width + this.viewWidth = this.width + this.rightWidth + this.leftWidth + if (this.leftWidth === 0) { + // TODO 疑似bug ,初始化的时候如果x 是0,会导致移动位置错误,所以让元素超出一点 + this.x = -0.1 + } else { + this.x = -this.leftWidth + } + this.moveX = this.x + this.$nextTick(() => { + this.swipeShow = 1 + }) + + if (!this.buttonWidth) { + this.disabledView = true + } + + if (this.autoClose) return + if (this.show !== 'none') { + this.transition = true + this.open(this.shows) + } + }).exec(); + + } + } +} diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js new file mode 100644 index 0000000..d389bce --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js @@ -0,0 +1,260 @@ +let otherMixins = {} + +// #ifndef APP-PLUS|| MP-WEIXIN || H5 +const MIN_DISTANCE = 10; +otherMixins = { + data() { + // TODO 随机生生元素ID,解决百度小程序获取同一个元素位置信息的bug + const elClass = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}` + return { + uniShow: false, + left: 0, + buttonShow: 'none', + ani: false, + moveLeft: '', + elClass + } + }, + watch: { + show(newVal) { + if (this.autoClose) return + this.openState(newVal) + }, + left() { + this.moveLeft = `translateX(${this.left}px)` + }, + buttonShow(newVal) { + if (this.autoClose) return + this.openState(newVal) + }, + leftOptions() { + this.init() + }, + rightOptions() { + this.init() + } + }, + mounted() { + this.swipeaction = this.getSwipeAction() + if (this.swipeaction && Array.isArray(this.swipeaction.children)) { + this.swipeaction.children.push(this) + } + this.init() + }, + methods: { + init() { + clearTimeout(this.timer) + this.timer = setTimeout(() => { + this.getSelectorQuery() + }, 100) + // 移动距离 + this.left = 0 + this.x = 0 + }, + + closeSwipe(e) { + if (this.autoClose && this.swipeaction) { + this.swipeaction.closeOther(this) + } + }, + appTouchStart(e) { + const { + clientX + } = e.changedTouches[0] + this.clientX = clientX + this.timestamp = new Date().getTime() + }, + appTouchEnd(e, index, item, position) { + const { + clientX + } = e.changedTouches[0] + // fixed by xxxx 模拟点击事件,解决 ios 13 点击区域错位的问题 + let diff = Math.abs(this.clientX - clientX) + let time = (new Date().getTime()) - this.timestamp + if (diff < 40 && time < 300) { + this.$emit('click', { + content: item, + index, + position + }) + } + }, + touchstart(e) { + if (this.disabled) return + this.ani = false + this.x = this.left || 0 + this.stopTouchStart(e) + this.autoClose && this.closeSwipe() + }, + touchmove(e) { + if (this.disabled) return + // 是否可以滑动页面 + this.stopTouchMove(e); + if (this.direction !== 'horizontal') { + return; + } + this.move(this.x + this.deltaX) + return false + }, + touchend() { + if (this.disabled) return + this.moveDirection(this.left) + }, + /** + * 设置移动距离 + * @param {Object} value + */ + move(value) { + value = value || 0 + const leftWidth = this.leftWidth + const rightWidth = this.rightWidth + // 获取可滑动范围 + this.left = this.range(value, -rightWidth, leftWidth); + }, + + /** + * 获取范围 + * @param {Object} num + * @param {Object} min + * @param {Object} max + */ + range(num, min, max) { + return Math.min(Math.max(num, min), max); + }, + /** + * 移动方向判断 + * @param {Object} left + * @param {Object} value + */ + moveDirection(left) { + const threshold = this.threshold + const isopen = this.isopen || 'none' + const leftWidth = this.leftWidth + const rightWidth = this.rightWidth + if (this.deltaX === 0) { + this.openState('none') + return + } + if ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth > + 0 && rightWidth + + left < threshold)) { + // right + this.openState('right') + } else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth > + 0 && + leftWidth - left < threshold)) { + // left + this.openState('left') + } else { + // default + this.openState('none') + } + }, + + /** + * 开启状态 + * @param {Boolean} type + */ + openState(type) { + const leftWidth = this.leftWidth + const rightWidth = this.rightWidth + let left = '' + this.isopen = this.isopen ? this.isopen : 'none' + switch (type) { + case "left": + left = leftWidth + break + case "right": + left = -rightWidth + break + default: + left = 0 + } + + + if (this.isopen !== type) { + this.throttle = true + this.$emit('change', type) + } + + this.isopen = type + // 添加动画类 + this.ani = true + this.$nextTick(() => { + this.move(left) + }) + // 设置最终移动位置,理论上只要进入到这个函数,肯定是要打开的 + }, + close() { + this.openState('none') + }, + getDirection(x, y) { + if (x > y && x > MIN_DISTANCE) { + return 'horizontal'; + } + if (y > x && y > MIN_DISTANCE) { + return 'vertical'; + } + return ''; + }, + + /** + * 重置滑动状态 + * @param {Object} event + */ + resetTouchStatus() { + this.direction = ''; + this.deltaX = 0; + this.deltaY = 0; + this.offsetX = 0; + this.offsetY = 0; + }, + + /** + * 设置滑动开始位置 + * @param {Object} event + */ + stopTouchStart(event) { + this.resetTouchStatus(); + const touch = event.touches[0]; + this.startX = touch.clientX; + this.startY = touch.clientY; + }, + + /** + * 滑动中,是否禁止打开 + * @param {Object} event + */ + stopTouchMove(event) { + const touch = event.touches[0]; + this.deltaX = touch.clientX - this.startX; + this.deltaY = touch.clientY - this.startY; + this.offsetX = Math.abs(this.deltaX); + this.offsetY = Math.abs(this.deltaY); + this.direction = this.direction || this.getDirection(this.offsetX, this.offsetY); + }, + + getSelectorQuery() { + const views = uni.createSelectorQuery().in(this) + views + .selectAll('.' + this.elClass) + .boundingClientRect(data => { + if (data.length === 0) return + let show = 'none' + if (this.autoClose) { + show = 'none' + } else { + show = this.show + } + this.leftWidth = data[0].width || 0 + this.rightWidth = data[1].width || 0 + this.buttonShow = show + }) + .exec() + } + } +} + +// #endif + +export default otherMixins diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js new file mode 100644 index 0000000..08de1c9 --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js @@ -0,0 +1,84 @@ +let mpMixins = {} +let is_pc = null +// #ifdef H5 +import { + isPC +} from "./isPC" +is_pc = isPC() +// #endif +// #ifdef APP-VUE|| MP-WEIXIN || H5 + +mpMixins = { + data() { + return { + is_show: 'none' + } + }, + watch: { + show(newVal) { + this.is_show = this.show + } + }, + created() { + this.swipeaction = this.getSwipeAction() + if (this.swipeaction && Array.isArray(this.swipeaction.children)) { + this.swipeaction.children.push(this) + } + }, + mounted() { + this.is_show = this.show + }, + methods: { + // wxs 中调用 + closeSwipe(e) { + if (this.autoClose && this.swipeaction) { + this.swipeaction.closeOther(this) + } + }, + + change(e) { + this.$emit('change', e.open) + if (this.is_show !== e.open) { + this.is_show = e.open + } + }, + + appTouchStart(e) { + if (is_pc) return + const { + clientX + } = e.changedTouches[0] + this.clientX = clientX + this.timestamp = new Date().getTime() + }, + appTouchEnd(e, index, item, position) { + if (is_pc) return + const { + clientX + } = e.changedTouches[0] + // fixed by xxxx 模拟点击事件,解决 ios 13 点击区域错位的问题 + let diff = Math.abs(this.clientX - clientX) + let time = (new Date().getTime()) - this.timestamp + if (diff < 40 && time < 300) { + this.$emit('click', { + content: item, + index, + position + }) + } + }, + onClickForPC(index, item, position) { + if (!is_pc) return + // #ifdef H5 + this.$emit('click', { + content: item, + index, + position + }) + // #endif + } + } +} + +// #endif +export default mpMixins diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js new file mode 100644 index 0000000..78f0ec6 --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js @@ -0,0 +1,270 @@ +const MIN_DISTANCE = 10; +export default { + showWatch(newVal, oldVal, ownerInstance, instance, self) { + var state = self.state + var $el = ownerInstance.$el || ownerInstance.$vm && ownerInstance.$vm.$el + if (!$el) return + this.getDom(instance, ownerInstance, self) + if (newVal && newVal !== 'none') { + this.openState(newVal, instance, ownerInstance, self) + return + } + + if (state.left) { + this.openState('none', instance, ownerInstance, self) + } + this.resetTouchStatus(instance, self) + }, + + /** + * 开始触摸操作 + * @param {Object} e + * @param {Object} ins + */ + touchstart(e, ownerInstance, self) { + let instance = e.instance; + let disabled = instance.getDataset().disabled + let state = self.state; + this.getDom(instance, ownerInstance, self) + // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复 + disabled = this.getDisabledType(disabled) + if (disabled) return + // 开始触摸时移除动画类 + instance.requestAnimationFrame(function() { + instance.removeClass('ani'); + ownerInstance.callMethod('closeSwipe'); + }) + + // 记录上次的位置 + state.x = state.left || 0 + // 计算滑动开始位置 + this.stopTouchStart(e, ownerInstance, self) + }, + + /** + * 开始滑动操作 + * @param {Object} e + * @param {Object} ownerInstance + */ + touchmove(e, ownerInstance, self) { + let instance = e.instance; + // 删除之后已经那不到实例了 + if (!instance) return; + let disabled = instance.getDataset().disabled + let state = self.state + // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复 + disabled = this.getDisabledType(disabled) + if (disabled) return + // 是否可以滑动页面 + this.stopTouchMove(e, self); + if (state.direction !== 'horizontal') { + return; + } + if (e.preventDefault) { + // 阻止页面滚动 + e.preventDefault() + } + let x = state.x + state.deltaX + this.move(x, instance, ownerInstance, self) + }, + + /** + * 结束触摸操作 + * @param {Object} e + * @param {Object} ownerInstance + */ + touchend(e, ownerInstance, self) { + let instance = e.instance; + let disabled = instance.getDataset().disabled + let state = self.state + // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复 + disabled = this.getDisabledType(disabled) + + if (disabled) return + // 滑动过程中触摸结束,通过阙值判断是开启还是关闭 + // fixed by mehaotian 定时器解决点击按钮,touchend 触发比 click 事件时机早的问题 ,主要是 ios13 + this.moveDirection(state.left, instance, ownerInstance, self) + + }, + + /** + * 设置移动距离 + * @param {Object} value + * @param {Object} instance + * @param {Object} ownerInstance + */ + move(value, instance, ownerInstance, self) { + value = value || 0 + let state = self.state + let leftWidth = state.leftWidth + let rightWidth = state.rightWidth + // 获取可滑动范围 + state.left = this.range(value, -rightWidth, leftWidth); + instance.requestAnimationFrame(function() { + instance.setStyle({ + transform: 'translateX(' + state.left + 'px)', + '-webkit-transform': 'translateX(' + state.left + 'px)' + }) + }) + + }, + + /** + * 获取元素信息 + * @param {Object} instance + * @param {Object} ownerInstance + */ + getDom(instance, ownerInstance, self) { + var state = self.state + var $el = ownerInstance.$el || ownerInstance.$vm && ownerInstance.$vm.$el + var leftDom = $el.querySelector('.button-group--left') + var rightDom = $el.querySelector('.button-group--right') + + state.leftWidth = leftDom.offsetWidth || 0 + state.rightWidth = rightDom.offsetWidth || 0 + state.threshold = instance.getDataset().threshold + }, + + getDisabledType(value) { + return (typeof(value) === 'string' ? JSON.parse(value) : value) || false; + }, + + /** + * 获取范围 + * @param {Object} num + * @param {Object} min + * @param {Object} max + */ + range(num, min, max) { + return Math.min(Math.max(num, min), max); + }, + + + /** + * 移动方向判断 + * @param {Object} left + * @param {Object} value + * @param {Object} ownerInstance + * @param {Object} ins + */ + moveDirection(left, ins, ownerInstance, self) { + var state = self.state + var threshold = state.threshold + var position = state.position + var isopen = state.isopen || 'none' + var leftWidth = state.leftWidth + var rightWidth = state.rightWidth + if (state.deltaX === 0) { + this.openState('none', ins, ownerInstance, self) + return + } + if ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth > 0 && + rightWidth + + left < threshold)) { + // right + this.openState('right', ins, ownerInstance, self) + } else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth > 0 && + leftWidth - left < threshold)) { + // left + this.openState('left', ins, ownerInstance, self) + } else { + // default + this.openState('none', ins, ownerInstance, self) + } + }, + + + /** + * 开启状态 + * @param {Boolean} type + * @param {Object} ins + * @param {Object} ownerInstance + */ + openState(type, ins, ownerInstance, self) { + let state = self.state + let leftWidth = state.leftWidth + let rightWidth = state.rightWidth + let left = '' + state.isopen = state.isopen ? state.isopen : 'none' + switch (type) { + case "left": + left = leftWidth + break + case "right": + left = -rightWidth + break + default: + left = 0 + } + + // && !state.throttle + + if (state.isopen !== type) { + state.throttle = true + ownerInstance.callMethod('change', { + open: type + }) + + } + + state.isopen = type + // 添加动画类 + ins.requestAnimationFrame(() => { + ins.addClass('ani'); + this.move(left, ins, ownerInstance, self) + }) + }, + + + getDirection(x, y) { + if (x > y && x > MIN_DISTANCE) { + return 'horizontal'; + } + if (y > x && y > MIN_DISTANCE) { + return 'vertical'; + } + return ''; + }, + + /** + * 重置滑动状态 + * @param {Object} event + */ + resetTouchStatus(instance, self) { + let state = self.state; + state.direction = ''; + state.deltaX = 0; + state.deltaY = 0; + state.offsetX = 0; + state.offsetY = 0; + }, + + /** + * 设置滑动开始位置 + * @param {Object} event + */ + stopTouchStart(event, ownerInstance, self) { + let instance = event.instance; + let state = self.state + this.resetTouchStatus(instance, self); + var touch = event.touches[0]; + state.startX = touch.clientX; + state.startY = touch.clientY; + }, + + /** + * 滑动中,是否禁止打开 + * @param {Object} event + */ + stopTouchMove(event, self) { + let instance = event.instance; + let state = self.state; + let touch = event.touches[0]; + + state.deltaX = touch.clientX - state.startX; + state.deltaY = touch.clientY - state.startY; + state.offsetY = Math.abs(state.deltaY); + state.offsetX = Math.abs(state.deltaX); + state.direction = state.direction || this.getDirection(state.offsetX, state.offsetY); + } +} diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue new file mode 100644 index 0000000..7538671 --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue @@ -0,0 +1,348 @@ + + + + + + diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs new file mode 100644 index 0000000..b394244 --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs @@ -0,0 +1,341 @@ +var MIN_DISTANCE = 10; + +/** + * 判断当前是否为H5、app-vue + */ +var IS_HTML5 = false +if (typeof window === 'object') IS_HTML5 = true + +/** + * 监听页面内值的变化,主要用于动态开关swipe-action + * @param {Object} newValue + * @param {Object} oldValue + * @param {Object} ownerInstance + * @param {Object} instance + */ +function showWatch(newVal, oldVal, ownerInstance, instance) { + var state = instance.getState() + getDom(instance, ownerInstance) + if (newVal && newVal !== 'none') { + openState(newVal, instance, ownerInstance) + return + } + + if (state.left) { + openState('none', instance, ownerInstance) + } + resetTouchStatus(instance) +} + +/** + * 开始触摸操作 + * @param {Object} e + * @param {Object} ins + */ +function touchstart(e, ownerInstance) { + var instance = e.instance; + var disabled = instance.getDataset().disabled + var state = instance.getState(); + getDom(instance, ownerInstance) + // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复 + disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false; + if (disabled) return + // 开始触摸时移除动画类 + instance.requestAnimationFrame(function() { + instance.removeClass('ani'); + ownerInstance.callMethod('closeSwipe'); + }) + + // 记录上次的位置 + state.x = state.left || 0 + // 计算滑动开始位置 + stopTouchStart(e, ownerInstance) +} + +/** + * 开始滑动操作 + * @param {Object} e + * @param {Object} ownerInstance + */ +function touchmove(e, ownerInstance) { + var instance = e.instance; + var disabled = instance.getDataset().disabled + var state = instance.getState() + // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复 + disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false; + if (disabled) return + // 是否可以滑动页面 + stopTouchMove(e); + if (state.direction !== 'horizontal') { + return; + } + + if (e.preventDefault) { + // 阻止页面滚动 + e.preventDefault() + } + + move(state.x + state.deltaX, instance, ownerInstance) +} + +/** + * 结束触摸操作 + * @param {Object} e + * @param {Object} ownerInstance + */ +function touchend(e, ownerInstance) { + var instance = e.instance; + var disabled = instance.getDataset().disabled + var state = instance.getState() + // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复 + disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false; + + if (disabled) return + // 滑动过程中触摸结束,通过阙值判断是开启还是关闭 + // fixed by mehaotian 定时器解决点击按钮,touchend 触发比 click 事件时机早的问题 ,主要是 ios13 + moveDirection(state.left, instance, ownerInstance) + +} + +/** + * 设置移动距离 + * @param {Object} value + * @param {Object} instance + * @param {Object} ownerInstance + */ +function move(value, instance, ownerInstance) { + value = value || 0 + var state = instance.getState() + var leftWidth = state.leftWidth + var rightWidth = state.rightWidth + // 获取可滑动范围 + state.left = range(value, -rightWidth, leftWidth); + instance.requestAnimationFrame(function() { + instance.setStyle({ + transform: 'translateX(' + state.left + 'px)', + '-webkit-transform': 'translateX(' + state.left + 'px)' + }) + }) + +} + +/** + * 获取元素信息 + * @param {Object} instance + * @param {Object} ownerInstance + */ +function getDom(instance, ownerInstance) { + var state = instance.getState() + var leftDom = ownerInstance.selectComponent('.button-group--left') + var rightDom = ownerInstance.selectComponent('.button-group--right') + var leftStyles = { + width: 0 + } + var rightStyles = { + width: 0 + } + leftStyles = leftDom.getBoundingClientRect() + rightStyles = rightDom.getBoundingClientRect() + + state.leftWidth = leftStyles.width || 0 + state.rightWidth = rightStyles.width || 0 + state.threshold = instance.getDataset().threshold +} + +/** + * 获取范围 + * @param {Object} num + * @param {Object} min + * @param {Object} max + */ +function range(num, min, max) { + return Math.min(Math.max(num, min), max); +} + + +/** + * 移动方向判断 + * @param {Object} left + * @param {Object} value + * @param {Object} ownerInstance + * @param {Object} ins + */ +function moveDirection(left, ins, ownerInstance) { + var state = ins.getState() + var threshold = state.threshold + var position = state.position + var isopen = state.isopen || 'none' + var leftWidth = state.leftWidth + var rightWidth = state.rightWidth + if (state.deltaX === 0) { + openState('none', ins, ownerInstance) + return + } + if ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth > 0 && + rightWidth + + left < threshold)) { + // right + openState('right', ins, ownerInstance) + } else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth > 0 && + leftWidth - left < threshold)) { + // left + openState('left', ins, ownerInstance) + } else { + // default + openState('none', ins, ownerInstance) + } +} + + +/** + * 开启状态 + * @param {Boolean} type + * @param {Object} ins + * @param {Object} ownerInstance + */ +function openState(type, ins, ownerInstance) { + var state = ins.getState() + var leftWidth = state.leftWidth + var rightWidth = state.rightWidth + var left = '' + state.isopen = state.isopen ? state.isopen : 'none' + switch (type) { + case "left": + left = leftWidth + break + case "right": + left = -rightWidth + break + default: + left = 0 + } + + // && !state.throttle + + if (state.isopen !== type) { + state.throttle = true + ownerInstance.callMethod('change', { + open: type + }) + + } + + state.isopen = type + // 添加动画类 + ins.requestAnimationFrame(function() { + ins.addClass('ani'); + move(left, ins, ownerInstance) + }) + // 设置最终移动位置,理论上只要进入到这个函数,肯定是要打开的 +} + + +function getDirection(x, y) { + if (x > y && x > MIN_DISTANCE) { + return 'horizontal'; + } + if (y > x && y > MIN_DISTANCE) { + return 'vertical'; + } + return ''; +} + +/** + * 重置滑动状态 + * @param {Object} event + */ +function resetTouchStatus(instance) { + var state = instance.getState(); + state.direction = ''; + state.deltaX = 0; + state.deltaY = 0; + state.offsetX = 0; + state.offsetY = 0; +} + +/** + * 设置滑动开始位置 + * @param {Object} event + */ +function stopTouchStart(event) { + var instance = event.instance; + var state = instance.getState(); + resetTouchStatus(instance); + var touch = event.touches[0]; + if (IS_HTML5 && isPC()) { + touch = event; + } + state.startX = touch.clientX; + state.startY = touch.clientY; +} + +/** + * 滑动中,是否禁止打开 + * @param {Object} event + */ +function stopTouchMove(event) { + var instance = event.instance; + var state = instance.getState(); + var touch = event.touches[0]; + if (IS_HTML5 && isPC()) { + touch = event; + } + state.deltaX = touch.clientX - state.startX; + state.deltaY = touch.clientY - state.startY; + state.offsetY = Math.abs(state.deltaY); + state.offsetX = Math.abs(state.deltaX); + state.direction = state.direction || getDirection(state.offsetX, state.offsetY); +} + +function isPC() { + var userAgentInfo = navigator.userAgent; + var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; + var flag = true; + for (var v = 0; v < Agents.length - 1; v++) { + if (userAgentInfo.indexOf(Agents[v]) > 0) { + flag = false; + break; + } + } + return flag; +} + +var movable = false + +function mousedown(e, ins) { + if (!IS_HTML5) return + if (!isPC()) return + touchstart(e, ins) + movable = true +} + +function mousemove(e, ins) { + if (!IS_HTML5) return + if (!isPC()) return + if (!movable) return + touchmove(e, ins) +} + +function mouseup(e, ins) { + if (!IS_HTML5) return + if (!isPC()) return + touchend(e, ins) + movable = false +} + +function mouseleave(e, ins) { + if (!IS_HTML5) return + if (!isPC()) return + movable = false +} + +module.exports = { + showWatch: showWatch, + touchstart: touchstart, + touchmove: touchmove, + touchend: touchend, + mousedown: mousedown, + mousemove: mousemove, + mouseup: mouseup, + mouseleave: mouseleave +} diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue b/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue new file mode 100644 index 0000000..4971782 --- /dev/null +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/uni_modules/uni-swipe-action/package.json b/uni_modules/uni-swipe-action/package.json new file mode 100644 index 0000000..fc5dd8a --- /dev/null +++ b/uni_modules/uni-swipe-action/package.json @@ -0,0 +1,84 @@ +{ + "id": "uni-swipe-action", + "displayName": "uni-swipe-action 滑动操作", + "version": "1.3.10", + "description": "SwipeAction 滑动操作操作组件", + "keywords": [ + "", + "uni-ui", + "uniui", + "滑动删除", + "侧滑删除" + ], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-swipe-action/readme.md b/uni_modules/uni-swipe-action/readme.md new file mode 100644 index 0000000..93a5cac --- /dev/null +++ b/uni_modules/uni-swipe-action/readme.md @@ -0,0 +1,11 @@ + + +## SwipeAction 滑动操作 +> **组件名:uni-swipe-action** +> 代码块: `uSwipeAction`、`uSwipeActionItem` + + +通过滑动触发选项的容器 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-swipe-action) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-swiper-dot/changelog.md b/uni_modules/uni-swiper-dot/changelog.md new file mode 100644 index 0000000..85cf54d --- /dev/null +++ b/uni_modules/uni-swiper-dot/changelog.md @@ -0,0 +1,12 @@ +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-swiper-dot](https://uniapp.dcloud.io/component/uniui/uni-swiper-dot) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.6(2021-05-12) +- 新增 示例地址 +- 修复 示例项目缺少组件的Bug +## 1.0.5(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 clickItem 事件,支持指示点控制轮播 +- 新增 支持 pc 可用 diff --git a/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue b/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue new file mode 100644 index 0000000..e66b6c7 --- /dev/null +++ b/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue @@ -0,0 +1,218 @@ + + + + + diff --git a/uni_modules/uni-swiper-dot/package.json b/uni_modules/uni-swiper-dot/package.json new file mode 100644 index 0000000..f2dd8d2 --- /dev/null +++ b/uni_modules/uni-swiper-dot/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-swiper-dot", + "displayName": "uni-swiper-dot 轮播图指示点", + "version": "1.2.0", + "description": "自定义轮播图指示点组件", + "keywords": [ + "uni-ui", + "uniui", + "轮播图指示点", + "dot", + "swiper" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-swiper-dot/readme.md b/uni_modules/uni-swiper-dot/readme.md new file mode 100644 index 0000000..7d397e2 --- /dev/null +++ b/uni_modules/uni-swiper-dot/readme.md @@ -0,0 +1,11 @@ + + +## SwiperDot 轮播图指示点 +> **组件名:uni-swiper-dot** +> 代码块: `uSwiperDot` + + +自定义轮播图指示点 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-swiper-dot) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-table/changelog.md b/uni_modules/uni-table/changelog.md new file mode 100644 index 0000000..842211c --- /dev/null +++ b/uni_modules/uni-table/changelog.md @@ -0,0 +1,29 @@ +## 1.2.4(2023-12-19) +- 修复 uni-tr只有一列时minWidth计算错误,列变化实时计算更新 +## 1.2.3(2023-03-28) +- 修复 在vue3模式下可能会出现错误的问题 +## 1.2.2(2022-11-29) +- 优化 主题样式 +## 1.2.1(2022-06-06) +- 修复 微信小程序存在无使用组件的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-table](https://uniapp.dcloud.io/component/uniui/uni-table) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-07-08) +- 新增 uni-th 支持 date 日期筛选范围 +## 1.0.6(2021-07-05) +- 新增 uni-th 支持 range 筛选范围 +## 1.0.5(2021-06-28) +- 新增 uni-th 筛选功能 +## 1.0.4(2021-05-12) +- 新增 示例地址 +- 修复 示例项目缺少组件的Bug +## 1.0.3(2021-04-16) +- 新增 sortable 属性,是否开启单列排序 +- 优化 表格多选逻辑 +## 1.0.2(2021-03-22) +- uni-tr 添加 disabled 属性,用于 type=selection 时,设置某行是否可由全选按钮控制 +## 1.0.1(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-table/components/uni-table/uni-table.vue b/uni_modules/uni-table/components/uni-table/uni-table.vue new file mode 100644 index 0000000..21d9527 --- /dev/null +++ b/uni_modules/uni-table/components/uni-table/uni-table.vue @@ -0,0 +1,455 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue b/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue new file mode 100644 index 0000000..fbe1bdc --- /dev/null +++ b/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-td/uni-td.vue b/uni_modules/uni-table/components/uni-td/uni-td.vue new file mode 100644 index 0000000..9ce93e9 --- /dev/null +++ b/uni_modules/uni-table/components/uni-td/uni-td.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-th/filter-dropdown.vue b/uni_modules/uni-table/components/uni-th/filter-dropdown.vue new file mode 100644 index 0000000..df22a71 --- /dev/null +++ b/uni_modules/uni-table/components/uni-th/filter-dropdown.vue @@ -0,0 +1,511 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-th/uni-th.vue b/uni_modules/uni-table/components/uni-th/uni-th.vue new file mode 100644 index 0000000..14889dd --- /dev/null +++ b/uni_modules/uni-table/components/uni-th/uni-th.vue @@ -0,0 +1,285 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-thead/uni-thead.vue b/uni_modules/uni-table/components/uni-thead/uni-thead.vue new file mode 100644 index 0000000..53b5c4c --- /dev/null +++ b/uni_modules/uni-table/components/uni-thead/uni-thead.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-tr/table-checkbox.vue b/uni_modules/uni-table/components/uni-tr/table-checkbox.vue new file mode 100644 index 0000000..1089187 --- /dev/null +++ b/uni_modules/uni-table/components/uni-tr/table-checkbox.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-tr/uni-tr.vue b/uni_modules/uni-table/components/uni-tr/uni-tr.vue new file mode 100644 index 0000000..3fb76f4 --- /dev/null +++ b/uni_modules/uni-table/components/uni-tr/uni-tr.vue @@ -0,0 +1,184 @@ + + + + + diff --git a/uni_modules/uni-table/i18n/en.json b/uni_modules/uni-table/i18n/en.json new file mode 100644 index 0000000..e32023c --- /dev/null +++ b/uni_modules/uni-table/i18n/en.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "Reset", + "filter-dropdown.search": "Search", + "filter-dropdown.submit": "Submit", + "filter-dropdown.filter": "Filter", + "filter-dropdown.gt": "Greater or equal to", + "filter-dropdown.lt": "Less than or equal to", + "filter-dropdown.date": "Date" +} diff --git a/uni_modules/uni-table/i18n/es.json b/uni_modules/uni-table/i18n/es.json new file mode 100644 index 0000000..9afd04b --- /dev/null +++ b/uni_modules/uni-table/i18n/es.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "Reiniciar", + "filter-dropdown.search": "Búsqueda", + "filter-dropdown.submit": "Entregar", + "filter-dropdown.filter": "Filtrar", + "filter-dropdown.gt": "Mayor o igual a", + "filter-dropdown.lt": "Menos que o igual a", + "filter-dropdown.date": "Fecha" +} diff --git a/uni_modules/uni-table/i18n/fr.json b/uni_modules/uni-table/i18n/fr.json new file mode 100644 index 0000000..b006237 --- /dev/null +++ b/uni_modules/uni-table/i18n/fr.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "Réinitialiser", + "filter-dropdown.search": "Chercher", + "filter-dropdown.submit": "Soumettre", + "filter-dropdown.filter": "Filtre", + "filter-dropdown.gt": "Supérieur ou égal à", + "filter-dropdown.lt": "Inférieur ou égal à", + "filter-dropdown.date": "Date" +} diff --git a/uni_modules/uni-table/i18n/index.js b/uni_modules/uni-table/i18n/index.js new file mode 100644 index 0000000..2469dd0 --- /dev/null +++ b/uni_modules/uni-table/i18n/index.js @@ -0,0 +1,12 @@ +import en from './en.json' +import es from './es.json' +import fr from './fr.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + es, + fr, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-table/i18n/zh-Hans.json b/uni_modules/uni-table/i18n/zh-Hans.json new file mode 100644 index 0000000..862af17 --- /dev/null +++ b/uni_modules/uni-table/i18n/zh-Hans.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "重置", + "filter-dropdown.search": "搜索", + "filter-dropdown.submit": "确定", + "filter-dropdown.filter": "筛选", + "filter-dropdown.gt": "大于等于", + "filter-dropdown.lt": "小于等于", + "filter-dropdown.date": "日期范围" +} diff --git a/uni_modules/uni-table/i18n/zh-Hant.json b/uni_modules/uni-table/i18n/zh-Hant.json new file mode 100644 index 0000000..64f8061 --- /dev/null +++ b/uni_modules/uni-table/i18n/zh-Hant.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "重置", + "filter-dropdown.search": "搜索", + "filter-dropdown.submit": "確定", + "filter-dropdown.filter": "篩選", + "filter-dropdown.gt": "大於等於", + "filter-dropdown.lt": "小於等於", + "filter-dropdown.date": "日期範圍" +} diff --git a/uni_modules/uni-table/package.json b/uni_modules/uni-table/package.json new file mode 100644 index 0000000..a52821b --- /dev/null +++ b/uni_modules/uni-table/package.json @@ -0,0 +1,83 @@ +{ + "id": "uni-table", + "displayName": "uni-table 表格", + "version": "1.2.4", + "description": "表格组件,多用于展示多条结构类似的数据,如", + "keywords": [ + "uni-ui", + "uniui", + "table", + "表格" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss","uni-datetime-picker"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "n", + "QQ": "y" + }, + "快应用": { + "华为": "n", + "联盟": "n" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-table/readme.md b/uni_modules/uni-table/readme.md new file mode 100644 index 0000000..bb08c79 --- /dev/null +++ b/uni_modules/uni-table/readme.md @@ -0,0 +1,13 @@ + + +## Table 表单 +> 组件名:``uni-table``,代码块: `uTable`。 + +用于展示多条结构类似的数据 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-table) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + + + diff --git a/uni_modules/uni-tag/changelog.md b/uni_modules/uni-tag/changelog.md new file mode 100644 index 0000000..ddee87a --- /dev/null +++ b/uni_modules/uni-tag/changelog.md @@ -0,0 +1,23 @@ +## 2.1.1(2024-03-20) +- 优化 app下边框过窄导致不显示的bug +## 2.1.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-tag](https://uniapp.dcloud.io/component/uniui/uni-tag) +## 2.0.0(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +- 移除 插槽 +- 移除 type 属性的 royal 选项 +## 1.1.1(2021-08-11) +- type 不是 default 时,size 为 small 字体大小显示不正确 +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-06-18) +- 修复 uni-tag 在字节跳动小程序上 css 类名编译错误的 bug +## 1.0.6(2021-06-04) +- 修复 未定义 sass 变量 "$uni-color-royal" 的bug +## 1.0.5(2021-05-10) +- 修复 royal 类型无效的bug +- 修复 uni-tag 宽度不自适应的bug +- 新增 uni-tag 支持属性 custom-style 自定义样式 +## 1.0.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-tag/components/uni-tag/uni-tag.vue b/uni_modules/uni-tag/components/uni-tag/uni-tag.vue new file mode 100644 index 0000000..7274436 --- /dev/null +++ b/uni_modules/uni-tag/components/uni-tag/uni-tag.vue @@ -0,0 +1,252 @@ + + + + + diff --git a/uni_modules/uni-tag/package.json b/uni_modules/uni-tag/package.json new file mode 100644 index 0000000..71b41eb --- /dev/null +++ b/uni_modules/uni-tag/package.json @@ -0,0 +1,84 @@ +{ + "id": "uni-tag", + "displayName": "uni-tag 标签", + "version": "2.1.1", + "description": "Tag 组件,用于展示1个或多个文字标签,可点击切换选中、不选中的状态。", + "keywords": [ + "uni-ui", + "uniui", + "", + "tag", + "标签" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-tag/readme.md b/uni_modules/uni-tag/readme.md new file mode 100644 index 0000000..6e78ff5 --- /dev/null +++ b/uni_modules/uni-tag/readme.md @@ -0,0 +1,13 @@ + + +## Tag 标签 +> **组件名:uni-tag** +> 代码块: `uTag` + + +用于展示1个或多个文字标签,可点击切换选中、不选中的状态 。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-tag) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-test/changelog.md b/uni_modules/uni-test/changelog.md new file mode 100644 index 0000000..2f3b102 --- /dev/null +++ b/uni_modules/uni-test/changelog.md @@ -0,0 +1,39 @@ +## 2.0.13(2021-11-18) +邱 +## 2.0.12(2021-11-18) +123123 +## 2.0.11(2021-11-18) +0000 +## 2.0.10(2021-11-18) +111234 +## 2.0.9(2021-11-18) +3333 +## 2.0.8(2021-11-18) +=== +## 2.0.7(2021-11-18) +111 +## 2.0.6(2021-05-26) +- test +## 0.0.37(2021-03-23) +- uni-forms 更新 校验器 +- uni-forms 修复 表单规则设置类型为 number 的情况下,值为0校验失败的Bug + + +## 0.0.36(2021-03-23) +- uni-forms 更新 校验器 +- uni-forms 修复 表单规则设置类型为 number 的情况下,值为0校验失败的Bug + + +## 0.0.35(2021-03-23) +- uni-forms 更新 校验器 +- uni-forms 修复 表单规则设置类型为 number 的情况下,值为0校验失败的Bug + + +## 0.0.34(2021-03-23) +- 测试新同步插件 +## 0.0.33(2021-03-09) +- test +## 0.0.32(2021-02-24) +- 更新 read 2 +## 0.0.31(2021-02-24) +- 同步 readme.md diff --git a/uni_modules/uni-test/components/uni-test/uni-test.vue b/uni_modules/uni-test/components/uni-test/uni-test.vue new file mode 100644 index 0000000..9ea8aaf --- /dev/null +++ b/uni_modules/uni-test/components/uni-test/uni-test.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/uni_modules/uni-test/package.json b/uni_modules/uni-test/package.json new file mode 100644 index 0000000..9a3c4c4 --- /dev/null +++ b/uni_modules/uni-test/package.json @@ -0,0 +1,83 @@ +{ + "id": "uni-test", + "displayName": "Test 测试插件", + "version": "2.0.13", + "description": "测试插件 ", + "keywords": [ + "test" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.3" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-test/readme.md b/uni_modules/uni-test/readme.md new file mode 100644 index 0000000..ddb24c6 --- /dev/null +++ b/uni_modules/uni-test/readme.md @@ -0,0 +1,10 @@ + + +## DataCheckbox 数据驱动的单选复选框 +> **组件名:uni-data-checkbox** +> 代码块: `uDataCheckbox` + + +本组件是基于uni-app基础组件checkbox的封装。本组件要解决问题包括: + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-card) \ No newline at end of file diff --git a/uni_modules/uni-title/changelog.md b/uni_modules/uni-title/changelog.md new file mode 100644 index 0000000..7626216 --- /dev/null +++ b/uni_modules/uni-title/changelog.md @@ -0,0 +1,10 @@ +## 1.1.1(2022-05-19) +- 修改组件描述 +## 1.1.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-title](https://uniapp.dcloud.io/component/uniui/uni-title) +## 1.0.2(2021-05-12) +- 新增 示例地址 +- 修复 示例项目缺少组件的Bug +## 1.0.1(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-title/components/uni-title/uni-title.vue b/uni_modules/uni-title/components/uni-title/uni-title.vue new file mode 100644 index 0000000..bf4f926 --- /dev/null +++ b/uni_modules/uni-title/components/uni-title/uni-title.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/uni_modules/uni-title/package.json b/uni_modules/uni-title/package.json new file mode 100644 index 0000000..2249f5a --- /dev/null +++ b/uni_modules/uni-title/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-title", + "displayName": "uni-title 章节标题", + "version": "1.1.1", + "description": "章节标题,通常用于记录页面标题,使用当前组件,uni-app 如果开启统计,将会自动统计页面标题", + "keywords": [ + "uni-ui", + "uniui", + "标题", + "章节", + "章节标题", + "" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-title/readme.md b/uni_modules/uni-title/readme.md new file mode 100644 index 0000000..0e60b1b --- /dev/null +++ b/uni_modules/uni-title/readme.md @@ -0,0 +1,14 @@ + + +## Title 标题 +> **组件名:uni-title** +> 代码块: `uTitle` + + +章节标题,通常用于记录页面标题,使用当前组件,uni-app 如果开启统计,将会自动统计页面标题 。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-title) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + + diff --git a/uni_modules/uni-tooltip/changelog.md b/uni_modules/uni-tooltip/changelog.md new file mode 100644 index 0000000..285b676 --- /dev/null +++ b/uni_modules/uni-tooltip/changelog.md @@ -0,0 +1,16 @@ +## 0.2.4(2024-04-23) +- 修复 弹出位置默认值不一致导致的错位 +## 0.2.3(2024-03-20) +- 修复 弹出位置修正 +## 0.2.2(2024-01-15) +- 新增 placement支持设置四个方向:top bottom left right +## 0.2.1(2022-05-09) +- 修复 content 为空时仍然弹出的bug +## 0.2.0(2022-05-07) +**注意:破坏性更新** +- 更新 text 属性变更为 content +- 更新 移除 width 属性 +## 0.1.1(2022-04-27) +- 修复 组件根 text 嵌套组件 warning +## 0.1.0(2022-04-21) +- 初始化 diff --git a/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue b/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue new file mode 100644 index 0000000..cda3754 --- /dev/null +++ b/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue @@ -0,0 +1,109 @@ + + + + + + diff --git a/uni_modules/uni-tooltip/package.json b/uni_modules/uni-tooltip/package.json new file mode 100644 index 0000000..44158e1 --- /dev/null +++ b/uni_modules/uni-tooltip/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-tooltip", + "displayName": "uni-tooltip 提示文字", + "version": "0.2.4", + "description": "Tooltip 提示文字", + "keywords": [ + "uni-tooltip", + "uni-ui", + "tooltip", + "tip", + "文字提示" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无 ", + "data": "无", + "permissions": "无" + }, + "npmurl": "", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-tooltip/readme.md b/uni_modules/uni-tooltip/readme.md new file mode 100644 index 0000000..faafa2e --- /dev/null +++ b/uni_modules/uni-tooltip/readme.md @@ -0,0 +1,8 @@ +## Badge 数字角标 +> **组件名:uni-tooltip** +> 代码块: `uTooltip` + +数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-tooltip) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-transition/changelog.md b/uni_modules/uni-transition/changelog.md new file mode 100644 index 0000000..faaf336 --- /dev/null +++ b/uni_modules/uni-transition/changelog.md @@ -0,0 +1,24 @@ +## 1.3.3(2024-04-23) +- 修复 当元素会受变量影响自动隐藏的bug +## 1.3.2(2023-05-04) +- 修复 NVUE 平台报错的问题 +## 1.3.1(2021-11-23) +- 修复 init 方法初始化问题 +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-transition](https://uniapp.dcloud.io/component/uniui/uni-transition) +## 1.2.1(2021-09-27) +- 修复 init 方法不生效的 Bug +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.1(2021-05-12) +- 新增 示例地址 +- 修复 示例项目缺少组件的 Bug +## 1.1.0(2021-04-22) +- 新增 通过方法自定义动画 +- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式 +- 优化 动画触发逻辑,使动画更流畅 +- 优化 支持单独的动画类型 +- 优化 文档示例 +## 1.0.2(2021-02-05) +- 调整为 uni_modules 目录规范 diff --git a/uni_modules/uni-transition/components/uni-transition/createAnimation.js b/uni_modules/uni-transition/components/uni-transition/createAnimation.js new file mode 100644 index 0000000..8f89b18 --- /dev/null +++ b/uni_modules/uni-transition/components/uni-transition/createAnimation.js @@ -0,0 +1,131 @@ +// const defaultOption = { +// duration: 300, +// timingFunction: 'linear', +// delay: 0, +// transformOrigin: '50% 50% 0' +// } +// #ifdef APP-NVUE +const nvueAnimation = uni.requireNativePlugin('animation') +// #endif +class MPAnimation { + constructor(options, _this) { + this.options = options + // 在iOS10+QQ小程序平台下,传给原生的对象一定是个普通对象而不是Proxy对象,否则会报parameter should be Object instead of ProxyObject的错误 + this.animation = uni.createAnimation({ + ...options + }) + this.currentStepAnimates = {} + this.next = 0 + this.$ = _this + + } + + _nvuePushAnimates(type, args) { + let aniObj = this.currentStepAnimates[this.next] + let styles = {} + if (!aniObj) { + styles = { + styles: {}, + config: {} + } + } else { + styles = aniObj + } + if (animateTypes1.includes(type)) { + if (!styles.styles.transform) { + styles.styles.transform = '' + } + let unit = '' + if(type === 'rotate'){ + unit = 'deg' + } + styles.styles.transform += `${type}(${args+unit}) ` + } else { + styles.styles[type] = `${args}` + } + this.currentStepAnimates[this.next] = styles + } + _animateRun(styles = {}, config = {}) { + let ref = this.$.$refs['ani'].ref + if (!ref) return + return new Promise((resolve, reject) => { + nvueAnimation.transition(ref, { + styles, + ...config + }, res => { + resolve() + }) + }) + } + + _nvueNextAnimate(animates, step = 0, fn) { + let obj = animates[step] + if (obj) { + let { + styles, + config + } = obj + this._animateRun(styles, config).then(() => { + step += 1 + this._nvueNextAnimate(animates, step, fn) + }) + } else { + this.currentStepAnimates = {} + typeof fn === 'function' && fn() + this.isEnd = true + } + } + + step(config = {}) { + // #ifndef APP-NVUE + this.animation.step(config) + // #endif + // #ifdef APP-NVUE + this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config) + this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin + this.next++ + // #endif + return this + } + + run(fn) { + // #ifndef APP-NVUE + this.$.animationData = this.animation.export() + this.$.timer = setTimeout(() => { + typeof fn === 'function' && fn() + }, this.$.durationTime) + // #endif + // #ifdef APP-NVUE + this.isEnd = false + let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref + if(!ref) return + this._nvueNextAnimate(this.currentStepAnimates, 0, fn) + this.next = 0 + // #endif + } +} + + +const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d', + 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY', + 'translateZ' +] +const animateTypes2 = ['opacity', 'backgroundColor'] +const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom'] +animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => { + MPAnimation.prototype[type] = function(...args) { + // #ifndef APP-NVUE + this.animation[type](...args) + // #endif + // #ifdef APP-NVUE + this._nvuePushAnimates(type, args) + // #endif + return this + } +}) + +export function createAnimation(option, _this) { + if(!_this) return + clearTimeout(_this.timer) + return new MPAnimation(option, _this) +} diff --git a/uni_modules/uni-transition/components/uni-transition/uni-transition.vue b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue new file mode 100644 index 0000000..f3ddd1f --- /dev/null +++ b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue @@ -0,0 +1,286 @@ + + + + + diff --git a/uni_modules/uni-transition/package.json b/uni_modules/uni-transition/package.json new file mode 100644 index 0000000..d5c20e1 --- /dev/null +++ b/uni_modules/uni-transition/package.json @@ -0,0 +1,85 @@ +{ + "id": "uni-transition", + "displayName": "uni-transition 过渡动画", + "version": "1.3.3", + "description": "元素的简单过渡动画", + "keywords": [ + "uni-ui", + "uniui", + "动画", + "过渡", + "过渡动画" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-transition/readme.md b/uni_modules/uni-transition/readme.md new file mode 100644 index 0000000..2f8a77e --- /dev/null +++ b/uni_modules/uni-transition/readme.md @@ -0,0 +1,11 @@ + + +## Transition 过渡动画 +> **组件名:uni-transition** +> 代码块: `uTransition` + + +元素过渡动画 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-ui/changelog.md b/uni_modules/uni-ui/changelog.md new file mode 100644 index 0000000..6d477cf --- /dev/null +++ b/uni_modules/uni-ui/changelog.md @@ -0,0 +1,578 @@ +## 1.5.6(2024-07-08) +- uni-datetime-picker 新增 日期点击事件,在点击日期时会触发该事件。 +- uni-datetime-picker 修复 抖音小程序事件传递失效bug +- uni-easyinput 修复 easyinput组件双向绑定问题 +- uni-number-box 修复 在vue2下H5黑边的bug +- uni-number-box 修复 在vue2手动输入后失焦导致清空数值的严重bug +- uni-popup 修复 uni-popup-dialog vue3下使用value无法进行绑定的bug(双向绑定兼容旧写法) +- uni-search-bar 修复 textColor默认值导致的文字不显示的bug +- uni-search-bar 修复 textColor不生效的bug +- uni-segmented-control 修复 修复在微信小程序下inactiveColor失效bug +- uni-tooltip 修复 弹出位置默认值不一致导致的错位 +- uni-transition 修复 当元素会受变量影响自动隐藏的bug +## 1.5.0(2024-01-13) +- 修复 npm包结构目录错误的问题 +- uni-calendar 修复 回到今天时,月份显示不一致问题 +- uni-data-picker 新增 支持 uni-app-x +- uni-datetime-picker 优化 增加noChange事件,当进行日期范围选择时,若有空值,则触发该事件 [详情](https://github.com/dcloudio/uni-ui/issues/815) +- uni-datetime-picker 修复 字节小程序时间选择范围器失效问题 [详情](https://github.com/dcloudio/uni-ui/issues/834) +- uni-datetime-picker 修复 PC端初次修改时间,开始时间未更新的Bug [详情](https://github.com/dcloudio/uni-ui/issues/737) +- uni-datetime-picker 修复 部分情况修改时间,开始、结束时间显示异常的Bug [详情](https://ask.dcloud.net.cn/question/171146) +- uni-datetime-picker 优化 当前月可以选择上月、下月的日期的Bug +- uni-file-picker 新增 微信小程序不再调用chooseImage,而是调用chooseMedia +- uni-file-picker 新增 上传文件至云存储携带本地文件名称 +- uni-forms 优化 labelWidth 描述错误 +fix: 修复图标大小默认值错误的问题 +- uni-icons 修复 项目未使用 ts 情况下,打包报错的bug +- uni-icons 修复 size 属性为 string 时,不加单位导致尺寸异常的bug +- uni-icons 优化 兼容老版本icon类型,如 top ,bottom 等 +- uni-icons 优化 兼容老版本icon类型,如 top ,bottom 等 +- uni-icons 优化 uni-app x 下示例项目图标排序 +- uni-icons 修复 nvue下引入组件报错的bug +-优化 size 属性支持单位 +- uni-icons 新增 uni-app x 支持定义图标 +- uni-notice-bar 修复动态绑定title时,滚动速度不一致的问题 +更新示例工程 +- uni-popup 新增 uni-popup 支持uni-app-x 注意暂时仅支持 `maskClick` `@open` `@close` +- uni-table 修复 uni-tr只有一列时minWidth计算错误,列变化实时计算更新 +## 1.4.27(2023-04-21) +- uni-calendar 修复 某些情况 monthSwitch 未触发的Bug +- uni-calendar 修复 某些情况切换月份错误的Bug +- uni-data-picker 修复 更改 modelValue 报错的 bug +- uni-data-picker 修复 v-for 未使用 key 值控制台 warning +- uni-data-picker 修复代码合并时引发 value 属性为空时不渲染数据的问题 +- uni-data-picker 修复 localdata 不支持动态更新的bug +- uni-data-select 修复 微信小程序点击时会改变背景颜色的 bug +- uni-data-select 修复 禁用时会显示清空按钮 +- uni-data-select 优化 查询条件短期内多次变更只查询最后一次变更后的结果 +- uni-data-select 调整 内部缓存键名调整为 uni-data-select-lastSelectedValue +- uni-datetime-picker 修复 日历 picker 修改年月后,自动选中当月1日 [详情](https://ask.dcloud.net.cn/question/165937) +- uni-datetime-picker 修复 小程序端 低版本 ios NaN [详情](https://ask.dcloud.net.cn/question/162979) +- uni-datetime-picker 修复 firefox 浏览器显示区域点击无法拉起日历弹框的Bug [详情](https://ask.dcloud.net.cn/question/163362) +- uni-datetime-picker 优化 值为空依然选中当天问题 +- uni-datetime-picker 优化 提供 default-value 属性支持配置选择器打开时默认显示的时间 +- uni-datetime-picker 优化 非范围选择未选择日期时间,点击确认按钮选中当前日期时间 +- uni-datetime-picker 优化 字节小程序日期时间范围选择,底部日期换行问题 +- uni-datetime-picker 修复 2.2.18 引起范围选择配置 end 选择无效的Bug [详情](https://github.com/dcloudio/uni-ui/issues/686) +- uni-datetime-picker 修复 移动端范围选择change事件触发异常的Bug [详情](https://github.com/dcloudio/uni-ui/issues/684) +- uni-datetime-picker 优化 PC端输入日期格式错误时返回当前日期时间 +- uni-datetime-picker 优化 PC端输入日期时间超出 start、end 限制的Bug +- uni-datetime-picker 优化 移动端日期时间范围用法时间展示不完整问题 +- uni-datetime-picker 修复 小程序端绑定 Date 类型报错的Bug [详情](https://github.com/dcloudio/uni-ui/issues/679) +- uni-datetime-picker 修复 vue3 time-picker 无法显示绑定时分秒的Bug +- uni-datetime-picker 修复 字节小程序报错的Bug +- uni-datetime-picker 修复 某些情况切换月份错误的Bug +- uni-easyinput 修复 vue3 下 keyboardheightchange 事件报错的bug +- uni-easyinput 优化 trim 属性默认值 +- uni-easyinput 新增 cursor-spacing 属性 +- uni-fab 新增 pattern.icon 属性,可自定义图标 +- uni-file-picker 修复 手动上传删除一个文件后不能再上传的bug +- uni-forms 修复 required 参数无法动态绑定 +- uni-list 优化 uni-list-chat 具名插槽`header` 非app端套一层元素,方便使用时通过外层元素定位实现样式修改 +- uni-list uni-list-chat 新增 支持具名插槽`header` +- uni-list 新增 列表图标新增 customPrefix 属性 ,用法 [详见](https://uniapp.dcloud.net.cn/component/uniui/uni-icons.html#icons-props) +- uni-nav-bar 修复 自定义状态栏高度闪动BUG +- uni-nav-bar 修复 暗黑模式下边线颜色错误的bug +- uni-popup 修复 uni-popup 重复打开时的 bug +- uni-popup uni-popup-dialog 组件新增 inputType 属性 +- uni-swipe-action 修复`uni-swipe-action`和`uni-swipe-action-item`不同时使用导致 closeOther 方法报错的 bug +- uni-table 修复 在vue3模式下可能会出现错误的问题 +## 1.4.26(2023-01-31) +- uni-badge 修复 运行/打包 控制台警告问题 +- uni-calendar 修复 某些情况切换月份错误问题 +- uni-data-select 修复 不关联服务空间报错的问题 +- uni-data-select 新增 属性 `format` 可用于格式化显示选项内容 +- uni-datetime-picker 修复 某些情况切换月份错误问题 +- uni-easyinput 新增 keyboardheightchange 事件,可监听键盘高度变化 +- uni-list 修复 无反馈效果呈现的bug +## 1.4.25(2023-01-11) +- uni-file-picker 新增 sourceType 属性, 可以自定义图片和视频选择的来源 +## 1.4.24(2023-01-11) +- uni-data-select 修复 当where变化时,数据不会自动更新的问题 +- uni-datetime-picker 修复 多次加载组件造成内存占用的 bug +- uni-datetime-picker 修复 vue3 下 i18n 国际化初始值不正确的 bug +- uni-easyinput 修复 props 中背景颜色无默认值的bug +- uni-list 修复 uni-list-chat 在vue3下跳转报错的bug +- uni-list 修复 uni-list-chat avatar属性 值为本地路径时错误的问题 +- uni-list 修复 uni-list-chat avatar属性 在腾讯云版uniCloud下错误的问题 +- uni-list 修复 uni-list-chat note属性 支持:“草稿”字样功能 文本少1位的问题 +- uni-list 修复 uni-list-item 的 customStyle 属性 padding值在 H5端 无效的bug +- uni-list 修复 uni-list-item 的 customStyle 属性 padding值在nvue(vue2)下无效的bug +- uni-list uni-list-chat 新增 avatar 支持 fileId +- uni-list uni-list 新增属性 render-reverse 详情参考:[https://uniapp.dcloud.net.cn/component/list.html](https://uniapp.dcloud.net.cn/component/list.html) +- uni-list uni-list-chat note属性 支持:“草稿”字样 加红显示 详情参考uni-im:[https://ext.dcloud.net.cn/plugin?name=uni-im](https://ext.dcloud.net.cn/plugin?name=uni-im) +- uni-list uni-list-item 新增属性 customStyle 支持设置padding、backgroundColor +- uni-popup 修复 nvue 下 v-show 报错 +## 1.4.23(2022-10-25) +- uni-datetime-picker 修复,支付宝小程序样式错乱,[详情](https://github.com/dcloudio/uni-app/issues/3861) + +- uni-nav-bar 修复 条件编译错误的bug +- uni-nav-bar 修复 nvue 环境 fixed 为 true 的情况下,无法置顶的 bug +## 1.4.22(2022-09-19) +- 优化 部分组件适配 uni-scss 主题色 +- uni-badge 修复 当 text 超过 max-num 时,badge 的宽度计算是根据 text 的长度计算,更改为 css 计算实际展示宽度,详见:[https://ask.dcloud.net.cn/question/150473](https://ask.dcloud.net.cn/question/150473) +- uni-calendar 修复 表头年月切换,导致改变当前日期为选择月1号,且未触发change事件 +- uni-data-select 修复 微信小程序下拉框出现后选择会点击到蒙板后面的输入框 +- uni-data-select 修复 点击的位置不准确 +- uni-data-select 新增 支持 disabled 属性 +- uni-datetime-picker 修复,反向选择日期范围,日期显示异常,[详情](https://ask.dcloud.net.cn/question/153401?item_id=212892&rf=false) +- uni-datetime-picker 修复 close事件无效的 bug +- uni-datetime-picker 修复 移动端 maskClick 无效的 bug,详见:[https://ask.dcloud.net.cn/question/140824?item_id=209458&rf=false](https://ask.dcloud.net.cn/question/140824?item_id=209458&rf=false) +- uni-fab 修复 小程序端由于 style 使用了对象导致报错,[详情](https://ask.dcloud.net.cn/question/152790?item_id=211778&rf=false) +- uni-fab 修复 nvue 环境下,具有 tabBar 时,fab 组件下部位置无法正常获取 --window-bottom 的bug,详见:[https://ask.dcloud.net.cn/question/110638?notification_id=826310](https://ask.dcloud.net.cn/question/110638?notification_id=826310) +- uni-forms 优化 根据 rules 自动添加 required 的问题 +- uni-forms 修复 item 未设置 require 属性,rules 设置 require 后,星号也显示的 bug,详见:[https://ask.dcloud.net.cn/question/151540](https://ask.dcloud.net.cn/question/151540) +- uni-nav-bar 修复 nvue 环境下 fixed 为 true 的情况下,无法置顶的 bug +- uni-notice-bar 新增 属性 fontSize,可修改文字大小。 +- uni-pagination 修复,未对主题色设置默认色,导致未引入 uni-scss 变量文件报错。 +- uni-pagination 修复,未对移动端当前页文字做主题色适配。 +- uni-pagination 修复 es 语言 i18n 错误 +## 1.4.21(2022-09-19) +- 修复,安装时未导入 uni-data-select 和 uni-tooltip 的问题。 +## 1.4.20(2022-07-25) +- uni-section 新增组件 +- uni-forms 修复 model 需要校验的值没有声明对应字段时,导致第一次不触发校验的bug + +## 1.4.19(2022-07-07) +- uni-data-picker 优化 pc端图标位置不正确的问题 +- uni-data-select 修复 pc端宽度异常的bug +## 1.4.18(2022-07-06) +- uni-forms 【重要】组件逻辑重构,部分用法旧版本不兼容,请注意兼容问题 +- uni-forms 【重要】组件使用 Provide/Inject 方式注入依赖,提供了自定义表单组件调用 uni-forms 校验表单的能力 +- uni-forms 新增 更多表单示例 +- uni-forms 新增 model 属性,等同于原 value/modelValue 属性,旧属性即将废弃 +- uni-forms 新增 validateTrigger 属性的 blur 值,仅 uni-easyinput 生效 +- uni-forms 新增 onFieldChange 方法,可以对子表单进行校验,可替代binddata方法 +- uni-forms 新增 子表单的 setRules 方法,配合自定义校验函数使用 +- uni-forms 新增 uni-forms-item 的 setRules 方法,配置动态表单使用可动态更新校验规则 +- uni-forms 修复 由 1.4.0 引发的 label 插槽不生效的bug +- uni-forms 修复 子组件找不到 setValue 报错的bug +- uni-forms 修复 uni-data-picker 在 uni-forms-item 中报错的bug +- uni-forms 修复 uni-data-picker 在 uni-forms-item 中宽度不正确的bug +- uni-forms 修复 表单校验顺序无序问题 +- uni-forms 优化 子表单组件uni-datetime-picker、uni-data-select、uni-data-picker的显示样式 +- uni-forms 优化 动态表单校验方式,废弃拼接name的方式 +- uni-breadcrumb 修复 微信小程序 separator 不显示问题 +- uni-data-checkbox 优化 在 uni-forms 中的依赖注入方式 +- uni-data-picker 修复 uni-data-picker 在 uni-forms-item 中宽度不正确的bug +- uni-data-picker 优化 显示样式 +- uni-data-select 优化 显示样式 +- uni-datetime-picker 修复 日历顶部年月及底部确认未国际化 bug +- uni-datetime-picker 优化 组件样式,调整了组件图标大小、高度、颜色等,与uni-ui风格保持一致 +- uni-easyinput 新增 在 uni-forms 1.4.0 中使用可以在 blur 时校验内容 +- uni-easyinput 新增 clear 事件,点击右侧叉号图标触发 +- uni-easyinput 新增 change 事件 ,仅在输入框失去焦点或用户按下回车时触发 +- uni-easyinput 优化 组件样式,组件获取焦点时高亮显示,图标颜色调整等 +- uni-easyinput 优化 clearable 显示策略 +- uni-file-picker 修复 在uni-forms下样式不生效的bug +- uni-nav-bar 修复 组件示例中插槽用法无法显示内容的bug +- uni-swipe-action 修复 vue3 下使用组件不能正常运行的Bug +- uni-swipe-action 修复 h5端点击click触发两次的Bug +- uni-table 修复 微信小程序存在无使用组件的问题 +## 1.4.17(2022-06-30) +- 支持 ios 安全区 +## 1.4.16(2022-06-06) +- uni-breadcrumb 新增 支持 uni.scss 修改颜色 +- uni-data-select 修复 localdata 赋值不生效的 bug +- uni-data-select 新增 支持选项禁用(数据选项设置 disabled: true 即禁用) +- uni-data-select 修复 当 value 为 0 时选择不生效的 bug +- uni-easyinput 修复 关闭图标某些情况下无法取消的bug +- uni-fav 新增 stat 属性 ,是否开启uni统计功能 +- uni-goods-nav 新增 stat属性,是否开启uni统计功能 +- uni-group 新增 stat属性,是否开启uni统计功能 +- uni-nav-bar 新增 stat 属性 ,可开启统计 title 上报 ,仅使用了title 属性且项目开启了uni统计生效 +- uni-search-bar 新增 readonly 属性,组件只读 +- uni-swipe-action 修复 isPC 找不到的Bug +- uni-swipe-action 修复 在 nvue 下 disabled 失效的bug +- uni-tooltip 修复 content 为空时仍然弹出的bug +## 1.4.15(2022-05-07) +- uni-data-picker 修复 字节小程序 本地数据无法选择下一级的Bug +- uni-data-select 新增 记住上次的选项(仅 collection 存在时有效) +- uni-search-bar 修复 vue3 input 事件不生效的bug +- uni-search-bar 修复 多余代码导致的bug +- uni-tooltip 更新 text 属性变更为 content +- uni-tooltip 更新 移除 width 属性 +- uni-tooltip 修复 组件根 text 嵌套组件 warning +## 1.4.14(2022-04-18) +- uni-datetime-picker 修复 Vue3 下动态赋值,单选类型未响应的 bug +- uni-easyinput 修复 默认值不生效的bug +## 1.4.13(2022-04-02) +- uni-calendar 修复 条件编译 nvue 不支持的 css 样式 +- uni-calendar 修复 startDate、 endDate 属性失效的 bug +- uni-data-picker 修复 nvue 不支持的 v-show 的 bug +- uni-data-picker 修复 条件编译 nvue 不支持的 css 样式 +- uni-datetime-picker 修复 Vue3 下动态赋值未响应的 bug +- uni-easyinput 修复 value不能为0的bug +- uni-popup 修复 弹出层内部无法滚动的bug +- uni-popup 修复 小程序中高度错误的bug +- uni-popup 修复 快速调用open出现问题的Bug +- uni-rate 修复 条件判断 `NaN` 错误的 bug +- uni-swipe-action 修复 按钮字体大小不能设置的bug +- uni-swipe-action 修复 h5和app端下报el错误的bug +- uni-swipe-action 修复 HBuilderX 1.4.X 版本中,h5和app端下报错的bug +## 1.4.12(2022-02-19) +- uni-collapse 修复 初始化的时候 ,open 属性失效的bug +- uni-data-checkbox 修复 multiple 为 true 时,v-model 的值为 null 报错的 bug +- uni-icons 优化 size 属性可以传入不带单位的字符串数值 +- uni-icons 优化 size 支持其他单位 +- uni-nav-bar 新增 left-width/right-width属性 ,可修改左右两侧的宽度 +- uni-popup 修复 safeArea 属性不能设置为false的bug +## 1.4.11(2022-01-21) +- uni-collapse 修复 微信小程序resize后组件收起的bug +- uni-countdown 修复 在微信小程序中样式不生效的bug +- uni-countdown 新增 update 方法 ,在动态更新时间后,刷新组件 +- uni-load-more 新增 showText属性 ,是否显示文本 +- uni-load-more 修复 nvue 平台下不显示文本的bug +- uni-load-more 修复 微信小程序平台样式选择器报警告的问题 +- uni-nav-bar 修复 在vue下,标题不垂直居中的bug +- uni-nav-bar 修复 height 属性类型错误 +- uni-nav-bar 新增 height 属性,可修改组件高度 +- uni-nav-bar 新增 dark 属性可可开启暗黑模式 +- uni-nav-bar 优化 标题字数过多显示省略号 +- uni-nav-bar 优化 插槽,插入内容可完全覆盖 +- uni-popup 修复 isMaskClick 失效的bug +- uni-popup 新增 cancelText \ confirmText 属性 ,可自定义文本 +- uni-popup 新增 maskBackgroundColor 属性 ,可以修改蒙版颜色 +- uni-popup 优化 maskClick属性 更新为 isMaskClick ,解决微信小程序警告的问题 + +## 1.4.10(2022-01-17) +- uni-card 修复 在vue页面下略缩图显示不正常的bug +- uni-datetime-picker 修复 clear-icon 属性在小程序平台不生效的 bug +- uni-datetime-picker 修复 日期范围选在小程序平台,必须多点击一次才能取消选中状态的 bug +- uni-fab 更新 组件依赖 +- +- uni-icons 修复 nvue 有些图标不显示的bug,兼容老版本图标 +- uni-icons 优化 示例可复制图标名称 +- uni-nav-bar 修复 color 属性不生效的bug +- uni-popup 修复 设置 safeArea 属性不生效的bug +- uni-popup 优化 组件示例 +- uni-popup 修复 vuedoc 文字错误 +## 1.4.9(2021-11-23) +- uni-ui 修复 vue3中某些scss变量无法找到的问题 +- uni-combox 优化 label、label-width 属性 +- uni-data-picker 修复 由上个版本引发的map、v-model等属性不生效的bug +- uni-file-picker 修复 参数为对象的情况下,url在某些情况显示错误的bug +- uni-icons 优化 兼容旧组件 type 值 +- uni-list 修复 在vue3中to属性在发行应用的时候报错的bug +- uni-scss 修复 vue3中scss语法兼容问题 +- uni-transition 修复 init 方法初始化问题 +## 1.4.8(2021-11-19) +- uni-fab 修复 阴影颜色不正确的bug +## 1.4.7(2021-11-19) +- uni-ui 新增 支持国际化 +- uni-ui 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- uni-ui 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-ui](https://uniapp.dcloud.io/component/uniui/uni-ui) +- uni-badge 修改 size 属性默认值调整为 small +- uni-badge 修改 type 属性,默认值调整为 error,info 替换 default +- uni-badge 修复 在字节小程序上样式不生效的 bug +- uni-calendar 修复 弹出层被 tabbar 遮盖 bug +- uni-card 重构插槽的用法 ,header 替换为 title +- uni-card 新增 actions 插槽 +- uni-card 新增 cover 封面图属性和插槽 +- uni-card 新增 padding 内容默认内边距离 +- uni-card 新增 margin 卡片默认外边距离 +- uni-card 新增 spacing 卡片默认内边距 +- uni-card 新增 shadow 卡片阴影属性 +- uni-card 取消 mode 属性,可使用组合插槽代替 +- uni-card 取消 note 属性 ,使用actions插槽代替 +- uni-collapse 优化 show-arrow 属性默认为true +- uni-collapse 新增 show-arrow 属性,控制是否显示右侧箭头 +- uni-countdown 新增 font-size 支持自定义字体大小 +- uni-data-checkbox 修复 在uni-forms中 modelValue 中不存在当前字段,当前字段必填写也不参与校验的问题 +- uni-data-checkbox 修复 单选 list 模式下 ,icon 为 left 时,选中图标不显示的问题 +- uni-data-checkbox 修复 在 uni-forms 中重置表单,错误信息无法清除的问题 +- uni-dateformat 优化 默认时间不再是当前时间,而是显示'-'字符 +- uni-datetime-picker 修复 hide-second 在移动端的 bug +- uni-datetime-picker 修复 单选赋默认值时,赋值日期未高亮的 bug +- uni-datetime-picker 修复 赋默认值时,移动端未正确显示时间的 bug +- uni-datetime-picker 新增 hide-second 属性,支持只使用时分,隐藏秒 +- uni-datetime-picker 优化 取消选中时(范围选)直接开始下一次选择, 避免多点一次 +- uni-datetime-picker 优化 移动端支持清除按钮,同时支持通过 ref 调用组件的 clear 方法 +- uni-datetime-picker 优化 调整字号大小,美化日历界面 +- uni-datetime-picker 优化 范围选择器在 pc 端过宽的问题 +- uni-datetime-picker 新增 支持作为 uni-forms 子组件相关功能 +- uni-datetime-picker 修复 在 uni-forms 中使用时,选择时间报 NAN 错误的 bug +- uni-datetime-picker 修复 type 属性动态赋值无效的 bug +- uni-datetime-picker 修复 ‘确认’按钮被 tabbar 遮盖 bug +- uni-datetime-picker 修复 组件未赋值时范围选左、右日历相同的 bug +- uni-datetime-picker 修复 范围选未正确显示当前值的 bug +- uni-datetime-picker 修复 h5 平台(移动端)报错 'cale' of undefined 的 bug +- uni-easyinput 修复 在 uni-forms 的动态表单中默认值校验不通过的 bug +- uni-easyinput 修复 在 uni-forms 中重置表单,错误信息无法清除的问题 +- uni-file-picker 新增 参数中返回 fileID 字段 +- uni-file-picker 修复 腾讯云传入fileID 不能回显的bug +- uni-file-picker 修复 选择图片后,不能放大的问题 +- uni-file-picker 修复 由于 0.2.11 版本引起的不能回显图片的Bug +- uni-file-picker 新增 clearFiles(index) 方法,可以手动删除指定文件 +- uni-file-picker 修复 v-model 值设为 null 报错的Bug +- uni-file-picker 修复 return-type="object" 时,无法删除文件的Bug +- uni-file-picker 修复 auto-upload 属性失效的Bug +- uni-forms 修复 label 插槽不生效的bug +- uni-forms 修复 没有添加校验规则的字段依然报错的Bug +- uni-forms 修复 重置表单错误信息无法清除的问题 +- uni-forms 修复 表单验证只生效一次的问题 +- uni-icons 新增 更多图标 +- uni-icons 优化 自定义图标使用方式 +- uni-link 修复 在 nvue 下不显示的 bug +- uni-pagination 修复 current 、value 属性未监听,导致高亮样式失效的 bug +- uni-rate 优化 默认值修改为 0 颗星 +- uni-search-bar 修复 value 属性与 modelValue 属性不兼容的Bug +- uni-swipe-action 新增 close-all 方法,关闭所有已打开的组件 +- uni-swipe-action 新增 resize() 方法,在非微信小程序、h5、app-vue端出现不能滑动的问题的时候,重置组件 +- uni-swipe-action 修复 app 端偶尔出现类似 Page[x][-x,xx;-x,xx,x,x-x] 的问题 +- uni-swipe-action 优化 微信小程序、h5、app-vue 滑动逻辑,避免出现动态新增组件后不能滑动的问题 +- uni-tag 新增 提供组件设计资源,组件样式调整 +- uni-tag 移除 插槽 +- uni-tag 移除 type 属性的 royal 选项 +- uni-tag type 不是 default 时,size 为 small 字体大小显示不正确 +## 1.4.2(2021-08-20) +- 新增 uni-ui 组件支持国际化 i18n +- uni-collapse 优化 show-arrow 属性默认为true +- uni-collapse 新增 show-arrow 属性,控制是否显示右侧箭头 +- uni-data-checkbox 修复 单选 list 模式下 ,icon 为 left 时,选中图标不显示的问题 +- uni-easyinput 修复 在 uni-forms 的动态表单中默认值校验不通过的 bug +- uni-file-picker 修复 由于 0.2.11 版本引起的不能回显图片的Bug +- uni-file-picker 新增 clearFiles(index) 方法,可以手动删除指定文件 +- uni-file-picker 修复 v-model 值设为 null 报错的Bug +- uni-swipe-action 新增 close-all 方法,关闭所有已打开的组件 +- uni-swipe-action 新增 resize() 方法,在非微信小程序、h5、app-vue端出现不能滑动的问题的时候,重置组件 +- uni-swipe-action 修复 app 端偶尔出现类似 Page[x][-x,xx;-x,xx,x,x-x] 的问题 +- uni-swipe-action 优化 微信小程序、h5、app-vue 滑动逻辑,避免出现动态新增组件后不能滑动的问题 +## 1.4.0(2021-08-13) +- uni-calendar 修复 弹出层被 tabbar 遮盖 bug +- uni-data-checkbox 修复 在 uni-forms 中重置表单,错误信息无法清除的问题 +- uni-dateformat 调整 默认时间不再是当前时间,而是显示'-'字符 +- uni-datetime-picker 新增 适配 vue3 +- uni-datetime-picker 新增 支持作为 uni-forms 子组件相关功能 +- uni-datetime-picker 修复 在 uni-forms 中使用时,选择时间报 NAN 错误的 bug +- uni-datetime-picker 修复 type 属性动态赋值无效的 bug +- uni-datetime-picker 修复 ‘确认’按钮被 tabbar 遮盖 bug +- uni-datetime-picker 修复 组件未赋值时范围选左、右日历相同的 bug +- uni-datetime-picker 修复 范围选未正确显示当前值的 bug +- uni-datetime-picker 修复 h5 平台(移动端)报错 'cale' of undefined 的 bug +- uni-easyinput 修复 在 uni-forms 中重置表单,错误信息无法清除的问题 +- uni-file-picker 修复 return-type="object" 时,无法删除文件的Bug +- uni-file-picker 修复 auto-upload 属性失效的Bug +- uni-forms 修复 没有添加校验规则的字段依然报错的Bug +- uni-forms 修复 重置表单错误信息无法清除的问题 +- uni-forms 优化 组件文档 +- uni-forms 修复 表单验证只生效一次的问题 +- uni-tag type 不是 default 时,size 为 small 字体大小显示不正确 +## 1.3.9(2021-08-02) +- uni-datetime-picker 新增 return-type 属性支持返回 date 日期对象 +- uni-file-picker 修复 fileExtname属性不指定值报错的Bug +- uni-file-picker 修复 在某种场景下图片不回显的Bug +- uni-link 支持自定义插槽 +## 1.3.8(2021-07-31) +- uni-ui 组件兼容 vue3 +- uni-collapse 修复 由1.2.0版本引起的 change 事件返回 undefined 的Bug +- uni-collapse 优化 组件示例 +- uni-collapse 新增 组件折叠动画 +- uni-collapse 新增 value\v-model 属性 ,动态修改面板折叠状态 +- uni-collapse 新增 title 插槽 ,可定义面板标题 +- uni-collapse 新增 border 属性 ,显示隐藏面板内容分隔线 +- uni-collapse 新增 title-border 属性 ,显示隐藏面板标题分隔线 +- uni-collapse 修复 resize 方法失效的Bug +- uni-collapse 修复 change 事件返回参数不正确的Bug +- uni-collapse 优化 H5、App 平台自动更具内容更新高度,无需调用 reszie() 方法 +- uni-data-checkbox 优化 在uni-forms组件,与label不对齐的问题 +- uni-data-checkbox 修复 单选默认值为0不能选中的Bug +- uni-easyinput 优化 errorMessage 属性支持 Boolean 类型 +- uni-file-picker 修复 return-type为object下,返回值不正确的Bug +- uni-file-picker 修复(重要) H5 平台下如果和uni-forms组件一同使用导致页面卡死的问题 +- uni-file-picker 优化 h5平台下上传文件导致页面卡死的问题 +- uni-forms 修复 vue2 下条件编译导致destroyed生命周期失效的Bug +- uni-forms 修复 1.2.1 引起的示例在小程序平台报错的Bug +- uni-forms 修复 动态校验表单,默认值为空的情况下校验失效的Bug +- uni-forms 修复 不指定name属性时,运行报错的Bug +- uni-forms 优化 label默认宽度从65调整至70,使required为true且四字时不换行 +- uni-forms 优化 组件示例,新增动态校验示例代码 +- uni-forms 优化 组件文档,使用方式更清晰 +- uni-list 修复 与其他组件嵌套使用时,点击失效的Bug +- uni-swipe-action 修复 跨页面修改组件数据 ,导致不能滑动的问题 +## 1.3.7(2021-07-16) +- uni-ui 兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +- uni-datetime-picker 修复 单选日期类型,初始赋值后不在当前日历的 bug +- uni-datetime-picker 新增 clearIcon 属性,显示框的清空按钮可配置显示隐藏(仅 pc 有效) +- uni-datetime-picker 优化 移动端移除显示框的清空按钮,无实际用途 +- uni-datetime-picker 修复 组件赋值为空,界面未更新的 bug +- uni-datetime-picker 修复 start 和 end 不能动态赋值的 bug +- uni-datetime-picker 修复 范围选类型,用户选择后再次选择右侧日历(结束日期)显示不正确的 bug +## 1.3.6(2021-07-09) +- uni-data-checkbox 优化 删除无用日志 +- uni-data-checkbox 修复 由 0.1.9 引起的非 nvue 端图标不显示的问题 +- uni-data-checkbox 修复 nvue 黑框样式问题 +- uni-datetime-picker 修复 范围选择不能动态赋值的 bug +- uni-datetime-picker 修复 范围选择的初始时间在一个月内时,造成无法选择的bug +- uni-datetime-picker 优化 弹出层在超出视窗边缘定位不准确的问题 +- uni-datetime-picker 修复 范围起始点样式的背景色与今日样式的字体前景色融合,导致日期字体看不清的 bug +- uni-datetime-picker 优化 弹出层在超出视窗边缘被遮盖的问题 +- uni-datetime-picker 新增 maskClick 事件 +- uni-datetime-picker 修复 特殊情况日历 rpx 布局错误的 bug,rpx -> px +- uni-datetime-picker 修复 范围选择时清空返回值不合理的bug,['', ''] -> [] +- uni-datetime-picker 新增 日期时间显示框支持插槽 +- uni-file-picker 修复 sourceType 缺少默认值导致 ios 无法选择文件 +- uni-file-picker 优化 解耦与uniCloud的强绑定关系 ,如不绑定服务空间,默认autoUpload为false且不可更改 +- uni-table 新增 uni-th 支持 date 日期筛选范围 +- uni-table 新增 uni-th 支持 range 筛选范围 +- uni-table 新增 uni-th 筛选功能 +## 1.3.5(2021-07-02) +- uni-card 优化 图文卡片无图片加载时,提供占位图标 +- uni-card 新增 header 插槽,自定义卡片头部( 图文卡片 mode="style" 时,不支持) +- uni-card 修复 thumbnail 不存在仍然占位的 bug +- uni-data-checkbox 修复 selectedTextColor 属性不生效的Bug +- uni-datetime-picker 优化 添加 uni-icons 依赖 +- uni-easyinput 修复 confirmType 属性(仅 type="text" 生效)导致多行文本框无法换行的 bug +- uni-file-picker 修复 由 0.0.10 版本引发的 returnType 属性失效的问题 +- uni-file-picker 优化 文件上传后进度条消失时机 +- uni-file-picker 修复 在uni-forms 中,删除文件 ,获取的值不对的Bug +- uni-forms 修复 pattern 属性在微信小程序平台无效的问题 +## 1.3.4(2021-06-25) +- uni-badge 优化 示例项目 +- uni-countdown 修复 uni-countdown 重复赋值跳两秒的 bug +- uni-easyinput 修复 passwordIcon 属性拼写错误的 bug +- uni-forms 修复 validate-trigger属性为submit且err-show-type属性为toast时不能弹出的Bug +- uni-forms 修复 只写setRules方法而导致校验不生效的Bug +- uni-forms 修复 由上个办法引发的错误提示文字错位的Bug +- uni-forms 修复 不设置 label 属性 ,无法设置label插槽的问题 +- uni-forms 修复 不设置label属性,label-width属性不生效的bug +- uni-forms 修复 setRules 方法与rules属性冲突的问题 +- uni-link 新增 download 属性,H5平台下载文件名 +- uni-popup 新增 mask-click 遮罩层点击事件 +- uni-popup 修复 nvue 平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug +- uni-tag 修复 uni-tag 在字节跳动小程序上 css 类名编译错误的 bug +## 1.3.3(2021-06-18) +- uni-easyinput 新增 passwordIcon 属性,当type=password时是否显示小眼睛图标 +- uni-easyinput 修复 confirmType 属性不生效的问题 +- uni-easyinput 修复 disabled 状态可清出内容的 bug +- uni-file-picker 修复 删除文件时无法触发 v-model 的Bug +- uni-popup 修复 H5平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug +- uni-popup 修复 错误的 watch 字段 +- uni-popup 修复 safeArea 属性不生效的问题 +- uni-popup 修复 点击内容,再点击遮罩无法关闭的Bug +## 1.3.2(2021-06-04) +- uni-data-checkbox 新增 map 属性,可以方便映射text/value属性 +- uni-data-checkbox 修复 不关联服务空间的情况下组件报错的Bug +- uni-data-picker 修复 上个版本引出的本地数据无法选择带有children的2级节点 +- uni-forms 修复 动态删减数据导致报错的问题 +- uni-forms 新增 modelValue 属性 ,value 即将废弃 +- uni-forms 新增 uni-forms-item 可以设置单独的 rules +- uni-forms 新增 validate 事件增加 keepitem 参数,可以选择那些字段不过滤 +- uni-forms 优化 submit 事件重命名为 validate +- uni-data-picker 修复 无法加载云端数据的问题 +- uni-data-picker 修复 v-model无效问题 +- uni-data-picker 修复 loaddata 为空数据组时加载时间过长问题 +- uni-datetime-picker 修复 图标在小程序上不显示的 bug +- uni-datetime-picker 优化 重命名引用组件,避免潜在组件命名冲突 +- uni-datetime-picker 优化 代码目录扁平化 +- uni-tag 修复 未定义 sass 变量 "$uni-color-royal" 的bug +## 1.3.1(2021-05-14) +- uni-badge 新增 uni-badge 的 absolute 属性,支持定位 +- uni-badge 新增 uni-badge 的 offset 属性,支持定位偏移 +- uni-badge 新增 uni-badge 的 is-dot 属性,支持仅显示有一个小点 +- uni-badge 新增 uni-badge 的 max-num 属性,支持自定义封顶的数字值,超过 99 显示99+ +- uni-badge 优化 uni-badge 属性 custom-style, 支持以对象形式自定义样式 +- uni-badge 修复 uni-badge 在 App 端,数字小于10时不是圆形的bug +- uni-badge 修复 uni-badge 在父元素不是 flex 布局时,宽度缩小的bug +- uni-badge 新增 uni-badge 属性 custom-style, 支持自定义样式 +- uni-datetime-picker 修复 ios 下不识别 '-' 日期格式的 bug +- uni-datetime-picker 优化 pc 下弹出层添加边框和阴影 +- uni-datetime-picker 修复 在 admin 中获取弹出层定位错误的bug +- uni-datetime-picker 修复 type 属性向下兼容,默认值从 date 变更为 datetime +- uni-datetime-picker 支持日历形式的日期+时间的范围选择 +- uni-steps 修复 uni-steps 横向布局时,多行文字高度不合理的 bug +- uni-countdown 修复 uni-countdown 不能控制倒计时的 bug +- uni-tag 修复 royal 类型无效的bug +- uni-tag 修复 uni-tag 宽度不自适应的bug +- uni-tag 新增 uni-tag 支持属性 custom-style 自定义样式 +- uni-link 新增 href 属性支持 tel:|mailto: +- uni-popup 修复 组件内放置 input 、textarea 组件,无法聚焦的问题 +- uni-popup 新增 type 属性的 left\right 值,支持左右弹出 +- uni-popup 新增 open(String:type) 方法参数 ,可以省略 type 属性 ,直接传入类型打开指定弹窗 +- uni-popup 新增 backgroundColor 属性,可定义主窗口背景色,默认不显示背景色 +- uni-popup 新增 safeArea 属性,是否适配底部安全区 +- uni-popup 修复 App\h5\微信小程序底部安全区占位不对的Bug +- uni-popup 修复 App 端弹出等待的Bug +- uni-popup 优化 提升低配设备性能,优化动画卡顿问题 +- uni-popup 优化 更简单的组件自定义方式 +- uni-table 修复 示例项目缺少组件的Bug +- uni-forms 修复 自定义检验器失效的问题 +- uni-title 修复 示例项目缺少组件的Bug +- uni-transition 修复 示例项目缺少组件的Bug +- uni-swiper-dot 修复 示例项目缺少组件的Bug +- uni-ui 新增 组件示例地址 +## 1.3.0(2021-04-23) +- uni-combox 优化 添加依赖 uni-icons, 导入后自动下载依赖 +- uni-data-picker 修复 非树形数据有 where 属性查询报错的问题 +- uni-fav 优化 添加依赖 uni-icons, 导入后自动下载依赖 +- uni-goods-nav 优化 添加依赖 uni-icons, 导入后自动下载依赖 +- uni-nav-bar 优化 添加依赖 uni-icons, 导入后自动下载依赖 +- uni-notice-bar 优化 添加依赖 uni-icons, 导入后自动下载依赖 +- uni-number-box 修复 uni-number-box 浮点数运算不精确的 bug +- uni-number-box 修复 uni-number-box change 事件触发不正确的 bug +- uni-number-box 新增 uni-number-box v-model 双向绑定 +- uni-rate 修复 布局变化后 uni-rate 星星计算不准确的 bug +- uni-rate 优化 添加依赖 uni-icons, 导入 uni-rate 自动下载依赖 +- uni-search-bar 优化 添加依赖 uni-icons, 导入后自动下载依赖 +- uni-steps 优化 添加依赖 uni-icons, 导入后自动下载依赖 +- uni-transition 新增 通过方法自定义动画 +- uni-transition 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式 +- uni-transition 优化 动画触发逻辑,使动画更流畅 +- uni-transition 优化 支持单独的动画类型 +- uni-transition 优化 文档示例 +## 1.2.13(2021-04-16) +- uni-ui 新增 uni-data-picker 支持云端非树形表结构数据 +- uni-ui 修复 uni-data-checkbox nvue 下无法选中的问题 +- uni-ui 修复 uni-data-picker 根节点 parent_field 字段等于null时选择界面错乱问题 +- uni-ui 修复 uni-file-picker 选择的文件非 file-extname 字段指定的扩展名报错的Bug +- uni-ui 修复 uni-swipe-action 报错 nv_navigator is not defined 的bug +- uni-ui 修复 uni-load-more 在首页使用时,h5 平台报 'uni is not defined' 的 bug +- uni-ui 优化 uni-file-picker file-extname 字段支持字符串写法,多个扩展名需要用逗号分隔 +- uni-ui 优化 uni-pagination PC 和 移动端适配不同的 ui +- uni-ui 更新 uni-file-picker 组件示例 +- uni-ui 修复 uni-nav-bar 当 fixed 属性为 true 时铺不满屏幕的 bug +- uni-ui 新增 uni-search-bar 的 focus 事件 +- uni-ui 修复 uni-rate 属性 margin 值为 string 组件失效的 bug +- uni-data-picker 修复 本地数据概率无法回显时问题 +- uni-table 新增 sortable 属性,是否开启单列排序 +- uni-table 优化 表格多选逻辑 +## 1.2.12(2021-03-23) +- uni-ui 新增 uni-datetime-picker 的 hide-second 属性、border 属性; +- uni-ui 修复 uni-datetime-picker 选择跟显示的日期不一样的 bug, +- uni-ui 修复 uni-datetime-picker change事件触发2次的 bug +- uni-ui 修复 uni-datetime-picker 分、秒 end 范围错误的 bug +- uni-ui 新增 uni-tr selectable 属性,用于 type=selection 时,设置某行是否可由全选按钮控制 +- uni-ui 新增 uni-data-checkbox 新增 disabled属性,支持nvue +- uni-ui 优化 uni-data-checkbox 无选项时提示“暂无数据” +- uni-ui 优化 uni-data-checkbox 默认颜色显示 +- uni-ui 新增 uni-link href 属性支持 tel:|mailto: +- uni-ui 新增 uni-table 示例demo +- uni-ui 修复 uni-data-picker 微信小程序某些情况下无法选择的问题,事件无法触发的问题 +- uni-ui 修复 uni-nav-bar easycom 下,找不到 uni-status-bar 的bug +- uni-ui 修复 uni-easyinput 示例在 qq 小程序上的bug +- uni-ui 修复 uni-forms 动态显示uni-forms-item的情况下,submit 方法获取值错误的Bug +- uni-ui 调整 cli 项目 建议使用 easycom 方式引用组件,如使用按需引用,需手动维护组件内部引用 + +## 1.2.11(2021-02-24) +- 调整为uni_modules目录规范 +- uni-data-picker 新增 数据驱动的picker选择器 +- uni-file-picker 新增 文件选择上传 +- uni-row 新增 栅格系统 +- uni-data-checkbox 优化 支持 nvue +- uni-forms 修复 偶发性获取表单值错误的Bug +- uni-forms 修复 校验 uni-data-picker value 为 0 时,返回值错误的Bug +- uni-forms 修复 uni-forms-item 组件隐藏时依然触发校验的bug +- uni-forms 优化 实时校验 +- uni-forms 优化 兼容nvue页面 +- uni-easyinput 优化 兼容nvue页面 +- uni-group 优化 兼容nvue页面 +- uni-popup 优化 组件适配 PC +- uni-fab 优化 适配 PC +- uni-swiper-dot 优化 适配 PC +- uni-rate 优化 适配 PC +- uni-notice-bar 优化 适配 PC +- uni-indexed-list 优化 适配 PC +- uni-combox 优化 适配 PC +- uni-transition 优化 适配 PC +- uni-nav-bar 优化 适配 PC +- uni-swipe-action 优化 适配 PC diff --git a/uni_modules/uni-ui/components/uni-ui/uni-ui.vue b/uni_modules/uni-ui/components/uni-ui/uni-ui.vue new file mode 100644 index 0000000..0970892 --- /dev/null +++ b/uni_modules/uni-ui/components/uni-ui/uni-ui.vue @@ -0,0 +1,7 @@ + + + diff --git a/uni_modules/uni-ui/package.json b/uni_modules/uni-ui/package.json new file mode 100644 index 0000000..d31a390 --- /dev/null +++ b/uni_modules/uni-ui/package.json @@ -0,0 +1,130 @@ +{ + "id": "uni-ui", + "displayName": "uni-ui", + "version": "1.5.6", + "description": "uni-ui 是基于uni-app的、全端兼容的、高性能UI框架", + "keywords": [ + "uni-ui", + "uniui", + "UI组件库", + "ui框架", + "ui库" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.2.10" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [ + "uni-badge", + "uni-calendar", + "uni-card", + "uni-collapse", + "uni-combox", + "uni-countdown", + "uni-data-checkbox", + "uni-data-picker", + "uni-data-select", + "uni-dateformat", + "uni-datetime-picker", + "uni-drawer", + "uni-easyinput", + "uni-fab", + "uni-fav", + "uni-file-picker", + "uni-forms", + "uni-goods-nav", + "uni-grid", + "uni-group", + "uni-icons", + "uni-indexed-list", + "uni-link", + "uni-list", + "uni-load-more", + "uni-nav-bar", + "uni-notice-bar", + "uni-number-box", + "uni-pagination", + "uni-popup", + "uni-rate", + "uni-row", + "uni-search-bar", + "uni-section", + "uni-segmented-control", + "uni-steps", + "uni-swipe-action", + "uni-swiper-dot", + "uni-table", + "uni-tag", + "uni-title", + "uni-tooltip", + "uni-transition" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-ui/readme.md b/uni_modules/uni-ui/readme.md new file mode 100644 index 0000000..23f8456 --- /dev/null +++ b/uni_modules/uni-ui/readme.md @@ -0,0 +1,247 @@ +> 当前插件不包含示例页面 ,如需示例请在 HBuiderX 中新建 `hello uni-app > 扩展组件` 中查看 +> +> 代码示例地址 :[https://ext.dcloud.net.cn/plugin?id=4941](https://ext.dcloud.net.cn/plugin?id=4941) +> +> 组件演示地址:[https://hellouniapp.dcloud.net.cn](https://hellouniapp.dcloud.net.cn/pages/extUI/badge/badge) +> +> 组件文档地址:[https://uniapp.dcloud.io/component/uniui/uni-ui](https://uniapp.dcloud.io/component/uniui/uni-ui) + +# uni-ui 介绍 + +## uni-ui产品特点 + +### 1. 高性能 + +目前为止,在小程序和混合app领域,暂时还没有比 `uni-ui` 更高性能的框架。 +- 自动差量更新数据 + +虽然uni-app支持小程序自定义组件,所有小程序的ui库都可以用。但小程序自定义组件的ui库都需要使用setData手动更新数据,在大数据量时、或高频更新数据时,很容易产生性能问题。 + +而 `uni-ui` 属于vue组件,uni-app引擎底层自动diff更新数据。当然其实插件市场里众多vue组件都具备这个特点。 +- 优化逻辑层和视图层通讯折损 + +非H5,不管是小程序还是App,不管是app的webview渲染还是原生渲染,全都是逻辑层和视图层分离的。这里就有一个逻辑层和视图层通讯的折损问题。 +比如在视图层拖动一个可跟手的组件,由于通讯的损耗,用js监听很难做到实时跟手。 + +这时就需要使用css动画以及平台底层提供的wxs、bindingx等技术。不过这些技术都比较复杂,所以 `uni-ui` 里做了封装,在需要跟手式操作的ui组件,比如swiperaction列表项左滑菜单,就在底层使用了这些技术,实现了高性能的交互体验 +- 背景停止 + +很多ui组件是会一直动的,比如轮播图、跑马灯。即便这个窗体被新窗体挡住,它在背景层仍然在消耗着硬件资源。在Android的webview版本为chrome66以上,背景操作ui会引发很严重的性能问题,造成前台界面明显卡顿。 + +而 `uni-ui` 的组件,会自动判断自己的显示状态,在组件不再可见时,不会再消耗硬件资源。 + +### 2. 全端 + + `uni-ui` 的组件都是多端自适应的,底层会抹平很多小程序平台的差异或bug。 + +比如导航栏navbar组件,会自动处理不同端的状态栏。 +比如swiperaction组件,在app和微信小程序上会使用交互体验更好的wxs技术,但在不支持wxs的其他小程序端会使用js模拟类似效果。 + + `uni-ui` 还支持nvue原生渲染,[详见](https://github.com/dcloudio/uni-ui/tree/nvue-uni-ui) + +未来 `uni-ui` 还会支持pc等大屏设备。 + +### 3. 与uni统计自动集成实现免打点 + +uni统计是优秀的多端统计平台,见[tongji.dcloud.net.cn](https://tongji.dcloud.net.cn)。 + +除了一张报表看全端,它的另一个重要特点是免打点。 +比如使用 `uni-ui` 的navbar标题栏、收藏、购物车等组件,均可实现自动打点,统计页面标题等各种行为数据。 +当然你也可以关闭uni统计,这不是强制的。 + +### 4. 主题扩展 + + `uni-ui` 支持[uni.scss](https://uniapp.dcloud.io/collocation/uni-scss),可以方便的切换App的风格。 + +ui是一种需求非常发散的产品,DCloud官方也无意用 `uni-ui` 压制第三方ui插件的空间,但官方有义务在性能和多端方面提供一个开源的标杆给大家。 + +我们欢迎更多优秀的ui组件出现,也欢迎更多人贡献 `uni-ui` 的主题风格,满足更多用户的需求。 + + +## 快速开始 + +uni-ui支持 HBuilderX直接新建项目模板、npm安装和单独导入个别组件等多种使用方式 + +### 在HBuilderX 新建uni-app项目的模板中,选择uni-ui模板 +![HBuilderX内创建uni-ui项目](https://img.cdn.aliyun.dcloud.net.cn/uni-app/doc/create-uni-ui-project.jpg) + +由于uni-app独特的[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)技术,可以免引用、注册,直接使用各种符合规则的vue组件。 + +在代码区键入`u`,拉出各种内置或uni-ui的组件列表,选择其中一个,即可使用该组件。 + +光标放在组件名称上,按F1,可以查阅组件的文档。 + +![uni-ui代码块](https://img.cdn.aliyun.dcloud.net.cn/uni-app/doc/uni-ui-snippet.jpg) + +### 通过 uni_modules 单独安装组件 +如果你没有创建uni-ui项目模板,也可以在你的工程里,通过 uni_modules 单独安装需要的某个组件。下表为uni-ui的扩展组件清单,点击每个组件在详情页面可以导入组件到项目下,导入后直接使用即可,无需import和注册。 + +|组件名|组件说明| +|---|---| +|uni-badge|[数字角标](https://ext.dcloud.net.cn/plugin?name=uni-badge)| +|uni-calendar|[日历](https://ext.dcloud.net.cn/plugin?name=uni-calendar)| +|uni-card|[卡片](https://ext.dcloud.net.cn/plugin?name=uni-card)| +|uni-collapse|[折叠面板](https://ext.dcloud.net.cn/plugin?name=uni-collapse)| +|uni-combox|[组合框](https://ext.dcloud.net.cn/plugin?name=uni-combox)| +|uni-countdown|[倒计时](https://ext.dcloud.net.cn/plugin?name=uni-countdown)| +|uni-data-checkbox|[数据选择器](https://ext.dcloud.net.cn/plugin?name=uni-data-checkbox)| +|uni-data-picker|[数据驱动的picker选择器](https://ext.dcloud.net.cn/plugin?name=uni-data-picker)| +|uni-dateformat|[日期格式化](https://ext.dcloud.net.cn/plugin?name=uni-dateformat)| +|uni-datetime-picker|[日期选择器](https://ext.dcloud.net.cn/plugin?name=uni-datetime-picker)| +|uni-drawer|[抽屉](https://ext.dcloud.net.cn/plugin?name=uni-drawer)| +|uni-easyinput|[增强输入框](https://ext.dcloud.net.cn/plugin?name=uni-easyinput)| +|uni-fab|[悬浮按钮](https://ext.dcloud.net.cn/plugin?name=uni-fab)| +|uni-fav|[收藏按钮](https://ext.dcloud.net.cn/plugin?name=uni-fav)| +|uni-file-picker|[文件选择上传](https://ext.dcloud.net.cn/plugin?name=uni-file-picker)| +|uni-forms|[表单](https://ext.dcloud.net.cn/plugin?name=uni-forms)| +|uni-goods-nav|[商品导航](https://ext.dcloud.net.cn/plugin?name=uni-goods-nav)| +|uni-grid|[宫格](https://ext.dcloud.net.cn/plugin?name=uni-grid)| +|uni-group|[分组](https://ext.dcloud.net.cn/plugin?name=uni-group)| +|uni-icons|[图标](https://ext.dcloud.net.cn/plugin?name=uni-icons)| +|uni-indexed-list|[索引列表](https://ext.dcloud.net.cn/plugin?name=uni-indexed-list)| +|uni-link|[超链接](https://ext.dcloud.net.cn/plugin?name=uni-link)| +|uni-list|[列表](https://ext.dcloud.net.cn/plugin?name=uni-list)| +|uni-load-more|[加载更多](https://ext.dcloud.net.cn/plugin?name=uni-load-more)| +|uni-nav-bar|[自定义导航栏](https://ext.dcloud.net.cn/plugin?name=uni-nav-bar)| +|uni-notice-bar|[通告栏](https://ext.dcloud.net.cn/plugin?name=uni-notice-bar)| +|uni-number-box|[数字输入框](https://ext.dcloud.net.cn/plugin?name=uni-number-box)| +|uni-pagination|[分页器](https://ext.dcloud.net.cn/plugin?name=uni-pagination)| +|uni-popup|[弹出层](https://ext.dcloud.net.cn/plugin?name=uni-popup)| +|uni-rate|[评分](https://ext.dcloud.net.cn/plugin?name=uni-rate)| +|uni-row|[布局-行](https://ext.dcloud.net.cn/plugin?name=uni-row)| +|uni-search-bar|[搜索栏](https://ext.dcloud.net.cn/plugin?name=uni-search-bar)| +|uni-segmented-control|[分段器](https://ext.dcloud.net.cn/plugin?name=uni-segmented-control)| +|uni-steps|[步骤条](https://ext.dcloud.net.cn/plugin?name=uni-steps)| +|uni-swipe-action|[滑动操作](https://ext.dcloud.net.cn/plugin?name=uni-swipe-action)| +|uni-swiper-dot|[轮播图指示点](https://ext.dcloud.net.cn/plugin?name=uni-swiper-dot)| +|uni-table|[表格](https://ext.dcloud.net.cn/plugin?name=uni-table)| +|uni-tag|[标签](https://ext.dcloud.net.cn/plugin?name=uni-tag)| +|uni-title|[章节标题](https://ext.dcloud.net.cn/plugin?name=uni-title)| +|uni-transition|[过渡动画](https://ext.dcloud.net.cn/plugin?name=uni-transition)| + + +使用 `uni_modules` 方式安装组件库,可以直接通过插件市场导入,通过右键菜单快速更新组件,不需要引用、注册,直接在页面中使用 `uni-ui` 组件。[点击安装 uni-ui 组件库](https://ext.dcloud.net.cn/plugin?id=55) + +**注意:下载最新的组件目前仅支持 uni_modules ,非 uni_modules 版本最高支持到组件的1.2.10版本** + +如不能升级到 `uni_modules` 版本,可以使用 `uni_modules` 安装好对应组件,将组件拷贝到对应目录。 + +例如需更新 `uni-list`和`uni-badge` ,将 `uni_modules>uni-list>components`和`uni_modules>uni-badege>components`下所有目录拷贝到如下目录即可: + + +**目录示例** + +```json +┌─components 组件目录 +│ ├─uni-list list 列表目录 +│ │ └─uni-list.vue list 组件文件 +│ ├─uni-list-item list-item 列表目录 +│ │ └─uni-list-item.vue list 组件文件 +│ ├─uni-badge badge 角标目录 +│ │ └─uni-badge.vue badge 组件文件 +│ └─ //.... 更多组件文件 +├─pages 业务页面文件存放的目录 +│ ├─index +│ │ └─index.vue index示例页面 +├─main.js Vue初始化入口文件 +├─App.vue 应用配置,用来配置App全局样式以及监听 应用生命周期 +├─manifest.json 配置应用名称、appid、logo、版本等打包信息,详见 +└─pages.json 配置页 + +``` + +### 通过 `uni_modules` 导入全部组件 +如果想一次把所有uni-ui组件导入到项目中,只需要导入一个 `uni-ui` 组件即可 [点击去导入](https://ext.dcloud.net.cn/plugin?id=55)。 + +如果没有自动导入其他组件,可以在 uni-ui 组件目录上右键选择 `安装三方插件依赖` 即可。 + + + +### npm安装 +在 `vue-cli` 项目中可以使用 `npm` 安装 `uni-ui` 库 ,或者直接在 `HBuilderX` 项目中使用 `npm` 。 + +> **注意** +> cli 项目默认是不编译 `node_modules` 下的组件的,导致条件编译等功能失效 ,导致组件异常 +> 需要在根目录创建 `vue.config.js` 文件 ,增加 `@dcloudio/uni-ui` 包的编译即可正常 +> ```javascript +> // vue.config.js +> module.exports = { +> transpileDependencies:['@dcloudio/uni-ui'] +> } +> ``` + + + +**准备 sass** + +`vue-cli` 项目请先安装 sass 及 sass-loader,如在 HBuliderX 中使用,可跳过此步。 + +- 安装 sass +``` + npm i sass -D 或 yarn add sass -D +``` + +- 安装 sass-loader +``` +npm i sass-loader@10.1.1 -D 或 yarn add sass-loader@10.1.1 -D +``` + +> 如果 `node` 版本小于 16 ,sass-loader 请使用低于 @11.0.0 的版本,[sass-loader@11.0.0 不支持 vue@2.6.12 ](https://stackoverflow.com/questions/66082397/typeerror-this-getoptions-is-not-a-function) +> 如果 `node` 版本大于 16 , `sass-loader` 建议使用 `v8.x` 版本 + +**安装 uni-ui** + +``` +npm i @dcloudio/uni-ui 或 yarn add @dcloudio/uni-ui +``` + + + +**配置easycom** + +使用 `npm` 安装好 `uni-ui` 之后,需要配置 `easycom` 规则,让 `npm` 安装的组件支持 `easycom` + +打开项目根目录下的 `pages.json` 并添加 `easycom` 节点: + +```javascript +// pages.json +{ + "easycom": { + "autoscan": true, + "custom": { + // uni-ui 规则如下配置 + "^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue" + } + }, + + // 其他内容 + pages:[ + // ... + ] +} + +``` + +在 ``template`` 中使用组件: + +```html + + + +``` + + **注意** + - uni-ui 现在只推荐使用 `easycom` ,如自己引用组件,可能会出现组件找不到的问题 + - 使用 npm 安装的组件,默认情况下 babel-loader 会忽略所有 node_modules 中的文件 ,导致条件编译失效,需要通过配置 `vue.config.js` 解决: + ```javascript + // 在根目录创建 vue.config.js 文件,并配置如下 + module.exports = { + transpileDependencies: ['@dcloudio/uni-ui'] + } + ``` + - uni-ui 是uni-app内置组件的扩展。注意与web开发不同,uni-ui不包括基础组件,它是基础组件的补充。web开发中有的开发者习惯用一个ui库完成所有开发,但在uni-app体系中,推荐开发者首先使用性能更高的基础组件,然后按需引入必要的扩展组件。 + - `uni-ui` 不支持使用 `Vue.use()` 的方式安装 + + +### 贡献代码 +在使用 `uni-ui` 中,如遇到无法解决的问题,请提 [Issues](https://github.com/dcloudio/uni-ui/issues) 给我们,假如您有更好的点子或更好的实现方式,也欢迎给我们提交 [PR](https://github.com/dcloudio/uni-ui/pulls) \ No newline at end of file diff --git a/unpackage/dist/cache/.vite/deps/_metadata.json b/unpackage/dist/cache/.vite/deps/_metadata.json new file mode 100644 index 0000000..c189dcd --- /dev/null +++ b/unpackage/dist/cache/.vite/deps/_metadata.json @@ -0,0 +1,8 @@ +{ + "hash": "40c493a5", + "configHash": "66250562", + "lockfileHash": "e3b0c442", + "browserHash": "94b0ab5f", + "optimized": {}, + "chunks": {} +} \ No newline at end of file diff --git a/unpackage/dist/cache/.vite/deps/package.json b/unpackage/dist/cache/.vite/deps/package.json new file mode 100644 index 0000000..3dbc1ca --- /dev/null +++ b/unpackage/dist/cache/.vite/deps/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/app.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/app.js.map new file mode 100644 index 0000000..edd210c --- /dev/null +++ b/unpackage/dist/dev/.sourcemap/mp-weixin/app.js.map @@ -0,0 +1 @@ +{"version":3,"file":"app.js","sources":["App.vue","main.js"],"sourcesContent":["\r\n\r\n\n","\n// #ifndef VUE3\r\nimport Vue from 'vue'\r\nimport App from './App'\r\n\r\nVue.config.productionTip = false\r\n\r\nApp.mpType = 'app'\r\n\r\nconst app = new Vue({\r\n ...App\r\n})\r\napp.$mount()\r\n// #endif\n\n// #ifdef VUE3\r\nimport { createSSRApp } from 'vue'\nimport App from './App.vue'\nexport function createApp() {\n const app = createSSRApp(App)\n return {\n app\n }\n}\r\n// #endif"],"names":["uni","createSSRApp","App"],"mappings":";;;;;;AACC,MAAK,YAAU;AAAA,EACd,UAAU,WAAW;AACpBA,kBAAAA,MAAA,MAAA,QAAA,gBAAa,uDAAuD;AACpEA,kBAAAA,MAAA,MAAA,OAAA,gBAAY,YAAY;AAAA,EACxB;AAAA,EACD,QAAQ,WAAW;AAClBA,kBAAAA,MAAY,MAAA,OAAA,gBAAA,UAAU;AAAA,EACtB;AAAA,EACD,QAAQ,WAAW;AAClBA,kBAAAA,MAAY,MAAA,OAAA,iBAAA,UAAU;AAAA,EACvB;AACD;ACMM,SAAS,YAAY;AAC1B,QAAM,MAAMC,cAAY,aAACC,SAAG;AAC5B,SAAO;AAAA,IACL;AAAA,EACD;AACH;;;"} \ No newline at end of file diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map new file mode 100644 index 0000000..13357a3 --- /dev/null +++ b/unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"vendor.js","sources":["D:/devapp/HBuilderX/plugins/uniapp-cli-vite/node_modules/@vue/shared/dist/shared.esm-bundler.js","D:/devapp/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-i18n/dist/uni-i18n.es.js","D:/devapp/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-shared/dist/uni-shared.es.js","D:/devapp/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-mp-vue/dist/vue.runtime.esm.js","D:/devapp/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-mp-weixin/dist/uni.api.esm.js","D:/devapp/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-console/dist/mp.esm.js","D:/devapp/HBuilderX/plugins/uniapp-cli-vite/node_modules/@dcloudio/uni-mp-weixin/dist/uni.mp.esm.js"],"sourcesContent":["/**\n* @vue/shared v3.4.21\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nfunction makeMap(str, expectsLowerCase) {\n const set = new Set(str.split(\",\"));\n return expectsLowerCase ? (val) => set.has(val.toLowerCase()) : (val) => set.has(val);\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n const i = arr.indexOf(el);\n if (i > -1) {\n arr.splice(i, 1);\n }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n // the leading comma is intentional so empty string \"\" is also included\n \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n const cache = /* @__PURE__ */ Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n};\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction((str) => {\n const s = str ? `on${capitalize(str)}` : ``;\n return s;\n});\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, arg) => {\n for (let i = 0; i < fns.length; i++) {\n fns[i](arg);\n }\n};\nconst def = (obj, key, value) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n value\n });\n};\nconst looseToNumber = (val) => {\n const n = parseFloat(val);\n return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n const n = isString(val) ? Number(val) : NaN;\n return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\n\nconst PatchFlags = {\n \"TEXT\": 1,\n \"1\": \"TEXT\",\n \"CLASS\": 2,\n \"2\": \"CLASS\",\n \"STYLE\": 4,\n \"4\": \"STYLE\",\n \"PROPS\": 8,\n \"8\": \"PROPS\",\n \"FULL_PROPS\": 16,\n \"16\": \"FULL_PROPS\",\n \"NEED_HYDRATION\": 32,\n \"32\": \"NEED_HYDRATION\",\n \"STABLE_FRAGMENT\": 64,\n \"64\": \"STABLE_FRAGMENT\",\n \"KEYED_FRAGMENT\": 128,\n \"128\": \"KEYED_FRAGMENT\",\n \"UNKEYED_FRAGMENT\": 256,\n \"256\": \"UNKEYED_FRAGMENT\",\n \"NEED_PATCH\": 512,\n \"512\": \"NEED_PATCH\",\n \"DYNAMIC_SLOTS\": 1024,\n \"1024\": \"DYNAMIC_SLOTS\",\n \"DEV_ROOT_FRAGMENT\": 2048,\n \"2048\": \"DEV_ROOT_FRAGMENT\",\n \"HOISTED\": -1,\n \"-1\": \"HOISTED\",\n \"BAIL\": -2,\n \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n [1]: `TEXT`,\n [2]: `CLASS`,\n [4]: `STYLE`,\n [8]: `PROPS`,\n [16]: `FULL_PROPS`,\n [32]: `NEED_HYDRATION`,\n [64]: `STABLE_FRAGMENT`,\n [128]: `KEYED_FRAGMENT`,\n [256]: `UNKEYED_FRAGMENT`,\n [512]: `NEED_PATCH`,\n [1024]: `DYNAMIC_SLOTS`,\n [2048]: `DEV_ROOT_FRAGMENT`,\n [-1]: `HOISTED`,\n [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n \"ELEMENT\": 1,\n \"1\": \"ELEMENT\",\n \"FUNCTIONAL_COMPONENT\": 2,\n \"2\": \"FUNCTIONAL_COMPONENT\",\n \"STATEFUL_COMPONENT\": 4,\n \"4\": \"STATEFUL_COMPONENT\",\n \"TEXT_CHILDREN\": 8,\n \"8\": \"TEXT_CHILDREN\",\n \"ARRAY_CHILDREN\": 16,\n \"16\": \"ARRAY_CHILDREN\",\n \"SLOTS_CHILDREN\": 32,\n \"32\": \"SLOTS_CHILDREN\",\n \"TELEPORT\": 64,\n \"64\": \"TELEPORT\",\n \"SUSPENSE\": 128,\n \"128\": \"SUSPENSE\",\n \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n \"COMPONENT_KEPT_ALIVE\": 512,\n \"512\": \"COMPONENT_KEPT_ALIVE\",\n \"COMPONENT\": 6,\n \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n \"STABLE\": 1,\n \"1\": \"STABLE\",\n \"DYNAMIC\": 2,\n \"2\": \"DYNAMIC\",\n \"FORWARDED\": 3,\n \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n [1]: \"STABLE\",\n [2]: \"DYNAMIC\",\n [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n let lines = source.split(/(\\r?\\n)/);\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n if (count >= start) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length)\n continue;\n const line = j + 1;\n res.push(\n `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`\n );\n const lineLength = lines[j].length;\n const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n if (j === i) {\n const pad = start - (count - (lineLength + newLineSeqLength));\n const length = Math.max(\n 1,\n end > count ? lineLength - pad : end - start\n );\n res.push(` | ` + \" \".repeat(pad) + \"^\".repeat(length));\n } else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + \"^\".repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n } else if (isString(value) || isObject(value)) {\n return value;\n }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n const ret = {};\n cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n}\nfunction stringifyStyle(styles) {\n let ret = \"\";\n if (!styles || isString(styles)) {\n return ret;\n }\n for (const key in styles) {\n const value = styles[key];\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n if (isString(value) || typeof value === \"number\") {\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n}\nfunction normalizeClass(value) {\n let res = \"\";\n if (isString(value)) {\n res = value;\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + \" \";\n }\n }\n } else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + \" \";\n }\n }\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props)\n return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n if (attrValidationCache.hasOwnProperty(name)) {\n return attrValidationCache[name];\n }\n const isUnsafe = unsafeAttrCharRE.test(name);\n if (isUnsafe) {\n console.error(`unsafe attribute name: ${name}`);\n }\n return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nfunction isRenderableAttrValue(value) {\n if (value == null) {\n return false;\n }\n const type = typeof value;\n return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n const str = \"\" + string;\n const match = escapeRE.exec(str);\n if (!match) {\n return str;\n }\n let html = \"\";\n let escaped;\n let index;\n let lastIndex = 0;\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escaped = \""\";\n break;\n case 38:\n escaped = \"&\";\n break;\n case 39:\n escaped = \"'\";\n break;\n case 60:\n escaped = \"<\";\n break;\n case 62:\n escaped = \">\";\n break;\n default:\n continue;\n }\n if (lastIndex !== index) {\n html += str.slice(lastIndex, index);\n }\n lastIndex = index + 1;\n html += escaped;\n }\n return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>||--!>| looseEqual(item, val));\n}\n\nconst toDisplayString = (val) => {\n return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n if (val && val.__v_isRef) {\n return replacer(_key, val.value);\n } else if (isMap(val)) {\n return {\n [`Map(${val.size})`]: [...val.entries()].reduce(\n (entries, [key, val2], i) => {\n entries[stringifySymbol(key, i) + \" =>\"] = val2;\n return entries;\n },\n {}\n )\n };\n } else if (isSet(val)) {\n return {\n [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n };\n } else if (isSymbol(val)) {\n return stringifySymbol(val);\n } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n return String(val);\n }\n return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n var _a;\n return isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v;\n};\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, def, escapeHtml, escapeHtmlComment, extend, genPropsAccessExp, generateCodeFrame, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","const isObject = (val) => val !== null && typeof val === 'object';\nconst defaultDelimiters = ['{', '}'];\nclass BaseFormatter {\n constructor() {\n this._caches = Object.create(null);\n }\n interpolate(message, values, delimiters = defaultDelimiters) {\n if (!values) {\n return [message];\n }\n let tokens = this._caches[message];\n if (!tokens) {\n tokens = parse(message, delimiters);\n this._caches[message] = tokens;\n }\n return compile(tokens, values);\n }\n}\nconst RE_TOKEN_LIST_VALUE = /^(?:\\d)+/;\nconst RE_TOKEN_NAMED_VALUE = /^(?:\\w)+/;\nfunction parse(format, [startDelimiter, endDelimiter]) {\n const tokens = [];\n let position = 0;\n let text = '';\n while (position < format.length) {\n let char = format[position++];\n if (char === startDelimiter) {\n if (text) {\n tokens.push({ type: 'text', value: text });\n }\n text = '';\n let sub = '';\n char = format[position++];\n while (char !== undefined && char !== endDelimiter) {\n sub += char;\n char = format[position++];\n }\n const isClosed = char === endDelimiter;\n const type = RE_TOKEN_LIST_VALUE.test(sub)\n ? 'list'\n : isClosed && RE_TOKEN_NAMED_VALUE.test(sub)\n ? 'named'\n : 'unknown';\n tokens.push({ value: sub, type });\n }\n // else if (char === '%') {\n // // when found rails i18n syntax, skip text capture\n // if (format[position] !== '{') {\n // text += char\n // }\n // }\n else {\n text += char;\n }\n }\n text && tokens.push({ type: 'text', value: text });\n return tokens;\n}\nfunction compile(tokens, values) {\n const compiled = [];\n let index = 0;\n const mode = Array.isArray(values)\n ? 'list'\n : isObject(values)\n ? 'named'\n : 'unknown';\n if (mode === 'unknown') {\n return compiled;\n }\n while (index < tokens.length) {\n const token = tokens[index];\n switch (token.type) {\n case 'text':\n compiled.push(token.value);\n break;\n case 'list':\n compiled.push(values[parseInt(token.value, 10)]);\n break;\n case 'named':\n if (mode === 'named') {\n compiled.push(values[token.value]);\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Type of token '${token.type}' and format of value '${mode}' don't match!`);\n }\n }\n break;\n case 'unknown':\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`Detect 'unknown' type of token!`);\n }\n break;\n }\n index++;\n }\n return compiled;\n}\n\nconst LOCALE_ZH_HANS = 'zh-Hans';\nconst LOCALE_ZH_HANT = 'zh-Hant';\nconst LOCALE_EN = 'en';\nconst LOCALE_FR = 'fr';\nconst LOCALE_ES = 'es';\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst defaultFormatter = new BaseFormatter();\nfunction include(str, parts) {\n return !!parts.find((part) => str.indexOf(part) !== -1);\n}\nfunction startsWith(str, parts) {\n return parts.find((part) => str.indexOf(part) === 0);\n}\nfunction normalizeLocale(locale, messages) {\n if (!locale) {\n return;\n }\n locale = locale.trim().replace(/_/g, '-');\n if (messages && messages[locale]) {\n return locale;\n }\n locale = locale.toLowerCase();\n if (locale === 'chinese') {\n // 支付宝\n return LOCALE_ZH_HANS;\n }\n if (locale.indexOf('zh') === 0) {\n if (locale.indexOf('-hans') > -1) {\n return LOCALE_ZH_HANS;\n }\n if (locale.indexOf('-hant') > -1) {\n return LOCALE_ZH_HANT;\n }\n if (include(locale, ['-tw', '-hk', '-mo', '-cht'])) {\n return LOCALE_ZH_HANT;\n }\n return LOCALE_ZH_HANS;\n }\n let locales = [LOCALE_EN, LOCALE_FR, LOCALE_ES];\n if (messages && Object.keys(messages).length > 0) {\n locales = Object.keys(messages);\n }\n const lang = startsWith(locale, locales);\n if (lang) {\n return lang;\n }\n}\nclass I18n {\n constructor({ locale, fallbackLocale, messages, watcher, formater, }) {\n this.locale = LOCALE_EN;\n this.fallbackLocale = LOCALE_EN;\n this.message = {};\n this.messages = {};\n this.watchers = [];\n if (fallbackLocale) {\n this.fallbackLocale = fallbackLocale;\n }\n this.formater = formater || defaultFormatter;\n this.messages = messages || {};\n this.setLocale(locale || LOCALE_EN);\n if (watcher) {\n this.watchLocale(watcher);\n }\n }\n setLocale(locale) {\n const oldLocale = this.locale;\n this.locale = normalizeLocale(locale, this.messages) || this.fallbackLocale;\n if (!this.messages[this.locale]) {\n // 可能初始化时不存在\n this.messages[this.locale] = {};\n }\n this.message = this.messages[this.locale];\n // 仅发生变化时,通知\n if (oldLocale !== this.locale) {\n this.watchers.forEach((watcher) => {\n watcher(this.locale, oldLocale);\n });\n }\n }\n getLocale() {\n return this.locale;\n }\n watchLocale(fn) {\n const index = this.watchers.push(fn) - 1;\n return () => {\n this.watchers.splice(index, 1);\n };\n }\n add(locale, message, override = true) {\n const curMessages = this.messages[locale];\n if (curMessages) {\n if (override) {\n Object.assign(curMessages, message);\n }\n else {\n Object.keys(message).forEach((key) => {\n if (!hasOwn(curMessages, key)) {\n curMessages[key] = message[key];\n }\n });\n }\n }\n else {\n this.messages[locale] = message;\n }\n }\n f(message, values, delimiters) {\n return this.formater.interpolate(message, values, delimiters).join('');\n }\n t(key, locale, values) {\n let message = this.message;\n if (typeof locale === 'string') {\n locale = normalizeLocale(locale, this.messages);\n locale && (message = this.messages[locale]);\n }\n else {\n values = locale;\n }\n if (!hasOwn(message, key)) {\n console.warn(`Cannot translate the value of keypath ${key}. Use the value of keypath as default.`);\n return key;\n }\n return this.formater.interpolate(message[key], values).join('');\n }\n}\n\nfunction watchAppLocale(appVm, i18n) {\n // 需要保证 watch 的触发在组件渲染之前\n if (appVm.$watchLocale) {\n // vue2\n appVm.$watchLocale((newLocale) => {\n i18n.setLocale(newLocale);\n });\n }\n else {\n appVm.$watch(() => appVm.$locale, (newLocale) => {\n i18n.setLocale(newLocale);\n });\n }\n}\nfunction getDefaultLocale() {\n if (typeof uni !== 'undefined' && uni.getLocale) {\n return uni.getLocale();\n }\n // 小程序平台,uni 和 uni-i18n 互相引用,导致访问不到 uni,故在 global 上挂了 getLocale\n if (typeof global !== 'undefined' && global.getLocale) {\n return global.getLocale();\n }\n return LOCALE_EN;\n}\nfunction initVueI18n(locale, messages = {}, fallbackLocale, watcher) {\n // 兼容旧版本入参\n if (typeof locale !== 'string') {\n // ;[locale, messages] = [\n // messages as unknown as string,\n // locale as unknown as LocaleMessages,\n // ]\n // 暂不使用数组解构,uts编译器暂未支持。\n const options = [\n messages,\n locale,\n ];\n locale = options[0];\n messages = options[1];\n }\n if (typeof locale !== 'string') {\n // 因为小程序平台,uni-i18n 和 uni 互相引用,导致此时访问 uni 时,为 undefined\n locale = getDefaultLocale();\n }\n if (typeof fallbackLocale !== 'string') {\n fallbackLocale =\n (typeof __uniConfig !== 'undefined' && __uniConfig.fallbackLocale) ||\n LOCALE_EN;\n }\n const i18n = new I18n({\n locale,\n fallbackLocale,\n messages,\n watcher,\n });\n let t = (key, values) => {\n if (typeof getApp !== 'function') {\n // app view\n /* eslint-disable no-func-assign */\n t = function (key, values) {\n return i18n.t(key, values);\n };\n }\n else {\n let isWatchedAppLocale = false;\n t = function (key, values) {\n const appVm = getApp().$vm;\n // 可能$vm还不存在,比如在支付宝小程序中,组件定义较早,在props的default里使用了t()函数(如uni-goods-nav),此时app还未初始化\n // options: {\n // \ttype: Array,\n // \tdefault () {\n // \t\treturn [{\n // \t\t\ticon: 'shop',\n // \t\t\ttext: t(\"uni-goods-nav.options.shop\"),\n // \t\t}, {\n // \t\t\ticon: 'cart',\n // \t\t\ttext: t(\"uni-goods-nav.options.cart\")\n // \t\t}]\n // \t}\n // },\n if (appVm) {\n // 触发响应式\n appVm.$locale;\n if (!isWatchedAppLocale) {\n isWatchedAppLocale = true;\n watchAppLocale(appVm, i18n);\n }\n }\n return i18n.t(key, values);\n };\n }\n return t(key, values);\n };\n return {\n i18n,\n f(message, values, delimiters) {\n return i18n.f(message, values, delimiters);\n },\n t(key, values) {\n return t(key, values);\n },\n add(locale, message, override = true) {\n return i18n.add(locale, message, override);\n },\n watch(fn) {\n return i18n.watchLocale(fn);\n },\n getLocale() {\n return i18n.getLocale();\n },\n setLocale(newLocale) {\n return i18n.setLocale(newLocale);\n },\n };\n}\n\nconst isString = (val) => typeof val === 'string';\nlet formater;\nfunction hasI18nJson(jsonObj, delimiters) {\n if (!formater) {\n formater = new BaseFormatter();\n }\n return walkJsonObj(jsonObj, (jsonObj, key) => {\n const value = jsonObj[key];\n if (isString(value)) {\n if (isI18nStr(value, delimiters)) {\n return true;\n }\n }\n else {\n return hasI18nJson(value, delimiters);\n }\n });\n}\nfunction parseI18nJson(jsonObj, values, delimiters) {\n if (!formater) {\n formater = new BaseFormatter();\n }\n walkJsonObj(jsonObj, (jsonObj, key) => {\n const value = jsonObj[key];\n if (isString(value)) {\n if (isI18nStr(value, delimiters)) {\n jsonObj[key] = compileStr(value, values, delimiters);\n }\n }\n else {\n parseI18nJson(value, values, delimiters);\n }\n });\n return jsonObj;\n}\nfunction compileI18nJsonStr(jsonStr, { locale, locales, delimiters, }) {\n if (!isI18nStr(jsonStr, delimiters)) {\n return jsonStr;\n }\n if (!formater) {\n formater = new BaseFormatter();\n }\n const localeValues = [];\n Object.keys(locales).forEach((name) => {\n if (name !== locale) {\n localeValues.push({\n locale: name,\n values: locales[name],\n });\n }\n });\n localeValues.unshift({ locale, values: locales[locale] });\n try {\n return JSON.stringify(compileJsonObj(JSON.parse(jsonStr), localeValues, delimiters), null, 2);\n }\n catch (e) { }\n return jsonStr;\n}\nfunction isI18nStr(value, delimiters) {\n return value.indexOf(delimiters[0]) > -1;\n}\nfunction compileStr(value, values, delimiters) {\n return formater.interpolate(value, values, delimiters).join('');\n}\nfunction compileValue(jsonObj, key, localeValues, delimiters) {\n const value = jsonObj[key];\n if (isString(value)) {\n // 存在国际化\n if (isI18nStr(value, delimiters)) {\n jsonObj[key] = compileStr(value, localeValues[0].values, delimiters);\n if (localeValues.length > 1) {\n // 格式化国际化语言\n const valueLocales = (jsonObj[key + 'Locales'] = {});\n localeValues.forEach((localValue) => {\n valueLocales[localValue.locale] = compileStr(value, localValue.values, delimiters);\n });\n }\n }\n }\n else {\n compileJsonObj(value, localeValues, delimiters);\n }\n}\nfunction compileJsonObj(jsonObj, localeValues, delimiters) {\n walkJsonObj(jsonObj, (jsonObj, key) => {\n compileValue(jsonObj, key, localeValues, delimiters);\n });\n return jsonObj;\n}\nfunction walkJsonObj(jsonObj, walk) {\n if (Array.isArray(jsonObj)) {\n for (let i = 0; i < jsonObj.length; i++) {\n if (walk(jsonObj, i)) {\n return true;\n }\n }\n }\n else if (isObject(jsonObj)) {\n for (const key in jsonObj) {\n if (walk(jsonObj, key)) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction resolveLocale(locales) {\n return (locale) => {\n if (!locale) {\n return locale;\n }\n locale = normalizeLocale(locale) || locale;\n return resolveLocaleChain(locale).find((locale) => locales.indexOf(locale) > -1);\n };\n}\nfunction resolveLocaleChain(locale) {\n const chain = [];\n const tokens = locale.split('-');\n while (tokens.length) {\n chain.push(tokens.join('-'));\n tokens.pop();\n }\n return chain;\n}\n\nexport { BaseFormatter as Formatter, I18n, LOCALE_EN, LOCALE_ES, LOCALE_FR, LOCALE_ZH_HANS, LOCALE_ZH_HANT, compileI18nJsonStr, hasI18nJson, initVueI18n, isI18nStr, isString, normalizeLocale, parseI18nJson, resolveLocale };\n","import { isHTMLTag, isSVGTag, isVoidTag, isString, isFunction, isPlainObject, hyphenate, camelize, normalizeStyle as normalizeStyle$1, parseStringStyle, isArray, normalizeClass as normalizeClass$1, extend, capitalize } from '@vue/shared';\n\nconst BUILT_IN_TAG_NAMES = [\n 'ad',\n 'ad-content-page',\n 'ad-draw',\n 'audio',\n 'button',\n 'camera',\n 'canvas',\n 'checkbox',\n 'checkbox-group',\n 'cover-image',\n 'cover-view',\n 'editor',\n 'form',\n 'functional-page-navigator',\n 'icon',\n 'image',\n 'input',\n 'label',\n 'live-player',\n 'live-pusher',\n 'map',\n 'movable-area',\n 'movable-view',\n 'navigator',\n 'official-account',\n 'open-data',\n 'picker',\n 'picker-view',\n 'picker-view-column',\n 'progress',\n 'radio',\n 'radio-group',\n 'rich-text',\n 'scroll-view',\n 'slider',\n 'swiper',\n 'swiper-item',\n 'switch',\n 'text',\n 'textarea',\n 'video',\n 'view',\n 'web-view',\n 'location-picker',\n 'location-view',\n];\nconst BUILT_IN_TAGS = BUILT_IN_TAG_NAMES.map((tag) => 'uni-' + tag);\nconst TAGS = [\n 'app',\n 'layout',\n 'content',\n 'main',\n 'top-window',\n 'left-window',\n 'right-window',\n 'tabbar',\n 'page',\n 'page-head',\n 'page-wrapper',\n 'page-body',\n 'page-refresh',\n 'actionsheet',\n 'modal',\n 'toast',\n 'resize-sensor',\n 'shadow-root',\n].map((tag) => 'uni-' + tag);\nconst NVUE_BUILT_IN_TAGS = [\n 'svg',\n 'view',\n 'a',\n 'div',\n 'img',\n 'image',\n 'text',\n 'span',\n 'input',\n 'textarea',\n 'spinner',\n 'select',\n // slider 被自定义 u-slider 替代\n // 'slider',\n 'slider-neighbor',\n 'indicator',\n 'canvas',\n 'list',\n 'cell',\n 'header',\n 'loading',\n 'loading-indicator',\n 'refresh',\n 'scrollable',\n 'scroller',\n 'video',\n 'web',\n 'embed',\n 'tabbar',\n 'tabheader',\n 'datepicker',\n 'timepicker',\n 'marquee',\n 'countdown',\n 'dc-switch',\n 'waterfall',\n 'richtext',\n 'recycle-list',\n 'u-scalable',\n 'barcode',\n 'gcanvas',\n];\nconst UVUE_BUILT_IN_TAGS = [\n 'ad',\n 'ad-content-page',\n 'ad-draw',\n 'native-view',\n 'loading-indicator',\n 'list-view',\n 'list-item',\n 'swiper',\n 'swiper-item',\n 'rich-text',\n 'sticky-view',\n 'sticky-header',\n 'sticky-section',\n // 自定义\n 'uni-slider',\n // 原生实现\n 'button',\n 'nested-scroll-header',\n 'nested-scroll-body',\n 'waterflow',\n 'flow-item',\n 'share-element',\n 'cover-view',\n 'cover-image',\n];\nconst UVUE_WEB_BUILT_IN_TAGS = [\n 'list-view',\n 'list-item',\n 'sticky-section',\n 'sticky-header',\n 'cloud-db-element',\n].map((tag) => 'uni-' + tag);\nconst UVUE_IOS_BUILT_IN_TAGS = [\n 'scroll-view',\n 'web-view',\n 'slider',\n 'form',\n 'switch',\n];\nconst UVUE_HARMONY_BUILT_IN_TAGS = [\n // TODO 列出完整列表\n ...BUILT_IN_TAG_NAMES,\n 'volume-panel',\n];\nconst NVUE_U_BUILT_IN_TAGS = [\n 'u-text',\n 'u-image',\n 'u-input',\n 'u-textarea',\n 'u-video',\n 'u-web-view',\n 'u-slider',\n 'u-ad',\n 'u-ad-draw',\n 'u-rich-text',\n];\nconst UNI_UI_CONFLICT_TAGS = ['list-item'].map((tag) => 'uni-' + tag);\nfunction isBuiltInComponent(tag) {\n if (UNI_UI_CONFLICT_TAGS.indexOf(tag) !== -1) {\n return false;\n }\n // h5 平台会被转换为 v-uni-\n const realTag = 'uni-' + tag.replace('v-uni-', '');\n // TODO 区分x和非x\n return (BUILT_IN_TAGS.indexOf(realTag) !== -1 ||\n UVUE_WEB_BUILT_IN_TAGS.indexOf(realTag) !== -1);\n}\nfunction isH5CustomElement(tag, isX = false) {\n if (isX && UVUE_WEB_BUILT_IN_TAGS.indexOf(tag) !== -1) {\n return true;\n }\n return TAGS.indexOf(tag) !== -1 || BUILT_IN_TAGS.indexOf(tag) !== -1;\n}\nfunction isUniXElement(name) {\n return /^I?Uni.*Element(?:Impl)?$/.test(name);\n}\nfunction isH5NativeTag(tag) {\n return (tag !== 'head' &&\n (isHTMLTag(tag) || isSVGTag(tag)) &&\n !isBuiltInComponent(tag));\n}\nfunction isAppNativeTag(tag) {\n return isHTMLTag(tag) || isSVGTag(tag) || isBuiltInComponent(tag);\n}\nconst NVUE_CUSTOM_COMPONENTS = [\n 'ad',\n 'ad-draw',\n 'button',\n 'checkbox-group',\n 'checkbox',\n 'form',\n 'icon',\n 'label',\n 'movable-area',\n 'movable-view',\n 'navigator',\n 'picker',\n 'progress',\n 'radio-group',\n 'radio',\n 'rich-text',\n 'swiper-item',\n 'swiper',\n 'switch',\n 'slider',\n 'picker-view',\n 'picker-view-column',\n];\n// 内置的easycom组件\nconst UVUE_BUILT_IN_EASY_COMPONENTS = ['map', 'camera'];\nfunction isAppUVueBuiltInEasyComponent(tag) {\n return UVUE_BUILT_IN_EASY_COMPONENTS.includes(tag);\n}\n// 主要是指前端实现的组件列表\nconst UVUE_CUSTOM_COMPONENTS = [\n ...NVUE_CUSTOM_COMPONENTS,\n ...UVUE_BUILT_IN_EASY_COMPONENTS,\n];\nfunction isAppUVueNativeTag(tag) {\n // 前端实现的内置组件都会注册一个根组件\n if (tag.startsWith('uni-') && tag.endsWith('-element')) {\n return true;\n }\n if (UVUE_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n if (UVUE_CUSTOM_COMPONENTS.includes(tag)) {\n return false;\n }\n if (isBuiltInComponent(tag)) {\n return true;\n }\n // u-text,u-video...\n if (NVUE_U_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n return false;\n}\nfunction isAppIOSUVueNativeTag(tag) {\n // 前端实现的内置组件都会注册一个根组件\n if (tag.startsWith('uni-') && tag.endsWith('-element')) {\n return true;\n }\n if (NVUE_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n if (UVUE_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n if (UVUE_IOS_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n return false;\n}\nfunction isAppHarmonyUVueNativeTag(tag) {\n // video 目前是easycom实现的\n if (tag === 'video' || tag === 'map') {\n return false;\n }\n // 前端实现的内置组件都会注册一个根组件\n if (tag.startsWith('uni-') && tag.endsWith('-element')) {\n return true;\n }\n if (NVUE_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n if (UVUE_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n if (UVUE_HARMONY_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n return false;\n}\nfunction isAppNVueNativeTag(tag) {\n if (NVUE_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n if (NVUE_CUSTOM_COMPONENTS.includes(tag)) {\n return false;\n }\n if (isBuiltInComponent(tag)) {\n return true;\n }\n // u-text,u-video...\n if (NVUE_U_BUILT_IN_TAGS.includes(tag)) {\n return true;\n }\n return false;\n}\nfunction isMiniProgramNativeTag(tag) {\n return isBuiltInComponent(tag);\n}\nfunction isMiniProgramUVueNativeTag(tag) {\n // 小程序平台内置的自定义元素,会被转换为 view\n if (tag.startsWith('uni-') && tag.endsWith('-element')) {\n return true;\n }\n return isBuiltInComponent(tag);\n}\nfunction createIsCustomElement(tags = []) {\n return function isCustomElement(tag) {\n return tags.includes(tag);\n };\n}\nfunction isComponentTag(tag) {\n return tag[0].toLowerCase() + tag.slice(1) === 'component';\n}\nconst COMPONENT_SELECTOR_PREFIX = 'uni-';\nconst COMPONENT_PREFIX = 'v-' + COMPONENT_SELECTOR_PREFIX;\n// TODO 是否还存在其他需要特殊处理的 void 标签?\nconst APP_VOID_TAGS = ['textarea'];\nfunction isAppVoidTag(tag) {\n return APP_VOID_TAGS.includes(tag) || isVoidTag(tag);\n}\n\nconst LINEFEED = '\\n';\nconst NAVBAR_HEIGHT = 44;\nconst TABBAR_HEIGHT = 50;\nconst ON_REACH_BOTTOM_DISTANCE = 50;\nconst RESPONSIVE_MIN_WIDTH = 768;\nconst UNI_STORAGE_LOCALE = 'UNI_LOCALE';\n// quickapp-webview 不能使用 default 作为插槽名称\nconst SLOT_DEFAULT_NAME = 'd';\nconst COMPONENT_NAME_PREFIX = 'VUni';\nconst I18N_JSON_DELIMITERS = ['%', '%'];\nconst PRIMARY_COLOR = '#007aff';\nconst SELECTED_COLOR = '#0062cc'; // 选中的颜色,如选项卡默认的选中颜色\nconst BACKGROUND_COLOR = '#f7f7f7'; // 背景色,如标题栏默认背景色\nconst UNI_SSR = '__uniSSR';\nconst UNI_SSR_TITLE = 'title';\nconst UNI_SSR_STORE = 'store';\nconst UNI_SSR_DATA = 'data';\nconst UNI_SSR_GLOBAL_DATA = 'globalData';\nconst SCHEME_RE = /^([a-z-]+:)?\\/\\//i;\nconst DATA_RE = /^data:.*,.*/;\nconst WEB_INVOKE_APPSERVICE = 'WEB_INVOKE_APPSERVICE';\nconst WXS_PROTOCOL = 'wxs://';\nconst JSON_PROTOCOL = 'json://';\nconst WXS_MODULES = 'wxsModules';\nconst RENDERJS_MODULES = 'renderjsModules';\n// lifecycle\n// App and Page\nconst ON_SHOW = 'onShow';\nconst ON_HIDE = 'onHide';\n//App\nconst ON_LAUNCH = 'onLaunch';\nconst ON_ERROR = 'onError';\nconst ON_THEME_CHANGE = 'onThemeChange';\nconst OFF_THEME_CHANGE = 'offThemeChange';\nconst ON_HOST_THEME_CHANGE = 'onHostThemeChange';\nconst OFF_HOST_THEME_CHANGE = 'offHostThemeChange';\nconst ON_KEYBOARD_HEIGHT_CHANGE = 'onKeyboardHeightChange';\nconst ON_PAGE_NOT_FOUND = 'onPageNotFound';\nconst ON_UNHANDLE_REJECTION = 'onUnhandledRejection';\nconst ON_EXIT = 'onExit';\n//Page\nconst ON_LOAD = 'onLoad';\nconst ON_READY = 'onReady';\nconst ON_UNLOAD = 'onUnload';\n// 百度特有\nconst ON_INIT = 'onInit';\n// 微信特有\nconst ON_SAVE_EXIT_STATE = 'onSaveExitState';\nconst ON_RESIZE = 'onResize';\nconst ON_BACK_PRESS = 'onBackPress';\nconst ON_PAGE_SCROLL = 'onPageScroll';\nconst ON_TAB_ITEM_TAP = 'onTabItemTap';\nconst ON_REACH_BOTTOM = 'onReachBottom';\nconst ON_PULL_DOWN_REFRESH = 'onPullDownRefresh';\nconst ON_SHARE_TIMELINE = 'onShareTimeline';\nconst ON_SHARE_CHAT = 'onShareChat'; // xhs-share\nconst ON_ADD_TO_FAVORITES = 'onAddToFavorites';\nconst ON_SHARE_APP_MESSAGE = 'onShareAppMessage';\n// navigationBar\nconst ON_NAVIGATION_BAR_BUTTON_TAP = 'onNavigationBarButtonTap';\nconst ON_NAVIGATION_BAR_CHANGE = 'onNavigationBarChange';\nconst ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED = 'onNavigationBarSearchInputClicked';\nconst ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED = 'onNavigationBarSearchInputChanged';\nconst ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED = 'onNavigationBarSearchInputConfirmed';\nconst ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED = 'onNavigationBarSearchInputFocusChanged';\n// framework\nconst ON_APP_ENTER_FOREGROUND = 'onAppEnterForeground';\nconst ON_APP_ENTER_BACKGROUND = 'onAppEnterBackground';\nconst ON_WEB_INVOKE_APP_SERVICE = 'onWebInvokeAppService';\nconst ON_WXS_INVOKE_CALL_METHOD = 'onWxsInvokeCallMethod';\n// mergeVirtualHostAttributes\nconst VIRTUAL_HOST_STYLE = 'virtualHostStyle';\nconst VIRTUAL_HOST_CLASS = 'virtualHostClass';\nconst VIRTUAL_HOST_HIDDEN = 'virtualHostHidden';\nconst VIRTUAL_HOST_ID = 'virtualHostId';\n\nfunction cache(fn) {\n const cache = Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n}\nfunction cacheStringFunction(fn) {\n return cache(fn);\n}\nfunction getLen(str = '') {\n return ('' + str).replace(/[^\\x00-\\xff]/g, '**').length;\n}\nfunction hasLeadingSlash(str) {\n return str.indexOf('/') === 0;\n}\nfunction addLeadingSlash(str) {\n return hasLeadingSlash(str) ? str : '/' + str;\n}\nfunction removeLeadingSlash(str) {\n return hasLeadingSlash(str) ? str.slice(1) : str;\n}\nconst invokeArrayFns = (fns, arg) => {\n let ret;\n for (let i = 0; i < fns.length; i++) {\n ret = fns[i](arg);\n }\n return ret;\n};\nfunction updateElementStyle(element, styles) {\n for (const attrName in styles) {\n element.style[attrName] = styles[attrName];\n }\n}\nfunction once(fn, ctx = null) {\n let res;\n return ((...args) => {\n if (fn) {\n res = fn.apply(ctx, args);\n fn = null;\n }\n return res;\n });\n}\nconst sanitise = (val) => (val && JSON.parse(JSON.stringify(val))) || val;\nconst _completeValue = (value) => (value > 9 ? value : '0' + value);\nfunction formatDateTime({ date = new Date(), mode = 'date' }) {\n if (mode === 'time') {\n return (_completeValue(date.getHours()) + ':' + _completeValue(date.getMinutes()));\n }\n else {\n return (date.getFullYear() +\n '-' +\n _completeValue(date.getMonth() + 1) +\n '-' +\n _completeValue(date.getDate()));\n }\n}\nfunction callOptions(options, data) {\n options = options || {};\n if (isString(data)) {\n data = {\n errMsg: data,\n };\n }\n if (/:ok$/.test(data.errMsg)) {\n if (isFunction(options.success)) {\n options.success(data);\n }\n }\n else {\n if (isFunction(options.fail)) {\n options.fail(data);\n }\n }\n if (isFunction(options.complete)) {\n options.complete(data);\n }\n}\nfunction getValueByDataPath(obj, path) {\n if (!isString(path)) {\n return;\n }\n path = path.replace(/\\[(\\d+)\\]/g, '.$1');\n const parts = path.split('.');\n let key = parts[0];\n if (!obj) {\n obj = {};\n }\n if (parts.length === 1) {\n return obj[key];\n }\n return getValueByDataPath(obj[key], parts.slice(1).join('.'));\n}\nfunction sortObject(obj) {\n let sortObj = {};\n if (isPlainObject(obj)) {\n Object.keys(obj)\n .sort()\n .forEach((key) => {\n const _key = key;\n sortObj[_key] = obj[_key];\n });\n }\n return !Object.keys(sortObj) ? obj : sortObj;\n}\nfunction getGlobalOnce() {\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n // worker\n if (typeof self !== 'undefined') {\n return self;\n }\n // browser\n if (typeof window !== 'undefined') {\n return window;\n }\n // nodejs\n // if (typeof global !== 'undefined') {\n // return global\n // }\n function g() {\n return this;\n }\n if (typeof g() !== 'undefined') {\n return g();\n }\n return (function () {\n return new Function('return this')();\n })();\n}\nlet g = undefined;\nfunction getGlobal() {\n if (g) {\n return g;\n }\n g = getGlobalOnce();\n return g;\n}\n\nfunction isComponentInternalInstance(vm) {\n return !!vm.appContext;\n}\nfunction resolveComponentInstance(instance) {\n return (instance &&\n (isComponentInternalInstance(instance) ? instance.proxy : instance));\n}\nfunction resolveOwnerVm(vm) {\n if (!vm) {\n return;\n }\n let componentName = vm.type.name;\n while (componentName && isBuiltInComponent(hyphenate(componentName))) {\n // ownerInstance 内置组件需要使用父 vm\n vm = vm.parent;\n componentName = vm.type.name;\n }\n return vm.proxy;\n}\nfunction isElement(el) {\n // Element\n return el.nodeType === 1;\n}\nfunction resolveOwnerEl(instance, multi = false) {\n const { vnode } = instance;\n if (isElement(vnode.el)) {\n return multi ? (vnode.el ? [vnode.el] : []) : vnode.el;\n }\n const { subTree } = instance;\n // ShapeFlags.ARRAY_CHILDREN = 1<<4\n if (subTree.shapeFlag & 16) {\n const elemVNodes = subTree.children.filter((vnode) => vnode.el && isElement(vnode.el));\n if (elemVNodes.length > 0) {\n if (multi) {\n return elemVNodes.map((node) => node.el);\n }\n return elemVNodes[0].el;\n }\n }\n return multi ? (vnode.el ? [vnode.el] : []) : vnode.el;\n}\nfunction dynamicSlotName(name) {\n return name === 'default' ? SLOT_DEFAULT_NAME : name;\n}\nconst customizeRE = /:/g;\nfunction customizeEvent(str) {\n return camelize(str.replace(customizeRE, '-'));\n}\nfunction normalizeStyle(value) {\n const g = getGlobal();\n if (g && g.UTSJSONObject && value instanceof g.UTSJSONObject) {\n const styleObject = {};\n g.UTSJSONObject.keys(value).forEach((key) => {\n styleObject[key] = value[key];\n });\n return normalizeStyle$1(styleObject);\n }\n else if (value instanceof Map) {\n const styleObject = {};\n value.forEach((value, key) => {\n styleObject[key] = value;\n });\n return normalizeStyle$1(styleObject);\n }\n else if (isString(value)) {\n return parseStringStyle(value);\n }\n else if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item)\n ? parseStringStyle(item)\n : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n }\n else {\n return normalizeStyle$1(value);\n }\n}\nfunction normalizeClass(value) {\n let res = '';\n const g = getGlobal();\n if (g && g.UTSJSONObject && value instanceof g.UTSJSONObject) {\n g.UTSJSONObject.keys(value).forEach((key) => {\n if (value[key]) {\n res += key + ' ';\n }\n });\n }\n else if (value instanceof Map) {\n value.forEach((value, key) => {\n if (value) {\n res += key + ' ';\n }\n });\n }\n else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + ' ';\n }\n }\n }\n else {\n res = normalizeClass$1(value);\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props)\n return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\nlet lastLogTime = 0;\nfunction formatLog(module, ...args) {\n const now = Date.now();\n const diff = lastLogTime ? now - lastLogTime : 0;\n lastLogTime = now;\n return `[${now}][${diff}ms][${module}]:${args\n .map((arg) => JSON.stringify(arg))\n .join(' ')}`;\n}\n\nfunction formatKey(key) {\n return camelize(key.substring(5));\n}\n// question/139181,增加副作用,避免 initCustomDataset 在 build 下被 tree-shaking\nconst initCustomDatasetOnce = /*#__PURE__*/ once((isBuiltInElement) => {\n isBuiltInElement =\n isBuiltInElement || ((el) => el.tagName.startsWith('UNI-'));\n const prototype = HTMLElement.prototype;\n const setAttribute = prototype.setAttribute;\n prototype.setAttribute = function (key, value) {\n if (key.startsWith('data-') && isBuiltInElement(this)) {\n const dataset = this.__uniDataset ||\n (this.__uniDataset = {});\n dataset[formatKey(key)] = value;\n }\n setAttribute.call(this, key, value);\n };\n const removeAttribute = prototype.removeAttribute;\n prototype.removeAttribute = function (key) {\n if (this.__uniDataset &&\n key.startsWith('data-') &&\n isBuiltInElement(this)) {\n delete this.__uniDataset[formatKey(key)];\n }\n removeAttribute.call(this, key);\n };\n});\nfunction getCustomDataset(el) {\n return extend({}, el.dataset, el.__uniDataset);\n}\n\nconst unitRE = new RegExp(`\"[^\"]+\"|'[^']+'|url\\\\([^)]+\\\\)|(\\\\d*\\\\.?\\\\d+)[r|u]px`, 'g');\nfunction toFixed(number, precision) {\n const multiplier = Math.pow(10, precision + 1);\n const wholeNumber = Math.floor(number * multiplier);\n return (Math.round(wholeNumber / 10) * 10) / multiplier;\n}\nconst defaultRpx2Unit = {\n unit: 'rem',\n unitRatio: 10 / 320,\n unitPrecision: 5,\n};\nconst defaultMiniProgramRpx2Unit = {\n unit: 'rpx',\n unitRatio: 1,\n unitPrecision: 1,\n};\nconst defaultNVueRpx2Unit = defaultMiniProgramRpx2Unit;\nfunction createRpx2Unit(unit, unitRatio, unitPrecision) {\n // ignore: rpxCalcIncludeWidth\n return (val) => val.replace(unitRE, (m, $1) => {\n if (!$1) {\n return m;\n }\n if (unitRatio === 1) {\n return `${$1}${unit}`;\n }\n const value = toFixed(parseFloat($1) * unitRatio, unitPrecision);\n return value === 0 ? '0' : `${value}${unit}`;\n });\n}\n\nfunction passive(passive) {\n return { passive };\n}\nfunction normalizeDataset(el) {\n // TODO\n return JSON.parse(JSON.stringify(el.dataset || {}));\n}\nfunction normalizeTarget(el) {\n const { id, offsetTop, offsetLeft } = el;\n return {\n id,\n dataset: getCustomDataset(el),\n offsetTop,\n offsetLeft,\n };\n}\nfunction addFont(family, source, desc) {\n const fonts = document.fonts;\n if (fonts) {\n const fontFace = new FontFace(family, source, desc);\n return fontFace.load().then(() => {\n fonts.add && fonts.add(fontFace);\n });\n }\n return new Promise((resolve) => {\n const style = document.createElement('style');\n const values = [];\n if (desc) {\n const { style, weight, stretch, unicodeRange, variant, featureSettings } = desc;\n style && values.push(`font-style:${style}`);\n weight && values.push(`font-weight:${weight}`);\n stretch && values.push(`font-stretch:${stretch}`);\n unicodeRange && values.push(`unicode-range:${unicodeRange}`);\n variant && values.push(`font-variant:${variant}`);\n featureSettings && values.push(`font-feature-settings:${featureSettings}`);\n }\n style.innerText = `@font-face{font-family:\"${family}\";src:${source};${values.join(';')}}`;\n document.head.appendChild(style);\n resolve();\n });\n}\nfunction scrollTo(scrollTop, duration, isH5) {\n if (isString(scrollTop)) {\n const el = document.querySelector(scrollTop);\n if (el) {\n const { top } = el.getBoundingClientRect();\n scrollTop = top + window.pageYOffset;\n // 如果存在,减去 高度\n const pageHeader = document.querySelector('uni-page-head');\n if (pageHeader) {\n scrollTop -= pageHeader.offsetHeight;\n }\n }\n }\n if (scrollTop < 0) {\n scrollTop = 0;\n }\n const documentElement = document.documentElement;\n const { clientHeight, scrollHeight } = documentElement;\n scrollTop = Math.min(scrollTop, scrollHeight - clientHeight);\n if (duration === 0) {\n // 部分浏览器(比如微信)中 scrollTop 的值需要通过 document.body 来控制\n documentElement.scrollTop = document.body.scrollTop = scrollTop;\n return;\n }\n if (window.scrollY === scrollTop) {\n return;\n }\n const scrollTo = (duration) => {\n if (duration <= 0) {\n window.scrollTo(0, scrollTop);\n return;\n }\n const distaince = scrollTop - window.scrollY;\n requestAnimationFrame(function () {\n window.scrollTo(0, window.scrollY + (distaince / duration) * 10);\n scrollTo(duration - 10);\n });\n };\n scrollTo(duration);\n}\n\nconst encode = encodeURIComponent;\nfunction stringifyQuery(obj, encodeStr = encode) {\n const res = obj\n ? Object.keys(obj)\n .map((key) => {\n let val = obj[key];\n if (typeof val === undefined || val === null) {\n val = '';\n }\n else if (isPlainObject(val)) {\n val = JSON.stringify(val);\n }\n return encodeStr(key) + '=' + encodeStr(val);\n })\n .filter((x) => x.length > 0)\n .join('&')\n : null;\n return res ? `?${res}` : '';\n}\n/**\n * Decode text using `decodeURIComponent`. Returns the original text if it\n * fails.\n *\n * @param text - string to decode\n * @returns decoded string\n */\nfunction decode(text) {\n try {\n return decodeURIComponent('' + text);\n }\n catch (err) { }\n return '' + text;\n}\nfunction decodedQuery(query = {}) {\n const decodedQuery = {};\n Object.keys(query).forEach((name) => {\n try {\n decodedQuery[name] = decode(query[name]);\n }\n catch (e) {\n decodedQuery[name] = query[name];\n }\n });\n return decodedQuery;\n}\nconst PLUS_RE = /\\+/g; // %2B\n/**\n * https://github.com/vuejs/vue-router-next/blob/master/src/query.ts\n * @internal\n *\n * @param search - search string to parse\n * @returns a query object\n */\nfunction parseQuery(search) {\n const query = {};\n // avoid creating an object with an empty key and empty value\n // because of split('&')\n if (search === '' || search === '?')\n return query;\n const hasLeadingIM = search[0] === '?';\n const searchParams = (hasLeadingIM ? search.slice(1) : search).split('&');\n for (let i = 0; i < searchParams.length; ++i) {\n // pre decode the + into space\n const searchParam = searchParams[i].replace(PLUS_RE, ' ');\n // allow the = character\n let eqPos = searchParam.indexOf('=');\n let key = decode(eqPos < 0 ? searchParam : searchParam.slice(0, eqPos));\n let value = eqPos < 0 ? null : decode(searchParam.slice(eqPos + 1));\n if (key in query) {\n // an extra variable for ts types\n let currentValue = query[key];\n if (!isArray(currentValue)) {\n currentValue = query[key] = [currentValue];\n }\n currentValue.push(value);\n }\n else {\n query[key] = value;\n }\n }\n return query;\n}\n\nfunction parseUrl(url) {\n const [path, querystring] = url.split('?', 2);\n return {\n path,\n query: parseQuery(querystring || ''),\n };\n}\n\nfunction parseNVueDataset(attr) {\n const dataset = {};\n if (attr) {\n Object.keys(attr).forEach((key) => {\n if (key.indexOf('data-') === 0) {\n dataset[key.replace('data-', '')] = attr[key];\n }\n });\n }\n return dataset;\n}\n\nfunction plusReady(callback) {\n if (!isFunction(callback)) {\n return;\n }\n if (window.plus) {\n return callback();\n }\n document.addEventListener('plusready', callback);\n}\n\nclass DOMException extends Error {\n constructor(message) {\n super(message);\n this.name = 'DOMException';\n }\n}\n\nfunction normalizeEventType(type, options) {\n if (options) {\n if (options.capture) {\n type += 'Capture';\n }\n if (options.once) {\n type += 'Once';\n }\n if (options.passive) {\n type += 'Passive';\n }\n }\n return `on${capitalize(camelize(type))}`;\n}\nclass UniEvent {\n constructor(type, opts) {\n this.defaultPrevented = false;\n this.timeStamp = Date.now();\n this._stop = false;\n this._end = false;\n this.type = type;\n this.bubbles = !!opts.bubbles;\n this.cancelable = !!opts.cancelable;\n }\n preventDefault() {\n this.defaultPrevented = true;\n }\n stopImmediatePropagation() {\n this._end = this._stop = true;\n }\n stopPropagation() {\n this._stop = true;\n }\n}\nfunction createUniEvent(evt) {\n if (evt instanceof UniEvent) {\n return evt;\n }\n const [type] = parseEventName(evt.type);\n const uniEvent = new UniEvent(type, {\n bubbles: false,\n cancelable: false,\n });\n extend(uniEvent, evt);\n return uniEvent;\n}\nclass UniEventTarget {\n constructor() {\n this.listeners = Object.create(null);\n }\n dispatchEvent(evt) {\n const listeners = this.listeners[evt.type];\n if (!listeners) {\n if ((process.env.NODE_ENV !== 'production')) {\n console.error(formatLog('dispatchEvent', this.nodeId), evt.type, 'not found');\n }\n return false;\n }\n // 格式化事件类型\n const event = createUniEvent(evt);\n const len = listeners.length;\n for (let i = 0; i < len; i++) {\n listeners[i].call(this, event);\n if (event._end) {\n break;\n }\n }\n return event.cancelable && event.defaultPrevented;\n }\n addEventListener(type, listener, options) {\n type = normalizeEventType(type, options);\n (this.listeners[type] || (this.listeners[type] = [])).push(listener);\n }\n removeEventListener(type, callback, options) {\n type = normalizeEventType(type, options);\n const listeners = this.listeners[type];\n if (!listeners) {\n return;\n }\n const index = listeners.indexOf(callback);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n }\n}\nconst optionsModifierRE = /(?:Once|Passive|Capture)$/;\nfunction parseEventName(name) {\n let options;\n if (optionsModifierRE.test(name)) {\n options = {};\n let m;\n while ((m = name.match(optionsModifierRE))) {\n name = name.slice(0, name.length - m[0].length);\n options[m[0].toLowerCase()] = true;\n }\n }\n return [hyphenate(name.slice(2)), options];\n}\n\nconst EventModifierFlags = /*#__PURE__*/ (() => {\n return {\n stop: 1,\n prevent: 1 << 1,\n self: 1 << 2,\n };\n})();\nfunction encodeModifier(modifiers) {\n let flag = 0;\n if (modifiers.includes('stop')) {\n flag |= EventModifierFlags.stop;\n }\n if (modifiers.includes('prevent')) {\n flag |= EventModifierFlags.prevent;\n }\n if (modifiers.includes('self')) {\n flag |= EventModifierFlags.self;\n }\n return flag;\n}\n\nconst NODE_TYPE_PAGE = 0;\nconst NODE_TYPE_ELEMENT = 1;\nconst NODE_TYPE_TEXT = 3;\nconst NODE_TYPE_COMMENT = 8;\nfunction sibling(node, type) {\n const { parentNode } = node;\n if (!parentNode) {\n return null;\n }\n const { childNodes } = parentNode;\n return childNodes[childNodes.indexOf(node) + (type === 'n' ? 1 : -1)] || null;\n}\nfunction removeNode(node) {\n const { parentNode } = node;\n if (parentNode) {\n const { childNodes } = parentNode;\n const index = childNodes.indexOf(node);\n if (index > -1) {\n node.parentNode = null;\n childNodes.splice(index, 1);\n }\n }\n}\nfunction checkNodeId(node) {\n if (!node.nodeId && node.pageNode) {\n node.nodeId = node.pageNode.genId();\n }\n}\n// 为优化性能,各平台不使用proxy来实现node的操作拦截,而是直接通过pageNode定制\nclass UniNode extends UniEventTarget {\n constructor(nodeType, nodeName, container) {\n super();\n this.pageNode = null;\n this.parentNode = null;\n this._text = null;\n if (container) {\n const { pageNode } = container;\n if (pageNode) {\n this.pageNode = pageNode;\n this.nodeId = pageNode.genId();\n !pageNode.isUnmounted && pageNode.onCreate(this, nodeName);\n }\n }\n this.nodeType = nodeType;\n this.nodeName = nodeName;\n this.childNodes = [];\n }\n get firstChild() {\n return this.childNodes[0] || null;\n }\n get lastChild() {\n const { childNodes } = this;\n const length = childNodes.length;\n return length ? childNodes[length - 1] : null;\n }\n get nextSibling() {\n return sibling(this, 'n');\n }\n get nodeValue() {\n return null;\n }\n set nodeValue(_val) { }\n get textContent() {\n return this._text || '';\n }\n set textContent(text) {\n this._text = text;\n if (this.pageNode && !this.pageNode.isUnmounted) {\n this.pageNode.onTextContent(this, text);\n }\n }\n get parentElement() {\n const { parentNode } = this;\n if (parentNode && parentNode.nodeType === NODE_TYPE_ELEMENT) {\n return parentNode;\n }\n return null;\n }\n get previousSibling() {\n return sibling(this, 'p');\n }\n appendChild(newChild) {\n return this.insertBefore(newChild, null);\n }\n cloneNode(deep) {\n const cloned = extend(Object.create(Object.getPrototypeOf(this)), this);\n const { attributes } = cloned;\n if (attributes) {\n cloned.attributes = extend({}, attributes);\n }\n if (deep) {\n cloned.childNodes = cloned.childNodes.map((childNode) => childNode.cloneNode(true));\n }\n return cloned;\n }\n insertBefore(newChild, refChild) {\n // 先从现在的父节点移除(注意:不能触发onRemoveChild,否则会生成先remove该 id,再 insert)\n removeNode(newChild);\n newChild.pageNode = this.pageNode;\n newChild.parentNode = this;\n checkNodeId(newChild);\n const { childNodes } = this;\n if (refChild) {\n const index = childNodes.indexOf(refChild);\n if (index === -1) {\n throw new DOMException(`Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.`);\n }\n childNodes.splice(index, 0, newChild);\n }\n else {\n childNodes.push(newChild);\n }\n return this.pageNode && !this.pageNode.isUnmounted\n ? this.pageNode.onInsertBefore(this, newChild, refChild)\n : newChild;\n }\n removeChild(oldChild) {\n const { childNodes } = this;\n const index = childNodes.indexOf(oldChild);\n if (index === -1) {\n throw new DOMException(`Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.`);\n }\n oldChild.parentNode = null;\n childNodes.splice(index, 1);\n return this.pageNode && !this.pageNode.isUnmounted\n ? this.pageNode.onRemoveChild(oldChild)\n : oldChild;\n }\n}\nconst ATTR_CLASS = 'class';\nconst ATTR_STYLE = 'style';\nconst ATTR_INNER_HTML = 'innerHTML';\nconst ATTR_TEXT_CONTENT = 'textContent';\nconst ATTR_V_SHOW = '.vShow';\nconst ATTR_V_OWNER_ID = '.vOwnerId';\nconst ATTR_V_RENDERJS = '.vRenderjs';\nconst ATTR_CHANGE_PREFIX = 'change:';\nclass UniBaseNode extends UniNode {\n constructor(nodeType, nodeName, container) {\n super(nodeType, nodeName, container);\n this.attributes = Object.create(null);\n this.style = null;\n this.vShow = null;\n this._html = null;\n }\n get className() {\n return (this.attributes[ATTR_CLASS] || '');\n }\n set className(val) {\n this.setAttribute(ATTR_CLASS, val);\n }\n get innerHTML() {\n return '';\n }\n set innerHTML(html) {\n this._html = html;\n }\n addEventListener(type, listener, options) {\n super.addEventListener(type, listener, options);\n if (this.pageNode && !this.pageNode.isUnmounted) {\n if (listener.wxsEvent) {\n this.pageNode.onAddWxsEvent(this, normalizeEventType(type, options), listener.wxsEvent, encodeModifier(listener.modifiers || []));\n }\n else {\n this.pageNode.onAddEvent(this, normalizeEventType(type, options), encodeModifier(listener.modifiers || []));\n }\n }\n }\n removeEventListener(type, callback, options) {\n super.removeEventListener(type, callback, options);\n if (this.pageNode && !this.pageNode.isUnmounted) {\n this.pageNode.onRemoveEvent(this, normalizeEventType(type, options));\n }\n }\n getAttribute(qualifiedName) {\n if (qualifiedName === ATTR_STYLE) {\n return this.style;\n }\n return this.attributes[qualifiedName];\n }\n removeAttribute(qualifiedName) {\n if (qualifiedName == ATTR_STYLE) {\n this.style = null;\n }\n else {\n delete this.attributes[qualifiedName];\n }\n if (this.pageNode && !this.pageNode.isUnmounted) {\n this.pageNode.onRemoveAttribute(this, qualifiedName);\n }\n }\n setAttribute(qualifiedName, value) {\n if (qualifiedName === ATTR_STYLE) {\n this.style = value;\n }\n else {\n this.attributes[qualifiedName] = value;\n }\n if (this.pageNode && !this.pageNode.isUnmounted) {\n this.pageNode.onSetAttribute(this, qualifiedName, value);\n }\n }\n toJSON({ attr, normalize, } = {}) {\n const { attributes, style, listeners, _text } = this;\n const res = {};\n if (Object.keys(attributes).length) {\n res.a = normalize ? normalize(attributes) : attributes;\n }\n const events = Object.keys(listeners);\n if (events.length) {\n let w = undefined;\n const e = {};\n events.forEach((name) => {\n const handlers = listeners[name];\n if (handlers.length) {\n // 可能存在多个 handler 且不同 modifiers 吗?\n const { wxsEvent, modifiers } = handlers[0];\n const modifier = encodeModifier(modifiers || []);\n if (!wxsEvent) {\n e[name] = modifier;\n }\n else {\n if (!w) {\n w = {};\n }\n w[name] = [normalize ? normalize(wxsEvent) : wxsEvent, modifier];\n }\n }\n });\n res.e = normalize ? normalize(e, false) : e;\n if (w) {\n res.w = normalize ? normalize(w, false) : w;\n }\n }\n if (style !== null) {\n res.s = normalize ? normalize(style) : style;\n }\n if (!attr) {\n res.i = this.nodeId;\n res.n = this.nodeName;\n }\n if (_text !== null) {\n res.t = normalize ? normalize(_text) : _text;\n }\n return res;\n }\n}\n\nclass UniCommentNode extends UniNode {\n constructor(text, container) {\n super(NODE_TYPE_COMMENT, '#comment', container);\n this._text = (process.env.NODE_ENV !== 'production') ? text : '';\n }\n toJSON(opts = {}) {\n // 暂时不传递 text 到 view 层,没啥意义,节省点数据量\n return opts.attr\n ? {}\n : {\n i: this.nodeId,\n };\n // return opts.attr\n // ? { t: this._text as string }\n // : {\n // i: this.nodeId!,\n // t: this._text as string,\n // }\n }\n}\n\nclass UniElement extends UniBaseNode {\n constructor(nodeName, container) {\n super(NODE_TYPE_ELEMENT, nodeName.toUpperCase(), container);\n this.tagName = this.nodeName;\n }\n}\nclass UniInputElement extends UniElement {\n get value() {\n return this.getAttribute('value');\n }\n set value(val) {\n this.setAttribute('value', val);\n }\n}\nclass UniTextAreaElement extends UniInputElement {\n}\n\nclass UniTextNode extends UniBaseNode {\n constructor(text, container) {\n super(NODE_TYPE_TEXT, '#text', container);\n this._text = text;\n }\n get nodeValue() {\n return this._text || '';\n }\n set nodeValue(text) {\n this._text = text;\n if (this.pageNode && !this.pageNode.isUnmounted) {\n this.pageNode.onNodeValue(this, text);\n }\n }\n}\n\nconst forcePatchProps = {\n AD: ['data'],\n 'AD-DRAW': ['data'],\n 'LIVE-PLAYER': ['picture-in-picture-mode'],\n MAP: [\n 'markers',\n 'polyline',\n 'circles',\n 'controls',\n 'include-points',\n 'polygons',\n ],\n PICKER: ['range', 'value'],\n 'PICKER-VIEW': ['value'],\n 'RICH-TEXT': ['nodes'],\n VIDEO: ['danmu-list', 'header'],\n 'WEB-VIEW': ['webview-styles'],\n};\nconst forcePatchPropKeys = ['animation'];\n\nconst forcePatchProp = (el, key) => {\n if (forcePatchPropKeys.indexOf(key) > -1) {\n return true;\n }\n const keys = forcePatchProps[el.nodeName];\n if (keys && keys.indexOf(key) > -1) {\n return true;\n }\n return false;\n};\n\nconst ACTION_TYPE_PAGE_CREATE = 1;\nconst ACTION_TYPE_PAGE_CREATED = 2;\nconst ACTION_TYPE_CREATE = 3;\nconst ACTION_TYPE_INSERT = 4;\nconst ACTION_TYPE_REMOVE = 5;\nconst ACTION_TYPE_SET_ATTRIBUTE = 6;\nconst ACTION_TYPE_REMOVE_ATTRIBUTE = 7;\nconst ACTION_TYPE_ADD_EVENT = 8;\nconst ACTION_TYPE_REMOVE_EVENT = 9;\nconst ACTION_TYPE_SET_TEXT = 10;\nconst ACTION_TYPE_ADD_WXS_EVENT = 12;\nconst ACTION_TYPE_PAGE_SCROLL = 15;\nconst ACTION_TYPE_EVENT = 20;\n\n/**\n * 需要手动传入 timer,主要是解决 App 平台的定制 timer\n */\nfunction debounce(fn, delay, { clearTimeout, setTimeout }) {\n let timeout;\n const newFn = function () {\n clearTimeout(timeout);\n const timerFn = () => fn.apply(this, arguments);\n timeout = setTimeout(timerFn, delay);\n };\n newFn.cancel = function () {\n clearTimeout(timeout);\n };\n return newFn;\n}\n\nclass EventChannel {\n constructor(id, events) {\n this.id = id;\n this.listener = {};\n this.emitCache = [];\n if (events) {\n Object.keys(events).forEach((name) => {\n this.on(name, events[name]);\n });\n }\n }\n emit(eventName, ...args) {\n const fns = this.listener[eventName];\n if (!fns) {\n return this.emitCache.push({\n eventName,\n args,\n });\n }\n fns.forEach((opt) => {\n opt.fn.apply(opt.fn, args);\n });\n this.listener[eventName] = fns.filter((opt) => opt.type !== 'once');\n }\n on(eventName, fn) {\n this._addListener(eventName, 'on', fn);\n this._clearCache(eventName);\n }\n once(eventName, fn) {\n this._addListener(eventName, 'once', fn);\n this._clearCache(eventName);\n }\n off(eventName, fn) {\n const fns = this.listener[eventName];\n if (!fns) {\n return;\n }\n if (fn) {\n for (let i = 0; i < fns.length;) {\n if (fns[i].fn === fn) {\n fns.splice(i, 1);\n i--;\n }\n i++;\n }\n }\n else {\n delete this.listener[eventName];\n }\n }\n _clearCache(eventName) {\n for (let index = 0; index < this.emitCache.length; index++) {\n const cache = this.emitCache[index];\n const _name = eventName\n ? cache.eventName === eventName\n ? eventName\n : null\n : cache.eventName;\n if (!_name)\n continue;\n const location = this.emit.apply(this, [_name, ...cache.args]);\n if (typeof location === 'number') {\n this.emitCache.pop();\n continue;\n }\n this.emitCache.splice(index, 1);\n index--;\n }\n }\n _addListener(eventName, type, fn) {\n (this.listener[eventName] || (this.listener[eventName] = [])).push({\n fn,\n type,\n });\n }\n}\n\nconst PAGE_HOOKS = [\n ON_INIT,\n ON_LOAD,\n ON_SHOW,\n ON_HIDE,\n ON_UNLOAD,\n ON_BACK_PRESS,\n ON_PAGE_SCROLL,\n ON_TAB_ITEM_TAP,\n ON_REACH_BOTTOM,\n ON_PULL_DOWN_REFRESH,\n ON_SHARE_TIMELINE,\n ON_SHARE_APP_MESSAGE,\n ON_SHARE_CHAT,\n ON_ADD_TO_FAVORITES,\n ON_SAVE_EXIT_STATE,\n ON_NAVIGATION_BAR_BUTTON_TAP,\n ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED,\n ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED,\n ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED,\n ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED,\n];\nfunction isRootImmediateHook(name) {\n const PAGE_SYNC_HOOKS = [ON_LOAD, ON_SHOW];\n return PAGE_SYNC_HOOKS.indexOf(name) > -1;\n}\n// isRootImmediateHookX deprecated\nfunction isRootHook(name) {\n return PAGE_HOOKS.indexOf(name) > -1;\n}\nconst UniLifecycleHooks = [\n ON_SHOW,\n ON_HIDE,\n ON_LAUNCH,\n ON_ERROR,\n ON_THEME_CHANGE,\n ON_PAGE_NOT_FOUND,\n ON_UNHANDLE_REJECTION,\n ON_EXIT,\n ON_INIT,\n ON_LOAD,\n ON_READY,\n ON_UNLOAD,\n ON_RESIZE,\n ON_BACK_PRESS,\n ON_PAGE_SCROLL,\n ON_TAB_ITEM_TAP,\n ON_REACH_BOTTOM,\n ON_PULL_DOWN_REFRESH,\n ON_SHARE_TIMELINE,\n ON_ADD_TO_FAVORITES,\n ON_SHARE_APP_MESSAGE,\n ON_SHARE_CHAT,\n ON_SAVE_EXIT_STATE,\n ON_NAVIGATION_BAR_BUTTON_TAP,\n ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED,\n ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED,\n ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED,\n ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED,\n];\nconst MINI_PROGRAM_PAGE_RUNTIME_HOOKS = /*#__PURE__*/ (() => {\n return {\n onPageScroll: 1,\n onShareAppMessage: 1 << 1,\n onShareTimeline: 1 << 2,\n };\n})();\nfunction isUniLifecycleHook(name, value, checkType = true) {\n // 检查类型\n if (checkType && !isFunction(value)) {\n return false;\n }\n if (UniLifecycleHooks.indexOf(name) > -1) {\n // 已预定义\n return true;\n }\n else if (name.indexOf('on') === 0) {\n // 以 on 开头\n return true;\n }\n return false;\n}\n\nlet vueApp;\nconst createVueAppHooks = [];\n/**\n * 提供 createApp 的回调事件,方便三方插件接收 App 对象,处理挂靠全局 mixin 之类的逻辑\n */\nfunction onCreateVueApp(hook) {\n // TODO 每个 nvue 页面都会触发\n if (vueApp) {\n return hook(vueApp);\n }\n createVueAppHooks.push(hook);\n}\nfunction invokeCreateVueAppHook(app) {\n vueApp = app;\n createVueAppHooks.forEach((hook) => hook(app));\n}\nconst invokeCreateErrorHandler = once((app, createErrorHandler) => {\n // 不再判断开发者是否监听了onError,直接返回 createErrorHandler,内部 errorHandler 会调用开发者自定义的 errorHandler,以及判断开发者是否监听了onError\n return createErrorHandler(app);\n});\n\nconst E = function () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n};\nE.prototype = {\n _id: 1,\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx,\n _id: this._id,\n });\n return this._id++;\n },\n once: function (name, callback, ctx) {\n var self = this;\n function listener() {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n }\n listener._ = callback;\n return this.on(name, listener, ctx);\n },\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n return this;\n },\n off: function (name, event) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n if (evts && event) {\n for (var i = evts.length - 1; i >= 0; i--) {\n if (evts[i].fn === event ||\n evts[i].fn._ === event ||\n evts[i]._id === event) {\n evts.splice(i, 1);\n break;\n }\n }\n liveEvents = evts;\n }\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n liveEvents.length ? (e[name] = liveEvents) : delete e[name];\n return this;\n },\n};\nvar E$1 = E;\n\nconst borderStyles = {\n black: 'rgba(0,0,0,0.4)',\n white: 'rgba(255,255,255,0.4)',\n};\nfunction normalizeTabBarStyles(borderStyle) {\n if (borderStyle && borderStyle in borderStyles) {\n return borderStyles[borderStyle];\n }\n return borderStyle;\n}\nfunction normalizeTitleColor(titleColor) {\n return titleColor === 'black' ? '#000000' : '#ffffff';\n}\nfunction resolveStringStyleItem(modeStyle, styleItem, key) {\n if (isString(styleItem) && styleItem.startsWith('@')) {\n const _key = styleItem.replace('@', '');\n let _styleItem = modeStyle[_key] || styleItem;\n switch (key) {\n case 'titleColor':\n _styleItem = normalizeTitleColor(_styleItem);\n break;\n case 'borderStyle':\n _styleItem = normalizeTabBarStyles(_styleItem);\n break;\n }\n return _styleItem;\n }\n return styleItem;\n}\nfunction normalizeStyles(pageStyle, themeConfig = {}, mode = 'light') {\n const modeStyle = themeConfig[mode];\n const styles = {};\n if (typeof modeStyle === 'undefined' || !pageStyle)\n return pageStyle;\n Object.keys(pageStyle).forEach((key) => {\n const styleItem = pageStyle[key]; // Object Array String\n const parseStyleItem = () => {\n if (isPlainObject(styleItem))\n return normalizeStyles(styleItem, themeConfig, mode);\n if (isArray(styleItem))\n return styleItem.map((item) => {\n if (isPlainObject(item))\n return normalizeStyles(item, themeConfig, mode);\n return resolveStringStyleItem(modeStyle, item);\n });\n return resolveStringStyleItem(modeStyle, styleItem, key);\n };\n styles[key] = parseStyleItem();\n });\n return styles;\n}\n\nfunction getEnvLocale() {\n const { env } = process;\n const lang = env.LC_ALL || env.LC_MESSAGES || env.LANG || env.LANGUAGE;\n return (lang && lang.replace(/[.:].*/, '')) || 'en';\n}\n\nconst isStringIntegerKey = (key) => typeof key === 'string' &&\n key !== 'NaN' &&\n key[0] !== '-' &&\n '' + parseInt(key, 10) === key;\nconst isNumberIntegerKey = (key) => typeof key === 'number' &&\n !isNaN(key) &&\n key >= 0 &&\n parseInt(key + '', 10) === key;\n/**\n * 用于替代@vue/shared的isIntegerKey,原始方法在鸿蒙arkts中会引发bug。根本原因是arkts的数组的key是数字而不是字符串。\n * 目前这个方法使用的地方都和数组有关,切记不能挪作他用。\n * @param key\n * @returns\n */\nconst isIntegerKey = (key) => isNumberIntegerKey(key) || isStringIntegerKey(key);\n\nexport { ACTION_TYPE_ADD_EVENT, ACTION_TYPE_ADD_WXS_EVENT, ACTION_TYPE_CREATE, ACTION_TYPE_EVENT, ACTION_TYPE_INSERT, ACTION_TYPE_PAGE_CREATE, ACTION_TYPE_PAGE_CREATED, ACTION_TYPE_PAGE_SCROLL, ACTION_TYPE_REMOVE, ACTION_TYPE_REMOVE_ATTRIBUTE, ACTION_TYPE_REMOVE_EVENT, ACTION_TYPE_SET_ATTRIBUTE, ACTION_TYPE_SET_TEXT, ATTR_CHANGE_PREFIX, ATTR_CLASS, ATTR_INNER_HTML, ATTR_STYLE, ATTR_TEXT_CONTENT, ATTR_V_OWNER_ID, ATTR_V_RENDERJS, ATTR_V_SHOW, BACKGROUND_COLOR, BUILT_IN_TAGS, BUILT_IN_TAG_NAMES, COMPONENT_NAME_PREFIX, COMPONENT_PREFIX, COMPONENT_SELECTOR_PREFIX, DATA_RE, E$1 as Emitter, EventChannel, EventModifierFlags, I18N_JSON_DELIMITERS, JSON_PROTOCOL, LINEFEED, MINI_PROGRAM_PAGE_RUNTIME_HOOKS, NAVBAR_HEIGHT, NODE_TYPE_COMMENT, NODE_TYPE_ELEMENT, NODE_TYPE_PAGE, NODE_TYPE_TEXT, NVUE_BUILT_IN_TAGS, NVUE_U_BUILT_IN_TAGS, OFF_HOST_THEME_CHANGE, OFF_THEME_CHANGE, ON_ADD_TO_FAVORITES, ON_APP_ENTER_BACKGROUND, ON_APP_ENTER_FOREGROUND, ON_BACK_PRESS, ON_ERROR, ON_EXIT, ON_HIDE, ON_HOST_THEME_CHANGE, ON_INIT, ON_KEYBOARD_HEIGHT_CHANGE, ON_LAUNCH, ON_LOAD, ON_NAVIGATION_BAR_BUTTON_TAP, ON_NAVIGATION_BAR_CHANGE, ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED, ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED, ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED, ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED, ON_PAGE_NOT_FOUND, ON_PAGE_SCROLL, ON_PULL_DOWN_REFRESH, ON_REACH_BOTTOM, ON_REACH_BOTTOM_DISTANCE, ON_READY, ON_RESIZE, ON_SAVE_EXIT_STATE, ON_SHARE_APP_MESSAGE, ON_SHARE_CHAT, ON_SHARE_TIMELINE, ON_SHOW, ON_TAB_ITEM_TAP, ON_THEME_CHANGE, ON_UNHANDLE_REJECTION, ON_UNLOAD, ON_WEB_INVOKE_APP_SERVICE, ON_WXS_INVOKE_CALL_METHOD, PLUS_RE, PRIMARY_COLOR, RENDERJS_MODULES, RESPONSIVE_MIN_WIDTH, SCHEME_RE, SELECTED_COLOR, SLOT_DEFAULT_NAME, TABBAR_HEIGHT, TAGS, UNI_SSR, UNI_SSR_DATA, UNI_SSR_GLOBAL_DATA, UNI_SSR_STORE, UNI_SSR_TITLE, UNI_STORAGE_LOCALE, UNI_UI_CONFLICT_TAGS, UVUE_BUILT_IN_TAGS, UVUE_HARMONY_BUILT_IN_TAGS, UVUE_IOS_BUILT_IN_TAGS, UVUE_WEB_BUILT_IN_TAGS, UniBaseNode, UniCommentNode, UniElement, UniEvent, UniInputElement, UniLifecycleHooks, UniNode, UniTextAreaElement, UniTextNode, VIRTUAL_HOST_CLASS, VIRTUAL_HOST_HIDDEN, VIRTUAL_HOST_ID, VIRTUAL_HOST_STYLE, WEB_INVOKE_APPSERVICE, WXS_MODULES, WXS_PROTOCOL, addFont, addLeadingSlash, borderStyles, cache, cacheStringFunction, callOptions, createIsCustomElement, createRpx2Unit, createUniEvent, customizeEvent, debounce, decode, decodedQuery, defaultMiniProgramRpx2Unit, defaultNVueRpx2Unit, defaultRpx2Unit, dynamicSlotName, forcePatchProp, formatDateTime, formatLog, getCustomDataset, getEnvLocale, getGlobal, getLen, getValueByDataPath, initCustomDatasetOnce, invokeArrayFns, invokeCreateErrorHandler, invokeCreateVueAppHook, isAppHarmonyUVueNativeTag, isAppIOSUVueNativeTag, isAppNVueNativeTag, isAppNativeTag, isAppUVueBuiltInEasyComponent, isAppUVueNativeTag, isAppVoidTag, isBuiltInComponent, isComponentInternalInstance, isComponentTag, isH5CustomElement, isH5NativeTag, isIntegerKey, isMiniProgramNativeTag, isMiniProgramUVueNativeTag, isRootHook, isRootImmediateHook, isUniLifecycleHook, isUniXElement, normalizeClass, normalizeDataset, normalizeEventType, normalizeProps, normalizeStyle, normalizeStyles, normalizeTabBarStyles, normalizeTarget, normalizeTitleColor, onCreateVueApp, once, parseEventName, parseNVueDataset, parseQuery, parseUrl, passive, plusReady, removeLeadingSlash, resolveComponentInstance, resolveOwnerEl, resolveOwnerVm, sanitise, scrollTo, sortObject, stringifyQuery, updateElementStyle };\n","import { isRootHook, getValueByDataPath, isUniLifecycleHook, ON_ERROR, UniLifecycleHooks, invokeCreateErrorHandler, dynamicSlotName } from '@dcloudio/uni-shared';\nimport { NOOP, extend, isSymbol, isObject, def, hasChanged, isFunction, isArray, isPromise, camelize, capitalize, EMPTY_OBJ, remove, toHandlerKey, hasOwn, hyphenate, isReservedProp, toRawType, isString, normalizeClass, normalizeStyle, isOn, toTypeString, isMap, isIntegerKey, isSet, isPlainObject, makeMap, invokeArrayFns, isBuiltInDirective, looseToNumber, NO, EMPTY_ARR, isModelListener, toNumber, toDisplayString } from '@vue/shared';\nexport { EMPTY_OBJ, camelize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared';\n\n/**\n* @dcloudio/uni-mp-vue v3.4.21\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n\nfunction warn$2(msg, ...args) {\n console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n constructor(detached = false) {\n this.detached = detached;\n /**\n * @internal\n */\n this._active = true;\n /**\n * @internal\n */\n this.effects = [];\n /**\n * @internal\n */\n this.cleanups = [];\n this.parent = activeEffectScope;\n if (!detached && activeEffectScope) {\n this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n this\n ) - 1;\n }\n }\n get active() {\n return this._active;\n }\n run(fn) {\n if (this._active) {\n const currentEffectScope = activeEffectScope;\n try {\n activeEffectScope = this;\n return fn();\n } finally {\n activeEffectScope = currentEffectScope;\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$2(`cannot run an inactive effect scope.`);\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n on() {\n activeEffectScope = this;\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n off() {\n activeEffectScope = this.parent;\n }\n stop(fromParent) {\n if (this._active) {\n let i, l;\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].stop();\n }\n for (i = 0, l = this.cleanups.length; i < l; i++) {\n this.cleanups[i]();\n }\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].stop(true);\n }\n }\n if (!this.detached && this.parent && !fromParent) {\n const last = this.parent.scopes.pop();\n if (last && last !== this) {\n this.parent.scopes[this.index] = last;\n last.index = this.index;\n }\n }\n this.parent = void 0;\n this._active = false;\n }\n }\n}\nfunction effectScope(detached) {\n return new EffectScope(detached);\n}\nfunction recordEffectScope(effect, scope = activeEffectScope) {\n if (scope && scope.active) {\n scope.effects.push(effect);\n }\n}\nfunction getCurrentScope() {\n return activeEffectScope;\n}\nfunction onScopeDispose(fn) {\n if (activeEffectScope) {\n activeEffectScope.cleanups.push(fn);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$2(\n `onScopeDispose() is called when there is no active effect scope to be associated with.`\n );\n }\n}\n\nlet activeEffect;\nclass ReactiveEffect {\n constructor(fn, trigger, scheduler, scope) {\n this.fn = fn;\n this.trigger = trigger;\n this.scheduler = scheduler;\n this.active = true;\n this.deps = [];\n /**\n * @internal\n */\n this._dirtyLevel = 4;\n /**\n * @internal\n */\n this._trackId = 0;\n /**\n * @internal\n */\n this._runnings = 0;\n /**\n * @internal\n */\n this._shouldSchedule = false;\n /**\n * @internal\n */\n this._depsLength = 0;\n recordEffectScope(this, scope);\n }\n get dirty() {\n if (this._dirtyLevel === 2 || this._dirtyLevel === 3) {\n this._dirtyLevel = 1;\n pauseTracking();\n for (let i = 0; i < this._depsLength; i++) {\n const dep = this.deps[i];\n if (dep.computed) {\n triggerComputed(dep.computed);\n if (this._dirtyLevel >= 4) {\n break;\n }\n }\n }\n if (this._dirtyLevel === 1) {\n this._dirtyLevel = 0;\n }\n resetTracking();\n }\n return this._dirtyLevel >= 4;\n }\n set dirty(v) {\n this._dirtyLevel = v ? 4 : 0;\n }\n run() {\n this._dirtyLevel = 0;\n if (!this.active) {\n return this.fn();\n }\n let lastShouldTrack = shouldTrack;\n let lastEffect = activeEffect;\n try {\n shouldTrack = true;\n activeEffect = this;\n this._runnings++;\n preCleanupEffect(this);\n return this.fn();\n } finally {\n postCleanupEffect(this);\n this._runnings--;\n activeEffect = lastEffect;\n shouldTrack = lastShouldTrack;\n }\n }\n stop() {\n var _a;\n if (this.active) {\n preCleanupEffect(this);\n postCleanupEffect(this);\n (_a = this.onStop) == null ? void 0 : _a.call(this);\n this.active = false;\n }\n }\n}\nfunction triggerComputed(computed) {\n return computed.value;\n}\nfunction preCleanupEffect(effect2) {\n effect2._trackId++;\n effect2._depsLength = 0;\n}\nfunction postCleanupEffect(effect2) {\n if (effect2.deps.length > effect2._depsLength) {\n for (let i = effect2._depsLength; i < effect2.deps.length; i++) {\n cleanupDepEffect(effect2.deps[i], effect2);\n }\n effect2.deps.length = effect2._depsLength;\n }\n}\nfunction cleanupDepEffect(dep, effect2) {\n const trackId = dep.get(effect2);\n if (trackId !== void 0 && effect2._trackId !== trackId) {\n dep.delete(effect2);\n if (dep.size === 0) {\n dep.cleanup();\n }\n }\n}\nfunction effect(fn, options) {\n if (fn.effect instanceof ReactiveEffect) {\n fn = fn.effect.fn;\n }\n const _effect = new ReactiveEffect(fn, NOOP, () => {\n if (_effect.dirty) {\n _effect.run();\n }\n });\n if (options) {\n extend(_effect, options);\n if (options.scope)\n recordEffectScope(_effect, options.scope);\n }\n if (!options || !options.lazy) {\n _effect.run();\n }\n const runner = _effect.run.bind(_effect);\n runner.effect = _effect;\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nlet shouldTrack = true;\nlet pauseScheduleStack = 0;\nconst trackStack = [];\nfunction pauseTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = false;\n}\nfunction resetTracking() {\n const last = trackStack.pop();\n shouldTrack = last === void 0 ? true : last;\n}\nfunction pauseScheduling() {\n pauseScheduleStack++;\n}\nfunction resetScheduling() {\n pauseScheduleStack--;\n while (!pauseScheduleStack && queueEffectSchedulers.length) {\n queueEffectSchedulers.shift()();\n }\n}\nfunction trackEffect(effect2, dep, debuggerEventExtraInfo) {\n var _a;\n if (dep.get(effect2) !== effect2._trackId) {\n dep.set(effect2, effect2._trackId);\n const oldDep = effect2.deps[effect2._depsLength];\n if (oldDep !== dep) {\n if (oldDep) {\n cleanupDepEffect(oldDep, effect2);\n }\n effect2.deps[effect2._depsLength++] = dep;\n } else {\n effect2._depsLength++;\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n (_a = effect2.onTrack) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo));\n }\n }\n}\nconst queueEffectSchedulers = [];\nfunction triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) {\n var _a;\n pauseScheduling();\n for (const effect2 of dep.keys()) {\n let tracking;\n if (effect2._dirtyLevel < dirtyLevel && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) {\n effect2._shouldSchedule || (effect2._shouldSchedule = effect2._dirtyLevel === 0);\n effect2._dirtyLevel = dirtyLevel;\n }\n if (effect2._shouldSchedule && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n (_a = effect2.onTrigger) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo));\n }\n effect2.trigger();\n if ((!effect2._runnings || effect2.allowRecurse) && effect2._dirtyLevel !== 2) {\n effect2._shouldSchedule = false;\n if (effect2.scheduler) {\n queueEffectSchedulers.push(effect2.scheduler);\n }\n }\n }\n }\n resetScheduling();\n}\n\nconst createDep = (cleanup, computed) => {\n const dep = /* @__PURE__ */ new Map();\n dep.cleanup = cleanup;\n dep.computed = computed;\n return dep;\n};\n\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"iterate\" : \"\");\nconst MAP_KEY_ITERATE_KEY = Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"Map key iterate\" : \"\");\nfunction track(target, type, key) {\n if (shouldTrack && activeEffect) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n }\n let dep = depsMap.get(key);\n if (!dep) {\n depsMap.set(key, dep = createDep(() => depsMap.delete(key)));\n }\n trackEffect(\n activeEffect,\n dep,\n !!(process.env.NODE_ENV !== \"production\") ? {\n target,\n type,\n key\n } : void 0\n );\n }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n return;\n }\n let deps = [];\n if (type === \"clear\") {\n deps = [...depsMap.values()];\n } else if (key === \"length\" && isArray(target)) {\n const newLength = Number(newValue);\n depsMap.forEach((dep, key2) => {\n if (key2 === \"length\" || !isSymbol(key2) && key2 >= newLength) {\n deps.push(dep);\n }\n });\n } else {\n if (key !== void 0) {\n deps.push(depsMap.get(key));\n }\n switch (type) {\n case \"add\":\n if (!isArray(target)) {\n deps.push(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n } else if (isIntegerKey(key)) {\n deps.push(depsMap.get(\"length\"));\n }\n break;\n case \"delete\":\n if (!isArray(target)) {\n deps.push(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case \"set\":\n if (isMap(target)) {\n deps.push(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n pauseScheduling();\n for (const dep of deps) {\n if (dep) {\n triggerEffects(\n dep,\n 4,\n !!(process.env.NODE_ENV !== \"production\") ? {\n target,\n type,\n key,\n newValue,\n oldValue,\n oldTarget\n } : void 0\n );\n }\n }\n resetScheduling();\n}\nfunction getDepFromReactive(object, key) {\n var _a;\n return (_a = targetMap.get(object)) == null ? void 0 : _a.get(key);\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nconst arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations();\nfunction createArrayInstrumentations() {\n const instrumentations = {};\n [\"includes\", \"indexOf\", \"lastIndexOf\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n const arr = toRaw(this);\n for (let i = 0, l = this.length; i < l; i++) {\n track(arr, \"get\", i + \"\");\n }\n const res = arr[key](...args);\n if (res === -1 || res === false) {\n return arr[key](...args.map(toRaw));\n } else {\n return res;\n }\n };\n });\n [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\"].forEach((key) => {\n instrumentations[key] = function(...args) {\n pauseTracking();\n pauseScheduling();\n const res = toRaw(this)[key].apply(this, args);\n resetScheduling();\n resetTracking();\n return res;\n };\n });\n return instrumentations;\n}\nfunction hasOwnProperty(key) {\n const obj = toRaw(this);\n track(obj, \"has\", key);\n return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n constructor(_isReadonly = false, _isShallow = false) {\n this._isReadonly = _isReadonly;\n this._isShallow = _isShallow;\n }\n get(target, key, receiver) {\n const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_isShallow\") {\n return isShallow2;\n } else if (key === \"__v_raw\") {\n if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n // this means the reciever is a user proxy of the reactive proxy\n Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n return target;\n }\n return;\n }\n const targetIsArray = isArray(target);\n if (!isReadonly2) {\n if (targetIsArray && hasOwn(arrayInstrumentations, key)) {\n return Reflect.get(arrayInstrumentations, key, receiver);\n }\n if (key === \"hasOwnProperty\") {\n return hasOwnProperty;\n }\n }\n const res = Reflect.get(target, key, receiver);\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n return res;\n }\n if (!isReadonly2) {\n track(target, \"get\", key);\n }\n if (isShallow2) {\n return res;\n }\n if (isRef(res)) {\n return targetIsArray && isIntegerKey(key) ? res : res.value;\n }\n if (isObject(res)) {\n return isReadonly2 ? readonly(res) : reactive(res);\n }\n return res;\n }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(false, isShallow2);\n }\n set(target, key, value, receiver) {\n let oldValue = target[key];\n if (!this._isShallow) {\n const isOldValueReadonly = isReadonly(oldValue);\n if (!isShallow(value) && !isReadonly(value)) {\n oldValue = toRaw(oldValue);\n value = toRaw(value);\n }\n if (!isArray(target) && isRef(oldValue) && !isRef(value)) {\n if (isOldValueReadonly) {\n return false;\n } else {\n oldValue.value = value;\n return true;\n }\n }\n }\n const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);\n const result = Reflect.set(target, key, value, receiver);\n if (target === toRaw(receiver)) {\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n }\n return result;\n }\n deleteProperty(target, key) {\n const hadKey = hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n has(target, key) {\n const result = Reflect.has(target, key);\n if (!isSymbol(key) || !builtInSymbols.has(key)) {\n track(target, \"has\", key);\n }\n return result;\n }\n ownKeys(target) {\n track(\n target,\n \"iterate\",\n isArray(target) ? \"length\" : ITERATE_KEY\n );\n return Reflect.ownKeys(target);\n }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(true, isShallow2);\n }\n set(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$2(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n deleteProperty(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$2(\n `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(\n true\n);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction get(target, key, isReadonly = false, isShallow = false) {\n target = target[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!isReadonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"get\", key);\n }\n track(rawTarget, \"get\", rawKey);\n }\n const { has: has2 } = getProto(rawTarget);\n const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n if (has2.call(rawTarget, key)) {\n return wrap(target.get(key));\n } else if (has2.call(rawTarget, rawKey)) {\n return wrap(target.get(rawKey));\n } else if (target !== rawTarget) {\n target.get(key);\n }\n}\nfunction has(key, isReadonly = false) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!isReadonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"has\", key);\n }\n track(rawTarget, \"has\", rawKey);\n }\n return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n}\nfunction size(target, isReadonly = false) {\n target = target[\"__v_raw\"];\n !isReadonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n return Reflect.get(target, \"size\", target);\n}\nfunction add(value) {\n value = toRaw(value);\n const target = toRaw(this);\n const proto = getProto(target);\n const hadKey = proto.has.call(target, value);\n if (!hadKey) {\n target.add(value);\n trigger(target, \"add\", value, value);\n }\n return this;\n}\nfunction set$1(key, value) {\n value = toRaw(value);\n const target = toRaw(this);\n const { has: has2, get: get2 } = getProto(target);\n let hadKey = has2.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has2.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has2, key);\n }\n const oldValue = get2.call(target, key);\n target.set(key, value);\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n return this;\n}\nfunction deleteEntry(key) {\n const target = toRaw(this);\n const { has: has2, get: get2 } = getProto(target);\n let hadKey = has2.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has2.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has2, key);\n }\n const oldValue = get2 ? get2.call(target, key) : void 0;\n const result = target.delete(key);\n if (hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n}\nfunction clear() {\n const target = toRaw(this);\n const hadItems = target.size !== 0;\n const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n const result = target.clear();\n if (hadItems) {\n trigger(target, \"clear\", void 0, void 0, oldTarget);\n }\n return result;\n}\nfunction createForEach(isReadonly, isShallow) {\n return function forEach(callback, thisArg) {\n const observed = this;\n const target = observed[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n !isReadonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n return target.forEach((value, key) => {\n return callback.call(thisArg, wrap(value), wrap(key), observed);\n });\n };\n}\nfunction createIterableMethod(method, isReadonly, isShallow) {\n return function(...args) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const targetIsMap = isMap(rawTarget);\n const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n const isKeyOnly = method === \"keys\" && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;\n !isReadonly && track(\n rawTarget,\n \"iterate\",\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n );\n return {\n // iterator protocol\n next() {\n const { value, done } = innerIterator.next();\n return done ? { value, done } : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done\n };\n },\n // iterable protocol\n [Symbol.iterator]() {\n return this;\n }\n };\n };\n}\nfunction createReadonlyMethod(type) {\n return function(...args) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n warn$2(\n `${capitalize(type)} operation ${key}failed: target is readonly.`,\n toRaw(this)\n );\n }\n return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n };\n}\nfunction createInstrumentations() {\n const mutableInstrumentations2 = {\n get(key) {\n return get(this, key);\n },\n get size() {\n return size(this);\n },\n has,\n add,\n set: set$1,\n delete: deleteEntry,\n clear,\n forEach: createForEach(false, false)\n };\n const shallowInstrumentations2 = {\n get(key) {\n return get(this, key, false, true);\n },\n get size() {\n return size(this);\n },\n has,\n add,\n set: set$1,\n delete: deleteEntry,\n clear,\n forEach: createForEach(false, true)\n };\n const readonlyInstrumentations2 = {\n get(key) {\n return get(this, key, true);\n },\n get size() {\n return size(this, true);\n },\n has(key) {\n return has.call(this, key, true);\n },\n add: createReadonlyMethod(\"add\"),\n set: createReadonlyMethod(\"set\"),\n delete: createReadonlyMethod(\"delete\"),\n clear: createReadonlyMethod(\"clear\"),\n forEach: createForEach(true, false)\n };\n const shallowReadonlyInstrumentations2 = {\n get(key) {\n return get(this, key, true, true);\n },\n get size() {\n return size(this, true);\n },\n has(key) {\n return has.call(this, key, true);\n },\n add: createReadonlyMethod(\"add\"),\n set: createReadonlyMethod(\"set\"),\n delete: createReadonlyMethod(\"delete\"),\n clear: createReadonlyMethod(\"clear\"),\n forEach: createForEach(true, true)\n };\n const iteratorMethods = [\n \"keys\",\n \"values\",\n \"entries\",\n Symbol.iterator\n ];\n iteratorMethods.forEach((method) => {\n mutableInstrumentations2[method] = createIterableMethod(method, false, false);\n readonlyInstrumentations2[method] = createIterableMethod(method, true, false);\n shallowInstrumentations2[method] = createIterableMethod(method, false, true);\n shallowReadonlyInstrumentations2[method] = createIterableMethod(\n method,\n true,\n true\n );\n });\n return [\n mutableInstrumentations2,\n readonlyInstrumentations2,\n shallowInstrumentations2,\n shallowReadonlyInstrumentations2\n ];\n}\nconst [\n mutableInstrumentations,\n readonlyInstrumentations,\n shallowInstrumentations,\n shallowReadonlyInstrumentations\n] = /* @__PURE__ */ createInstrumentations();\nfunction createInstrumentationGetter(isReadonly, shallow) {\n const instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations;\n return (target, key, receiver) => {\n if (key === \"__v_isReactive\") {\n return !isReadonly;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly;\n } else if (key === \"__v_raw\") {\n return target;\n }\n return Reflect.get(\n hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n key,\n receiver\n );\n };\n}\nconst mutableCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has2, key) {\n const rawKey = toRaw(key);\n if (rawKey !== key && has2.call(target, rawKey)) {\n const type = toRawType(target);\n warn$2(\n `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n );\n }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n switch (rawType) {\n case \"Object\":\n case \"Array\":\n return 1 /* COMMON */;\n case \"Map\":\n case \"Set\":\n case \"WeakMap\":\n case \"WeakSet\":\n return 2 /* COLLECTION */;\n default:\n return 0 /* INVALID */;\n }\n}\nfunction getTargetType(value) {\n return value[\"__v_skip\"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));\n}\nfunction reactive(target) {\n if (isReadonly(target)) {\n return target;\n }\n return createReactiveObject(\n target,\n false,\n mutableHandlers,\n mutableCollectionHandlers,\n reactiveMap\n );\n}\nfunction shallowReactive(target) {\n return createReactiveObject(\n target,\n false,\n shallowReactiveHandlers,\n shallowCollectionHandlers,\n shallowReactiveMap\n );\n}\nfunction readonly(target) {\n return createReactiveObject(\n target,\n true,\n readonlyHandlers,\n readonlyCollectionHandlers,\n readonlyMap\n );\n}\nfunction shallowReadonly(target) {\n return createReactiveObject(\n target,\n true,\n shallowReadonlyHandlers,\n shallowReadonlyCollectionHandlers,\n shallowReadonlyMap\n );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n if (!isObject(target)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$2(`value cannot be made reactive: ${String(target)}`);\n }\n return target;\n }\n if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n return target;\n }\n const existingProxy = proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n const targetType = getTargetType(target);\n if (targetType === 0 /* INVALID */) {\n return target;\n }\n const proxy = new Proxy(\n target,\n targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n );\n proxyMap.set(target, proxy);\n return proxy;\n}\nfunction isReactive(value) {\n if (isReadonly(value)) {\n return isReactive(value[\"__v_raw\"]);\n }\n return !!(value && value[\"__v_isReactive\"]);\n}\nfunction isReadonly(value) {\n return !!(value && value[\"__v_isReadonly\"]);\n}\nfunction isShallow(value) {\n return !!(value && value[\"__v_isShallow\"]);\n}\nfunction isProxy(value) {\n return isReactive(value) || isReadonly(value);\n}\nfunction toRaw(observed) {\n const raw = observed && observed[\"__v_raw\"];\n return raw ? toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n if (Object.isExtensible(value)) {\n def(value, \"__v_skip\", true);\n }\n return value;\n}\nconst toReactive = (value) => isObject(value) ? reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? readonly(value) : value;\n\nconst COMPUTED_SIDE_EFFECT_WARN = `Computed is still dirty after getter evaluation, likely because a computed is mutating its own dependency in its getter. State mutations in computed getters should be avoided. Check the docs for more details: https://vuejs.org/guide/essentials/computed.html#getters-should-be-side-effect-free`;\nclass ComputedRefImpl {\n constructor(getter, _setter, isReadonly, isSSR) {\n this.getter = getter;\n this._setter = _setter;\n this.dep = void 0;\n this.__v_isRef = true;\n this[\"__v_isReadonly\"] = false;\n this.effect = new ReactiveEffect(\n () => getter(this._value),\n () => triggerRefValue(\n this,\n this.effect._dirtyLevel === 2 ? 2 : 3\n )\n );\n this.effect.computed = this;\n this.effect.active = this._cacheable = !isSSR;\n this[\"__v_isReadonly\"] = isReadonly;\n }\n get value() {\n const self = toRaw(this);\n if ((!self._cacheable || self.effect.dirty) && hasChanged(self._value, self._value = self.effect.run())) {\n triggerRefValue(self, 4);\n }\n trackRefValue(self);\n if (self.effect._dirtyLevel >= 2) {\n if (!!(process.env.NODE_ENV !== \"production\") && this._warnRecursive) {\n warn$2(COMPUTED_SIDE_EFFECT_WARN, `\n\ngetter: `, this.getter);\n }\n triggerRefValue(self, 2);\n }\n return self._value;\n }\n set value(newValue) {\n this._setter(newValue);\n }\n // #region polyfill _dirty for backward compatibility third party code for Vue <= 3.3.x\n get _dirty() {\n return this.effect.dirty;\n }\n set _dirty(v) {\n this.effect.dirty = v;\n }\n // #endregion\n}\nfunction computed$1(getterOrOptions, debugOptions, isSSR = false) {\n let getter;\n let setter;\n const onlyGetter = isFunction(getterOrOptions);\n if (onlyGetter) {\n getter = getterOrOptions;\n setter = !!(process.env.NODE_ENV !== \"production\") ? () => {\n warn$2(\"Write operation failed: computed value is readonly\");\n } : NOOP;\n } else {\n getter = getterOrOptions.get;\n setter = getterOrOptions.set;\n }\n const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR);\n if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n cRef.effect.onTrack = debugOptions.onTrack;\n cRef.effect.onTrigger = debugOptions.onTrigger;\n }\n return cRef;\n}\n\nfunction trackRefValue(ref2) {\n var _a;\n if (shouldTrack && activeEffect) {\n ref2 = toRaw(ref2);\n trackEffect(\n activeEffect,\n (_a = ref2.dep) != null ? _a : ref2.dep = createDep(\n () => ref2.dep = void 0,\n ref2 instanceof ComputedRefImpl ? ref2 : void 0\n ),\n !!(process.env.NODE_ENV !== \"production\") ? {\n target: ref2,\n type: \"get\",\n key: \"value\"\n } : void 0\n );\n }\n}\nfunction triggerRefValue(ref2, dirtyLevel = 4, newVal) {\n ref2 = toRaw(ref2);\n const dep = ref2.dep;\n if (dep) {\n triggerEffects(\n dep,\n dirtyLevel,\n !!(process.env.NODE_ENV !== \"production\") ? {\n target: ref2,\n type: \"set\",\n key: \"value\",\n newValue: newVal\n } : void 0\n );\n }\n}\nfunction isRef(r) {\n return !!(r && r.__v_isRef === true);\n}\nfunction ref(value) {\n return createRef(value, false);\n}\nfunction shallowRef(value) {\n return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n if (isRef(rawValue)) {\n return rawValue;\n }\n return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n constructor(value, __v_isShallow) {\n this.__v_isShallow = __v_isShallow;\n this.dep = void 0;\n this.__v_isRef = true;\n this._rawValue = __v_isShallow ? value : toRaw(value);\n this._value = __v_isShallow ? value : toReactive(value);\n }\n get value() {\n trackRefValue(this);\n return this._value;\n }\n set value(newVal) {\n const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);\n newVal = useDirectValue ? newVal : toRaw(newVal);\n if (hasChanged(newVal, this._rawValue)) {\n this._rawValue = newVal;\n this._value = useDirectValue ? newVal : toReactive(newVal);\n triggerRefValue(this, 4, newVal);\n }\n }\n}\nfunction triggerRef(ref2) {\n triggerRefValue(ref2, 4, !!(process.env.NODE_ENV !== \"production\") ? ref2.value : void 0);\n}\nfunction unref(ref2) {\n return isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),\n set: (target, key, value, receiver) => {\n const oldValue = target[key];\n if (isRef(oldValue) && !isRef(value)) {\n oldValue.value = value;\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n }\n};\nfunction proxyRefs(objectWithRefs) {\n return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n constructor(factory) {\n this.dep = void 0;\n this.__v_isRef = true;\n const { get, set } = factory(\n () => trackRefValue(this),\n () => triggerRefValue(this)\n );\n this._get = get;\n this._set = set;\n }\n get value() {\n return this._get();\n }\n set value(newVal) {\n this._set(newVal);\n }\n}\nfunction customRef(factory) {\n return new CustomRefImpl(factory);\n}\nfunction toRefs(object) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n warn$2(`toRefs() expects a reactive object but received a plain one.`);\n }\n const ret = isArray(object) ? new Array(object.length) : {};\n for (const key in object) {\n ret[key] = propertyToRef(object, key);\n }\n return ret;\n}\nclass ObjectRefImpl {\n constructor(_object, _key, _defaultValue) {\n this._object = _object;\n this._key = _key;\n this._defaultValue = _defaultValue;\n this.__v_isRef = true;\n }\n get value() {\n const val = this._object[this._key];\n return val === void 0 ? this._defaultValue : val;\n }\n set value(newVal) {\n this._object[this._key] = newVal;\n }\n get dep() {\n return getDepFromReactive(toRaw(this._object), this._key);\n }\n}\nclass GetterRefImpl {\n constructor(_getter) {\n this._getter = _getter;\n this.__v_isRef = true;\n this.__v_isReadonly = true;\n }\n get value() {\n return this._getter();\n }\n}\nfunction toRef(source, key, defaultValue) {\n if (isRef(source)) {\n return source;\n } else if (isFunction(source)) {\n return new GetterRefImpl(source);\n } else if (isObject(source) && arguments.length > 1) {\n return propertyToRef(source, key, defaultValue);\n } else {\n return ref(source);\n }\n}\nfunction propertyToRef(source, key, defaultValue) {\n const val = source[key];\n return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue);\n}\n\nconst stack = [];\nfunction pushWarningContext(vnode) {\n stack.push(vnode);\n}\nfunction popWarningContext() {\n stack.pop();\n}\nfunction warn$1(msg, ...args) {\n pauseTracking();\n const instance = stack.length ? stack[stack.length - 1].component : null;\n const appWarnHandler = instance && instance.appContext.config.warnHandler;\n const trace = getComponentTrace();\n if (appWarnHandler) {\n callWithErrorHandling(\n appWarnHandler,\n instance,\n 11,\n [\n msg + args.map((a) => {\n var _a, _b;\n return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);\n }).join(\"\"),\n instance && instance.proxy,\n trace.map(\n ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`\n ).join(\"\\n\"),\n trace\n ]\n );\n } else {\n const warnArgs = [`[Vue warn]: ${msg}`, ...args];\n if (trace.length && // avoid spamming console during tests\n true) {\n warnArgs.push(`\n`, ...formatTrace(trace));\n }\n console.warn(...warnArgs);\n }\n resetTracking();\n}\nfunction getComponentTrace() {\n let currentVNode = stack[stack.length - 1];\n if (!currentVNode) {\n return [];\n }\n const normalizedStack = [];\n while (currentVNode) {\n const last = normalizedStack[0];\n if (last && last.vnode === currentVNode) {\n last.recurseCount++;\n } else {\n normalizedStack.push({\n vnode: currentVNode,\n recurseCount: 0\n });\n }\n const parentInstance = currentVNode.component && currentVNode.component.parent;\n currentVNode = parentInstance && parentInstance.vnode;\n }\n return normalizedStack;\n}\nfunction formatTrace(trace) {\n const logs = [];\n trace.forEach((entry, i) => {\n logs.push(...i === 0 ? [] : [`\n`], ...formatTraceEntry(entry));\n });\n return logs;\n}\nfunction formatTraceEntry({ vnode, recurseCount }) {\n const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;\n const isRoot = vnode.component ? vnode.component.parent == null : false;\n const open = ` at <${formatComponentName(\n vnode.component,\n vnode.type,\n isRoot\n )}`;\n const close = `>` + postfix;\n return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];\n}\nfunction formatProps(props) {\n const res = [];\n const keys = Object.keys(props);\n keys.slice(0, 3).forEach((key) => {\n res.push(...formatProp(key, props[key]));\n });\n if (keys.length > 3) {\n res.push(` ...`);\n }\n return res;\n}\nfunction formatProp(key, value, raw) {\n if (isString(value)) {\n value = JSON.stringify(value);\n return raw ? value : [`${key}=${value}`];\n } else if (typeof value === \"number\" || typeof value === \"boolean\" || value == null) {\n return raw ? value : [`${key}=${value}`];\n } else if (isRef(value)) {\n value = formatProp(key, toRaw(value.value), true);\n return raw ? value : [`${key}=Ref<`, value, `>`];\n } else if (isFunction(value)) {\n return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];\n } else {\n value = toRaw(value);\n return raw ? value : [`${key}=`, value];\n }\n}\n\nconst ErrorTypeStrings = {\n [\"sp\"]: \"serverPrefetch hook\",\n [\"bc\"]: \"beforeCreate hook\",\n [\"c\"]: \"created hook\",\n [\"bm\"]: \"beforeMount hook\",\n [\"m\"]: \"mounted hook\",\n [\"bu\"]: \"beforeUpdate hook\",\n [\"u\"]: \"updated\",\n [\"bum\"]: \"beforeUnmount hook\",\n [\"um\"]: \"unmounted hook\",\n [\"a\"]: \"activated hook\",\n [\"da\"]: \"deactivated hook\",\n [\"ec\"]: \"errorCaptured hook\",\n [\"rtc\"]: \"renderTracked hook\",\n [\"rtg\"]: \"renderTriggered hook\",\n [0]: \"setup function\",\n [1]: \"render function\",\n [2]: \"watcher getter\",\n [3]: \"watcher callback\",\n [4]: \"watcher cleanup function\",\n [5]: \"native event handler\",\n [6]: \"component event handler\",\n [7]: \"vnode hook\",\n [8]: \"directive hook\",\n [9]: \"transition hook\",\n [10]: \"app errorHandler\",\n [11]: \"app warnHandler\",\n [12]: \"ref function\",\n [13]: \"async component loader\",\n [14]: \"scheduler flush. This is likely a Vue internals bug. Please open an issue at https://github.com/vuejs/core .\"\n};\nfunction callWithErrorHandling(fn, instance, type, args) {\n try {\n return args ? fn(...args) : fn();\n } catch (err) {\n handleError(err, instance, type);\n }\n}\nfunction callWithAsyncErrorHandling(fn, instance, type, args) {\n if (isFunction(fn)) {\n const res = callWithErrorHandling(fn, instance, type, args);\n if (res && isPromise(res)) {\n res.catch((err) => {\n handleError(err, instance, type);\n });\n }\n return res;\n }\n const values = [];\n for (let i = 0; i < fn.length; i++) {\n values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));\n }\n return values;\n}\nfunction handleError(err, instance, type, throwInDev = true) {\n const contextVNode = instance ? instance.vnode : null;\n if (instance) {\n let cur = instance.parent;\n const exposedInstance = instance.proxy;\n const errorInfo = !!(process.env.NODE_ENV !== \"production\") ? ErrorTypeStrings[type] || type : `https://vuejs.org/error-reference/#runtime-${type}`;\n while (cur) {\n const errorCapturedHooks = cur.ec;\n if (errorCapturedHooks) {\n for (let i = 0; i < errorCapturedHooks.length; i++) {\n if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {\n return;\n }\n }\n }\n cur = cur.parent;\n }\n const appErrorHandler = instance.appContext.config.errorHandler;\n if (appErrorHandler) {\n callWithErrorHandling(\n appErrorHandler,\n null,\n 10,\n [err, exposedInstance, errorInfo]\n );\n return;\n }\n }\n logError(err, type, contextVNode, throwInDev);\n}\nfunction logError(err, type, contextVNode, throwInDev = true) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const info = ErrorTypeStrings[type] || type;\n if (contextVNode) {\n pushWarningContext(contextVNode);\n }\n warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);\n if (contextVNode) {\n popWarningContext();\n }\n if (throwInDev) {\n console.error(err);\n } else {\n console.error(err);\n }\n } else {\n console.error(err);\n }\n}\n\nlet isFlushing = false;\nlet isFlushPending = false;\nconst queue = [];\nlet flushIndex = 0;\nconst pendingPostFlushCbs = [];\nlet activePostFlushCbs = null;\nlet postFlushIndex = 0;\nconst resolvedPromise = /* @__PURE__ */ Promise.resolve();\nlet currentFlushPromise = null;\nconst RECURSION_LIMIT = 100;\nfunction nextTick$1(fn) {\n const p = currentFlushPromise || resolvedPromise;\n return fn ? p.then(this ? fn.bind(this) : fn) : p;\n}\nfunction findInsertionIndex(id) {\n let start = flushIndex + 1;\n let end = queue.length;\n while (start < end) {\n const middle = start + end >>> 1;\n const middleJob = queue[middle];\n const middleJobId = getId(middleJob);\n if (middleJobId < id || middleJobId === id && middleJob.pre) {\n start = middle + 1;\n } else {\n end = middle;\n }\n }\n return start;\n}\nfunction queueJob(job) {\n if (!queue.length || !queue.includes(\n job,\n isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex\n )) {\n if (job.id == null) {\n queue.push(job);\n } else {\n queue.splice(findInsertionIndex(job.id), 0, job);\n }\n queueFlush();\n }\n}\nfunction queueFlush() {\n if (!isFlushing && !isFlushPending) {\n isFlushPending = true;\n currentFlushPromise = resolvedPromise.then(flushJobs);\n }\n}\nfunction hasQueueJob(job) {\n return queue.indexOf(job) > -1;\n}\nfunction invalidateJob(job) {\n const i = queue.indexOf(job);\n if (i > flushIndex) {\n queue.splice(i, 1);\n }\n}\nfunction queuePostFlushCb(cb) {\n if (!isArray(cb)) {\n if (!activePostFlushCbs || !activePostFlushCbs.includes(\n cb,\n cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex\n )) {\n pendingPostFlushCbs.push(cb);\n }\n } else {\n pendingPostFlushCbs.push(...cb);\n }\n queueFlush();\n}\nfunction flushPreFlushCbs(instance, seen, i = isFlushing ? flushIndex + 1 : 0) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (; i < queue.length; i++) {\n const cb = queue[i];\n if (cb && cb.pre) {\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n queue.splice(i, 1);\n i--;\n cb();\n }\n }\n}\nfunction flushPostFlushCbs(seen) {\n if (pendingPostFlushCbs.length) {\n const deduped = [...new Set(pendingPostFlushCbs)].sort(\n (a, b) => getId(a) - getId(b)\n );\n pendingPostFlushCbs.length = 0;\n if (activePostFlushCbs) {\n activePostFlushCbs.push(...deduped);\n return;\n }\n activePostFlushCbs = deduped;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex])) {\n continue;\n }\n activePostFlushCbs[postFlushIndex]();\n }\n activePostFlushCbs = null;\n postFlushIndex = 0;\n }\n}\nconst getId = (job) => job.id == null ? Infinity : job.id;\nconst comparator = (a, b) => {\n const diff = getId(a) - getId(b);\n if (diff === 0) {\n if (a.pre && !b.pre)\n return -1;\n if (b.pre && !a.pre)\n return 1;\n }\n return diff;\n};\nfunction flushJobs(seen) {\n isFlushPending = false;\n isFlushing = true;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n queue.sort(comparator);\n const check = !!(process.env.NODE_ENV !== \"production\") ? (job) => checkRecursiveUpdates(seen, job) : NOOP;\n try {\n for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job && job.active !== false) {\n if (!!(process.env.NODE_ENV !== \"production\") && check(job)) {\n continue;\n }\n callWithErrorHandling(job, null, 14);\n }\n }\n } finally {\n flushIndex = 0;\n queue.length = 0;\n flushPostFlushCbs(seen);\n isFlushing = false;\n currentFlushPromise = null;\n if (queue.length || pendingPostFlushCbs.length) {\n flushJobs(seen);\n }\n }\n}\nfunction checkRecursiveUpdates(seen, fn) {\n if (!seen.has(fn)) {\n seen.set(fn, 1);\n } else {\n const count = seen.get(fn);\n if (count > RECURSION_LIMIT) {\n const instance = fn.ownerInstance;\n const componentName = instance && getComponentName(instance.type);\n handleError(\n `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,\n null,\n 10\n );\n return true;\n } else {\n seen.set(fn, count + 1);\n }\n }\n}\n\nlet devtools;\nlet buffer = [];\nlet devtoolsNotInstalled = false;\nfunction emit$1(event, ...args) {\n if (devtools) {\n devtools.emit(event, ...args);\n } else if (!devtoolsNotInstalled) {\n buffer.push({ event, args });\n }\n}\nfunction setDevtoolsHook(hook, target) {\n var _a, _b;\n devtools = hook;\n if (devtools) {\n devtools.enabled = true;\n buffer.forEach(({ event, args }) => devtools.emit(event, ...args));\n buffer = [];\n } else if (\n // handle late devtools injection - only do this if we are in an actual\n // browser environment to avoid the timer handle stalling test runner exit\n // (#4815)\n typeof window !== \"undefined\" && // some envs mock window but not fully\n window.HTMLElement && // also exclude jsdom\n !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes(\"jsdom\"))\n ) {\n const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];\n replay.push((newHook) => {\n setDevtoolsHook(newHook, target);\n });\n setTimeout(() => {\n if (!devtools) {\n target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;\n devtoolsNotInstalled = true;\n buffer = [];\n }\n }, 3e3);\n } else {\n devtoolsNotInstalled = true;\n buffer = [];\n }\n}\nfunction devtoolsInitApp(app, version) {\n emit$1(\"app:init\" /* APP_INIT */, app, version, {\n Fragment,\n Text,\n Comment,\n Static\n });\n}\nconst devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(\n \"component:added\" /* COMPONENT_ADDED */\n);\nconst devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(\"component:updated\" /* COMPONENT_UPDATED */);\nconst _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(\n \"component:removed\" /* COMPONENT_REMOVED */\n);\nconst devtoolsComponentRemoved = (component) => {\n if (devtools && typeof devtools.cleanupBuffer === \"function\" && // remove the component if it wasn't buffered\n !devtools.cleanupBuffer(component)) {\n _devtoolsComponentRemoved(component);\n }\n};\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction createDevtoolsComponentHook(hook) {\n return (component) => {\n emit$1(\n hook,\n component.appContext.app,\n component.uid,\n // fixed by xxxxxx\n // 为 0 是 App,无 parent 是 Page 指向 App\n component.uid === 0 ? void 0 : component.parent ? component.parent.uid : 0,\n component\n );\n };\n}\nconst devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(\n \"perf:start\" /* PERFORMANCE_START */\n);\nconst devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(\n \"perf:end\" /* PERFORMANCE_END */\n);\nfunction createDevtoolsPerformanceHook(hook) {\n return (component, type, time) => {\n emit$1(hook, component.appContext.app, component.uid, component, type, time);\n };\n}\nfunction devtoolsComponentEmit(component, event, params) {\n emit$1(\n \"component:emit\" /* COMPONENT_EMIT */,\n component.appContext.app,\n component,\n event,\n params\n );\n}\n\nfunction emit(instance, event, ...rawArgs) {\n if (instance.isUnmounted)\n return;\n const props = instance.vnode.props || EMPTY_OBJ;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const {\n emitsOptions,\n propsOptions: [propsOptions]\n } = instance;\n if (emitsOptions) {\n if (!(event in emitsOptions) && true) {\n if (!propsOptions || !(toHandlerKey(event) in propsOptions)) {\n warn$1(\n `Component emitted event \"${event}\" but it is neither declared in the emits option nor as an \"${toHandlerKey(event)}\" prop.`\n );\n }\n } else {\n const validator = emitsOptions[event];\n if (isFunction(validator)) {\n const isValid = validator(...rawArgs);\n if (!isValid) {\n warn$1(\n `Invalid event arguments: event validation failed for event \"${event}\".`\n );\n }\n }\n }\n }\n }\n let args = rawArgs;\n const isModelListener = event.startsWith(\"update:\");\n const modelArg = isModelListener && event.slice(7);\n if (modelArg && modelArg in props) {\n const modifiersKey = `${modelArg === \"modelValue\" ? \"model\" : modelArg}Modifiers`;\n const { number, trim } = props[modifiersKey] || EMPTY_OBJ;\n if (trim) {\n args = rawArgs.map((a) => isString(a) ? a.trim() : a);\n }\n if (number) {\n args = rawArgs.map(looseToNumber);\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentEmit(instance, event, args);\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const lowerCaseEvent = event.toLowerCase();\n if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) {\n warn$1(\n `Event \"${lowerCaseEvent}\" is emitted in component ${formatComponentName(\n instance,\n instance.type\n )} but the handler is registered for \"${event}\". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use \"${hyphenate(\n event\n )}\" instead of \"${event}\".`\n );\n }\n }\n let handlerName;\n let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249)\n props[handlerName = toHandlerKey(camelize(event))];\n if (!handler && isModelListener) {\n handler = props[handlerName = toHandlerKey(hyphenate(event))];\n }\n if (handler) {\n callWithAsyncErrorHandling(\n handler,\n instance,\n 6,\n args\n );\n }\n const onceHandler = props[handlerName + `Once`];\n if (onceHandler) {\n if (!instance.emitted) {\n instance.emitted = {};\n } else if (instance.emitted[handlerName]) {\n return;\n }\n instance.emitted[handlerName] = true;\n callWithAsyncErrorHandling(\n onceHandler,\n instance,\n 6,\n args\n );\n }\n}\nfunction normalizeEmitsOptions(comp, appContext, asMixin = false) {\n const cache = appContext.emitsCache;\n const cached = cache.get(comp);\n if (cached !== void 0) {\n return cached;\n }\n const raw = comp.emits;\n let normalized = {};\n let hasExtends = false;\n if (__VUE_OPTIONS_API__ && !isFunction(comp)) {\n const extendEmits = (raw2) => {\n const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);\n if (normalizedFromExtend) {\n hasExtends = true;\n extend(normalized, normalizedFromExtend);\n }\n };\n if (!asMixin && appContext.mixins.length) {\n appContext.mixins.forEach(extendEmits);\n }\n if (comp.extends) {\n extendEmits(comp.extends);\n }\n if (comp.mixins) {\n comp.mixins.forEach(extendEmits);\n }\n }\n if (!raw && !hasExtends) {\n if (isObject(comp)) {\n cache.set(comp, null);\n }\n return null;\n }\n if (isArray(raw)) {\n raw.forEach((key) => normalized[key] = null);\n } else {\n extend(normalized, raw);\n }\n if (isObject(comp)) {\n cache.set(comp, normalized);\n }\n return normalized;\n}\nfunction isEmitListener(options, key) {\n if (!options || !isOn(key)) {\n return false;\n }\n key = key.slice(2).replace(/Once$/, \"\");\n return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);\n}\n\nlet currentRenderingInstance = null;\nlet currentScopeId = null;\nfunction setCurrentRenderingInstance(instance) {\n const prev = currentRenderingInstance;\n currentRenderingInstance = instance;\n currentScopeId = instance && instance.type.__scopeId || null;\n return prev;\n}\nconst withScopeId = (_id) => withCtx;\nfunction withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {\n if (!ctx)\n return fn;\n if (fn._n) {\n return fn;\n }\n const renderFnWithContext = (...args) => {\n if (renderFnWithContext._d) {\n setBlockTracking(-1);\n }\n const prevInstance = setCurrentRenderingInstance(ctx);\n let res;\n try {\n res = fn(...args);\n } finally {\n setCurrentRenderingInstance(prevInstance);\n if (renderFnWithContext._d) {\n setBlockTracking(1);\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentUpdated(ctx);\n }\n return res;\n };\n renderFnWithContext._n = true;\n renderFnWithContext._c = true;\n renderFnWithContext._d = true;\n return renderFnWithContext;\n}\n\nfunction markAttrsAccessed() {\n}\n\nconst COMPONENTS = \"components\";\nconst DIRECTIVES = \"directives\";\nfunction resolveComponent(name, maybeSelfReference) {\n return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;\n}\nconst NULL_DYNAMIC_COMPONENT = Symbol.for(\"v-ndc\");\nfunction resolveDirective(name) {\n return resolveAsset(DIRECTIVES, name);\n}\nfunction resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {\n const instance = currentRenderingInstance || currentInstance;\n if (instance) {\n const Component = instance.type;\n if (type === COMPONENTS) {\n const selfName = getComponentName(\n Component,\n false\n );\n if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {\n return Component;\n }\n }\n const res = (\n // local registration\n // check instance[type] first which is resolved for options API\n resolve(instance[type] || Component[type], name) || // global registration\n resolve(instance.appContext[type], name)\n );\n if (!res && maybeSelfReference) {\n return Component;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && warnMissing && !res) {\n const extra = type === COMPONENTS ? `\nIf this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;\n warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);\n }\n return res;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`\n );\n }\n}\nfunction resolve(registry, name) {\n return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);\n}\n\nconst ssrContextKey = Symbol.for(\"v-scx\");\nconst useSSRContext = () => {\n {\n const ctx = inject(ssrContextKey);\n if (!ctx) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`\n );\n }\n return ctx;\n }\n};\n\nfunction watchEffect(effect, options) {\n return doWatch(effect, null, options);\n}\nfunction watchPostEffect(effect, options) {\n return doWatch(\n effect,\n null,\n !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"post\" }) : { flush: \"post\" }\n );\n}\nfunction watchSyncEffect(effect, options) {\n return doWatch(\n effect,\n null,\n !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"sync\" }) : { flush: \"sync\" }\n );\n}\nconst INITIAL_WATCHER_VALUE = {};\nfunction watch(source, cb, options) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(cb)) {\n warn$1(\n `\\`watch(fn, options?)\\` signature has been moved to a separate API. Use \\`watchEffect(fn, options?)\\` instead. \\`watch\\` now only supports \\`watch(source, cb, options?) signature.`\n );\n }\n return doWatch(source, cb, options);\n}\nfunction doWatch(source, cb, {\n immediate,\n deep,\n flush,\n once,\n onTrack,\n onTrigger\n} = EMPTY_OBJ) {\n if (cb && once) {\n const _cb = cb;\n cb = (...args) => {\n _cb(...args);\n unwatch();\n };\n }\n if (!!(process.env.NODE_ENV !== \"production\") && deep !== void 0 && typeof deep === \"number\") {\n warn$1(\n `watch() \"deep\" option with number value will be used as watch depth in future versions. Please use a boolean instead to avoid potential breakage.`\n );\n }\n if (!!(process.env.NODE_ENV !== \"production\") && !cb) {\n if (immediate !== void 0) {\n warn$1(\n `watch() \"immediate\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n if (deep !== void 0) {\n warn$1(\n `watch() \"deep\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n if (once !== void 0) {\n warn$1(\n `watch() \"once\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n }\n const warnInvalidSource = (s) => {\n warn$1(\n `Invalid watch source: `,\n s,\n `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n );\n };\n const instance = currentInstance;\n const reactiveGetter = (source2) => deep === true ? source2 : (\n // for deep: false, only traverse root-level properties\n traverse(source2, deep === false ? 1 : void 0)\n );\n let getter;\n let forceTrigger = false;\n let isMultiSource = false;\n if (isRef(source)) {\n getter = () => source.value;\n forceTrigger = isShallow(source);\n } else if (isReactive(source)) {\n getter = () => reactiveGetter(source);\n forceTrigger = true;\n } else if (isArray(source)) {\n isMultiSource = true;\n forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n getter = () => source.map((s) => {\n if (isRef(s)) {\n return s.value;\n } else if (isReactive(s)) {\n return reactiveGetter(s);\n } else if (isFunction(s)) {\n return callWithErrorHandling(s, instance, 2);\n } else {\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n }\n });\n } else if (isFunction(source)) {\n if (cb) {\n getter = () => callWithErrorHandling(source, instance, 2);\n } else {\n getter = () => {\n if (cleanup) {\n cleanup();\n }\n return callWithAsyncErrorHandling(\n source,\n instance,\n 3,\n [onCleanup]\n );\n };\n }\n } else {\n getter = NOOP;\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n }\n if (cb && deep) {\n const baseGetter = getter;\n getter = () => traverse(baseGetter());\n }\n let cleanup;\n let onCleanup = (fn) => {\n cleanup = effect.onStop = () => {\n callWithErrorHandling(fn, instance, 4);\n cleanup = effect.onStop = void 0;\n };\n };\n let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n const job = () => {\n if (!effect.active || !effect.dirty) {\n return;\n }\n if (cb) {\n const newValue = effect.run();\n if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue)) || false) {\n if (cleanup) {\n cleanup();\n }\n callWithAsyncErrorHandling(cb, instance, 3, [\n newValue,\n // pass undefined as the old value when it's changed for the first time\n oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n onCleanup\n ]);\n oldValue = newValue;\n }\n } else {\n effect.run();\n }\n };\n job.allowRecurse = !!cb;\n let scheduler;\n if (flush === \"sync\") {\n scheduler = job;\n } else if (flush === \"post\") {\n scheduler = () => queuePostRenderEffect$1(job, instance && instance.suspense);\n } else {\n job.pre = true;\n if (instance)\n job.id = instance.uid;\n scheduler = () => queueJob(job);\n }\n const effect = new ReactiveEffect(getter, NOOP, scheduler);\n const scope = getCurrentScope();\n const unwatch = () => {\n effect.stop();\n if (scope) {\n remove(scope.effects, effect);\n }\n };\n if (!!(process.env.NODE_ENV !== \"production\")) {\n effect.onTrack = onTrack;\n effect.onTrigger = onTrigger;\n }\n if (cb) {\n if (immediate) {\n job();\n } else {\n oldValue = effect.run();\n }\n } else if (flush === \"post\") {\n queuePostRenderEffect$1(\n effect.run.bind(effect),\n instance && instance.suspense\n );\n } else {\n effect.run();\n }\n return unwatch;\n}\nfunction instanceWatch(source, value, options) {\n const publicThis = this.proxy;\n const getter = isString(source) ? source.includes(\".\") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);\n let cb;\n if (isFunction(value)) {\n cb = value;\n } else {\n cb = value.handler;\n options = value;\n }\n const reset = setCurrentInstance(this);\n const res = doWatch(getter, cb.bind(publicThis), options);\n reset();\n return res;\n}\nfunction createPathGetter(ctx, path) {\n const segments = path.split(\".\");\n return () => {\n let cur = ctx;\n for (let i = 0; i < segments.length && cur; i++) {\n cur = cur[segments[i]];\n }\n return cur;\n };\n}\nfunction traverse(value, depth, currentDepth = 0, seen) {\n if (!isObject(value) || value[\"__v_skip\"]) {\n return value;\n }\n if (depth && depth > 0) {\n if (currentDepth >= depth) {\n return value;\n }\n currentDepth++;\n }\n seen = seen || /* @__PURE__ */ new Set();\n if (seen.has(value)) {\n return value;\n }\n seen.add(value);\n if (isRef(value)) {\n traverse(value.value, depth, currentDepth, seen);\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n traverse(value[i], depth, currentDepth, seen);\n }\n } else if (isSet(value) || isMap(value)) {\n value.forEach((v) => {\n traverse(v, depth, currentDepth, seen);\n });\n } else if (isPlainObject(value)) {\n for (const key in value) {\n traverse(value[key], depth, currentDepth, seen);\n }\n }\n return value;\n}\n\nfunction validateDirectiveName(name) {\n if (isBuiltInDirective(name)) {\n warn$1(\"Do not use built-in directive ids as custom directive id: \" + name);\n }\n}\nfunction withDirectives(vnode, directives) {\n if (currentRenderingInstance === null) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`withDirectives can only be used inside render functions.`);\n return vnode;\n }\n const instance = getExposeProxy(currentRenderingInstance) || currentRenderingInstance.proxy;\n const bindings = vnode.dirs || (vnode.dirs = []);\n for (let i = 0; i < directives.length; i++) {\n let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];\n if (dir) {\n if (isFunction(dir)) {\n dir = {\n mounted: dir,\n updated: dir\n };\n }\n if (dir.deep) {\n traverse(value);\n }\n bindings.push({\n dir,\n instance,\n value,\n oldValue: void 0,\n arg,\n modifiers\n });\n }\n }\n return vnode;\n}\n\nfunction createAppContext() {\n return {\n app: null,\n config: {\n isNativeTag: NO,\n performance: false,\n globalProperties: {},\n optionMergeStrategies: {},\n errorHandler: void 0,\n warnHandler: void 0,\n compilerOptions: {}\n },\n mixins: [],\n components: {},\n directives: {},\n provides: /* @__PURE__ */ Object.create(null),\n optionsCache: /* @__PURE__ */ new WeakMap(),\n propsCache: /* @__PURE__ */ new WeakMap(),\n emitsCache: /* @__PURE__ */ new WeakMap()\n };\n}\nlet uid$1 = 0;\nfunction createAppAPI(render, hydrate) {\n return function createApp(rootComponent, rootProps = null) {\n if (!isFunction(rootComponent)) {\n rootComponent = extend({}, rootComponent);\n }\n if (rootProps != null && !isObject(rootProps)) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`root props passed to app.mount() must be an object.`);\n rootProps = null;\n }\n const context = createAppContext();\n const installedPlugins = /* @__PURE__ */ new WeakSet();\n const app = context.app = {\n _uid: uid$1++,\n _component: rootComponent,\n _props: rootProps,\n _container: null,\n _context: context,\n _instance: null,\n version,\n get config() {\n return context.config;\n },\n set config(v) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `app.config cannot be replaced. Modify individual options instead.`\n );\n }\n },\n use(plugin, ...options) {\n if (installedPlugins.has(plugin)) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`Plugin has already been applied to target app.`);\n } else if (plugin && isFunction(plugin.install)) {\n installedPlugins.add(plugin);\n plugin.install(app, ...options);\n } else if (isFunction(plugin)) {\n installedPlugins.add(plugin);\n plugin(app, ...options);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `A plugin must either be a function or an object with an \"install\" function.`\n );\n }\n return app;\n },\n mixin(mixin) {\n if (__VUE_OPTIONS_API__) {\n if (!context.mixins.includes(mixin)) {\n context.mixins.push(mixin);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n \"Mixin has already been applied to target app\" + (mixin.name ? `: ${mixin.name}` : \"\")\n );\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Mixins are only available in builds supporting Options API\");\n }\n return app;\n },\n component(name, component) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n validateComponentName(name, context.config);\n }\n if (!component) {\n return context.components[name];\n }\n if (!!(process.env.NODE_ENV !== \"production\") && context.components[name]) {\n warn$1(`Component \"${name}\" has already been registered in target app.`);\n }\n context.components[name] = component;\n return app;\n },\n directive(name, directive) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n validateDirectiveName(name);\n }\n if (!directive) {\n return context.directives[name];\n }\n if (!!(process.env.NODE_ENV !== \"production\") && context.directives[name]) {\n warn$1(`Directive \"${name}\" has already been registered in target app.`);\n }\n context.directives[name] = directive;\n return app;\n },\n // fixed by xxxxxx\n mount() {\n },\n // fixed by xxxxxx\n unmount() {\n },\n provide(key, value) {\n if (!!(process.env.NODE_ENV !== \"production\") && key in context.provides) {\n warn$1(\n `App already provides property with key \"${String(key)}\". It will be overwritten with the new value.`\n );\n }\n context.provides[key] = value;\n return app;\n },\n runWithContext(fn) {\n const lastApp = currentApp;\n currentApp = app;\n try {\n return fn();\n } finally {\n currentApp = lastApp;\n }\n }\n };\n return app;\n };\n}\nlet currentApp = null;\n\nfunction provide(key, value) {\n if (!currentInstance) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`provide() can only be used inside setup().`);\n }\n } else {\n let provides = currentInstance.provides;\n const parentProvides = currentInstance.parent && currentInstance.parent.provides;\n if (parentProvides === provides) {\n provides = currentInstance.provides = Object.create(parentProvides);\n }\n provides[key] = value;\n if (currentInstance.type.mpType === \"app\") {\n currentInstance.appContext.app.provide(key, value);\n }\n }\n}\nfunction inject(key, defaultValue, treatDefaultAsFactory = false) {\n const instance = currentInstance || currentRenderingInstance;\n if (instance || currentApp) {\n const provides = instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : currentApp._context.provides;\n if (provides && key in provides) {\n return provides[key];\n } else if (arguments.length > 1) {\n return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`injection \"${String(key)}\" not found.`);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`inject() can only be used inside setup() or functional components.`);\n }\n}\nfunction hasInjectionContext() {\n return !!(currentInstance || currentRenderingInstance || currentApp);\n}\n\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineComponent(options, extraOptions) {\n return isFunction(options) ? (\n // #8326: extend call and options.name access are considered side-effects\n // by Rollup, so we have to wrap it in a pure-annotated IIFE.\n /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()\n ) : options;\n}\n\nconst isKeepAlive = (vnode) => vnode.type.__isKeepAlive;\nfunction onActivated(hook, target) {\n registerKeepAliveHook(hook, \"a\", target);\n}\nfunction onDeactivated(hook, target) {\n registerKeepAliveHook(hook, \"da\", target);\n}\nfunction registerKeepAliveHook(hook, type, target = currentInstance) {\n const wrappedHook = hook.__wdc || (hook.__wdc = () => {\n let current = target;\n while (current) {\n if (current.isDeactivated) {\n return;\n }\n current = current.parent;\n }\n return hook();\n });\n injectHook(type, wrappedHook, target);\n if (target) {\n let current = target.parent;\n while (current && current.parent) {\n if (isKeepAlive(current.parent.vnode)) {\n injectToKeepAliveRoot(wrappedHook, type, target, current);\n }\n current = current.parent;\n }\n }\n}\nfunction injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {\n const injected = injectHook(\n type,\n hook,\n keepAliveRoot,\n true\n /* prepend */\n );\n onUnmounted(() => {\n remove(keepAliveRoot[type], injected);\n }, target);\n}\n\nfunction injectHook(type, hook, target = currentInstance, prepend = false) {\n if (target) {\n if (isRootHook(type)) {\n target = target.root;\n }\n const hooks = target[type] || (target[type] = []);\n const wrappedHook = hook.__weh || (hook.__weh = (...args) => {\n if (target.isUnmounted) {\n return;\n }\n pauseTracking();\n const reset = setCurrentInstance(target);\n const res = callWithAsyncErrorHandling(hook, target, type, args);\n reset();\n resetTracking();\n return res;\n });\n if (prepend) {\n hooks.unshift(wrappedHook);\n } else {\n hooks.push(wrappedHook);\n }\n return wrappedHook;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n const apiName = toHandlerKey(\n (ErrorTypeStrings[type] || type.replace(/^on/, \"\")).replace(/ hook$/, \"\")\n );\n warn$1(\n `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (``)\n );\n }\n}\nconst createHook = (lifecycle) => (hook, target = currentInstance) => (\n // post-create lifecycle registrations are noops during SSR (except for serverPrefetch)\n (!isInSSRComponentSetup || lifecycle === \"sp\") && injectHook(lifecycle, (...args) => hook(...args), target)\n);\nconst onBeforeMount = createHook(\"bm\");\nconst onMounted = createHook(\"m\");\nconst onBeforeUpdate = createHook(\"bu\");\nconst onUpdated = createHook(\"u\");\nconst onBeforeUnmount = createHook(\"bum\");\nconst onUnmounted = createHook(\"um\");\nconst onServerPrefetch = createHook(\"sp\");\nconst onRenderTriggered = createHook(\n \"rtg\"\n);\nconst onRenderTracked = createHook(\n \"rtc\"\n);\nfunction onErrorCaptured(hook, target = currentInstance) {\n injectHook(\"ec\", hook, target);\n}\n\nfunction toHandlers(obj, preserveCaseIfNecessary) {\n const ret = {};\n if (!!(process.env.NODE_ENV !== \"production\") && !isObject(obj)) {\n warn$1(`v-on with no argument expects an object value.`);\n return ret;\n }\n for (const key in obj) {\n ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];\n }\n return ret;\n}\n\nconst getPublicInstance = (i) => {\n if (!i)\n return null;\n if (isStatefulComponent(i))\n return getExposeProxy(i) || i.proxy;\n return getPublicInstance(i.parent);\n};\nconst publicPropertiesMap = (\n // Move PURE marker to new line to workaround compiler discarding it\n // due to type annotation\n /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {\n $: (i) => i,\n // fixed by xxxxxx vue-i18n 在 dev 模式,访问了 $el,故模拟一个假的\n // $el: i => i.vnode.el,\n $el: (i) => i.__$el || (i.__$el = {}),\n $data: (i) => i.data,\n $props: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.props) : i.props,\n $attrs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.attrs) : i.attrs,\n $slots: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.slots) : i.slots,\n $refs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.refs) : i.refs,\n $parent: (i) => getPublicInstance(i.parent),\n $root: (i) => getPublicInstance(i.root),\n $emit: (i) => i.emit,\n $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,\n $forceUpdate: (i) => i.f || (i.f = () => {\n i.effect.dirty = true;\n queueJob(i.update);\n }),\n // $nextTick: i => i.n || (i.n = nextTick.bind(i.proxy!)),// fixed by xxxxxx\n $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP\n })\n);\nconst isReservedPrefix = (key) => key === \"_\" || key === \"$\";\nconst hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);\nconst PublicInstanceProxyHandlers = {\n get({ _: instance }, key) {\n const { ctx, setupState, data, props, accessCache, type, appContext } = instance;\n if (!!(process.env.NODE_ENV !== \"production\") && key === \"__isVue\") {\n return true;\n }\n let normalizedProps;\n if (key[0] !== \"$\") {\n const n = accessCache[key];\n if (n !== void 0) {\n switch (n) {\n case 1 /* SETUP */:\n return setupState[key];\n case 2 /* DATA */:\n return data[key];\n case 4 /* CONTEXT */:\n return ctx[key];\n case 3 /* PROPS */:\n return props[key];\n }\n } else if (hasSetupBinding(setupState, key)) {\n accessCache[key] = 1 /* SETUP */;\n return setupState[key];\n } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {\n accessCache[key] = 2 /* DATA */;\n return data[key];\n } else if (\n // only cache other properties when instance has declared (thus stable)\n // props\n (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key)\n ) {\n accessCache[key] = 3 /* PROPS */;\n return props[key];\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {\n accessCache[key] = 0 /* OTHER */;\n }\n }\n const publicGetter = publicPropertiesMap[key];\n let cssModule, globalProperties;\n if (publicGetter) {\n if (key === \"$attrs\") {\n track(instance, \"get\", key);\n !!(process.env.NODE_ENV !== \"production\") && markAttrsAccessed();\n } else if (!!(process.env.NODE_ENV !== \"production\") && key === \"$slots\") {\n track(instance, \"get\", key);\n }\n return publicGetter(instance);\n } else if (\n // css module (injected by vue-loader)\n (cssModule = type.__cssModules) && (cssModule = cssModule[key])\n ) {\n return cssModule;\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (\n // global properties\n globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)\n ) {\n {\n return globalProperties[key];\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading\n // to infinite warning loop\n key.indexOf(\"__v\") !== 0)) {\n if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {\n warn$1(\n `Property ${JSON.stringify(\n key\n )} must be accessed via $data because it starts with a reserved character (\"$\" or \"_\") and is not proxied on the render context.`\n );\n } else if (instance === currentRenderingInstance) {\n warn$1(\n `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`\n );\n }\n }\n },\n set({ _: instance }, key, value) {\n const { data, setupState, ctx } = instance;\n if (hasSetupBinding(setupState, key)) {\n setupState[key] = value;\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup && hasOwn(setupState, key)) {\n warn$1(`Cannot mutate \r\n\r\n\n","import MiniProgramPage from 'C:/Users/Administrator/Documents/HBuilderProjects/studyPlan/pages/index/index.vue'\nwx.createPage(MiniProgramPage)"],"names":[],"mappings":";;AAUC,MAAK,YAAU;AAAA,EACd,OAAO;AACN,WAAO;AAAA,MACN,MAAM;AAAA,IACP;AAAA,EACA;AAAA,EACD,SAAS,CAET;AACD;;;;;;;;;;;;;;;;;;AClBD,GAAG,WAAW,eAAe;"} \ No newline at end of file diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-link/components/uni-link/uni-link.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-link/components/uni-link/uni-link.js.map new file mode 100644 index 0000000..08b97de --- /dev/null +++ b/unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-link/components/uni-link/uni-link.js.map @@ -0,0 +1 @@ +{"version":3,"file":"uni-link.js","sources":["uni_modules/uni-link/components/uni-link/uni-link.vue","D:/devapp/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/QzovVXNlcnMvQWRtaW5pc3RyYXRvci9Eb2N1bWVudHMvSEJ1aWxkZXJQcm9qZWN0cy9zdHVkeVBsYW4vdW5pX21vZHVsZXMvdW5pLWxpbmsvY29tcG9uZW50cy91bmktbGluay91bmktbGluay52dWU"],"sourcesContent":["\r\n\r\n\r\n\r\n\r\n","import Component from 'C:/Users/Administrator/Documents/HBuilderProjects/studyPlan/uni_modules/uni-link/components/uni-link/uni-link.vue'\nwx.createComponent(Component)"],"names":["uni"],"mappings":";;AAkCC,MAAK,YAAU;AAAA,EACd,MAAM;AAAA,EACN,OAAO;AAAA,IACN,MAAM;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,IACT;AAAA,IACD,MAAM;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,IACT;AAAA,IACD,UAAU;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,IACT;AAAA,IACD,eAAe;AAAA,MACd,MAAM,CAAC,SAAS,MAAM;AAAA,MACtB,SAAS;AAAA,IACT;AAAA,IACD,UAAU;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,IACT;AAAA,IACD,OAAO;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACT;AAAA,IACD,UAAU;AAAA,MACT,MAAM,CAAC,QAAQ,MAAM;AAAA,MACrB,SAAS;AAAA,IACV;AAAA,EACA;AAAA,EACD,UAAU;AAAA,IACT,UAAU;AAIT,WAAK,KAAK,YAAY,KAAK,YAAY,KAAK,UAAU,MAAM;AAC3D,eAAO;AAAA,MACR;AACA,aAAO;AAAA,IACR;AAAA,EACA;AAAA,EACD,UAAU;AACT,SAAK,QAAQ;AAAA,EACb;AAAA,EACD,SAAS;AAAA,IACR,SAAS;AACR,aAAO,KAAK,KAAK,WAAW,SAAS;AAAA,IACrC;AAAA,IACD,QAAQ;AACP,aAAO,KAAK,KAAK,WAAW,MAAM;AAAA,IAClC;AAAA,IACD,UAAU;AAYTA,oBAAAA,MAAI,iBAAiB;AAAA,QACpB,MAAM,KAAK;AAAA,MACZ,CAAC;AACDA,oBAAAA,MAAI,UAAU;AAAA,QACb,SAAS,KAAK;AAAA,QACd,YAAY;AAAA,MACb,CAAC;AAAA,IAED;AAAA,IACD,cAAc,aAAa;AAC1BA,oBAAAA,MAAI,cAAc;AAAA,QACjB;AAAA,OACA;AAAA,IACF;AAAA,EACD;AACD;;;;;;;;;;;;;;;;;;;;ACjHD,GAAG,gBAAgB,SAAS;"} \ No newline at end of file diff --git a/unpackage/dist/dev/mp-weixin/app.js b/unpackage/dist/dev/mp-weixin/app.js new file mode 100644 index 0000000..3ab8943 --- /dev/null +++ b/unpackage/dist/dev/mp-weixin/app.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); +const common_vendor = require("./common/vendor.js"); +if (!Math) { + "./pages/index/index.js"; +} +const _sfc_main = { + onLaunch: function() { + common_vendor.index.__f__("warn", "at App.vue:4", "当前组件仅支持 uni_modules 目录结构 ,请升级 HBuilderX 到 3.1.0 版本以上!"); + common_vendor.index.__f__("log", "at App.vue:5", "App Launch"); + }, + onShow: function() { + common_vendor.index.__f__("log", "at App.vue:8", "App Show"); + }, + onHide: function() { + common_vendor.index.__f__("log", "at App.vue:11", "App Hide"); + } +}; +function createApp() { + const app = common_vendor.createSSRApp(_sfc_main); + return { + app + }; +} +createApp().app.mount("#app"); +exports.createApp = createApp; +//# sourceMappingURL=../.sourcemap/mp-weixin/app.js.map diff --git a/unpackage/dist/dev/mp-weixin/app.json b/unpackage/dist/dev/mp-weixin/app.json new file mode 100644 index 0000000..37b5a94 --- /dev/null +++ b/unpackage/dist/dev/mp-weixin/app.json @@ -0,0 +1,13 @@ +{ + "pages": [ + "pages/index/index", + "pages/index/detail.vue" + ], + "window": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "uni-app", + "navigationBarBackgroundColor": "#F8F8F8", + "backgroundColor": "#F8F8F8" + }, + "usingComponents": {} +} \ No newline at end of file diff --git a/unpackage/dist/dev/mp-weixin/app.wxss b/unpackage/dist/dev/mp-weixin/app.wxss new file mode 100644 index 0000000..d7d1c36 --- /dev/null +++ b/unpackage/dist/dev/mp-weixin/app.wxss @@ -0,0 +1,2362 @@ +/* 水平间距 */ +/* 水平间距 */ +/*每个页面公共css */ +/* 水平间距 */ +@font-face { + font-family: "customicons"; /* Project id 2878519 */ + src:url('data:font/ttf;base64,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') format('truetype'); +} +.customicons { + font-family: "customicons" !important; +} +.youxi:before { + content: "\e60e"; +} +.wenjian:before { + content: "\e60f"; +} +.zhuanfa:before { + content: "\e610"; +} +.uni-border { + border: 1px #F0F0F0 solid; +} +.uni-primary { + color: #2979ff; +} +.uni-primary-bg { + background-color: #2979ff; +} +.uni-primary-disable { + color: #94bcff; +} +.uni-primary-disable-bg { + background-color: #94bcff; +} +.uni-primary-light { + color: #d4e4ff; +} +.uni-primary-light-bg { + background-color: #d4e4ff; +} +.uni-success { + color: #18bc37; +} +.uni-success-bg { + background-color: #18bc37; +} +.uni-success-disable { + color: #8cde9b; +} +.uni-success-disable-bg { + background-color: #8cde9b; +} +.uni-success-light { + color: #d1f2d7; +} +.uni-success-light-bg { + background-color: #d1f2d7; +} +.uni-warning { + color: #f3a73f; +} +.uni-warning-bg { + background-color: #f3a73f; +} +.uni-warning-disable { + color: #f9d39f; +} +.uni-warning-disable-bg { + background-color: #f9d39f; +} +.uni-warning-light { + color: #fdedd9; +} +.uni-warning-light-bg { + background-color: #fdedd9; +} +.uni-error { + color: #e43d33; +} +.uni-error-bg { + background-color: #e43d33; +} +.uni-error-disable { + color: #f29e99; +} +.uni-error-disable-bg { + background-color: #f29e99; +} +.uni-error-light { + color: #fad8d6; +} +.uni-error-light-bg { + background-color: #fad8d6; +} +.uni-info { + color: #8f939c; +} +.uni-info-bg { + background-color: #8f939c; +} +.uni-info-disable { + color: #c7c9ce; +} +.uni-info-disable-bg { + background-color: #c7c9ce; +} +.uni-info-light { + color: #e9e9eb; +} +.uni-info-light-bg { + background-color: #e9e9eb; +} +.uni-main-color { + color: #3a3a3a; +} +.uni-main-color-bg { + background-color: #3a3a3a; +} +.uni-base-color { + color: #6a6a6a; +} +.uni-base-color-bg { + background-color: #6a6a6a; +} +.uni-secondary-color { + color: #909399; +} +.uni-secondary-color-bg { + background-color: #909399; +} +.uni-extra-color { + color: #c7c7c7; +} +.uni-extra-color-bg { + background-color: #c7c7c7; +} +.uni-bg-color { + color: #f7f7f7; +} +.uni-bg-color-bg { + background-color: #f7f7f7; +} +.uni-border-1 { + color: #F0F0F0; +} +.uni-border-1-bg { + background-color: #F0F0F0; +} +.uni-border-2 { + color: #EDEDED; +} +.uni-border-2-bg { + background-color: #EDEDED; +} +.uni-border-3 { + color: #DCDCDC; +} +.uni-border-3-bg { + background-color: #DCDCDC; +} +.uni-border-4 { + color: #B9B9B9; +} +.uni-border-4-bg { + background-color: #B9B9B9; +} +.uni-black { + color: #000000; +} +.uni-black-bg { + background-color: #000000; +} +.uni-white { + color: #ffffff; +} +.uni-white-bg { + background-color: #ffffff; +} +.uni-transparent { + color: rgba(0, 0, 0, 0); +} +.uni-transparent-bg { + background-color: rgba(0, 0, 0, 0); +} +.uni-shadow-sm { + box-shadow: 0 0 5px rgba(216, 216, 216, 0.5); +} +.uni-shadow-base { + box-shadow: 0 1px 8px 1px rgba(165, 165, 165, 0.2); +} +.uni-shadow-lg { + box-shadow: 0px 1px 10px 2px rgba(165, 164, 164, 0.5); +} +.uni-mask { + background-color: rgba(0, 0, 0, 0.4); +} +.uni-mt-0 { + margin-top: 0px; +} +.uni-mt-n0 { + margin-top: 0px; +} +.uni-mr-0 { + margin-right: 0px; +} +.uni-mr-n0 { + margin-right: 0px; +} +.uni-mb-0 { + margin-bottom: 0px; +} +.uni-mb-n0 { + margin-bottom: 0px; +} +.uni-ml-0 { + margin-left: 0px; +} +.uni-ml-n0 { + margin-left: 0px; +} +.uni-mx-0 { + margin-left: 0px; + margin-right: 0px; +} +.uni-mx-n0 { + margin-left: 0px; + margin-right: 0px; +} +.uni-my-0 { + margin-top: 0px; + margin-bottom: 0px; +} +.uni-my-n0 { + margin-top: 0px; + margin-bottom: 0px; +} +.uni-ma-0 { + margin: 0px; +} +.uni-ma-n0 { + margin: 0px; +} +.uni-mt-1 { + margin-top: 2px; +} +.uni-mt-n1 { + margin-top: -2px; +} +.uni-mr-1 { + margin-right: 2px; +} +.uni-mr-n1 { + margin-right: -2px; +} +.uni-mb-1 { + margin-bottom: 2px; +} +.uni-mb-n1 { + margin-bottom: -2px; +} +.uni-ml-1 { + margin-left: 2px; +} +.uni-ml-n1 { + margin-left: -2px; +} +.uni-mx-1 { + margin-left: 2px; + margin-right: 2px; +} +.uni-mx-n1 { + margin-left: -2px; + margin-right: -2px; +} +.uni-my-1 { + margin-top: 2px; + margin-bottom: 2px; +} +.uni-my-n1 { + margin-top: -2px; + margin-bottom: -2px; +} +.uni-ma-1 { + margin: 2px; +} +.uni-ma-n1 { + margin: -2px; +} +.uni-mt-2 { + margin-top: 4px; +} +.uni-mt-n2 { + margin-top: -4px; +} +.uni-mr-2 { + margin-right: 4px; +} +.uni-mr-n2 { + margin-right: -4px; +} +.uni-mb-2 { + margin-bottom: 4px; +} +.uni-mb-n2 { + margin-bottom: -4px; +} +.uni-ml-2 { + margin-left: 4px; +} +.uni-ml-n2 { + margin-left: -4px; +} +.uni-mx-2 { + margin-left: 4px; + margin-right: 4px; +} +.uni-mx-n2 { + margin-left: -4px; + margin-right: -4px; +} +.uni-my-2 { + margin-top: 4px; + margin-bottom: 4px; +} +.uni-my-n2 { + margin-top: -4px; + margin-bottom: -4px; +} +.uni-ma-2 { + margin: 4px; +} +.uni-ma-n2 { + margin: -4px; +} +.uni-mt-3 { + margin-top: 6px; +} +.uni-mt-n3 { + margin-top: -6px; +} +.uni-mr-3 { + margin-right: 6px; +} +.uni-mr-n3 { + margin-right: -6px; +} +.uni-mb-3 { + margin-bottom: 6px; +} +.uni-mb-n3 { + margin-bottom: -6px; +} +.uni-ml-3 { + margin-left: 6px; +} +.uni-ml-n3 { + margin-left: -6px; +} +.uni-mx-3 { + margin-left: 6px; + margin-right: 6px; +} +.uni-mx-n3 { + margin-left: -6px; + margin-right: -6px; +} +.uni-my-3 { + margin-top: 6px; + margin-bottom: 6px; +} +.uni-my-n3 { + margin-top: -6px; + margin-bottom: -6px; +} +.uni-ma-3 { + margin: 6px; +} +.uni-ma-n3 { + margin: -6px; +} +.uni-mt-4 { + margin-top: 8px; +} +.uni-mt-n4 { + margin-top: -8px; +} +.uni-mr-4 { + margin-right: 8px; +} +.uni-mr-n4 { + margin-right: -8px; +} +.uni-mb-4 { + margin-bottom: 8px; +} +.uni-mb-n4 { + margin-bottom: -8px; +} +.uni-ml-4 { + margin-left: 8px; +} +.uni-ml-n4 { + margin-left: -8px; +} +.uni-mx-4 { + margin-left: 8px; + margin-right: 8px; +} +.uni-mx-n4 { + margin-left: -8px; + margin-right: -8px; +} +.uni-my-4 { + margin-top: 8px; + margin-bottom: 8px; +} +.uni-my-n4 { + margin-top: -8px; + margin-bottom: -8px; +} +.uni-ma-4 { + margin: 8px; +} +.uni-ma-n4 { + margin: -8px; +} +.uni-mt-5 { + margin-top: 10px; +} +.uni-mt-n5 { + margin-top: -10px; +} +.uni-mr-5 { + margin-right: 10px; +} +.uni-mr-n5 { + margin-right: -10px; +} +.uni-mb-5 { + margin-bottom: 10px; +} +.uni-mb-n5 { + margin-bottom: -10px; +} +.uni-ml-5 { + margin-left: 10px; +} +.uni-ml-n5 { + margin-left: -10px; +} +.uni-mx-5 { + margin-left: 10px; + margin-right: 10px; +} +.uni-mx-n5 { + margin-left: -10px; + margin-right: -10px; +} +.uni-my-5 { + margin-top: 10px; + margin-bottom: 10px; +} +.uni-my-n5 { + margin-top: -10px; + margin-bottom: -10px; +} +.uni-ma-5 { + margin: 10px; +} +.uni-ma-n5 { + margin: -10px; +} +.uni-mt-6 { + margin-top: 12px; +} +.uni-mt-n6 { + margin-top: -12px; +} +.uni-mr-6 { + margin-right: 12px; +} +.uni-mr-n6 { + margin-right: -12px; +} +.uni-mb-6 { + margin-bottom: 12px; +} +.uni-mb-n6 { + margin-bottom: -12px; +} +.uni-ml-6 { + margin-left: 12px; +} +.uni-ml-n6 { + margin-left: -12px; +} +.uni-mx-6 { + margin-left: 12px; + margin-right: 12px; +} +.uni-mx-n6 { + margin-left: -12px; + margin-right: -12px; +} +.uni-my-6 { + margin-top: 12px; + margin-bottom: 12px; +} +.uni-my-n6 { + margin-top: -12px; + margin-bottom: -12px; +} +.uni-ma-6 { + margin: 12px; +} +.uni-ma-n6 { + margin: -12px; +} +.uni-mt-7 { + margin-top: 14px; +} +.uni-mt-n7 { + margin-top: -14px; +} +.uni-mr-7 { + margin-right: 14px; +} +.uni-mr-n7 { + margin-right: -14px; +} +.uni-mb-7 { + margin-bottom: 14px; +} +.uni-mb-n7 { + margin-bottom: -14px; +} +.uni-ml-7 { + margin-left: 14px; +} +.uni-ml-n7 { + margin-left: -14px; +} +.uni-mx-7 { + margin-left: 14px; + margin-right: 14px; +} +.uni-mx-n7 { + margin-left: -14px; + margin-right: -14px; +} +.uni-my-7 { + margin-top: 14px; + margin-bottom: 14px; +} +.uni-my-n7 { + margin-top: -14px; + margin-bottom: -14px; +} +.uni-ma-7 { + margin: 14px; +} +.uni-ma-n7 { + margin: -14px; +} +.uni-mt-8 { + margin-top: 16px; +} +.uni-mt-n8 { + margin-top: -16px; +} +.uni-mr-8 { + margin-right: 16px; +} +.uni-mr-n8 { + margin-right: -16px; +} +.uni-mb-8 { + margin-bottom: 16px; +} +.uni-mb-n8 { + margin-bottom: -16px; +} +.uni-ml-8 { + margin-left: 16px; +} +.uni-ml-n8 { + margin-left: -16px; +} +.uni-mx-8 { + margin-left: 16px; + margin-right: 16px; +} +.uni-mx-n8 { + margin-left: -16px; + margin-right: -16px; +} +.uni-my-8 { + margin-top: 16px; + margin-bottom: 16px; +} +.uni-my-n8 { + margin-top: -16px; + margin-bottom: -16px; +} +.uni-ma-8 { + margin: 16px; +} +.uni-ma-n8 { + margin: -16px; +} +.uni-mt-9 { + margin-top: 18px; +} +.uni-mt-n9 { + margin-top: -18px; +} +.uni-mr-9 { + margin-right: 18px; +} +.uni-mr-n9 { + margin-right: -18px; +} +.uni-mb-9 { + margin-bottom: 18px; +} +.uni-mb-n9 { + margin-bottom: -18px; +} +.uni-ml-9 { + margin-left: 18px; +} +.uni-ml-n9 { + margin-left: -18px; +} +.uni-mx-9 { + margin-left: 18px; + margin-right: 18px; +} +.uni-mx-n9 { + margin-left: -18px; + margin-right: -18px; +} +.uni-my-9 { + margin-top: 18px; + margin-bottom: 18px; +} +.uni-my-n9 { + margin-top: -18px; + margin-bottom: -18px; +} +.uni-ma-9 { + margin: 18px; +} +.uni-ma-n9 { + margin: -18px; +} +.uni-mt-10 { + margin-top: 20px; +} +.uni-mt-n10 { + margin-top: -20px; +} +.uni-mr-10 { + margin-right: 20px; +} +.uni-mr-n10 { + margin-right: -20px; +} +.uni-mb-10 { + margin-bottom: 20px; +} +.uni-mb-n10 { + margin-bottom: -20px; +} +.uni-ml-10 { + margin-left: 20px; +} +.uni-ml-n10 { + margin-left: -20px; +} +.uni-mx-10 { + margin-left: 20px; + margin-right: 20px; +} +.uni-mx-n10 { + margin-left: -20px; + margin-right: -20px; +} +.uni-my-10 { + margin-top: 20px; + margin-bottom: 20px; +} +.uni-my-n10 { + margin-top: -20px; + margin-bottom: -20px; +} +.uni-ma-10 { + margin: 20px; +} +.uni-ma-n10 { + margin: -20px; +} +.uni-mt-11 { + margin-top: 22px; +} +.uni-mt-n11 { + margin-top: -22px; +} +.uni-mr-11 { + margin-right: 22px; +} +.uni-mr-n11 { + margin-right: -22px; +} +.uni-mb-11 { + margin-bottom: 22px; +} +.uni-mb-n11 { + margin-bottom: -22px; +} +.uni-ml-11 { + margin-left: 22px; +} +.uni-ml-n11 { + margin-left: -22px; +} +.uni-mx-11 { + margin-left: 22px; + margin-right: 22px; +} +.uni-mx-n11 { + margin-left: -22px; + margin-right: -22px; +} +.uni-my-11 { + margin-top: 22px; + margin-bottom: 22px; +} +.uni-my-n11 { + margin-top: -22px; + margin-bottom: -22px; +} +.uni-ma-11 { + margin: 22px; +} +.uni-ma-n11 { + margin: -22px; +} +.uni-mt-12 { + margin-top: 24px; +} +.uni-mt-n12 { + margin-top: -24px; +} +.uni-mr-12 { + margin-right: 24px; +} +.uni-mr-n12 { + margin-right: -24px; +} +.uni-mb-12 { + margin-bottom: 24px; +} +.uni-mb-n12 { + margin-bottom: -24px; +} +.uni-ml-12 { + margin-left: 24px; +} +.uni-ml-n12 { + margin-left: -24px; +} +.uni-mx-12 { + margin-left: 24px; + margin-right: 24px; +} +.uni-mx-n12 { + margin-left: -24px; + margin-right: -24px; +} +.uni-my-12 { + margin-top: 24px; + margin-bottom: 24px; +} +.uni-my-n12 { + margin-top: -24px; + margin-bottom: -24px; +} +.uni-ma-12 { + margin: 24px; +} +.uni-ma-n12 { + margin: -24px; +} +.uni-mt-13 { + margin-top: 26px; +} +.uni-mt-n13 { + margin-top: -26px; +} +.uni-mr-13 { + margin-right: 26px; +} +.uni-mr-n13 { + margin-right: -26px; +} +.uni-mb-13 { + margin-bottom: 26px; +} +.uni-mb-n13 { + margin-bottom: -26px; +} +.uni-ml-13 { + margin-left: 26px; +} +.uni-ml-n13 { + margin-left: -26px; +} +.uni-mx-13 { + margin-left: 26px; + margin-right: 26px; +} +.uni-mx-n13 { + margin-left: -26px; + margin-right: -26px; +} +.uni-my-13 { + margin-top: 26px; + margin-bottom: 26px; +} +.uni-my-n13 { + margin-top: -26px; + margin-bottom: -26px; +} +.uni-ma-13 { + margin: 26px; +} +.uni-ma-n13 { + margin: -26px; +} +.uni-mt-14 { + margin-top: 28px; +} +.uni-mt-n14 { + margin-top: -28px; +} +.uni-mr-14 { + margin-right: 28px; +} +.uni-mr-n14 { + margin-right: -28px; +} +.uni-mb-14 { + margin-bottom: 28px; +} +.uni-mb-n14 { + margin-bottom: -28px; +} +.uni-ml-14 { + margin-left: 28px; +} +.uni-ml-n14 { + margin-left: -28px; +} +.uni-mx-14 { + margin-left: 28px; + margin-right: 28px; +} +.uni-mx-n14 { + margin-left: -28px; + margin-right: -28px; +} +.uni-my-14 { + margin-top: 28px; + margin-bottom: 28px; +} +.uni-my-n14 { + margin-top: -28px; + margin-bottom: -28px; +} +.uni-ma-14 { + margin: 28px; +} +.uni-ma-n14 { + margin: -28px; +} +.uni-mt-15 { + margin-top: 30px; +} +.uni-mt-n15 { + margin-top: -30px; +} +.uni-mr-15 { + margin-right: 30px; +} +.uni-mr-n15 { + margin-right: -30px; +} +.uni-mb-15 { + margin-bottom: 30px; +} +.uni-mb-n15 { + margin-bottom: -30px; +} +.uni-ml-15 { + margin-left: 30px; +} +.uni-ml-n15 { + margin-left: -30px; +} +.uni-mx-15 { + margin-left: 30px; + margin-right: 30px; +} +.uni-mx-n15 { + margin-left: -30px; + margin-right: -30px; +} +.uni-my-15 { + margin-top: 30px; + margin-bottom: 30px; +} +.uni-my-n15 { + margin-top: -30px; + margin-bottom: -30px; +} +.uni-ma-15 { + margin: 30px; +} +.uni-ma-n15 { + margin: -30px; +} +.uni-mt-16 { + margin-top: 32px; +} +.uni-mt-n16 { + margin-top: -32px; +} +.uni-mr-16 { + margin-right: 32px; +} +.uni-mr-n16 { + margin-right: -32px; +} +.uni-mb-16 { + margin-bottom: 32px; +} +.uni-mb-n16 { + margin-bottom: -32px; +} +.uni-ml-16 { + margin-left: 32px; +} +.uni-ml-n16 { + margin-left: -32px; +} +.uni-mx-16 { + margin-left: 32px; + margin-right: 32px; +} +.uni-mx-n16 { + margin-left: -32px; + margin-right: -32px; +} +.uni-my-16 { + margin-top: 32px; + margin-bottom: 32px; +} +.uni-my-n16 { + margin-top: -32px; + margin-bottom: -32px; +} +.uni-ma-16 { + margin: 32px; +} +.uni-ma-n16 { + margin: -32px; +} +.uni-pt-0 { + padding-top: 0px; +} +.uni-pt-n0 { + padding-top: 0px; +} +.uni-pr-0 { + padding-right: 0px; +} +.uni-pr-n0 { + padding-right: 0px; +} +.uni-pb-0 { + padding-bottom: 0px; +} +.uni-pb-n0 { + padding-bottom: 0px; +} +.uni-pl-0 { + padding-left: 0px; +} +.uni-pl-n0 { + padding-left: 0px; +} +.uni-px-0 { + padding-left: 0px; + padding-right: 0px; +} +.uni-px-n0 { + padding-left: 0px; + padding-right: 0px; +} +.uni-py-0 { + padding-top: 0px; + padding-bottom: 0px; +} +.uni-py-n0 { + padding-top: 0px; + padding-bottom: 0px; +} +.uni-pa-0 { + padding: 0px; +} +.uni-pa-n0 { + padding: 0px; +} +.uni-pt-1 { + padding-top: 2px; +} +.uni-pt-n1 { + padding-top: -2px; +} +.uni-pr-1 { + padding-right: 2px; +} +.uni-pr-n1 { + padding-right: -2px; +} +.uni-pb-1 { + padding-bottom: 2px; +} +.uni-pb-n1 { + padding-bottom: -2px; +} +.uni-pl-1 { + padding-left: 2px; +} +.uni-pl-n1 { + padding-left: -2px; +} +.uni-px-1 { + padding-left: 2px; + padding-right: 2px; +} +.uni-px-n1 { + padding-left: -2px; + padding-right: -2px; +} +.uni-py-1 { + padding-top: 2px; + padding-bottom: 2px; +} +.uni-py-n1 { + padding-top: -2px; + padding-bottom: -2px; +} +.uni-pa-1 { + padding: 2px; +} +.uni-pa-n1 { + padding: -2px; +} +.uni-pt-2 { + padding-top: 4px; +} +.uni-pt-n2 { + padding-top: -4px; +} +.uni-pr-2 { + padding-right: 4px; +} +.uni-pr-n2 { + padding-right: -4px; +} +.uni-pb-2 { + padding-bottom: 4px; +} +.uni-pb-n2 { + padding-bottom: -4px; +} +.uni-pl-2 { + padding-left: 4px; +} +.uni-pl-n2 { + padding-left: -4px; +} +.uni-px-2 { + padding-left: 4px; + padding-right: 4px; +} +.uni-px-n2 { + padding-left: -4px; + padding-right: -4px; +} +.uni-py-2 { + padding-top: 4px; + padding-bottom: 4px; +} +.uni-py-n2 { + padding-top: -4px; + padding-bottom: -4px; +} +.uni-pa-2 { + padding: 4px; +} +.uni-pa-n2 { + padding: -4px; +} +.uni-pt-3 { + padding-top: 6px; +} +.uni-pt-n3 { + padding-top: -6px; +} +.uni-pr-3 { + padding-right: 6px; +} +.uni-pr-n3 { + padding-right: -6px; +} +.uni-pb-3 { + padding-bottom: 6px; +} +.uni-pb-n3 { + padding-bottom: -6px; +} +.uni-pl-3 { + padding-left: 6px; +} +.uni-pl-n3 { + padding-left: -6px; +} +.uni-px-3 { + padding-left: 6px; + padding-right: 6px; +} +.uni-px-n3 { + padding-left: -6px; + padding-right: -6px; +} +.uni-py-3 { + padding-top: 6px; + padding-bottom: 6px; +} +.uni-py-n3 { + padding-top: -6px; + padding-bottom: -6px; +} +.uni-pa-3 { + padding: 6px; +} +.uni-pa-n3 { + padding: -6px; +} +.uni-pt-4 { + padding-top: 8px; +} +.uni-pt-n4 { + padding-top: -8px; +} +.uni-pr-4 { + padding-right: 8px; +} +.uni-pr-n4 { + padding-right: -8px; +} +.uni-pb-4 { + padding-bottom: 8px; +} +.uni-pb-n4 { + padding-bottom: -8px; +} +.uni-pl-4 { + padding-left: 8px; +} +.uni-pl-n4 { + padding-left: -8px; +} +.uni-px-4 { + padding-left: 8px; + padding-right: 8px; +} +.uni-px-n4 { + padding-left: -8px; + padding-right: -8px; +} +.uni-py-4 { + padding-top: 8px; + padding-bottom: 8px; +} +.uni-py-n4 { + padding-top: -8px; + padding-bottom: -8px; +} +.uni-pa-4 { + padding: 8px; +} +.uni-pa-n4 { + padding: -8px; +} +.uni-pt-5 { + padding-top: 10px; +} +.uni-pt-n5 { + padding-top: -10px; +} +.uni-pr-5 { + padding-right: 10px; +} +.uni-pr-n5 { + padding-right: -10px; +} +.uni-pb-5 { + padding-bottom: 10px; +} +.uni-pb-n5 { + padding-bottom: -10px; +} +.uni-pl-5 { + padding-left: 10px; +} +.uni-pl-n5 { + padding-left: -10px; +} +.uni-px-5 { + padding-left: 10px; + padding-right: 10px; +} +.uni-px-n5 { + padding-left: -10px; + padding-right: -10px; +} +.uni-py-5 { + padding-top: 10px; + padding-bottom: 10px; +} +.uni-py-n5 { + padding-top: -10px; + padding-bottom: -10px; +} +.uni-pa-5 { + padding: 10px; +} +.uni-pa-n5 { + padding: -10px; +} +.uni-pt-6 { + padding-top: 12px; +} +.uni-pt-n6 { + padding-top: -12px; +} +.uni-pr-6 { + padding-right: 12px; +} +.uni-pr-n6 { + padding-right: -12px; +} +.uni-pb-6 { + padding-bottom: 12px; +} +.uni-pb-n6 { + padding-bottom: -12px; +} +.uni-pl-6 { + padding-left: 12px; +} +.uni-pl-n6 { + padding-left: -12px; +} +.uni-px-6 { + padding-left: 12px; + padding-right: 12px; +} +.uni-px-n6 { + padding-left: -12px; + padding-right: -12px; +} +.uni-py-6 { + padding-top: 12px; + padding-bottom: 12px; +} +.uni-py-n6 { + padding-top: -12px; + padding-bottom: -12px; +} +.uni-pa-6 { + padding: 12px; +} +.uni-pa-n6 { + padding: -12px; +} +.uni-pt-7 { + padding-top: 14px; +} +.uni-pt-n7 { + padding-top: -14px; +} +.uni-pr-7 { + padding-right: 14px; +} +.uni-pr-n7 { + padding-right: -14px; +} +.uni-pb-7 { + padding-bottom: 14px; +} +.uni-pb-n7 { + padding-bottom: -14px; +} +.uni-pl-7 { + padding-left: 14px; +} +.uni-pl-n7 { + padding-left: -14px; +} +.uni-px-7 { + padding-left: 14px; + padding-right: 14px; +} +.uni-px-n7 { + padding-left: -14px; + padding-right: -14px; +} +.uni-py-7 { + padding-top: 14px; + padding-bottom: 14px; +} +.uni-py-n7 { + padding-top: -14px; + padding-bottom: -14px; +} +.uni-pa-7 { + padding: 14px; +} +.uni-pa-n7 { + padding: -14px; +} +.uni-pt-8 { + padding-top: 16px; +} +.uni-pt-n8 { + padding-top: -16px; +} +.uni-pr-8 { + padding-right: 16px; +} +.uni-pr-n8 { + padding-right: -16px; +} +.uni-pb-8 { + padding-bottom: 16px; +} +.uni-pb-n8 { + padding-bottom: -16px; +} +.uni-pl-8 { + padding-left: 16px; +} +.uni-pl-n8 { + padding-left: -16px; +} +.uni-px-8 { + padding-left: 16px; + padding-right: 16px; +} +.uni-px-n8 { + padding-left: -16px; + padding-right: -16px; +} +.uni-py-8 { + padding-top: 16px; + padding-bottom: 16px; +} +.uni-py-n8 { + padding-top: -16px; + padding-bottom: -16px; +} +.uni-pa-8 { + padding: 16px; +} +.uni-pa-n8 { + padding: -16px; +} +.uni-pt-9 { + padding-top: 18px; +} +.uni-pt-n9 { + padding-top: -18px; +} +.uni-pr-9 { + padding-right: 18px; +} +.uni-pr-n9 { + padding-right: -18px; +} +.uni-pb-9 { + padding-bottom: 18px; +} +.uni-pb-n9 { + padding-bottom: -18px; +} +.uni-pl-9 { + padding-left: 18px; +} +.uni-pl-n9 { + padding-left: -18px; +} +.uni-px-9 { + padding-left: 18px; + padding-right: 18px; +} +.uni-px-n9 { + padding-left: -18px; + padding-right: -18px; +} +.uni-py-9 { + padding-top: 18px; + padding-bottom: 18px; +} +.uni-py-n9 { + padding-top: -18px; + padding-bottom: -18px; +} +.uni-pa-9 { + padding: 18px; +} +.uni-pa-n9 { + padding: -18px; +} +.uni-pt-10 { + padding-top: 20px; +} +.uni-pt-n10 { + padding-top: -20px; +} +.uni-pr-10 { + padding-right: 20px; +} +.uni-pr-n10 { + padding-right: -20px; +} +.uni-pb-10 { + padding-bottom: 20px; +} +.uni-pb-n10 { + padding-bottom: -20px; +} +.uni-pl-10 { + padding-left: 20px; +} +.uni-pl-n10 { + padding-left: -20px; +} +.uni-px-10 { + padding-left: 20px; + padding-right: 20px; +} +.uni-px-n10 { + padding-left: -20px; + padding-right: -20px; +} +.uni-py-10 { + padding-top: 20px; + padding-bottom: 20px; +} +.uni-py-n10 { + padding-top: -20px; + padding-bottom: -20px; +} +.uni-pa-10 { + padding: 20px; +} +.uni-pa-n10 { + padding: -20px; +} +.uni-pt-11 { + padding-top: 22px; +} +.uni-pt-n11 { + padding-top: -22px; +} +.uni-pr-11 { + padding-right: 22px; +} +.uni-pr-n11 { + padding-right: -22px; +} +.uni-pb-11 { + padding-bottom: 22px; +} +.uni-pb-n11 { + padding-bottom: -22px; +} +.uni-pl-11 { + padding-left: 22px; +} +.uni-pl-n11 { + padding-left: -22px; +} +.uni-px-11 { + padding-left: 22px; + padding-right: 22px; +} +.uni-px-n11 { + padding-left: -22px; + padding-right: -22px; +} +.uni-py-11 { + padding-top: 22px; + padding-bottom: 22px; +} +.uni-py-n11 { + padding-top: -22px; + padding-bottom: -22px; +} +.uni-pa-11 { + padding: 22px; +} +.uni-pa-n11 { + padding: -22px; +} +.uni-pt-12 { + padding-top: 24px; +} +.uni-pt-n12 { + padding-top: -24px; +} +.uni-pr-12 { + padding-right: 24px; +} +.uni-pr-n12 { + padding-right: -24px; +} +.uni-pb-12 { + padding-bottom: 24px; +} +.uni-pb-n12 { + padding-bottom: -24px; +} +.uni-pl-12 { + padding-left: 24px; +} +.uni-pl-n12 { + padding-left: -24px; +} +.uni-px-12 { + padding-left: 24px; + padding-right: 24px; +} +.uni-px-n12 { + padding-left: -24px; + padding-right: -24px; +} +.uni-py-12 { + padding-top: 24px; + padding-bottom: 24px; +} +.uni-py-n12 { + padding-top: -24px; + padding-bottom: -24px; +} +.uni-pa-12 { + padding: 24px; +} +.uni-pa-n12 { + padding: -24px; +} +.uni-pt-13 { + padding-top: 26px; +} +.uni-pt-n13 { + padding-top: -26px; +} +.uni-pr-13 { + padding-right: 26px; +} +.uni-pr-n13 { + padding-right: -26px; +} +.uni-pb-13 { + padding-bottom: 26px; +} +.uni-pb-n13 { + padding-bottom: -26px; +} +.uni-pl-13 { + padding-left: 26px; +} +.uni-pl-n13 { + padding-left: -26px; +} +.uni-px-13 { + padding-left: 26px; + padding-right: 26px; +} +.uni-px-n13 { + padding-left: -26px; + padding-right: -26px; +} +.uni-py-13 { + padding-top: 26px; + padding-bottom: 26px; +} +.uni-py-n13 { + padding-top: -26px; + padding-bottom: -26px; +} +.uni-pa-13 { + padding: 26px; +} +.uni-pa-n13 { + padding: -26px; +} +.uni-pt-14 { + padding-top: 28px; +} +.uni-pt-n14 { + padding-top: -28px; +} +.uni-pr-14 { + padding-right: 28px; +} +.uni-pr-n14 { + padding-right: -28px; +} +.uni-pb-14 { + padding-bottom: 28px; +} +.uni-pb-n14 { + padding-bottom: -28px; +} +.uni-pl-14 { + padding-left: 28px; +} +.uni-pl-n14 { + padding-left: -28px; +} +.uni-px-14 { + padding-left: 28px; + padding-right: 28px; +} +.uni-px-n14 { + padding-left: -28px; + padding-right: -28px; +} +.uni-py-14 { + padding-top: 28px; + padding-bottom: 28px; +} +.uni-py-n14 { + padding-top: -28px; + padding-bottom: -28px; +} +.uni-pa-14 { + padding: 28px; +} +.uni-pa-n14 { + padding: -28px; +} +.uni-pt-15 { + padding-top: 30px; +} +.uni-pt-n15 { + padding-top: -30px; +} +.uni-pr-15 { + padding-right: 30px; +} +.uni-pr-n15 { + padding-right: -30px; +} +.uni-pb-15 { + padding-bottom: 30px; +} +.uni-pb-n15 { + padding-bottom: -30px; +} +.uni-pl-15 { + padding-left: 30px; +} +.uni-pl-n15 { + padding-left: -30px; +} +.uni-px-15 { + padding-left: 30px; + padding-right: 30px; +} +.uni-px-n15 { + padding-left: -30px; + padding-right: -30px; +} +.uni-py-15 { + padding-top: 30px; + padding-bottom: 30px; +} +.uni-py-n15 { + padding-top: -30px; + padding-bottom: -30px; +} +.uni-pa-15 { + padding: 30px; +} +.uni-pa-n15 { + padding: -30px; +} +.uni-pt-16 { + padding-top: 32px; +} +.uni-pt-n16 { + padding-top: -32px; +} +.uni-pr-16 { + padding-right: 32px; +} +.uni-pr-n16 { + padding-right: -32px; +} +.uni-pb-16 { + padding-bottom: 32px; +} +.uni-pb-n16 { + padding-bottom: -32px; +} +.uni-pl-16 { + padding-left: 32px; +} +.uni-pl-n16 { + padding-left: -32px; +} +.uni-px-16 { + padding-left: 32px; + padding-right: 32px; +} +.uni-px-n16 { + padding-left: -32px; + padding-right: -32px; +} +.uni-py-16 { + padding-top: 32px; + padding-bottom: 32px; +} +.uni-py-n16 { + padding-top: -32px; + padding-bottom: -32px; +} +.uni-pa-16 { + padding: 32px; +} +.uni-pa-n16 { + padding: -32px; +} +.uni-radius-0 { + border-radius: 0; +} +.uni-radius { + border-radius: 5px; +} +.uni-radius-lg { + border-radius: 10px; +} +.uni-radius-xl { + border-radius: 30px; +} +.uni-radius-pill { + border-radius: 9999px; +} +.uni-radius-circle { + border-radius: 50%; +} +.uni-radius-t-0 { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.uni-radius-t { + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} +.uni-radius-t-lg { + border-top-left-radius: 10px; + border-top-right-radius: 10px; +} +.uni-radius-t-xl { + border-top-left-radius: 30px; + border-top-right-radius: 30px; +} +.uni-radius-t-pill { + border-top-left-radius: 9999px; + border-top-right-radius: 9999px; +} +.uni-radius-t-circle { + border-top-left-radius: 50%; + border-top-right-radius: 50%; +} +.uni-radius-r-0 { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.uni-radius-r { + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; +} +.uni-radius-r-lg { + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; +} +.uni-radius-r-xl { + border-top-right-radius: 30px; + border-bottom-right-radius: 30px; +} +.uni-radius-r-pill { + border-top-right-radius: 9999px; + border-bottom-right-radius: 9999px; +} +.uni-radius-r-circle { + border-top-right-radius: 50%; + border-bottom-right-radius: 50%; +} +.uni-radius-b-0 { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +.uni-radius-b { + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; +} +.uni-radius-b-lg { + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; +} +.uni-radius-b-xl { + border-bottom-left-radius: 30px; + border-bottom-right-radius: 30px; +} +.uni-radius-b-pill { + border-bottom-left-radius: 9999px; + border-bottom-right-radius: 9999px; +} +.uni-radius-b-circle { + border-bottom-left-radius: 50%; + border-bottom-right-radius: 50%; +} +.uni-radius-l-0 { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.uni-radius-l { + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; +} +.uni-radius-l-lg { + border-top-left-radius: 10px; + border-bottom-left-radius: 10px; +} +.uni-radius-l-xl { + border-top-left-radius: 30px; + border-bottom-left-radius: 30px; +} +.uni-radius-l-pill { + border-top-left-radius: 9999px; + border-bottom-left-radius: 9999px; +} +.uni-radius-l-circle { + border-top-left-radius: 50%; + border-bottom-left-radius: 50%; +} +.uni-radius-tl-0 { + border-top-left-radius: 0; +} +.uni-radius-tl { + border-top-left-radius: 5px; +} +.uni-radius-tl-lg { + border-top-left-radius: 10px; +} +.uni-radius-tl-xl { + border-top-left-radius: 30px; +} +.uni-radius-tl-pill { + border-top-left-radius: 9999px; +} +.uni-radius-tl-circle { + border-top-left-radius: 50%; +} +.uni-radius-tr-0 { + border-top-right-radius: 0; +} +.uni-radius-tr { + border-top-right-radius: 5px; +} +.uni-radius-tr-lg { + border-top-right-radius: 10px; +} +.uni-radius-tr-xl { + border-top-right-radius: 30px; +} +.uni-radius-tr-pill { + border-top-right-radius: 9999px; +} +.uni-radius-tr-circle { + border-top-right-radius: 50%; +} +.uni-radius-br-0 { + border-bottom-right-radius: 0; +} +.uni-radius-br { + border-bottom-right-radius: 5px; +} +.uni-radius-br-lg { + border-bottom-right-radius: 10px; +} +.uni-radius-br-xl { + border-bottom-right-radius: 30px; +} +.uni-radius-br-pill { + border-bottom-right-radius: 9999px; +} +.uni-radius-br-circle { + border-bottom-right-radius: 50%; +} +.uni-radius-bl-0 { + border-bottom-left-radius: 0; +} +.uni-radius-bl { + border-bottom-left-radius: 5px; +} +.uni-radius-bl-lg { + border-bottom-left-radius: 10px; +} +.uni-radius-bl-xl { + border-bottom-left-radius: 30px; +} +.uni-radius-bl-pill { + border-bottom-left-radius: 9999px; +} +.uni-radius-bl-circle { + border-bottom-left-radius: 50%; +} +.uni-h1 { + font-size: 32px; + font-weight: 300; + line-height: 50px; +} +.uni-h2 { + font-size: 28px; + font-weight: 300; + line-height: 40px; +} +.uni-h3 { + font-size: 24px; + font-weight: 400; + line-height: 32px; +} +.uni-h4 { + font-size: 20px; + font-weight: 400; + line-height: 30px; +} +.uni-h5 { + font-size: 16px; + font-weight: 400; + line-height: 24px; +} +.uni-h6 { + font-size: 14px; + font-weight: 500; + line-height: 18px; +} +.uni-subtitle { + font-size: 12px; + font-weight: 400; + line-height: 20px; +} +.uni-body { + font-size: 14px; + font-weight: 400; + line-height: 22px; +} +.uni-caption { + font-size: 12px; + font-weight: 400; + line-height: 20px; +} +.uni-btn { + margin: 5px; + color: #393939; + border: 1px solid #ccc; + font-size: 16px; + font-weight: 200; + background-color: #F9F9F9; + overflow: visible; +} +.uni-btn::after { + border: none; +} +.uni-btn:not([type]), .uni-btn[type=default] { + color: #999; +} +.uni-btn:not([type])[loading], .uni-btn[type=default][loading] { + background: none; +} +.uni-btn:not([type])[loading]::before, .uni-btn[type=default][loading]::before { + margin-right: 5px; +} +.uni-btn:not([type])[disabled], .uni-btn[type=default][disabled] { + color: #d6d6d6; +} +.uni-btn:not([type])[disabled], .uni-btn:not([type])[disabled][loading], .uni-btn:not([type])[disabled]:active, .uni-btn[type=default][disabled], .uni-btn[type=default][disabled][loading], .uni-btn[type=default][disabled]:active { + color: #d6d6d6; + background-color: #fafafa; + border-color: #f0f0f0; +} +.uni-btn:not([type])[plain], .uni-btn[type=default][plain] { + color: #999; + background: none; + border-color: #F0F0F0; +} +.uni-btn:not([type])[plain]:not([hover-class]):active, .uni-btn[type=default][plain]:not([hover-class]):active { + background: none; + color: #cccccc; + border-color: #e6e6e6; + outline: none; +} +.uni-btn:not([type])[plain][disabled], .uni-btn:not([type])[plain][disabled][loading], .uni-btn:not([type])[plain][disabled]:active, .uni-btn[type=default][plain][disabled], .uni-btn[type=default][plain][disabled][loading], .uni-btn[type=default][plain][disabled]:active { + background: none; + color: #d6d6d6; + border-color: #f0f0f0; +} +.uni-btn:not([hover-class]):active { + color: gray; +} +.uni-btn[size=mini] { + font-size: 16px; + font-weight: 200; + border-radius: 8px; +} +.uni-btn.uni-btn-small { + font-size: 14px; +} +.uni-btn.uni-btn-mini { + font-size: 12px; +} +.uni-btn.uni-btn-radius { + border-radius: 999px; +} +.uni-btn[type=primary] { + color: #fff; + background-color: #2979ff; + border-color: #266feb; +} +.uni-btn[type=primary]:not([hover-class]):active { + background: #256de6; + border-color: #2161cc; + color: #fff; + outline: none; +} +.uni-btn[type=primary][loading] { + color: #fff; + background-color: #2979ff; + border-color: #266feb; +} +.uni-btn[type=primary][loading]:not([hover-class]):active { + background: #256de6; + border-color: #2161cc; + color: #fff; + outline: none; +} +.uni-btn[type=primary][loading]::before { + margin-right: 5px; +} +.uni-btn[type=primary][disabled], .uni-btn[type=primary][disabled][loading], .uni-btn[type=primary][disabled]:not([hover-class]):active { + color: #fff; + border-color: #80aefa; + background-color: #94bcff; +} +.uni-btn[type=primary][plain] { + color: #2979ff; + background-color: #eaf2ff; + border-color: #bfd7ff; +} +.uni-btn[type=primary][plain]:not([hover-class]):active { + background: #d4e4ff; + color: #2979ff; + outline: none; + border-color: #94bcff; +} +.uni-btn[type=primary][plain][loading] { + color: #2979ff; + background-color: #eaf2ff; + border-color: #bfd7ff; +} +.uni-btn[type=primary][plain][loading]:not([hover-class]):active { + background: #d4e4ff; + color: #2979ff; + outline: none; + border-color: #94bcff; +} +.uni-btn[type=primary][plain][loading]::before { + margin-right: 5px; +} +.uni-btn[type=primary][plain][disabled], .uni-btn[type=primary][plain][disabled]:active { + color: #7fafff; + background-color: #eaf2ff; + border-color: #d4e4ff; +} +.uni-btn[type=success] { + color: #fff; + background-color: #18bc37; + border-color: #16ad33; +} +.uni-btn[type=success]:not([hover-class]):active { + background: #16a932; + border-color: #13962c; + color: #fff; + outline: none; +} +.uni-btn[type=success][loading] { + color: #fff; + background-color: #18bc37; + border-color: #16ad33; +} +.uni-btn[type=success][loading]:not([hover-class]):active { + background: #16a932; + border-color: #13962c; + color: #fff; + outline: none; +} +.uni-btn[type=success][loading]::before { + margin-right: 5px; +} +.uni-btn[type=success][disabled], .uni-btn[type=success][disabled][loading], .uni-btn[type=success][disabled]:not([hover-class]):active { + color: #fff; + border-color: #89c795; + background-color: #8cde9b; +} +.uni-btn[type=success][plain] { + color: #18bc37; + background-color: #e8f8eb; + border-color: #baebc3; +} +.uni-btn[type=success][plain]:not([hover-class]):active { + background: #d1f2d7; + color: #18bc37; + outline: none; + border-color: #8cde9b; +} +.uni-btn[type=success][plain][loading] { + color: #18bc37; + background-color: #e8f8eb; + border-color: #baebc3; +} +.uni-btn[type=success][plain][loading]:not([hover-class]):active { + background: #d1f2d7; + color: #18bc37; + outline: none; + border-color: #8cde9b; +} +.uni-btn[type=success][plain][loading]::before { + margin-right: 5px; +} +.uni-btn[type=success][plain][disabled], .uni-btn[type=success][plain][disabled]:active { + color: #74d787; + background-color: #e8f8eb; + border-color: #d1f2d7; +} +.uni-btn[type=error] { + color: #fff; + background-color: #e43d33; + border-color: #d2382f; +} +.uni-btn[type=error]:not([hover-class]):active { + background: #cd372e; + border-color: #b63129; + color: #fff; + outline: none; +} +.uni-btn[type=error][loading] { + color: #fff; + background-color: #e43d33; + border-color: #d2382f; +} +.uni-btn[type=error][loading]:not([hover-class]):active { + background: #cd372e; + border-color: #b63129; + color: #fff; + outline: none; +} +.uni-btn[type=error][loading]::before { + margin-right: 5px; +} +.uni-btn[type=error][disabled], .uni-btn[type=error][disabled][loading], .uni-btn[type=error][disabled]:not([hover-class]):active { + color: #fff; + border-color: #e4928d; + background-color: #f29e99; +} +.uni-btn[type=error][plain] { + color: #e43d33; + background-color: #fceceb; + border-color: #f7c5c2; +} +.uni-btn[type=error][plain]:not([hover-class]):active { + background: #fad8d6; + color: #e43d33; + outline: none; + border-color: #f29e99; +} +.uni-btn[type=error][plain][loading] { + color: #e43d33; + background-color: #fceceb; + border-color: #f7c5c2; +} +.uni-btn[type=error][plain][loading]:not([hover-class]):active { + background: #fad8d6; + color: #e43d33; + outline: none; + border-color: #f29e99; +} +.uni-btn[type=error][plain][loading]::before { + margin-right: 5px; +} +.uni-btn[type=error][plain][disabled], .uni-btn[type=error][plain][disabled]:active { + color: #ef8b85; + background-color: #fceceb; + border-color: #fad8d6; +} +.uni-btn[type=warning] { + color: #fff; + background-color: #f3a73f; + border-color: #e09a3a; +} +.uni-btn[type=warning]:not([hover-class]):active { + background: #db9639; + border-color: #c28632; + color: #fff; + outline: none; +} +.uni-btn[type=warning][loading] { + color: #fff; + background-color: #f3a73f; + border-color: #e09a3a; +} +.uni-btn[type=warning][loading]:not([hover-class]):active { + background: #db9639; + border-color: #c28632; + color: #fff; + outline: none; +} +.uni-btn[type=warning][loading]::before { + margin-right: 5px; +} +.uni-btn[type=warning][disabled], .uni-btn[type=warning][disabled][loading], .uni-btn[type=warning][disabled]:not([hover-class]):active { + color: #fff; + border-color: #f8c887; + background-color: #f9d39f; +} +.uni-btn[type=warning][plain] { + color: #f3a73f; + background-color: #fef6ec; + border-color: #fbe5c5; +} +.uni-btn[type=warning][plain]:not([hover-class]):active { + background: #fdedd9; + color: #f3a73f; + outline: none; + border-color: #f9d39f; +} +.uni-btn[type=warning][plain][loading] { + color: #f3a73f; + background-color: #fef6ec; + border-color: #fbe5c5; +} +.uni-btn[type=warning][plain][loading]:not([hover-class]):active { + background: #fdedd9; + color: #f3a73f; + outline: none; + border-color: #f9d39f; +} +.uni-btn[type=warning][plain][loading]::before { + margin-right: 5px; +} +.uni-btn[type=warning][plain][disabled], .uni-btn[type=warning][plain][disabled]:active { + color: #f8ca8c; + background-color: #fef6ec; + border-color: #fdedd9; +} +.uni-btn[type=info] { + color: #fff; + background-color: #8f939c; + border-color: #848790; +} +.uni-btn[type=info]:not([hover-class]):active { + background: #81848c; + border-color: #72767d; + color: #fff; + outline: none; +} +.uni-btn[type=info][loading] { + color: #fff; + background-color: #8f939c; + border-color: #848790; +} +.uni-btn[type=info][loading]:not([hover-class]):active { + background: #81848c; + border-color: #72767d; + color: #fff; + outline: none; +} +.uni-btn[type=info][loading]::before { + margin-right: 5px; +} +.uni-btn[type=info][disabled], .uni-btn[type=info][disabled][loading], .uni-btn[type=info][disabled]:not([hover-class]):active { + color: #fff; + border-color: #babcc2; + background-color: #c7c9ce; +} +.uni-btn[type=info][plain] { + color: #8f939c; + background-color: #f4f4f5; + border-color: #dddfe1; +} +.uni-btn[type=info][plain]:not([hover-class]):active { + background: #e9e9eb; + color: #8f939c; + outline: none; + border-color: #c7c9ce; +} +.uni-btn[type=info][plain][loading] { + color: #8f939c; + background-color: #f4f4f5; + border-color: #dddfe1; +} +.uni-btn[type=info][plain][loading]:not([hover-class]):active { + background: #e9e9eb; + color: #8f939c; + outline: none; + border-color: #c7c9ce; +} +.uni-btn[type=info][plain][loading]::before { + margin-right: 5px; +} +.uni-btn[type=info][plain][disabled], .uni-btn[type=info][plain][disabled]:active { + color: #bcbec4; + background-color: #f4f4f5; + border-color: #e9e9eb; +} +page { + background-color: #f5f5f5; +} +.example-info { + font-size: 14px; + color: #333; + padding: 10px; +}page{--status-bar-height:25px;--top-window-height:0px;--window-top:0px;--window-bottom:0px;--window-left:0px;--window-right:0px;--window-magin:0px}[data-c-h="true"]{display: none !important;} \ No newline at end of file diff --git a/unpackage/dist/dev/mp-weixin/common/vendor.js b/unpackage/dist/dev/mp-weixin/common/vendor.js new file mode 100644 index 0000000..57a723b --- /dev/null +++ b/unpackage/dist/dev/mp-weixin/common/vendor.js @@ -0,0 +1,7893 @@ +"use strict"; +/** +* @vue/shared v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +function makeMap(str, expectsLowerCase) { + const set2 = new Set(str.split(",")); + return expectsLowerCase ? (val) => set2.has(val.toLowerCase()) : (val) => set2.has(val); +} +const EMPTY_OBJ = Object.freeze({}); +const EMPTY_ARR = Object.freeze([]); +const NOOP = () => { +}; +const NO = () => false; +const isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter +(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97); +const isModelListener = (key) => key.startsWith("onUpdate:"); +const extend = Object.assign; +const remove = (arr, el) => { + const i = arr.indexOf(el); + if (i > -1) { + arr.splice(i, 1); + } +}; +const hasOwnProperty$1 = Object.prototype.hasOwnProperty; +const hasOwn = (val, key) => hasOwnProperty$1.call(val, key); +const isArray = Array.isArray; +const isMap = (val) => toTypeString(val) === "[object Map]"; +const isSet = (val) => toTypeString(val) === "[object Set]"; +const isFunction = (val) => typeof val === "function"; +const isString = (val) => typeof val === "string"; +const isSymbol = (val) => typeof val === "symbol"; +const isObject = (val) => val !== null && typeof val === "object"; +const isPromise = (val) => { + return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch); +}; +const objectToString = Object.prototype.toString; +const toTypeString = (value) => objectToString.call(value); +const toRawType = (value) => { + return toTypeString(value).slice(8, -1); +}; +const isPlainObject = (val) => toTypeString(val) === "[object Object]"; +const isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key; +const isReservedProp = /* @__PURE__ */ makeMap( + // the leading comma is intentional so empty string "" is also included + ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted" +); +const isBuiltInDirective = /* @__PURE__ */ makeMap( + "bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo" +); +const cacheStringFunction = (fn) => { + const cache = /* @__PURE__ */ Object.create(null); + return (str) => { + const hit = cache[str]; + return hit || (cache[str] = fn(str)); + }; +}; +const camelizeRE = /-(\w)/g; +const camelize = cacheStringFunction((str) => { + return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); +}); +const hyphenateRE = /\B([A-Z])/g; +const hyphenate = cacheStringFunction( + (str) => str.replace(hyphenateRE, "-$1").toLowerCase() +); +const capitalize = cacheStringFunction((str) => { + return str.charAt(0).toUpperCase() + str.slice(1); +}); +const toHandlerKey = cacheStringFunction((str) => { + const s = str ? `on${capitalize(str)}` : ``; + return s; +}); +const hasChanged = (value, oldValue) => !Object.is(value, oldValue); +const invokeArrayFns$1 = (fns, arg) => { + for (let i = 0; i < fns.length; i++) { + fns[i](arg); + } +}; +const def = (obj, key, value) => { + Object.defineProperty(obj, key, { + configurable: true, + enumerable: false, + value + }); +}; +const looseToNumber = (val) => { + const n = parseFloat(val); + return isNaN(n) ? val : n; +}; +const toDisplayString = (val) => { + return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? JSON.stringify(val, replacer, 2) : String(val); +}; +const replacer = (_key, val) => { + if (val && val.__v_isRef) { + return replacer(_key, val.value); + } else if (isMap(val)) { + return { + [`Map(${val.size})`]: [...val.entries()].reduce( + (entries, [key, val2], i) => { + entries[stringifySymbol(key, i) + " =>"] = val2; + return entries; + }, + {} + ) + }; + } else if (isSet(val)) { + return { + [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v)) + }; + } else if (isSymbol(val)) { + return stringifySymbol(val); + } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) { + return String(val); + } + return val; +}; +const stringifySymbol = (v, i = "") => { + var _a; + return isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v; +}; +const LOCALE_ZH_HANS = "zh-Hans"; +const LOCALE_ZH_HANT = "zh-Hant"; +const LOCALE_EN = "en"; +const LOCALE_FR = "fr"; +const LOCALE_ES = "es"; +function include(str, parts) { + return !!parts.find((part) => str.indexOf(part) !== -1); +} +function startsWith(str, parts) { + return parts.find((part) => str.indexOf(part) === 0); +} +function normalizeLocale(locale, messages) { + if (!locale) { + return; + } + locale = locale.trim().replace(/_/g, "-"); + if (messages && messages[locale]) { + return locale; + } + locale = locale.toLowerCase(); + if (locale === "chinese") { + return LOCALE_ZH_HANS; + } + if (locale.indexOf("zh") === 0) { + if (locale.indexOf("-hans") > -1) { + return LOCALE_ZH_HANS; + } + if (locale.indexOf("-hant") > -1) { + return LOCALE_ZH_HANT; + } + if (include(locale, ["-tw", "-hk", "-mo", "-cht"])) { + return LOCALE_ZH_HANT; + } + return LOCALE_ZH_HANS; + } + let locales = [LOCALE_EN, LOCALE_FR, LOCALE_ES]; + if (messages && Object.keys(messages).length > 0) { + locales = Object.keys(messages); + } + const lang = startsWith(locale, locales); + if (lang) { + return lang; + } +} +const SLOT_DEFAULT_NAME = "d"; +const ON_SHOW = "onShow"; +const ON_HIDE = "onHide"; +const ON_LAUNCH = "onLaunch"; +const ON_ERROR = "onError"; +const ON_THEME_CHANGE = "onThemeChange"; +const ON_PAGE_NOT_FOUND = "onPageNotFound"; +const ON_UNHANDLE_REJECTION = "onUnhandledRejection"; +const ON_EXIT = "onExit"; +const ON_LOAD = "onLoad"; +const ON_READY = "onReady"; +const ON_UNLOAD = "onUnload"; +const ON_INIT = "onInit"; +const ON_SAVE_EXIT_STATE = "onSaveExitState"; +const ON_RESIZE = "onResize"; +const ON_BACK_PRESS = "onBackPress"; +const ON_PAGE_SCROLL = "onPageScroll"; +const ON_TAB_ITEM_TAP = "onTabItemTap"; +const ON_REACH_BOTTOM = "onReachBottom"; +const ON_PULL_DOWN_REFRESH = "onPullDownRefresh"; +const ON_SHARE_TIMELINE = "onShareTimeline"; +const ON_SHARE_CHAT = "onShareChat"; +const ON_ADD_TO_FAVORITES = "onAddToFavorites"; +const ON_SHARE_APP_MESSAGE = "onShareAppMessage"; +const ON_NAVIGATION_BAR_BUTTON_TAP = "onNavigationBarButtonTap"; +const ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED = "onNavigationBarSearchInputClicked"; +const ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED = "onNavigationBarSearchInputChanged"; +const ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED = "onNavigationBarSearchInputConfirmed"; +const ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED = "onNavigationBarSearchInputFocusChanged"; +const VIRTUAL_HOST_STYLE = "virtualHostStyle"; +const VIRTUAL_HOST_CLASS = "virtualHostClass"; +const VIRTUAL_HOST_HIDDEN = "virtualHostHidden"; +const VIRTUAL_HOST_ID = "virtualHostId"; +function hasLeadingSlash(str) { + return str.indexOf("/") === 0; +} +function addLeadingSlash(str) { + return hasLeadingSlash(str) ? str : "/" + str; +} +const invokeArrayFns = (fns, arg) => { + let ret; + for (let i = 0; i < fns.length; i++) { + ret = fns[i](arg); + } + return ret; +}; +function once(fn, ctx = null) { + let res; + return (...args) => { + if (fn) { + res = fn.apply(ctx, args); + fn = null; + } + return res; + }; +} +function getValueByDataPath(obj, path) { + if (!isString(path)) { + return; + } + path = path.replace(/\[(\d+)\]/g, ".$1"); + const parts = path.split("."); + let key = parts[0]; + if (!obj) { + obj = {}; + } + if (parts.length === 1) { + return obj[key]; + } + return getValueByDataPath(obj[key], parts.slice(1).join(".")); +} +function sortObject(obj) { + let sortObj = {}; + if (isPlainObject(obj)) { + Object.keys(obj).sort().forEach((key) => { + const _key = key; + sortObj[_key] = obj[_key]; + }); + } + return !Object.keys(sortObj) ? obj : sortObj; +} +const customizeRE = /:/g; +function customizeEvent(str) { + return camelize(str.replace(customizeRE, "-")); +} +const encode = encodeURIComponent; +function stringifyQuery(obj, encodeStr = encode) { + const res = obj ? Object.keys(obj).map((key) => { + let val = obj[key]; + if (typeof val === void 0 || val === null) { + val = ""; + } else if (isPlainObject(val)) { + val = JSON.stringify(val); + } + return encodeStr(key) + "=" + encodeStr(val); + }).filter((x) => x.length > 0).join("&") : null; + return res ? `?${res}` : ""; +} +const PAGE_HOOKS = [ + ON_INIT, + ON_LOAD, + ON_SHOW, + ON_HIDE, + ON_UNLOAD, + ON_BACK_PRESS, + ON_PAGE_SCROLL, + ON_TAB_ITEM_TAP, + ON_REACH_BOTTOM, + ON_PULL_DOWN_REFRESH, + ON_SHARE_TIMELINE, + ON_SHARE_APP_MESSAGE, + ON_SHARE_CHAT, + ON_ADD_TO_FAVORITES, + ON_SAVE_EXIT_STATE, + ON_NAVIGATION_BAR_BUTTON_TAP, + ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED, + ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED, + ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED, + ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED +]; +function isRootHook(name) { + return PAGE_HOOKS.indexOf(name) > -1; +} +const UniLifecycleHooks = [ + ON_SHOW, + ON_HIDE, + ON_LAUNCH, + ON_ERROR, + ON_THEME_CHANGE, + ON_PAGE_NOT_FOUND, + ON_UNHANDLE_REJECTION, + ON_EXIT, + ON_INIT, + ON_LOAD, + ON_READY, + ON_UNLOAD, + ON_RESIZE, + ON_BACK_PRESS, + ON_PAGE_SCROLL, + ON_TAB_ITEM_TAP, + ON_REACH_BOTTOM, + ON_PULL_DOWN_REFRESH, + ON_SHARE_TIMELINE, + ON_ADD_TO_FAVORITES, + ON_SHARE_APP_MESSAGE, + ON_SHARE_CHAT, + ON_SAVE_EXIT_STATE, + ON_NAVIGATION_BAR_BUTTON_TAP, + ON_NAVIGATION_BAR_SEARCH_INPUT_CLICKED, + ON_NAVIGATION_BAR_SEARCH_INPUT_CHANGED, + ON_NAVIGATION_BAR_SEARCH_INPUT_CONFIRMED, + ON_NAVIGATION_BAR_SEARCH_INPUT_FOCUS_CHANGED +]; +const MINI_PROGRAM_PAGE_RUNTIME_HOOKS = /* @__PURE__ */ (() => { + return { + onPageScroll: 1, + onShareAppMessage: 1 << 1, + onShareTimeline: 1 << 2 + }; +})(); +function isUniLifecycleHook(name, value, checkType = true) { + if (checkType && !isFunction(value)) { + return false; + } + if (UniLifecycleHooks.indexOf(name) > -1) { + return true; + } else if (name.indexOf("on") === 0) { + return true; + } + return false; +} +let vueApp; +const createVueAppHooks = []; +function onCreateVueApp(hook) { + if (vueApp) { + return hook(vueApp); + } + createVueAppHooks.push(hook); +} +function invokeCreateVueAppHook(app) { + vueApp = app; + createVueAppHooks.forEach((hook) => hook(app)); +} +const invokeCreateErrorHandler = once((app, createErrorHandler2) => { + return createErrorHandler2(app); +}); +const E = function() { +}; +E.prototype = { + _id: 1, + on: function(name, callback, ctx) { + var e2 = this.e || (this.e = {}); + (e2[name] || (e2[name] = [])).push({ + fn: callback, + ctx, + _id: this._id + }); + return this._id++; + }, + once: function(name, callback, ctx) { + var self2 = this; + function listener() { + self2.off(name, listener); + callback.apply(ctx, arguments); + } + listener._ = callback; + return this.on(name, listener, ctx); + }, + emit: function(name) { + var data = [].slice.call(arguments, 1); + var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); + var i = 0; + var len = evtArr.length; + for (i; i < len; i++) { + evtArr[i].fn.apply(evtArr[i].ctx, data); + } + return this; + }, + off: function(name, event) { + var e2 = this.e || (this.e = {}); + var evts = e2[name]; + var liveEvents = []; + if (evts && event) { + for (var i = evts.length - 1; i >= 0; i--) { + if (evts[i].fn === event || evts[i].fn._ === event || evts[i]._id === event) { + evts.splice(i, 1); + break; + } + } + liveEvents = evts; + } + liveEvents.length ? e2[name] = liveEvents : delete e2[name]; + return this; + } +}; +var E$1 = E; +/** +* @dcloudio/uni-mp-vue v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +function warn$2(msg, ...args) { + console.warn(`[Vue warn] ${msg}`, ...args); +} +let activeEffectScope; +class EffectScope { + constructor(detached = false) { + this.detached = detached; + this._active = true; + this.effects = []; + this.cleanups = []; + this.parent = activeEffectScope; + if (!detached && activeEffectScope) { + this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push( + this + ) - 1; + } + } + get active() { + return this._active; + } + run(fn) { + if (this._active) { + const currentEffectScope = activeEffectScope; + try { + activeEffectScope = this; + return fn(); + } finally { + activeEffectScope = currentEffectScope; + } + } else { + warn$2(`cannot run an inactive effect scope.`); + } + } + /** + * This should only be called on non-detached scopes + * @internal + */ + on() { + activeEffectScope = this; + } + /** + * This should only be called on non-detached scopes + * @internal + */ + off() { + activeEffectScope = this.parent; + } + stop(fromParent) { + if (this._active) { + let i, l; + for (i = 0, l = this.effects.length; i < l; i++) { + this.effects[i].stop(); + } + for (i = 0, l = this.cleanups.length; i < l; i++) { + this.cleanups[i](); + } + if (this.scopes) { + for (i = 0, l = this.scopes.length; i < l; i++) { + this.scopes[i].stop(true); + } + } + if (!this.detached && this.parent && !fromParent) { + const last = this.parent.scopes.pop(); + if (last && last !== this) { + this.parent.scopes[this.index] = last; + last.index = this.index; + } + } + this.parent = void 0; + this._active = false; + } + } +} +function recordEffectScope(effect2, scope = activeEffectScope) { + if (scope && scope.active) { + scope.effects.push(effect2); + } +} +function getCurrentScope() { + return activeEffectScope; +} +let activeEffect; +class ReactiveEffect { + constructor(fn, trigger2, scheduler, scope) { + this.fn = fn; + this.trigger = trigger2; + this.scheduler = scheduler; + this.active = true; + this.deps = []; + this._dirtyLevel = 4; + this._trackId = 0; + this._runnings = 0; + this._shouldSchedule = false; + this._depsLength = 0; + recordEffectScope(this, scope); + } + get dirty() { + if (this._dirtyLevel === 2 || this._dirtyLevel === 3) { + this._dirtyLevel = 1; + pauseTracking(); + for (let i = 0; i < this._depsLength; i++) { + const dep = this.deps[i]; + if (dep.computed) { + triggerComputed(dep.computed); + if (this._dirtyLevel >= 4) { + break; + } + } + } + if (this._dirtyLevel === 1) { + this._dirtyLevel = 0; + } + resetTracking(); + } + return this._dirtyLevel >= 4; + } + set dirty(v) { + this._dirtyLevel = v ? 4 : 0; + } + run() { + this._dirtyLevel = 0; + if (!this.active) { + return this.fn(); + } + let lastShouldTrack = shouldTrack; + let lastEffect = activeEffect; + try { + shouldTrack = true; + activeEffect = this; + this._runnings++; + preCleanupEffect(this); + return this.fn(); + } finally { + postCleanupEffect(this); + this._runnings--; + activeEffect = lastEffect; + shouldTrack = lastShouldTrack; + } + } + stop() { + var _a; + if (this.active) { + preCleanupEffect(this); + postCleanupEffect(this); + (_a = this.onStop) == null ? void 0 : _a.call(this); + this.active = false; + } + } +} +function triggerComputed(computed2) { + return computed2.value; +} +function preCleanupEffect(effect2) { + effect2._trackId++; + effect2._depsLength = 0; +} +function postCleanupEffect(effect2) { + if (effect2.deps.length > effect2._depsLength) { + for (let i = effect2._depsLength; i < effect2.deps.length; i++) { + cleanupDepEffect(effect2.deps[i], effect2); + } + effect2.deps.length = effect2._depsLength; + } +} +function cleanupDepEffect(dep, effect2) { + const trackId = dep.get(effect2); + if (trackId !== void 0 && effect2._trackId !== trackId) { + dep.delete(effect2); + if (dep.size === 0) { + dep.cleanup(); + } + } +} +let shouldTrack = true; +let pauseScheduleStack = 0; +const trackStack = []; +function pauseTracking() { + trackStack.push(shouldTrack); + shouldTrack = false; +} +function resetTracking() { + const last = trackStack.pop(); + shouldTrack = last === void 0 ? true : last; +} +function pauseScheduling() { + pauseScheduleStack++; +} +function resetScheduling() { + pauseScheduleStack--; + while (!pauseScheduleStack && queueEffectSchedulers.length) { + queueEffectSchedulers.shift()(); + } +} +function trackEffect(effect2, dep, debuggerEventExtraInfo) { + var _a; + if (dep.get(effect2) !== effect2._trackId) { + dep.set(effect2, effect2._trackId); + const oldDep = effect2.deps[effect2._depsLength]; + if (oldDep !== dep) { + if (oldDep) { + cleanupDepEffect(oldDep, effect2); + } + effect2.deps[effect2._depsLength++] = dep; + } else { + effect2._depsLength++; + } + { + (_a = effect2.onTrack) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo)); + } + } +} +const queueEffectSchedulers = []; +function triggerEffects(dep, dirtyLevel, debuggerEventExtraInfo) { + var _a; + pauseScheduling(); + for (const effect2 of dep.keys()) { + let tracking; + if (effect2._dirtyLevel < dirtyLevel && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) { + effect2._shouldSchedule || (effect2._shouldSchedule = effect2._dirtyLevel === 0); + effect2._dirtyLevel = dirtyLevel; + } + if (effect2._shouldSchedule && (tracking != null ? tracking : tracking = dep.get(effect2) === effect2._trackId)) { + { + (_a = effect2.onTrigger) == null ? void 0 : _a.call(effect2, extend({ effect: effect2 }, debuggerEventExtraInfo)); + } + effect2.trigger(); + if ((!effect2._runnings || effect2.allowRecurse) && effect2._dirtyLevel !== 2) { + effect2._shouldSchedule = false; + if (effect2.scheduler) { + queueEffectSchedulers.push(effect2.scheduler); + } + } + } + } + resetScheduling(); +} +const createDep = (cleanup, computed2) => { + const dep = /* @__PURE__ */ new Map(); + dep.cleanup = cleanup; + dep.computed = computed2; + return dep; +}; +const targetMap = /* @__PURE__ */ new WeakMap(); +const ITERATE_KEY = Symbol("iterate"); +const MAP_KEY_ITERATE_KEY = Symbol("Map key iterate"); +function track(target, type, key) { + if (shouldTrack && activeEffect) { + let depsMap = targetMap.get(target); + if (!depsMap) { + targetMap.set(target, depsMap = /* @__PURE__ */ new Map()); + } + let dep = depsMap.get(key); + if (!dep) { + depsMap.set(key, dep = createDep(() => depsMap.delete(key))); + } + trackEffect( + activeEffect, + dep, + { + target, + type, + key + } + ); + } +} +function trigger(target, type, key, newValue, oldValue, oldTarget) { + const depsMap = targetMap.get(target); + if (!depsMap) { + return; + } + let deps = []; + if (type === "clear") { + deps = [...depsMap.values()]; + } else if (key === "length" && isArray(target)) { + const newLength = Number(newValue); + depsMap.forEach((dep, key2) => { + if (key2 === "length" || !isSymbol(key2) && key2 >= newLength) { + deps.push(dep); + } + }); + } else { + if (key !== void 0) { + deps.push(depsMap.get(key)); + } + switch (type) { + case "add": + if (!isArray(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + if (isMap(target)) { + deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); + } + } else if (isIntegerKey(key)) { + deps.push(depsMap.get("length")); + } + break; + case "delete": + if (!isArray(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + if (isMap(target)) { + deps.push(depsMap.get(MAP_KEY_ITERATE_KEY)); + } + } + break; + case "set": + if (isMap(target)) { + deps.push(depsMap.get(ITERATE_KEY)); + } + break; + } + } + pauseScheduling(); + for (const dep of deps) { + if (dep) { + triggerEffects( + dep, + 4, + { + target, + type, + key, + newValue, + oldValue, + oldTarget + } + ); + } + } + resetScheduling(); +} +const isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`); +const builtInSymbols = new Set( + /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol) +); +const arrayInstrumentations = /* @__PURE__ */ createArrayInstrumentations(); +function createArrayInstrumentations() { + const instrumentations = {}; + ["includes", "indexOf", "lastIndexOf"].forEach((key) => { + instrumentations[key] = function(...args) { + const arr = toRaw(this); + for (let i = 0, l = this.length; i < l; i++) { + track(arr, "get", i + ""); + } + const res = arr[key](...args); + if (res === -1 || res === false) { + return arr[key](...args.map(toRaw)); + } else { + return res; + } + }; + }); + ["push", "pop", "shift", "unshift", "splice"].forEach((key) => { + instrumentations[key] = function(...args) { + pauseTracking(); + pauseScheduling(); + const res = toRaw(this)[key].apply(this, args); + resetScheduling(); + resetTracking(); + return res; + }; + }); + return instrumentations; +} +function hasOwnProperty(key) { + const obj = toRaw(this); + track(obj, "has", key); + return obj.hasOwnProperty(key); +} +class BaseReactiveHandler { + constructor(_isReadonly = false, _isShallow = false) { + this._isReadonly = _isReadonly; + this._isShallow = _isShallow; + } + get(target, key, receiver) { + const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow; + if (key === "__v_isReactive") { + return !isReadonly2; + } else if (key === "__v_isReadonly") { + return isReadonly2; + } else if (key === "__v_isShallow") { + return isShallow2; + } else if (key === "__v_raw") { + if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype + // this means the reciever is a user proxy of the reactive proxy + Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) { + return target; + } + return; + } + const targetIsArray = isArray(target); + if (!isReadonly2) { + if (targetIsArray && hasOwn(arrayInstrumentations, key)) { + return Reflect.get(arrayInstrumentations, key, receiver); + } + if (key === "hasOwnProperty") { + return hasOwnProperty; + } + } + const res = Reflect.get(target, key, receiver); + if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { + return res; + } + if (!isReadonly2) { + track(target, "get", key); + } + if (isShallow2) { + return res; + } + if (isRef(res)) { + return targetIsArray && isIntegerKey(key) ? res : res.value; + } + if (isObject(res)) { + return isReadonly2 ? readonly(res) : reactive(res); + } + return res; + } +} +class MutableReactiveHandler extends BaseReactiveHandler { + constructor(isShallow2 = false) { + super(false, isShallow2); + } + set(target, key, value, receiver) { + let oldValue = target[key]; + if (!this._isShallow) { + const isOldValueReadonly = isReadonly(oldValue); + if (!isShallow(value) && !isReadonly(value)) { + oldValue = toRaw(oldValue); + value = toRaw(value); + } + if (!isArray(target) && isRef(oldValue) && !isRef(value)) { + if (isOldValueReadonly) { + return false; + } else { + oldValue.value = value; + return true; + } + } + } + const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key); + const result = Reflect.set(target, key, value, receiver); + if (target === toRaw(receiver)) { + if (!hadKey) { + trigger(target, "add", key, value); + } else if (hasChanged(value, oldValue)) { + trigger(target, "set", key, value, oldValue); + } + } + return result; + } + deleteProperty(target, key) { + const hadKey = hasOwn(target, key); + const oldValue = target[key]; + const result = Reflect.deleteProperty(target, key); + if (result && hadKey) { + trigger(target, "delete", key, void 0, oldValue); + } + return result; + } + has(target, key) { + const result = Reflect.has(target, key); + if (!isSymbol(key) || !builtInSymbols.has(key)) { + track(target, "has", key); + } + return result; + } + ownKeys(target) { + track( + target, + "iterate", + isArray(target) ? "length" : ITERATE_KEY + ); + return Reflect.ownKeys(target); + } +} +class ReadonlyReactiveHandler extends BaseReactiveHandler { + constructor(isShallow2 = false) { + super(true, isShallow2); + } + set(target, key) { + { + warn$2( + `Set operation on key "${String(key)}" failed: target is readonly.`, + target + ); + } + return true; + } + deleteProperty(target, key) { + { + warn$2( + `Delete operation on key "${String(key)}" failed: target is readonly.`, + target + ); + } + return true; + } +} +const mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler(); +const readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(); +const shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler( + true +); +const shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true); +const toShallow = (value) => value; +const getProto = (v) => Reflect.getPrototypeOf(v); +function get(target, key, isReadonly2 = false, isShallow2 = false) { + target = target["__v_raw"]; + const rawTarget = toRaw(target); + const rawKey = toRaw(key); + if (!isReadonly2) { + if (hasChanged(key, rawKey)) { + track(rawTarget, "get", key); + } + track(rawTarget, "get", rawKey); + } + const { has: has2 } = getProto(rawTarget); + const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; + if (has2.call(rawTarget, key)) { + return wrap(target.get(key)); + } else if (has2.call(rawTarget, rawKey)) { + return wrap(target.get(rawKey)); + } else if (target !== rawTarget) { + target.get(key); + } +} +function has$1(key, isReadonly2 = false) { + const target = this["__v_raw"]; + const rawTarget = toRaw(target); + const rawKey = toRaw(key); + if (!isReadonly2) { + if (hasChanged(key, rawKey)) { + track(rawTarget, "has", key); + } + track(rawTarget, "has", rawKey); + } + return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); +} +function size(target, isReadonly2 = false) { + target = target["__v_raw"]; + !isReadonly2 && track(toRaw(target), "iterate", ITERATE_KEY); + return Reflect.get(target, "size", target); +} +function add(value) { + value = toRaw(value); + const target = toRaw(this); + const proto = getProto(target); + const hadKey = proto.has.call(target, value); + if (!hadKey) { + target.add(value); + trigger(target, "add", value, value); + } + return this; +} +function set$1(key, value) { + value = toRaw(value); + const target = toRaw(this); + const { has: has2, get: get2 } = getProto(target); + let hadKey = has2.call(target, key); + if (!hadKey) { + key = toRaw(key); + hadKey = has2.call(target, key); + } else { + checkIdentityKeys(target, has2, key); + } + const oldValue = get2.call(target, key); + target.set(key, value); + if (!hadKey) { + trigger(target, "add", key, value); + } else if (hasChanged(value, oldValue)) { + trigger(target, "set", key, value, oldValue); + } + return this; +} +function deleteEntry(key) { + const target = toRaw(this); + const { has: has2, get: get2 } = getProto(target); + let hadKey = has2.call(target, key); + if (!hadKey) { + key = toRaw(key); + hadKey = has2.call(target, key); + } else { + checkIdentityKeys(target, has2, key); + } + const oldValue = get2 ? get2.call(target, key) : void 0; + const result = target.delete(key); + if (hadKey) { + trigger(target, "delete", key, void 0, oldValue); + } + return result; +} +function clear() { + const target = toRaw(this); + const hadItems = target.size !== 0; + const oldTarget = isMap(target) ? new Map(target) : new Set(target); + const result = target.clear(); + if (hadItems) { + trigger(target, "clear", void 0, void 0, oldTarget); + } + return result; +} +function createForEach(isReadonly2, isShallow2) { + return function forEach(callback, thisArg) { + const observed = this; + const target = observed["__v_raw"]; + const rawTarget = toRaw(target); + const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; + !isReadonly2 && track(rawTarget, "iterate", ITERATE_KEY); + return target.forEach((value, key) => { + return callback.call(thisArg, wrap(value), wrap(key), observed); + }); + }; +} +function createIterableMethod(method, isReadonly2, isShallow2) { + return function(...args) { + const target = this["__v_raw"]; + const rawTarget = toRaw(target); + const targetIsMap = isMap(rawTarget); + const isPair = method === "entries" || method === Symbol.iterator && targetIsMap; + const isKeyOnly = method === "keys" && targetIsMap; + const innerIterator = target[method](...args); + const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; + !isReadonly2 && track( + rawTarget, + "iterate", + isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY + ); + return { + // iterator protocol + next() { + const { value, done } = innerIterator.next(); + return done ? { value, done } : { + value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), + done + }; + }, + // iterable protocol + [Symbol.iterator]() { + return this; + } + }; + }; +} +function createReadonlyMethod(type) { + return function(...args) { + { + const key = args[0] ? `on key "${args[0]}" ` : ``; + warn$2( + `${capitalize(type)} operation ${key}failed: target is readonly.`, + toRaw(this) + ); + } + return type === "delete" ? false : type === "clear" ? void 0 : this; + }; +} +function createInstrumentations() { + const mutableInstrumentations2 = { + get(key) { + return get(this, key); + }, + get size() { + return size(this); + }, + has: has$1, + add, + set: set$1, + delete: deleteEntry, + clear, + forEach: createForEach(false, false) + }; + const shallowInstrumentations2 = { + get(key) { + return get(this, key, false, true); + }, + get size() { + return size(this); + }, + has: has$1, + add, + set: set$1, + delete: deleteEntry, + clear, + forEach: createForEach(false, true) + }; + const readonlyInstrumentations2 = { + get(key) { + return get(this, key, true); + }, + get size() { + return size(this, true); + }, + has(key) { + return has$1.call(this, key, true); + }, + add: createReadonlyMethod("add"), + set: createReadonlyMethod("set"), + delete: createReadonlyMethod("delete"), + clear: createReadonlyMethod("clear"), + forEach: createForEach(true, false) + }; + const shallowReadonlyInstrumentations2 = { + get(key) { + return get(this, key, true, true); + }, + get size() { + return size(this, true); + }, + has(key) { + return has$1.call(this, key, true); + }, + add: createReadonlyMethod("add"), + set: createReadonlyMethod("set"), + delete: createReadonlyMethod("delete"), + clear: createReadonlyMethod("clear"), + forEach: createForEach(true, true) + }; + const iteratorMethods = [ + "keys", + "values", + "entries", + Symbol.iterator + ]; + iteratorMethods.forEach((method) => { + mutableInstrumentations2[method] = createIterableMethod(method, false, false); + readonlyInstrumentations2[method] = createIterableMethod(method, true, false); + shallowInstrumentations2[method] = createIterableMethod(method, false, true); + shallowReadonlyInstrumentations2[method] = createIterableMethod( + method, + true, + true + ); + }); + return [ + mutableInstrumentations2, + readonlyInstrumentations2, + shallowInstrumentations2, + shallowReadonlyInstrumentations2 + ]; +} +const [ + mutableInstrumentations, + readonlyInstrumentations, + shallowInstrumentations, + shallowReadonlyInstrumentations +] = /* @__PURE__ */ createInstrumentations(); +function createInstrumentationGetter(isReadonly2, shallow) { + const instrumentations = shallow ? isReadonly2 ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly2 ? readonlyInstrumentations : mutableInstrumentations; + return (target, key, receiver) => { + if (key === "__v_isReactive") { + return !isReadonly2; + } else if (key === "__v_isReadonly") { + return isReadonly2; + } else if (key === "__v_raw") { + return target; + } + return Reflect.get( + hasOwn(instrumentations, key) && key in target ? instrumentations : target, + key, + receiver + ); + }; +} +const mutableCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(false, false) +}; +const shallowCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(false, true) +}; +const readonlyCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(true, false) +}; +const shallowReadonlyCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(true, true) +}; +function checkIdentityKeys(target, has2, key) { + const rawKey = toRaw(key); + if (rawKey !== key && has2.call(target, rawKey)) { + const type = toRawType(target); + warn$2( + `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.` + ); + } +} +const reactiveMap = /* @__PURE__ */ new WeakMap(); +const shallowReactiveMap = /* @__PURE__ */ new WeakMap(); +const readonlyMap = /* @__PURE__ */ new WeakMap(); +const shallowReadonlyMap = /* @__PURE__ */ new WeakMap(); +function targetTypeMap(rawType) { + switch (rawType) { + case "Object": + case "Array": + return 1; + case "Map": + case "Set": + case "WeakMap": + case "WeakSet": + return 2; + default: + return 0; + } +} +function getTargetType(value) { + return value["__v_skip"] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value)); +} +function reactive(target) { + if (isReadonly(target)) { + return target; + } + return createReactiveObject( + target, + false, + mutableHandlers, + mutableCollectionHandlers, + reactiveMap + ); +} +function shallowReactive(target) { + return createReactiveObject( + target, + false, + shallowReactiveHandlers, + shallowCollectionHandlers, + shallowReactiveMap + ); +} +function readonly(target) { + return createReactiveObject( + target, + true, + readonlyHandlers, + readonlyCollectionHandlers, + readonlyMap + ); +} +function shallowReadonly(target) { + return createReactiveObject( + target, + true, + shallowReadonlyHandlers, + shallowReadonlyCollectionHandlers, + shallowReadonlyMap + ); +} +function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) { + if (!isObject(target)) { + { + warn$2(`value cannot be made reactive: ${String(target)}`); + } + return target; + } + if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) { + return target; + } + const existingProxy = proxyMap.get(target); + if (existingProxy) { + return existingProxy; + } + const targetType = getTargetType(target); + if (targetType === 0) { + return target; + } + const proxy = new Proxy( + target, + targetType === 2 ? collectionHandlers : baseHandlers + ); + proxyMap.set(target, proxy); + return proxy; +} +function isReactive(value) { + if (isReadonly(value)) { + return isReactive(value["__v_raw"]); + } + return !!(value && value["__v_isReactive"]); +} +function isReadonly(value) { + return !!(value && value["__v_isReadonly"]); +} +function isShallow(value) { + return !!(value && value["__v_isShallow"]); +} +function isProxy(value) { + return isReactive(value) || isReadonly(value); +} +function toRaw(observed) { + const raw = observed && observed["__v_raw"]; + return raw ? toRaw(raw) : observed; +} +function markRaw(value) { + if (Object.isExtensible(value)) { + def(value, "__v_skip", true); + } + return value; +} +const toReactive = (value) => isObject(value) ? reactive(value) : value; +const toReadonly = (value) => isObject(value) ? readonly(value) : value; +const COMPUTED_SIDE_EFFECT_WARN = `Computed is still dirty after getter evaluation, likely because a computed is mutating its own dependency in its getter. State mutations in computed getters should be avoided. Check the docs for more details: https://vuejs.org/guide/essentials/computed.html#getters-should-be-side-effect-free`; +class ComputedRefImpl { + constructor(getter, _setter, isReadonly2, isSSR) { + this.getter = getter; + this._setter = _setter; + this.dep = void 0; + this.__v_isRef = true; + this["__v_isReadonly"] = false; + this.effect = new ReactiveEffect( + () => getter(this._value), + () => triggerRefValue( + this, + this.effect._dirtyLevel === 2 ? 2 : 3 + ) + ); + this.effect.computed = this; + this.effect.active = this._cacheable = !isSSR; + this["__v_isReadonly"] = isReadonly2; + } + get value() { + const self = toRaw(this); + if ((!self._cacheable || self.effect.dirty) && hasChanged(self._value, self._value = self.effect.run())) { + triggerRefValue(self, 4); + } + trackRefValue(self); + if (self.effect._dirtyLevel >= 2) { + if (this._warnRecursive) { + warn$2(COMPUTED_SIDE_EFFECT_WARN, ` + +getter: `, this.getter); + } + triggerRefValue(self, 2); + } + return self._value; + } + set value(newValue) { + this._setter(newValue); + } + // #region polyfill _dirty for backward compatibility third party code for Vue <= 3.3.x + get _dirty() { + return this.effect.dirty; + } + set _dirty(v) { + this.effect.dirty = v; + } + // #endregion +} +function computed$1(getterOrOptions, debugOptions, isSSR = false) { + let getter; + let setter; + const onlyGetter = isFunction(getterOrOptions); + if (onlyGetter) { + getter = getterOrOptions; + setter = () => { + warn$2("Write operation failed: computed value is readonly"); + }; + } else { + getter = getterOrOptions.get; + setter = getterOrOptions.set; + } + const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR); + if (debugOptions && !isSSR) { + cRef.effect.onTrack = debugOptions.onTrack; + cRef.effect.onTrigger = debugOptions.onTrigger; + } + return cRef; +} +function trackRefValue(ref2) { + var _a; + if (shouldTrack && activeEffect) { + ref2 = toRaw(ref2); + trackEffect( + activeEffect, + (_a = ref2.dep) != null ? _a : ref2.dep = createDep( + () => ref2.dep = void 0, + ref2 instanceof ComputedRefImpl ? ref2 : void 0 + ), + { + target: ref2, + type: "get", + key: "value" + } + ); + } +} +function triggerRefValue(ref2, dirtyLevel = 4, newVal) { + ref2 = toRaw(ref2); + const dep = ref2.dep; + if (dep) { + triggerEffects( + dep, + dirtyLevel, + { + target: ref2, + type: "set", + key: "value", + newValue: newVal + } + ); + } +} +function isRef(r2) { + return !!(r2 && r2.__v_isRef === true); +} +function ref(value) { + return createRef(value, false); +} +function createRef(rawValue, shallow) { + if (isRef(rawValue)) { + return rawValue; + } + return new RefImpl(rawValue, shallow); +} +class RefImpl { + constructor(value, __v_isShallow) { + this.__v_isShallow = __v_isShallow; + this.dep = void 0; + this.__v_isRef = true; + this._rawValue = __v_isShallow ? value : toRaw(value); + this._value = __v_isShallow ? value : toReactive(value); + } + get value() { + trackRefValue(this); + return this._value; + } + set value(newVal) { + const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal); + newVal = useDirectValue ? newVal : toRaw(newVal); + if (hasChanged(newVal, this._rawValue)) { + this._rawValue = newVal; + this._value = useDirectValue ? newVal : toReactive(newVal); + triggerRefValue(this, 4, newVal); + } + } +} +function unref(ref2) { + return isRef(ref2) ? ref2.value : ref2; +} +const shallowUnwrapHandlers = { + get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)), + set: (target, key, value, receiver) => { + const oldValue = target[key]; + if (isRef(oldValue) && !isRef(value)) { + oldValue.value = value; + return true; + } else { + return Reflect.set(target, key, value, receiver); + } + } +}; +function proxyRefs(objectWithRefs) { + return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers); +} +const stack = []; +function pushWarningContext(vnode) { + stack.push(vnode); +} +function popWarningContext() { + stack.pop(); +} +function warn$1(msg, ...args) { + pauseTracking(); + const instance = stack.length ? stack[stack.length - 1].component : null; + const appWarnHandler = instance && instance.appContext.config.warnHandler; + const trace = getComponentTrace(); + if (appWarnHandler) { + callWithErrorHandling( + appWarnHandler, + instance, + 11, + [ + msg + args.map((a) => { + var _a, _b; + return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a); + }).join(""), + instance && instance.proxy, + trace.map( + ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>` + ).join("\n"), + trace + ] + ); + } else { + const warnArgs = [`[Vue warn]: ${msg}`, ...args]; + if (trace.length && // avoid spamming console during tests + true) { + warnArgs.push(` +`, ...formatTrace(trace)); + } + console.warn(...warnArgs); + } + resetTracking(); +} +function getComponentTrace() { + let currentVNode = stack[stack.length - 1]; + if (!currentVNode) { + return []; + } + const normalizedStack = []; + while (currentVNode) { + const last = normalizedStack[0]; + if (last && last.vnode === currentVNode) { + last.recurseCount++; + } else { + normalizedStack.push({ + vnode: currentVNode, + recurseCount: 0 + }); + } + const parentInstance = currentVNode.component && currentVNode.component.parent; + currentVNode = parentInstance && parentInstance.vnode; + } + return normalizedStack; +} +function formatTrace(trace) { + const logs = []; + trace.forEach((entry, i) => { + logs.push(...i === 0 ? [] : [` +`], ...formatTraceEntry(entry)); + }); + return logs; +} +function formatTraceEntry({ vnode, recurseCount }) { + const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``; + const isRoot = vnode.component ? vnode.component.parent == null : false; + const open = ` at <${formatComponentName( + vnode.component, + vnode.type, + isRoot + )}`; + const close = `>` + postfix; + return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close]; +} +function formatProps(props) { + const res = []; + const keys = Object.keys(props); + keys.slice(0, 3).forEach((key) => { + res.push(...formatProp(key, props[key])); + }); + if (keys.length > 3) { + res.push(` ...`); + } + return res; +} +function formatProp(key, value, raw) { + if (isString(value)) { + value = JSON.stringify(value); + return raw ? value : [`${key}=${value}`]; + } else if (typeof value === "number" || typeof value === "boolean" || value == null) { + return raw ? value : [`${key}=${value}`]; + } else if (isRef(value)) { + value = formatProp(key, toRaw(value.value), true); + return raw ? value : [`${key}=Ref<`, value, `>`]; + } else if (isFunction(value)) { + return [`${key}=fn${value.name ? `<${value.name}>` : ``}`]; + } else { + value = toRaw(value); + return raw ? value : [`${key}=`, value]; + } +} +const ErrorTypeStrings = { + ["sp"]: "serverPrefetch hook", + ["bc"]: "beforeCreate hook", + ["c"]: "created hook", + ["bm"]: "beforeMount hook", + ["m"]: "mounted hook", + ["bu"]: "beforeUpdate hook", + ["u"]: "updated", + ["bum"]: "beforeUnmount hook", + ["um"]: "unmounted hook", + ["a"]: "activated hook", + ["da"]: "deactivated hook", + ["ec"]: "errorCaptured hook", + ["rtc"]: "renderTracked hook", + ["rtg"]: "renderTriggered hook", + [0]: "setup function", + [1]: "render function", + [2]: "watcher getter", + [3]: "watcher callback", + [4]: "watcher cleanup function", + [5]: "native event handler", + [6]: "component event handler", + [7]: "vnode hook", + [8]: "directive hook", + [9]: "transition hook", + [10]: "app errorHandler", + [11]: "app warnHandler", + [12]: "ref function", + [13]: "async component loader", + [14]: "scheduler flush. This is likely a Vue internals bug. Please open an issue at https://github.com/vuejs/core ." +}; +function callWithErrorHandling(fn, instance, type, args) { + try { + return args ? fn(...args) : fn(); + } catch (err) { + handleError(err, instance, type); + } +} +function callWithAsyncErrorHandling(fn, instance, type, args) { + if (isFunction(fn)) { + const res = callWithErrorHandling(fn, instance, type, args); + if (res && isPromise(res)) { + res.catch((err) => { + handleError(err, instance, type); + }); + } + return res; + } + const values = []; + for (let i = 0; i < fn.length; i++) { + values.push(callWithAsyncErrorHandling(fn[i], instance, type, args)); + } + return values; +} +function handleError(err, instance, type, throwInDev = true) { + const contextVNode = instance ? instance.vnode : null; + if (instance) { + let cur = instance.parent; + const exposedInstance = instance.proxy; + const errorInfo = ErrorTypeStrings[type] || type; + while (cur) { + const errorCapturedHooks = cur.ec; + if (errorCapturedHooks) { + for (let i = 0; i < errorCapturedHooks.length; i++) { + if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) { + return; + } + } + } + cur = cur.parent; + } + const appErrorHandler = instance.appContext.config.errorHandler; + if (appErrorHandler) { + callWithErrorHandling( + appErrorHandler, + null, + 10, + [err, exposedInstance, errorInfo] + ); + return; + } + } + logError(err, type, contextVNode, throwInDev); +} +function logError(err, type, contextVNode, throwInDev = true) { + { + const info = ErrorTypeStrings[type] || type; + if (contextVNode) { + pushWarningContext(contextVNode); + } + warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`); + if (contextVNode) { + popWarningContext(); + } + if (throwInDev) { + console.error(err); + } else { + console.error(err); + } + } +} +let isFlushing = false; +let isFlushPending = false; +const queue$1 = []; +let flushIndex = 0; +const pendingPostFlushCbs = []; +let activePostFlushCbs = null; +let postFlushIndex = 0; +const resolvedPromise = /* @__PURE__ */ Promise.resolve(); +let currentFlushPromise = null; +const RECURSION_LIMIT = 100; +function nextTick$1(fn) { + const p2 = currentFlushPromise || resolvedPromise; + return fn ? p2.then(this ? fn.bind(this) : fn) : p2; +} +function findInsertionIndex(id) { + let start = flushIndex + 1; + let end = queue$1.length; + while (start < end) { + const middle = start + end >>> 1; + const middleJob = queue$1[middle]; + const middleJobId = getId(middleJob); + if (middleJobId < id || middleJobId === id && middleJob.pre) { + start = middle + 1; + } else { + end = middle; + } + } + return start; +} +function queueJob(job) { + if (!queue$1.length || !queue$1.includes( + job, + isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex + )) { + if (job.id == null) { + queue$1.push(job); + } else { + queue$1.splice(findInsertionIndex(job.id), 0, job); + } + queueFlush(); + } +} +function queueFlush() { + if (!isFlushing && !isFlushPending) { + isFlushPending = true; + currentFlushPromise = resolvedPromise.then(flushJobs); + } +} +function hasQueueJob(job) { + return queue$1.indexOf(job) > -1; +} +function invalidateJob(job) { + const i = queue$1.indexOf(job); + if (i > flushIndex) { + queue$1.splice(i, 1); + } +} +function queuePostFlushCb(cb) { + if (!isArray(cb)) { + if (!activePostFlushCbs || !activePostFlushCbs.includes( + cb, + cb.allowRecurse ? postFlushIndex + 1 : postFlushIndex + )) { + pendingPostFlushCbs.push(cb); + } + } else { + pendingPostFlushCbs.push(...cb); + } + queueFlush(); +} +function flushPreFlushCbs(instance, seen, i = isFlushing ? flushIndex + 1 : 0) { + { + seen = seen || /* @__PURE__ */ new Map(); + } + for (; i < queue$1.length; i++) { + const cb = queue$1[i]; + if (cb && cb.pre) { + if (checkRecursiveUpdates(seen, cb)) { + continue; + } + queue$1.splice(i, 1); + i--; + cb(); + } + } +} +function flushPostFlushCbs(seen) { + if (pendingPostFlushCbs.length) { + const deduped = [...new Set(pendingPostFlushCbs)].sort( + (a, b) => getId(a) - getId(b) + ); + pendingPostFlushCbs.length = 0; + if (activePostFlushCbs) { + activePostFlushCbs.push(...deduped); + return; + } + activePostFlushCbs = deduped; + { + seen = seen || /* @__PURE__ */ new Map(); + } + for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) { + if (checkRecursiveUpdates(seen, activePostFlushCbs[postFlushIndex])) { + continue; + } + activePostFlushCbs[postFlushIndex](); + } + activePostFlushCbs = null; + postFlushIndex = 0; + } +} +const getId = (job) => job.id == null ? Infinity : job.id; +const comparator = (a, b) => { + const diff2 = getId(a) - getId(b); + if (diff2 === 0) { + if (a.pre && !b.pre) + return -1; + if (b.pre && !a.pre) + return 1; + } + return diff2; +}; +function flushJobs(seen) { + isFlushPending = false; + isFlushing = true; + { + seen = seen || /* @__PURE__ */ new Map(); + } + queue$1.sort(comparator); + const check = (job) => checkRecursiveUpdates(seen, job); + try { + for (flushIndex = 0; flushIndex < queue$1.length; flushIndex++) { + const job = queue$1[flushIndex]; + if (job && job.active !== false) { + if (check(job)) { + continue; + } + callWithErrorHandling(job, null, 14); + } + } + } finally { + flushIndex = 0; + queue$1.length = 0; + flushPostFlushCbs(seen); + isFlushing = false; + currentFlushPromise = null; + if (queue$1.length || pendingPostFlushCbs.length) { + flushJobs(seen); + } + } +} +function checkRecursiveUpdates(seen, fn) { + if (!seen.has(fn)) { + seen.set(fn, 1); + } else { + const count = seen.get(fn); + if (count > RECURSION_LIMIT) { + const instance = fn.ownerInstance; + const componentName = instance && getComponentName(instance.type); + handleError( + `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`, + null, + 10 + ); + return true; + } else { + seen.set(fn, count + 1); + } + } +} +let devtools; +let buffer = []; +let devtoolsNotInstalled = false; +function emit$1(event, ...args) { + if (devtools) { + devtools.emit(event, ...args); + } else if (!devtoolsNotInstalled) { + buffer.push({ event, args }); + } +} +function setDevtoolsHook(hook, target) { + var _a, _b; + devtools = hook; + if (devtools) { + devtools.enabled = true; + buffer.forEach(({ event, args }) => devtools.emit(event, ...args)); + buffer = []; + } else if ( + // handle late devtools injection - only do this if we are in an actual + // browser environment to avoid the timer handle stalling test runner exit + // (#4815) + typeof window !== "undefined" && // some envs mock window but not fully + window.HTMLElement && // also exclude jsdom + !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes("jsdom")) + ) { + const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || []; + replay.push((newHook) => { + setDevtoolsHook(newHook, target); + }); + setTimeout(() => { + if (!devtools) { + target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null; + devtoolsNotInstalled = true; + buffer = []; + } + }, 3e3); + } else { + devtoolsNotInstalled = true; + buffer = []; + } +} +function devtoolsInitApp(app, version2) { + emit$1("app:init", app, version2, { + Fragment, + Text, + Comment, + Static + }); +} +const devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook( + "component:added" + /* COMPONENT_ADDED */ +); +const devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook( + "component:updated" + /* COMPONENT_UPDATED */ +); +const _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook( + "component:removed" + /* COMPONENT_REMOVED */ +); +const devtoolsComponentRemoved = (component) => { + if (devtools && typeof devtools.cleanupBuffer === "function" && // remove the component if it wasn't buffered + !devtools.cleanupBuffer(component)) { + _devtoolsComponentRemoved(component); + } +}; +/*! #__NO_SIDE_EFFECTS__ */ +// @__NO_SIDE_EFFECTS__ +function createDevtoolsComponentHook(hook) { + return (component) => { + emit$1( + hook, + component.appContext.app, + component.uid, + // fixed by xxxxxx + // 为 0 是 App,无 parent 是 Page 指向 App + component.uid === 0 ? void 0 : component.parent ? component.parent.uid : 0, + component + ); + }; +} +const devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook( + "perf:start" + /* PERFORMANCE_START */ +); +const devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook( + "perf:end" + /* PERFORMANCE_END */ +); +function createDevtoolsPerformanceHook(hook) { + return (component, type, time) => { + emit$1(hook, component.appContext.app, component.uid, component, type, time); + }; +} +function devtoolsComponentEmit(component, event, params) { + emit$1( + "component:emit", + component.appContext.app, + component, + event, + params + ); +} +function emit(instance, event, ...rawArgs) { + if (instance.isUnmounted) + return; + const props = instance.vnode.props || EMPTY_OBJ; + { + const { + emitsOptions, + propsOptions: [propsOptions] + } = instance; + if (emitsOptions) { + if (!(event in emitsOptions) && true) { + if (!propsOptions || !(toHandlerKey(event) in propsOptions)) { + warn$1( + `Component emitted event "${event}" but it is neither declared in the emits option nor as an "${toHandlerKey(event)}" prop.` + ); + } + } else { + const validator = emitsOptions[event]; + if (isFunction(validator)) { + const isValid = validator(...rawArgs); + if (!isValid) { + warn$1( + `Invalid event arguments: event validation failed for event "${event}".` + ); + } + } + } + } + } + let args = rawArgs; + const isModelListener2 = event.startsWith("update:"); + const modelArg = isModelListener2 && event.slice(7); + if (modelArg && modelArg in props) { + const modifiersKey = `${modelArg === "modelValue" ? "model" : modelArg}Modifiers`; + const { number, trim } = props[modifiersKey] || EMPTY_OBJ; + if (trim) { + args = rawArgs.map((a) => isString(a) ? a.trim() : a); + } + if (number) { + args = rawArgs.map(looseToNumber); + } + } + { + devtoolsComponentEmit(instance, event, args); + } + { + const lowerCaseEvent = event.toLowerCase(); + if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) { + warn$1( + `Event "${lowerCaseEvent}" is emitted in component ${formatComponentName( + instance, + instance.type + )} but the handler is registered for "${event}". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use "${hyphenate( + event + )}" instead of "${event}".` + ); + } + } + let handlerName; + let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249) + props[handlerName = toHandlerKey(camelize(event))]; + if (!handler && isModelListener2) { + handler = props[handlerName = toHandlerKey(hyphenate(event))]; + } + if (handler) { + callWithAsyncErrorHandling( + handler, + instance, + 6, + args + ); + } + const onceHandler = props[handlerName + `Once`]; + if (onceHandler) { + if (!instance.emitted) { + instance.emitted = {}; + } else if (instance.emitted[handlerName]) { + return; + } + instance.emitted[handlerName] = true; + callWithAsyncErrorHandling( + onceHandler, + instance, + 6, + args + ); + } +} +function normalizeEmitsOptions(comp, appContext, asMixin = false) { + const cache = appContext.emitsCache; + const cached = cache.get(comp); + if (cached !== void 0) { + return cached; + } + const raw = comp.emits; + let normalized = {}; + let hasExtends = false; + if (!isFunction(comp)) { + const extendEmits = (raw2) => { + const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true); + if (normalizedFromExtend) { + hasExtends = true; + extend(normalized, normalizedFromExtend); + } + }; + if (!asMixin && appContext.mixins.length) { + appContext.mixins.forEach(extendEmits); + } + if (comp.extends) { + extendEmits(comp.extends); + } + if (comp.mixins) { + comp.mixins.forEach(extendEmits); + } + } + if (!raw && !hasExtends) { + if (isObject(comp)) { + cache.set(comp, null); + } + return null; + } + if (isArray(raw)) { + raw.forEach((key) => normalized[key] = null); + } else { + extend(normalized, raw); + } + if (isObject(comp)) { + cache.set(comp, normalized); + } + return normalized; +} +function isEmitListener(options, key) { + if (!options || !isOn(key)) { + return false; + } + key = key.slice(2).replace(/Once$/, ""); + return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key); +} +let currentRenderingInstance = null; +function setCurrentRenderingInstance(instance) { + const prev = currentRenderingInstance; + currentRenderingInstance = instance; + instance && instance.type.__scopeId || null; + return prev; +} +const COMPONENTS = "components"; +function resolveComponent(name, maybeSelfReference) { + return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name; +} +function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) { + const instance = currentRenderingInstance || currentInstance; + if (instance) { + const Component2 = instance.type; + if (type === COMPONENTS) { + const selfName = getComponentName( + Component2, + false + ); + if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) { + return Component2; + } + } + const res = ( + // local registration + // check instance[type] first which is resolved for options API + resolve(instance[type] || Component2[type], name) || // global registration + resolve(instance.appContext[type], name) + ); + if (!res && maybeSelfReference) { + return Component2; + } + if (warnMissing && !res) { + const extra = type === COMPONENTS ? ` +If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``; + warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`); + } + return res; + } else { + warn$1( + `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().` + ); + } +} +function resolve(registry, name) { + return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]); +} +const INITIAL_WATCHER_VALUE = {}; +function watch(source, cb, options) { + if (!isFunction(cb)) { + warn$1( + `\`watch(fn, options?)\` signature has been moved to a separate API. Use \`watchEffect(fn, options?)\` instead. \`watch\` now only supports \`watch(source, cb, options?) signature.` + ); + } + return doWatch(source, cb, options); +} +function doWatch(source, cb, { + immediate, + deep, + flush, + once: once2, + onTrack, + onTrigger +} = EMPTY_OBJ) { + if (cb && once2) { + const _cb = cb; + cb = (...args) => { + _cb(...args); + unwatch(); + }; + } + if (deep !== void 0 && typeof deep === "number") { + warn$1( + `watch() "deep" option with number value will be used as watch depth in future versions. Please use a boolean instead to avoid potential breakage.` + ); + } + if (!cb) { + if (immediate !== void 0) { + warn$1( + `watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.` + ); + } + if (deep !== void 0) { + warn$1( + `watch() "deep" option is only respected when using the watch(source, callback, options?) signature.` + ); + } + if (once2 !== void 0) { + warn$1( + `watch() "once" option is only respected when using the watch(source, callback, options?) signature.` + ); + } + } + const warnInvalidSource = (s2) => { + warn$1( + `Invalid watch source: `, + s2, + `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.` + ); + }; + const instance = currentInstance; + const reactiveGetter = (source2) => deep === true ? source2 : ( + // for deep: false, only traverse root-level properties + traverse(source2, deep === false ? 1 : void 0) + ); + let getter; + let forceTrigger = false; + let isMultiSource = false; + if (isRef(source)) { + getter = () => source.value; + forceTrigger = isShallow(source); + } else if (isReactive(source)) { + getter = () => reactiveGetter(source); + forceTrigger = true; + } else if (isArray(source)) { + isMultiSource = true; + forceTrigger = source.some((s2) => isReactive(s2) || isShallow(s2)); + getter = () => source.map((s2) => { + if (isRef(s2)) { + return s2.value; + } else if (isReactive(s2)) { + return reactiveGetter(s2); + } else if (isFunction(s2)) { + return callWithErrorHandling(s2, instance, 2); + } else { + warnInvalidSource(s2); + } + }); + } else if (isFunction(source)) { + if (cb) { + getter = () => callWithErrorHandling(source, instance, 2); + } else { + getter = () => { + if (cleanup) { + cleanup(); + } + return callWithAsyncErrorHandling( + source, + instance, + 3, + [onCleanup] + ); + }; + } + } else { + getter = NOOP; + warnInvalidSource(source); + } + if (cb && deep) { + const baseGetter = getter; + getter = () => traverse(baseGetter()); + } + let cleanup; + let onCleanup = (fn) => { + cleanup = effect2.onStop = () => { + callWithErrorHandling(fn, instance, 4); + cleanup = effect2.onStop = void 0; + }; + }; + let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE; + const job = () => { + if (!effect2.active || !effect2.dirty) { + return; + } + if (cb) { + const newValue = effect2.run(); + if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue)) || false) { + if (cleanup) { + cleanup(); + } + callWithAsyncErrorHandling(cb, instance, 3, [ + newValue, + // pass undefined as the old value when it's changed for the first time + oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue, + onCleanup + ]); + oldValue = newValue; + } + } else { + effect2.run(); + } + }; + job.allowRecurse = !!cb; + let scheduler; + if (flush === "sync") { + scheduler = job; + } else if (flush === "post") { + scheduler = () => queuePostRenderEffect$1(job, instance && instance.suspense); + } else { + job.pre = true; + if (instance) + job.id = instance.uid; + scheduler = () => queueJob(job); + } + const effect2 = new ReactiveEffect(getter, NOOP, scheduler); + const scope = getCurrentScope(); + const unwatch = () => { + effect2.stop(); + if (scope) { + remove(scope.effects, effect2); + } + }; + { + effect2.onTrack = onTrack; + effect2.onTrigger = onTrigger; + } + if (cb) { + if (immediate) { + job(); + } else { + oldValue = effect2.run(); + } + } else if (flush === "post") { + queuePostRenderEffect$1( + effect2.run.bind(effect2), + instance && instance.suspense + ); + } else { + effect2.run(); + } + return unwatch; +} +function instanceWatch(source, value, options) { + const publicThis = this.proxy; + const getter = isString(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis); + let cb; + if (isFunction(value)) { + cb = value; + } else { + cb = value.handler; + options = value; + } + const reset = setCurrentInstance(this); + const res = doWatch(getter, cb.bind(publicThis), options); + reset(); + return res; +} +function createPathGetter(ctx, path) { + const segments = path.split("."); + return () => { + let cur = ctx; + for (let i = 0; i < segments.length && cur; i++) { + cur = cur[segments[i]]; + } + return cur; + }; +} +function traverse(value, depth, currentDepth = 0, seen) { + if (!isObject(value) || value["__v_skip"]) { + return value; + } + if (depth && depth > 0) { + if (currentDepth >= depth) { + return value; + } + currentDepth++; + } + seen = seen || /* @__PURE__ */ new Set(); + if (seen.has(value)) { + return value; + } + seen.add(value); + if (isRef(value)) { + traverse(value.value, depth, currentDepth, seen); + } else if (isArray(value)) { + for (let i = 0; i < value.length; i++) { + traverse(value[i], depth, currentDepth, seen); + } + } else if (isSet(value) || isMap(value)) { + value.forEach((v) => { + traverse(v, depth, currentDepth, seen); + }); + } else if (isPlainObject(value)) { + for (const key in value) { + traverse(value[key], depth, currentDepth, seen); + } + } + return value; +} +function validateDirectiveName(name) { + if (isBuiltInDirective(name)) { + warn$1("Do not use built-in directive ids as custom directive id: " + name); + } +} +function createAppContext() { + return { + app: null, + config: { + isNativeTag: NO, + performance: false, + globalProperties: {}, + optionMergeStrategies: {}, + errorHandler: void 0, + warnHandler: void 0, + compilerOptions: {} + }, + mixins: [], + components: {}, + directives: {}, + provides: /* @__PURE__ */ Object.create(null), + optionsCache: /* @__PURE__ */ new WeakMap(), + propsCache: /* @__PURE__ */ new WeakMap(), + emitsCache: /* @__PURE__ */ new WeakMap() + }; +} +let uid$1 = 0; +function createAppAPI(render, hydrate) { + return function createApp2(rootComponent, rootProps = null) { + if (!isFunction(rootComponent)) { + rootComponent = extend({}, rootComponent); + } + if (rootProps != null && !isObject(rootProps)) { + warn$1(`root props passed to app.mount() must be an object.`); + rootProps = null; + } + const context = createAppContext(); + const installedPlugins = /* @__PURE__ */ new WeakSet(); + const app = context.app = { + _uid: uid$1++, + _component: rootComponent, + _props: rootProps, + _container: null, + _context: context, + _instance: null, + version, + get config() { + return context.config; + }, + set config(v) { + { + warn$1( + `app.config cannot be replaced. Modify individual options instead.` + ); + } + }, + use(plugin2, ...options) { + if (installedPlugins.has(plugin2)) { + warn$1(`Plugin has already been applied to target app.`); + } else if (plugin2 && isFunction(plugin2.install)) { + installedPlugins.add(plugin2); + plugin2.install(app, ...options); + } else if (isFunction(plugin2)) { + installedPlugins.add(plugin2); + plugin2(app, ...options); + } else { + warn$1( + `A plugin must either be a function or an object with an "install" function.` + ); + } + return app; + }, + mixin(mixin) { + { + if (!context.mixins.includes(mixin)) { + context.mixins.push(mixin); + } else { + warn$1( + "Mixin has already been applied to target app" + (mixin.name ? `: ${mixin.name}` : "") + ); + } + } + return app; + }, + component(name, component) { + { + validateComponentName(name, context.config); + } + if (!component) { + return context.components[name]; + } + if (context.components[name]) { + warn$1(`Component "${name}" has already been registered in target app.`); + } + context.components[name] = component; + return app; + }, + directive(name, directive) { + { + validateDirectiveName(name); + } + if (!directive) { + return context.directives[name]; + } + if (context.directives[name]) { + warn$1(`Directive "${name}" has already been registered in target app.`); + } + context.directives[name] = directive; + return app; + }, + // fixed by xxxxxx + mount() { + }, + // fixed by xxxxxx + unmount() { + }, + provide(key, value) { + if (key in context.provides) { + warn$1( + `App already provides property with key "${String(key)}". It will be overwritten with the new value.` + ); + } + context.provides[key] = value; + return app; + }, + runWithContext(fn) { + const lastApp = currentApp; + currentApp = app; + try { + return fn(); + } finally { + currentApp = lastApp; + } + } + }; + return app; + }; +} +let currentApp = null; +function provide(key, value) { + if (!currentInstance) { + { + warn$1(`provide() can only be used inside setup().`); + } + } else { + let provides = currentInstance.provides; + const parentProvides = currentInstance.parent && currentInstance.parent.provides; + if (parentProvides === provides) { + provides = currentInstance.provides = Object.create(parentProvides); + } + provides[key] = value; + if (currentInstance.type.mpType === "app") { + currentInstance.appContext.app.provide(key, value); + } + } +} +function inject(key, defaultValue, treatDefaultAsFactory = false) { + const instance = currentInstance || currentRenderingInstance; + if (instance || currentApp) { + const provides = instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : currentApp._context.provides; + if (provides && key in provides) { + return provides[key]; + } else if (arguments.length > 1) { + return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue; + } else { + warn$1(`injection "${String(key)}" not found.`); + } + } else { + warn$1(`inject() can only be used inside setup() or functional components.`); + } +} +const isKeepAlive = (vnode) => vnode.type.__isKeepAlive; +function onActivated(hook, target) { + registerKeepAliveHook(hook, "a", target); +} +function onDeactivated(hook, target) { + registerKeepAliveHook(hook, "da", target); +} +function registerKeepAliveHook(hook, type, target = currentInstance) { + const wrappedHook = hook.__wdc || (hook.__wdc = () => { + let current = target; + while (current) { + if (current.isDeactivated) { + return; + } + current = current.parent; + } + return hook(); + }); + injectHook(type, wrappedHook, target); + if (target) { + let current = target.parent; + while (current && current.parent) { + if (isKeepAlive(current.parent.vnode)) { + injectToKeepAliveRoot(wrappedHook, type, target, current); + } + current = current.parent; + } + } +} +function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) { + const injected = injectHook( + type, + hook, + keepAliveRoot, + true + /* prepend */ + ); + onUnmounted(() => { + remove(keepAliveRoot[type], injected); + }, target); +} +function injectHook(type, hook, target = currentInstance, prepend = false) { + if (target) { + if (isRootHook(type)) { + target = target.root; + } + const hooks = target[type] || (target[type] = []); + const wrappedHook = hook.__weh || (hook.__weh = (...args) => { + if (target.isUnmounted) { + return; + } + pauseTracking(); + const reset = setCurrentInstance(target); + const res = callWithAsyncErrorHandling(hook, target, type, args); + reset(); + resetTracking(); + return res; + }); + if (prepend) { + hooks.unshift(wrappedHook); + } else { + hooks.push(wrappedHook); + } + return wrappedHook; + } else { + const apiName = toHandlerKey( + (ErrorTypeStrings[type] || type.replace(/^on/, "")).replace(/ hook$/, "") + ); + warn$1( + `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + ); + } +} +const createHook = (lifecycle) => (hook, target = currentInstance) => ( + // post-create lifecycle registrations are noops during SSR (except for serverPrefetch) + (!isInSSRComponentSetup || lifecycle === "sp") && injectHook(lifecycle, (...args) => hook(...args), target) +); +const onBeforeMount = createHook("bm"); +const onMounted = createHook("m"); +const onBeforeUpdate = createHook("bu"); +const onUpdated = createHook("u"); +const onBeforeUnmount = createHook("bum"); +const onUnmounted = createHook("um"); +const onServerPrefetch = createHook("sp"); +const onRenderTriggered = createHook( + "rtg" +); +const onRenderTracked = createHook( + "rtc" +); +function onErrorCaptured(hook, target = currentInstance) { + injectHook("ec", hook, target); +} +const getPublicInstance = (i) => { + if (!i) + return null; + if (isStatefulComponent(i)) + return getExposeProxy(i) || i.proxy; + return getPublicInstance(i.parent); +}; +const publicPropertiesMap = ( + // Move PURE marker to new line to workaround compiler discarding it + // due to type annotation + /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), { + $: (i) => i, + // fixed by xxxxxx vue-i18n 在 dev 模式,访问了 $el,故模拟一个假的 + // $el: i => i.vnode.el, + $el: (i) => i.__$el || (i.__$el = {}), + $data: (i) => i.data, + $props: (i) => shallowReadonly(i.props), + $attrs: (i) => shallowReadonly(i.attrs), + $slots: (i) => shallowReadonly(i.slots), + $refs: (i) => shallowReadonly(i.refs), + $parent: (i) => getPublicInstance(i.parent), + $root: (i) => getPublicInstance(i.root), + $emit: (i) => i.emit, + $options: (i) => resolveMergedOptions(i), + $forceUpdate: (i) => i.f || (i.f = () => { + i.effect.dirty = true; + queueJob(i.update); + }), + // $nextTick: i => i.n || (i.n = nextTick.bind(i.proxy!)),// fixed by xxxxxx + $watch: (i) => instanceWatch.bind(i) + }) +); +const isReservedPrefix = (key) => key === "_" || key === "$"; +const hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key); +const PublicInstanceProxyHandlers = { + get({ _: instance }, key) { + const { ctx, setupState, data, props, accessCache, type, appContext } = instance; + if (key === "__isVue") { + return true; + } + let normalizedProps; + if (key[0] !== "$") { + const n2 = accessCache[key]; + if (n2 !== void 0) { + switch (n2) { + case 1: + return setupState[key]; + case 2: + return data[key]; + case 4: + return ctx[key]; + case 3: + return props[key]; + } + } else if (hasSetupBinding(setupState, key)) { + accessCache[key] = 1; + return setupState[key]; + } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { + accessCache[key] = 2; + return data[key]; + } else if ( + // only cache other properties when instance has declared (thus stable) + // props + (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key) + ) { + accessCache[key] = 3; + return props[key]; + } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { + accessCache[key] = 4; + return ctx[key]; + } else if (shouldCacheAccess) { + accessCache[key] = 0; + } + } + const publicGetter = publicPropertiesMap[key]; + let cssModule, globalProperties; + if (publicGetter) { + if (key === "$attrs") { + track(instance, "get", key); + } else if (key === "$slots") { + track(instance, "get", key); + } + return publicGetter(instance); + } else if ( + // css module (injected by vue-loader) + (cssModule = type.__cssModules) && (cssModule = cssModule[key]) + ) { + return cssModule; + } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { + accessCache[key] = 4; + return ctx[key]; + } else if ( + // global properties + globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key) + ) { + { + return globalProperties[key]; + } + } else if (currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading + // to infinite warning loop + key.indexOf("__v") !== 0)) { + if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) { + warn$1( + `Property ${JSON.stringify( + key + )} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.` + ); + } else if (instance === currentRenderingInstance) { + warn$1( + `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.` + ); + } + } + }, + set({ _: instance }, key, value) { + const { data, setupState, ctx } = instance; + if (hasSetupBinding(setupState, key)) { + setupState[key] = value; + return true; + } else if (setupState.__isScriptSetup && hasOwn(setupState, key)) { + warn$1(`Cannot mutate