From 02a187377d982c5a849997e49a022b64b8e1faaf Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Thu, 20 Aug 2026 20:10:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=9F=8F=E6=82=A6?= =?UTF-8?q?=E7=89=A9=E6=B5=81=E6=B5=B7=E5=A4=96=E7=89=88=20PDA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 2 + .gitignore | 10 + AGENTS.md | 29 + README.md | 40 + index.html | 17 + package-lock.json | 7171 +++++++++++++++++ package.json | 28 + src/App.vue | 18 + src/api/auth.js | 36 + src/components/PopupHeader.vue | 28 + src/components/PortalHeader.vue | 48 + src/components/ScanTargetInput.vue | 58 + src/config/runtime.js | 5 + src/data/overseas-workbench.js | 53 + src/main.js | 10 + src/manifest.json | 49 + src/pages.json | 18 + src/pages/history/history.vue | 7 + src/pages/home/home.vue | 48 + src/pages/login/login.vue | 43 + src/pages/module/module.vue | 27 + src/pages/operation/operation.vue | 39 + src/pages/profile/profile.vue | 7 + src/pages/scanner-test/scanner-test.vue | 151 + src/static/app-icons/1024x1024.png | Bin 0 -> 89408 bytes src/static/app-icons/120x120.png | Bin 0 -> 6235 bytes src/static/app-icons/144x144.png | Bin 0 -> 7281 bytes src/static/app-icons/152x152.png | Bin 0 -> 7775 bytes src/static/app-icons/167x167.png | Bin 0 -> 8503 bytes src/static/app-icons/180x180.png | Bin 0 -> 9136 bytes src/static/app-icons/192x192.png | Bin 0 -> 9839 bytes src/static/app-icons/20x20.png | Bin 0 -> 889 bytes src/static/app-icons/29x29.png | Bin 0 -> 1375 bytes src/static/app-icons/40x40.png | Bin 0 -> 1988 bytes src/static/app-icons/58x58.png | Bin 0 -> 2958 bytes src/static/app-icons/60x60.png | Bin 0 -> 3138 bytes src/static/app-icons/72x72.png | Bin 0 -> 3675 bytes src/static/app-icons/76x76.png | Bin 0 -> 4007 bytes src/static/app-icons/80x80.png | Bin 0 -> 4103 bytes src/static/app-icons/87x87.png | Bin 0 -> 4488 bytes src/static/app-icons/96x96.png | Bin 0 -> 4985 bytes src/static/brand-mark-white.png | Bin 0 -> 12512 bytes src/static/c1.png | Bin 0 -> 401 bytes src/static/c2.png | Bin 0 -> 470 bytes src/static/c3.png | Bin 0 -> 511 bytes src/static/c4.png | Bin 0 -> 476 bytes src/static/c5.png | Bin 0 -> 472 bytes src/static/c6.png | Bin 0 -> 545 bytes src/static/c7.png | Bin 0 -> 365 bytes src/static/c8.png | Bin 0 -> 587 bytes src/static/c9.png | Bin 0 -> 565 bytes src/static/customicons.css | 20 + src/static/customicons.ttf | Bin 0 -> 2416 bytes src/static/logo.png | Bin 0 -> 4023 bytes src/static/mp3/fail.mp3 | Bin 0 -> 12580 bytes src/static/mp3/success.mp3 | Bin 0 -> 4224 bytes src/static/uni.png | Bin 0 -> 4162 bytes src/stores/session.js | 95 + src/styles/pda.scss | 1225 +++ src/uni.scss | 1 + src/uni_modules/uni-badge/changelog.md | 33 + .../components/uni-badge/uni-badge.vue | 268 + src/uni_modules/uni-badge/package.json | 85 + src/uni_modules/uni-badge/readme.md | 10 + src/uni_modules/uni-breadcrumb/changelog.md | 6 + .../uni-breadcrumb-item.vue | 126 + .../uni-breadcrumb/uni-breadcrumb.vue | 46 + src/uni_modules/uni-breadcrumb/package.json | 88 + src/uni_modules/uni-breadcrumb/readme.md | 66 + src/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 + .../uni-calendar/uni-calendar-item.vue | 187 + .../components/uni-calendar/uni-calendar.vue | 567 ++ .../components/uni-calendar/util.js | 360 + src/uni_modules/uni-calendar/package.json | 85 + src/uni_modules/uni-calendar/readme.md | 103 + src/uni_modules/uni-card/changelog.md | 26 + .../uni-card/components/uni-card/uni-card.vue | 270 + src/uni_modules/uni-card/package.json | 90 + src/uni_modules/uni-card/readme.md | 12 + src/uni_modules/uni-collapse/changelog.md | 38 + .../uni-collapse-item/uni-collapse-item.vue | 402 + .../components/uni-collapse/uni-collapse.vue | 147 + src/uni_modules/uni-collapse/package.json | 86 + src/uni_modules/uni-collapse/readme.md | 12 + src/uni_modules/uni-combox/changelog.md | 15 + .../components/uni-combox/uni-combox.vue | 275 + src/uni_modules/uni-combox/package.json | 90 + src/uni_modules/uni-combox/readme.md | 11 + src/uni_modules/uni-countdown/changelog.md | 26 + .../components/uni-countdown/i18n/en.json | 6 + .../components/uni-countdown/i18n/index.js | 8 + .../uni-countdown/i18n/zh-Hans.json | 6 + .../uni-countdown/i18n/zh-Hant.json | 6 + .../uni-countdown/uni-countdown.vue | 281 + src/uni_modules/uni-countdown/package.json | 83 + src/uni_modules/uni-countdown/readme.md | 10 + .../uni-data-checkbox/changelog.md | 49 + .../uni-data-checkbox/uni-data-checkbox.vue | 849 ++ .../uni-data-checkbox/package.json | 84 + src/uni_modules/uni-data-checkbox/readme.md | 18 + src/uni_modules/uni-data-picker/changelog.md | 77 + .../components/uni-data-picker/keypress.js | 45 + .../uni-data-picker/uni-data-picker.uvue | 380 + .../uni-data-picker/uni-data-picker.vue | 551 ++ .../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.css | 76 + .../uni-data-pickerview.uvue | 69 + .../uni-data-pickerview.vue | 323 + src/uni_modules/uni-data-picker/package.json | 91 + src/uni_modules/uni-data-picker/readme.md | 22 + src/uni_modules/uni-data-select/changelog.md | 39 + .../uni-data-select/uni-data-select.vue | 562 ++ src/uni_modules/uni-data-select/package.json | 86 + src/uni_modules/uni-data-select/readme.md | 8 + src/uni_modules/uni-dateformat/changelog.md | 10 + .../components/uni-dateformat/date-format.js | 200 + .../uni-dateformat/uni-dateformat.vue | 88 + src/uni_modules/uni-dateformat/package.json | 88 + src/uni_modules/uni-dateformat/readme.md | 11 + .../uni-datetime-picker/changelog.md | 160 + .../uni-datetime-picker/calendar-item.vue | 177 + .../uni-datetime-picker/calendar.vue | 947 +++ .../uni-datetime-picker/i18n/en.json | 22 + .../uni-datetime-picker/i18n/index.js | 8 + .../uni-datetime-picker/i18n/zh-Hans.json | 22 + .../uni-datetime-picker/i18n/zh-Hant.json | 22 + .../uni-datetime-picker/time-picker.vue | 940 +++ .../uni-datetime-picker.vue | 1057 +++ .../components/uni-datetime-picker/util.js | 421 + .../uni-datetime-picker/package.json | 88 + src/uni_modules/uni-datetime-picker/readme.md | 21 + src/uni_modules/uni-drawer/changelog.md | 13 + .../components/uni-drawer/keypress.js | 45 + .../components/uni-drawer/uni-drawer.vue | 183 + src/uni_modules/uni-drawer/package.json | 87 + src/uni_modules/uni-drawer/readme.md | 10 + src/uni_modules/uni-easyinput/changelog.md | 113 + .../components/uni-easyinput/common.js | 54 + .../uni-easyinput/uni-easyinput.vue | 693 ++ src/uni_modules/uni-easyinput/package.json | 88 + src/uni_modules/uni-easyinput/readme.md | 11 + src/uni_modules/uni-fab/changelog.md | 23 + .../uni-fab/components/uni-fab/uni-fab.vue | 491 ++ src/uni_modules/uni-fab/package.json | 84 + src/uni_modules/uni-fab/readme.md | 9 + src/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 + .../components/uni-fav/i18n/zh-Hans.json | 4 + .../components/uni-fav/i18n/zh-Hant.json | 4 + .../uni-fav/components/uni-fav/uni-fav.vue | 161 + src/uni_modules/uni-fav/package.json | 89 + src/uni_modules/uni-fav/readme.md | 10 + src/uni_modules/uni-file-picker/changelog.md | 75 + .../uni-file-picker/choose-and-upload-file.js | 287 + .../uni-file-picker/uni-file-picker.vue | 678 ++ .../uni-file-picker/upload-file.vue | 325 + .../uni-file-picker/upload-image.vue | 292 + .../components/uni-file-picker/utils.js | 110 + src/uni_modules/uni-file-picker/package.json | 83 + src/uni_modules/uni-file-picker/readme.md | 11 + src/uni_modules/uni-forms/changelog.md | 94 + .../uni-forms-item/uni-forms-item.vue | 627 ++ .../components/uni-forms/uni-forms.vue | 397 + .../uni-forms/components/uni-forms/utils.js | 293 + .../components/uni-forms/validate.js | 486 ++ src/uni_modules/uni-forms/package.json | 88 + src/uni_modules/uni-forms/readme.md | 23 + src/uni_modules/uni-goods-nav/changelog.md | 18 + .../components/uni-goods-nav/i18n/en.json | 6 + .../components/uni-goods-nav/i18n/index.js | 8 + .../uni-goods-nav/i18n/zh-Hans.json | 6 + .../uni-goods-nav/i18n/zh-Hant.json | 6 + .../uni-goods-nav/uni-goods-nav.vue | 231 + src/uni_modules/uni-goods-nav/package.json | 88 + src/uni_modules/uni-goods-nav/readme.md | 10 + src/uni_modules/uni-grid/changelog.md | 13 + .../uni-grid-item/uni-grid-item.vue | 127 + .../uni-grid/components/uni-grid/uni-grid.vue | 142 + src/uni_modules/uni-grid/package.json | 86 + src/uni_modules/uni-grid/readme.md | 11 + src/uni_modules/uni-group/changelog.md | 16 + .../components/uni-group/uni-group.vue | 134 + src/uni_modules/uni-group/package.json | 87 + src/uni_modules/uni-group/readme.md | 9 + src/uni_modules/uni-icons/changelog.md | 40 + .../components/uni-icons/uni-icons.uvue | 91 + .../components/uni-icons/uni-icons.vue | 110 + .../components/uni-icons/uniicons.css | 664 ++ .../components/uni-icons/uniicons.ttf | Bin 0 -> 35824 bytes .../components/uni-icons/uniicons_file.ts | 664 ++ .../components/uni-icons/uniicons_file_vue.js | 649 ++ src/uni_modules/uni-icons/package.json | 88 + src/uni_modules/uni-icons/readme.md | 8 + src/uni_modules/uni-indexed-list/changelog.md | 17 + .../uni-indexed-list-item.vue | 144 + .../uni-indexed-list/uni-indexed-list.vue | 367 + src/uni_modules/uni-indexed-list/package.json | 89 + src/uni_modules/uni-indexed-list/readme.md | 11 + src/uni_modules/uni-link/changelog.md | 17 + .../uni-link/components/uni-link/uni-link.vue | 128 + src/uni_modules/uni-link/package.json | 87 + src/uni_modules/uni-link/readme.md | 11 + src/uni_modules/uni-list/changelog.md | 46 + .../components/uni-list-ad/uni-list-ad.vue | 107 + .../uni-list-chat/uni-list-chat.scss | 58 + .../uni-list-chat/uni-list-chat.vue | 593 ++ .../uni-list-item/uni-list-item.vue | 534 ++ .../uni-list/components/uni-list/uni-list.vue | 123 + .../components/uni-list/uni-refresh.vue | 65 + .../components/uni-list/uni-refresh.wxs | 87 + src/uni_modules/uni-list/package.json | 88 + src/uni_modules/uni-list/readme.md | 346 + src/uni_modules/uni-load-more/changelog.md | 19 + .../components/uni-load-more/i18n/en.json | 5 + .../components/uni-load-more/i18n/index.js | 8 + .../uni-load-more/i18n/zh-Hans.json | 5 + .../uni-load-more/i18n/zh-Hant.json | 5 + .../uni-load-more/uni-load-more.vue | 399 + src/uni_modules/uni-load-more/package.json | 86 + src/uni_modules/uni-load-more/readme.md | 14 + src/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 + src/uni_modules/uni-nav-bar/package.json | 86 + src/uni_modules/uni-nav-bar/readme.md | 15 + src/uni_modules/uni-notice-bar/changelog.md | 20 + .../uni-notice-bar/uni-notice-bar.vue | 431 + src/uni_modules/uni-notice-bar/package.json | 87 + src/uni_modules/uni-notice-bar/readme.md | 13 + src/uni_modules/uni-number-box/changelog.md | 39 + .../uni-number-box/uni-number-box.vue | 232 + src/uni_modules/uni-number-box/package.json | 83 + src/uni_modules/uni-number-box/readme.md | 13 + src/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 + .../uni-pagination/i18n/zh-Hans.json | 5 + .../uni-pagination/i18n/zh-Hant.json | 5 + .../uni-pagination/uni-pagination.vue | 465 ++ src/uni_modules/uni-pagination/package.json | 83 + src/uni_modules/uni-pagination/readme.md | 11 + src/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 + .../uni-popup-share/uni-popup-share.vue | 187 + .../components/uni-popup/i18n/en.json | 7 + .../components/uni-popup/i18n/index.js | 8 + .../components/uni-popup/i18n/zh-Hans.json | 7 + .../components/uni-popup/i18n/zh-Hant.json | 7 + .../components/uni-popup/keypress.js | 45 + .../uni-popup/components/uni-popup/popup.js | 26 + .../components/uni-popup/uni-popup.uvue | 90 + .../components/uni-popup/uni-popup.vue | 503 ++ src/uni_modules/uni-popup/package.json | 88 + src/uni_modules/uni-popup/readme.md | 17 + src/uni_modules/uni-rate/changelog.md | 25 + .../uni-rate/components/uni-rate/uni-rate.vue | 361 + src/uni_modules/uni-rate/package.json | 88 + src/uni_modules/uni-rate/readme.md | 12 + src/uni_modules/uni-row/changelog.md | 10 + .../uni-row/components/uni-col/uni-col.vue | 317 + .../uni-row/components/uni-row/uni-row.vue | 190 + src/uni_modules/uni-row/package.json | 87 + src/uni_modules/uni-row/readme.md | 10 + src/uni_modules/uni-scss/changelog.md | 8 + src/uni_modules/uni-scss/index.scss | 1 + src/uni_modules/uni-scss/package.json | 82 + src/uni_modules/uni-scss/readme.md | 4 + src/uni_modules/uni-scss/styles/index.scss | 7 + .../uni-scss/styles/setting/_border.scss | 3 + .../uni-scss/styles/setting/_color.scss | 66 + .../uni-scss/styles/setting/_radius.scss | 55 + .../uni-scss/styles/setting/_space.scss | 56 + .../uni-scss/styles/setting/_styles.scss | 167 + .../uni-scss/styles/setting/_text.scss | 24 + .../uni-scss/styles/setting/_variables.scss | 146 + .../uni-scss/styles/tools/functions.scss | 19 + src/uni_modules/uni-scss/theme.scss | 31 + src/uni_modules/uni-scss/variables.scss | 62 + src/uni_modules/uni-search-bar/changelog.md | 47 + .../components/uni-search-bar/i18n/en.json | 4 + .../components/uni-search-bar/i18n/index.js | 8 + .../uni-search-bar/i18n/zh-Hans.json | 4 + .../uni-search-bar/i18n/zh-Hant.json | 4 + .../uni-search-bar/uni-search-bar.vue | 309 + src/uni_modules/uni-search-bar/package.json | 87 + src/uni_modules/uni-search-bar/readme.md | 14 + src/uni_modules/uni-section/changelog.md | 2 + .../components/uni-section/uni-section.vue | 167 + src/uni_modules/uni-section/package.json | 87 + src/uni_modules/uni-section/readme.md | 8 + .../uni-segmented-control/changelog.md | 15 + .../uni-segmented-control.vue | 146 + .../uni-segmented-control/package.json | 85 + .../uni-segmented-control/readme.md | 13 + src/uni_modules/uni-steps/changelog.md | 18 + .../components/uni-steps/uni-steps.vue | 280 + src/uni_modules/uni-steps/package.json | 87 + src/uni_modules/uni-steps/readme.md | 13 + src/uni_modules/uni-swipe-action/changelog.md | 47 + .../uni-swipe-action-item/bindingx.js | 302 + .../components/uni-swipe-action-item/isPC.js | 12 + .../uni-swipe-action-item/mpalipay.js | 195 + .../uni-swipe-action-item/mpother.js | 260 + .../components/uni-swipe-action-item/mpwxs.js | 84 + .../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 + src/uni_modules/uni-swipe-action/package.json | 84 + src/uni_modules/uni-swipe-action/readme.md | 11 + src/uni_modules/uni-swiper-dot/changelog.md | 12 + .../uni-swiper-dot/uni-swiper-dot.vue | 218 + src/uni_modules/uni-swiper-dot/package.json | 87 + src/uni_modules/uni-swiper-dot/readme.md | 11 + src/uni_modules/uni-table/changelog.md | 29 + .../components/uni-table/uni-table.vue | 455 ++ .../components/uni-tbody/uni-tbody.vue | 29 + .../uni-table/components/uni-td/uni-td.vue | 90 + .../components/uni-th/filter-dropdown.vue | 511 ++ .../uni-table/components/uni-th/uni-th.vue | 285 + .../components/uni-thead/uni-thead.vue | 137 + .../components/uni-tr/table-checkbox.vue | 179 + .../uni-table/components/uni-tr/uni-tr.vue | 184 + src/uni_modules/uni-table/i18n/en.json | 9 + src/uni_modules/uni-table/i18n/es.json | 9 + src/uni_modules/uni-table/i18n/fr.json | 9 + src/uni_modules/uni-table/i18n/index.js | 12 + src/uni_modules/uni-table/i18n/zh-Hans.json | 9 + src/uni_modules/uni-table/i18n/zh-Hant.json | 9 + src/uni_modules/uni-table/package.json | 83 + src/uni_modules/uni-table/readme.md | 13 + src/uni_modules/uni-tag/changelog.md | 23 + .../uni-tag/components/uni-tag/uni-tag.vue | 252 + src/uni_modules/uni-tag/package.json | 84 + src/uni_modules/uni-tag/readme.md | 13 + src/uni_modules/uni-test/changelog.md | 39 + .../uni-test/components/uni-test/uni-test.vue | 26 + src/uni_modules/uni-test/package.json | 83 + src/uni_modules/uni-test/readme.md | 10 + src/uni_modules/uni-title/changelog.md | 10 + .../components/uni-title/uni-title.vue | 171 + src/uni_modules/uni-title/package.json | 88 + src/uni_modules/uni-title/readme.md | 14 + src/uni_modules/uni-tooltip/changelog.md | 16 + .../components/uni-tooltip/uni-tooltip.vue | 109 + src/uni_modules/uni-tooltip/package.json | 86 + src/uni_modules/uni-tooltip/readme.md | 8 + src/uni_modules/uni-transition/changelog.md | 24 + .../uni-transition/createAnimation.js | 131 + .../uni-transition/uni-transition.vue | 286 + src/uni_modules/uni-transition/package.json | 85 + src/uni_modules/uni-transition/readme.md | 11 + src/uni_modules/uni-ui/changelog.md | 578 ++ .../uni-ui/components/uni-ui/uni-ui.vue | 7 + src/uni_modules/uni-ui/package.json | 130 + src/uni_modules/uni-ui/readme.md | 247 + src/utils/audio-feedback.js | 51 + src/utils/navigation.js | 23 + src/utils/network.js | 46 + src/utils/scan-broadcast.js | 76 + tests/audio-feedback.test.mjs | 34 + tests/navigation.test.mjs | 38 + tests/project-contract.test.mjs | 36 + tests/scan-broadcast.test.mjs | 25 + vite.config.js | 6 + 377 files changed, 49737 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 README.md create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/App.vue create mode 100644 src/api/auth.js create mode 100644 src/components/PopupHeader.vue create mode 100644 src/components/PortalHeader.vue create mode 100644 src/components/ScanTargetInput.vue create mode 100644 src/config/runtime.js create mode 100644 src/data/overseas-workbench.js create mode 100644 src/main.js create mode 100644 src/manifest.json create mode 100644 src/pages.json create mode 100644 src/pages/history/history.vue create mode 100644 src/pages/home/home.vue create mode 100644 src/pages/login/login.vue create mode 100644 src/pages/module/module.vue create mode 100644 src/pages/operation/operation.vue create mode 100644 src/pages/profile/profile.vue create mode 100644 src/pages/scanner-test/scanner-test.vue create mode 100644 src/static/app-icons/1024x1024.png create mode 100644 src/static/app-icons/120x120.png create mode 100644 src/static/app-icons/144x144.png create mode 100644 src/static/app-icons/152x152.png create mode 100644 src/static/app-icons/167x167.png create mode 100644 src/static/app-icons/180x180.png create mode 100644 src/static/app-icons/192x192.png create mode 100644 src/static/app-icons/20x20.png create mode 100644 src/static/app-icons/29x29.png create mode 100644 src/static/app-icons/40x40.png create mode 100644 src/static/app-icons/58x58.png create mode 100644 src/static/app-icons/60x60.png create mode 100644 src/static/app-icons/72x72.png create mode 100644 src/static/app-icons/76x76.png create mode 100644 src/static/app-icons/80x80.png create mode 100644 src/static/app-icons/87x87.png create mode 100644 src/static/app-icons/96x96.png create mode 100644 src/static/brand-mark-white.png create mode 100644 src/static/c1.png create mode 100644 src/static/c2.png create mode 100644 src/static/c3.png create mode 100644 src/static/c4.png create mode 100644 src/static/c5.png create mode 100644 src/static/c6.png create mode 100644 src/static/c7.png create mode 100644 src/static/c8.png create mode 100644 src/static/c9.png create mode 100644 src/static/customicons.css create mode 100644 src/static/customicons.ttf create mode 100644 src/static/logo.png create mode 100644 src/static/mp3/fail.mp3 create mode 100644 src/static/mp3/success.mp3 create mode 100644 src/static/uni.png create mode 100644 src/stores/session.js create mode 100644 src/styles/pda.scss create mode 100644 src/uni.scss create mode 100644 src/uni_modules/uni-badge/changelog.md create mode 100644 src/uni_modules/uni-badge/components/uni-badge/uni-badge.vue create mode 100644 src/uni_modules/uni-badge/package.json create mode 100644 src/uni_modules/uni-badge/readme.md create mode 100644 src/uni_modules/uni-breadcrumb/changelog.md create mode 100644 src/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue create mode 100644 src/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue create mode 100644 src/uni_modules/uni-breadcrumb/package.json create mode 100644 src/uni_modules/uni-breadcrumb/readme.md create mode 100644 src/uni_modules/uni-calendar/changelog.md create mode 100644 src/uni_modules/uni-calendar/components/uni-calendar/calendar.js create mode 100644 src/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json create mode 100644 src/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js create mode 100644 src/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json create mode 100644 src/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json create mode 100644 src/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue create mode 100644 src/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue create mode 100644 src/uni_modules/uni-calendar/components/uni-calendar/util.js create mode 100644 src/uni_modules/uni-calendar/package.json create mode 100644 src/uni_modules/uni-calendar/readme.md create mode 100644 src/uni_modules/uni-card/changelog.md create mode 100644 src/uni_modules/uni-card/components/uni-card/uni-card.vue create mode 100644 src/uni_modules/uni-card/package.json create mode 100644 src/uni_modules/uni-card/readme.md create mode 100644 src/uni_modules/uni-collapse/changelog.md create mode 100644 src/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue create mode 100644 src/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue create mode 100644 src/uni_modules/uni-collapse/package.json create mode 100644 src/uni_modules/uni-collapse/readme.md create mode 100644 src/uni_modules/uni-combox/changelog.md create mode 100644 src/uni_modules/uni-combox/components/uni-combox/uni-combox.vue create mode 100644 src/uni_modules/uni-combox/package.json create mode 100644 src/uni_modules/uni-combox/readme.md create mode 100644 src/uni_modules/uni-countdown/changelog.md create mode 100644 src/uni_modules/uni-countdown/components/uni-countdown/i18n/en.json create mode 100644 src/uni_modules/uni-countdown/components/uni-countdown/i18n/index.js create mode 100644 src/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hans.json create mode 100644 src/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hant.json create mode 100644 src/uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue create mode 100644 src/uni_modules/uni-countdown/package.json create mode 100644 src/uni_modules/uni-countdown/readme.md create mode 100644 src/uni_modules/uni-data-checkbox/changelog.md create mode 100644 src/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue create mode 100644 src/uni_modules/uni-data-checkbox/package.json create mode 100644 src/uni_modules/uni-data-checkbox/readme.md create mode 100644 src/uni_modules/uni-data-picker/changelog.md create mode 100644 src/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js create mode 100644 src/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue create mode 100644 src/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue create mode 100644 src/uni_modules/uni-data-picker/components/uni-data-pickerview/loading.uts create mode 100644 src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js create mode 100644 src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts create mode 100644 src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css create mode 100644 src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue create mode 100644 src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue create mode 100644 src/uni_modules/uni-data-picker/package.json create mode 100644 src/uni_modules/uni-data-picker/readme.md create mode 100644 src/uni_modules/uni-data-select/changelog.md create mode 100644 src/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue create mode 100644 src/uni_modules/uni-data-select/package.json create mode 100644 src/uni_modules/uni-data-select/readme.md create mode 100644 src/uni_modules/uni-dateformat/changelog.md create mode 100644 src/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js create mode 100644 src/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue create mode 100644 src/uni_modules/uni-dateformat/package.json create mode 100644 src/uni_modules/uni-dateformat/readme.md create mode 100644 src/uni_modules/uni-datetime-picker/changelog.md create mode 100644 src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue create mode 100644 src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue create mode 100644 src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json create mode 100644 src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js create mode 100644 src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json create mode 100644 src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json create mode 100644 src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue create mode 100644 src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue create mode 100644 src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js create mode 100644 src/uni_modules/uni-datetime-picker/package.json create mode 100644 src/uni_modules/uni-datetime-picker/readme.md create mode 100644 src/uni_modules/uni-drawer/changelog.md create mode 100644 src/uni_modules/uni-drawer/components/uni-drawer/keypress.js create mode 100644 src/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue create mode 100644 src/uni_modules/uni-drawer/package.json create mode 100644 src/uni_modules/uni-drawer/readme.md create mode 100644 src/uni_modules/uni-easyinput/changelog.md create mode 100644 src/uni_modules/uni-easyinput/components/uni-easyinput/common.js create mode 100644 src/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue create mode 100644 src/uni_modules/uni-easyinput/package.json create mode 100644 src/uni_modules/uni-easyinput/readme.md create mode 100644 src/uni_modules/uni-fab/changelog.md create mode 100644 src/uni_modules/uni-fab/components/uni-fab/uni-fab.vue create mode 100644 src/uni_modules/uni-fab/package.json create mode 100644 src/uni_modules/uni-fab/readme.md create mode 100644 src/uni_modules/uni-fav/changelog.md create mode 100644 src/uni_modules/uni-fav/components/uni-fav/i18n/en.json create mode 100644 src/uni_modules/uni-fav/components/uni-fav/i18n/index.js create mode 100644 src/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json create mode 100644 src/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json create mode 100644 src/uni_modules/uni-fav/components/uni-fav/uni-fav.vue create mode 100644 src/uni_modules/uni-fav/package.json create mode 100644 src/uni_modules/uni-fav/readme.md create mode 100644 src/uni_modules/uni-file-picker/changelog.md create mode 100644 src/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js create mode 100644 src/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue create mode 100644 src/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue create mode 100644 src/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue create mode 100644 src/uni_modules/uni-file-picker/components/uni-file-picker/utils.js create mode 100644 src/uni_modules/uni-file-picker/package.json create mode 100644 src/uni_modules/uni-file-picker/readme.md create mode 100644 src/uni_modules/uni-forms/changelog.md create mode 100644 src/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue create mode 100644 src/uni_modules/uni-forms/components/uni-forms/uni-forms.vue create mode 100644 src/uni_modules/uni-forms/components/uni-forms/utils.js create mode 100644 src/uni_modules/uni-forms/components/uni-forms/validate.js create mode 100644 src/uni_modules/uni-forms/package.json create mode 100644 src/uni_modules/uni-forms/readme.md create mode 100644 src/uni_modules/uni-goods-nav/changelog.md create mode 100644 src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json create mode 100644 src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js create mode 100644 src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json create mode 100644 src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json create mode 100644 src/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue create mode 100644 src/uni_modules/uni-goods-nav/package.json create mode 100644 src/uni_modules/uni-goods-nav/readme.md create mode 100644 src/uni_modules/uni-grid/changelog.md create mode 100644 src/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue create mode 100644 src/uni_modules/uni-grid/components/uni-grid/uni-grid.vue create mode 100644 src/uni_modules/uni-grid/package.json create mode 100644 src/uni_modules/uni-grid/readme.md create mode 100644 src/uni_modules/uni-group/changelog.md create mode 100644 src/uni_modules/uni-group/components/uni-group/uni-group.vue create mode 100644 src/uni_modules/uni-group/package.json create mode 100644 src/uni_modules/uni-group/readme.md create mode 100644 src/uni_modules/uni-icons/changelog.md create mode 100644 src/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue create mode 100644 src/uni_modules/uni-icons/components/uni-icons/uni-icons.vue create mode 100644 src/uni_modules/uni-icons/components/uni-icons/uniicons.css create mode 100644 src/uni_modules/uni-icons/components/uni-icons/uniicons.ttf create mode 100644 src/uni_modules/uni-icons/components/uni-icons/uniicons_file.ts create mode 100644 src/uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js create mode 100644 src/uni_modules/uni-icons/package.json create mode 100644 src/uni_modules/uni-icons/readme.md create mode 100644 src/uni_modules/uni-indexed-list/changelog.md create mode 100644 src/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue create mode 100644 src/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue create mode 100644 src/uni_modules/uni-indexed-list/package.json create mode 100644 src/uni_modules/uni-indexed-list/readme.md create mode 100644 src/uni_modules/uni-link/changelog.md create mode 100644 src/uni_modules/uni-link/components/uni-link/uni-link.vue create mode 100644 src/uni_modules/uni-link/package.json create mode 100644 src/uni_modules/uni-link/readme.md create mode 100644 src/uni_modules/uni-list/changelog.md create mode 100644 src/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue create mode 100644 src/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss create mode 100644 src/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue create mode 100644 src/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue create mode 100644 src/uni_modules/uni-list/components/uni-list/uni-list.vue create mode 100644 src/uni_modules/uni-list/components/uni-list/uni-refresh.vue create mode 100644 src/uni_modules/uni-list/components/uni-list/uni-refresh.wxs create mode 100644 src/uni_modules/uni-list/package.json create mode 100644 src/uni_modules/uni-list/readme.md create mode 100644 src/uni_modules/uni-load-more/changelog.md create mode 100644 src/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json create mode 100644 src/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js create mode 100644 src/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json create mode 100644 src/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json create mode 100644 src/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue create mode 100644 src/uni_modules/uni-load-more/package.json create mode 100644 src/uni_modules/uni-load-more/readme.md create mode 100644 src/uni_modules/uni-nav-bar/changelog.md create mode 100644 src/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue create mode 100644 src/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue create mode 100644 src/uni_modules/uni-nav-bar/package.json create mode 100644 src/uni_modules/uni-nav-bar/readme.md create mode 100644 src/uni_modules/uni-notice-bar/changelog.md create mode 100644 src/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue create mode 100644 src/uni_modules/uni-notice-bar/package.json create mode 100644 src/uni_modules/uni-notice-bar/readme.md create mode 100644 src/uni_modules/uni-number-box/changelog.md create mode 100644 src/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue create mode 100644 src/uni_modules/uni-number-box/package.json create mode 100644 src/uni_modules/uni-number-box/readme.md create mode 100644 src/uni_modules/uni-pagination/changelog.md create mode 100644 src/uni_modules/uni-pagination/components/uni-pagination/i18n/en.json create mode 100644 src/uni_modules/uni-pagination/components/uni-pagination/i18n/es.json create mode 100644 src/uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json create mode 100644 src/uni_modules/uni-pagination/components/uni-pagination/i18n/index.js create mode 100644 src/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json create mode 100644 src/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json create mode 100644 src/uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue create mode 100644 src/uni_modules/uni-pagination/package.json create mode 100644 src/uni_modules/uni-pagination/readme.md create mode 100644 src/uni_modules/uni-popup/changelog.md create mode 100644 src/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js create mode 100644 src/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue create mode 100644 src/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue create mode 100644 src/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue create mode 100644 src/uni_modules/uni-popup/components/uni-popup/i18n/en.json create mode 100644 src/uni_modules/uni-popup/components/uni-popup/i18n/index.js create mode 100644 src/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json create mode 100644 src/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json create mode 100644 src/uni_modules/uni-popup/components/uni-popup/keypress.js create mode 100644 src/uni_modules/uni-popup/components/uni-popup/popup.js create mode 100644 src/uni_modules/uni-popup/components/uni-popup/uni-popup.uvue create mode 100644 src/uni_modules/uni-popup/components/uni-popup/uni-popup.vue create mode 100644 src/uni_modules/uni-popup/package.json create mode 100644 src/uni_modules/uni-popup/readme.md create mode 100644 src/uni_modules/uni-rate/changelog.md create mode 100644 src/uni_modules/uni-rate/components/uni-rate/uni-rate.vue create mode 100644 src/uni_modules/uni-rate/package.json create mode 100644 src/uni_modules/uni-rate/readme.md create mode 100644 src/uni_modules/uni-row/changelog.md create mode 100644 src/uni_modules/uni-row/components/uni-col/uni-col.vue create mode 100644 src/uni_modules/uni-row/components/uni-row/uni-row.vue create mode 100644 src/uni_modules/uni-row/package.json create mode 100644 src/uni_modules/uni-row/readme.md create mode 100644 src/uni_modules/uni-scss/changelog.md create mode 100644 src/uni_modules/uni-scss/index.scss create mode 100644 src/uni_modules/uni-scss/package.json create mode 100644 src/uni_modules/uni-scss/readme.md create mode 100644 src/uni_modules/uni-scss/styles/index.scss create mode 100644 src/uni_modules/uni-scss/styles/setting/_border.scss create mode 100644 src/uni_modules/uni-scss/styles/setting/_color.scss create mode 100644 src/uni_modules/uni-scss/styles/setting/_radius.scss create mode 100644 src/uni_modules/uni-scss/styles/setting/_space.scss create mode 100644 src/uni_modules/uni-scss/styles/setting/_styles.scss create mode 100644 src/uni_modules/uni-scss/styles/setting/_text.scss create mode 100644 src/uni_modules/uni-scss/styles/setting/_variables.scss create mode 100644 src/uni_modules/uni-scss/styles/tools/functions.scss create mode 100644 src/uni_modules/uni-scss/theme.scss create mode 100644 src/uni_modules/uni-scss/variables.scss create mode 100644 src/uni_modules/uni-search-bar/changelog.md create mode 100644 src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json create mode 100644 src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js create mode 100644 src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json create mode 100644 src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json create mode 100644 src/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue create mode 100644 src/uni_modules/uni-search-bar/package.json create mode 100644 src/uni_modules/uni-search-bar/readme.md create mode 100644 src/uni_modules/uni-section/changelog.md create mode 100644 src/uni_modules/uni-section/components/uni-section/uni-section.vue create mode 100644 src/uni_modules/uni-section/package.json create mode 100644 src/uni_modules/uni-section/readme.md create mode 100644 src/uni_modules/uni-segmented-control/changelog.md create mode 100644 src/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue create mode 100644 src/uni_modules/uni-segmented-control/package.json create mode 100644 src/uni_modules/uni-segmented-control/readme.md create mode 100644 src/uni_modules/uni-steps/changelog.md create mode 100644 src/uni_modules/uni-steps/components/uni-steps/uni-steps.vue create mode 100644 src/uni_modules/uni-steps/package.json create mode 100644 src/uni_modules/uni-steps/readme.md create mode 100644 src/uni_modules/uni-swipe-action/changelog.md create mode 100644 src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js create mode 100644 src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js create mode 100644 src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js create mode 100644 src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js create mode 100644 src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js create mode 100644 src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js create mode 100644 src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue create mode 100644 src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs create mode 100644 src/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue create mode 100644 src/uni_modules/uni-swipe-action/package.json create mode 100644 src/uni_modules/uni-swipe-action/readme.md create mode 100644 src/uni_modules/uni-swiper-dot/changelog.md create mode 100644 src/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue create mode 100644 src/uni_modules/uni-swiper-dot/package.json create mode 100644 src/uni_modules/uni-swiper-dot/readme.md create mode 100644 src/uni_modules/uni-table/changelog.md create mode 100644 src/uni_modules/uni-table/components/uni-table/uni-table.vue create mode 100644 src/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue create mode 100644 src/uni_modules/uni-table/components/uni-td/uni-td.vue create mode 100644 src/uni_modules/uni-table/components/uni-th/filter-dropdown.vue create mode 100644 src/uni_modules/uni-table/components/uni-th/uni-th.vue create mode 100644 src/uni_modules/uni-table/components/uni-thead/uni-thead.vue create mode 100644 src/uni_modules/uni-table/components/uni-tr/table-checkbox.vue create mode 100644 src/uni_modules/uni-table/components/uni-tr/uni-tr.vue create mode 100644 src/uni_modules/uni-table/i18n/en.json create mode 100644 src/uni_modules/uni-table/i18n/es.json create mode 100644 src/uni_modules/uni-table/i18n/fr.json create mode 100644 src/uni_modules/uni-table/i18n/index.js create mode 100644 src/uni_modules/uni-table/i18n/zh-Hans.json create mode 100644 src/uni_modules/uni-table/i18n/zh-Hant.json create mode 100644 src/uni_modules/uni-table/package.json create mode 100644 src/uni_modules/uni-table/readme.md create mode 100644 src/uni_modules/uni-tag/changelog.md create mode 100644 src/uni_modules/uni-tag/components/uni-tag/uni-tag.vue create mode 100644 src/uni_modules/uni-tag/package.json create mode 100644 src/uni_modules/uni-tag/readme.md create mode 100644 src/uni_modules/uni-test/changelog.md create mode 100644 src/uni_modules/uni-test/components/uni-test/uni-test.vue create mode 100644 src/uni_modules/uni-test/package.json create mode 100644 src/uni_modules/uni-test/readme.md create mode 100644 src/uni_modules/uni-title/changelog.md create mode 100644 src/uni_modules/uni-title/components/uni-title/uni-title.vue create mode 100644 src/uni_modules/uni-title/package.json create mode 100644 src/uni_modules/uni-title/readme.md create mode 100644 src/uni_modules/uni-tooltip/changelog.md create mode 100644 src/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue create mode 100644 src/uni_modules/uni-tooltip/package.json create mode 100644 src/uni_modules/uni-tooltip/readme.md create mode 100644 src/uni_modules/uni-transition/changelog.md create mode 100644 src/uni_modules/uni-transition/components/uni-transition/createAnimation.js create mode 100644 src/uni_modules/uni-transition/components/uni-transition/uni-transition.vue create mode 100644 src/uni_modules/uni-transition/package.json create mode 100644 src/uni_modules/uni-transition/readme.md create mode 100644 src/uni_modules/uni-ui/changelog.md create mode 100644 src/uni_modules/uni-ui/components/uni-ui/uni-ui.vue create mode 100644 src/uni_modules/uni-ui/package.json create mode 100644 src/uni_modules/uni-ui/readme.md create mode 100644 src/utils/audio-feedback.js create mode 100644 src/utils/navigation.js create mode 100644 src/utils/network.js create mode 100644 src/utils/scan-broadcast.js create mode 100644 tests/audio-feedback.test.mjs create mode 100644 tests/navigation.test.mjs create mode 100644 tests/project-contract.test.mjs create mode 100644 tests/scan-broadcast.test.mjs create mode 100644 vite.config.js diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..ea4b441 --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +VITE_AUTH_API_BASE_URL=/api +VITE_OVERSEAS_API_BASE_URL=/api/overseas diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a4eea7e --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +node_modules/ +dist/ +unpackage/ +.hbuilderx/ +.env +.env.* +!.env.example +*.log +.DS_Store +Thumbs.db diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..1e9c849 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,29 @@ +# Overseas PDA Uni-app Instructions + +## 项目定位 + +- 本项目是“柏悦物流海外版”独立 uni-app Vue 3 工程,面向海外仓现场人员。 +- 工程必须独立安装、构建和发布,不得依赖 `apps/pda-uniapp/` 或仓库外 `pda-shared` 目录。 +- 当前业务范围按四期收敛为入仓、库内、换标、库存/库位/托盘查询;不包含海外仓出库、派送和国内集装箱拣货/装柜。 + +## 服务与发布边界 + +- 国内 Auth 是唯一账号和 Token 签发方;海外业务请求统一经 `gateway-overseas`。 +- 国内与海外 AppID、Android 包名、签名、版本号、构建产物和在线更新通道必须独立。 +- `src/manifest.json` 中的 AppID 在正式打包前由海外版所属 DCloud 账号创建;不得伪造或复用国内 AppID。 +- 环境地址只通过 `.env.local` 等未提交环境文件配置,不写入源码。 + +## 工程入口 + +- 源码根:`src/`;页面注册:`src/pages.json`;应用配置:`src/manifest.json`。 +- 工作台定义:`src/data/overseas-workbench.js`。 +- 登录与会话:`src/api/auth.js`、`src/stores/session.js`。 +- 扫码设备层:`src/utils/scan-broadcast.js`;广播 Action=`android.intent.action.SCANRESULT`,Extra=`value`。 +- 当前通用作业页是静态原型,不得将原型提示改成模拟远程成功。 + +## 质量门禁 + +- 安装:`npm install`;检查:`npm test`。 +- H5 生产编译:`npm run build:h5`;App 资源编译:`npm run build:app`。 +- APK/IPA 必须在 HBuilderX 或正式原生打包环境中使用独立 AppID 与签名验证;仅通过 App 资源编译不得声称 APK 真机验收完成。 +- 不提交 `node_modules/`、`dist/`、`unpackage/`、环境文件、签名证书或打包产物。 diff --git a/README.md b/README.md new file mode 100644 index 0000000..1f7b175 --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +# 柏悦物流海外版 PDA + +独立的 uni-app Vue 3 工程,面向海外仓现场人员。工程不依赖国内 PDA 源码或仓库外共享目录,可独立安装依赖、运行、编译和发布。 + +首版工作台按四期边界提供入仓作业、库内作业、换标作业和现场查询原型。登录使用国内 Auth 统一签发的账号与 Token;真实海外业务请求应统一经 `gateway-overseas`,不得请求国内 Firstleg/Warehouse 业务接口。 + +## 本地运行与检查 + +Node.js 22 环境: + +```powershell +npm install +npm test +npm run dev:h5 +``` + +生产编译: + +```powershell +npm run build:h5 +npm run build:app +``` + +- `build:h5` 生成 H5 发布文件; +- `build:app` 生成 App 离线打包资源; +- 生成可安装 APK/IPA 需使用 HBuilderX App 开发版执行云打包或配置原生离线打包环境。 + +## 正式 App 打包前必填 + +1. 使用海外版所属的 DCloud 账号为本应用获取独立 AppID,写入 `src/manifest.json` 的 `appid`;不得复用国内版 AppID。 +2. 确认 Android 包名 `com.baiyuelogistics.pda.overseas`,如公司已有正式命名规范,在首次正式签名前修改。 +3. 配置海外版独立 Android 签名证书;证书、密码和账号信息不得提交仓库。 +4. 复制 `.env.example` 为本机 `.env.local`,配置 Auth 与海外网关地址;环境文件不提交仓库。 +5. 在目标海外 PDA 上验证扫描广播 Action=`android.intent.action.SCANRESULT`、Extra=`value`。 + +## 当前实现边界 + +- 已复用并内置:登录壳、PDA 样式、扫码广播、声音反馈、导航、网络检测、图标及 `uni_modules`。 +- 已隔离:国内集装箱拣货、装柜证据、国内 Firstleg API、国内任务状态和国内本地草稿。 +- 当前业务页面是可运行的静态原型,明确提示“业务接口待接入”,不会模拟海外服务提交成功。 diff --git a/index.html b/index.html new file mode 100644 index 0000000..9871cc1 --- /dev/null +++ b/index.html @@ -0,0 +1,17 @@ + + + + + + 柏悦物流海外版 + + + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3d28a0c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7171 @@ +{ + "name": "baiyue-logistics-overseas-pda", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "baiyue-logistics-overseas-pda", + "version": "0.1.0", + "dependencies": { + "@dcloudio/uni-app": "3.0.0-5020420260813003", + "@dcloudio/uni-app-plus": "3.0.0-5020420260813003", + "@dcloudio/uni-components": "3.0.0-5020420260813003", + "@dcloudio/uni-h5": "3.0.0-5020420260813003", + "vue": "^3.4.21", + "vue-i18n": "^9.1.9" + }, + "devDependencies": { + "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003", + "@dcloudio/uni-stacktracey": "3.0.0-5020420260813003", + "@dcloudio/vite-plugin-uni": "3.0.0-5020420260813003", + "@vue/runtime-core": "^3.4.21", + "rollup": "4.14.3", + "sass": "^1.77.8", + "vite": "5.2.8" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", + "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", + "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-wrap-function": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", + "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", + "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", + "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", + "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", + "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", + "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", + "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", + "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", + "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", + "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", + "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", + "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", + "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", + "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", + "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", + "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", + "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/template": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", + "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", + "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", + "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", + "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", + "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", + "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", + "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", + "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", + "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", + "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", + "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", + "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", + "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", + "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.8.tgz", + "integrity": "sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", + "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", + "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", + "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", + "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", + "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", + "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", + "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", + "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", + "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", + "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", + "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", + "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.8.tgz", + "integrity": "sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", + "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", + "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", + "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.8.tgz", + "integrity": "sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", + "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", + "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", + "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", + "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", + "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", + "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", + "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz", + "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.29.7", + "@babel/plugin-syntax-import-attributes": "^7.29.7", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.29.7", + "@babel/plugin-transform-async-generator-functions": "^7.29.7", + "@babel/plugin-transform-async-to-generator": "^7.29.7", + "@babel/plugin-transform-block-scoped-functions": "^7.29.7", + "@babel/plugin-transform-block-scoping": "^7.29.7", + "@babel/plugin-transform-class-properties": "^7.29.7", + "@babel/plugin-transform-class-static-block": "^7.29.7", + "@babel/plugin-transform-classes": "^7.29.7", + "@babel/plugin-transform-computed-properties": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-dotall-regex": "^7.29.7", + "@babel/plugin-transform-duplicate-keys": "^7.29.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-dynamic-import": "^7.29.7", + "@babel/plugin-transform-explicit-resource-management": "^7.29.7", + "@babel/plugin-transform-exponentiation-operator": "^7.29.7", + "@babel/plugin-transform-export-namespace-from": "^7.29.7", + "@babel/plugin-transform-for-of": "^7.29.7", + "@babel/plugin-transform-function-name": "^7.29.7", + "@babel/plugin-transform-json-strings": "^7.29.7", + "@babel/plugin-transform-literals": "^7.29.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.29.7", + "@babel/plugin-transform-member-expression-literals": "^7.29.7", + "@babel/plugin-transform-modules-amd": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-modules-systemjs": "^7.29.7", + "@babel/plugin-transform-modules-umd": "^7.29.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-new-target": "^7.29.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7", + "@babel/plugin-transform-numeric-separator": "^7.29.7", + "@babel/plugin-transform-object-rest-spread": "^7.29.7", + "@babel/plugin-transform-object-super": "^7.29.7", + "@babel/plugin-transform-optional-catch-binding": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/plugin-transform-private-methods": "^7.29.7", + "@babel/plugin-transform-private-property-in-object": "^7.29.7", + "@babel/plugin-transform-property-literals": "^7.29.7", + "@babel/plugin-transform-regenerator": "^7.29.7", + "@babel/plugin-transform-regexp-modifiers": "^7.29.7", + "@babel/plugin-transform-reserved-words": "^7.29.7", + "@babel/plugin-transform-shorthand-properties": "^7.29.7", + "@babel/plugin-transform-spread": "^7.29.7", + "@babel/plugin-transform-sticky-regex": "^7.29.7", + "@babel/plugin-transform-template-literals": "^7.29.7", + "@babel/plugin-transform-typeof-symbol": "^7.29.7", + "@babel/plugin-transform-unicode-escapes": "^7.29.7", + "@babel/plugin-transform-unicode-property-regex": "^7.29.7", + "@babel/plugin-transform-unicode-regex": "^7.29.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.29.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.7.tgz", + "integrity": "sha512-ppj9ouYku+RX0ljtgZd+KMO5mkM2bCqg8H2PYAFWnLsHEIKIdRojqbJ2i3eVHrisuxy7nOFCmngTDdWtUCdXUQ==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.48.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@dcloudio/types": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@dcloudio/types/-/types-3.4.31.tgz", + "integrity": "sha512-YAqOfJpcAwMs4Fagv2oP+iRHSCJOJoN8JUYyoRD6gwfANhsI9QaYj4/j22FzSopfHkqjX50B7YkG/VRAyz9OnA==", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/@dcloudio/uni-app": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-app/-/uni-app-3.0.0-5020420260813003.tgz", + "integrity": "sha512-EQq23FHexCA8VrLMRgCed5LZFMF8VE23Zom9OcjkKULdcgbRMaFJ4aPAAmOB1teOV3Bi1KgneqjaAWwyVR3AQQ==", + "license": "Apache-2.0", + "dependencies": { + "@dcloudio/uni-cloud": "3.0.0-5020420260813003", + "@dcloudio/uni-components": "3.0.0-5020420260813003", + "@dcloudio/uni-console": "3.0.0-5020420260813003", + "@dcloudio/uni-i18n": "3.0.0-5020420260813003", + "@dcloudio/uni-push": "3.0.0-5020420260813003", + "@dcloudio/uni-shared": "3.0.0-5020420260813003", + "@dcloudio/uni-stat": "3.0.0-5020420260813003", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "@dcloudio/types": "3.4.31" + } + }, + "node_modules/@dcloudio/uni-app-plus": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-app-plus/-/uni-app-plus-3.0.0-5020420260813003.tgz", + "integrity": "sha512-hjwCRSxg2N5GWnAPnTW8EpFZ8tK3jP5QCWl4IKio0KQnbavIt6YzskSDeIczwuYchJeN7m40cuE4Sn+8U1SLsw==", + "license": "Apache-2.0", + "dependencies": { + "@dcloudio/uni-app-uts": "3.0.0-5020420260813003", + "@dcloudio/uni-app-vite": "3.0.0-5020420260813003", + "@dcloudio/uni-app-vue": "3.0.0-5020420260813003", + "debug": "4.3.7", + "fs-extra": "10.1.0", + "licia": "1.41.1", + "postcss-selector-parser": "6.1.2" + } + }, + "node_modules/@dcloudio/uni-app-uts": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-app-uts/-/uni-app-uts-3.0.0-5020420260813003.tgz", + "integrity": "sha512-SXomryZJiH+KCYMokIVlmaPcmjsEDGHJNEufF3TwoDsc75wrnMKTRNwy/yED6p4Jjnw+0YJfml1Ab7SoNaxTNQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/parser": "7.25.6", + "@babel/types": "7.25.6", + "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003", + "@dcloudio/uni-console": "3.0.0-5020420260813003", + "@dcloudio/uni-i18n": "3.0.0-5020420260813003", + "@dcloudio/uni-nvue-styler": "3.0.0-5020420260813003", + "@dcloudio/uni-shared": "3.0.0-5020420260813003", + "@jridgewell/gen-mapping": "^0.3.3", + "@jridgewell/trace-mapping": "^0.3.19", + "@rollup/pluginutils": "5.1.0", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/consolidate": "1.0.0", + "@vue/shared": "3.4.21", + "debug": "4.3.7", + "es-module-lexer": "1.5.4", + "estree-walker": "2.0.2", + "fast-glob": "3.3.3", + "fs-extra": "10.1.0", + "magic-string": "0.30.11", + "picocolors": "1.1.0", + "source-map-js": "1.2.1", + "unimport": "4.1.1" + } + }, + "node_modules/@dcloudio/uni-app-vite": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-app-vite/-/uni-app-vite-3.0.0-5020420260813003.tgz", + "integrity": "sha512-+R/sOmKebt4lZKDeq7/HGiLY8vgkNAhbtnJMZTylxsvDQlZP6C/PJA+pb2Cqf2DpURcQSiekFkXyY+CzoAHwAw==", + "license": "Apache-2.0", + "dependencies": { + "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003", + "@dcloudio/uni-i18n": "3.0.0-5020420260813003", + "@dcloudio/uni-nvue-styler": "3.0.0-5020420260813003", + "@dcloudio/uni-shared": "3.0.0-5020420260813003", + "@rollup/pluginutils": "5.1.0", + "@vitejs/plugin-vue": "5.2.4", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "debug": "4.3.7", + "fs-extra": "10.1.0", + "picocolors": "1.1.0" + } + }, + "node_modules/@dcloudio/uni-app-vue": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-app-vue/-/uni-app-vue-3.0.0-5020420260813003.tgz", + "integrity": "sha512-lXS1NKsTGCjAP+hfbwE4X+4ssZ7VwOs/+JPhTksdhHy/PUwEbx3unmZsgIKMFK1ffAQiVgqa47A2B9Cia4WA5w==", + "license": "Apache-2.0" + }, + "node_modules/@dcloudio/uni-cli-shared": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-cli-shared/-/uni-cli-shared-3.0.0-5020420260813003.tgz", + "integrity": "sha512-Legir++K7FjIiDiZ+aN7LrzFCaRJxYc+5VFKCzg3loECHEeWgUJ9fx3mZSamsz+6h5/VB3v6AEuefe88tNkMVg==", + "license": "Apache-2.0", + "dependencies": { + "@ampproject/remapping": "^2.1.2", + "@babel/code-frame": "7.24.7", + "@babel/core": "7.25.2", + "@babel/parser": "7.25.6", + "@babel/types": "7.25.6", + "@dcloudio/uni-i18n": "3.0.0-5020420260813003", + "@dcloudio/uni-nvue-styler": "3.0.0-5020420260813003", + "@dcloudio/uni-shared": "3.0.0-5020420260813003", + "@intlify/core-base": "9.1.9", + "@intlify/shared": "9.1.9", + "@intlify/vue-devtools": "9.1.9", + "@rollup/pluginutils": "5.1.0", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21", + "adm-zip": "0.5.16", + "autoprefixer": "10.4.20", + "base64url": "^3.0.1", + "chokidar": "3.6.0", + "compare-versions": "^3.6.0", + "debug": "4.3.7", + "entities": "^7.0.0", + "es-module-lexer": "1.5.4", + "esbuild": "0.20.2", + "estree-walker": "2.0.2", + "fast-glob": "3.3.3", + "fs-extra": "10.1.0", + "hash-sum": "2.0.0", + "isbinaryfile": "5.0.2", + "jsonc-parser": "3.3.1", + "lines-and-columns": "^2.0.4", + "magic-string": "0.30.11", + "merge": "2.1.1", + "mime": "3.0.0", + "module-alias": "2.2.3", + "os-locale-s-fix": "^1.0.8-fix-1", + "picocolors": "1.1.0", + "postcss-import": "^14.0.2", + "postcss-load-config": "^3.1.1", + "postcss-modules": "^4.3.0", + "postcss-selector-parser": "6.1.2", + "resolve": "1.22.8", + "source-map-js": "1.2.1", + "tapable": "^2.2.0", + "tinycolor2": "1.6.0", + "unimport": "4.1.1", + "unplugin-auto-import": "19.1.0", + "xregexp": "5.1.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + } + }, + "node_modules/@dcloudio/uni-cli-shared/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@dcloudio/uni-cli-shared/node_modules/unplugin-auto-import": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-19.1.0.tgz", + "integrity": "sha512-B+TGBEBHqY9aR+7YfShfLujETOHstzpV+yaqgy5PkfV0QG7Py+TYMX7vJ9W4SrysHR+UzR+gzcx/nuZjmPeclA==", + "license": "MIT", + "dependencies": { + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17", + "picomatch": "^4.0.2", + "unimport": "^4.1.1", + "unplugin": "^2.2.0", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/@dcloudio/uni-cli-shared/node_modules/unplugin-auto-import/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@dcloudio/uni-cloud": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-cloud/-/uni-cloud-3.0.0-5020420260813003.tgz", + "integrity": "sha512-h2lIn+YycLOSUBQ60xfk6tSL51F6VeiXzIF63PoYE8NbQglNwFjoWF7SBzqQQj5ZgnqMV5FnS4O1xRtpwOg1Og==", + "license": "Apache-2.0", + "dependencies": { + "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003", + "@dcloudio/uni-i18n": "3.0.0-5020420260813003", + "@dcloudio/uni-shared": "3.0.0-5020420260813003", + "@vue/shared": "3.4.21", + "fast-glob": "3.3.3" + } + }, + "node_modules/@dcloudio/uni-components": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-components/-/uni-components-3.0.0-5020420260813003.tgz", + "integrity": "sha512-Mcu0T367gZkOdrlTrGn3nl2DEL+mVHNRWlCmmDaNyklI2U5RVx5Bv/DmKN2mPQ+FBZNrzN5SRVIN85Y1cNgOpw==", + "license": "Apache-2.0", + "dependencies": { + "@dcloudio/uni-cloud": "3.0.0-5020420260813003", + "@dcloudio/uni-h5": "3.0.0-5020420260813003", + "@dcloudio/uni-i18n": "3.0.0-5020420260813003" + } + }, + "node_modules/@dcloudio/uni-console": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-console/-/uni-console-3.0.0-5020420260813003.tgz", + "integrity": "sha512-cEYqiOrIrGnQqMaSCtooupFAkFbYWirFuAv9/Fref6xI3FFeY/gm4ECExjri5Xjq3W7oMs3BNMmFNQ20Q5ucdw==", + "license": "Apache-2.0", + "dependencies": { + "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003", + "fs-extra": "10.1.0" + } + }, + "node_modules/@dcloudio/uni-h5": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-h5/-/uni-h5-3.0.0-5020420260813003.tgz", + "integrity": "sha512-CWNdB0uTdRj58k3N0uKqTNNv9gLnYK8vf81BLAk3sJe/gHqqxX1Dnu2gLLugAn0XXJOy4L2H0AfU/nZmlh7jPA==", + "license": "Apache-2.0", + "dependencies": { + "@dcloudio/uni-h5-vite": "3.0.0-5020420260813003", + "@dcloudio/uni-h5-vue": "3.0.0-5020420260813003", + "@dcloudio/uni-i18n": "3.0.0-5020420260813003", + "@dcloudio/uni-shared": "3.0.0-5020420260813003", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21", + "debug": "4.3.7", + "localstorage-polyfill": "^1.0.1", + "postcss-selector-parser": "6.1.2", + "safe-area-insets": "1.4.1", + "vue-router": "4.4.4", + "xmlhttprequest": "^1.8.0" + } + }, + "node_modules/@dcloudio/uni-h5-vite": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-h5-vite/-/uni-h5-vite-3.0.0-5020420260813003.tgz", + "integrity": "sha512-JfSUYoqLaZ0+2ikxeN0slszJZk0vROPAYKXc0iDGB0vO+j9B8ttN213swUgRv6MHvbz68tDdpvGCWSerfqbWOg==", + "license": "Apache-2.0", + "dependencies": { + "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003", + "@dcloudio/uni-shared": "3.0.0-5020420260813003", + "@rollup/pluginutils": "5.1.0", + "@vitejs/plugin-basic-ssl": "1.2.0", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21", + "debug": "4.3.7", + "fs-extra": "10.1.0", + "mime": "3.0.0", + "module-alias": "2.2.3" + } + }, + "node_modules/@dcloudio/uni-h5-vue": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-h5-vue/-/uni-h5-vue-3.0.0-5020420260813003.tgz", + "integrity": "sha512-yuf178r08Am5qCTGOHIuwJ8LpaF7Mx80TwuPDyWaTATEnY3YtevnqJxlW/3EcevRreZpq/j+SkCZEWyAUI7euA==", + "license": "Apache-2.0", + "dependencies": { + "@dcloudio/uni-shared": "3.0.0-5020420260813003", + "@vue/server-renderer": "3.4.21" + } + }, + "node_modules/@dcloudio/uni-i18n": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-i18n/-/uni-i18n-3.0.0-5020420260813003.tgz", + "integrity": "sha512-fVIdM+pj3N57rwGEVAdS1T5iXLCb4BMYcKM1cZp+9I3g80ehBdcTt8g4QO1N5JgQTNCYrrOMySjJ1j6HljVRiQ==", + "license": "Apache-2.0" + }, + "node_modules/@dcloudio/uni-nvue-styler": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-nvue-styler/-/uni-nvue-styler-3.0.0-5020420260813003.tgz", + "integrity": "sha512-J2LdLVxgmFWOloPZYObVaBUTVYd/OBSq+N90qOU1ZrIgi58+mnmR3ZeGKSR1++Cbhk+kJfVl9gIuz+8Zx3TrSA==", + "license": "Apache-2.0", + "dependencies": { + "@vue/shared": "3.4.21", + "parse-css-font": "^4.0.0", + "postcss": "8.5.6", + "tinycolor2": "1.6.0" + } + }, + "node_modules/@dcloudio/uni-nvue-styler/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/@dcloudio/uni-nvue-styler/node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/@dcloudio/uni-push": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-push/-/uni-push-3.0.0-5020420260813003.tgz", + "integrity": "sha512-uv5IzxUX1N5vrUOdMjmYarAePwabgra96JUxcCnHivNnRKJiNIxo8hHVizFbwOqL9+mvc89eeUK+eYPbhKWWug==", + "license": "Apache-2.0", + "dependencies": { + "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003" + } + }, + "node_modules/@dcloudio/uni-shared": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-shared/-/uni-shared-3.0.0-5020420260813003.tgz", + "integrity": "sha512-U/osc72UGcoSWfdxZOPs9ftITACE/yXsNFheP74fypTtudNzcudkz/o3dN6ClOESVh/VE9dZeecNpoNhY8qPfQ==", + "license": "Apache-2.0", + "dependencies": { + "@vue/shared": "3.4.21" + } + }, + "node_modules/@dcloudio/uni-stacktracey": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-stacktracey/-/uni-stacktracey-3.0.0-5020420260813003.tgz", + "integrity": "sha512-wYR5FyDvplffjKltj39KxpTdU0cE/kWHbgmo21B5UCMMsm9RvF2ARUMfld6pZ1NPlAxrqj322RovniDul+9gOw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@dcloudio/uni-stat": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/uni-stat/-/uni-stat-3.0.0-5020420260813003.tgz", + "integrity": "sha512-I4RL+sq4/R3yjWowlCXsOeGyCP4cpW10Pk0bzKk6E7dy99mi5EDqOrPbmBSdwb3uU9qjG+ATh5lFqkWBQboxCA==", + "license": "Apache-2.0", + "dependencies": { + "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003", + "@dcloudio/uni-shared": "3.0.0-5020420260813003", + "debug": "4.3.7" + } + }, + "node_modules/@dcloudio/vite-plugin-uni": { + "version": "3.0.0-5020420260813003", + "resolved": "https://registry.npmjs.org/@dcloudio/vite-plugin-uni/-/vite-plugin-uni-3.0.0-5020420260813003.tgz", + "integrity": "sha512-aJ2/Dx0GykpfWU+LeA+7Vrv5KJM+qD4eX0mb3s3yVnfUr/Btn0cGT7WWvSeA+BtUg90SoHgONmsLnLgbSLNk8w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/core": "7.25.2", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.23.3", + "@babel/types": "7.25.6", + "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003", + "@dcloudio/uni-nvue-styler": "3.0.0-5020420260813003", + "@dcloudio/uni-shared": "3.0.0-5020420260813003", + "@rollup/pluginutils": "5.1.0", + "@vitejs/plugin-legacy": "5.3.2", + "@vitejs/plugin-vue": "5.2.4", + "@vitejs/plugin-vue-jsx": "3.1.0", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/shared": "3.4.21", + "cac": "6.7.9", + "debug": "4.3.7", + "es-module-lexer": "1.5.4", + "estree-walker": "2.0.2", + "express": "4.20.0", + "fast-glob": "3.3.3", + "fs-extra": "10.1.0", + "hash-sum": "2.0.0", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.11", + "picocolors": "1.1.0", + "source-map-js": "1.2.1", + "terser": "^5.4.0", + "unplugin-auto-import": "19.1.0" + }, + "bin": { + "uni": "bin/uni.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "5.2.8" + } + }, + "node_modules/@dcloudio/vite-plugin-uni/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@dcloudio/vite-plugin-uni/node_modules/unplugin-auto-import": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-19.1.0.tgz", + "integrity": "sha512-B+TGBEBHqY9aR+7YfShfLujETOHstzpV+yaqgy5PkfV0QG7Py+TYMX7vJ9W4SrysHR+UzR+gzcx/nuZjmPeclA==", + "dev": true, + "license": "MIT", + "dependencies": { + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17", + "picomatch": "^4.0.2", + "unimport": "^4.1.1", + "unplugin": "^2.2.0", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/@dcloudio/vite-plugin-uni/node_modules/unplugin-auto-import/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@intlify/core-base": { + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.1.9.tgz", + "integrity": "sha512-x5T0p/Ja0S8hs5xs+ImKyYckVkL4CzcEXykVYYV6rcbXxJTe2o58IquSqX9bdncVKbRZP7GlBU1EcRaQEEJ+vw==", + "license": "MIT", + "dependencies": { + "@intlify/devtools-if": "9.1.9", + "@intlify/message-compiler": "9.1.9", + "@intlify/message-resolver": "9.1.9", + "@intlify/runtime": "9.1.9", + "@intlify/shared": "9.1.9", + "@intlify/vue-devtools": "9.1.9" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@intlify/devtools-if": { + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.1.9.tgz", + "integrity": "sha512-oKSMKjttG3Ut/1UGEZjSdghuP3fwA15zpDPcjkf/1FjlOIm6uIBGMNS5jXzsZy593u+P/YcnrZD6cD3IVFz9vQ==", + "license": "MIT", + "dependencies": { + "@intlify/shared": "9.1.9" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.1.9.tgz", + "integrity": "sha512-6YgCMF46Xd0IH2hMRLCssZI3gFG4aywidoWQ3QP4RGYQXQYYfFC54DxhSgfIPpVoPLQ+4AD29eoYmhiHZ+qLFQ==", + "license": "MIT", + "dependencies": { + "@intlify/message-resolver": "9.1.9", + "@intlify/shared": "9.1.9", + "source-map": "0.6.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@intlify/message-resolver": { + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@intlify/message-resolver/-/message-resolver-9.1.9.tgz", + "integrity": "sha512-Lx/DBpigeK0sz2BBbzv5mu9/dAlt98HxwbG7xLawC3O2xMF9MNWU5FtOziwYG6TDIjNq0O/3ZbOJAxwITIWXEA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@intlify/runtime": { + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@intlify/runtime/-/runtime-9.1.9.tgz", + "integrity": "sha512-XgPw8+UlHCiie3fI41HPVa/VDJb3/aSH7bLhY1hJvlvNV713PFtb4p4Jo+rlE0gAoMsMCGcsiT982fImolSltg==", + "license": "MIT", + "dependencies": { + "@intlify/message-compiler": "9.1.9", + "@intlify/message-resolver": "9.1.9", + "@intlify/shared": "9.1.9" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@intlify/shared": { + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.1.9.tgz", + "integrity": "sha512-xKGM1d0EAxdDFCWedcYXOm6V5Pfw/TMudd6/qCdEb4tv0hk9EKeg7lwQF1azE0dP2phvx0yXxrt7UQK+IZjNdw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@intlify/vue-devtools": { + "version": "9.1.9", + "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.1.9.tgz", + "integrity": "sha512-YPehH9uL4vZcGXky4Ev5qQIITnHKIvsD2GKGXgqf+05osMUI6WSEQHaN9USRa318Rs8RyyPCiDfmA0hRu3k7og==", + "license": "MIT", + "dependencies": { + "@intlify/message-resolver": "9.1.9", + "@intlify/runtime": "9.1.9", + "@intlify/shared": "9.1.9" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", + "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.6.0", + "@parcel/watcher-darwin-arm64": "2.6.0", + "@parcel/watcher-darwin-x64": "2.6.0", + "@parcel/watcher-freebsd-x64": "2.6.0", + "@parcel/watcher-linux-arm-glibc": "2.6.0", + "@parcel/watcher-linux-arm-musl": "2.6.0", + "@parcel/watcher-linux-arm64-glibc": "2.6.0", + "@parcel/watcher-linux-arm64-musl": "2.6.0", + "@parcel/watcher-linux-x64-glibc": "2.6.0", + "@parcel/watcher-linux-x64-musl": "2.6.0", + "@parcel/watcher-win32-arm64": "2.6.0", + "@parcel/watcher-win32-x64": "2.6.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", + "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", + "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", + "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", + "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", + "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", + "cpu": [ + "arm" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", + "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", + "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", + "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", + "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.3.tgz", + "integrity": "sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.3.tgz", + "integrity": "sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.3.tgz", + "integrity": "sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.3.tgz", + "integrity": "sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.3.tgz", + "integrity": "sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.14.3.tgz", + "integrity": "sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.3.tgz", + "integrity": "sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.3.tgz", + "integrity": "sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.3.tgz", + "integrity": "sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.3.tgz", + "integrity": "sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.3.tgz", + "integrity": "sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.3.tgz", + "integrity": "sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.3.tgz", + "integrity": "sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.3.tgz", + "integrity": "sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.3.tgz", + "integrity": "sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz", + "integrity": "sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", + "license": "MIT", + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/@vitejs/plugin-legacy": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-5.3.2.tgz", + "integrity": "sha512-8moCOrIMaZ/Rjln0Q6GsH6s8fAt1JOI3k8nmfX4tXUxE5KAExVctSyOBk+A25GClsdSWqIk2yaUthH3KJ2X4tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/preset-env": "^7.23.9", + "browserslist": "^4.23.0", + "browserslist-to-esbuild": "^2.1.1", + "core-js": "^3.36.0", + "magic-string": "^0.30.7", + "regenerator-runtime": "^0.14.1", + "systemjs": "^6.14.3" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "peerDependencies": { + "terser": "^5.4.0", + "vite": "^5.0.0" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.1.0.tgz", + "integrity": "sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3", + "@vue/babel-plugin-jsx": "^1.1.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-jsx/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@vue/babel-plugin-jsx/node_modules/@vue/shared": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz", + "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-core": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.41.tgz", + "integrity": "sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/shared": "3.5.41", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-dom": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.41.tgz", + "integrity": "sha512-oKacVfNglLvGjnS6BXOlGL7EyG2h8X03pqXCjzotRZUaXGjbrTJUnVAQjrCqUnS+lyu31nwQjZY/d817GmCnfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-sfc": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.41.tgz", + "integrity": "sha512-XJhip7R2wy6vX3knCxdZN4KracFaZUef58s1KYewqluedHIJaPIVfXoYT7MF1F8nCvv6k8bWWxDC8opMkg1VTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/compiler-core": "3.5.41", + "@vue/compiler-dom": "3.5.41", + "@vue/compiler-ssr": "3.5.41", + "@vue/shared": "3.5.41", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.19", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-ssr": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.41.tgz", + "integrity": "sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/shared": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz", + "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", + "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/shared": "3.4.21", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", + "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", + "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.7", + "postcss": "^8.4.35", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", + "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/consolidate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vue/consolidate/-/consolidate-1.0.0.tgz", + "integrity": "sha512-oTyUE+QHIzLw2PpV14GD/c7EohDyP64xCniWTcqcEmTd699eFqTIwOmtDYjcO1j3QgdXoJEoWv1/cCdLrRoOfg==", + "license": "MIT", + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/reactivity": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.41.tgz", + "integrity": "sha512-rznsqKM0np0x18EjzF8x88MpEhdNsffbvFbckLL5+oUKz1BxAImEmO7J1ArRYSyo6aQaVoBDp7jEkT91OOxydA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/reactivity/node_modules/@vue/shared": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz", + "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.41.tgz", + "integrity": "sha512-Vcry58hiAKwGen9Z1jUZE0feFsNArPCMOImYI8el48A9Idf6DuQYD0U05zZIF2Iad1hGhPSvcbBbAOhNr55fhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/runtime-core/node_modules/@vue/shared": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz", + "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", + "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", + "license": "MIT", + "dependencies": { + "@vue/runtime-core": "3.4.21", + "@vue/shared": "3.4.21", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/runtime-dom/node_modules/@vue/reactivity": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz", + "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/runtime-dom/node_modules/@vue/runtime-core": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz", + "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", + "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "vue": "3.4.21" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", + "license": "MIT" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.15", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.15.tgz", + "integrity": "sha512-FwMjJJ7HnyZpWe+oWxegG0fezZyBZUagI5LZEoO3GCbtbKNwRfMH9Ue5d5v01PNePBy1QSfPSDTTeVL0Hb9EzA==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/browserslist-to-esbuild": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/browserslist-to-esbuild/-/browserslist-to-esbuild-2.1.1.tgz", + "integrity": "sha512-KN+mty6C3e9AN8Z5dI1xeN15ExcRNeISoC3g7V0Kax/MMF9MSoYA2G7lkTTcVUFntiEjkpI0HNgqJC1NjdyNUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "meow": "^13.0.0" + }, + "bin": { + "browserslist-to-esbuild": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "browserslist": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.9", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.9.tgz", + "integrity": "sha512-XN5qEpfNQCJ8jRaZgitSkkukjMRCGio+X3Ks5KUbGGlPbV+pSem1l9VuzooCBXOiMFshUZgyYqg6rgN8rjkb/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.50.0.tgz", + "integrity": "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.50.0.tgz", + "integrity": "sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.7" + }, + "engines": { + "node": ">=6.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.50.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.50.0.tgz", + "integrity": "sha512-6GP3Pxz4IKyWjAfa747vIu/jilB5z29JWROLqH/b+pXVcpgh6tM06ZIBwSuglgVqzDYURhOK6oEzTrG0bCHitA==", + "hasInstallScript": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/css-font-size-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz", + "integrity": "sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==", + "license": "MIT" + }, + "node_modules/css-font-stretch-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz", + "integrity": "sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==", + "license": "MIT" + }, + "node_modules/css-font-style-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz", + "integrity": "sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==", + "license": "MIT" + }, + "node_modules/css-font-weight-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz", + "integrity": "sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==", + "license": "MIT" + }, + "node_modules/css-list-helpers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-list-helpers/-/css-list-helpers-2.0.0.tgz", + "integrity": "sha512-9Bj8tZ0jWbAM3u/U6m/boAzAwLPwtjzFvwivr2piSvyVa3K3rChJzQy4RIHkNkKiZCHrEMWDJWtTR8UyVhdDnQ==", + "license": "MIT" + }, + "node_modules/css-system-font-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz", + "integrity": "sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==", + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.411", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.411.tgz", + "integrity": "sha512-gglkxzokjHfawpGxq75XdBV2/l3BAPzrsMs70qgaZdTW5rpV1tC4MdgJVP9fN126bODA4ZJQkn1wryEzJyQXIg==", + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.20.0.tgz", + "integrity": "sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz", + "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-names": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", + "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", + "license": "MIT", + "dependencies": { + "loader-utils": "^3.2.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "license": "MIT" + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", + "license": "ISC" + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/immutable": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/invert-kv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz", + "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sindresorhus/invert-kv?sponsor=1" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isbinaryfile": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz", + "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lcid": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz", + "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==", + "license": "MIT", + "dependencies": { + "invert-kv": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/licia": { + "version": "1.41.1", + "resolved": "https://registry.npmjs.org/licia/-/licia-1.41.1.tgz", + "integrity": "sha512-XqObV8u1KEMdYWaNK0leRrTwhzKnLQEkhbnuUu7qGNH3zJoN7l9sfvF6PfHstSCuUOmpEP+0SBjRrk0I9uZs8g==", + "license": "MIT" + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/local-pkg": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", + "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/local-pkg/node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "license": "MIT" + }, + "node_modules/local-pkg/node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, + "node_modules/localstorage-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/localstorage-polyfill/-/localstorage-polyfill-1.0.1.tgz", + "integrity": "sha512-m4iHVZxFH5734oQcPKU08025gIz2+4bjWR9lulP8ZYxEJR0BpA0w32oJmkzh8y3UI9ci7xCBehQDc3oA1X+VHw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", + "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", + "license": "MIT" + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/module-alias": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.3.tgz", + "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT", + "optional": true + }, + "node_modules/node-releases": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/os-locale-s-fix": { + "version": "1.0.8-fix-1", + "resolved": "https://registry.npmjs.org/os-locale-s-fix/-/os-locale-s-fix-1.0.8-fix-1.tgz", + "integrity": "sha512-Sv0OvhPiMutICiwORAUefv02DCPb62IelBmo8ZsSrRHyI3FStqIWZvjqDkvtjU+lcujo7UNir+dCwKSqlEQ/5w==", + "license": "MIT", + "dependencies": { + "lcid": "^3.0.0" + }, + "engines": { + "node": ">=10", + "yarn": "^1.22.4" + } + }, + "node_modules/parse-css-font": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-css-font/-/parse-css-font-4.0.0.tgz", + "integrity": "sha512-lnY7dTUfjRXsSo5G5C639L8RaBBaVSgL+5hacIFKsNHzeCJQ5SFSZv1DZmc7+wZv/22PFGOq2YbaEHLdaCS/mQ==", + "license": "MIT", + "dependencies": { + "css-font-size-keywords": "^1.0.0", + "css-font-stretch-keywords": "^1.0.1", + "css-font-style-keywords": "^1.0.1", + "css-font-weight-keywords": "^1.0.0", + "css-list-helpers": "^2.0.0", + "css-system-font-keywords": "^1.0.0", + "unquote": "^1.1.1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "license": "MIT", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-modules": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", + "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", + "license": "MIT", + "dependencies": { + "generic-names": "^4.0.0", + "icss-replace-symbols": "^1.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.1" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", + "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", + "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/postcss/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.2.tgz", + "integrity": "sha512-/peqiBB/n07gQGLsWaHho3WfvUyRscw0gYTsEFMhrIe/nWLkYaf5SbKYjGYqtRV3aPwykJgF2VEMo1ac4bnsGA==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz", + "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.3.tgz", + "integrity": "sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.14.3", + "@rollup/rollup-android-arm64": "4.14.3", + "@rollup/rollup-darwin-arm64": "4.14.3", + "@rollup/rollup-darwin-x64": "4.14.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.14.3", + "@rollup/rollup-linux-arm-musleabihf": "4.14.3", + "@rollup/rollup-linux-arm64-gnu": "4.14.3", + "@rollup/rollup-linux-arm64-musl": "4.14.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.14.3", + "@rollup/rollup-linux-riscv64-gnu": "4.14.3", + "@rollup/rollup-linux-s390x-gnu": "4.14.3", + "@rollup/rollup-linux-x64-gnu": "4.14.3", + "@rollup/rollup-linux-x64-musl": "4.14.3", + "@rollup/rollup-win32-arm64-msvc": "4.14.3", + "@rollup/rollup-win32-ia32-msvc": "4.14.3", + "@rollup/rollup-win32-x64-msvc": "4.14.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-area-insets": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/safe-area-insets/-/safe-area-insets-1.4.1.tgz", + "integrity": "sha512-r/nRWTjFGhhm3w1Z6Kd/jY11srN+lHt2mNl1E/emQGW8ic7n3Avu4noibklfSM+Y34peNphHD/BSZecav0sXYQ==", + "license": "ISC" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.103.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.103.0.tgz", + "integrity": "sha512-+QpdXUDw19lVqRDlYIyje1Lq/0gHsnNHIl4x1CqeUg13zRhaQN11UvTvouwHWLXc9Q3rQVT6oBhFGRYJ5Z8gHw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=20.19.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/serve-static": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.0.tgz", + "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-static/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/serve-static/node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "license": "CC0-1.0" + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/systemjs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.15.1.tgz", + "integrity": "sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.50.0.tgz", + "integrity": "sha512-CN9BVxWhgS/hRxtUMjtC2uRWSTcSfQFHMDWma6sKKfIivCD91sM+FOPfvwoaRMqCSrUpe1nv3jDamd9eEQ4y+w==", + "devOptional": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unimport": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-4.1.1.tgz", + "integrity": "sha512-j9+fijH6aDd05yv1fXlyt7HSxtOWtGtrZeYTVBsSUg57Iuf+Ps2itIZjeyu7bEQ4k0WOgYhHrdW8m/pJgOpl5g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "fast-glob": "^3.3.3", + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "pathe": "^2.0.2", + "picomatch": "^4.0.2", + "pkg-types": "^1.3.1", + "scule": "^1.3.0", + "strip-literal": "^3.0.0", + "unplugin": "^2.1.2", + "unplugin-utils": "^0.2.3" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unimport/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unimport/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/unimport/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-utils": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.5.tgz", + "integrity": "sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-utils/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-browserslist-db/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz", + "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", + "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/runtime-dom": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-i18n": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.5.tgz", + "integrity": "sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g==", + "deprecated": "v9 and v10 no longer supported. please migrate to v11. about maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html", + "license": "MIT", + "dependencies": { + "@intlify/core-base": "9.14.5", + "@intlify/shared": "9.14.5", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-i18n/node_modules/@intlify/core-base": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.5.tgz", + "integrity": "sha512-5ah5FqZG4pOoHjkvs8mjtv+gPKYU0zCISaYNjBNNqYiaITxW8ZtVih3GS/oTOqN8d9/mDLyrjD46GBApNxmlsA==", + "license": "MIT", + "dependencies": { + "@intlify/message-compiler": "9.14.5", + "@intlify/shared": "9.14.5" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/vue-i18n/node_modules/@intlify/message-compiler": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.5.tgz", + "integrity": "sha512-IHzgEu61/YIpQV5Pc3aRWScDcnFKWvQA9kigcINcCBXN8mbW+vk9SK+lDxA6STzKQsVJxUPg9ACC52pKKo3SVQ==", + "license": "MIT", + "dependencies": { + "@intlify/shared": "9.14.5", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/vue-i18n/node_modules/@intlify/shared": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.5.tgz", + "integrity": "sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/vue-router": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.4.tgz", + "integrity": "sha512-3MlnDqwRwZwCQVbtVfpsU+nrNymNjnXSsQtXName5925NVC1+326VVfYH9vSrA0N13teGEo8z5x7gbRnGjCDiQ==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "license": "MIT" + }, + "node_modules/xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xregexp": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-5.1.2.tgz", + "integrity": "sha512-6hGgEMCGhqCTFEJbqmWrNIPqfpdirdGWkqshu7fFZddmTSfgv5Sn9D2SaKloR79s5VUiUlpwzg3CM3G6D3VIlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.9" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ea25b7d --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "baiyue-logistics-overseas-pda", + "version": "0.1.0", + "private": true, + "scripts": { + "dev:h5": "uni", + "build:h5": "uni build", + "build:app": "uni build -p app", + "test": "node --test tests/*.test.mjs" + }, + "dependencies": { + "@dcloudio/uni-app": "3.0.0-5020420260813003", + "@dcloudio/uni-app-plus": "3.0.0-5020420260813003", + "@dcloudio/uni-components": "3.0.0-5020420260813003", + "@dcloudio/uni-h5": "3.0.0-5020420260813003", + "vue": "^3.4.21", + "vue-i18n": "^9.1.9" + }, + "devDependencies": { + "@dcloudio/uni-cli-shared": "3.0.0-5020420260813003", + "@dcloudio/uni-stacktracey": "3.0.0-5020420260813003", + "@dcloudio/vite-plugin-uni": "3.0.0-5020420260813003", + "@vue/runtime-core": "^3.4.21", + "rollup": "4.14.3", + "sass": "^1.77.8", + "vite": "5.2.8" + } +} diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..bee3444 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,18 @@ + + + + diff --git a/src/api/auth.js b/src/api/auth.js new file mode 100644 index 0000000..4ed5cb5 --- /dev/null +++ b/src/api/auth.js @@ -0,0 +1,36 @@ +import { API_ROOT } from '@/config/runtime.js' + +function authRequest(path, data) { + return new Promise((resolve, reject) => { + uni.request({ + url: `${API_ROOT}${path}`, + method: 'POST', + data, + success(response) { + const body = response.data || {} + if (String(body.code ?? response.statusCode) !== '200') { + const error = new Error(body.message || '认证服务请求失败') + error.code = body.code || response.statusCode + error.requestId = body.requestId || response.header?.['X-Request-Id'] || response.header?.['x-request-id'] + error.traceId = body.traceId || response.header?.['X-Trace-Id'] || response.header?.['x-trace-id'] + reject(error) + return + } + resolve(body.data) + }, + fail(error) { + const next = new Error(error.errMsg || '网络连接失败') + next.network = true + reject(next) + } + }) + }) +} + +export function login(username, password) { + return authRequest('/auth/login', { username, password }) +} + +export function refresh(refreshToken) { + return authRequest('/auth/refresh', { refreshToken }) +} diff --git a/src/components/PopupHeader.vue b/src/components/PopupHeader.vue new file mode 100644 index 0000000..54ec435 --- /dev/null +++ b/src/components/PopupHeader.vue @@ -0,0 +1,28 @@ + + + + + diff --git a/src/components/PortalHeader.vue b/src/components/PortalHeader.vue new file mode 100644 index 0000000..52b5cc8 --- /dev/null +++ b/src/components/PortalHeader.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/components/ScanTargetInput.vue b/src/components/ScanTargetInput.vue new file mode 100644 index 0000000..b526121 --- /dev/null +++ b/src/components/ScanTargetInput.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/src/config/runtime.js b/src/config/runtime.js new file mode 100644 index 0000000..d248e36 --- /dev/null +++ b/src/config/runtime.js @@ -0,0 +1,5 @@ +const configuredAuthApiRoot = import.meta.env.VITE_AUTH_API_BASE_URL || '' +const configuredOverseasApiRoot = import.meta.env.VITE_OVERSEAS_API_BASE_URL || '' + +export const API_ROOT = String(configuredAuthApiRoot || '/api').replace(/\/$/, '') +export const OVERSEAS_API_ROOT = String(configuredOverseasApiRoot || '/api/overseas').replace(/\/$/, '') diff --git a/src/data/overseas-workbench.js b/src/data/overseas-workbench.js new file mode 100644 index 0000000..4e6ef05 --- /dev/null +++ b/src/data/overseas-workbench.js @@ -0,0 +1,53 @@ +export const MODULES = [ + { key: 'inbound', name: '入仓作业', icon: '入', description: '到仓、卸柜收货与上架', operations: [ + { name: '到仓登记', icon: '到', iconType: 'download', description: '扫描入仓计划并登记车辆到仓', available: true, badge: '原型' }, + { name: '卸柜收货', icon: '卸', iconType: 'paperplane', description: '按箱或托盘确认卸柜实收', available: true, badge: '原型' }, + { name: '入仓上架', icon: '上', iconType: 'upload', description: '扫描容器与目标库位完成上架', available: true, badge: '原型' } + ] }, + { key: 'inventory', name: '库内作业', icon: '库', description: '盘点、移库与托盘管理', operations: [ + { name: '库存盘点', icon: '盘', iconType: 'list', description: '按任务扫描库位和库存', available: true, badge: '原型' }, + { name: '商品移库', icon: '移', iconType: 'loop', description: '扫描来源与目标库位完成移库', available: true, badge: '原型' }, + { name: '托盘管理', icon: '托', iconType: 'grid', description: '组托、拆托及托盘状态核对', available: true, badge: '原型' } + ] }, + { key: 'relabel', name: '换标作业', icon: '换', description: '换标收货、执行与复核', operations: [ + { name: '换标收货', icon: '收', iconType: 'download', description: '扫描换标单并确认待处理库存', available: true, badge: '原型' }, + { name: '换标执行', icon: '换', iconType: 'compose', description: '扫描旧标和新标记录换标结果', available: true, badge: '原型' }, + { name: '换标复核', icon: '核', iconType: 'checkbox', description: '复核标签和商品关联关系', available: true, badge: '原型' } + ] }, + { key: 'query', name: '现场查询', icon: '查', description: '库存、库位与托盘查询', operations: [ + { name: '库存查询', icon: '存', iconType: 'search', description: '扫描商品或箱码查询可用库存', available: true, badge: '原型' }, + { name: '库位查询', icon: '位', iconType: 'location', description: '扫描库位查看容量和在库明细', available: true, badge: '原型' }, + { name: '托盘查询', icon: '托', iconType: 'flag', description: '扫描托盘码查看绑定库存', available: true, badge: '原型' } + ] } +] + +const PROTOTYPES = { + '到仓登记': { subtitle: '核对入仓计划与车辆到仓信息', scanLabel: '入仓计划 / 柜号', scanPlaceholder: '扫描入仓计划号或柜号', prefix: 'INB', titles: ['海外仓入仓计划', '合作仓到仓任务'], meta: '等待到仓', location: '收货月台 R-01', quantity: '12 托 · 86 箱', action: '开始登记' }, + '卸柜收货': { subtitle: '按箱或托盘确认卸柜实收', scanLabel: '箱码 / 托盘码', scanPlaceholder: '扫描箱码或托盘码', prefix: 'RCV', titles: ['海运柜卸柜收货', '转运车辆卸货'], meta: '卸柜中', location: '卸货区 U-02', quantity: '待收 68 箱', action: '继续收货' }, + '入仓上架': { subtitle: '将已收货库存上架到指定库位', scanLabel: '容器码 / 库位码', scanPlaceholder: '扫描容器或目标库位', prefix: 'PUT', titles: ['到仓库存上架', '待上架托盘任务'], meta: '待上架', location: 'S-01 → A-03-12', quantity: '8 托 · 42 箱', action: '开始上架' }, + '库存盘点': { subtitle: '按盘点任务扫描库位和库存', scanLabel: '盘点单 / 库位码', scanPlaceholder: '扫描盘点单或库位码', prefix: 'CC', titles: ['A 区循环盘点', '异常库位复盘'], meta: '动态盘点', location: '库区 A-03', quantity: '24 库位', action: '开始盘点' }, + '商品移库': { subtitle: '从来源库位移动到目标库位', scanLabel: '移库单 / 库位码', scanPlaceholder: '扫描移库单或来源库位', prefix: 'MV', titles: ['库位容量优化', '换标区库存移库'], meta: '待执行', location: 'A-05 → B-01', quantity: '6 托 · 28 箱', action: '开始移库' }, + '托盘管理': { subtitle: '核对托盘状态并执行组托或拆托', scanLabel: '托盘码', scanPlaceholder: '扫描托盘码', prefix: 'PLT', titles: ['到仓库存组托', '异常托盘拆托'], meta: '托盘作业', location: '托盘区 P-02', quantity: '6 个托盘', action: '开始处理' }, + '换标收货': { subtitle: '确认换标单与待处理库存', scanLabel: '换标单 / 箱码', scanPlaceholder: '扫描换标单号或箱码', prefix: 'RL-R', titles: ['FBA 换标收货', '退货库存换标收货'], meta: '待收货', location: '换标区 L-01', quantity: '36 箱', action: '开始收货' }, + '换标执行': { subtitle: '扫描旧标与新标记录换标结果', scanLabel: '旧标 / 新标', scanPlaceholder: '扫描商品标签', prefix: 'RL-W', titles: ['FBA 标签更换', '商品条码更正'], meta: '换标中', location: '换标台 L-03', quantity: '待换 120 件', action: '继续换标' }, + '换标复核': { subtitle: '复核标签与商品关联关系', scanLabel: '换标单 / 新标', scanPlaceholder: '扫描换标单或新标签', prefix: 'RL-C', titles: ['换标结果复核', '异常标签复核'], meta: '待复核', location: '复核台 L-04', quantity: '待核 42 件', action: '开始复核' }, + '库存查询': { subtitle: '查询商品、箱和托盘的库存状态', scanLabel: '商品码 / 箱码', scanPlaceholder: '扫描商品或箱码', prefix: 'SKU', titles: ['商品库存查询', '箱库存查询'], meta: '可用库存', location: 'A-03-12', quantity: '可用 1,280 件', action: '查看详情' }, + '库位查询': { subtitle: '查看库位容量、状态与在库明细', scanLabel: '库位码', scanPlaceholder: '扫描库位编码', prefix: 'LOC', titles: ['标准货架位', '托盘库位'], meta: '库位正常', location: 'A 区 03 通道', quantity: '占用 72%', action: '查看详情' }, + '托盘查询': { subtitle: '查看托盘状态与绑定库存', scanLabel: '托盘码', scanPlaceholder: '扫描托盘码', prefix: 'PLT', titles: ['在库托盘', '待处理托盘'], meta: '托盘正常', location: 'B-02-08', quantity: '绑定 12 箱', action: '查看详情' } +} + +export function getOperationPrototype(name) { + const prototype = PROTOTYPES[name] || PROTOTYPES['库存查询'] + return { + ...prototype, + metrics: [ + { label: '待处理', value: 6, tone: 'metric-primary' }, + { label: '进行中', value: 2, tone: 'metric-warning' }, + { label: '今日完成', value: 18, tone: 'metric-success' } + ], + tasks: [ + { code: `${prototype.prefix}-260820-001`, title: prototype.titles[0], meta: prototype.meta, location: prototype.location, quantity: prototype.quantity, action: prototype.action, status: '待处理', tone: 'status-pending' }, + { code: `${prototype.prefix}-260820-002`, title: prototype.titles[1], meta: prototype.meta, location: prototype.location, quantity: prototype.quantity, action: '继续处理', status: '进行中', tone: 'status-progress' } + ] + } +} diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..18e1d8f --- /dev/null +++ b/src/main.js @@ -0,0 +1,10 @@ +import { createSSRApp } from 'vue' +import App from './App.vue' + +export function createApp() { + const app = createSSRApp(App) + + return { + app + } +} diff --git a/src/manifest.json b/src/manifest.json new file mode 100644 index 0000000..3487754 --- /dev/null +++ b/src/manifest.json @@ -0,0 +1,49 @@ +{ + "name": "柏悦物流海外版", + "appid": "", + "description": "柏悦物流海外仓 PDA 作业端", + "versionName": "0.1.0", + "versionCode": "10", + "transformPx": false, + "app-plus": { + "usingComponents": true, + "nvueCompiler": "uni-app", + "nvueStyleCompiler": "uni-app", + "compilerVersion": 3, + "splashscreen": { + "alwaysShowBeforeRender": true, + "waiting": true, + "autoclose": true, + "delay": 0 + }, + "modules": {}, + "distribute": { + "android": { + "packagename": "com.baiyuelogistics.pda.overseas", + "permissions": [], + "abiFilters": ["armeabi-v7a", "arm64-v8a"] + }, + "ios": {}, + "sdkConfigs": {}, + "icons": { + "android": { + "hdpi": "static/app-icons/72x72.png", + "xhdpi": "static/app-icons/96x96.png", + "xxhdpi": "static/app-icons/144x144.png", + "xxxhdpi": "static/app-icons/192x192.png" + }, + "ios": { + "appstore": "static/app-icons/1024x1024.png" + } + } + } + }, + "quickapp": {}, + "mp-weixin": { + "appid": "", + "setting": { "urlCheck": false }, + "usingComponents": true + }, + "uniStatistics": { "enable": false }, + "vueVersion": "3" +} diff --git a/src/pages.json b/src/pages.json new file mode 100644 index 0000000..f9e33e7 --- /dev/null +++ b/src/pages.json @@ -0,0 +1,18 @@ +{ + "pages": [ + { "path": "pages/login/login", "style": { "navigationStyle": "custom", "navigationBarTitleText": "柏悦物流海外版", "backgroundColor": "#F5F7FA" } }, + { "path": "pages/home/home", "style": { "navigationStyle": "custom", "navigationBarTitleText": "海外仓工作台", "backgroundColor": "#F5F7FA" } }, + { "path": "pages/module/module", "style": { "navigationStyle": "custom", "navigationBarTitleText": "海外仓业务", "backgroundColor": "#F5F7FA" } }, + { "path": "pages/operation/operation", "style": { "navigationStyle": "custom", "navigationBarTitleText": "现场作业", "backgroundColor": "#F5F7FA" } }, + { "path": "pages/history/history", "style": { "navigationStyle": "custom", "navigationBarTitleText": "作业记录", "backgroundColor": "#F5F7FA" } }, + { "path": "pages/profile/profile", "style": { "navigationStyle": "custom", "navigationBarTitleText": "个人中心", "backgroundColor": "#F5F7FA" } }, + { "path": "pages/scanner-test/scanner-test", "style": { "navigationStyle": "custom", "navigationBarTitleText": "广播扫码测试", "backgroundColor": "#F5F7FA" } } + ], + "globalStyle": { + "navigationBarTextStyle": "white", + "navigationBarTitleText": "柏悦物流海外版", + "navigationBarBackgroundColor": "#1A73E8", + "backgroundColor": "#F5F7FA", + "app-plus": { "background": "#F5F7FA" } + } +} diff --git a/src/pages/history/history.vue b/src/pages/history/history.vue new file mode 100644 index 0000000..668484e --- /dev/null +++ b/src/pages/history/history.vue @@ -0,0 +1,7 @@ + + diff --git a/src/pages/home/home.vue b/src/pages/home/home.vue new file mode 100644 index 0000000..e6c5d52 --- /dev/null +++ b/src/pages/home/home.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/pages/login/login.vue b/src/pages/login/login.vue new file mode 100644 index 0000000..4a8107d --- /dev/null +++ b/src/pages/login/login.vue @@ -0,0 +1,43 @@ + + + diff --git a/src/pages/module/module.vue b/src/pages/module/module.vue new file mode 100644 index 0000000..ccdba48 --- /dev/null +++ b/src/pages/module/module.vue @@ -0,0 +1,27 @@ + + + diff --git a/src/pages/operation/operation.vue b/src/pages/operation/operation.vue new file mode 100644 index 0000000..592f72a --- /dev/null +++ b/src/pages/operation/operation.vue @@ -0,0 +1,39 @@ + + + diff --git a/src/pages/profile/profile.vue b/src/pages/profile/profile.vue new file mode 100644 index 0000000..c08d2f5 --- /dev/null +++ b/src/pages/profile/profile.vue @@ -0,0 +1,7 @@ + + diff --git a/src/pages/scanner-test/scanner-test.vue b/src/pages/scanner-test/scanner-test.vue new file mode 100644 index 0000000..859e680 --- /dev/null +++ b/src/pages/scanner-test/scanner-test.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/src/static/app-icons/1024x1024.png b/src/static/app-icons/1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..625cf881a885c5bd2d5b296e6c442c0c43fd0757 GIT binary patch literal 89408 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 z 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

VH5wuzKU%07X#SBzT+KLt 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 JQL=vj{{SL<2F?Hg literal 0 HcmV?d00001 diff --git a/src/static/app-icons/152x152.png b/src/static/app-icons/152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..56c10e3f21072515bae01408c5d403b6b96de676 GIT binary patch literal 7775 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 O;j^?7q*}@_@c#i1oBlfh literal 0 HcmV?d00001 diff --git a/src/static/app-icons/167x167.png b/src/static/app-icons/167x167.png new file mode 100644 index 0000000000000000000000000000000000000000..5b4d55ee85a9f85a9318d23887c02031b99daa77 GIT binary patch literal 8503 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 z zuzorRehoshYk2Jr&{hB3^LC`}j1v5X$2>)TI5@dKDxK;F^Hyr|4H`+;Q>!>h@;&~o z3{Jgaehm{ysw3b!_WfSCw?A_p*ef=UuC9-u*XE5pahRcz4yXTRxO<`}5$3UEj~XU2 z7-)Xs;9#vOtEl2X`Nw!1oP;ufEJA<*&Pt0~w^DGQCVrS=m1B3?%8a8Ib`t<9=3)Xq zy)kl`L38H}qZerm7@xlqGQHBua3kcG-qrKvt|6VNpL-?}B p4<{~Zl*?}Ht`_{{tyY#RC8U literal 0 HcmV?d00001 diff --git a/src/static/app-icons/180x180.png b/src/static/app-icons/180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..4ef66a5fbabcf8727a791e989b4f81af5b03bacd GIT binary patch literal 9136 zcma)CMN}NXvPCmkaF-A?xXa+~8rVf{?Y=WG*^ zHc!!K_V;=Kd&ZgpBv|CJZa-5v`5?bQ}pl&C!pG5)&GOPw|8dyRQaWtnH*6&=%o!g&TnqDDjZY z^eW8c6_BLK6+qW^E6iCz4YHtD* zyB=}OSqpKqbY9T)*C3c$78dS0l_(oQ@$lU${9#sRa3J7)c6jZbnHU0WR&oxNQZlfg1e&?4I*t_pyqCqhEdMg*u2X8DGiOG40 zDdk?=;p+4_T^(OUmGmAxYFK}F^_J6i26p`=Hj0L!1ny#bV76J}dvnYW?pLqN9x5Px zgO11V{V+9f&_o=Gj9wihMtoct4aXq1xsI`!?APuRA!g6L7#Q}qs080>U)beQ{&NyK zX=RY+s-YIWQMjnc#%yuXrIbraLaSJ--`f(#oAJu`fT69^@-&;ANe zmrvAp9yx(qhK;Moxf31^CF&yWVpF?W?ALMNjxx^I`uo!*9ss~LYkaI*_|xUax^WNi z6A=j;P!V~uvplC_pfBGT=lYn9%LtT~>4PmF1pBr>UUji-i+5+xvBB^zO?vRTKb^bg zH>fm#55CpfGtG(SKSpUJiIn~>K?9Z>_XghC`CLAh7|I4zEeuHIA7@`#SW!O} zI(3OSaQ?`ks=L9t&!f78PXGu~EXcO$)dYTzwn4uvdMI43br56)=mz*!k)z3l_HeOE zrIwhPF)Z_gm8>Sf3P{QbmMDmQi@wyKfQmA~NqlAXXmHpuDc26f*XNHhJ~qbk+XbAH zUZ*h{EvusBPrsJ3kujxtSRO7aZI{#42kB9S~yk^J(JdHr)5Wdbvv` zSoG2$hSI|Vjb)F-SzsDG1937(r+Qn1M*0#9zo#`J-NVdzf)N^kTyhFY`Z!jq_oL%F%z z+32QtBAwOt_KS9OvL95Y_AKV3RQ(Dd288@5extwgs!2x6S>kYmlfl&70+woW4yR|m z{I^L?&T5$S)yfj6y*v<474*bML~Gk(B-M#-^#>k<#k(C8N!ws7Kxmo-)P*eA+cD7m z#gMYiVvj->nrBSZM8(ytdh=&0^{0{g{_mdx4(l>2TV`OSBY4PFR z39kSPsMAS+xoszn4hMm+*N1a^J!K*$6zrk+D8iHtb-ZaGA0n5BxjFW(kc017tOVg| z>Z&@08_99uqHb&Yo0?=fO&)!zl?(IPzV60%uKYK!vr$sqK*75w9wc>XMVuadvYvX{ z2T$6`u1Bq>mX?00d}EULe$14Vf6Bk=C}989*OWTXl1j9U`-rmG`S7RZb;$J8&ks6j zrs&VJcV!n0PR#-e8UhM(n4qwh#Fa}|GRl{H=DoiFX7Ybe1lgAK)P@b(ogmIPu!NHz zsfjdq?PnhQ`*>Nie1XSGddDl|tz0&1uT-&=-0~{^*tfoTy&Rx38x>S>xuk}-A%L$P zEi6$>Y-#a1M<~R@^hE4!<>HC8{>)rzK61U1DpZ4Z_Ijm^pH3#iLeuaz@o7EqGNk&_ z?7<^bBA@6?>=+IpCX8tdf4F`;%kNrg4i1@4#=gF^3uSg6*G}VO zNMbY8EY}X94K9Bk7?@r}8p`|^hY0p-BRAEFiA+fK_+u967q(|nAfDXxmm$-`z@7B7 z31>z~+d54kiaR-uRa)ea=dN%qX*B#4x^%ku%6+}6UlDb0a<~c;9{jiO`~QcphoumaP3H1 z!Nl&E@VEy-ab)-%9xj;sc^k`rpz1NX2K6J|#<@!7aCGW}$mzuz4tIu*kU_KsNnF`` zgulpFM_?+3-4hKI288bD)00uL>%e6q7h}QKjZ}V?J}pd4D%3J?lo>EB#V+w*cCOvr@v~Wk!Zq!yZxs?@zBmM# znoeIH3gb==BA^F+M3lqhpP}wc)lkfryGI(Yo+W}LKz?pzf@jq6%xq_$a!D&a6MexW zDVDE5;mton)UuUFL>M0Ggk=`)`;1y)}h@5=h_jTW_45RIuo)3)G|$mSV3arVsFOh*L3UQqhvF zoYQSxnt`yYbN!pHbo4*ywmP%gu{m{bNO%FRjwLi;gA84#U0k@(`5(shRTpvAUqeD( zhUdTA`MFC8Z_JMR=8nZv>`YANL zTv;h61LHy3Qoc$LTcnn;&fnhH)J`Uev0OqzG@hWh9J}U_Q91iCEK)s663T0@9ZNa`?TB2?dA(Q zjgpP-tXz;>k{g(irw0`ni_N0ovs<WBVv(a)kcGD|e}h#KCg2RMU0L2KJLxSIL-0 zDQ9riSmW^OC6#=>lu1z{l3{a7tkJ_RM-5O)iaq_HC|@xi%ZOBGkI?%W+Kl#Wj0K^9IYo)+~cJFigM^NcQ~g~aU` zG5_84X>u$mC6w+Xw$n4BMZII=q=f>-fx{hBOm zaLyTl87k6|zbe{}3N!t|LUm?pEO`^T@M4s<%|G1Bpp8*RTD9vzSE=24Cj39>LDIi_ zy_o{z*q;}eJv`1YQD+k^`&b&Ppl}1(c*-InuV{db+a9AZq zZ`*fRCuOAF1s1fG7mn7Y{g!mb3sd7ZT2S-RWyxih2Z-f{$K^U$sQMWwefAPJS}>B5 zCe42hBnLcRrGg*QP{iZ@1W%M*#Zhm0O>|U>qhq6PF+~ z{KyDo%h`;uS9#)@zQDQtiEO zs}Rs2de7hy?_kM+n`bUna$*$J}^96O#QC9GzmGneO;}KUJAKn9aP974r!_wyHPV zk|YH^ahp1V`y{DM?D_O-$WnUDJKiySE^G)#db3N&e8PYS^(g8)kOEKpPh{Ijqld#K zYXWjZ!6>oE)rsYf1UqqHB8D`B9*+={Xuvjt`%#Qr78(>8pgjCBi5i>SbanQv9_DUcGKc(HAFC zklN?K^_nwDo}X&urgT!uduUiIZTBmU4ou)|tzXs{kUB?>o10I!V(l%NSwAuD=OXLz z(I8RNgG8?2r;9t5ia>|~XCc#hI;9-T*yAC(^SXa~HLFY1iy(puITuf2eVSXJUtxf& znBf$@x(+rbM2-MM0GOJs3yT=dt`Wl-!me6g4S{X5vcps!It{$U8~-BR@*(vVHhJkc zz7;}^X?fszkmo$XxuUjNBiR%$xab^0E+42|CBB77MQLulF4Zmo}$E3Vm(!7`B8}swYZX!&~$IjJN^k9Y>UZrA$YFL)8IzX(+ z&f9ph=Jy|x$_t&aIu4BE`C6YK*ka3svwf{xCFbF`K@SI*KQF(piym*lR>{%`@=%rs zIvL@y5aqMw&|m~3M27a@v$Q+z!}W;Ek1Q*LX)ON|9HBgk4d8f9Qq~w5)ak$vG*S2! zpqX%${6-sd1eU3gvpjXXB2znk8XSV|$Jn|+;LB>kGBOh%Vm`U6Rl^=f;`4+A-G>(r z!(|=<(0vE)=C5g|_vX)lW%N$an++1rG?A}3k(^Bdx~IQKhD;891C3#?UEwvc$)+^n z3K24G76&+gTcmgH;_^GW>RjH2bzKcTXXreXZuE)B@e0-5vWQ7S`I`Da1RYK`8d|LO zWk6|E<4*rF>g}j#bFkz(s1p5jtm-T+#g~aNFjQW9UCr}3BY&P3%6JNDZ=`ycM>s;L zIjx<5=2p!0g*P`Kq@^XmS&3S^AXIljq;Uj;I^1%tIIvewxUaR7vC~S&YzlltS#59p zrbEBsx7<}sH&RJ;@Obz3x3!t|rmq8HxT1CXQPlk%0j(Xxc`KGNOZy|-sS9QB(arZV z{@d2;9n?t}&J>(77Yk5Ih9iwHw_+gE#qqVr+QWfbCh>3E?AB7qYE>wuTc;M1xE9`J z=TuI>`uy7cqF9wtb5k#4ATgnSoaes028C;ZH7Q<+YPg6zG<_*;c< zN(eH+rx>E--S?Qsqk9;;9Q4@my$w6Zto5edYgf;=_q}1A2!!XCcFAg8qVezJJx#b$ z=UJ0px2q>AGw1q#R@JElM90CMbHj4qmM7}BCFW9h=JiL_TUT2jeC~`oor0Z_`HUhX zzTHYE^V&UUnf=K6Naxe^Rk*brhGhuw@wS;kzV!2*tj#B6`~*pch2Sy0|>M3l*{aiK4?ZzuMGrJLSdMp^7zRH88Iql5_Uldn>jU;5P{?Z?b6#o%wBJ zs!_uJfGSkt>-N;+kqh8&Et6}|nE$0l^!b#B0e9Bgyuy zkeD~{BSOELsSu3cbx>73sTp7U;o)C?t`%-M4#+ntkHMZ48T}xYZerkW`*dCzu;tkD z-o;*JU?vs)Y+kN!sJL=?X(c*JW-**(a^rC~MeVokS%40YJDXzPm!V24&M0ZnW>NcC zW@P?)I+}ly(v^im98y!X>0yVL7c6~$;^)t;=qxMo1>wD2+Tym(`X3?}e{RDvy$4z; zM-!|{u*b`;?9a_soqew zVA1%ig1W3wqO8`RCk!+5G;L{IbKLVOk8yu~KIMnh70XVFfrC8WCgYa@>%ioNYS z@^~v{jdpbhHM@r>lzf&Ukh*8mDnVw@@zG$e&V+*l3dIzZ>}he+c%M(}K}hvkzqqI% zv%5vC%>~+%K4z<#E{h(tJ;>wn-nZTW72HzcQ zpmjK=@Z>>HfH6a3W>UQ$*XUSlx(Iq$Y)(n81@GGnE5H$;CLK~(ChP9kHq%DoE*{l& zOD3|aIxGS@pAY!~I-<*$>uX+f@`Bxs&c3#`d$X$-h(U{CX-%}go@Y41xcD5071z-N z1#oDk4JEzQ!S#VHcb9Zu=fS$I?&eL!@N@)=T+G|dJIF&HrI zmqS~(C}R z)ULI9mcov#n=@HzOt?OsTsiC#`0rtpw7yXBpHeE@PUO@<{mVK@;V}kUniGwh0|&3Q z9JWy4^F@<+h%Fd4dZ)MsX@RIL-{e@z<46fpQmMMLNG$gAO?@CN>(;jOtht8TWEYe& zOG%LLR5<#BuH9x4#%twDdTNwc_A_ zBT+G}g^Jxj+x(|6U=;(+|G?34C8C^`K7C@-`mK0d=Y_x0%8v_9wtkMNScK@fsTLwU zEhy;MQQWz=fLmR0DpDyOtCHJ0(L8`xvxP~qC<+mKjs60$p5P~*GPZ-MfhhyGZy#?Y zRg5tm|BvmOiU`HNTZ(C&Rn=MW?7>eqnK*NY3mWZ zRJEph`;h8v&3)%Mhf0V`!XxN)oC)$UwH5ZQmOu^;W3z4ICAPBy^H0{1FA~^X*qWBh z#>i)q!q2@>OQ_NREhW~;o28Ycve;NqYW5~ngDkbZ+pOf5Bim@;Lu&M8Jo z)5y@0R@}zE3~I{%L#MoGV|IgvX$XBZQ;Y) zo}WaWWqg+ef;5bVkd(2{4_6Es(~Hunk?nFu(^9okZgNr*-rX$Dnou^{%=<#V>yq7S zNa?ZUn-bkR!c!a-1p_nCGz9RSnzRcP$#Fi4^SM5sKd4gOFGM%Q)gTB^<#rt& z5|AP~n97QB54JS3`O5yWsxkME(!S2qFQ0VG z2a%QC7e5l}cDxH{{#NEGP8(ZLN(ChDQ(p65_uG66*uTtfF8q;m<2qkJnI507x)d50 zO0{~maCT-+f(dRi;l=Sq@v}eZEgZd4rws^<&Nn!u8^Ks>iM#|un%N%#VJ^MR74NE_3 zIhdH(6ybHAq*6s8JTZ-FsFj)YZZJ9kJH?s3H_&wj+Z#Q7StFkpqx208!?X00h0W zU6{ss>*42b#?su-n$^SZN!BtgVRb~y^LH7HY~;m_Za(RFmuibCeIjgWsr2T2=X|DQ zX+|z65~I%Xw+$Tu-R8@tmbRZi08eHr18pT;CQ=y^${m533y0jd&*#1N0PB#wWZ5v^ zCb5u|wjVjxokIi*b|~$OPcL$!a^ft9+agf#Aq4G@7@GziVS^@Wx9^kTql!sz+_nd} z2c_EQ380!^u%47%r_4Lv2?D_n(;;V%i;jqeq0zm*tqjB#e6DLP?ZGZmzQSaU`XxeS zlg1X$-*%xxnXPw$ubZnv9cWX@ateT^6j}-OvVZmQ16ZSSZ4C&ua(@zv_WCNsz-4F_=Q^7|D<;7Zkh!mgqP-go4 z7*@0C`sV+}z8<6BUm?|=mN;_amKd9Mkwlr(T3r5^ru);GrE?8eZQoiYy{`CJfd0$4 zCy4f{kGERPzpIkJ{7@mZDD zOW#h3wZ7edsd;&koh*|l*WZK?ou^3o*NeSC8s)G5yEy&)b7y5Tsp_WjTu^r1h1C<&d!YF<9! z)7+gOkAzlz|Gjif@^F?qNh8W9RYthv#w}?FSK;3_9_yO5cQsxq4ihUmJU^ zHv5R8VZUEi+~WKe8Lue$@BW$nE~tH*Im%Z0VZ~&cw$6uWaxaQlb=PEB4pB^HP;42 zKw?pgBS*8F>GKzgdfhwBR!lk>-*zH=8}6S;3?imz$cY-`u}f**_CUzSC)2-^2zLSfG3n}id} zNvK4)77~1r!d`{>AhInTmFL`#x9BQ1b2i1BlQqT3DY7DEk5au;!o4VI%hD0->SP$; z-uId^7bZzvi=C~u4{wTt=g`ofg94&8{&k%5_$2DrHS{AXKWPra*Y!M{`0`@2voo|( zMg??YNRwp|=$np>Y#m70Y?2xF3j3fUjll7cAQ^56Q6J^% za(fDguD9dE4JBa&jK9`BuGUFNO6@9|3J@c1Wh8+E!8WORqbFz&+O?pZ@nh5hpbn$-HILnQ_Pd9T*Qbw zo~95#K&6q>6yX71Gu#yqB{{zYcId)|8g)(LLBCq<9tZe8Y1IAj`sr1Nt)$;)kN0m@ zV{F-ecCmHflk4ds$-rz+mYSOVM}@hv`zqGjgRGLAD!D0WFzhU4`NKj^{V!d_l2ROG zDI9oDUzV80&px306lyx{wW3zR=*Mq!W}|_YJ}|QkuK{;JfF?3-c~v=z*H@3I9J9@W z)`WA~H!Ajgy8|IHRCa>nUC2Jj(Nxen&bYch;$<;mpaU=y3#MiFuH-kDx{yXqZ4x0O@tPYO=`BGl`4_4+E*)%u&2t+I0^=U(lU!yG&)9)lMI z?Je}w70%^c>`E+r5h*Y3#q$2N1ZY5}OVy{z%ZyCm9wgy<*FK5x+9yuET%a+je#VOZ zF)ve5Uzer)ahesqw#`guvFXtF8%77weS9Y7%FA$=bl4YqWD?9f9i+anw7`>HRdF3r zRYf>wW2pc^JR0OFyfII#U1i+T5*CHfpZ3bz358pd@ln?nxRL{JOvnU|bQ#y4CgG`> ze1J25*h((DGp-~9Lg(&KG%8__l_y`UjdfRac?xKpp- z+O>$(B+`s@N-$v4*^dE7nSdEjt1gh#Xo>te*D=SX-74{vcPQIDt-T)wjy6B=baFml z@K<9cHtLZyPqyyJW*s&0f4;2!$$u1@qe*Pqjp3(R>o*oHnO4_yzr_7>+p(!UW{}}0 z=$RSO+SsDaMict>Cbb;j@hu_#sK7d)@PYpyQu3TSFPwJA3(j)wYA ztXz2FL-Y^1yCU|}uVrsdC3pYENb@bUtXow1n9_5HzbejX7e;#jXsDll#tN}{sEV@l zOEU+5l^d;4=eYfc5n2*EJDFb%#^i^R2Y^`qUc%K_x#)@C#@-?I>5Z<;JS}^I{cC=t3vMr?ye3Rf#j$l))KEur!;#V78VkGcE=1b(_I3ZdlKBt;tsv%gM*{_fc1)$D_Szxp+8 z9^P9eaMEv3PwdZT5WCVkI1OF~aX&A&WK^YVB+bJA2Re?hxFUpo=Wd;)E<3JhXf)eD6hTnx~vv|eb_$R*q*?8?pJnnkxzkc!LqPTfR{Bw@VmT~ps zVNqI@++v*roQ>rQg#Pu?b+L8c=z*!#5Fooqy?y z-s`a|ze7}R7}v36vejm7l$*50}=(Y>g;(v7hX5feahji<}k zYvsVEv#L}>d=O!0N%@M1qS1td6aaF~4vTBK#q^#wMhEW$+y7EU@aE|Dm$J)*0Jt{1 zBjtk7SCRWeM>t`zLHK<3qljnszD?Ti&g#~jx+n|~R`d(D3W#9JC=egX2!aE1*kvRN~l~&pgD>QUdUy0Mv?);dnHy z)`Q3`6NX)_nCe|oI>V9CQkt3vGrbszR*!-B1i+XTQoAMFe6(XZeRz1KaUVBZBcr3_ z%EKKE&61bk@qAlH06I%_Zm7UmMs$kb{K1k&w^bhz7JKe|%^SWjH*56dWgDG!v3W!1 zH)V1Ie=hf%w*WvmfFMi!kMQ#;j^T(1G6@|cGvlUggna*8W9Bo@TE|}PA$d;uDdQB3 zFS40dugDy>RTIH@R}UGJZ-PepwCOzQhJZqlgYdgE0V$h zX(JnEt}AN{pr|xTq3KH+*Xq@YrQcL&8lx@L?5X$9=bo++Wp|N&t-w)<4v=;<>CgdY zPjaY+3V;u!o%FfF>1A>Iw7YFeG~RXMFqS2j`IIk@&L|owB+u(_^w+8nOVMFyxvs!b(u_cU-U6*H;Cb z#Au1U*U&nH8)L9d&u?nWJ8$OR=??bA*c8vZ=cP@P#cSun8ehc>GMA-(A!4dB3^toA zTmP!*T>2(eSv*<&HdxECgH=smffsz4Qrt}IaZaIV93@O^nG25@{w)K@K>4&dr@LAHB2Um2wb*g$4het z2f*ogBihX)xHB3<#oo@LQrO7>Kl0e3n>7?vN_|g%tJj!VR)`LVgXzi`Rruy}Mwgrn zDGi&dv(N{Jp2`U{`WGt-QUs2zOh!Ukw9%HdohVOEsUp&9x6F;$&A-*4Yw^yYY^u>B z$)l6f=Z|jKz7}vd5)LBKh!?}tMo~#bkxB^7OZ&Y}txiY)>&p2$@aXV+>~FMaFjRlW zxTm$TmVd8U6*4vBtW@*{hlFWXysm~ML{*{ly%QlYfgWiC8;j=5i+z4cvUA`3CGXqJ z+!y&(j4BvwSpssixde!!xOO()wW9>#x^qE~ z0QZA7vz75?IR-H%xdHqm2qeRl6E5jSp9Vz1Il;#M#JpuycO`MPe3BX$jP^0x?ItTi zX>xeNNX>{8V}4Vg-*L6Exv_y;33M{(!=g^)oIGy0oE`ZLb2`0$3hjtziTw2|X+xlO zkdK((oG~{hLb?ANVJJ@Me`i-9^gVL`zw20j$bFW(7&) zh~uHx1ci&FjxR#-ZeD!!CpdgxUAN%jWe*xHyYpMiO&Nul>B?fDB`u4{%^@f8 zpJXawScc93nGVWTpxOE~(fa*DXjSExXXP-u-#!S^DGUOhZ+_)(fICe&Cw-Sq*Lq4{8n1M_)`TZtxOfAv~Cf}6tkeq^y|Tw4I1H>-E~u_fHyDW3OGNifS&f9Sx{-B zeD&*^PeM1+S4Iy_P~U9d#*m93I&A;ZKReh>jJmIW?4(`(yZfNVvyX>}xd>M9^iO2A zqKJcDo4?vh?jrJ#1L2Mi8vnNA?N#JZvhDdhwse8qRv$|2u4b0!bUdfP%h&VlGJ4lP z4w9Pr-(@nm4XDle1VHD%@U(OVu;zWG+j>1kOCy{fN+QNV2nIw{G7RDgU)GuWU4H55 z8D72DWSeAFX+-l5NMaI7Vi?kHqp5T9^)q=ud=sR5m1|R?#6I6vi3m7M2+D~wV7dSc zvWLW6KoNOYY`7$436j*dUor2Sc^)tKpxjlaO9uNY{9DGf$xX(Q2@f@~IZW%9UZ|_c z`!wB4*SA$Hcpe|Z&1HLb7^kda^>7Q7`GCpv^$yk?kUQpx=^@%z(E^u;EBIrlBvSJD zK$eb4H~pXikeC%tsVkW_a1%EJJ8s)MzdS4j3@UJ=RO(O9mwKeh?<6)RuLmX#br5E4 zoCKhU9a>eh`26~Tk)Tcf0UP++K>s|-!%^CJ-KClbwpT=7PGDjQoOB_?HHXUp4U*J; ze$w+KqffxL5#iXW!=`xER3&ezZc<)BS6av~g6ghE#rGXZ5Od2B5<$NqgIdW>uM>nE zrFJn=coMdnua|w}(Soy7v%3FmfdOydkjkY?soZkpzO`{#W%mLJG*YhsJcfJFc2+ba%QXjd`Fv)K&>Pr zsIk@44VS&J^Z&W4uYYSeGqE#{uCIGb2G}I&3Z}ub#rp8>+-#+-w{bRjGc;0sx@T>w z>)7Bx=Aj;i_#A_Ce3VyySov|zt;U|aiUW24&<7T?n!{HeM|NA9dmKHG0ZMEwG*o_< z+nYTLzXTHWWb@&#zH03Zix8$3u##q`$!QV+CErgzE(dw7=##rmlyh;+(W|K%zsW8a}>E zu2~^-?C7UD8V+0Ig(;k>2sPKaI90ggN$j^Y zcXjCT&%SZMYE5;nHu}Z$mKJDmTjS{H!GHBXT|Lf9*5A=bf_kSd41V8qAn&ToaIr(@_Or@GsLE?Z5e-v;qZ zih?vA{&dBh`q^Y7om5tRsm4Lxw;jQ`F}e{x&MJ-mfsh^IX{X{*m0Xt8i)tzXK(FLRrm4 zcy;(Fhq*tnb7_t!yHM*5Pxg}zN_}c&JgF+h zcWWq`C6mbKjplPnP{O!j{{4-A7h8#o{wiJwQ-v63+E`RBlcA&s@coyJFiIeAL>J`o zPqJ_RvZy8j{z-f)A7~n)kHC4rskK@1D%k&5Ky2LJ{^WYOw}f#zEHEut$U}OXI=!Vy#c zXnmxmZm#2hq8Go?DbyaJK-k=)B>^UuTVj)Mz1D?2@wPL#>)+J8LYgFfnu3xW$C{Pw zF?j>pQ-(e29sjPrbk>wiVDDAGsj|R!5#gxIBI!JizHbm%75n=$qmd`idd%8sAGr7D z`bng}tLEwSdDpSVU#}cxSt6VO7joX;GI33orM>e?_}huLVfOE>l+Lh`bqD=ulzx5B zJiiTbUmu93*rjvCNVRbjuiwOY+^A%cHzlz_j#b6?s#XelQNREB@{;s0Xhs+^YcogmC&MCPLoT03g~L14Bt_bjYI zxw4)a^U9+{DbRSBwVTw1oWABi%aCPi1(GjnbcKn6s1FpM% zriLgtld*KVGzwVGt<61027KBgak}K=wv-*$V{)<*i@NxF5nHzw*d{;`!^;H(fkK*s zy*}|KMkzdk1lg{6Q|R9hlMQMwI=vk13FkXeC}}emAg8XJZT+yGc2(}Wo+;BCq7Sy^ z^4LH*4}M?k$@)6x_U8-f?_%-TLde1X{L=Gj(|E@czeSH8LGM{%lr{Ersa@rC-t(nU z(;@H1996MrZ|3_&O6Jw(h&mU$=oJ2>|2n`JMil%m27{ zpk7&TR)rp<^P09i2oNo^xiNqDUer-d5kM3Jp!!JTa~nQKx~Psc5RlQN<6Ys&GPJ3sJ?nmX#$s8Oo}>cmG!%Au=L&GEI7GP!X!(@oy}!4XCzW!$KKaBZ*}SF z7vlMKXxfH^xy@_V`h#NewBmt!p`LdSW}cj#fyaLG^OP0*lw^?GP@y=ym-~UiG&N0W zVWN62UC!d;!{&dDMa$!PQx(M_$EXC2tBC`u>)R5rkk9Js)J8Ak>!QEA48zK$s!*CA7+RleJ)?L4 z+})K2IVuwY1B!>*Z>pfrho>LQqhI}O`?V*fT2<4V!oB$_2sanr)BNR7f7$0-OKAju zvHeP&eSj6cP;RdAP+AJXq|q@YRZHM&LD|3p+e))Lqv`7MLzQs5FctWk$#KwIhGeS1?KX>- zT{0pF8yxdXv`TDXEfD&oxF&Ym*p?d36@S6R9X&kxRl3Xn+UeyOkhhKj3}Vu?Uhw+! zHIE`)XuaoKg+nr(7BwaKj!@lHBWfo2_1XN*O;__5PgS=@w_(eiI}cL=N>PIf42IAT z*ci0Q+M+-0s(+mriXT2N?{M3}#U}f(M*4VBkh~6O1=7bv=2l>2f5r_)QXv8P&yy3- zx!US%Ln`hG8D{2d-f*}B=w?K)2APGh?&!p@r6mxm+Q?(;hVU2r9C6vnemWpTlfz=G ztWwGqH$@cJcVjHPD=Cb~(|t|Nt}y3Q1TX?<#UUeG%Lg&E@D|i=Bmn6az9zqj4%l9B8XJvBPjC=~&^V=Yn`5kBPu$DF=&uWbCVF zbA-+*+?wd?t-5ViFYC`yw13i?6dm8BU-{cCMzf zE3FnNLp!1Hy}}Y0G8*bAFaDV+u&c>e(Y~^c#Y$xc<-%5i{0)lC>s=>IOD~A*ppNLz z=-a>dcZD6b6;Dr9{|W&(v17IADCKAEo${(lvSF<57f=C~#G2EypZ3Ghi2)>HvDrCL zExF!`HWZ$wL*7r{0GXA{SoJBtiA&pRU+q%#b@f-KNFXD>pzr})fTN-$A)=hbqNjsLNyX`+c(9OVm0#!p1*3bLbrDI$ zI*uUY*}Wcrg>kNQ{TgGZ*WW~dE7r8Z2o2yZ60!7=z zKf)f|AY$utX(kVN6i!B_>m(CLwp5hEG7^sVa(m?We(ixi|Z$xpUyj)UR)N}ZR9n!D-@A)B*|!6^w%j!ZW z_j4Sw&>f+f-*i;?P{7Ww_zPsG$24^Z(6M~`VmHq3gk*Co<^86PMwK+@NqG?yi_~J0 z99i`VDCq??XM-d9c#QJhs!2rh#rtlUo7hchDll;VAd*yJ@T}&ceHIapovWT&hmVWD zwNjY7O*NikNVhPXDzPzE{Dw7uZKAjv+J5!jq=4cU6W=BwEo*jg$bJGc-vDUINNoD% zU-Mj@MbhSAnu;hdmHQm_xNE;Ut)!AUgef+#pbhdKvq1Q6h3|mJ_iZ$Lnkz|@2F_o9 zAu6E-lOv37)^#qn@k~v12}H^i*;1S_y{F#HrRYbC^gj)uJ@1p$$mRzq_hBgoYXl+6 ze9*1X_j8PeSpLR+uKwj=p~@~u!=l>w$7i1mKe>PL^Yb#IkTL?hHOxf?rJhM>?$sBI zFDpqlJNL5vjoVOty@U4p5<<${MZO65G&s()n7t2Q>Vf9rtq|;cw`$6~3}`wH>w^N0 ziDy=aHn9w-z@^(xi;6%^aX9C2>nfGz^zMWscd9^&`Cb5`D@9Qnek2@H7-Ne^UC)FO zvHq|fJR!YmL@+Z;N<1CaTXvS6HbJU-Ne@8U@wv2OqNfSpufa*3-}K*~Tz@PVB|M)Z z1+C@ic2v@G+oH!Yy~r}d4>vwVcD!jnd!u1p#<%JpfcjuRaddYlTyPc}lke)4~h~U6XR;hq; ze-`DCP4^;1**j9jhN&TpYnf7u6Ie;Jzp=SVWIk`OW5SuuBr8Ej-iAm5|GKCAcz(CX6zP=qg4K#MqpeNnn}ghvETyoDe&5fT z4kvfQV%;z2QCDcMlg>vinU=n8V{03>HJd(8`=>WFpz@Sq_7cpU9*WP|Md)zi52@>YMpvnz z>G_njvO~hd)h0J#{(=8bsmzJ(^7Y_T*M!57*GI+m1}W9)u%?P~9SmC=d|BYqhifQJ z*WG_rER2N~i5lX9aXBVZK`Q(h_Xv*+^}>=<9i6GsJ-bzVkfmdy8{f+8G2X|3VZyJDXuJomQ!M+m99OUZ*~h9_;P`4m)X^p_l@HtR2EPP0*i9X&%umXP!7F|rMfP<0^Y+V0aeCmgFq0UcOIVgU zHnNv&c)>cqvaJ3}Ui2#{lLS6|#=+h;nA5?WEW?VkV6^FF>+Xum@p?_!M4Z{SGBl5P z{DsDih3faQFcKY}z;~a`a{bXx$Vzsc`w2rP1^NxD=035w7&DQA$S56q`+TOA6eUPhY)Ay9zUCR9 z*NcTIsA?j!(k8q;>ybZDsgabe2igYlr$tMO@17~_q;A%ja4mS+n~}CDmk9O*J|92M z?=F9#dujDvgfujdUf2-T6I_=e8DY+eXB?1?mN-gyb-wgQd42!2ARJJ`&blQ)If3!i7A^CjxjlPdJdHiYi z##8Ft&WUrY%q4cJ#KtfQx!={(ZK7dqrG6YL_QynCG)8bb zt+WQ9iC&9^z$ZPoF_4k!-PU5TUL@vJ?8NQQQHZJ*tuyj_lmz2d=aOKOMgw}krjVhd z_U|Mk2VSq59O9O8$lr^=yuN!}?u8snX8QZBVyNaZUq_*@K2=C^b(tu`VS6AA`b=cG zlglnLc@yV890V(EGwqvg1PThHu3`UnEZKXMVI%hBCgK^Jn^n=>=jGk;a!e9-L94QP zRzZK@{>VDz(~3sca-P1z>CPm&-jKP?CsDDkxhZPyp97hrWB6{nE=Tb%*VA&T>*#Oc)mJ zGWn%l`y)AUC2-9X-*joUZKQjvhs!OVQ_flZA$gI-i$Pc+V)e!v9iXUzD|K#ph-Y?q zpeoB~qgGIvmC-49Wxeg2Qsk}ccO0GNS(oXtnq(xigYVA!D)x7{BuC%Aqzz{dB<7)8 zWhoo)>gn?88us?))1dWmojwXntK9Fn=62215u@f}^~c9)eW95l$`z#&6j)I~m7DCT z8!?;96k969)=fk8#R(5bs-*_Dd*(hGR-iE;=ZCayB?)L7m7XwklA!o&A8yoyoNLTI z^sa9_1`rj?W*u*O%N95T2&xObqhzx^ zlMcMpv|bp#AY{O05->sTCsFf94+6U5d{BdmMb7=sX_PUDW{PM^197(^GHas@l+?^$ z5XhPp7qr(+aV9@Zg9VsHD7G6Q&JheZA%!xGD43{z*caJ!Iv-lk09)M(q2zf&Pa^k8 zctkJB=PcLf(q%pXB$6AwvQ4t@9cTZSm-=tC>VG0u|HVoD547q(sMUX?RsYNMzo@K5 cujLms5AwP}lVwKmKadQdte_66l`{|dKTm!7v;Y7A literal 0 HcmV?d00001 diff --git a/src/static/app-icons/20x20.png b/src/static/app-icons/20x20.png new file mode 100644 index 0000000000000000000000000000000000000000..ef1fc587893aec9de627c342df828ff03a258a9d GIT binary patch literal 889 zcmV-<1BU#GP)GiQBxx{0P-+*c_y;c9x+sF8f+D&ROCz`uSAsj0 zA_!VtC_*W&M5Ch66s@bKSTdqb(r%BqG$^3mk_Z$~r94GN^?(cgz_qp%6lzDar zElm*-0f0nvY26fQ?Eupvg8)@8WC8uV7zK&~5`jQOFq*cB6;UIw1l)I5I_c_=nHg3j z2$==e3JXH!(25susTTexCW05(-D&sZSN9*hx4Rj*wfP}i7G`M#{K(tC{<&IBINAUp zP+;ZcOQTa`J<-uZ(Yw4_$rnA#l63V@Z*n->9&IJ#a2+Kg0E{B4`*tLodSYUCq3C@v zyK?&H{H3LGtsa5}p}^6pq&arrjt^cOjXP=^Fo7sVb>B{ZmOGovUVMdSE1@6+QFb zTwBVSTP*DWVF=`h+}jm@`rw@atUy>;L=7)6E%!1+IJ9zT`)ZFv*G)OgPe5AP8`5tt?NkpYAVp=Cg{QW^j-w^;h<`=u|> zt(NOyDy|85Xe85_jInIlW~al5=yJaL-Gv)x&gak0Z=i0I8Fz9p{mSG0Q=>iO$7kE) zX8OpWXN8-zSrF5zQ1U0I&;4EWEK6Tc;`u{;6Z<+Qhq@*P(lMfVO0%YLHvm{Ndu->0k2m%bQ?4djGCBpBmDN ze!8^2yjD*qW0u84#aQ?G)Q{J1RfC0m_3Dk>h17d4kwjx}yD P00000NkvXXu0mjfa^Rw| literal 0 HcmV?d00001 diff --git a/src/static/app-icons/29x29.png b/src/static/app-icons/29x29.png new file mode 100644 index 0000000000000000000000000000000000000000..634a30bfffa932d30f8997158d5b108c17f9fd6e GIT binary patch literal 1375 zcmV-l1)%zgP)Rn8-^%NJtEXM85O`L)2jS6ZOOR z_&{T##so>!#(*RWG4e=7MO%tMNue#Y^u=`EGk5Med;4+Qv6QwLjpy&&bF5HkQU z0|OXhB4!3+Fk~2j8Hktxh(I8O18QbmL`Y@bEsw@_KDB6Zbx1Tt-?ss$rKDAl=)R`p4}7+A)+>n2*fN9lR0HAb3ap@kLxXvp$gBJ1d`zVv~%o{rvhB&d7}_aDBp zaaF7`VgrDyjUiT(7pM{wh~ey&#OBqp_jWG5udZy`yS&vD3%AsUR_;0N8uBSIo^>zX zNIxF2=hB5S^zrWHt@ULkk~0HhNfB7oWLu(dB<~uweaHX;Az;h9=nVyC9it5cu#{qI zyu@sXZA)Ak%iXkunA>0XsoPQ*^pcs2B7hKK?Y5PF8PZ++AA>5n(06w#1! zT#9GhSGP8ATT`zM&sd4S^S}&6P1-O6NC6TN06KeMq=IqX+TA^;5B%AYtt_I3Nv$&2wsP6vF_r^HConIE>cKT-So zmX^NJ{F*(d`{RY9udN9Am8Sq^z)3GvC1(`^Pn;iX?;bz$>&P!X$@r}T0H9xnd@>qT zt@YujmQ_BpqNXVp27pM&YHlby-4#E4X7Gizi)M|Nn1i-_<+DowP+9I!8 zps^;@T32>&UAShR-}}>X$)`kTZ)z~^Sbo{npPq|nLSQDZ_dVD0{A0EA%Y7ALYYHhQ zvTulq*|vl+^v0Ln-nkMu7cK%2@!DmTEw$mv7XW#Fj(`BnASEimRLK7Yy*uHvL}j^eFkWb=@_+Q=awR7k z#1}se*p?uksSjylSJP0!8BP@XM)Ow&vlp(XFI-Pw8_p;5+EyYOwj7sIId|jAns;|B zjZGGF@8^G>xtxfGtWxX5()>Wov3Y)5;YhNW%IiYW7y>EKwuEg7B@r0%MQW@Gyu4xY zx(BNOAd%JGgPDWh_a8ks8VOo7#UgO(T;g>@OQ94f5D|eHnAr;g0Ss|@P?ZJLc*bRB zO`ObW0E`6H)FwYY4?auaq(2zuJBJdl4aPIB6o`O`5D8k-CWjetJzmYRJZMkr-u_O+ hyUbB@q5p$%>Mt#&uyb!&hr9p)002ovPDHLkV1h5|iUR-u literal 0 HcmV?d00001 diff --git a/src/static/app-icons/40x40.png b/src/static/app-icons/40x40.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4fec30773af53a1d7d62547a477cc6bf32b5b0 GIT binary patch literal 1988 zcmV;#2RrzQP)rg#P1-utP!JW0h!j*v5hxNb{ImiUA|6OyijZ1V zUQmIE2&5ndwX{MM3JnseqL7x*gc8yR#|eq^ixbCj9M^wYulN7nnR9rUb-Z?*_0pF- zFw#o*&W`4rbIy0ZbLL|5tAB<2F$CPFao>Q|GUpN~0004aev8Aa4F#1kKB=xU2bTK(Kw?G!ArS!YVPScmh;6)i zj%CCw5H&GYi7^5g;^%jCNrBq15MYR|ddMs5c z24o{*oobj3u{AUnQJ>%3{FAS5Xir9%=Lx?|9t%WY^V*h3I3(>%|J9jS-yJ#BH!(a_ zBw{7e<_t4vV_nMOkn~(>BX5X*_ug3lwb{cje0+72H*a?h0#fGA@qwvd92$D7Zz9MB z5SEFk(-e1F6XEux+nR72>YQj;1)7E@3#YE82X16MS6PU*2KVA zPznq#Jj6V(A@*E#dT4gj_l}*rmR7FXye{6`nds@L-?%!yrX|uCcke!Upy}7|3_thV zORgiBp%hSKEOhkT^p(*}_sSR%TRf^xE{TvUnav&bySK0V)cRycYgC8@>xq~v^bZjn zC3b#p?V-N$zn!~X?jkzj&IND_lFEF~bK6xFC1XmXTz{rJc~FQ#IiW4UdJV`0_ZURND> zaalAB0zpX>SS=lh*$_KQynT9N=l+3+t1K;*#7x0F{$OHVYm|82Lxy-6;Hnmug;Ns? zL@Dq$M~8R(>=Ym>0XA_1%}T=aJG$mG1T8S(!dNU+E(EQ)ij~YD1uDc#H#0B3arw>n z$75k71rUQ3oSd(J`nC1F-AOBXwKW0^h?p;FV6Jqt6>UVcLN+p$-*@=>%ST62Io%L- zh?y9a#6a^*A=v)0=I=ha&Jc^`T&JqrXVuYa^||5ntA8JP79R1{^`W6;}>qH^E&Q1 zE%mN7v=mUTXqw{At}m?l{+BxYuco*ExNr9>7jI4#_dN5E^%GW-i|=JI0y8Kj0AOf5 z_peL0kDQr2aVd3kx+sN+MPy68TMTF>7udSg)fW9??}~41d7z`M4gj`3>Td3cpC8HX zJ#>BRBhA}-R#b_!s+8%F!qHS|*UJN!Z)ML6%}&e)L>y8=3ZV^6&6j42?_`EI;@jGNKmsrwII=r`B%nNUUlM zuWF36)Vs+#N6N+NZaWH_%?!3*fISDVW{RdcE*ZdZ&3&~%ECi;r)!X;%!*?+ph#BUR z6%mxc%Cg}|+<#=~wPT|Vb&er6hF2xSHZ^3~Ay~y?wjL|^#*qR5gaF&R3EPb? zOK+W;Y^Vz{vywQI*S($br+V9%K?q=m@tM+CsuWU!`QCX<#CB`@vnpZ_Vf!rWIz#mS z<#X_1`Nz9kX3*o+JH-xOS2jQHL=!2PPtkv zDp8};g|pYw|G04b*ueC;8<}Fj^`1&Z9R^SmQ`sO{r(WOH)6>ylh?zl2%$M|@zg&w{ zwDL>4S|CKjN+9?FO=n7DsnYOdesC;zc{F$VR`%L>VJhQm!>%JeS9vZFu_m6)YeTek zQ{&!e9@?-v?rRDuVOy=Ie|hHOXf6?T7F9;9yqGhCtMIX|1QFl5U7VQpXY;z?lNJ4t z60Rd0iHJZ1cPx+swr*2iHFLUcLd<_HO^|zhx{T?9<1w literal 0 HcmV?d00001 diff --git a/src/static/app-icons/58x58.png b/src/static/app-icons/58x58.png new file mode 100644 index 0000000000000000000000000000000000000000..4edd637484709e40f9d7574e0814a9b67b030009 GIT binary patch literal 2958 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 literal 0 HcmV?d00001 diff --git a/src/static/app-icons/76x76.png b/src/static/app-icons/76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..7ce1e943b76aab69809274f57a18255646918f2c GIT binary patch literal 4007 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 N002ovPDHLkV1k9~uH*m! literal 0 HcmV?d00001 diff --git a/src/static/app-icons/80x80.png b/src/static/app-icons/80x80.png new file mode 100644 index 0000000000000000000000000000000000000000..4f035e451f50c51e3f6b2cb5c5a72d9e877ea213 GIT binary patch literal 4103 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 FV1lVT^z;A# literal 0 HcmV?d00001 diff --git a/src/static/app-icons/87x87.png b/src/static/app-icons/87x87.png new file mode 100644 index 0000000000000000000000000000000000000000..d6cc8f2a6f960995ac79772159d597f5ba9b009b GIT binary patch literal 4488 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 D+(Dcl literal 0 HcmV?d00001 diff --git a/src/static/brand-mark-white.png b/src/static/brand-mark-white.png new file mode 100644 index 0000000000000000000000000000000000000000..6fb87e3f299d3e01efd79c78305fd8a80da12c22 GIT binary patch literal 12512 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 literal 0 HcmV?d00001 diff --git a/src/static/c1.png b/src/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/src/static/c3.png b/src/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/src/static/c4.png b/src/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/src/static/c5.png b/src/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/src/static/c6.png b/src/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/src/static/c7.png b/src/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/src/static/c8.png b/src/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/src/static/customicons.css b/src/static/customicons.css new file mode 100644 index 0000000..14ed5fa --- /dev/null +++ b/src/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/src/static/customicons.ttf b/src/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/src/static/logo.png b/src/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b5771e209bb677e2ebd5ff766ad5ee11790f305a GIT binary patch literal 4023 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 SYs}WS&%*SCNx89m_!nj)A0aBhscIxsau0N~m( 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 Qm5U?upR@n{uQsIr1sJ6%s{jB1 literal 0 HcmV?d00001 diff --git a/src/static/mp3/success.mp3 b/src/static/mp3/success.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f5a6585fbbdfbab58431853a4b236a879893bc7d GIT binary patch literal 4224 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 literal 0 HcmV?d00001 diff --git a/src/stores/session.js b/src/stores/session.js new file mode 100644 index 0000000..086b774 --- /dev/null +++ b/src/stores/session.js @@ -0,0 +1,95 @@ +import { reactive } from 'vue' +import { OVERSEAS_API_ROOT } from '@/config/runtime.js' + +const SESSION_KEY = 'overseas-pda-auth-session' + +export const session = reactive({ currentUser: null, token: '', refreshToken: '', tenantId: '', apiBase: OVERSEAS_API_ROOT }) + +function decodeBase64Url(value) { + const normalized = value.replace(/-/g, '+').replace(/_/g, '/') + const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=') + if (typeof atob === 'function') return decodeURIComponent(Array.from(atob(padded), (char) => `%${char.charCodeAt(0).toString(16).padStart(2, '0')}`).join('')) + throw new Error('当前运行环境无法解析登录令牌') +} + +export function decodeAccessToken(token) { + const payload = String(token || '').split('.')[1] + if (!payload) throw new Error('登录响应中的 accessToken 格式无效') + try { + return JSON.parse(decodeBase64Url(payload)) + } catch (error) { + if (error.message === '当前运行环境无法解析登录令牌') throw error + throw new Error('登录响应中的 accessToken 无法解析') + } +} + +function storageAvailable() { + return typeof uni !== 'undefined' && typeof uni.setStorageSync === 'function' && typeof uni.getStorageSync === 'function' +} + +function persistSession() { + if (!storageAvailable()) return + uni.setStorageSync(SESSION_KEY, { + currentUser: session.currentUser, + token: session.token, + refreshToken: session.refreshToken, + tenantId: session.tenantId, + apiBase: session.apiBase + }) +} + +export function signIn(account, warehouse, options = {}) { + session.currentUser = { id: String(account.id), name: account.name, role: account.role, roles: account.roles || [], warehouse, warehouseId: account.warehouseId || null } + session.token = options.token || account.token || '' + session.refreshToken = options.refreshToken || account.refreshToken || '' + session.tenantId = options.tenantId || account.tenantId || '' + session.apiBase = options.apiBase || account.apiBase || OVERSEAS_API_ROOT + persistSession() + return session.currentUser +} + +export function signInWithTokens(tokens) { + if (!tokens?.accessToken) throw new Error('登录响应缺少 accessToken') + const claims = decodeAccessToken(tokens.accessToken) + if (claims.app_code !== 'PLATFORM') throw new Error('当前账号不属于平台作业端') + if (claims.exp && claims.exp * 1000 <= Date.now()) throw new Error('登录状态已过期') + return signIn({ + id: claims.user_id ?? '', + name: claims.username || '仓库作业员', + role: Array.isArray(claims.roles) ? claims.roles.join('、') : '', + roles: claims.roles || [] + }, '', { + token: tokens.accessToken, + refreshToken: tokens.refreshToken || '', + tenantId: claims.tenant_id == null ? '' : String(claims.tenant_id) + }) +} + +export function restoreSession() { + if (!storageAvailable()) return false + const saved = uni.getStorageSync(SESSION_KEY) + if (!saved?.token || !saved?.currentUser) return false + try { + const claims = decodeAccessToken(saved.token) + if (claims.exp && claims.exp * 1000 <= Date.now()) return false + Object.assign(session, saved, { apiBase: saved.apiBase || OVERSEAS_API_ROOT }) + return true + } catch (_) { + return false + } +} + +export function signOut() { + session.currentUser = null + session.token = '' + session.refreshToken = '' + session.tenantId = '' + session.apiBase = OVERSEAS_API_ROOT + if (typeof uni !== 'undefined' && typeof uni.removeStorageSync === 'function') uni.removeStorageSync(SESSION_KEY) +} + +export function requireSession() { + if (session.currentUser || restoreSession()) return true + uni.reLaunch({ url: '/pages/login/login' }) + return false +} diff --git a/src/styles/pda.scss b/src/styles/pda.scss new file mode 100644 index 0000000..51cb69b --- /dev/null +++ b/src/styles/pda.scss @@ -0,0 +1,1225 @@ + $primary: #1a73e8; + $primary-light: #e8f0fe; + $success: #0d9488; + $success-light: #d1fae5; + $danger: #dc2626; + $danger-light: #fee2e2; + $warning: #f59e0b; + $warning-light: #fef3c7; + $skip: #6b7280; + $skip-light: #f3f4f6; + $page-bg: #f5f7fa; + $card: #ffffff; + $text: #1f2937; + $text-secondary: #6b7280; + $border: #e5e7eb; + + page { + background: $page-bg; + } + + button { + margin: 0; + font-family: inherit; + letter-spacing: 0; + } + + button::after { + border: 0; + } + + button:focus-visible, + input:focus { + outline: 3px solid rgba(26, 115, 232, 0.32); + outline-offset: 2px; + } + + .page-shell { + min-height: 100vh; + color: $text; + font-family: Roboto, "Noto Sans SC", "Microsoft YaHei", sans-serif; + background: $page-bg; + } + + .login-page { + box-sizing: border-box; + display: flex; + flex-direction: column; + align-items: center; + min-height: 100vh; + padding: calc(var(--status-bar-height, 0px) + 54px) 24px 52px; + background: linear-gradient(160deg, #287dea 0%, #1a73e8 48%, #1459ae 100%); + } + + .login-brand { + display: flex; + flex-direction: column; + align-items: center; + color: #ffffff; + } + + .login-logo-icon { + display: block; + width: 78px; + height: 76px; + margin-bottom: 18px; + } + + .login-logo-title { + font-size: 22px; + font-weight: 700; + line-height: 30px; + } + + .login-logo-sub { + margin-top: 2px; + font-size: 14px; + line-height: 22px; + opacity: 0.82; + } + + .login-card { + box-sizing: border-box; + width: 100%; + max-width: 430px; + margin-top: 35px; + padding: 24px 20px; + border-radius: 16px; + background: $card; + box-shadow: 0 18px 44px rgba(8, 49, 108, 0.26); + } + + .login-field { + margin-bottom: 18px; + } + + .login-field-label { + display: block; + margin-bottom: 8px; + color: $text-secondary; + font-size: 14px; + font-weight: 500; + } + + .login-field-input, + .login-field-select { + box-sizing: border-box; + width: 100%; + height: 48px; + padding: 0 14px; + border: 1px solid #dfe3e8; + border-radius: 10px; + color: $text; + font-size: 16px; + background: #ffffff; + box-shadow: inset 0 0 0 1px rgba(31, 41, 55, 0.02); + } + + .login-field-select { + display: flex; + align-items: center; + justify-content: space-between; + } + + .select-chevron { + color: $text-secondary; + font-size: 20px; + } + + .login-error { + display: block; + margin: -6px 0 12px; + color: $danger; + font-size: 13px; + } + + .login-btn { + width: 100%; + height: 50px; + border-radius: 10px; + color: #ffffff; + font-size: 16px; + font-weight: 700; + line-height: 50px; + background: linear-gradient(90deg, #1a73e8, #438cf0); + } + + .login-accounts { + margin-top: 18px; + padding-top: 17px; + border-top: 1px solid $border; + } + + .login-accounts-title { + display: block; + margin-bottom: 10px; + color: $text-secondary; + font-size: 13px; + text-align: center; + } + + .login-quick-btns { + display: flex; + flex-direction: column; + gap: 8px; + } + + .login-quick-btn { + box-sizing: border-box; + width: 100%; + height: 48px; + padding: 0 14px; + border: 1px solid $border; + border-radius: 8px; + color: $text; + font-size: 14px; + line-height: 46px; + text-align: left; + background: #ffffff; + } + + .login-quick-btn-name { + font-weight: 500; + } + + .login-quick-btn-role { + color: $text-secondary; + font-size: 13px; + } + + .work-page { + box-sizing: border-box; + width: 100%; + max-width: 480px; + min-height: 100vh; + margin: 0 auto; + padding-bottom: calc(98px + env(safe-area-inset-bottom, 0px)); + background: $page-bg; + } + + .app-header { + box-sizing: border-box; + padding: var(--status-bar-height, 0px) 10px 0; + color: #ffffff; + background: $primary; + box-shadow: 0 2px 8px rgba(26, 115, 232, 0.22); + } + + .header-top, + .header-actions, + .scan-row, + .progress-header, + .pick-item-row1, + .pick-item-row2, + .submit-info, + .box-list-item, + .partial-input-row { + display: flex; + align-items: center; + } + + .header-top { + justify-content: space-between; + } + + .header-back { + width: 48px; + height: 48px; + margin-right: 4px; + color: #ffffff; + font-size: 30px; + line-height: 44px; + background: transparent; + } + + .header-title { + flex: 1; + font-size: 18px; + font-weight: 700; + line-height: 24px; + } + + .header-actions { + gap: 8px; + } + + .header-badge { + border-radius: 6px; + color: #ffffff; + font-size: 12px; + background: rgba(255, 255, 255, 0.16); + } + + .header-badge { + padding: 5px 9px; + } + + .work-content { + box-sizing: border-box; + padding: 1px 0 104px; + } + + .work-content.evidence-active { + padding-bottom: 1px; + } + + .box-select-wrap { + position: relative; + z-index: 5; + margin: 12px; + } + + .box-select-btn { + display: flex; + align-items: center; + justify-content: space-between; + box-sizing: border-box; + width: 100%; + height: 48px; + padding: 0 14px; + border: 2px solid $primary; + border-radius: 12px; + color: $primary; + font-size: 14px; + font-weight: 500; + line-height: 44px; + text-align: left; + background: $card; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); + } + + .box-chevron { + font-size: 12px; + transition: transform 160ms ease-out; + } + + .stage-switch { + display: flex; + gap: 4px; + margin: 0 12px 10px; + padding: 4px; + border: 1px solid $border; + border-radius: 10px; + background: #eef2f7; + } + + .stage-tab { + flex: 1; + min-height: 42px; + padding: 0 8px; + border: 0; + border-radius: 7px; + color: $text-secondary; + font-size: 13px; + font-weight: 600; + line-height: 42px; + background: transparent; + } + + .stage-tab.active { + color: $primary; + background: #ffffff; + box-shadow: 0 1px 4px rgba(31, 41, 55, 0.12); + } + + .stage-tab.locked { + color: #9aa5b1; + } + + .stage-tab-hint { + display: block; + margin-top: -9px; + font-size: 9px; + font-weight: 400; + line-height: 12px; + } + + .evidence-stage-hint { + margin-top: 10px; + padding: 8px 10px; + border-left: 3px solid #d39a25; + color: #795b16; + font-size: 11px; + line-height: 17px; + background: #fff8e7; + } + + .box-chevron.open { + transform: rotate(180deg); + } + + .box-dropdown { + position: absolute; + top: 53px; + left: 0; + right: 0; + overflow: hidden; + border: 1px solid $border; + border-radius: 10px; + background: $card; + box-shadow: 0 10px 28px rgba(31, 41, 55, 0.18); + } + + .box-option { + display: flex; + align-items: center; + justify-content: space-between; + box-sizing: border-box; + min-height: 56px; + padding: 9px 14px; + border-bottom: 1px solid #f0f1f3; + font-size: 13px; + } + + .box-option:last-child { + border-bottom: 0; + } + + .box-option.active { + color: $primary; + font-weight: 600; + background: $primary-light; + } + + .box-option.completed { color: #596675; background: #f3f7f6; } + .box-option-number, .box-option-order { display: block; } + .box-option-number { font-size: 13px; font-weight: 700; } + .box-option-order { margin-top: 3px; color: $text-secondary; font-size: 11px; } + .box-option-state { padding: 5px 7px; border-radius: 5px; color: #08786c; font-size: 11px; background: $success-light; } + .box-option-state.draft { color: #865b0b; background: $warning-light; } + + .scan-section { + margin: 0 12px 10px; + padding: 12px; + border-radius: 12px; + background: $card; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); + } + + .scan-row { + gap: 10px; + } + + .scan-hardware-tip { display: block; margin-top: 9px; color: #41668f; font-size: 11px; font-weight: 600; line-height: 17px; } + + .last-scan { + display: flex; + align-items: center; + margin-top: 10px; + padding: 12px; + border-radius: 10px; + color: #0b5f57; + background: #dff7f0; + } + + .last-scan.warning { color: #77500a; background: #fff2cf; } + .last-scan.error { color: #a51d1d; background: #fee5e5; } + .last-scan-icon { display: flex; align-items: center; justify-content: center; width: 36px; height: 36px; margin-right: 10px; border-radius: 50%; color: #ffffff; font-size: 20px; font-weight: 700; background: $success; } + .last-scan.warning .last-scan-icon { background: $warning; } + .last-scan.error .last-scan-icon { background: $danger; } + .last-scan-content { display: flex; min-width: 0; flex: 1; flex-direction: column; } + .last-scan-label { font-size: 12px; font-weight: 700; } + .last-scan-sku { margin-top: 3px; font-size: 17px; font-weight: 800; } + .last-scan-detail { margin-top: 3px; font-size: 12px; line-height: 18px; } + .scan-history { display: flex; flex-direction: column; gap: 4px; margin-top: 8px; } + .scan-history-item { overflow: hidden; color: $text-secondary; font-size: 11px; text-overflow: ellipsis; white-space: nowrap; } + + .progress-section { + margin: 0 12px 10px; + padding: 13px 14px; + border-radius: 12px; + background: $card; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); + } + + .progress-header { + align-items: flex-start; + justify-content: space-between; + gap: 10px; + } + + .progress-title { + font-size: 14px; + font-weight: 700; + } + + .progress-stats { + color: $text-secondary; + font-size: 12px; + text-align: right; + } + + .progress-actions { display: flex; flex-direction: column; align-items: flex-end; gap: 7px; } + .box-tasks-btn { height: 48px; padding: 0 12px; border: 1px solid #cdd9e7; border-radius: 8px; color: #3f5f81; font-size: 12px; line-height: 46px; background: #f7faff; } + + .progress-number { + color: $success; + font-weight: 700; + } + + .progress-bar-bg { + overflow: hidden; + height: 7px; + margin-top: 10px; + border-radius: 999px; + background: #e5e7eb; + } + + .progress-bar-fill { + height: 100%; + border-radius: inherit; + background: $success; + transform-origin: left center; + transition: transform 180ms ease-out; + } + + .pick-list { + margin: 0 12px; + } + + .pick-item { + position: relative; + box-sizing: border-box; + margin-bottom: 10px; + padding: 15px 13px 13px; + border-radius: 12px; + background: $card; + box-shadow: 0 2px 7px rgba(17, 24, 39, 0.08); + } + + .pick-item.pending { + background: #f7fbff; + } + + .pick-item.picked { background: #f1fbf8; } + .pick-item.partial { background: #f2f7ff; } + .pick-item.skipped { background: #f6f7f8; } + + .pick-status-tag { + box-sizing: border-box; + padding: 3px 8px; + border-radius: 6px; + font-size: 12px; + font-weight: 600; + line-height: 16px; + white-space: nowrap; + } + + .tag-picked { color: #067568; background: $success-light; } + .tag-partial { color: #2563c9; background: #dbeafe; } + .tag-skipped { color: $skip; background: #e5e7eb; } + + .pick-item-row1 { + align-items: flex-start; + justify-content: space-between; + gap: 10px; + } + + .pick-item-sku { + flex-shrink: 0; + font-size: 15px; + font-weight: 700; + } + + .pick-item-meta { + display: flex; + max-width: 70%; + min-width: 0; + flex-direction: column; + align-items: flex-end; + gap: 4px; + } + + .pick-item-qty { + max-width: 100%; + font-size: 13px; + line-height: 18px; + text-align: right; + color: $text-secondary; + } + + .qty-number { + color: $text; + font-size: 19px; + font-weight: 700; + } + + .actual-number { + color: #4a7dff; + font-size: 14px; + font-weight: 700; + } + + .pick-item-row2 { + align-items: flex-start; + justify-content: space-between; + gap: 10px; + margin-top: 8px; + } + + .pick-item-desc { + flex: 1; + min-width: 0; + color: $text-secondary; + font-size: 13px; + line-height: 18px; + } + + .pick-item-location { + flex-shrink: 0; + padding: 6px 9px; + border-radius: 5px; + color: #2874c9; + font-size: 16px; + font-weight: 800; + background: #e9f4ff; + } + + .pick-item-actions { + display: grid; + grid-template-columns: 1.15fr 1fr 0.78fr; + gap: 8px; + margin-top: 12px; + } + + .processed-actions { + grid-template-columns: 1fr; + } + + .pick-btn { + height: 48px; + padding: 0 6px; + border-radius: 7px; + font-size: 13px; + font-weight: 600; + line-height: 48px; + } + + .pick-btn-confirm { color: #ffffff; background: $success; } + .pick-btn-partial { border: 1px solid #75a5ef; color: #4a7dff; background: #eef5ff; } + .pick-btn-skip { color: $skip; background: #eef0f3; } + .pick-btn-undo { border: 1px solid #d8dde4; color: $text-secondary; background: #ffffff; } + + .empty-state { + display: flex; + flex-direction: column; + align-items: center; + padding: 40px 20px; + color: $text-secondary; + } + + .empty-state-icon { + font-size: 34px; + } + + .empty-state-text { + margin-top: 10px; + font-size: 14px; + } + + .submit-section { + position: fixed; + z-index: 8; + left: 50%; + bottom: 8px; + display: flex; + align-items: center; + gap: 12px; + box-sizing: border-box; + width: calc(100% - 20px); + max-width: 460px; + padding: 10px 12px; + border: 1px solid #dbe2ea; + border-radius: 14px; + background: #ffffff; + box-shadow: 0 6px 20px rgba(31, 41, 55, 0.16); + transform: translateX(-50%); + } + + .submit-info { + display: flex; + width: 108px; + min-width: 108px; + align-items: flex-start; + flex-direction: column; + justify-content: center; + } + + .submit-pending { white-space: nowrap; } + .submit-pending-number { color: $warning; font-size: 20px; font-weight: 800; } + .submit-pending-label { color: $text-secondary; font-size: 12px; } + .submit-status-hint { display: block; margin-top: 3px; color: #66768a; font-size: 10px; line-height: 14px; } + + .submit-btn { + box-sizing: border-box; + width: auto; + height: 56px; + min-width: 0; + flex: 1; + padding: 0 10px; + border-radius: 10px; + color: #ffffff; + font-size: 15px; + font-weight: 700; + line-height: 56px; + background: $primary; + } + + .submit-btn[disabled] { + color: #8a9099; + background: #e4e6eb; + opacity: 1; + } + + .portal-page { + box-sizing: border-box; + width: 100%; + max-width: 480px; + min-height: 100vh; + margin: 0 auto; + padding-bottom: env(safe-area-inset-bottom, 0px); + background: #f4f7fb; + } + + .portal-header-shell { position: sticky; top: 0; z-index: 30; } + + .portal-header { + box-sizing: border-box; + padding: var(--status-bar-height, 0px) 8px 0; + color: #ffffff; + background: #135ee8; + } + + .portal-header-row { + display: grid; + align-items: center; + grid-template-columns: 48px minmax(0, 1fr) 48px; + } + + .portal-title, + .module-hero-title, + .module-hero-desc, + .operation-name, + .operation-desc, + .summary-number, + .summary-label, + .profile-name, + .profile-role, + .history-empty-title, + .history-empty-desc { + display: block; + } + + .portal-title { overflow: hidden; font-size: 17px; font-weight: 600; line-height: 48px; text-align: center; text-overflow: ellipsis; white-space: nowrap; } + + .portal-header-button { + width: 48px; + height: 48px; + padding: 0; + color: #ffffff; + font-size: 26px; + line-height: 48px; + background: transparent; + } + + .avatar-button { + width: 48px; + height: 48px; + padding: 0; + border: 0; + border-radius: 0; + color: #ffffff; + font-size: 17px; + font-weight: 600; + line-height: 48px; + background: transparent; + } + .portal-header-spacer { width: 48px; height: 48px; } + + .portal-content { padding: 12px 14px 24px; } + + .home-menu { padding: 12px 12px 24px; } + .home-group + .home-group { margin-top: 18px; } + .home-group-title { display: flex; align-items: center; margin-bottom: 10px; color: #445166; font-size: 16px; line-height: 24px; } + .home-group-mark { width: 4px; height: 20px; flex-shrink: 0; margin-right: 10px; background: #1769e8; } + .home-group-disabled .home-group-title { color: #7b8795; } + .home-group-disabled .home-group-mark { background: #aeb8c4; } + .home-operation-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; } + .home-operation { position: relative; display: flex; box-sizing: border-box; min-width: 0; height: 96px; padding: 10px 5px 9px; flex-direction: column; align-items: center; justify-content: center; border: 1px solid #dce3eb; border-radius: 4px; color: #334155; background: #ffffff; } + .home-operation:active { border-color: #9bbcf2; background: #edf4ff; } + .home-operation-primary { border-color: #8cb5f5; color: #135ee8; background: #edf4ff; } + .home-operation-disabled, .home-operation-disabled[disabled] { border-color: #e1e6ec; color: #8b97a5; opacity: 1; background: #f1f3f6; } + .home-operation-disabled:active { border-color: #e1e6ec; background: #f1f3f6; } + .home-operation-icon { display: flex; align-items: center; justify-content: center; width: 44px; height: 44px; font-size: 20px; font-weight: 700; } + .home-operation-name { display: block; width: 100%; margin-top: 3px; overflow: hidden; font-size: 14px; line-height: 20px; text-align: center; text-overflow: ellipsis; white-space: nowrap; } + .home-operation-pending { color: #52657c; font-size: 11px; line-height: 16px; } + .home-operation-unavailable { color: #929dab; font-size: 11px; line-height: 16px; } + + .header-menu-sheet { box-sizing: border-box; width: 100vw; max-width: 480px; } + .header-menu-content { padding-top: 1px; } + .header-menu-title { display: block; margin: 17px 16px 8px; color: #1f2937; font-size: 17px; font-weight: 700; } + .header-menu-item { display: grid; box-sizing: border-box; width: calc(100% - 32px); height: 54px; margin: 0 16px; padding: 0 4px; align-items: center; grid-template-columns: 32px minmax(0, 1fr) 24px; border-bottom: 1px solid #e5e7eb; color: #334155; font-size: 15px; line-height: 54px; text-align: left; background: #ffffff; } + .header-menu-close { box-sizing: border-box; width: calc(100% - 32px); height: 48px; margin: 12px 16px calc(14px + env(safe-area-inset-bottom, 0px)); border-radius: 6px; color: #334155; font-size: 14px; line-height: 48px; background: #eef2f6; } + + .group-title { font-size: 16px; font-weight: 700; } + + .module-hero-icon, .operation-icon { + display: flex; + align-items: center; + justify-content: center; + font-weight: 700; + } + .operation-info { display: flex; min-width: 0; flex: 1; flex-direction: column; margin-left: 11px; } + + .inline-back { height: 48px; padding: 0 4px; color: #42617f; font-size: 13px; line-height: 48px; background: transparent; } + .module-hero { display: flex; align-items: center; margin-top: 5px; padding: 17px; border-radius: 13px; background: #e7f0ff; } + .module-hero-inbound { background: #e1f7f0; } + .module-hero-inventory { background: #fff3da; } + .module-hero-query { background: #f0e9ff; } + .module-hero-icon { width: 52px; height: 52px; flex-shrink: 0; margin-right: 13px; border-radius: 14px; color: #ffffff; font-size: 18px; background: $primary; } + .module-hero-title { font-size: 18px; font-weight: 700; } + .module-hero-desc { margin-top: 4px; color: #617187; font-size: 11px; } + .group-title { display: block; margin: 22px 2px 11px; } + .operation-list { overflow: hidden; border-radius: 12px; background: #ffffff; box-shadow: 0 4px 15px rgba(32, 67, 111, 0.06); } + .operation-item, .history-item { display: flex; align-items: center; box-sizing: border-box; width: 100%; min-height: 72px; padding: 12px; border-bottom: 1px solid #edf0f3; text-align: left; background: #ffffff; } + .operation-item-disabled, .operation-item-disabled[disabled] { color: #8d98a6; opacity: 1; background: #f2f4f6; } + .operation-item-disabled .operation-icon { color: #8b97a5; background: #e3e7eb; } + .operation-item-disabled .operation-desc { color: #929daa; } + .operation-item:last-child, .history-item:last-child { border-bottom: 0; } + .operation-icon { width: 39px; height: 39px; flex-shrink: 0; border-radius: 10px; color: #366cae; font-size: 12px; background: #edf4fd; } + .operation-name { font-size: 13px; font-weight: 700; } + .operation-desc { margin-top: 4px; color: $text-secondary; font-size: 11px; line-height: 17px; } + .operation-count { min-width: 22px; height: 22px; border-radius: 11px; color: #ffffff; font-size: 11px; line-height: 22px; text-align: center; background: $danger; } + .operation-prototype { flex-shrink: 0; padding: 5px 7px; border-radius: 5px; color: #737f8d; font-size: 11px; background: #e1e5e9; } + .operation-arrow { margin-left: 8px; color: #9aa5b1; font-size: 21px; } + .module-empty-note { margin-top: 14px; padding: 12px; border-radius: 9px; color: #758194; font-size: 11px; line-height: 18px; text-align: center; background: #e9eef5; } + + .operation-page { padding-top: 12px; } + .operation-page-title-row, .operation-scan-row, .task-toolbar, .prototype-task-head, .prototype-task-meta, .prototype-task-foot { display: flex; align-items: center; } + .operation-page-title-row { justify-content: space-between; gap: 12px; margin: 7px 2px 14px; } + .operation-page-title, .operation-page-subtitle, .operation-scan-label, .operation-scan-tip, .operation-metric-value, .operation-metric-label, .prototype-task-title { display: block; } + .operation-page-title { font-size: 21px; font-weight: 700; } + .operation-page-subtitle { margin-top: 4px; color: $text-secondary; font-size: 11px; } + .prototype-badge { flex-shrink: 0; padding: 6px 9px; border-radius: 6px; color: #45617f; font-size: 11px; background: #e4edf8; } + .operation-scan-card { padding: 15px; border-radius: 13px; background: #ffffff; box-shadow: 0 4px 15px rgba(32, 67, 111, 0.07); } + .operation-scan-label { margin-bottom: 9px; font-size: 12px; font-weight: 700; } + .operation-scan-row { gap: 8px; } + .operation-scan-input { box-sizing: border-box; height: 48px; min-width: 0; flex: 1; padding: 0 12px; border: 2px solid #8cb7ef; border-radius: 9px; font-size: 13px; background: #fbfdff; } + .operation-scan-button { width: 68px; height: 48px; flex-shrink: 0; border-radius: 9px; color: #ffffff; font-size: 13px; font-weight: 700; line-height: 48px; background: $primary; } + .operation-scan-tip { margin-top: 8px; color: #718095; font-size: 11px; line-height: 17px; } + .operation-metrics { display: grid; grid-template-columns: repeat(3, 1fr); margin-top: 12px; padding: 14px 6px; border-radius: 12px; background: #ffffff; box-shadow: 0 4px 15px rgba(32, 67, 111, 0.06); } + .operation-metric { display: flex; flex-direction: column; align-items: center; border-right: 1px solid $border; } + .operation-metric:last-child { border-right: 0; } + .operation-metric-value { font-size: 22px; font-weight: 700; } + .metric-primary { color: $primary; } + .metric-warning { color: $warning; } + .metric-success { color: $success; } + .operation-metric-label { margin-top: 3px; color: $text-secondary; font-size: 11px; } + .task-toolbar { justify-content: space-between; margin: 20px 2px 10px; } + .operation-group-title { margin: 0; } + .filter-button { height: 48px; padding: 0 14px; border: 1px solid #dbe2ea; border-radius: 8px; color: #52657c; font-size: 12px; line-height: 46px; background: #ffffff; } + .prototype-tabs { display: grid; grid-template-columns: repeat(3, 1fr); margin-bottom: 10px; padding: 3px; border-radius: 9px; background: #e9edf3; } + .prototype-tab { height: 48px; border-radius: 7px; color: #5f7085; font-size: 12px; line-height: 48px; background: transparent; } + .prototype-tab.active { color: $primary; font-weight: 700; background: #ffffff; box-shadow: 0 2px 7px rgba(38, 71, 112, 0.12); } + .prototype-task-list { display: flex; flex-direction: column; gap: 10px; } + .prototype-task-card { padding: 14px; border: 1px solid #e7ebf0; border-radius: 12px; background: #ffffff; box-shadow: 0 4px 13px rgba(32, 67, 111, 0.05); } + .prototype-task-head { justify-content: space-between; gap: 8px; } + .prototype-task-code { color: #45617f; font-size: 11px; } + .prototype-task-status { flex-shrink: 0; padding: 5px 8px; border-radius: 5px; font-size: 11px; } + .status-pending { color: #1f64c8; background: #e2edfc; } + .status-progress { color: #96610b; background: #fff0cf; } + .prototype-task-title { margin-top: 9px; font-size: 14px; font-weight: 700; } + .prototype-task-meta { justify-content: space-between; gap: 8px; margin-top: 7px; color: $text-secondary; font-size: 11px; line-height: 17px; } + .prototype-task-meta text:last-child { text-align: right; } + .prototype-task-foot { justify-content: space-between; margin-top: 13px; padding-top: 11px; border-top: 1px solid #edf0f3; } + .prototype-task-qty { color: #43556b; font-size: 11px; font-weight: 600; } + .prototype-task-action { min-width: 86px; height: 48px; padding: 0 12px; border-radius: 8px; color: #ffffff; font-size: 12px; line-height: 48px; background: $primary; } + .operation-empty { display: flex; flex-direction: column; align-items: center; padding: 42px 16px; border-radius: 12px; background: #ffffff; } + .operation-empty-icon { display: flex; align-items: center; justify-content: center; width: 45px; height: 45px; border-radius: 50%; color: $success; font-size: 21px; background: $success-light; } + + .summary-card { display: grid; grid-template-columns: repeat(2, 1fr); padding: 18px; border-radius: 13px; background: #ffffff; box-shadow: 0 4px 15px rgba(32, 67, 111, 0.07); } + .summary-card > view { display: flex; flex-direction: column; align-items: center; } + .summary-card > view + view { border-left: 1px solid $border; } + .summary-number { color: $success; font-size: 28px; font-weight: 700; } + .summary-number.pending-color { color: $warning; } + .summary-label { margin-top: 3px; color: $text-secondary; font-size: 11px; } + .history-empty { display: flex; flex-direction: column; align-items: center; padding: 48px 18px; border-radius: 12px; color: $text-secondary; background: #ffffff; } + .history-empty-icon { color: #aeb8c4; font-size: 36px; } + .history-empty-title { margin-top: 12px; color: $text; font-size: 14px; font-weight: 600; } + .history-empty-desc { margin-top: 6px; font-size: 11px; } + .history-check { display: flex; align-items: center; justify-content: center; width: 38px; height: 38px; border-radius: 50%; color: #ffffff; background: $success; } + .history-status { flex-shrink: 0; color: $success; font-size: 11px; } + + .profile-content { padding-top: 20px; } + .profile-card { display: flex; align-items: center; padding: 20px 16px; border-radius: 13px; background: #ffffff; box-shadow: 0 4px 15px rgba(32, 67, 111, 0.07); } + .profile-avatar { display: flex; align-items: center; justify-content: center; width: 56px; height: 56px; margin-right: 14px; border-radius: 50%; color: #ffffff; font-size: 21px; font-weight: 700; background: linear-gradient(145deg, #2b82ed, #155dbb); } + .profile-name { font-size: 18px; font-weight: 700; } + .profile-role { margin-top: 5px; color: $text-secondary; font-size: 11px; } + .profile-list { margin-top: 14px; padding: 0 14px; border-radius: 12px; background: #ffffff; } + .profile-row { display: flex; align-items: center; justify-content: space-between; min-height: 52px; border-bottom: 1px solid $border; font-size: 13px; } + .profile-row:last-child { border-bottom: 0; } + .profile-value { color: $text-secondary; font-size: 12px; } + .profile-action, .logout-action { box-sizing: border-box; width: 100%; height: 50px; margin-top: 14px; padding: 0 15px; border-radius: 11px; font-size: 13px; line-height: 50px; text-align: left; background: #ffffff; } + .profile-action { display: flex; justify-content: space-between; color: $text; } + .logout-action { color: $danger; text-align: center; } + .logout-dialog-card { box-sizing: border-box; width: calc(100vw - 48px); max-width: 320px; overflow: hidden; border-radius: 12px; background: #ffffff; box-shadow: 0 18px 50px rgba(0, 0, 0, 0.24); } + .logout-dialog-title { display: block; padding: 24px 22px 0; color: $danger; font-size: 17px; font-weight: 700; text-align: center; } + .logout-dialog-content { display: block; padding: 18px 22px 22px; color: $text-secondary; font-size: 14px; line-height: 22px; } + .logout-dialog-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); border-top: 1px solid $border; } + .logout-dialog-cancel, .logout-dialog-confirm { height: 52px; border-radius: 0; font-size: 15px; line-height: 52px; background: #ffffff; } + .logout-dialog-cancel { color: $text; } + .logout-dialog-confirm { border-left: 1px solid $border; color: $danger; font-weight: 700; } + .logout-dialog-cancel:active, .logout-dialog-confirm:active { background: #f5f7fa; } + + .modal-sheet { + box-sizing: border-box; + width: 100vw; + max-width: 480px; + padding: 20px 18px 18px; + border-radius: 16px 16px 0 0; + background: $card; + box-shadow: 0 -10px 30px rgba(0, 0, 0, 0.16); + } + + .modal-title { + display: block; + margin-bottom: 14px; + font-size: 16px; + font-weight: 700; + text-align: center; + } + + .modal-empty { + padding: 26px 10px; + color: $text-secondary; + font-size: 13px; + text-align: center; + } + + .box-list-item { + justify-content: space-between; + gap: 10px; + margin-bottom: 9px; + padding: 12px; + min-height: 64px; + border-radius: 9px; + } + + .box-list-item-done { background: #effaf7; } + .box-list-item-pending { background: #fff8e7; } + + .box-list-info { + display: flex; + flex: 1; + min-width: 0; + flex-direction: column; + } + + .box-list-number { font-size: 13px; font-weight: 600; } + .box-list-detail { margin-top: 4px; color: $text-secondary; font-size: 12px; line-height: 18px; } + + .box-list-tag { + flex-shrink: 0; + padding: 5px 8px; + border-radius: 6px; + font-size: 12px; + font-weight: 600; + } + + .box-list-tag-done { color: #08786c; background: $success-light; } + .box-list-tag-pending { color: #986407; background: $warning-light; } + + .modal-close-btn { + width: 100%; + height: 48px; + margin-top: 6px; + border: 1px solid $border; + border-radius: 9px; + color: $text-secondary; + font-size: 14px; + line-height: 46px; + background: #ffffff; + } + + .skip-reasons { + display: flex; + flex-direction: column; + gap: 8px; + } + + .skip-reason-btn { + box-sizing: border-box; + width: 100%; + min-height: 48px; + padding: 10px 12px; + border: 1px solid $border; + border-radius: 8px; + color: $text; + font-size: 13px; + line-height: 21px; + text-align: left; + background: #ffffff; + } + + .skip-reason-btn.selected { + border-color: $warning; + color: #8a5a00; + background: $warning-light; + } + + .modal-actions, + .complete-btns { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px; + margin-top: 16px; + } + + .modal-cancel-btn, + .modal-confirm-btn, + .complete-btn-back, + .complete-btn-next { + height: 48px; + border-radius: 9px; + font-size: 14px; + font-weight: 600; + line-height: 48px; + } + + .modal-cancel-btn, + .complete-btn-back { + border: 1px solid $border; + color: $text-secondary; + background: #ffffff; + } + + .modal-confirm-btn, + .complete-btn-next { + color: #ffffff; + background: $primary; + } + + .skip-confirm-btn { background: $warning; } + + .partial-modal-title { font-size: 17px; } + + .partial-info { + display: flex; + flex-direction: column; + padding: 12px; + border-radius: 9px; + background: $primary-light; + } + + .partial-info-sku { color: $primary; font-size: 15px; font-weight: 700; } + .partial-info-desc { margin-top: 4px; color: $text-secondary; font-size: 12px; } + .partial-info-qty { margin-top: 7px; font-size: 13px; } + .partial-info-qty text { font-size: 16px; font-weight: 700; } + + .partial-input-row { + gap: 9px; + margin-top: 14px; + } + + .partial-input-label { + flex-shrink: 0; + font-size: 13px; + } + + .partial-input { + box-sizing: border-box; + flex: 1; + min-width: 0; + height: 48px; + padding: 0 12px; + border: 2px solid $primary; + border-radius: 8px; + font-size: 18px; + font-weight: 700; + text-align: center; + } + + .partial-input-unit { flex-shrink: 0; color: $text-secondary; font-size: 13px; } + + .partial-quick-row { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 8px; + margin-top: 12px; + } + + .partial-quick-btn { + height: 48px; + padding: 0 6px; + border: 1px solid #b9c9df; + border-radius: 7px; + color: #436080; + font-size: 12px; + line-height: 48px; + background: #f4f8fc; + } + + .partial-validation { display: block; margin-top: 10px; color: $danger; font-size: 12px; line-height: 18px; } + .modal-confirm-btn[disabled] { color: #8a9099; background: #e4e6eb; opacity: 1; } + .decision-desc { display: block; color: $text-secondary; font-size: 13px; line-height: 20px; text-align: center; } + .submit-decision-modal { padding: 18px 16px 16px; } + .submit-decision-title { margin-bottom: 8px; text-align: left; } + .submit-decision-desc { text-align: left; } + .submit-decision-actions { margin-top: 14px; } + .decision-summary { display: grid; grid-template-columns: repeat(2, 1fr); margin-top: 14px; padding: 12px; border-radius: 10px; background: #f6f8fb; } + .decision-summary > view { display: flex; flex-direction: column; align-items: center; gap: 3px; color: $text-secondary; font-size: 11px; } + .decision-summary > view + view { border-left: 1px solid $border; } + .decision-number { color: $success; font-size: 24px; font-weight: 800; } + .decision-number.warning { color: $warning; } + .pending-sku-list { display: flex; flex-direction: column; gap: 7px; margin-top: 14px; padding: 12px; border-radius: 9px; color: #4d5d70; font-size: 12px; background: #f6f8fb; } + .decision-label { display: block; margin: 16px 0 8px; font-size: 13px; font-weight: 700; } + .incomplete-reasons { display: flex; flex-direction: column; gap: 8px; } + .incomplete-reason { box-sizing: border-box; min-height: 48px; padding: 10px 12px; border: 1px solid $border; border-radius: 8px; color: $text; font-size: 13px; line-height: 20px; text-align: left; background: #ffffff; } + .incomplete-reason.selected { border-color: $danger; color: #a51d1d; background: $danger-light; } + .danger-confirm { background: $danger; } + .all-complete-btn { width: 100%; height: 48px; margin-top: 20px; border-radius: 9px; color: #ffffff; font-size: 14px; font-weight: 700; line-height: 48px; background: $primary; } + + .complete-modal { + box-sizing: border-box; + width: calc(100vw - 32px); + max-width: 380px; + padding: 24px 18px; + border-radius: 16px; + background: $card; + box-shadow: 0 18px 50px rgba(0, 0, 0, 0.24); + } + + .complete-icon { + display: flex; + align-items: center; + justify-content: center; + width: 54px; + height: 54px; + margin: 0 auto 12px; + border-radius: 50%; + color: #ffffff; + font-size: 30px; + font-weight: 700; + background: $success; + } + + .complete-title, + .complete-desc { + display: block; + text-align: center; + } + + .complete-title { font-size: 20px; font-weight: 700; } + .complete-desc { margin-top: 6px; color: $text-secondary; font-size: 12px; } + + .complete-stats { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 10px 18px; + margin-top: 18px; + padding: 14px 8px; + border-radius: 10px; + background: #f8fafc; + } + + .complete-stat { + display: flex; + min-width: 58px; + flex-direction: column; + align-items: center; + } + + .complete-stat-num { font-size: 22px; font-weight: 700; } + .complete-stat-label { margin-top: 3px; color: $text-secondary; font-size: 11px; } + .green { color: $success; } + .blue { color: #4a7dff; } + .gray { color: $skip; } + .red { color: $danger; } + + .loading-evidence-section { + margin: 8px 12px 92px; + padding: 14px; + border: 1px solid #d8e4f4; + border-radius: 10px; + background: $card; + box-shadow: 0 4px 15px rgba(32, 67, 111, 0.07); + } + .section-heading-row { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; } + .section-title { display: block; color: $text; font-size: 15px; font-weight: 700; } + .section-subtitle { display: block; margin-top: 4px; color: $text-secondary; font-size: 11px; line-height: 17px; } + .sync-state { flex-shrink: 0; padding: 4px 7px; border-radius: 99px; font-size: 11px; background: #eef2f7; } + .sync-state.ready { color: $success; background: #e8f8ef; } + .sync-state.error { color: $danger; background: #fff0f0; } + .sync-state.loading { color: #8a5a00; background: #fff7df; } + .evidence-grid { display: flex; flex-direction: column; margin-top: 12px; } + .evidence-card { margin-bottom: 12px; padding: 10px; border: 1px solid #d7e1ed; border-radius: 9px; background: #f8fafc; } + .evidence-card:last-child { margin-bottom: 0; } + .evidence-card.filled { border-color: #a7d6ba; background: #f4fbf6; } + .evidence-card-header { display: flex; align-items: center; justify-content: space-between; gap: 10px; } + .evidence-card-title { display: flex; min-width: 0; align-items: center; gap: 7px; } + .evidence-label { display: block; color: $text; font-size: 12px; font-weight: 700; } + .evidence-count { padding: 2px 6px; border-radius: 99px; color: $text-secondary; font-size: 10px; line-height: 16px; background: #e9eef5; } + .evidence-count.complete { color: #087443; background: #dff4e7; } + .evidence-photo-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; margin-top: 9px; } + .evidence-photo-item { position: relative; min-width: 0; padding: 4px; border: 1px solid #dbe5ef; border-radius: 8px; background: #ffffff; } + .evidence-thumbnail { display: flex; width: 100%; height: 68px; align-items: center; justify-content: center; border-radius: 6px; color: $text-secondary; font-size: 9px; line-height: 13px; text-align: center; background: #e7edf5; } + .evidence-thumbnail-placeholder { box-sizing: border-box; padding: 6px; } + .evidence-file { display: block; overflow: hidden; margin-top: 4px; padding: 0 2px; color: $text-secondary; font-size: 9px; line-height: 14px; text-overflow: ellipsis; white-space: nowrap; } + .evidence-void-btn { position: absolute; top: 8px; right: 8px; min-width: 40px; height: 40px; padding: 0 7px; border: 0; border-radius: 20px; color: #ffffff; font-size: 10px; line-height: 40px; background: rgba(185, 28, 28, 0.9); } + .evidence-empty-hint { display: block; margin-top: 7px; color: $text-secondary; font-size: 10px; line-height: 15px; } + .evidence-upload-state { display: block; margin-top: 5px; color: $text-secondary; font-size: 10px; line-height: 15px; } + .evidence-upload-state.uploading, .evidence-upload-state.pending { color: #174d91; } + .evidence-upload-state.failed { color: $danger; } + .evidence-upload-state.succeeded { color: $success; } + .evidence-btn { min-height: 40px; margin-top: 8px; padding: 0 9px; border: 1px solid #9db7d9; border-radius: 7px; color: #174d91; font-size: 12px; line-height: 40px; background: #ffffff; } + .evidence-add-btn { flex-shrink: 0; min-width: 78px; min-height: 40px; margin-top: 0; line-height: 40px; } + .evidence-retry-btn { min-height: 40px; margin-top: 6px; padding: 0 9px; border: 1px solid $danger; border-radius: 7px; color: $danger; font-size: 12px; line-height: 40px; background: #fff5f4; } + .seal-row { display: flex; align-items: center; gap: 8px; margin-top: 10px; } + .seal-input { flex: 1; height: 42px; box-sizing: border-box; padding: 0 10px; border: 1px solid $border; border-radius: 7px; font-size: 12px; background: #f8fafc; } + .seal-btn { flex-shrink: 0; margin-top: 0; } + .remote-error { display: block; margin-top: 9px; color: $danger; font-size: 11px; line-height: 17px; } + .loading-complete-btn { width: 100%; min-height: 46px; margin-top: 12px; border-radius: 8px; color: #ffffff; font-size: 13px; font-weight: 700; line-height: 46px; background: $primary; } + .loading-complete-btn[disabled] { color: #8c96a3; background: #e5e9ef; } + .version-hint { display: block; margin-top: 6px; color: $text-secondary; font-size: 10px; line-height: 15px; text-align: center; } + + .app-toast { + position: fixed; + z-index: 30; + top: calc(var(--status-bar-height, 0px) + 70px); + left: 50%; + box-sizing: border-box; + max-width: calc(100% - 40px); + padding: 10px 16px; + border-radius: 8px; + color: #ffffff; + font-size: 13px; + line-height: 20px; + text-align: center; + background: #374151; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2); + transform: translateX(-50%); + } + + .app-toast.success { background: $success; } + .app-toast.warning { background: #b77905; } + .app-toast.error { background: $danger; } + + @media (min-width: 481px) { + .work-page { + box-shadow: 0 0 28px rgba(31, 41, 55, 0.11); + } + } + + @media (max-width: 340px) { + .login-page { padding-right: 16px; padding-left: 16px; } + .header-title { font-size: 18px; } + .box-select-btn { padding: 0 10px; font-size: 12px; } + .pick-item { padding-right: 10px; padding-left: 10px; } + .pick-item-actions { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .pick-btn-confirm { grid-column: 1 / -1; } + .processed-actions { grid-template-columns: 1fr; } + .evidence-photo-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .submit-section { gap: 8px; width: calc(100% - 12px); padding-right: 8px; padding-left: 8px; } + .submit-info { width: 96px; min-width: 96px; } + } diff --git a/src/uni.scss b/src/uni.scss new file mode 100644 index 0000000..c24ca6b --- /dev/null +++ b/src/uni.scss @@ -0,0 +1 @@ +@import '@/uni_modules/uni-scss/variables.scss'; \ No newline at end of file diff --git a/src/uni_modules/uni-badge/changelog.md b/src/uni_modules/uni-badge/changelog.md new file mode 100644 index 0000000..e352c60 --- /dev/null +++ b/src/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/src/uni_modules/uni-badge/components/uni-badge/uni-badge.vue b/src/uni_modules/uni-badge/components/uni-badge/uni-badge.vue new file mode 100644 index 0000000..956354b --- /dev/null +++ b/src/uni_modules/uni-badge/components/uni-badge/uni-badge.vue @@ -0,0 +1,268 @@ + + + + + diff --git a/src/uni_modules/uni-badge/package.json b/src/uni_modules/uni-badge/package.json new file mode 100644 index 0000000..b0bac93 --- /dev/null +++ b/src/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/src/uni_modules/uni-badge/readme.md b/src/uni_modules/uni-badge/readme.md new file mode 100644 index 0000000..bdf175d --- /dev/null +++ b/src/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/src/uni_modules/uni-breadcrumb/changelog.md b/src/uni_modules/uni-breadcrumb/changelog.md new file mode 100644 index 0000000..209e5c5 --- /dev/null +++ b/src/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/src/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue b/src/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue new file mode 100644 index 0000000..420aaf5 --- /dev/null +++ b/src/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue @@ -0,0 +1,126 @@ + + + diff --git a/src/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue b/src/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue new file mode 100644 index 0000000..81fb63e --- /dev/null +++ b/src/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/uni_modules/uni-breadcrumb/package.json b/src/uni_modules/uni-breadcrumb/package.json new file mode 100644 index 0000000..0a04e50 --- /dev/null +++ b/src/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/src/uni_modules/uni-breadcrumb/readme.md b/src/uni_modules/uni-breadcrumb/readme.md new file mode 100644 index 0000000..6976b8d --- /dev/null +++ b/src/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/src/uni_modules/uni-calendar/changelog.md b/src/uni_modules/uni-calendar/changelog.md new file mode 100644 index 0000000..a728bb8 --- /dev/null +++ b/src/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/src/uni_modules/uni-calendar/components/uni-calendar/calendar.js b/src/uni_modules/uni-calendar/components/uni-calendar/calendar.js new file mode 100644 index 0000000..b8d7d6f --- /dev/null +++ b/src/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/src/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json b/src/uni_modules/uni-calendar/components/uni-calendar/i18n/en.json new file mode 100644 index 0000000..fcbd13c --- /dev/null +++ b/src/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/src/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js b/src/uni_modules/uni-calendar/components/uni-calendar/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/src/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/src/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json b/src/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json new file mode 100644 index 0000000..1ca43de --- /dev/null +++ b/src/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/src/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json b/src/uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json new file mode 100644 index 0000000..e0fe33b --- /dev/null +++ b/src/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/src/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue b/src/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue new file mode 100644 index 0000000..a54135e --- /dev/null +++ b/src/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/src/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue b/src/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue new file mode 100644 index 0000000..0beebfb --- /dev/null +++ b/src/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue @@ -0,0 +1,567 @@ + + + + + diff --git a/src/uni_modules/uni-calendar/components/uni-calendar/util.js b/src/uni_modules/uni-calendar/components/uni-calendar/util.js new file mode 100644 index 0000000..5ec8a92 --- /dev/null +++ b/src/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/src/uni_modules/uni-calendar/package.json b/src/uni_modules/uni-calendar/package.json new file mode 100644 index 0000000..bceaed3 --- /dev/null +++ b/src/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/src/uni_modules/uni-calendar/readme.md b/src/uni_modules/uni-calendar/readme.md new file mode 100644 index 0000000..4e1748c --- /dev/null +++ b/src/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/src/uni_modules/uni-card/changelog.md b/src/uni_modules/uni-card/changelog.md new file mode 100644 index 0000000..c3cd8c4 --- /dev/null +++ b/src/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/src/uni_modules/uni-card/components/uni-card/uni-card.vue b/src/uni_modules/uni-card/components/uni-card/uni-card.vue new file mode 100644 index 0000000..38cf594 --- /dev/null +++ b/src/uni_modules/uni-card/components/uni-card/uni-card.vue @@ -0,0 +1,270 @@ + + + + + diff --git a/src/uni_modules/uni-card/package.json b/src/uni_modules/uni-card/package.json new file mode 100644 index 0000000..f16224d --- /dev/null +++ b/src/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/src/uni_modules/uni-card/readme.md b/src/uni_modules/uni-card/readme.md new file mode 100644 index 0000000..7434e71 --- /dev/null +++ b/src/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/src/uni_modules/uni-collapse/changelog.md b/src/uni_modules/uni-collapse/changelog.md new file mode 100644 index 0000000..455308a --- /dev/null +++ b/src/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/src/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue b/src/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue new file mode 100644 index 0000000..2f0862e --- /dev/null +++ b/src/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue @@ -0,0 +1,402 @@ + + + + + diff --git a/src/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue b/src/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue new file mode 100644 index 0000000..384c39a --- /dev/null +++ b/src/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue @@ -0,0 +1,147 @@ + + + diff --git a/src/uni_modules/uni-collapse/package.json b/src/uni_modules/uni-collapse/package.json new file mode 100644 index 0000000..65c5c2e --- /dev/null +++ b/src/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/src/uni_modules/uni-collapse/readme.md b/src/uni_modules/uni-collapse/readme.md new file mode 100644 index 0000000..bc758eb --- /dev/null +++ b/src/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/src/uni_modules/uni-combox/changelog.md b/src/uni_modules/uni-combox/changelog.md new file mode 100644 index 0000000..23c2748 --- /dev/null +++ b/src/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/src/uni_modules/uni-combox/components/uni-combox/uni-combox.vue b/src/uni_modules/uni-combox/components/uni-combox/uni-combox.vue new file mode 100644 index 0000000..d4cb79d --- /dev/null +++ b/src/uni_modules/uni-combox/components/uni-combox/uni-combox.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/src/uni_modules/uni-combox/package.json b/src/uni_modules/uni-combox/package.json new file mode 100644 index 0000000..4a05c3f --- /dev/null +++ b/src/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/src/uni_modules/uni-combox/readme.md b/src/uni_modules/uni-combox/readme.md new file mode 100644 index 0000000..ffa2cc8 --- /dev/null +++ b/src/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/src/uni_modules/uni-countdown/changelog.md b/src/uni_modules/uni-countdown/changelog.md new file mode 100644 index 0000000..16fc324 --- /dev/null +++ b/src/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/src/uni_modules/uni-countdown/components/uni-countdown/i18n/en.json b/src/uni_modules/uni-countdown/components/uni-countdown/i18n/en.json new file mode 100644 index 0000000..06309cb --- /dev/null +++ b/src/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/src/uni_modules/uni-countdown/components/uni-countdown/i18n/index.js b/src/uni_modules/uni-countdown/components/uni-countdown/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/src/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/src/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hans.json b/src/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hans.json new file mode 100644 index 0000000..358cdd1 --- /dev/null +++ b/src/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/src/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hant.json b/src/uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hant.json new file mode 100644 index 0000000..e5a63de --- /dev/null +++ b/src/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/src/uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue b/src/uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue new file mode 100644 index 0000000..1e28dda --- /dev/null +++ b/src/uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue @@ -0,0 +1,281 @@ + + + diff --git a/src/uni_modules/uni-countdown/package.json b/src/uni_modules/uni-countdown/package.json new file mode 100644 index 0000000..6622074 --- /dev/null +++ b/src/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/src/uni_modules/uni-countdown/readme.md b/src/uni_modules/uni-countdown/readme.md new file mode 100644 index 0000000..4bcb1aa --- /dev/null +++ b/src/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/src/uni_modules/uni-data-checkbox/changelog.md b/src/uni_modules/uni-data-checkbox/changelog.md new file mode 100644 index 0000000..b475fcb --- /dev/null +++ b/src/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/src/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue b/src/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue new file mode 100644 index 0000000..81d3f07 --- /dev/null +++ b/src/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue @@ -0,0 +1,849 @@ + + + + + diff --git a/src/uni_modules/uni-data-checkbox/package.json b/src/uni_modules/uni-data-checkbox/package.json new file mode 100644 index 0000000..fc15e8b --- /dev/null +++ b/src/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/src/uni_modules/uni-data-checkbox/readme.md b/src/uni_modules/uni-data-checkbox/readme.md new file mode 100644 index 0000000..6eb253d --- /dev/null +++ b/src/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/src/uni_modules/uni-data-picker/changelog.md b/src/uni_modules/uni-data-picker/changelog.md new file mode 100644 index 0000000..8aaad24 --- /dev/null +++ b/src/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/src/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js b/src/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js new file mode 100644 index 0000000..6ef26a2 --- /dev/null +++ b/src/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/src/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue b/src/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue new file mode 100644 index 0000000..82031e1 --- /dev/null +++ b/src/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue @@ -0,0 +1,380 @@ + + + + + diff --git a/src/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue b/src/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue new file mode 100644 index 0000000..179a4e0 --- /dev/null +++ b/src/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue @@ -0,0 +1,551 @@ + + + + + diff --git a/src/uni_modules/uni-data-picker/components/uni-data-pickerview/loading.uts b/src/uni_modules/uni-data-picker/components/uni-data-pickerview/loading.uts new file mode 100644 index 0000000..baa0dff --- /dev/null +++ b/src/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/src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js b/src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js new file mode 100644 index 0000000..cfae22a --- /dev/null +++ b/src/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/src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts b/src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts new file mode 100644 index 0000000..372795d --- /dev/null +++ b/src/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/src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css b/src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css new file mode 100644 index 0000000..39fe1c3 --- /dev/null +++ b/src/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/src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue b/src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue new file mode 100644 index 0000000..f4780f3 --- /dev/null +++ b/src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue @@ -0,0 +1,69 @@ + + + + + diff --git a/src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue b/src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue new file mode 100644 index 0000000..6ebced9 --- /dev/null +++ b/src/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue @@ -0,0 +1,323 @@ + + + + + diff --git a/src/uni_modules/uni-data-picker/package.json b/src/uni_modules/uni-data-picker/package.json new file mode 100644 index 0000000..a508162 --- /dev/null +++ b/src/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/src/uni_modules/uni-data-picker/readme.md b/src/uni_modules/uni-data-picker/readme.md new file mode 100644 index 0000000..19dd0e8 --- /dev/null +++ b/src/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/src/uni_modules/uni-data-select/changelog.md b/src/uni_modules/uni-data-select/changelog.md new file mode 100644 index 0000000..016e3d2 --- /dev/null +++ b/src/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/src/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue b/src/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue new file mode 100644 index 0000000..edab65a --- /dev/null +++ b/src/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue @@ -0,0 +1,562 @@ + + + + + diff --git a/src/uni_modules/uni-data-select/package.json b/src/uni_modules/uni-data-select/package.json new file mode 100644 index 0000000..5864594 --- /dev/null +++ b/src/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/src/uni_modules/uni-data-select/readme.md b/src/uni_modules/uni-data-select/readme.md new file mode 100644 index 0000000..eb58de3 --- /dev/null +++ b/src/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/src/uni_modules/uni-dateformat/changelog.md b/src/uni_modules/uni-dateformat/changelog.md new file mode 100644 index 0000000..d551d7b --- /dev/null +++ b/src/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/src/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js b/src/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js new file mode 100644 index 0000000..e00d559 --- /dev/null +++ b/src/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/src/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue b/src/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue new file mode 100644 index 0000000..c5ed030 --- /dev/null +++ b/src/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/src/uni_modules/uni-dateformat/package.json b/src/uni_modules/uni-dateformat/package.json new file mode 100644 index 0000000..786a670 --- /dev/null +++ b/src/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/src/uni_modules/uni-dateformat/readme.md b/src/uni_modules/uni-dateformat/readme.md new file mode 100644 index 0000000..37ddb6e --- /dev/null +++ b/src/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/src/uni_modules/uni-datetime-picker/changelog.md b/src/uni_modules/uni-datetime-picker/changelog.md new file mode 100644 index 0000000..8798e93 --- /dev/null +++ b/src/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/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue b/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue new file mode 100644 index 0000000..dba9887 --- /dev/null +++ b/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue b/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue new file mode 100644 index 0000000..0f9e121 --- /dev/null +++ b/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue @@ -0,0 +1,947 @@ + + + + + diff --git a/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json b/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json new file mode 100644 index 0000000..024f22f --- /dev/null +++ b/src/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/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js b/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/src/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/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json b/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json new file mode 100644 index 0000000..d2df5e7 --- /dev/null +++ b/src/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/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json b/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json new file mode 100644 index 0000000..d23fa3c --- /dev/null +++ b/src/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/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue b/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue new file mode 100644 index 0000000..1817692 --- /dev/null +++ b/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue @@ -0,0 +1,940 @@ + + + + + diff --git a/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue b/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue new file mode 100644 index 0000000..11fc45a --- /dev/null +++ b/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue @@ -0,0 +1,1057 @@ + + + + diff --git a/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js b/src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js new file mode 100644 index 0000000..01802fa --- /dev/null +++ b/src/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/src/uni_modules/uni-datetime-picker/package.json b/src/uni_modules/uni-datetime-picker/package.json new file mode 100644 index 0000000..4d1b05c --- /dev/null +++ b/src/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/src/uni_modules/uni-datetime-picker/readme.md b/src/uni_modules/uni-datetime-picker/readme.md new file mode 100644 index 0000000..162fbef --- /dev/null +++ b/src/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/src/uni_modules/uni-drawer/changelog.md b/src/uni_modules/uni-drawer/changelog.md new file mode 100644 index 0000000..6d2488c --- /dev/null +++ b/src/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/src/uni_modules/uni-drawer/components/uni-drawer/keypress.js b/src/uni_modules/uni-drawer/components/uni-drawer/keypress.js new file mode 100644 index 0000000..62dda46 --- /dev/null +++ b/src/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/src/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue b/src/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue new file mode 100644 index 0000000..2471521 --- /dev/null +++ b/src/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/src/uni_modules/uni-drawer/package.json b/src/uni_modules/uni-drawer/package.json new file mode 100644 index 0000000..dd056e4 --- /dev/null +++ b/src/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/src/uni_modules/uni-drawer/readme.md b/src/uni_modules/uni-drawer/readme.md new file mode 100644 index 0000000..dcf6e6b --- /dev/null +++ b/src/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/src/uni_modules/uni-easyinput/changelog.md b/src/uni_modules/uni-easyinput/changelog.md new file mode 100644 index 0000000..6677b07 --- /dev/null +++ b/src/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/src/uni_modules/uni-easyinput/components/uni-easyinput/common.js b/src/uni_modules/uni-easyinput/components/uni-easyinput/common.js new file mode 100644 index 0000000..fde8d3c --- /dev/null +++ b/src/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/src/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue b/src/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue new file mode 100644 index 0000000..d41411b --- /dev/null +++ b/src/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue @@ -0,0 +1,693 @@ + + + + + diff --git a/src/uni_modules/uni-easyinput/package.json b/src/uni_modules/uni-easyinput/package.json new file mode 100644 index 0000000..62bbff5 --- /dev/null +++ b/src/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/src/uni_modules/uni-easyinput/readme.md b/src/uni_modules/uni-easyinput/readme.md new file mode 100644 index 0000000..f1faf8f --- /dev/null +++ b/src/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/src/uni_modules/uni-fab/changelog.md b/src/uni_modules/uni-fab/changelog.md new file mode 100644 index 0000000..9bd4729 --- /dev/null +++ b/src/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/src/uni_modules/uni-fab/components/uni-fab/uni-fab.vue b/src/uni_modules/uni-fab/components/uni-fab/uni-fab.vue new file mode 100644 index 0000000..dfa65c1 --- /dev/null +++ b/src/uni_modules/uni-fab/components/uni-fab/uni-fab.vue @@ -0,0 +1,491 @@ + + + + + diff --git a/src/uni_modules/uni-fab/package.json b/src/uni_modules/uni-fab/package.json new file mode 100644 index 0000000..18c0810 --- /dev/null +++ b/src/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/src/uni_modules/uni-fab/readme.md b/src/uni_modules/uni-fab/readme.md new file mode 100644 index 0000000..9a444e8 --- /dev/null +++ b/src/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/src/uni_modules/uni-fav/changelog.md b/src/uni_modules/uni-fav/changelog.md new file mode 100644 index 0000000..d8a08d4 --- /dev/null +++ b/src/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/src/uni_modules/uni-fav/components/uni-fav/i18n/en.json b/src/uni_modules/uni-fav/components/uni-fav/i18n/en.json new file mode 100644 index 0000000..9a0759e --- /dev/null +++ b/src/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/src/uni_modules/uni-fav/components/uni-fav/i18n/index.js b/src/uni_modules/uni-fav/components/uni-fav/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/src/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/src/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json b/src/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json new file mode 100644 index 0000000..67c89bf --- /dev/null +++ b/src/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json @@ -0,0 +1,4 @@ +{ + "uni-fav.collect": "收藏", + "uni-fav.collected": "已收藏" +} diff --git a/src/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json b/src/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json new file mode 100644 index 0000000..67c89bf --- /dev/null +++ b/src/uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json @@ -0,0 +1,4 @@ +{ + "uni-fav.collect": "收藏", + "uni-fav.collected": "已收藏" +} diff --git a/src/uni_modules/uni-fav/components/uni-fav/uni-fav.vue b/src/uni_modules/uni-fav/components/uni-fav/uni-fav.vue new file mode 100644 index 0000000..d2c58df --- /dev/null +++ b/src/uni_modules/uni-fav/components/uni-fav/uni-fav.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/src/uni_modules/uni-fav/package.json b/src/uni_modules/uni-fav/package.json new file mode 100644 index 0000000..cc14697 --- /dev/null +++ b/src/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/src/uni_modules/uni-fav/readme.md b/src/uni_modules/uni-fav/readme.md new file mode 100644 index 0000000..4de125d --- /dev/null +++ b/src/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/src/uni_modules/uni-file-picker/changelog.md b/src/uni_modules/uni-file-picker/changelog.md new file mode 100644 index 0000000..81e43b9 --- /dev/null +++ b/src/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/src/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js b/src/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js new file mode 100644 index 0000000..9c6bcdf --- /dev/null +++ b/src/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/src/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue b/src/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue new file mode 100644 index 0000000..fb83f63 --- /dev/null +++ b/src/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue @@ -0,0 +1,678 @@ + + + + + diff --git a/src/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue b/src/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue new file mode 100644 index 0000000..625d92e --- /dev/null +++ b/src/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue @@ -0,0 +1,325 @@ + + + + + diff --git a/src/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue b/src/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue new file mode 100644 index 0000000..2a29bc2 --- /dev/null +++ b/src/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue @@ -0,0 +1,292 @@ + + + + + diff --git a/src/uni_modules/uni-file-picker/components/uni-file-picker/utils.js b/src/uni_modules/uni-file-picker/components/uni-file-picker/utils.js new file mode 100644 index 0000000..1bc9259 --- /dev/null +++ b/src/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/src/uni_modules/uni-file-picker/package.json b/src/uni_modules/uni-file-picker/package.json new file mode 100644 index 0000000..004d330 --- /dev/null +++ b/src/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/src/uni_modules/uni-file-picker/readme.md b/src/uni_modules/uni-file-picker/readme.md new file mode 100644 index 0000000..c8399a5 --- /dev/null +++ b/src/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/src/uni_modules/uni-forms/changelog.md b/src/uni_modules/uni-forms/changelog.md new file mode 100644 index 0000000..3d998bc --- /dev/null +++ b/src/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/src/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue b/src/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue new file mode 100644 index 0000000..0aef9cc --- /dev/null +++ b/src/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue @@ -0,0 +1,627 @@ + + + + + diff --git a/src/uni_modules/uni-forms/components/uni-forms/uni-forms.vue b/src/uni_modules/uni-forms/components/uni-forms/uni-forms.vue new file mode 100644 index 0000000..9bb9ae7 --- /dev/null +++ b/src/uni_modules/uni-forms/components/uni-forms/uni-forms.vue @@ -0,0 +1,397 @@ + + + + + diff --git a/src/uni_modules/uni-forms/components/uni-forms/utils.js b/src/uni_modules/uni-forms/components/uni-forms/utils.js new file mode 100644 index 0000000..6da2421 --- /dev/null +++ b/src/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/src/uni_modules/uni-forms/components/uni-forms/validate.js b/src/uni_modules/uni-forms/components/uni-forms/validate.js new file mode 100644 index 0000000..1834c6c --- /dev/null +++ b/src/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/src/uni_modules/uni-forms/package.json b/src/uni_modules/uni-forms/package.json new file mode 100644 index 0000000..464b4e6 --- /dev/null +++ b/src/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/src/uni_modules/uni-forms/readme.md b/src/uni_modules/uni-forms/readme.md new file mode 100644 index 0000000..63d5a04 --- /dev/null +++ b/src/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/src/uni_modules/uni-goods-nav/changelog.md b/src/uni_modules/uni-goods-nav/changelog.md new file mode 100644 index 0000000..c6264c6 --- /dev/null +++ b/src/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/src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json b/src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json new file mode 100644 index 0000000..dcdba41 --- /dev/null +++ b/src/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/src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js b/src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/src/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/src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json b/src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json new file mode 100644 index 0000000..48ee344 --- /dev/null +++ b/src/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/src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json b/src/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json new file mode 100644 index 0000000..d0a0255 --- /dev/null +++ b/src/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/src/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue b/src/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue new file mode 100644 index 0000000..e79a0fa --- /dev/null +++ b/src/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue @@ -0,0 +1,231 @@ + + + + + diff --git a/src/uni_modules/uni-goods-nav/package.json b/src/uni_modules/uni-goods-nav/package.json new file mode 100644 index 0000000..636e45e --- /dev/null +++ b/src/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/src/uni_modules/uni-goods-nav/readme.md b/src/uni_modules/uni-goods-nav/readme.md new file mode 100644 index 0000000..07df93f --- /dev/null +++ b/src/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/src/uni_modules/uni-grid/changelog.md b/src/uni_modules/uni-grid/changelog.md new file mode 100644 index 0000000..d301166 --- /dev/null +++ b/src/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/src/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue b/src/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue new file mode 100644 index 0000000..19c08d7 --- /dev/null +++ b/src/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/src/uni_modules/uni-grid/components/uni-grid/uni-grid.vue b/src/uni_modules/uni-grid/components/uni-grid/uni-grid.vue new file mode 100644 index 0000000..0edc7ff --- /dev/null +++ b/src/uni_modules/uni-grid/components/uni-grid/uni-grid.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/src/uni_modules/uni-grid/package.json b/src/uni_modules/uni-grid/package.json new file mode 100644 index 0000000..ccb2c91 --- /dev/null +++ b/src/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/src/uni_modules/uni-grid/readme.md b/src/uni_modules/uni-grid/readme.md new file mode 100644 index 0000000..0aa44cc --- /dev/null +++ b/src/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/src/uni_modules/uni-group/changelog.md b/src/uni_modules/uni-group/changelog.md new file mode 100644 index 0000000..a7024fd --- /dev/null +++ b/src/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/src/uni_modules/uni-group/components/uni-group/uni-group.vue b/src/uni_modules/uni-group/components/uni-group/uni-group.vue new file mode 100644 index 0000000..3425ecd --- /dev/null +++ b/src/uni_modules/uni-group/components/uni-group/uni-group.vue @@ -0,0 +1,134 @@ + + + + diff --git a/src/uni_modules/uni-group/package.json b/src/uni_modules/uni-group/package.json new file mode 100644 index 0000000..ea00a08 --- /dev/null +++ b/src/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/src/uni_modules/uni-group/readme.md b/src/uni_modules/uni-group/readme.md new file mode 100644 index 0000000..bae67f4 --- /dev/null +++ b/src/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/src/uni_modules/uni-icons/changelog.md b/src/uni_modules/uni-icons/changelog.md new file mode 100644 index 0000000..620ab02 --- /dev/null +++ b/src/uni_modules/uni-icons/changelog.md @@ -0,0 +1,40 @@ +## 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/src/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue b/src/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue new file mode 100644 index 0000000..398678e --- /dev/null +++ b/src/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/uni_modules/uni-icons/components/uni-icons/uni-icons.vue b/src/uni_modules/uni-icons/components/uni-icons/uni-icons.vue new file mode 100644 index 0000000..7da5356 --- /dev/null +++ b/src/uni_modules/uni-icons/components/uni-icons/uni-icons.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/src/uni_modules/uni-icons/components/uni-icons/uniicons.css b/src/uni_modules/uni-icons/components/uni-icons/uniicons.css new file mode 100644 index 0000000..0a6b6fe --- /dev/null +++ b/src/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/src/uni_modules/uni-icons/components/uni-icons/uniicons.ttf b/src/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/src/uni_modules/uni-icons/components/uni-icons/uniicons_file.ts b/src/uni_modules/uni-icons/components/uni-icons/uniicons_file.ts new file mode 100644 index 0000000..98e93aa --- /dev/null +++ b/src/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/src/uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js b/src/uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js new file mode 100644 index 0000000..1cd11e1 --- /dev/null +++ b/src/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/src/uni_modules/uni-icons/package.json b/src/uni_modules/uni-icons/package.json new file mode 100644 index 0000000..397be83 --- /dev/null +++ b/src/uni_modules/uni-icons/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-icons", + "displayName": "uni-icons 图标", + "version": "2.0.9", + "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" + }, + "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/src/uni_modules/uni-icons/readme.md b/src/uni_modules/uni-icons/readme.md new file mode 100644 index 0000000..86234ba --- /dev/null +++ b/src/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/src/uni_modules/uni-indexed-list/changelog.md b/src/uni_modules/uni-indexed-list/changelog.md new file mode 100644 index 0000000..08fa71c --- /dev/null +++ b/src/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/src/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue b/src/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue new file mode 100644 index 0000000..19284bd --- /dev/null +++ b/src/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/src/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue b/src/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue new file mode 100644 index 0000000..ee3a7ec --- /dev/null +++ b/src/uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue @@ -0,0 +1,367 @@ + + + diff --git a/src/uni_modules/uni-indexed-list/package.json b/src/uni_modules/uni-indexed-list/package.json new file mode 100644 index 0000000..125c0e7 --- /dev/null +++ b/src/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/src/uni_modules/uni-indexed-list/readme.md b/src/uni_modules/uni-indexed-list/readme.md new file mode 100644 index 0000000..44ad84b --- /dev/null +++ b/src/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/src/uni_modules/uni-link/changelog.md b/src/uni_modules/uni-link/changelog.md new file mode 100644 index 0000000..2cfbf59 --- /dev/null +++ b/src/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/src/uni_modules/uni-link/components/uni-link/uni-link.vue b/src/uni_modules/uni-link/components/uni-link/uni-link.vue new file mode 100644 index 0000000..27c5468 --- /dev/null +++ b/src/uni_modules/uni-link/components/uni-link/uni-link.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/src/uni_modules/uni-link/package.json b/src/uni_modules/uni-link/package.json new file mode 100644 index 0000000..77b1986 --- /dev/null +++ b/src/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/src/uni_modules/uni-link/readme.md b/src/uni_modules/uni-link/readme.md new file mode 100644 index 0000000..7f09e94 --- /dev/null +++ b/src/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/src/uni_modules/uni-list/changelog.md b/src/uni_modules/uni-list/changelog.md new file mode 100644 index 0000000..8254a18 --- /dev/null +++ b/src/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/src/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue b/src/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue new file mode 100644 index 0000000..b9349c2 --- /dev/null +++ b/src/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/src/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss b/src/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss new file mode 100644 index 0000000..311f8d9 --- /dev/null +++ b/src/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/src/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue b/src/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue new file mode 100644 index 0000000..d49fd7c --- /dev/null +++ b/src/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue @@ -0,0 +1,593 @@ + + + + + diff --git a/src/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue b/src/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue new file mode 100644 index 0000000..6402508 --- /dev/null +++ b/src/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/src/uni_modules/uni-list/components/uni-list/uni-list.vue b/src/uni_modules/uni-list/components/uni-list/uni-list.vue new file mode 100644 index 0000000..6ef5972 --- /dev/null +++ b/src/uni_modules/uni-list/components/uni-list/uni-list.vue @@ -0,0 +1,123 @@ + + + + diff --git a/src/uni_modules/uni-list/components/uni-list/uni-refresh.vue b/src/uni_modules/uni-list/components/uni-list/uni-refresh.vue new file mode 100644 index 0000000..3b4c5a2 --- /dev/null +++ b/src/uni_modules/uni-list/components/uni-list/uni-refresh.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/src/uni_modules/uni-list/components/uni-list/uni-refresh.wxs b/src/uni_modules/uni-list/components/uni-list/uni-refresh.wxs new file mode 100644 index 0000000..818a6b7 --- /dev/null +++ b/src/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/src/uni_modules/uni-list/package.json b/src/uni_modules/uni-list/package.json new file mode 100644 index 0000000..8350efc --- /dev/null +++ b/src/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/src/uni_modules/uni-list/readme.md b/src/uni_modules/uni-list/readme.md new file mode 100644 index 0000000..32c2865 --- /dev/null +++ b/src/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/src/uni_modules/uni-load-more/changelog.md b/src/uni_modules/uni-load-more/changelog.md new file mode 100644 index 0000000..8f03f1d --- /dev/null +++ b/src/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/src/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json b/src/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json new file mode 100644 index 0000000..a4f14a5 --- /dev/null +++ b/src/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/src/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js b/src/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/src/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/src/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json b/src/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json new file mode 100644 index 0000000..f15d510 --- /dev/null +++ b/src/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/src/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json b/src/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json new file mode 100644 index 0000000..a255c6d --- /dev/null +++ b/src/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/src/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue b/src/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue new file mode 100644 index 0000000..e5eff4d --- /dev/null +++ b/src/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue @@ -0,0 +1,399 @@ + + + + + diff --git a/src/uni_modules/uni-load-more/package.json b/src/uni_modules/uni-load-more/package.json new file mode 100644 index 0000000..2fa6f04 --- /dev/null +++ b/src/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/src/uni_modules/uni-load-more/readme.md b/src/uni_modules/uni-load-more/readme.md new file mode 100644 index 0000000..54dc1fa --- /dev/null +++ b/src/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/src/uni_modules/uni-nav-bar/changelog.md b/src/uni_modules/uni-nav-bar/changelog.md new file mode 100644 index 0000000..0f9a2f1 --- /dev/null +++ b/src/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/src/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue b/src/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue new file mode 100644 index 0000000..46806c1 --- /dev/null +++ b/src/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue @@ -0,0 +1,357 @@ + + + + + diff --git a/src/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue b/src/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue new file mode 100644 index 0000000..4ac73ae --- /dev/null +++ b/src/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/uni_modules/uni-nav-bar/package.json b/src/uni_modules/uni-nav-bar/package.json new file mode 100644 index 0000000..240ae95 --- /dev/null +++ b/src/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/src/uni_modules/uni-nav-bar/readme.md b/src/uni_modules/uni-nav-bar/readme.md new file mode 100644 index 0000000..3934b32 --- /dev/null +++ b/src/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/src/uni_modules/uni-notice-bar/changelog.md b/src/uni_modules/uni-notice-bar/changelog.md new file mode 100644 index 0000000..ce50674 --- /dev/null +++ b/src/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/src/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue b/src/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue new file mode 100644 index 0000000..47fb9b3 --- /dev/null +++ b/src/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue @@ -0,0 +1,431 @@ + + + + + diff --git a/src/uni_modules/uni-notice-bar/package.json b/src/uni_modules/uni-notice-bar/package.json new file mode 100644 index 0000000..1e9762c --- /dev/null +++ b/src/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/src/uni_modules/uni-notice-bar/readme.md b/src/uni_modules/uni-notice-bar/readme.md new file mode 100644 index 0000000..fb2ede2 --- /dev/null +++ b/src/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/src/uni_modules/uni-number-box/changelog.md b/src/uni_modules/uni-number-box/changelog.md new file mode 100644 index 0000000..adf9221 --- /dev/null +++ b/src/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/src/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue b/src/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue new file mode 100644 index 0000000..4e203cc --- /dev/null +++ b/src/uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue @@ -0,0 +1,232 @@ + + + diff --git a/src/uni_modules/uni-number-box/package.json b/src/uni_modules/uni-number-box/package.json new file mode 100644 index 0000000..4ac9047 --- /dev/null +++ b/src/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/src/uni_modules/uni-number-box/readme.md b/src/uni_modules/uni-number-box/readme.md new file mode 100644 index 0000000..affc56f --- /dev/null +++ b/src/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/src/uni_modules/uni-pagination/changelog.md b/src/uni_modules/uni-pagination/changelog.md new file mode 100644 index 0000000..2e94adc --- /dev/null +++ b/src/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/src/uni_modules/uni-pagination/components/uni-pagination/i18n/en.json b/src/uni_modules/uni-pagination/components/uni-pagination/i18n/en.json new file mode 100644 index 0000000..d6e2897 --- /dev/null +++ b/src/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/src/uni_modules/uni-pagination/components/uni-pagination/i18n/es.json b/src/uni_modules/uni-pagination/components/uni-pagination/i18n/es.json new file mode 100644 index 0000000..604a113 --- /dev/null +++ b/src/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": "Art¨ªculo/P¨¢gina" +} diff --git a/src/uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json b/src/uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json new file mode 100644 index 0000000..a7a0c77 --- /dev/null +++ b/src/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/src/uni_modules/uni-pagination/components/uni-pagination/i18n/index.js b/src/uni_modules/uni-pagination/components/uni-pagination/i18n/index.js new file mode 100644 index 0000000..2469dd0 --- /dev/null +++ b/src/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/src/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json b/src/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json new file mode 100644 index 0000000..782bbe4 --- /dev/null +++ b/src/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/src/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json b/src/uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json new file mode 100644 index 0000000..180fddb --- /dev/null +++ b/src/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/src/uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue b/src/uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue new file mode 100644 index 0000000..5305b5f --- /dev/null +++ b/src/uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue @@ -0,0 +1,465 @@ + + + + + diff --git a/src/uni_modules/uni-pagination/package.json b/src/uni_modules/uni-pagination/package.json new file mode 100644 index 0000000..862d5ab --- /dev/null +++ b/src/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/src/uni_modules/uni-pagination/readme.md b/src/uni_modules/uni-pagination/readme.md new file mode 100644 index 0000000..97ea1d6 --- /dev/null +++ b/src/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/src/uni_modules/uni-popup/changelog.md b/src/uni_modules/uni-popup/changelog.md new file mode 100644 index 0000000..decd775 --- /dev/null +++ b/src/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/src/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js b/src/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js new file mode 100644 index 0000000..6ef26a2 --- /dev/null +++ b/src/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/src/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue b/src/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue new file mode 100644 index 0000000..08707d4 --- /dev/null +++ b/src/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue @@ -0,0 +1,316 @@ + + + + + diff --git a/src/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue b/src/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue new file mode 100644 index 0000000..91370a8 --- /dev/null +++ b/src/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue @@ -0,0 +1,143 @@ + + + + diff --git a/src/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue b/src/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue new file mode 100644 index 0000000..f7e667c --- /dev/null +++ b/src/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue @@ -0,0 +1,187 @@ + + + + diff --git a/src/uni_modules/uni-popup/components/uni-popup/i18n/en.json b/src/uni_modules/uni-popup/components/uni-popup/i18n/en.json new file mode 100644 index 0000000..7f1bd06 --- /dev/null +++ b/src/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/src/uni_modules/uni-popup/components/uni-popup/i18n/index.js b/src/uni_modules/uni-popup/components/uni-popup/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/src/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/src/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json b/src/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json new file mode 100644 index 0000000..5e3003c --- /dev/null +++ b/src/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/src/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json b/src/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json new file mode 100644 index 0000000..13e39eb --- /dev/null +++ b/src/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/src/uni_modules/uni-popup/components/uni-popup/keypress.js b/src/uni_modules/uni-popup/components/uni-popup/keypress.js new file mode 100644 index 0000000..62dda46 --- /dev/null +++ b/src/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/src/uni_modules/uni-popup/components/uni-popup/popup.js b/src/uni_modules/uni-popup/components/uni-popup/popup.js new file mode 100644 index 0000000..c4e5781 --- /dev/null +++ b/src/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/src/uni_modules/uni-popup/components/uni-popup/uni-popup.uvue b/src/uni_modules/uni-popup/components/uni-popup/uni-popup.uvue new file mode 100644 index 0000000..5eb8d5b --- /dev/null +++ b/src/uni_modules/uni-popup/components/uni-popup/uni-popup.uvue @@ -0,0 +1,90 @@ + + + + + \ No newline at end of file diff --git a/src/uni_modules/uni-popup/components/uni-popup/uni-popup.vue b/src/uni_modules/uni-popup/components/uni-popup/uni-popup.vue new file mode 100644 index 0000000..8349e99 --- /dev/null +++ b/src/uni_modules/uni-popup/components/uni-popup/uni-popup.vue @@ -0,0 +1,503 @@ + + + + diff --git a/src/uni_modules/uni-popup/package.json b/src/uni_modules/uni-popup/package.json new file mode 100644 index 0000000..3cfa384 --- /dev/null +++ b/src/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/src/uni_modules/uni-popup/readme.md b/src/uni_modules/uni-popup/readme.md new file mode 100644 index 0000000..fdad4b3 --- /dev/null +++ b/src/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/src/uni_modules/uni-rate/changelog.md b/src/uni_modules/uni-rate/changelog.md new file mode 100644 index 0000000..8a98a61 --- /dev/null +++ b/src/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/src/uni_modules/uni-rate/components/uni-rate/uni-rate.vue b/src/uni_modules/uni-rate/components/uni-rate/uni-rate.vue new file mode 100644 index 0000000..857f5f9 --- /dev/null +++ b/src/uni_modules/uni-rate/components/uni-rate/uni-rate.vue @@ -0,0 +1,361 @@ + + + + + diff --git a/src/uni_modules/uni-rate/package.json b/src/uni_modules/uni-rate/package.json new file mode 100644 index 0000000..64e8e33 --- /dev/null +++ b/src/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/src/uni_modules/uni-rate/readme.md b/src/uni_modules/uni-rate/readme.md new file mode 100644 index 0000000..eae7b5c --- /dev/null +++ b/src/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/src/uni_modules/uni-row/changelog.md b/src/uni_modules/uni-row/changelog.md new file mode 100644 index 0000000..5b465bc --- /dev/null +++ b/src/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/src/uni_modules/uni-row/components/uni-col/uni-col.vue b/src/uni_modules/uni-row/components/uni-col/uni-col.vue new file mode 100644 index 0000000..84e2deb --- /dev/null +++ b/src/uni_modules/uni-row/components/uni-col/uni-col.vue @@ -0,0 +1,317 @@ + + + + + diff --git a/src/uni_modules/uni-row/components/uni-row/uni-row.vue b/src/uni_modules/uni-row/components/uni-row/uni-row.vue new file mode 100644 index 0000000..f8e8542 --- /dev/null +++ b/src/uni_modules/uni-row/components/uni-row/uni-row.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/src/uni_modules/uni-row/package.json b/src/uni_modules/uni-row/package.json new file mode 100644 index 0000000..3f52fa6 --- /dev/null +++ b/src/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/src/uni_modules/uni-row/readme.md b/src/uni_modules/uni-row/readme.md new file mode 100644 index 0000000..3c9c8b9 --- /dev/null +++ b/src/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/src/uni_modules/uni-scss/changelog.md b/src/uni_modules/uni-scss/changelog.md new file mode 100644 index 0000000..b863bb0 --- /dev/null +++ b/src/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/src/uni_modules/uni-scss/index.scss b/src/uni_modules/uni-scss/index.scss new file mode 100644 index 0000000..1744a5f --- /dev/null +++ b/src/uni_modules/uni-scss/index.scss @@ -0,0 +1 @@ +@import './styles/index.scss'; diff --git a/src/uni_modules/uni-scss/package.json b/src/uni_modules/uni-scss/package.json new file mode 100644 index 0000000..7cc0ccb --- /dev/null +++ b/src/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/src/uni_modules/uni-scss/readme.md b/src/uni_modules/uni-scss/readme.md new file mode 100644 index 0000000..b7d1c25 --- /dev/null +++ b/src/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/src/uni_modules/uni-scss/styles/index.scss b/src/uni_modules/uni-scss/styles/index.scss new file mode 100644 index 0000000..ffac4fe --- /dev/null +++ b/src/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/src/uni_modules/uni-scss/styles/setting/_border.scss b/src/uni_modules/uni-scss/styles/setting/_border.scss new file mode 100644 index 0000000..12a11c3 --- /dev/null +++ b/src/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/src/uni_modules/uni-scss/styles/setting/_color.scss b/src/uni_modules/uni-scss/styles/setting/_color.scss new file mode 100644 index 0000000..1ededd9 --- /dev/null +++ b/src/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/src/uni_modules/uni-scss/styles/setting/_radius.scss b/src/uni_modules/uni-scss/styles/setting/_radius.scss new file mode 100644 index 0000000..9a0428b --- /dev/null +++ b/src/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/src/uni_modules/uni-scss/styles/setting/_space.scss b/src/uni_modules/uni-scss/styles/setting/_space.scss new file mode 100644 index 0000000..3c89528 --- /dev/null +++ b/src/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/src/uni_modules/uni-scss/styles/setting/_styles.scss b/src/uni_modules/uni-scss/styles/setting/_styles.scss new file mode 100644 index 0000000..689afec --- /dev/null +++ b/src/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/src/uni_modules/uni-scss/styles/setting/_text.scss b/src/uni_modules/uni-scss/styles/setting/_text.scss new file mode 100644 index 0000000..a34d08f --- /dev/null +++ b/src/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/src/uni_modules/uni-scss/styles/setting/_variables.scss b/src/uni_modules/uni-scss/styles/setting/_variables.scss new file mode 100644 index 0000000..557d3d7 --- /dev/null +++ b/src/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/src/uni_modules/uni-scss/styles/tools/functions.scss b/src/uni_modules/uni-scss/styles/tools/functions.scss new file mode 100644 index 0000000..ac6f63e --- /dev/null +++ b/src/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/src/uni_modules/uni-scss/theme.scss b/src/uni_modules/uni-scss/theme.scss new file mode 100644 index 0000000..80ee62f --- /dev/null +++ b/src/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/src/uni_modules/uni-scss/variables.scss b/src/uni_modules/uni-scss/variables.scss new file mode 100644 index 0000000..1c062d4 --- /dev/null +++ b/src/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/src/uni_modules/uni-search-bar/changelog.md b/src/uni_modules/uni-search-bar/changelog.md new file mode 100644 index 0000000..2c6571c --- /dev/null +++ b/src/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/src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json b/src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json new file mode 100644 index 0000000..dd083a5 --- /dev/null +++ b/src/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/src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js b/src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/src/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/src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json b/src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json new file mode 100644 index 0000000..d2a1ced --- /dev/null +++ b/src/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/src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json b/src/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json new file mode 100644 index 0000000..f1c96bc --- /dev/null +++ b/src/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/src/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue b/src/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue new file mode 100644 index 0000000..6b9b9c1 --- /dev/null +++ b/src/uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue @@ -0,0 +1,309 @@ + + + + + diff --git a/src/uni_modules/uni-search-bar/package.json b/src/uni_modules/uni-search-bar/package.json new file mode 100644 index 0000000..1730d9d --- /dev/null +++ b/src/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/src/uni_modules/uni-search-bar/readme.md b/src/uni_modules/uni-search-bar/readme.md new file mode 100644 index 0000000..253092f --- /dev/null +++ b/src/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/src/uni_modules/uni-section/changelog.md b/src/uni_modules/uni-section/changelog.md new file mode 100644 index 0000000..738f2b3 --- /dev/null +++ b/src/uni_modules/uni-section/changelog.md @@ -0,0 +1,2 @@ +## 0.0.1(2022-07-22) +- 初始化 diff --git a/src/uni_modules/uni-section/components/uni-section/uni-section.vue b/src/uni_modules/uni-section/components/uni-section/uni-section.vue new file mode 100644 index 0000000..9a52e0b --- /dev/null +++ b/src/uni_modules/uni-section/components/uni-section/uni-section.vue @@ -0,0 +1,167 @@ + + + + diff --git a/src/uni_modules/uni-section/package.json b/src/uni_modules/uni-section/package.json new file mode 100644 index 0000000..0a31fb5 --- /dev/null +++ b/src/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/src/uni_modules/uni-section/readme.md b/src/uni_modules/uni-section/readme.md new file mode 100644 index 0000000..d47faab --- /dev/null +++ b/src/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/src/uni_modules/uni-segmented-control/changelog.md b/src/uni_modules/uni-segmented-control/changelog.md new file mode 100644 index 0000000..02d0c8a --- /dev/null +++ b/src/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/src/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue b/src/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue new file mode 100644 index 0000000..a69366a --- /dev/null +++ b/src/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/src/uni_modules/uni-segmented-control/package.json b/src/uni_modules/uni-segmented-control/package.json new file mode 100644 index 0000000..49f9eff --- /dev/null +++ b/src/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/src/uni_modules/uni-segmented-control/readme.md b/src/uni_modules/uni-segmented-control/readme.md new file mode 100644 index 0000000..3527b03 --- /dev/null +++ b/src/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/src/uni_modules/uni-steps/changelog.md b/src/uni_modules/uni-steps/changelog.md new file mode 100644 index 0000000..04367d8 --- /dev/null +++ b/src/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/src/uni_modules/uni-steps/components/uni-steps/uni-steps.vue b/src/uni_modules/uni-steps/components/uni-steps/uni-steps.vue new file mode 100644 index 0000000..81017fc --- /dev/null +++ b/src/uni_modules/uni-steps/components/uni-steps/uni-steps.vue @@ -0,0 +1,280 @@ + + + + + diff --git a/src/uni_modules/uni-steps/package.json b/src/uni_modules/uni-steps/package.json new file mode 100644 index 0000000..4145ce9 --- /dev/null +++ b/src/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/src/uni_modules/uni-steps/readme.md b/src/uni_modules/uni-steps/readme.md new file mode 100644 index 0000000..da7a4bf --- /dev/null +++ b/src/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/src/uni_modules/uni-swipe-action/changelog.md b/src/uni_modules/uni-swipe-action/changelog.md new file mode 100644 index 0000000..e28472f --- /dev/null +++ b/src/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/src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js b/src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js new file mode 100644 index 0000000..707e432 --- /dev/null +++ b/src/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/src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js b/src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js new file mode 100644 index 0000000..917cb48 --- /dev/null +++ b/src/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/src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js b/src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js new file mode 100644 index 0000000..35c796b --- /dev/null +++ b/src/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/src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js b/src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js new file mode 100644 index 0000000..d389bce --- /dev/null +++ b/src/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/src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js b/src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js new file mode 100644 index 0000000..08de1c9 --- /dev/null +++ b/src/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/src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js b/src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js new file mode 100644 index 0000000..78f0ec6 --- /dev/null +++ b/src/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/src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue b/src/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/src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue @@ -0,0 +1,348 @@ + + + + + + diff --git a/src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs b/src/uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs new file mode 100644 index 0000000..b394244 --- /dev/null +++ b/src/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/src/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue b/src/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue new file mode 100644 index 0000000..4971782 --- /dev/null +++ b/src/uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/src/uni_modules/uni-swipe-action/package.json b/src/uni_modules/uni-swipe-action/package.json new file mode 100644 index 0000000..fc5dd8a --- /dev/null +++ b/src/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/src/uni_modules/uni-swipe-action/readme.md b/src/uni_modules/uni-swipe-action/readme.md new file mode 100644 index 0000000..93a5cac --- /dev/null +++ b/src/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/src/uni_modules/uni-swiper-dot/changelog.md b/src/uni_modules/uni-swiper-dot/changelog.md new file mode 100644 index 0000000..85cf54d --- /dev/null +++ b/src/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/src/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue b/src/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue new file mode 100644 index 0000000..e66b6c7 --- /dev/null +++ b/src/uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue @@ -0,0 +1,218 @@ + + + + + diff --git a/src/uni_modules/uni-swiper-dot/package.json b/src/uni_modules/uni-swiper-dot/package.json new file mode 100644 index 0000000..f2dd8d2 --- /dev/null +++ b/src/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/src/uni_modules/uni-swiper-dot/readme.md b/src/uni_modules/uni-swiper-dot/readme.md new file mode 100644 index 0000000..7d397e2 --- /dev/null +++ b/src/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/src/uni_modules/uni-table/changelog.md b/src/uni_modules/uni-table/changelog.md new file mode 100644 index 0000000..842211c --- /dev/null +++ b/src/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/src/uni_modules/uni-table/components/uni-table/uni-table.vue b/src/uni_modules/uni-table/components/uni-table/uni-table.vue new file mode 100644 index 0000000..21d9527 --- /dev/null +++ b/src/uni_modules/uni-table/components/uni-table/uni-table.vue @@ -0,0 +1,455 @@ + + + + + diff --git a/src/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue b/src/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue new file mode 100644 index 0000000..fbe1bdc --- /dev/null +++ b/src/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/uni_modules/uni-table/components/uni-td/uni-td.vue b/src/uni_modules/uni-table/components/uni-td/uni-td.vue new file mode 100644 index 0000000..9ce93e9 --- /dev/null +++ b/src/uni_modules/uni-table/components/uni-td/uni-td.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/src/uni_modules/uni-table/components/uni-th/filter-dropdown.vue b/src/uni_modules/uni-table/components/uni-th/filter-dropdown.vue new file mode 100644 index 0000000..df22a71 --- /dev/null +++ b/src/uni_modules/uni-table/components/uni-th/filter-dropdown.vue @@ -0,0 +1,511 @@ + + + + + diff --git a/src/uni_modules/uni-table/components/uni-th/uni-th.vue b/src/uni_modules/uni-table/components/uni-th/uni-th.vue new file mode 100644 index 0000000..14889dd --- /dev/null +++ b/src/uni_modules/uni-table/components/uni-th/uni-th.vue @@ -0,0 +1,285 @@ + + + + + diff --git a/src/uni_modules/uni-table/components/uni-thead/uni-thead.vue b/src/uni_modules/uni-table/components/uni-thead/uni-thead.vue new file mode 100644 index 0000000..53b5c4c --- /dev/null +++ b/src/uni_modules/uni-table/components/uni-thead/uni-thead.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/src/uni_modules/uni-table/components/uni-tr/table-checkbox.vue b/src/uni_modules/uni-table/components/uni-tr/table-checkbox.vue new file mode 100644 index 0000000..1089187 --- /dev/null +++ b/src/uni_modules/uni-table/components/uni-tr/table-checkbox.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/src/uni_modules/uni-table/components/uni-tr/uni-tr.vue b/src/uni_modules/uni-table/components/uni-tr/uni-tr.vue new file mode 100644 index 0000000..3fb76f4 --- /dev/null +++ b/src/uni_modules/uni-table/components/uni-tr/uni-tr.vue @@ -0,0 +1,184 @@ + + + + + diff --git a/src/uni_modules/uni-table/i18n/en.json b/src/uni_modules/uni-table/i18n/en.json new file mode 100644 index 0000000..e32023c --- /dev/null +++ b/src/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/src/uni_modules/uni-table/i18n/es.json b/src/uni_modules/uni-table/i18n/es.json new file mode 100644 index 0000000..9afd04b --- /dev/null +++ b/src/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/src/uni_modules/uni-table/i18n/fr.json b/src/uni_modules/uni-table/i18n/fr.json new file mode 100644 index 0000000..b006237 --- /dev/null +++ b/src/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/src/uni_modules/uni-table/i18n/index.js b/src/uni_modules/uni-table/i18n/index.js new file mode 100644 index 0000000..2469dd0 --- /dev/null +++ b/src/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/src/uni_modules/uni-table/i18n/zh-Hans.json b/src/uni_modules/uni-table/i18n/zh-Hans.json new file mode 100644 index 0000000..862af17 --- /dev/null +++ b/src/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/src/uni_modules/uni-table/i18n/zh-Hant.json b/src/uni_modules/uni-table/i18n/zh-Hant.json new file mode 100644 index 0000000..64f8061 --- /dev/null +++ b/src/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/src/uni_modules/uni-table/package.json b/src/uni_modules/uni-table/package.json new file mode 100644 index 0000000..a52821b --- /dev/null +++ b/src/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/src/uni_modules/uni-table/readme.md b/src/uni_modules/uni-table/readme.md new file mode 100644 index 0000000..bb08c79 --- /dev/null +++ b/src/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/src/uni_modules/uni-tag/changelog.md b/src/uni_modules/uni-tag/changelog.md new file mode 100644 index 0000000..ddee87a --- /dev/null +++ b/src/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/src/uni_modules/uni-tag/components/uni-tag/uni-tag.vue b/src/uni_modules/uni-tag/components/uni-tag/uni-tag.vue new file mode 100644 index 0000000..7274436 --- /dev/null +++ b/src/uni_modules/uni-tag/components/uni-tag/uni-tag.vue @@ -0,0 +1,252 @@ + + + + + diff --git a/src/uni_modules/uni-tag/package.json b/src/uni_modules/uni-tag/package.json new file mode 100644 index 0000000..71b41eb --- /dev/null +++ b/src/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/src/uni_modules/uni-tag/readme.md b/src/uni_modules/uni-tag/readme.md new file mode 100644 index 0000000..6e78ff5 --- /dev/null +++ b/src/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/src/uni_modules/uni-test/changelog.md b/src/uni_modules/uni-test/changelog.md new file mode 100644 index 0000000..2f3b102 --- /dev/null +++ b/src/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/src/uni_modules/uni-test/components/uni-test/uni-test.vue b/src/uni_modules/uni-test/components/uni-test/uni-test.vue new file mode 100644 index 0000000..9ea8aaf --- /dev/null +++ b/src/uni_modules/uni-test/components/uni-test/uni-test.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/uni_modules/uni-test/package.json b/src/uni_modules/uni-test/package.json new file mode 100644 index 0000000..9a3c4c4 --- /dev/null +++ b/src/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/src/uni_modules/uni-test/readme.md b/src/uni_modules/uni-test/readme.md new file mode 100644 index 0000000..ddb24c6 --- /dev/null +++ b/src/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/src/uni_modules/uni-title/changelog.md b/src/uni_modules/uni-title/changelog.md new file mode 100644 index 0000000..7626216 --- /dev/null +++ b/src/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/src/uni_modules/uni-title/components/uni-title/uni-title.vue b/src/uni_modules/uni-title/components/uni-title/uni-title.vue new file mode 100644 index 0000000..bf4f926 --- /dev/null +++ b/src/uni_modules/uni-title/components/uni-title/uni-title.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/src/uni_modules/uni-title/package.json b/src/uni_modules/uni-title/package.json new file mode 100644 index 0000000..2249f5a --- /dev/null +++ b/src/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/src/uni_modules/uni-title/readme.md b/src/uni_modules/uni-title/readme.md new file mode 100644 index 0000000..0e60b1b --- /dev/null +++ b/src/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/src/uni_modules/uni-tooltip/changelog.md b/src/uni_modules/uni-tooltip/changelog.md new file mode 100644 index 0000000..285b676 --- /dev/null +++ b/src/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/src/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue b/src/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue new file mode 100644 index 0000000..cda3754 --- /dev/null +++ b/src/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue @@ -0,0 +1,109 @@ + + + + + + diff --git a/src/uni_modules/uni-tooltip/package.json b/src/uni_modules/uni-tooltip/package.json new file mode 100644 index 0000000..44158e1 --- /dev/null +++ b/src/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/src/uni_modules/uni-tooltip/readme.md b/src/uni_modules/uni-tooltip/readme.md new file mode 100644 index 0000000..faafa2e --- /dev/null +++ b/src/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/src/uni_modules/uni-transition/changelog.md b/src/uni_modules/uni-transition/changelog.md new file mode 100644 index 0000000..faaf336 --- /dev/null +++ b/src/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/src/uni_modules/uni-transition/components/uni-transition/createAnimation.js b/src/uni_modules/uni-transition/components/uni-transition/createAnimation.js new file mode 100644 index 0000000..8f89b18 --- /dev/null +++ b/src/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/src/uni_modules/uni-transition/components/uni-transition/uni-transition.vue b/src/uni_modules/uni-transition/components/uni-transition/uni-transition.vue new file mode 100644 index 0000000..f3ddd1f --- /dev/null +++ b/src/uni_modules/uni-transition/components/uni-transition/uni-transition.vue @@ -0,0 +1,286 @@ + + + + + diff --git a/src/uni_modules/uni-transition/package.json b/src/uni_modules/uni-transition/package.json new file mode 100644 index 0000000..d5c20e1 --- /dev/null +++ b/src/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/src/uni_modules/uni-transition/readme.md b/src/uni_modules/uni-transition/readme.md new file mode 100644 index 0000000..2f8a77e --- /dev/null +++ b/src/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/src/uni_modules/uni-ui/changelog.md b/src/uni_modules/uni-ui/changelog.md new file mode 100644 index 0000000..6d477cf --- /dev/null +++ b/src/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/src/uni_modules/uni-ui/components/uni-ui/uni-ui.vue b/src/uni_modules/uni-ui/components/uni-ui/uni-ui.vue new file mode 100644 index 0000000..0970892 --- /dev/null +++ b/src/uni_modules/uni-ui/components/uni-ui/uni-ui.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/uni_modules/uni-ui/package.json b/src/uni_modules/uni-ui/package.json new file mode 100644 index 0000000..d31a390 --- /dev/null +++ b/src/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/src/uni_modules/uni-ui/readme.md b/src/uni_modules/uni-ui/readme.md new file mode 100644 index 0000000..23f8456 --- /dev/null +++ b/src/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/src/utils/audio-feedback.js b/src/utils/audio-feedback.js new file mode 100644 index 0000000..6015d63 --- /dev/null +++ b/src/utils/audio-feedback.js @@ -0,0 +1,51 @@ +export const AUDIO_FEEDBACK_SOURCES = Object.freeze({ + success: '/static/mp3/success.mp3', + error: '/static/mp3/fail.mp3' +}) + +let audioContext = null + +function getAudioContext() { + if (audioContext) return audioContext + if (typeof uni === 'undefined' || typeof uni.createInnerAudioContext !== 'function') return null + + audioContext = uni.createInnerAudioContext() + audioContext.autoplay = false + audioContext.loop = false + audioContext.volume = 1 + return audioContext +} + +export function playFeedbackSound(type) { + const source = AUDIO_FEEDBACK_SOURCES[type] + const player = getAudioContext() + if (!source || !player) return false + + try { + player.stop() + player.src = source + player.play() + return true + } catch (_) { + return false + } +} + +export function playSuccessSound() { + return playFeedbackSound('success') +} + +export function playErrorSound() { + return playFeedbackSound('error') +} + +export function stopFeedbackSound() { + if (!audioContext) return + try { audioContext.stop() } catch (_) {} +} + +export function destroyFeedbackSound() { + if (!audioContext) return + try { audioContext.destroy() } catch (_) {} + audioContext = null +} diff --git a/src/utils/navigation.js b/src/utils/navigation.js new file mode 100644 index 0000000..6532c75 --- /dev/null +++ b/src/utils/navigation.js @@ -0,0 +1,23 @@ +const HOME_URL = '/pages/home/home' + +export function getCurrentRoute() { + if (typeof getCurrentPages !== 'function') return '' + const pages = getCurrentPages() + const currentPage = pages[pages.length - 1] + return currentPage ? currentPage.route || '' : '' +} + +export function navigateBackOr(fallbackUrl = HOME_URL) { + const pages = typeof getCurrentPages === 'function' ? getCurrentPages() : [] + if (pages.length > 1) { + uni.navigateBack({ fail: () => uni.reLaunch({ url: fallbackUrl }) }) + return + } + uni.reLaunch({ url: fallbackUrl }) +} + +export function navigateToUnique(url) { + const route = url.split('?')[0].replace(/^\//, '') + if (getCurrentRoute() === route) return + uni.navigateTo({ url }) +} diff --git a/src/utils/network.js b/src/utils/network.js new file mode 100644 index 0000000..723914a --- /dev/null +++ b/src/utils/network.js @@ -0,0 +1,46 @@ +let online = true +let listening = false +const listeners = new Set() + +function notify() { + for (const listener of listeners) listener(online) +} + +function ensureListening() { + if (listening || typeof uni === 'undefined') return + listening = true + if (typeof uni.onNetworkStatusChange === 'function') { + uni.onNetworkStatusChange((result) => { + online = Boolean(result.isConnected) + notify() + }) + } + if (typeof uni.getNetworkType === 'function') { + uni.getNetworkType({ + success: (result) => { + online = result.networkType !== 'none' + notify() + } + }) + } +} + +export function isOnline() { + ensureListening() + return online +} + +export function requireOnline(message = '当前网络不可用,请联网后刷新重试') { + if (!isOnline()) { + const error = new Error(message) + error.network = true + throw error + } +} + +export function watchNetwork(listener) { + ensureListening() + listeners.add(listener) + listener(online) + return () => listeners.delete(listener) +} diff --git a/src/utils/scan-broadcast.js b/src/utils/scan-broadcast.js new file mode 100644 index 0000000..308fbda --- /dev/null +++ b/src/utils/scan-broadcast.js @@ -0,0 +1,76 @@ +export const SCAN_BROADCAST_ACTION = 'android.intent.action.SCANRESULT' +export const SCAN_BROADCAST_EXTRA = 'value' + +const DUPLICATE_WINDOW_MS = 80 + +let receiver = null +let activity = null +let lastScan = { value: '', receivedAt: 0 } + +export function normalizeScanValue(value) { + if (value === null || value === undefined) return '' + return String(value).trim() +} + +export function isDuplicateScan(value, receivedAt = Date.now()) { + const duplicate = value === lastScan.value && receivedAt - lastScan.receivedAt < DUPLICATE_WINDOW_MS + if (!duplicate) lastScan = { value, receivedAt } + return duplicate +} + +export function resetScanDeduplication() { + lastScan = { value: '', receivedAt: 0 } +} + +export function startScanBroadcast({ onScan, onError } = {}) { + if (typeof onScan !== 'function') return () => {} + + // #ifdef APP-PLUS + try { + if (receiver) stopScanBroadcast() + + activity = plus.android.runtimeMainActivity() + const IntentFilter = plus.android.importClass('android.content.IntentFilter') + const filter = new IntentFilter() + filter.addAction(SCAN_BROADCAST_ACTION) + receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', { + onReceive(context, intent) { + try { + plus.android.importClass(intent) + const value = normalizeScanValue(intent.getStringExtra(SCAN_BROADCAST_EXTRA)) + if (!value || isDuplicateScan(value)) return + onScan(value) + } catch (error) { + if (typeof onError === 'function') onError(error) + } + } + }) + const Build = plus.android.importClass('android.os.Build') + if (Build.VERSION.SDK_INT >= 33) { + const Context = plus.android.importClass('android.content.Context') + activity.registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED) + } else { + activity.registerReceiver(receiver, filter) + } + } catch (error) { + receiver = null + activity = null + if (typeof onError === 'function') onError(error) + } + // #endif + + return stopScanBroadcast +} + +export function stopScanBroadcast() { + // #ifdef APP-PLUS + if (activity && receiver) { + try { + activity.unregisterReceiver(receiver) + } catch (_) {} + } + // #endif + receiver = null + activity = null + resetScanDeduplication() +} diff --git a/tests/audio-feedback.test.mjs b/tests/audio-feedback.test.mjs new file mode 100644 index 0000000..3302890 --- /dev/null +++ b/tests/audio-feedback.test.mjs @@ -0,0 +1,34 @@ +import test from 'node:test' +import assert from 'node:assert/strict' + +test('shared audio feedback reuses one player and switches success and error sounds', async () => { + const calls = [] + const player = { + src: '', + stop() { calls.push('stop') }, + play() { calls.push(`play:${this.src}`) }, + destroy() { calls.push('destroy') } + } + let created = 0 + globalThis.uni = { + createInnerAudioContext() { created += 1; return player } + } + + const audio = await import('../src/utils/audio-feedback.js') + assert.equal(audio.playSuccessSound(), true) + assert.equal(audio.playErrorSound(), true) + assert.equal(created, 1) + assert.deepEqual(calls, [ + 'stop', 'play:/static/mp3/success.mp3', + 'stop', 'play:/static/mp3/fail.mp3' + ]) + audio.destroyFeedbackSound() + assert.equal(calls.at(-1), 'destroy') + delete globalThis.uni +}) + +test('shared audio feedback is a safe no-op outside uni-app', async () => { + const audio = await import('../src/utils/audio-feedback.js') + assert.equal(audio.playFeedbackSound('unknown'), false) + assert.equal(audio.playSuccessSound(), false) +}) diff --git a/tests/navigation.test.mjs b/tests/navigation.test.mjs new file mode 100644 index 0000000..9a53bca --- /dev/null +++ b/tests/navigation.test.mjs @@ -0,0 +1,38 @@ +import test from 'node:test' +import assert from 'node:assert/strict' +import { navigateBackOr, navigateToUnique } from '../src/utils/navigation.js' + +test('navigateBackOr returns through the stack and falls back when the stack is empty', () => { + const calls = [] + globalThis.uni = { + navigateBack: (options) => calls.push(['back', options]), + reLaunch: (options) => calls.push(['reLaunch', options]) + } + + globalThis.getCurrentPages = () => [{ route: 'pages/home/home' }, { route: 'pages/profile/profile' }] + navigateBackOr('/pages/home/home') + assert.equal(calls[0][0], 'back') + + calls.length = 0 + globalThis.getCurrentPages = () => [{ route: 'pages/profile/profile' }] + navigateBackOr('/pages/home/home') + assert.deepEqual(calls, [['reLaunch', { url: '/pages/home/home' }]]) + + calls.length = 0 + globalThis.getCurrentPages = () => [{ route: 'pages/home/home' }, { route: 'pages/profile/profile' }] + globalThis.uni.navigateBack = ({ fail }) => fail() + navigateBackOr('/pages/home/home') + assert.deepEqual(calls, [['reLaunch', { url: '/pages/home/home' }]]) +}) + +test('navigateToUnique does not stack the current utility page twice', () => { + const calls = [] + globalThis.uni = { navigateTo: (options) => calls.push(options) } + globalThis.getCurrentPages = () => [{ route: 'pages/profile/profile' }] + + navigateToUnique('/pages/profile/profile') + assert.deepEqual(calls, []) + + navigateToUnique('/pages/history/history') + assert.deepEqual(calls, [{ url: '/pages/history/history' }]) +}) diff --git a/tests/project-contract.test.mjs b/tests/project-contract.test.mjs new file mode 100644 index 0000000..ff0f714 --- /dev/null +++ b/tests/project-contract.test.mjs @@ -0,0 +1,36 @@ +import test from 'node:test' +import assert from 'node:assert/strict' +import { readFile } from 'node:fs/promises' + +const read = (path) => readFile(new URL(path, import.meta.url), 'utf8') + +test('overseas PDA is an independent Vue 3 app with separate packaging identity', async () => { + const [manifest, pages, pkg] = await Promise.all([ + read('../src/manifest.json'), read('../src/pages.json'), read('../package.json') + ]) + assert.match(manifest, /"name"\s*:\s*"柏悦物流海外版"/) + assert.match(manifest, /"packagename"\s*:\s*"com\.baiyuelogistics\.pda\.overseas"/) + assert.match(manifest, /"vueVersion"\s*:\s*"3"/) + assert.doesNotMatch(pages, /pages\/picking|pages\/tasks/) + assert.match(pkg, /"build:app"\s*:\s*"uni build -p app"/) +}) + +test('overseas workbench contains only confirmed inbound and in-warehouse domains', async () => { + const [data, session, runtime] = await Promise.all([ + read('../src/data/overseas-workbench.js'), read('../src/stores/session.js'), read('../src/config/runtime.js') + ]) + for (const label of ['入仓作业', '库内作业', '换标作业', '现场查询']) assert.match(data, new RegExp(label)) + for (const excluded of ['集装箱拣货', '装柜取证', '海外派送', '出库履约']) assert.doesNotMatch(data, new RegExp(excluded)) + assert.match(session, /overseas-pda-auth-session/) + assert.match(runtime, /VITE_OVERSEAS_API_BASE_URL/) +}) + +test('login has no committed demo credentials and operation page consumes hardware scans', async () => { + const [login, operation] = await Promise.all([ + read('../src/pages/login/login.vue'), read('../src/pages/operation/operation.vue') + ]) + assert.match(login, /柏悦物流海外版/) + assert.doesNotMatch(login, /ChangeMe|platform_admin/) + assert.match(operation, /startScanBroadcast/) + assert.match(operation, /业务接口待接入/) +}) diff --git a/tests/scan-broadcast.test.mjs b/tests/scan-broadcast.test.mjs new file mode 100644 index 0000000..c0f3ae6 --- /dev/null +++ b/tests/scan-broadcast.test.mjs @@ -0,0 +1,25 @@ +import test from 'node:test' +import assert from 'node:assert/strict' + +import { + SCAN_BROADCAST_ACTION, + SCAN_BROADCAST_EXTRA, + isDuplicateScan, + normalizeScanValue, + resetScanDeduplication +} from '../src/utils/scan-broadcast.js' + +test('scanner uses the confirmed PDA broadcast contract', () => { + assert.equal(SCAN_BROADCAST_ACTION, 'android.intent.action.SCANRESULT') + assert.equal(SCAN_BROADCAST_EXTRA, 'value') + assert.equal(normalizeScanValue(' EL-38201\r\n'), 'EL-38201') + assert.equal(normalizeScanValue(null), '') +}) + +test('scanner drops only immediate duplicate broadcasts', () => { + resetScanDeduplication() + assert.equal(isDuplicateScan('EL-38201', 1000), false) + assert.equal(isDuplicateScan('EL-38201', 1050), true) + assert.equal(isDuplicateScan('EL-38201', 1100), false) + assert.equal(isDuplicateScan('EL-38202', 1110), false) +}) diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..c77da27 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,6 @@ +import { defineConfig } from 'vite' +import uni from '@dcloudio/vite-plugin-uni' + +export default defineConfig({ + plugins: [uni()] +})