From 99399a2c561692b9bdf168f2f942c851a6f2c897 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BD=90=E6=96=8C?= <1134087124@qq.com> Date: Tue, 15 Aug 2023 18:58:57 +0800 Subject: [PATCH] first commit --- .gitignore | 2 + .hbuilderx/launch.json | 16 + App.vue | 25 + README.md | 3 + common/index.js | 25 + common/updown/oa-app.keystore | Bin 0 -> 2160 bytes components/tabBar/tabBar.vue | 142 ++ components/tki-barcode/barcode.js | 190 +++ components/tki-barcode/barcodes/Barcode.js | 17 + .../tki-barcode/barcodes/CODE128/CODE128.js | 167 ++ .../tki-barcode/barcodes/CODE128/CODE128A.js | 42 + .../tki-barcode/barcodes/CODE128/CODE128B.js | 42 + .../tki-barcode/barcodes/CODE128/CODE128C.js | 42 + .../barcodes/CODE128/CODE128_AUTO.js | 41 + .../tki-barcode/barcodes/CODE128/auto.js | 73 + .../tki-barcode/barcodes/CODE128/constants.js | 54 + .../tki-barcode/barcodes/CODE128/index.js | 29 + .../tki-barcode/barcodes/CODE39/index.js | 104 ++ .../tki-barcode/barcodes/EAN_UPC/EAN.js | 92 ++ .../tki-barcode/barcodes/EAN_UPC/EAN13.js | 119 ++ .../tki-barcode/barcodes/EAN_UPC/EAN2.js | 58 + .../tki-barcode/barcodes/EAN_UPC/EAN5.js | 65 + .../tki-barcode/barcodes/EAN_UPC/EAN8.js | 81 + .../tki-barcode/barcodes/EAN_UPC/UPC.js | 165 ++ .../tki-barcode/barcodes/EAN_UPC/UPCE.js | 185 +++ .../tki-barcode/barcodes/EAN_UPC/constants.js | 30 + .../tki-barcode/barcodes/EAN_UPC/encoder.js | 27 + .../tki-barcode/barcodes/EAN_UPC/index.js | 39 + .../barcodes/GenericBarcode/index.js | 55 + components/tki-barcode/barcodes/ITF/ITF.js | 69 + components/tki-barcode/barcodes/ITF/ITF14.js | 55 + .../tki-barcode/barcodes/ITF/constants.js | 9 + components/tki-barcode/barcodes/ITF/index.js | 19 + components/tki-barcode/barcodes/MSI/MSI.js | 74 + components/tki-barcode/barcodes/MSI/MSI10.js | 33 + .../tki-barcode/barcodes/MSI/MSI1010.js | 35 + components/tki-barcode/barcodes/MSI/MSI11.js | 33 + .../tki-barcode/barcodes/MSI/MSI1110.js | 35 + .../tki-barcode/barcodes/MSI/checksums.js | 29 + components/tki-barcode/barcodes/MSI/index.js | 34 + .../tki-barcode/barcodes/codabar/index.js | 92 ++ components/tki-barcode/barcodes/index.js | 34 + .../tki-barcode/barcodes/pharmacode/index.js | 73 + components/tki-barcode/tki-barcode.vue | 206 +++ http/index.js | 10 + http/interface.js | 135 ++ http/login.js | 25 + http/management.js | 49 + http/mine.js | 22 + http/readme.md | 198 +++ index.html | 20 + main.js | 48 + manifest.json | 79 + package-lock.json | 6 + package.json | 5 + pages.json | 63 + pages/goodDetail/goodDetail.vue | 515 +++++++ pages/login/login.vue | 238 +++ pages/management/management.vue | 488 ++++++ pages/mine/mine.vue | 213 +++ static/background.png | Bin 0 -> 91821 bytes static/close.png | Bin 0 -> 1411 bytes static/login.png | Bin 0 -> 14226 bytes static/mine.png | Bin 0 -> 1442 bytes static/search.png | Bin 0 -> 1454 bytes store/index.js | 39 + uni.scss | 76 + uni_modules/superwei-combox/changelog.md | 22 + .../superwei-combox/superwei-combox.vue | 381 +++++ uni_modules/superwei-combox/package.json | 89 ++ uni_modules/superwei-combox/readme.md | 104 ++ uni_modules/uni-combox/changelog.md | 15 + .../components/uni-combox/uni-combox.vue | 275 ++++ uni_modules/uni-combox/package.json | 90 ++ uni_modules/uni-combox/readme.md | 11 + uni_modules/uni-datetime-picker/changelog.md | 103 ++ .../uni-datetime-picker/calendar-item.vue | 187 +++ .../uni-datetime-picker/calendar.vue | 924 ++++++++++++ .../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/keypress.js | 45 + .../uni-datetime-picker/time-picker.vue | 930 ++++++++++++ .../uni-datetime-picker.vue | 1015 +++++++++++++ .../components/uni-datetime-picker/util.js | 410 +++++ uni_modules/uni-datetime-picker/package.json | 87 ++ uni_modules/uni-datetime-picker/readme.md | 21 + uni_modules/uni-icons/changelog.md | 22 + .../uni-icons/components/uni-icons/icons.js | 1169 ++++++++++++++ .../components/uni-icons/uni-icons.vue | 96 ++ .../components/uni-icons/uniicons.css | 663 ++++++++ .../components/uni-icons/uniicons.ttf | Bin 0 -> 35760 bytes uni_modules/uni-icons/package.json | 86 ++ uni_modules/uni-icons/readme.md | 8 + uni_modules/uni-scss/changelog.md | 8 + uni_modules/uni-scss/index.scss | 1 + uni_modules/uni-scss/package.json | 82 + uni_modules/uni-scss/readme.md | 4 + uni_modules/uni-scss/styles/index.scss | 7 + .../uni-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 + uni_modules/uni-scss/theme.scss | 31 + uni_modules/uni-scss/variables.scss | 62 + uni_modules/uni-table/changelog.md | 23 + .../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 | 503 ++++++ .../uni-table/components/uni-th/uni-th.vue | 278 ++++ .../components/uni-thead/uni-thead.vue | 129 ++ .../components/uni-tr/table-checkbox.vue | 179 +++ .../uni-table/components/uni-tr/uni-tr.vue | 171 +++ uni_modules/uni-table/i18n/en.json | 9 + uni_modules/uni-table/i18n/es.json | 9 + uni_modules/uni-table/i18n/fr.json | 9 + uni_modules/uni-table/i18n/index.js | 12 + uni_modules/uni-table/i18n/zh-Hans.json | 9 + uni_modules/uni-table/i18n/zh-Hant.json | 9 + uni_modules/uni-table/package.json | 86 ++ uni_modules/uni-table/readme.md | 13 + untils/tabBar.js | 61 + uview-ui/LICENSE | 21 + uview-ui/README.md | 66 + uview-ui/changelog.md | 357 +++++ uview-ui/components/u--form/u--form.vue | 78 + uview-ui/components/u--image/u--image.vue | 47 + uview-ui/components/u--input/u--input.vue | 73 + uview-ui/components/u--text/u--text.vue | 44 + .../components/u--textarea/u--textarea.vue | 48 + uview-ui/components/u-action-sheet/props.js | 54 + .../u-action-sheet/u-action-sheet.vue | 278 ++++ uview-ui/components/u-album/props.js | 59 + uview-ui/components/u-album/u-album.vue | 259 ++++ uview-ui/components/u-alert/props.js | 44 + uview-ui/components/u-alert/u-alert.vue | 243 +++ uview-ui/components/u-avatar-group/props.js | 52 + .../u-avatar-group/u-avatar-group.vue | 103 ++ uview-ui/components/u-avatar/props.js | 78 + uview-ui/components/u-avatar/u-avatar.vue | 172 +++ uview-ui/components/u-back-top/props.js | 54 + uview-ui/components/u-back-top/u-back-top.vue | 129 ++ uview-ui/components/u-badge/props.js | 72 + uview-ui/components/u-badge/u-badge.vue | 171 +++ uview-ui/components/u-button/nvue.scss | 46 + uview-ui/components/u-button/props.js | 161 ++ uview-ui/components/u-button/u-button.vue | 490 ++++++ uview-ui/components/u-button/vue.scss | 80 + uview-ui/components/u-calendar/header.vue | 99 ++ uview-ui/components/u-calendar/month.vue | 579 +++++++ uview-ui/components/u-calendar/props.js | 144 ++ uview-ui/components/u-calendar/u-calendar.vue | 384 +++++ uview-ui/components/u-calendar/util.js | 85 ++ uview-ui/components/u-car-keyboard/props.js | 14 + .../u-car-keyboard/u-car-keyboard.vue | 311 ++++ uview-ui/components/u-cell-group/props.js | 14 + .../components/u-cell-group/u-cell-group.vue | 61 + uview-ui/components/u-cell/props.js | 110 ++ uview-ui/components/u-cell/u-cell.vue | 229 +++ uview-ui/components/u-checkbox-group/props.js | 82 + .../u-checkbox-group/u-checkbox-group.vue | 103 ++ uview-ui/components/u-checkbox/props.js | 69 + uview-ui/components/u-checkbox/u-checkbox.vue | 344 +++++ .../components/u-circle-progress/props.js | 8 + .../u-circle-progress/u-circle-progress.vue | 198 +++ uview-ui/components/u-code-input/props.js | 79 + .../components/u-code-input/u-code-input.vue | 252 ++++ uview-ui/components/u-code/props.js | 34 + uview-ui/components/u-code/u-code.vue | 129 ++ uview-ui/components/u-col/props.js | 29 + uview-ui/components/u-col/u-col.vue | 162 ++ uview-ui/components/u-collapse-item/props.js | 59 + .../u-collapse-item/u-collapse-item.vue | 225 +++ uview-ui/components/u-collapse/props.js | 19 + uview-ui/components/u-collapse/u-collapse.vue | 90 ++ uview-ui/components/u-column-notice/props.js | 55 + .../u-column-notice/u-column-notice.vue | 160 ++ uview-ui/components/u-count-down/props.js | 24 + .../components/u-count-down/u-count-down.vue | 163 ++ uview-ui/components/u-count-down/utils.js | 62 + uview-ui/components/u-count-to/props.js | 59 + uview-ui/components/u-count-to/u-count-to.vue | 184 +++ .../components/u-datetime-picker/props.js | 116 ++ .../u-datetime-picker/u-datetime-picker.vue | 360 +++++ uview-ui/components/u-divider/props.js | 44 + uview-ui/components/u-divider/u-divider.vue | 116 ++ uview-ui/components/u-dropdown-item/props.js | 36 + .../u-dropdown-item/u-dropdown-item.vue | 127 ++ uview-ui/components/u-dropdown/props.js | 65 + uview-ui/components/u-dropdown/u-dropdown.vue | 127 ++ uview-ui/components/u-empty/props.js | 59 + uview-ui/components/u-empty/u-empty.vue | 128 ++ uview-ui/components/u-form-item/props.js | 48 + .../components/u-form-item/u-form-item.vue | 235 +++ uview-ui/components/u-form/props.js | 45 + uview-ui/components/u-form/u-form.vue | 214 +++ uview-ui/components/u-gap/props.js | 24 + uview-ui/components/u-gap/u-gap.vue | 38 + uview-ui/components/u-grid-item/props.js | 14 + .../components/u-grid-item/u-grid-item.vue | 209 +++ uview-ui/components/u-grid/props.js | 19 + uview-ui/components/u-grid/u-grid.vue | 97 ++ uview-ui/components/u-icon/icons.js | 214 +++ uview-ui/components/u-icon/props.js | 89 ++ uview-ui/components/u-icon/u-icon.vue | 234 +++ uview-ui/components/u-image/props.js | 84 ++ uview-ui/components/u-image/u-image.vue | 232 +++ uview-ui/components/u-index-anchor/props.js | 29 + .../u-index-anchor/u-index-anchor.vue | 91 ++ uview-ui/components/u-index-item/props.js | 5 + .../components/u-index-item/u-index-item.vue | 87 ++ uview-ui/components/u-index-list/props.js | 29 + .../components/u-index-list/u-index-list.vue | 440 ++++++ uview-ui/components/u-input/props.js | 187 +++ uview-ui/components/u-input/u-input.vue | 354 +++++ uview-ui/components/u-keyboard/props.js | 84 ++ uview-ui/components/u-keyboard/u-keyboard.vue | 164 ++ uview-ui/components/u-line-progress/props.js | 28 + .../u-line-progress/u-line-progress.vue | 144 ++ uview-ui/components/u-line/props.js | 33 + uview-ui/components/u-line/u-line.vue | 62 + uview-ui/components/u-link/props.js | 39 + uview-ui/components/u-link/u-link.vue | 83 + uview-ui/components/u-list-item/props.js | 9 + .../components/u-list-item/u-list-item.vue | 116 ++ uview-ui/components/u-list/props.js | 76 + uview-ui/components/u-list/u-list.vue | 157 ++ uview-ui/components/u-loading-icon/props.js | 59 + .../u-loading-icon/u-loading-icon.vue | 343 +++++ uview-ui/components/u-loading-page/props.js | 49 + .../u-loading-page/u-loading-page.vue | 115 ++ uview-ui/components/u-loadmore/props.js | 94 ++ uview-ui/components/u-loadmore/u-loadmore.vue | 150 ++ uview-ui/components/u-modal/props.js | 84 ++ uview-ui/components/u-modal/u-modal.vue | 227 +++ uview-ui/components/u-navbar/props.js | 84 ++ uview-ui/components/u-navbar/u-navbar.vue | 186 +++ uview-ui/components/u-no-network/props.js | 19 + .../components/u-no-network/u-no-network.vue | 220 +++ uview-ui/components/u-notice-bar/props.js | 70 + .../components/u-notice-bar/u-notice-bar.vue | 101 ++ uview-ui/components/u-notify/props.js | 49 + uview-ui/components/u-notify/u-notify.vue | 211 +++ uview-ui/components/u-number-box/props.js | 109 ++ .../components/u-number-box/u-number-box.vue | 416 +++++ .../components/u-number-keyboard/props.js | 19 + .../u-number-keyboard/u-number-keyboard.vue | 196 +++ uview-ui/components/u-overlay/props.js | 24 + uview-ui/components/u-overlay/u-overlay.vue | 68 + uview-ui/components/u-parse/node/node.vue | 499 ++++++ uview-ui/components/u-parse/parser.js | 1075 +++++++++++++ uview-ui/components/u-parse/props.js | 45 + uview-ui/components/u-parse/u-parse.vue | 366 +++++ uview-ui/components/u-picker-column/props.js | 5 + .../u-picker-column/u-picker-column.vue | 27 + uview-ui/components/u-picker/props.js | 79 + uview-ui/components/u-picker/u-picker.vue | 283 ++++ uview-ui/components/u-popup/props.js | 79 + uview-ui/components/u-popup/u-popup.vue | 304 ++++ uview-ui/components/u-radio-group/props.js | 85 ++ .../u-radio-group/u-radio-group.vue | 108 ++ uview-ui/components/u-radio/props.js | 64 + uview-ui/components/u-radio/u-radio.vue | 339 +++++ uview-ui/components/u-rate/props.js | 69 + uview-ui/components/u-rate/u-rate.vue | 306 ++++ uview-ui/components/u-read-more/props.js | 61 + .../components/u-read-more/u-read-more.vue | 157 ++ uview-ui/components/u-row-notice/props.js | 39 + .../components/u-row-notice/u-row-notice.vue | 330 ++++ uview-ui/components/u-row/props.js | 19 + uview-ui/components/u-row/u-row.vue | 93 ++ uview-ui/components/u-safe-bottom/props.js | 5 + .../u-safe-bottom/u-safe-bottom.vue | 56 + uview-ui/components/u-scroll-list/nvue.js | 28 + uview-ui/components/u-scroll-list/other.js | 0 uview-ui/components/u-scroll-list/props.js | 34 + .../components/u-scroll-list/scrollWxs.wxs | 50 + .../u-scroll-list/u-scroll-list.vue | 224 +++ uview-ui/components/u-search/props.js | 118 ++ uview-ui/components/u-search/u-search.vue | 303 ++++ uview-ui/components/u-skeleton/props.js | 59 + uview-ui/components/u-skeleton/u-skeleton.vue | 244 +++ uview-ui/components/u-slider/mpother.js | 113 ++ uview-ui/components/u-slider/mpwxs.js | 42 + uview-ui/components/u-slider/mpwxs.wxs | 121 ++ .../components/u-slider/nvue - 鍓湰.js | 180 +++ uview-ui/components/u-slider/nvue.js | 193 +++ uview-ui/components/u-slider/props.js | 54 + uview-ui/components/u-slider/u-slider.vue | 55 + uview-ui/components/u-status-bar/props.js | 8 + .../components/u-status-bar/u-status-bar.vue | 46 + uview-ui/components/u-steps-item/props.js | 24 + .../components/u-steps-item/u-steps-item.vue | 316 ++++ uview-ui/components/u-steps/props.js | 39 + uview-ui/components/u-steps/u-steps.vue | 80 + uview-ui/components/u-sticky/props.js | 40 + uview-ui/components/u-sticky/u-sticky.vue | 212 +++ uview-ui/components/u-subsection/props.js | 49 + .../components/u-subsection/u-subsection.vue | 299 ++++ .../u-swipe-action-item/index - backup.wxs | 256 ++++ .../components/u-swipe-action-item/index.wxs | 225 +++ .../u-swipe-action-item/nvue - backup.js | 270 ++++ .../components/u-swipe-action-item/nvue.js | 174 +++ .../components/u-swipe-action-item/props.js | 41 + .../u-swipe-action-item.vue | 190 +++ .../components/u-swipe-action-item/wxs.js | 15 + uview-ui/components/u-swipe-action/props.js | 9 + .../u-swipe-action/u-swipe-action.vue | 67 + .../components/u-swiper-indicator/props.js | 29 + .../u-swiper-indicator/u-swiper-indicator.vue | 110 ++ uview-ui/components/u-swiper/props.js | 125 ++ uview-ui/components/u-swiper/u-swiper.vue | 255 ++++ uview-ui/components/u-switch/props.js | 54 + uview-ui/components/u-switch/u-switch.vue | 177 +++ uview-ui/components/u-tabbar-item/props.js | 35 + .../u-tabbar-item/u-tabbar-item.vue | 142 ++ uview-ui/components/u-tabbar/props.js | 44 + uview-ui/components/u-tabbar/u-tabbar.vue | 141 ++ uview-ui/components/u-table/props.js | 5 + uview-ui/components/u-table/u-table.vue | 29 + uview-ui/components/u-tabs-item/props.js | 5 + .../components/u-tabs-item/u-tabs-item.vue | 29 + uview-ui/components/u-tabs/props.js | 64 + uview-ui/components/u-tabs/u-tabs.vue | 354 +++++ uview-ui/components/u-tag/props.js | 84 ++ uview-ui/components/u-tag/u-tag.vue | 358 +++++ uview-ui/components/u-td/props.js | 5 + uview-ui/components/u-td/u-td.vue | 31 + uview-ui/components/u-text/props.js | 110 ++ uview-ui/components/u-text/u-text.vue | 223 +++ uview-ui/components/u-text/value.js | 85 ++ uview-ui/components/u-textarea/props.js | 119 ++ uview-ui/components/u-textarea/u-textarea.vue | 239 +++ uview-ui/components/u-toast/u-toast.vue | 291 ++++ uview-ui/components/u-toolbar/props.js | 34 + uview-ui/components/u-toolbar/u-toolbar.vue | 102 ++ .../components/u-tooltip/clipboard.min.js | 58 + uview-ui/components/u-tooltip/props.js | 59 + uview-ui/components/u-tooltip/u-tooltip.vue | 365 +++++ uview-ui/components/u-tr/props.js | 5 + uview-ui/components/u-tr/u-tr.vue | 31 + .../components/u-transition/nvue.ani-map.js | 68 + uview-ui/components/u-transition/props.js | 24 + .../components/u-transition/transition.js | 157 ++ .../components/u-transition/u-transition.vue | 92 ++ .../u-transition/vue.ani-style.scss | 113 ++ uview-ui/components/u-upload/mixin.js | 21 + uview-ui/components/u-upload/props.js | 124 ++ uview-ui/components/u-upload/u-upload.vue | 558 +++++++ uview-ui/components/u-upload/utils.js | 151 ++ uview-ui/components/uview-ui/uview-ui.vue | 15 + uview-ui/index.js | 79 + uview-ui/index.scss | 23 + uview-ui/libs/config/color.js | 17 + uview-ui/libs/config/config.js | 34 + uview-ui/libs/config/props.js | 190 +++ uview-ui/libs/config/props/actionSheet.js | 25 + uview-ui/libs/config/props/album.js | 25 + uview-ui/libs/config/props/alert.js | 22 + uview-ui/libs/config/props/avatar.js | 28 + uview-ui/libs/config/props/avatarGroup.js | 23 + uview-ui/libs/config/props/backtop.js | 27 + uview-ui/libs/config/props/badge.js | 27 + uview-ui/libs/config/props/button.js | 42 + uview-ui/libs/config/props/calendar.js | 42 + uview-ui/libs/config/props/carKeyboard.js | 15 + uview-ui/libs/config/props/cell.js | 35 + uview-ui/libs/config/props/cellGroup.js | 17 + uview-ui/libs/config/props/checkbox.js | 27 + uview-ui/libs/config/props/checkboxGroup.js | 29 + uview-ui/libs/config/props/circleProgress.js | 15 + uview-ui/libs/config/props/code.js | 21 + uview-ui/libs/config/props/codeInput.js | 29 + uview-ui/libs/config/props/col.js | 19 + uview-ui/libs/config/props/collapse.js | 17 + uview-ui/libs/config/props/collapseItem.js | 25 + uview-ui/libs/config/props/columnNotice.js | 24 + uview-ui/libs/config/props/countDown.js | 18 + uview-ui/libs/config/props/countTo.js | 25 + uview-ui/libs/config/props/datetimePicker.js | 36 + uview-ui/libs/config/props/divider.js | 23 + uview-ui/libs/config/props/empty.js | 26 + uview-ui/libs/config/props/form.js | 22 + uview-ui/libs/config/props/formItem.js | 23 + uview-ui/libs/config/props/gap.js | 19 + uview-ui/libs/config/props/grid.js | 17 + uview-ui/libs/config/props/gridItem.js | 16 + uview-ui/libs/config/props/icon.js | 36 + uview-ui/libs/config/props/image.js | 30 + uview-ui/libs/config/props/indexAnchor.js | 19 + uview-ui/libs/config/props/indexList.js | 19 + uview-ui/libs/config/props/input.js | 48 + uview-ui/libs/config/props/keyboard.js | 30 + uview-ui/libs/config/props/line.js | 20 + uview-ui/libs/config/props/lineProgress.js | 19 + uview-ui/libs/config/props/link.js | 26 + uview-ui/libs/config/props/list.js | 28 + uview-ui/libs/config/props/listItem.js | 15 + uview-ui/libs/config/props/loadingIcon.js | 30 + uview-ui/libs/config/props/loadingPage.js | 23 + uview-ui/libs/config/props/loadmore.js | 32 + uview-ui/libs/config/props/modal.js | 30 + uview-ui/libs/config/props/navbar.js | 32 + uview-ui/libs/config/props/noNetwork.js | 18 + uview-ui/libs/config/props/noticeBar.js | 27 + uview-ui/libs/config/props/notify.js | 22 + uview-ui/libs/config/props/numberBox.js | 35 + uview-ui/libs/config/props/numberKeyboard.js | 17 + uview-ui/libs/config/props/overlay.js | 18 + uview-ui/libs/config/props/parse.js | 22 + uview-ui/libs/config/props/picker.js | 29 + uview-ui/libs/config/props/popup.js | 29 + uview-ui/libs/config/props/radio.js | 27 + uview-ui/libs/config/props/radioGroup.js | 30 + uview-ui/libs/config/props/rate.js | 26 + uview-ui/libs/config/props/readMore.js | 22 + uview-ui/libs/config/props/row.js | 17 + uview-ui/libs/config/props/rowNotice.js | 21 + uview-ui/libs/config/props/scrollList.js | 20 + uview-ui/libs/config/props/search.js | 37 + uview-ui/libs/config/props/section.js | 24 + uview-ui/libs/config/props/skeleton.js | 25 + uview-ui/libs/config/props/slider.js | 25 + uview-ui/libs/config/props/statusBar.js | 15 + uview-ui/libs/config/props/steps.js | 21 + uview-ui/libs/config/props/stepsItem.js | 18 + uview-ui/libs/config/props/sticky.js | 20 + uview-ui/libs/config/props/subsection.js | 23 + uview-ui/libs/config/props/swipeAction.js | 15 + uview-ui/libs/config/props/swipeActionItem.js | 21 + uview-ui/libs/config/props/swiper.js | 39 + .../libs/config/props/swipterIndicator.js | 19 + uview-ui/libs/config/props/switch.js | 24 + uview-ui/libs/config/props/tabbar.js | 22 + uview-ui/libs/config/props/tabbarItem.js | 20 + uview-ui/libs/config/props/tabs.js | 32 + uview-ui/libs/config/props/tag.js | 29 + uview-ui/libs/config/props/text.js | 38 + uview-ui/libs/config/props/textarea.js | 36 + uview-ui/libs/config/props/toast.js | 30 + uview-ui/libs/config/props/toolbar.js | 21 + uview-ui/libs/config/props/tooltip.js | 25 + uview-ui/libs/config/props/transition.js | 18 + uview-ui/libs/config/props/upload.js | 36 + uview-ui/libs/config/zIndex.js | 20 + uview-ui/libs/css/color.scss | 155 ++ uview-ui/libs/css/common.scss | 97 ++ uview-ui/libs/css/components.scss | 15 + uview-ui/libs/css/flex.scss | 257 ++++ uview-ui/libs/css/h5.scss | 0 uview-ui/libs/css/mixin.scss | 8 + uview-ui/libs/css/mp.scss | 0 uview-ui/libs/css/nvue.scss | 0 uview-ui/libs/css/vue.scss | 27 + uview-ui/libs/function/colorGradient.js | 134 ++ uview-ui/libs/function/debounce.js | 29 + uview-ui/libs/function/digit.js | 167 ++ uview-ui/libs/function/index.js | 705 +++++++++ uview-ui/libs/function/platform.js | 75 + uview-ui/libs/function/test.js | 288 ++++ uview-ui/libs/function/throttle.js | 30 + uview-ui/libs/luch-request/adapters/index.js | 97 ++ .../luch-request/core/InterceptorManager.js | 50 + uview-ui/libs/luch-request/core/Request.js | 198 +++ .../libs/luch-request/core/buildFullPath.js | 20 + uview-ui/libs/luch-request/core/defaults.js | 29 + .../libs/luch-request/core/dispatchRequest.js | 3 + .../libs/luch-request/core/mergeConfig.js | 103 ++ uview-ui/libs/luch-request/core/settle.js | 16 + .../libs/luch-request/helpers/buildURL.js | 69 + .../libs/luch-request/helpers/combineURLs.js | 14 + .../luch-request/helpers/isAbsoluteURL.js | 14 + uview-ui/libs/luch-request/index.d.ts | 116 ++ uview-ui/libs/luch-request/index.js | 3 + uview-ui/libs/luch-request/utils.js | 131 ++ uview-ui/libs/luch-request/utils/clone.js | 264 ++++ uview-ui/libs/mixin/button.js | 13 + uview-ui/libs/mixin/mixin.js | 160 ++ uview-ui/libs/mixin/mpMixin.js | 8 + uview-ui/libs/mixin/mpShare.js | 13 + uview-ui/libs/mixin/openType.js | 25 + uview-ui/libs/mixin/style.js | 228 +++ uview-ui/libs/mixin/touch.js | 59 + uview-ui/libs/util/async-validator.js | 1343 +++++++++++++++++ uview-ui/libs/util/calendar.js | 546 +++++++ uview-ui/libs/util/dayjs.js | 308 ++++ uview-ui/libs/util/emitter.js | 51 + uview-ui/libs/util/route.js | 124 ++ uview-ui/package.json | 84 ++ uview-ui/theme.scss | 44 + 496 files changed, 53086 insertions(+) create mode 100644 .gitignore create mode 100644 .hbuilderx/launch.json create mode 100644 App.vue create mode 100644 README.md create mode 100644 common/index.js create mode 100644 common/updown/oa-app.keystore create mode 100644 components/tabBar/tabBar.vue create mode 100644 components/tki-barcode/barcode.js create mode 100644 components/tki-barcode/barcodes/Barcode.js create mode 100644 components/tki-barcode/barcodes/CODE128/CODE128.js create mode 100644 components/tki-barcode/barcodes/CODE128/CODE128A.js create mode 100644 components/tki-barcode/barcodes/CODE128/CODE128B.js create mode 100644 components/tki-barcode/barcodes/CODE128/CODE128C.js create mode 100644 components/tki-barcode/barcodes/CODE128/CODE128_AUTO.js create mode 100644 components/tki-barcode/barcodes/CODE128/auto.js create mode 100644 components/tki-barcode/barcodes/CODE128/constants.js create mode 100644 components/tki-barcode/barcodes/CODE128/index.js create mode 100644 components/tki-barcode/barcodes/CODE39/index.js create mode 100644 components/tki-barcode/barcodes/EAN_UPC/EAN.js create mode 100644 components/tki-barcode/barcodes/EAN_UPC/EAN13.js create mode 100644 components/tki-barcode/barcodes/EAN_UPC/EAN2.js create mode 100644 components/tki-barcode/barcodes/EAN_UPC/EAN5.js create mode 100644 components/tki-barcode/barcodes/EAN_UPC/EAN8.js create mode 100644 components/tki-barcode/barcodes/EAN_UPC/UPC.js create mode 100644 components/tki-barcode/barcodes/EAN_UPC/UPCE.js create mode 100644 components/tki-barcode/barcodes/EAN_UPC/constants.js create mode 100644 components/tki-barcode/barcodes/EAN_UPC/encoder.js create mode 100644 components/tki-barcode/barcodes/EAN_UPC/index.js create mode 100644 components/tki-barcode/barcodes/GenericBarcode/index.js create mode 100644 components/tki-barcode/barcodes/ITF/ITF.js create mode 100644 components/tki-barcode/barcodes/ITF/ITF14.js create mode 100644 components/tki-barcode/barcodes/ITF/constants.js create mode 100644 components/tki-barcode/barcodes/ITF/index.js create mode 100644 components/tki-barcode/barcodes/MSI/MSI.js create mode 100644 components/tki-barcode/barcodes/MSI/MSI10.js create mode 100644 components/tki-barcode/barcodes/MSI/MSI1010.js create mode 100644 components/tki-barcode/barcodes/MSI/MSI11.js create mode 100644 components/tki-barcode/barcodes/MSI/MSI1110.js create mode 100644 components/tki-barcode/barcodes/MSI/checksums.js create mode 100644 components/tki-barcode/barcodes/MSI/index.js create mode 100644 components/tki-barcode/barcodes/codabar/index.js create mode 100644 components/tki-barcode/barcodes/index.js create mode 100644 components/tki-barcode/barcodes/pharmacode/index.js create mode 100644 components/tki-barcode/tki-barcode.vue create mode 100644 http/index.js create mode 100644 http/interface.js create mode 100644 http/login.js create mode 100644 http/management.js create mode 100644 http/mine.js create mode 100644 http/readme.md create mode 100644 index.html create mode 100644 main.js create mode 100644 manifest.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 pages.json create mode 100644 pages/goodDetail/goodDetail.vue create mode 100644 pages/login/login.vue create mode 100644 pages/management/management.vue create mode 100644 pages/mine/mine.vue create mode 100644 static/background.png create mode 100644 static/close.png create mode 100644 static/login.png create mode 100644 static/mine.png create mode 100644 static/search.png create mode 100644 store/index.js create mode 100644 uni.scss create mode 100644 uni_modules/superwei-combox/changelog.md create mode 100644 uni_modules/superwei-combox/components/superwei-combox/superwei-combox.vue create mode 100644 uni_modules/superwei-combox/package.json create mode 100644 uni_modules/superwei-combox/readme.md create mode 100644 uni_modules/uni-combox/changelog.md create mode 100644 uni_modules/uni-combox/components/uni-combox/uni-combox.vue create mode 100644 uni_modules/uni-combox/package.json create mode 100644 uni_modules/uni-combox/readme.md create mode 100644 uni_modules/uni-datetime-picker/changelog.md create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js create mode 100644 uni_modules/uni-datetime-picker/package.json create mode 100644 uni_modules/uni-datetime-picker/readme.md create mode 100644 uni_modules/uni-icons/changelog.md create mode 100644 uni_modules/uni-icons/components/uni-icons/icons.js create mode 100644 uni_modules/uni-icons/components/uni-icons/uni-icons.vue create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.css create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.ttf create mode 100644 uni_modules/uni-icons/package.json create mode 100644 uni_modules/uni-icons/readme.md create mode 100644 uni_modules/uni-scss/changelog.md create mode 100644 uni_modules/uni-scss/index.scss create mode 100644 uni_modules/uni-scss/package.json create mode 100644 uni_modules/uni-scss/readme.md create mode 100644 uni_modules/uni-scss/styles/index.scss create mode 100644 uni_modules/uni-scss/styles/setting/_border.scss create mode 100644 uni_modules/uni-scss/styles/setting/_color.scss create mode 100644 uni_modules/uni-scss/styles/setting/_radius.scss create mode 100644 uni_modules/uni-scss/styles/setting/_space.scss create mode 100644 uni_modules/uni-scss/styles/setting/_styles.scss create mode 100644 uni_modules/uni-scss/styles/setting/_text.scss create mode 100644 uni_modules/uni-scss/styles/setting/_variables.scss create mode 100644 uni_modules/uni-scss/styles/tools/functions.scss create mode 100644 uni_modules/uni-scss/theme.scss create mode 100644 uni_modules/uni-scss/variables.scss create mode 100644 uni_modules/uni-table/changelog.md create mode 100644 uni_modules/uni-table/components/uni-table/uni-table.vue create mode 100644 uni_modules/uni-table/components/uni-tbody/uni-tbody.vue create mode 100644 uni_modules/uni-table/components/uni-td/uni-td.vue create mode 100644 uni_modules/uni-table/components/uni-th/filter-dropdown.vue create mode 100644 uni_modules/uni-table/components/uni-th/uni-th.vue create mode 100644 uni_modules/uni-table/components/uni-thead/uni-thead.vue create mode 100644 uni_modules/uni-table/components/uni-tr/table-checkbox.vue create mode 100644 uni_modules/uni-table/components/uni-tr/uni-tr.vue create mode 100644 uni_modules/uni-table/i18n/en.json create mode 100644 uni_modules/uni-table/i18n/es.json create mode 100644 uni_modules/uni-table/i18n/fr.json create mode 100644 uni_modules/uni-table/i18n/index.js create mode 100644 uni_modules/uni-table/i18n/zh-Hans.json create mode 100644 uni_modules/uni-table/i18n/zh-Hant.json create mode 100644 uni_modules/uni-table/package.json create mode 100644 uni_modules/uni-table/readme.md create mode 100644 untils/tabBar.js create mode 100644 uview-ui/LICENSE create mode 100644 uview-ui/README.md create mode 100644 uview-ui/changelog.md create mode 100644 uview-ui/components/u--form/u--form.vue create mode 100644 uview-ui/components/u--image/u--image.vue create mode 100644 uview-ui/components/u--input/u--input.vue create mode 100644 uview-ui/components/u--text/u--text.vue create mode 100644 uview-ui/components/u--textarea/u--textarea.vue create mode 100644 uview-ui/components/u-action-sheet/props.js create mode 100644 uview-ui/components/u-action-sheet/u-action-sheet.vue create mode 100644 uview-ui/components/u-album/props.js create mode 100644 uview-ui/components/u-album/u-album.vue create mode 100644 uview-ui/components/u-alert/props.js create mode 100644 uview-ui/components/u-alert/u-alert.vue create mode 100644 uview-ui/components/u-avatar-group/props.js create mode 100644 uview-ui/components/u-avatar-group/u-avatar-group.vue create mode 100644 uview-ui/components/u-avatar/props.js create mode 100644 uview-ui/components/u-avatar/u-avatar.vue create mode 100644 uview-ui/components/u-back-top/props.js create mode 100644 uview-ui/components/u-back-top/u-back-top.vue create mode 100644 uview-ui/components/u-badge/props.js create mode 100644 uview-ui/components/u-badge/u-badge.vue create mode 100644 uview-ui/components/u-button/nvue.scss create mode 100644 uview-ui/components/u-button/props.js create mode 100644 uview-ui/components/u-button/u-button.vue create mode 100644 uview-ui/components/u-button/vue.scss create mode 100644 uview-ui/components/u-calendar/header.vue create mode 100644 uview-ui/components/u-calendar/month.vue create mode 100644 uview-ui/components/u-calendar/props.js create mode 100644 uview-ui/components/u-calendar/u-calendar.vue create mode 100644 uview-ui/components/u-calendar/util.js create mode 100644 uview-ui/components/u-car-keyboard/props.js create mode 100644 uview-ui/components/u-car-keyboard/u-car-keyboard.vue create mode 100644 uview-ui/components/u-cell-group/props.js create mode 100644 uview-ui/components/u-cell-group/u-cell-group.vue create mode 100644 uview-ui/components/u-cell/props.js create mode 100644 uview-ui/components/u-cell/u-cell.vue create mode 100644 uview-ui/components/u-checkbox-group/props.js create mode 100644 uview-ui/components/u-checkbox-group/u-checkbox-group.vue create mode 100644 uview-ui/components/u-checkbox/props.js create mode 100644 uview-ui/components/u-checkbox/u-checkbox.vue create mode 100644 uview-ui/components/u-circle-progress/props.js create mode 100644 uview-ui/components/u-circle-progress/u-circle-progress.vue create mode 100644 uview-ui/components/u-code-input/props.js create mode 100644 uview-ui/components/u-code-input/u-code-input.vue create mode 100644 uview-ui/components/u-code/props.js create mode 100644 uview-ui/components/u-code/u-code.vue create mode 100644 uview-ui/components/u-col/props.js create mode 100644 uview-ui/components/u-col/u-col.vue create mode 100644 uview-ui/components/u-collapse-item/props.js create mode 100644 uview-ui/components/u-collapse-item/u-collapse-item.vue create mode 100644 uview-ui/components/u-collapse/props.js create mode 100644 uview-ui/components/u-collapse/u-collapse.vue create mode 100644 uview-ui/components/u-column-notice/props.js create mode 100644 uview-ui/components/u-column-notice/u-column-notice.vue create mode 100644 uview-ui/components/u-count-down/props.js create mode 100644 uview-ui/components/u-count-down/u-count-down.vue create mode 100644 uview-ui/components/u-count-down/utils.js create mode 100644 uview-ui/components/u-count-to/props.js create mode 100644 uview-ui/components/u-count-to/u-count-to.vue create mode 100644 uview-ui/components/u-datetime-picker/props.js create mode 100644 uview-ui/components/u-datetime-picker/u-datetime-picker.vue create mode 100644 uview-ui/components/u-divider/props.js create mode 100644 uview-ui/components/u-divider/u-divider.vue create mode 100644 uview-ui/components/u-dropdown-item/props.js create mode 100644 uview-ui/components/u-dropdown-item/u-dropdown-item.vue create mode 100644 uview-ui/components/u-dropdown/props.js create mode 100644 uview-ui/components/u-dropdown/u-dropdown.vue create mode 100644 uview-ui/components/u-empty/props.js create mode 100644 uview-ui/components/u-empty/u-empty.vue create mode 100644 uview-ui/components/u-form-item/props.js create mode 100644 uview-ui/components/u-form-item/u-form-item.vue create mode 100644 uview-ui/components/u-form/props.js create mode 100644 uview-ui/components/u-form/u-form.vue create mode 100644 uview-ui/components/u-gap/props.js create mode 100644 uview-ui/components/u-gap/u-gap.vue create mode 100644 uview-ui/components/u-grid-item/props.js create mode 100644 uview-ui/components/u-grid-item/u-grid-item.vue create mode 100644 uview-ui/components/u-grid/props.js create mode 100644 uview-ui/components/u-grid/u-grid.vue create mode 100644 uview-ui/components/u-icon/icons.js create mode 100644 uview-ui/components/u-icon/props.js create mode 100644 uview-ui/components/u-icon/u-icon.vue create mode 100644 uview-ui/components/u-image/props.js create mode 100644 uview-ui/components/u-image/u-image.vue create mode 100644 uview-ui/components/u-index-anchor/props.js create mode 100644 uview-ui/components/u-index-anchor/u-index-anchor.vue create mode 100644 uview-ui/components/u-index-item/props.js create mode 100644 uview-ui/components/u-index-item/u-index-item.vue create mode 100644 uview-ui/components/u-index-list/props.js create mode 100644 uview-ui/components/u-index-list/u-index-list.vue create mode 100644 uview-ui/components/u-input/props.js create mode 100644 uview-ui/components/u-input/u-input.vue create mode 100644 uview-ui/components/u-keyboard/props.js create mode 100644 uview-ui/components/u-keyboard/u-keyboard.vue create mode 100644 uview-ui/components/u-line-progress/props.js create mode 100644 uview-ui/components/u-line-progress/u-line-progress.vue create mode 100644 uview-ui/components/u-line/props.js create mode 100644 uview-ui/components/u-line/u-line.vue create mode 100644 uview-ui/components/u-link/props.js create mode 100644 uview-ui/components/u-link/u-link.vue create mode 100644 uview-ui/components/u-list-item/props.js create mode 100644 uview-ui/components/u-list-item/u-list-item.vue create mode 100644 uview-ui/components/u-list/props.js create mode 100644 uview-ui/components/u-list/u-list.vue create mode 100644 uview-ui/components/u-loading-icon/props.js create mode 100644 uview-ui/components/u-loading-icon/u-loading-icon.vue create mode 100644 uview-ui/components/u-loading-page/props.js create mode 100644 uview-ui/components/u-loading-page/u-loading-page.vue create mode 100644 uview-ui/components/u-loadmore/props.js create mode 100644 uview-ui/components/u-loadmore/u-loadmore.vue create mode 100644 uview-ui/components/u-modal/props.js create mode 100644 uview-ui/components/u-modal/u-modal.vue create mode 100644 uview-ui/components/u-navbar/props.js create mode 100644 uview-ui/components/u-navbar/u-navbar.vue create mode 100644 uview-ui/components/u-no-network/props.js create mode 100644 uview-ui/components/u-no-network/u-no-network.vue create mode 100644 uview-ui/components/u-notice-bar/props.js create mode 100644 uview-ui/components/u-notice-bar/u-notice-bar.vue create mode 100644 uview-ui/components/u-notify/props.js create mode 100644 uview-ui/components/u-notify/u-notify.vue create mode 100644 uview-ui/components/u-number-box/props.js create mode 100644 uview-ui/components/u-number-box/u-number-box.vue create mode 100644 uview-ui/components/u-number-keyboard/props.js create mode 100644 uview-ui/components/u-number-keyboard/u-number-keyboard.vue create mode 100644 uview-ui/components/u-overlay/props.js create mode 100644 uview-ui/components/u-overlay/u-overlay.vue create mode 100644 uview-ui/components/u-parse/node/node.vue create mode 100644 uview-ui/components/u-parse/parser.js create mode 100644 uview-ui/components/u-parse/props.js create mode 100644 uview-ui/components/u-parse/u-parse.vue create mode 100644 uview-ui/components/u-picker-column/props.js create mode 100644 uview-ui/components/u-picker-column/u-picker-column.vue create mode 100644 uview-ui/components/u-picker/props.js create mode 100644 uview-ui/components/u-picker/u-picker.vue create mode 100644 uview-ui/components/u-popup/props.js create mode 100644 uview-ui/components/u-popup/u-popup.vue create mode 100644 uview-ui/components/u-radio-group/props.js create mode 100644 uview-ui/components/u-radio-group/u-radio-group.vue create mode 100644 uview-ui/components/u-radio/props.js create mode 100644 uview-ui/components/u-radio/u-radio.vue create mode 100644 uview-ui/components/u-rate/props.js create mode 100644 uview-ui/components/u-rate/u-rate.vue create mode 100644 uview-ui/components/u-read-more/props.js create mode 100644 uview-ui/components/u-read-more/u-read-more.vue create mode 100644 uview-ui/components/u-row-notice/props.js create mode 100644 uview-ui/components/u-row-notice/u-row-notice.vue create mode 100644 uview-ui/components/u-row/props.js create mode 100644 uview-ui/components/u-row/u-row.vue create mode 100644 uview-ui/components/u-safe-bottom/props.js create mode 100644 uview-ui/components/u-safe-bottom/u-safe-bottom.vue create mode 100644 uview-ui/components/u-scroll-list/nvue.js create mode 100644 uview-ui/components/u-scroll-list/other.js create mode 100644 uview-ui/components/u-scroll-list/props.js create mode 100644 uview-ui/components/u-scroll-list/scrollWxs.wxs create mode 100644 uview-ui/components/u-scroll-list/u-scroll-list.vue create mode 100644 uview-ui/components/u-search/props.js create mode 100644 uview-ui/components/u-search/u-search.vue create mode 100644 uview-ui/components/u-skeleton/props.js create mode 100644 uview-ui/components/u-skeleton/u-skeleton.vue create mode 100644 uview-ui/components/u-slider/mpother.js create mode 100644 uview-ui/components/u-slider/mpwxs.js create mode 100644 uview-ui/components/u-slider/mpwxs.wxs create mode 100644 uview-ui/components/u-slider/nvue - 鍓湰.js create mode 100644 uview-ui/components/u-slider/nvue.js create mode 100644 uview-ui/components/u-slider/props.js create mode 100644 uview-ui/components/u-slider/u-slider.vue create mode 100644 uview-ui/components/u-status-bar/props.js create mode 100644 uview-ui/components/u-status-bar/u-status-bar.vue create mode 100644 uview-ui/components/u-steps-item/props.js create mode 100644 uview-ui/components/u-steps-item/u-steps-item.vue create mode 100644 uview-ui/components/u-steps/props.js create mode 100644 uview-ui/components/u-steps/u-steps.vue create mode 100644 uview-ui/components/u-sticky/props.js create mode 100644 uview-ui/components/u-sticky/u-sticky.vue create mode 100644 uview-ui/components/u-subsection/props.js create mode 100644 uview-ui/components/u-subsection/u-subsection.vue create mode 100644 uview-ui/components/u-swipe-action-item/index - backup.wxs create mode 100644 uview-ui/components/u-swipe-action-item/index.wxs create mode 100644 uview-ui/components/u-swipe-action-item/nvue - backup.js create mode 100644 uview-ui/components/u-swipe-action-item/nvue.js create mode 100644 uview-ui/components/u-swipe-action-item/props.js create mode 100644 uview-ui/components/u-swipe-action-item/u-swipe-action-item.vue create mode 100644 uview-ui/components/u-swipe-action-item/wxs.js create mode 100644 uview-ui/components/u-swipe-action/props.js create mode 100644 uview-ui/components/u-swipe-action/u-swipe-action.vue create mode 100644 uview-ui/components/u-swiper-indicator/props.js create mode 100644 uview-ui/components/u-swiper-indicator/u-swiper-indicator.vue create mode 100644 uview-ui/components/u-swiper/props.js create mode 100644 uview-ui/components/u-swiper/u-swiper.vue create mode 100644 uview-ui/components/u-switch/props.js create mode 100644 uview-ui/components/u-switch/u-switch.vue create mode 100644 uview-ui/components/u-tabbar-item/props.js create mode 100644 uview-ui/components/u-tabbar-item/u-tabbar-item.vue create mode 100644 uview-ui/components/u-tabbar/props.js create mode 100644 uview-ui/components/u-tabbar/u-tabbar.vue create mode 100644 uview-ui/components/u-table/props.js create mode 100644 uview-ui/components/u-table/u-table.vue create mode 100644 uview-ui/components/u-tabs-item/props.js create mode 100644 uview-ui/components/u-tabs-item/u-tabs-item.vue create mode 100644 uview-ui/components/u-tabs/props.js create mode 100644 uview-ui/components/u-tabs/u-tabs.vue create mode 100644 uview-ui/components/u-tag/props.js create mode 100644 uview-ui/components/u-tag/u-tag.vue create mode 100644 uview-ui/components/u-td/props.js create mode 100644 uview-ui/components/u-td/u-td.vue create mode 100644 uview-ui/components/u-text/props.js create mode 100644 uview-ui/components/u-text/u-text.vue create mode 100644 uview-ui/components/u-text/value.js create mode 100644 uview-ui/components/u-textarea/props.js create mode 100644 uview-ui/components/u-textarea/u-textarea.vue create mode 100644 uview-ui/components/u-toast/u-toast.vue create mode 100644 uview-ui/components/u-toolbar/props.js create mode 100644 uview-ui/components/u-toolbar/u-toolbar.vue create mode 100644 uview-ui/components/u-tooltip/clipboard.min.js create mode 100644 uview-ui/components/u-tooltip/props.js create mode 100644 uview-ui/components/u-tooltip/u-tooltip.vue create mode 100644 uview-ui/components/u-tr/props.js create mode 100644 uview-ui/components/u-tr/u-tr.vue create mode 100644 uview-ui/components/u-transition/nvue.ani-map.js create mode 100644 uview-ui/components/u-transition/props.js create mode 100644 uview-ui/components/u-transition/transition.js create mode 100644 uview-ui/components/u-transition/u-transition.vue create mode 100644 uview-ui/components/u-transition/vue.ani-style.scss create mode 100644 uview-ui/components/u-upload/mixin.js create mode 100644 uview-ui/components/u-upload/props.js create mode 100644 uview-ui/components/u-upload/u-upload.vue create mode 100644 uview-ui/components/u-upload/utils.js create mode 100644 uview-ui/components/uview-ui/uview-ui.vue create mode 100644 uview-ui/index.js create mode 100644 uview-ui/index.scss create mode 100644 uview-ui/libs/config/color.js create mode 100644 uview-ui/libs/config/config.js create mode 100644 uview-ui/libs/config/props.js create mode 100644 uview-ui/libs/config/props/actionSheet.js create mode 100644 uview-ui/libs/config/props/album.js create mode 100644 uview-ui/libs/config/props/alert.js create mode 100644 uview-ui/libs/config/props/avatar.js create mode 100644 uview-ui/libs/config/props/avatarGroup.js create mode 100644 uview-ui/libs/config/props/backtop.js create mode 100644 uview-ui/libs/config/props/badge.js create mode 100644 uview-ui/libs/config/props/button.js create mode 100644 uview-ui/libs/config/props/calendar.js create mode 100644 uview-ui/libs/config/props/carKeyboard.js create mode 100644 uview-ui/libs/config/props/cell.js create mode 100644 uview-ui/libs/config/props/cellGroup.js create mode 100644 uview-ui/libs/config/props/checkbox.js create mode 100644 uview-ui/libs/config/props/checkboxGroup.js create mode 100644 uview-ui/libs/config/props/circleProgress.js create mode 100644 uview-ui/libs/config/props/code.js create mode 100644 uview-ui/libs/config/props/codeInput.js create mode 100644 uview-ui/libs/config/props/col.js create mode 100644 uview-ui/libs/config/props/collapse.js create mode 100644 uview-ui/libs/config/props/collapseItem.js create mode 100644 uview-ui/libs/config/props/columnNotice.js create mode 100644 uview-ui/libs/config/props/countDown.js create mode 100644 uview-ui/libs/config/props/countTo.js create mode 100644 uview-ui/libs/config/props/datetimePicker.js create mode 100644 uview-ui/libs/config/props/divider.js create mode 100644 uview-ui/libs/config/props/empty.js create mode 100644 uview-ui/libs/config/props/form.js create mode 100644 uview-ui/libs/config/props/formItem.js create mode 100644 uview-ui/libs/config/props/gap.js create mode 100644 uview-ui/libs/config/props/grid.js create mode 100644 uview-ui/libs/config/props/gridItem.js create mode 100644 uview-ui/libs/config/props/icon.js create mode 100644 uview-ui/libs/config/props/image.js create mode 100644 uview-ui/libs/config/props/indexAnchor.js create mode 100644 uview-ui/libs/config/props/indexList.js create mode 100644 uview-ui/libs/config/props/input.js create mode 100644 uview-ui/libs/config/props/keyboard.js create mode 100644 uview-ui/libs/config/props/line.js create mode 100644 uview-ui/libs/config/props/lineProgress.js create mode 100644 uview-ui/libs/config/props/link.js create mode 100644 uview-ui/libs/config/props/list.js create mode 100644 uview-ui/libs/config/props/listItem.js create mode 100644 uview-ui/libs/config/props/loadingIcon.js create mode 100644 uview-ui/libs/config/props/loadingPage.js create mode 100644 uview-ui/libs/config/props/loadmore.js create mode 100644 uview-ui/libs/config/props/modal.js create mode 100644 uview-ui/libs/config/props/navbar.js create mode 100644 uview-ui/libs/config/props/noNetwork.js create mode 100644 uview-ui/libs/config/props/noticeBar.js create mode 100644 uview-ui/libs/config/props/notify.js create mode 100644 uview-ui/libs/config/props/numberBox.js create mode 100644 uview-ui/libs/config/props/numberKeyboard.js create mode 100644 uview-ui/libs/config/props/overlay.js create mode 100644 uview-ui/libs/config/props/parse.js create mode 100644 uview-ui/libs/config/props/picker.js create mode 100644 uview-ui/libs/config/props/popup.js create mode 100644 uview-ui/libs/config/props/radio.js create mode 100644 uview-ui/libs/config/props/radioGroup.js create mode 100644 uview-ui/libs/config/props/rate.js create mode 100644 uview-ui/libs/config/props/readMore.js create mode 100644 uview-ui/libs/config/props/row.js create mode 100644 uview-ui/libs/config/props/rowNotice.js create mode 100644 uview-ui/libs/config/props/scrollList.js create mode 100644 uview-ui/libs/config/props/search.js create mode 100644 uview-ui/libs/config/props/section.js create mode 100644 uview-ui/libs/config/props/skeleton.js create mode 100644 uview-ui/libs/config/props/slider.js create mode 100644 uview-ui/libs/config/props/statusBar.js create mode 100644 uview-ui/libs/config/props/steps.js create mode 100644 uview-ui/libs/config/props/stepsItem.js create mode 100644 uview-ui/libs/config/props/sticky.js create mode 100644 uview-ui/libs/config/props/subsection.js create mode 100644 uview-ui/libs/config/props/swipeAction.js create mode 100644 uview-ui/libs/config/props/swipeActionItem.js create mode 100644 uview-ui/libs/config/props/swiper.js create mode 100644 uview-ui/libs/config/props/swipterIndicator.js create mode 100644 uview-ui/libs/config/props/switch.js create mode 100644 uview-ui/libs/config/props/tabbar.js create mode 100644 uview-ui/libs/config/props/tabbarItem.js create mode 100644 uview-ui/libs/config/props/tabs.js create mode 100644 uview-ui/libs/config/props/tag.js create mode 100644 uview-ui/libs/config/props/text.js create mode 100644 uview-ui/libs/config/props/textarea.js create mode 100644 uview-ui/libs/config/props/toast.js create mode 100644 uview-ui/libs/config/props/toolbar.js create mode 100644 uview-ui/libs/config/props/tooltip.js create mode 100644 uview-ui/libs/config/props/transition.js create mode 100644 uview-ui/libs/config/props/upload.js create mode 100644 uview-ui/libs/config/zIndex.js create mode 100644 uview-ui/libs/css/color.scss create mode 100644 uview-ui/libs/css/common.scss create mode 100644 uview-ui/libs/css/components.scss create mode 100644 uview-ui/libs/css/flex.scss create mode 100644 uview-ui/libs/css/h5.scss create mode 100644 uview-ui/libs/css/mixin.scss create mode 100644 uview-ui/libs/css/mp.scss create mode 100644 uview-ui/libs/css/nvue.scss create mode 100644 uview-ui/libs/css/vue.scss create mode 100644 uview-ui/libs/function/colorGradient.js create mode 100644 uview-ui/libs/function/debounce.js create mode 100644 uview-ui/libs/function/digit.js create mode 100644 uview-ui/libs/function/index.js create mode 100644 uview-ui/libs/function/platform.js create mode 100644 uview-ui/libs/function/test.js create mode 100644 uview-ui/libs/function/throttle.js create mode 100644 uview-ui/libs/luch-request/adapters/index.js create mode 100644 uview-ui/libs/luch-request/core/InterceptorManager.js create mode 100644 uview-ui/libs/luch-request/core/Request.js create mode 100644 uview-ui/libs/luch-request/core/buildFullPath.js create mode 100644 uview-ui/libs/luch-request/core/defaults.js create mode 100644 uview-ui/libs/luch-request/core/dispatchRequest.js create mode 100644 uview-ui/libs/luch-request/core/mergeConfig.js create mode 100644 uview-ui/libs/luch-request/core/settle.js create mode 100644 uview-ui/libs/luch-request/helpers/buildURL.js create mode 100644 uview-ui/libs/luch-request/helpers/combineURLs.js create mode 100644 uview-ui/libs/luch-request/helpers/isAbsoluteURL.js create mode 100644 uview-ui/libs/luch-request/index.d.ts create mode 100644 uview-ui/libs/luch-request/index.js create mode 100644 uview-ui/libs/luch-request/utils.js create mode 100644 uview-ui/libs/luch-request/utils/clone.js create mode 100644 uview-ui/libs/mixin/button.js create mode 100644 uview-ui/libs/mixin/mixin.js create mode 100644 uview-ui/libs/mixin/mpMixin.js create mode 100644 uview-ui/libs/mixin/mpShare.js create mode 100644 uview-ui/libs/mixin/openType.js create mode 100644 uview-ui/libs/mixin/style.js create mode 100644 uview-ui/libs/mixin/touch.js create mode 100644 uview-ui/libs/util/async-validator.js create mode 100644 uview-ui/libs/util/calendar.js create mode 100644 uview-ui/libs/util/dayjs.js create mode 100644 uview-ui/libs/util/emitter.js create mode 100644 uview-ui/libs/util/route.js create mode 100644 uview-ui/package.json create mode 100644 uview-ui/theme.scss diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..81f7c92 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/node_modules +/unpackage \ No newline at end of file diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json new file mode 100644 index 0000000..0b0655a --- /dev/null +++ b/.hbuilderx/launch.json @@ -0,0 +1,16 @@ +{ + "version" : "1.0", + "configurations" : [ + { + "playground" : "custom", + "type" : "uni-app:app-android" + }, + { + "app-plus" : + { + "launchtype" : "local" + }, + "type" : "uniCloud" + } + ] +} diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..5417364 --- /dev/null +++ b/App.vue @@ -0,0 +1,25 @@ + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..1429203 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# inv-app + +商品出入库app \ No newline at end of file diff --git a/common/index.js b/common/index.js new file mode 100644 index 0000000..b21f252 --- /dev/null +++ b/common/index.js @@ -0,0 +1,25 @@ +/* 非空验证 */ +const vefEmpty = (key,msg) => { + if (key === '' || key === undefined || key === null) { + uni.showToast({ + title: msg, + duration: 2000, + icon: 'none' + }); + return false + } else { + return true + } +} + +const addZero = (num) => { + if (num < 10) { + num = `0${num}`; + } + return num; +}; + +export default { + vefEmpty, + addZero +} \ No newline at end of file diff --git a/common/updown/oa-app.keystore b/common/updown/oa-app.keystore new file mode 100644 index 0000000000000000000000000000000000000000..313cc1e77c74fc161dfeab45bcbcd7533bbc0816 GIT binary patch literal 2160 zcmb_c`8N~{8=b{I7-Ja`vP~w$7&Mj{vXp%%QYnT(w#hKE#vuEPM2xL$)iB7CrDXRa zDV6Pz21S;!Bzj*oKHu`5(;x8taDTY>+;g7i+~+x$#bhx7008J1!2f_f$laYtJZ4F^ zBMS@x0CpgX!uAWr&%vX_0b~Ozf?z-(JAjSCwvvW86sfZ<-KQweZnbRjEYhJJWr-iw zB>tFPx?{Hia*@GQMq&F}I*RmH`@g3XAigIgB*V8R-_PZo>_gt3-FI!XZg0{46lQE< znnmvCoJ(rDq9d&-0J+XpK?-z{`gAF;M&CedY;G9w6ChnV@wqG=2ff|7?O~)xLnl4C z{vuoOfkrGY-|s|5!gyl9R9bbQB#8=cMjEHzYb(eO zKbY~i3-j_`(2I11h?>jBZ&|3$l{Y-O+|F0nI4q;#glw7aH%p~Oik$tFJ8@gf<7Tb= z;KkvclNs(l%~0k!cSdWQBQx{ueCNW`@}EJ|3rPI~|EXOn7zAw@;`_Jhv+rclxZZ)(@M7?r!i%`1qw>I?GflN{&}qB#nJF=`RR-FuIIeOV zM`FU{Ykc=6FL zcpQ*^33LdJq||#Z{CQVF7@V=JSjiPwQd6+uf2N?fTAZN#g0_b}q7#yzM9_K^>#arY z8cPSK2o{atr|W2piE#)oFFJgC_OF+GOL=EilbspgM+H?<;J-*woAV_mQbAMhqHdkV zpw26M+5%;3DnCs1L+uy8epG>;eoW{Z4iP$RviJG3K*cZHS*$YHzM~5Nh1Qk~14|u@ zFDPL29M5kM52Oa+g?M%2tj_GHwQK&@K(}BkyPC{M|0i#)K0JCD=Q8Qi-CM_B*%^h! zZ0DD@7fJ_U677S~3MfOgBmA*xq0|g8r!Q~OLJ@k^3zk>?*sc)p{HDp;*5z*$a)g2I z%Ni;5@xI=l&#K0q=o(5P6-N!cGPds+ClB|?_m!xkIO;T?KQ4cl9?$i0Y;bzAy5Y`h zzH+k7OI6QHrlF%U_p#~SQ>k~vs#v?94d#q=j2N5(2;xn0R}|ijG2regLAkg>t-yFZ zRNYUTb)GISCDlg5hCJQsL_BQA6VNQJY}~z#pd)dZweIpo+g{CS2vx#!1U6}Qjg_Dz zlkzTmotZG4suOOQ)F2PQvCE)>4} z^-jmUxo}3-wqzNZ3uA_WM_pY??TC78HxC5BfAo7s~tSnzxNrYbXYS>cEy@#M%V6D4sCBjT6~)hsM{<| z9$f1%D_Wj|BCLx%odv!}WWmpKMz+`yohHd^I?Jy=XZ!e{qQ#t!DGCZU-SMq&@0}2` z%=yY@@nuF?Q>^w^s~R>q7j8v<>-%atIy~~;esGG!+fpMVwr8b0`|9NSF&n8@XMSW& zCJ>q)r-67fZd9+Eqg71O$QDd_flWC_WBu#k;0=fARr=5Ox5{Pz{3O<^VgfaR`Botkncj0{28a;I%<&%s_%{PeT9gm1j?z$5N1@fV)wNttK+$T)f;t-YKjHr}g#wiQ zefi^R2UCDh0Ezv*A8fd~dK( zea_q!SSeL{kOwWHQ(oJ7*dvf6}Ymt_Py$ zA6yonw?td%4H2(VxFS@Uh4p08|s4$gdC$Hc~lxZP4Aw2e^YtO}DedFkKUR8t8j>=J7koDtoo zH~2qnLd~s25G3ZFW;gC?c-6dMwi~Tad%$#{xKaHZeYMQ$Pd%mRp5{|mZcnN6@x#6v zOpL_8&h|uzIxMW&MlYNl3YrP{ViLDy;4eZ-sc-1w5eYl7x!r5z=vlHZEyFnU5ZsMR z?>)kZdp&d?OaDbO8@Pb;(G|a;4V6YYcdE*LWXE{9;u#FQgn^?xUHP5-ENLP&(mU+w zmT-hQ!jBMq>3wubd<87e=7spFM-+V9ybf2g^@8l_RJkME97RX&*EC+?WUR)>ET*;L auU+6yGa_XwIMbh_UNF + + + + + + + + + + + + + + + + diff --git a/components/tki-barcode/barcode.js b/components/tki-barcode/barcode.js new file mode 100644 index 0000000..04ee812 --- /dev/null +++ b/components/tki-barcode/barcode.js @@ -0,0 +1,190 @@ +const barcodes = require('./barcodes/index.js')['default']; +let barcode = {}; +(function () { + // 初始化 + barcode = function (cont, ctxid, options, ctxsize, result) { + let ops = {}, newOptions, encodings, globaContext, ctx, globaCtxid, cbCanvasSize, cbResult; + globaCtxid = ctxid + cbCanvasSize = ctxsize + cbResult = result + newOptions = Object.assign(ops, options); + // 修成margin + fixMargin(newOptions) + // 处理options 数据 + if (newOptions.text == '' || cont == '') { + return false + } + // 获取ctx + globaContext = cont + ctx = uni.createCanvasContext(globaCtxid, globaContext) + // 获取编码数据 + encodings = new barcodes[newOptions.format.toUpperCase()](newOptions.text, newOptions).encode() + let fixencodings = fixEncodings(encodings, newOptions) + // 返回canvas实际大小 + cbCanvasSize({ width: fixencodings.width, height: fixencodings.height }) + // 绘制canvas + setTimeout(() => { + drawCanvas.render(newOptions, fixencodings) + }, 50); + // 绘制canvas + let drawCanvas = { + render(options, encoding) { + this.prepare(options, encoding) + encoding.encodings.forEach((v, i) => { + this.barcode(options, v) + this.text(options, v) + this.move(v) + }); + this.draw(options, encoding) + }, + barcode(options, encoding) { + let binary = encoding.data; + let yFrom; + if (options.textPosition == "top") { + yFrom = options.marginTop + options.fontSize + options.textMargin; + } else { + yFrom = options.marginTop; + } + // 绘制条码 + ctx.fillStyle = options.lineColor; + for (let b = 0; b < binary.length; b++) { + let x = b * options.width + encoding.barcodePadding; + let height = options.height + if (encoding.options) { + if (encoding.options.height != undefined) { + height = encoding.options.height + } + } + if (binary[b] === "1") { + ctx.fillRect(x, yFrom, options.width, height); + } else if (binary[b]) { + ctx.fillRect(x, yFrom, options.width, height * binary[b]); + } + } + }, + text(options, encoding) { + if (options.displayValue) { + let x, y, align, size; + if (options.textPosition == "top") { + y = options.marginTop + options.fontSize; + } else { + y = options.height + options.textMargin + options.marginTop + options.fontSize; + } + if (encoding.options) { + if (encoding.options.textAlign != undefined) { + align = encoding.options.textAlign + } + if (encoding.options.fontSize != undefined) { + size = encoding.options.fontSize + } + } else { + align = options.textAlign + size = options.fontSize + } + ctx.setFontSize(size) + if (align == "left" || encoding.barcodePadding > 0) { + x = 0; + ctx.setTextAlign('left') + } else if (align == "right") { + x = encoding.width - 1; + ctx.setTextAlign('right') + } + else { + x = encoding.width / 2; + ctx.setTextAlign('center'); + } + ctx.fillStyle = options.fontColor; + if (encoding.text != undefined) { + ctx.fillText(encoding.text, x, y); + } + } + }, + move(encoding) { + ctx.translate(encoding.width, 0); + }, + prepare(options, encoding) { + // 绘制背景 + if (options.background) { + ctx.fillStyle = options.background; + ctx.fillRect(0, 0, encoding.width, encoding.height); + } + ctx.translate(options.marginLeft, 0); + }, + draw(options, encoding) { + ctx.draw(false, () => { + this.toImgs(options, encoding) + }) + }, + toImgs(options, encoding) { + setTimeout(() => { + uni.canvasToTempFilePath({ + width: encoding.width, + height: encoding.height, + destWidth: encoding.width, + destHeight: encoding.height, + canvasId: globaCtxid, + fileType: 'png', + success: function (res) { + cbResult(res.tempFilePath) + }, + fail: function (res) { + cbResult(res) + }, + complete: function () { + uni.hideLoading(); + }, + }, globaContext); + }, options.text.length + 100); + } + } + // 混入canvas数据 + function fixEncodings(encoding, options) { + let encodingArr = [], width = options.marginLeft + options.marginRight, height; + if (!Array.isArray(encoding)) { + encodingArr[0] = JSON.parse(JSON.stringify(encoding)) + } else { + encodingArr = [...encoding] + } + encodingArr.forEach((v, i) => { + // 获取文本宽度 + let textWidth = ctx.measureText(encodingArr[i].text ? encodingArr[i].text : '').width; + // 获取条形码宽度 + let barcodeWidth = encodingArr[i].data.length * options.width; + // 获取内边距 + let barcodePadding = 0; + if (options.displayValue && barcodeWidth < textWidth) { + if (options.textAlign == "center") { + barcodePadding = Math.floor((textWidth - barcodeWidth) / 2); + } else if (options.textAlign == "left") { + barcodePadding = 0; + } else if (options.textAlign == "right") { + barcodePadding = Math.floor(textWidth - barcodeWidth); + } + } + // 混入encodingArr[i] + encodingArr[i].barcodePadding = barcodePadding + encodingArr[i].width = Math.ceil(Math.max(textWidth, barcodeWidth)) + width += encodingArr[i].width + if (encodingArr[i].options) { + if (encodingArr[i].options.height != undefined) { + encodingArr[i].height = encodingArr[i].options.height + (options.displayValue && (encodingArr[i].text ? encodingArr[i].text : '').length > 0 ? options.fontSize + options.textMargin : 0) + options.marginTop + options.marginBottom; + } else { + encodingArr[i].height = height = options.height + (options.displayValue && (encodingArr[i].text ? encodingArr[i].text : '').length > 0 ? options.fontSize + options.textMargin : 0) + options.marginTop + options.marginBottom; + } + } else { + encodingArr[i].height = height = options.height + (options.displayValue && (encodingArr[i].text ? encodingArr[i].text : '').length > 0 ? options.fontSize + options.textMargin : 0) + options.marginTop + options.marginBottom; + } + }); + return { encodings: encodingArr, width, height }; + } + // 修正Margin + function fixMargin(options) { + options.marginTop = options.marginTop == undefined ? options.margin : options.marginTop; + options.marginBottom = options.marginBottom == undefined ? options.margin : options.marginBottom; + options.marginRight = options.marginRight == undefined ? options.margin : options.marginRight; + options.marginLeft = options.marginLeft == undefined ? options.margin : options.marginLeft; + } + }; +})() + +export default barcode \ No newline at end of file diff --git a/components/tki-barcode/barcodes/Barcode.js b/components/tki-barcode/barcodes/Barcode.js new file mode 100644 index 0000000..7138786 --- /dev/null +++ b/components/tki-barcode/barcodes/Barcode.js @@ -0,0 +1,17 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Barcode = function Barcode(data, options) { + _classCallCheck(this, Barcode); + + this.data = data; + this.text = options.text || data; + this.options = options; +}; + +exports.default = Barcode; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/CODE128/CODE128.js b/components/tki-barcode/barcodes/CODE128/CODE128.js new file mode 100644 index 0000000..2d47112 --- /dev/null +++ b/components/tki-barcode/barcodes/CODE128/CODE128.js @@ -0,0 +1,167 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _Barcode2 = require('../Barcode.js'); + +var _Barcode3 = _interopRequireDefault(_Barcode2); + +var _constants = require('./constants'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +// This is the master class, +// it does require the start code to be included in the string +var CODE128 = function (_Barcode) { + _inherits(CODE128, _Barcode); + + function CODE128(data, options) { + _classCallCheck(this, CODE128); + + // Get array of ascii codes from data + var _this = _possibleConstructorReturn(this, (CODE128.__proto__ || Object.getPrototypeOf(CODE128)).call(this, data.substring(1), options)); + + _this.bytes = data.split('').map(function (char) { + return char.charCodeAt(0); + }); + return _this; + } + + _createClass(CODE128, [{ + key: 'valid', + value: function valid() { + // ASCII value ranges 0-127, 200-211 + return (/^[\x00-\x7F\xC8-\xD3]+$/.test(this.data) + ); + } + + // The public encoding function + + }, { + key: 'encode', + value: function encode() { + var bytes = this.bytes; + // Remove the start code from the bytes and set its index + var startIndex = bytes.shift() - 105; + // Get start set by index + var startSet = _constants.SET_BY_CODE[startIndex]; + + if (startSet === undefined) { + throw new RangeError('The encoding does not start with a start character.'); + } + + if (this.shouldEncodeAsEan128() === true) { + bytes.unshift(_constants.FNC1); + } + + // Start encode with the right type + var encodingResult = CODE128.next(bytes, 1, startSet); + + return { + text: this.text === this.data ? this.text.replace(/[^\x20-\x7E]/g, '') : this.text, + data: + // Add the start bits + CODE128.getBar(startIndex) + + // Add the encoded bits + encodingResult.result + + // Add the checksum + CODE128.getBar((encodingResult.checksum + startIndex) % _constants.MODULO) + + // Add the end bits + CODE128.getBar(_constants.STOP) + }; + } + + // GS1-128/EAN-128 + + }, { + key: 'shouldEncodeAsEan128', + value: function shouldEncodeAsEan128() { + var isEAN128 = this.options.ean128 || false; + if (typeof isEAN128 === 'string') { + isEAN128 = isEAN128.toLowerCase() === 'true'; + } + return isEAN128; + } + + // Get a bar symbol by index + + }], [{ + key: 'getBar', + value: function getBar(index) { + return _constants.BARS[index] ? _constants.BARS[index].toString() : ''; + } + + // Correct an index by a set and shift it from the bytes array + + }, { + key: 'correctIndex', + value: function correctIndex(bytes, set) { + if (set === _constants.SET_A) { + var charCode = bytes.shift(); + return charCode < 32 ? charCode + 64 : charCode - 32; + } else if (set === _constants.SET_B) { + return bytes.shift() - 32; + } else { + return (bytes.shift() - 48) * 10 + bytes.shift() - 48; + } + } + }, { + key: 'next', + value: function next(bytes, pos, set) { + if (!bytes.length) { + return { result: '', checksum: 0 }; + } + + var nextCode = void 0, + index = void 0; + + // Special characters + if (bytes[0] >= 200) { + index = bytes.shift() - 105; + var nextSet = _constants.SWAP[index]; + + // Swap to other set + if (nextSet !== undefined) { + nextCode = CODE128.next(bytes, pos + 1, nextSet); + } + // Continue on current set but encode a special character + else { + // Shift + if ((set === _constants.SET_A || set === _constants.SET_B) && index === _constants.SHIFT) { + // Convert the next character so that is encoded correctly + bytes[0] = set === _constants.SET_A ? bytes[0] > 95 ? bytes[0] - 96 : bytes[0] : bytes[0] < 32 ? bytes[0] + 96 : bytes[0]; + } + nextCode = CODE128.next(bytes, pos + 1, set); + } + } + // Continue encoding + else { + index = CODE128.correctIndex(bytes, set); + nextCode = CODE128.next(bytes, pos + 1, set); + } + + // Get the correct binary encoding and calculate the weight + var enc = CODE128.getBar(index); + var weight = index * pos; + + return { + result: enc + nextCode.result, + checksum: weight + nextCode.checksum + }; + } + }]); + + return CODE128; +}(_Barcode3.default); + +exports.default = CODE128; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/CODE128/CODE128A.js b/components/tki-barcode/barcodes/CODE128/CODE128A.js new file mode 100644 index 0000000..28d9f11 --- /dev/null +++ b/components/tki-barcode/barcodes/CODE128/CODE128A.js @@ -0,0 +1,42 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _CODE2 = require('./CODE128.js'); + +var _CODE3 = _interopRequireDefault(_CODE2); + +var _constants = require('./constants'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var CODE128A = function (_CODE) { + _inherits(CODE128A, _CODE); + + function CODE128A(string, options) { + _classCallCheck(this, CODE128A); + + return _possibleConstructorReturn(this, (CODE128A.__proto__ || Object.getPrototypeOf(CODE128A)).call(this, _constants.A_START_CHAR + string, options)); + } + + _createClass(CODE128A, [{ + key: 'valid', + value: function valid() { + return new RegExp('^' + _constants.A_CHARS + '+$').test(this.data); + } + }]); + + return CODE128A; +}(_CODE3.default); + +exports.default = CODE128A; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/CODE128/CODE128B.js b/components/tki-barcode/barcodes/CODE128/CODE128B.js new file mode 100644 index 0000000..746c93b --- /dev/null +++ b/components/tki-barcode/barcodes/CODE128/CODE128B.js @@ -0,0 +1,42 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _CODE2 = require('./CODE128.js'); + +var _CODE3 = _interopRequireDefault(_CODE2); + +var _constants = require('./constants'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var CODE128B = function (_CODE) { + _inherits(CODE128B, _CODE); + + function CODE128B(string, options) { + _classCallCheck(this, CODE128B); + + return _possibleConstructorReturn(this, (CODE128B.__proto__ || Object.getPrototypeOf(CODE128B)).call(this, _constants.B_START_CHAR + string, options)); + } + + _createClass(CODE128B, [{ + key: 'valid', + value: function valid() { + return new RegExp('^' + _constants.B_CHARS + '+$').test(this.data); + } + }]); + + return CODE128B; +}(_CODE3.default); + +exports.default = CODE128B; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/CODE128/CODE128C.js b/components/tki-barcode/barcodes/CODE128/CODE128C.js new file mode 100644 index 0000000..b83ab9f --- /dev/null +++ b/components/tki-barcode/barcodes/CODE128/CODE128C.js @@ -0,0 +1,42 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _CODE2 = require('./CODE128.js'); + +var _CODE3 = _interopRequireDefault(_CODE2); + +var _constants = require('./constants'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var CODE128C = function (_CODE) { + _inherits(CODE128C, _CODE); + + function CODE128C(string, options) { + _classCallCheck(this, CODE128C); + + return _possibleConstructorReturn(this, (CODE128C.__proto__ || Object.getPrototypeOf(CODE128C)).call(this, _constants.C_START_CHAR + string, options)); + } + + _createClass(CODE128C, [{ + key: 'valid', + value: function valid() { + return new RegExp('^' + _constants.C_CHARS + '+$').test(this.data); + } + }]); + + return CODE128C; +}(_CODE3.default); + +exports.default = CODE128C; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/CODE128/CODE128_AUTO.js b/components/tki-barcode/barcodes/CODE128/CODE128_AUTO.js new file mode 100644 index 0000000..add94f4 --- /dev/null +++ b/components/tki-barcode/barcodes/CODE128/CODE128_AUTO.js @@ -0,0 +1,41 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _CODE2 = require('./CODE128'); + +var _CODE3 = _interopRequireDefault(_CODE2); + +var _auto = require('./auto'); + +var _auto2 = _interopRequireDefault(_auto); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var CODE128AUTO = function (_CODE) { + _inherits(CODE128AUTO, _CODE); + + function CODE128AUTO(data, options) { + _classCallCheck(this, CODE128AUTO); + + // ASCII value ranges 0-127, 200-211 + if (/^[\x00-\x7F\xC8-\xD3]+$/.test(data)) { + var _this = _possibleConstructorReturn(this, (CODE128AUTO.__proto__ || Object.getPrototypeOf(CODE128AUTO)).call(this, (0, _auto2.default)(data), options)); + } else { + var _this = _possibleConstructorReturn(this, (CODE128AUTO.__proto__ || Object.getPrototypeOf(CODE128AUTO)).call(this, data, options)); + } + return _possibleConstructorReturn(_this); + } + + return CODE128AUTO; +}(_CODE3.default); + +exports.default = CODE128AUTO; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/CODE128/auto.js b/components/tki-barcode/barcodes/CODE128/auto.js new file mode 100644 index 0000000..ed1d6ff --- /dev/null +++ b/components/tki-barcode/barcodes/CODE128/auto.js @@ -0,0 +1,73 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _constants = require('./constants'); + +// Match Set functions +var matchSetALength = function matchSetALength(string) { + return string.match(new RegExp('^' + _constants.A_CHARS + '*'))[0].length; +}; +var matchSetBLength = function matchSetBLength(string) { + return string.match(new RegExp('^' + _constants.B_CHARS + '*'))[0].length; +}; +var matchSetC = function matchSetC(string) { + return string.match(new RegExp('^' + _constants.C_CHARS + '*'))[0]; +}; + +// CODE128A or CODE128B +function autoSelectFromAB(string, isA) { + var ranges = isA ? _constants.A_CHARS : _constants.B_CHARS; + var untilC = string.match(new RegExp('^(' + ranges + '+?)(([0-9]{2}){2,})([^0-9]|$)')); + + if (untilC) { + return untilC[1] + String.fromCharCode(204) + autoSelectFromC(string.substring(untilC[1].length)); + } + + var chars = string.match(new RegExp('^' + ranges + '+'))[0]; + + if (chars.length === string.length) { + return string; + } + + return chars + String.fromCharCode(isA ? 205 : 206) + autoSelectFromAB(string.substring(chars.length), !isA); +} + +// CODE128C +function autoSelectFromC(string) { + var cMatch = matchSetC(string); + var length = cMatch.length; + + if (length === string.length) { + return string; + } + + string = string.substring(length); + + // Select A/B depending on the longest match + var isA = matchSetALength(string) >= matchSetBLength(string); + return cMatch + String.fromCharCode(isA ? 206 : 205) + autoSelectFromAB(string, isA); +} + +// Detect Code Set (A, B or C) and format the string + +exports.default = function (string) { + var newString = void 0; + var cLength = matchSetC(string).length; + + // Select 128C if the string start with enough digits + if (cLength >= 2) { + newString = _constants.C_START_CHAR + autoSelectFromC(string); + } else { + // Select A/B depending on the longest match + var isA = matchSetALength(string) > matchSetBLength(string); + newString = (isA ? _constants.A_START_CHAR : _constants.B_START_CHAR) + autoSelectFromAB(string, isA); + } + + return newString.replace(/[\xCD\xCE]([^])[\xCD\xCE]/, // Any sequence between 205 and 206 characters + function (match, char) { + return String.fromCharCode(203) + char; + }); +}; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/CODE128/constants.js b/components/tki-barcode/barcodes/CODE128/constants.js new file mode 100644 index 0000000..b992c0e --- /dev/null +++ b/components/tki-barcode/barcodes/CODE128/constants.js @@ -0,0 +1,54 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _SET_BY_CODE; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +// constants for internal usage +var SET_A = exports.SET_A = 0; +var SET_B = exports.SET_B = 1; +var SET_C = exports.SET_C = 2; + +// Special characters +var SHIFT = exports.SHIFT = 98; +var START_A = exports.START_A = 103; +var START_B = exports.START_B = 104; +var START_C = exports.START_C = 105; +var MODULO = exports.MODULO = 103; +var STOP = exports.STOP = 106; +var FNC1 = exports.FNC1 = 207; + +// Get set by start code +var SET_BY_CODE = exports.SET_BY_CODE = (_SET_BY_CODE = {}, _defineProperty(_SET_BY_CODE, START_A, SET_A), _defineProperty(_SET_BY_CODE, START_B, SET_B), _defineProperty(_SET_BY_CODE, START_C, SET_C), _SET_BY_CODE); + +// Get next set by code +var SWAP = exports.SWAP = { + 101: SET_A, + 100: SET_B, + 99: SET_C +}; + +var A_START_CHAR = exports.A_START_CHAR = String.fromCharCode(208); // START_A + 105 +var B_START_CHAR = exports.B_START_CHAR = String.fromCharCode(209); // START_B + 105 +var C_START_CHAR = exports.C_START_CHAR = String.fromCharCode(210); // START_C + 105 + +// 128A (Code Set A) +// ASCII characters 00 to 95 (0–9, A–Z and control codes), special characters, and FNC 1–4 +var A_CHARS = exports.A_CHARS = "[\x00-\x5F\xC8-\xCF]"; + +// 128B (Code Set B) +// ASCII characters 32 to 127 (0–9, A–Z, a–z), special characters, and FNC 1–4 +var B_CHARS = exports.B_CHARS = "[\x20-\x7F\xC8-\xCF]"; + +// 128C (Code Set C) +// 00–99 (encodes two digits with a single code point) and FNC1 +var C_CHARS = exports.C_CHARS = "(\xCF*[0-9]{2}\xCF*)"; + +// CODE128 includes 107 symbols: +// 103 data symbols, 3 start symbols (A, B and C), and 1 stop symbol (the last one) +// Each symbol consist of three black bars (1) and three white spaces (0). +var BARS = exports.BARS = [11011001100, 11001101100, 11001100110, 10010011000, 10010001100, 10001001100, 10011001000, 10011000100, 10001100100, 11001001000, 11001000100, 11000100100, 10110011100, 10011011100, 10011001110, 10111001100, 10011101100, 10011100110, 11001110010, 11001011100, 11001001110, 11011100100, 11001110100, 11101101110, 11101001100, 11100101100, 11100100110, 11101100100, 11100110100, 11100110010, 11011011000, 11011000110, 11000110110, 10100011000, 10001011000, 10001000110, 10110001000, 10001101000, 10001100010, 11010001000, 11000101000, 11000100010, 10110111000, 10110001110, 10001101110, 10111011000, 10111000110, 10001110110, 11101110110, 11010001110, 11000101110, 11011101000, 11011100010, 11011101110, 11101011000, 11101000110, 11100010110, 11101101000, 11101100010, 11100011010, 11101111010, 11001000010, 11110001010, 10100110000, 10100001100, 10010110000, 10010000110, 10000101100, 10000100110, 10110010000, 10110000100, 10011010000, 10011000010, 10000110100, 10000110010, 11000010010, 11001010000, 11110111010, 11000010100, 10001111010, 10100111100, 10010111100, 10010011110, 10111100100, 10011110100, 10011110010, 11110100100, 11110010100, 11110010010, 11011011110, 11011110110, 11110110110, 10101111000, 10100011110, 10001011110, 10111101000, 10111100010, 11110101000, 11110100010, 10111011110, 10111101110, 11101011110, 11110101110, 11010000100, 11010010000, 11010011100, 1100011101011]; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/CODE128/index.js b/components/tki-barcode/barcodes/CODE128/index.js new file mode 100644 index 0000000..4364222 --- /dev/null +++ b/components/tki-barcode/barcodes/CODE128/index.js @@ -0,0 +1,29 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.CODE128C = exports.CODE128B = exports.CODE128A = exports.CODE128 = undefined; + +var _CODE128_AUTO = require('./CODE128_AUTO.js'); + +var _CODE128_AUTO2 = _interopRequireDefault(_CODE128_AUTO); + +var _CODE128A = require('./CODE128A.js'); + +var _CODE128A2 = _interopRequireDefault(_CODE128A); + +var _CODE128B = require('./CODE128B.js'); + +var _CODE128B2 = _interopRequireDefault(_CODE128B); + +var _CODE128C = require('./CODE128C.js'); + +var _CODE128C2 = _interopRequireDefault(_CODE128C); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.CODE128 = _CODE128_AUTO2.default; +exports.CODE128A = _CODE128A2.default; +exports.CODE128B = _CODE128B2.default; +exports.CODE128C = _CODE128C2.default; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/CODE39/index.js b/components/tki-barcode/barcodes/CODE39/index.js new file mode 100644 index 0000000..4c1b35c --- /dev/null +++ b/components/tki-barcode/barcodes/CODE39/index.js @@ -0,0 +1,104 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.CODE39 = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _Barcode2 = require("../Barcode.js"); + +var _Barcode3 = _interopRequireDefault(_Barcode2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation: +// https://en.wikipedia.org/wiki/Code_39#Encoding + +var CODE39 = function (_Barcode) { + _inherits(CODE39, _Barcode); + + function CODE39(data, options) { + _classCallCheck(this, CODE39); + + data = data.toUpperCase(); + + // Calculate mod43 checksum if enabled + if (options.mod43) { + data += getCharacter(mod43checksum(data)); + } + + return _possibleConstructorReturn(this, (CODE39.__proto__ || Object.getPrototypeOf(CODE39)).call(this, data, options)); + } + + _createClass(CODE39, [{ + key: "encode", + value: function encode() { + // First character is always a * + var result = getEncoding("*"); + + // Take every character and add the binary representation to the result + for (var i = 0; i < this.data.length; i++) { + result += getEncoding(this.data[i]) + "0"; + } + + // Last character is always a * + result += getEncoding("*"); + return { + data: result, + text: this.text + }; + } + }, { + key: "valid", + value: function valid() { + return this.data.search(/^[0-9A-Z\-\.\ \$\/\+\%]+$/) !== -1; + } + }]); + + return CODE39; +}(_Barcode3.default); + +// All characters. The position in the array is the (checksum) value + + +var characters = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "-", ".", " ", "$", "/", "+", "%", "*"]; + +// The decimal representation of the characters, is converted to the +// corresponding binary with the getEncoding function +var encodings = [20957, 29783, 23639, 30485, 20951, 29813, 23669, 20855, 29789, 23645, 29975, 23831, 30533, 22295, 30149, 24005, 21623, 29981, 23837, 22301, 30023, 23879, 30545, 22343, 30161, 24017, 21959, 30065, 23921, 22385, 29015, 18263, 29141, 17879, 29045, 18293, 17783, 29021, 18269, 17477, 17489, 17681, 20753, 35770]; + +// Get the binary representation of a character by converting the encodings +// from decimal to binary +function getEncoding(character) { + return getBinary(characterValue(character)); +} + +function getBinary(characterValue) { + return encodings[characterValue].toString(2); +} + +function getCharacter(characterValue) { + return characters[characterValue]; +} + +function characterValue(character) { + return characters.indexOf(character); +} + +function mod43checksum(data) { + var checksum = 0; + for (var i = 0; i < data.length; i++) { + checksum += characterValue(data[i]); + } + + checksum = checksum % 43; + return checksum; +} + +exports.CODE39 = CODE39; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/EAN_UPC/EAN.js b/components/tki-barcode/barcodes/EAN_UPC/EAN.js new file mode 100644 index 0000000..62d3ae3 --- /dev/null +++ b/components/tki-barcode/barcodes/EAN_UPC/EAN.js @@ -0,0 +1,92 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _constants = require('./constants'); + +var _encoder = require('./encoder'); + +var _encoder2 = _interopRequireDefault(_encoder); + +var _Barcode2 = require('../Barcode'); + +var _Barcode3 = _interopRequireDefault(_Barcode2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +// Base class for EAN8 & EAN13 +var EAN = function (_Barcode) { + _inherits(EAN, _Barcode); + + function EAN(data, options) { + _classCallCheck(this, EAN); + + // Make sure the font is not bigger than the space between the guard bars + var _this = _possibleConstructorReturn(this, (EAN.__proto__ || Object.getPrototypeOf(EAN)).call(this, data, options)); + + _this.fontSize = !options.flat && options.fontSize > options.width * 10 ? options.width * 10 : options.fontSize; + + // Make the guard bars go down half the way of the text + _this.guardHeight = options.height + _this.fontSize / 2 + options.textMargin; + return _this; + } + + _createClass(EAN, [{ + key: 'encode', + value: function encode() { + return this.options.flat ? this.encodeFlat() : this.encodeGuarded(); + } + }, { + key: 'leftText', + value: function leftText(from, to) { + return this.text.substr(from, to); + } + }, { + key: 'leftEncode', + value: function leftEncode(data, structure) { + return (0, _encoder2.default)(data, structure); + } + }, { + key: 'rightText', + value: function rightText(from, to) { + return this.text.substr(from, to); + } + }, { + key: 'rightEncode', + value: function rightEncode(data, structure) { + return (0, _encoder2.default)(data, structure); + } + }, { + key: 'encodeGuarded', + value: function encodeGuarded() { + var textOptions = { fontSize: this.fontSize }; + var guardOptions = { height: this.guardHeight }; + + return [{ data: _constants.SIDE_BIN, options: guardOptions }, { data: this.leftEncode(), text: this.leftText(), options: textOptions }, { data: _constants.MIDDLE_BIN, options: guardOptions }, { data: this.rightEncode(), text: this.rightText(), options: textOptions }, { data: _constants.SIDE_BIN, options: guardOptions }]; + } + }, { + key: 'encodeFlat', + value: function encodeFlat() { + var data = [_constants.SIDE_BIN, this.leftEncode(), _constants.MIDDLE_BIN, this.rightEncode(), _constants.SIDE_BIN]; + + return { + data: data.join(''), + text: this.text + }; + } + }]); + + return EAN; +}(_Barcode3.default); + +exports.default = EAN; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/EAN_UPC/EAN13.js b/components/tki-barcode/barcodes/EAN_UPC/EAN13.js new file mode 100644 index 0000000..c73e3fb --- /dev/null +++ b/components/tki-barcode/barcodes/EAN_UPC/EAN13.js @@ -0,0 +1,119 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _constants = require('./constants'); + +var _EAN2 = require('./EAN'); + +var _EAN3 = _interopRequireDefault(_EAN2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation: +// https://en.wikipedia.org/wiki/International_Article_Number_(EAN)#Binary_encoding_of_data_digits_into_EAN-13_barcode + +// Calculate the checksum digit +// https://en.wikipedia.org/wiki/International_Article_Number_(EAN)#Calculation_of_checksum_digit +var checksum = function checksum(number) { + var res = number.substr(0, 12).split('').map(function (n) { + return +n; + }).reduce(function (sum, a, idx) { + return idx % 2 ? sum + a * 3 : sum + a; + }, 0); + + return (10 - res % 10) % 10; +}; + +var EAN13 = function (_EAN) { + _inherits(EAN13, _EAN); + + function EAN13(data, options) { + _classCallCheck(this, EAN13); + + // Add checksum if it does not exist + if (data.search(/^[0-9]{12}$/) !== -1) { + data += checksum(data); + } + + // Adds a last character to the end of the barcode + var _this = _possibleConstructorReturn(this, (EAN13.__proto__ || Object.getPrototypeOf(EAN13)).call(this, data, options)); + + _this.lastChar = options.lastChar; + return _this; + } + + _createClass(EAN13, [{ + key: 'valid', + value: function valid() { + return this.data.search(/^[0-9]{13}$/) !== -1 && +this.data[12] === checksum(this.data); + } + }, { + key: 'leftText', + value: function leftText() { + return _get(EAN13.prototype.__proto__ || Object.getPrototypeOf(EAN13.prototype), 'leftText', this).call(this, 1, 6); + } + }, { + key: 'leftEncode', + value: function leftEncode() { + var data = this.data.substr(1, 6); + var structure = _constants.EAN13_STRUCTURE[this.data[0]]; + return _get(EAN13.prototype.__proto__ || Object.getPrototypeOf(EAN13.prototype), 'leftEncode', this).call(this, data, structure); + } + }, { + key: 'rightText', + value: function rightText() { + return _get(EAN13.prototype.__proto__ || Object.getPrototypeOf(EAN13.prototype), 'rightText', this).call(this, 7, 6); + } + }, { + key: 'rightEncode', + value: function rightEncode() { + var data = this.data.substr(7, 6); + return _get(EAN13.prototype.__proto__ || Object.getPrototypeOf(EAN13.prototype), 'rightEncode', this).call(this, data, 'RRRRRR'); + } + + // The "standard" way of printing EAN13 barcodes with guard bars + + }, { + key: 'encodeGuarded', + value: function encodeGuarded() { + var data = _get(EAN13.prototype.__proto__ || Object.getPrototypeOf(EAN13.prototype), 'encodeGuarded', this).call(this); + + // Extend data with left digit & last character + if (this.options.displayValue) { + data.unshift({ + data: '000000000000', + text: this.text.substr(0, 1), + options: { textAlign: 'left', fontSize: this.fontSize } + }); + + if (this.options.lastChar) { + data.push({ + data: '00' + }); + data.push({ + data: '00000', + text: this.options.lastChar, + options: { fontSize: this.fontSize } + }); + } + } + + return data; + } + }]); + + return EAN13; +}(_EAN3.default); + +exports.default = EAN13; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/EAN_UPC/EAN2.js b/components/tki-barcode/barcodes/EAN_UPC/EAN2.js new file mode 100644 index 0000000..46b3d6f --- /dev/null +++ b/components/tki-barcode/barcodes/EAN_UPC/EAN2.js @@ -0,0 +1,58 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _constants = require('./constants'); + +var _encoder = require('./encoder'); + +var _encoder2 = _interopRequireDefault(_encoder); + +var _Barcode2 = require('../Barcode'); + +var _Barcode3 = _interopRequireDefault(_Barcode2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation: +// https://en.wikipedia.org/wiki/EAN_2#Encoding + +var EAN2 = function (_Barcode) { + _inherits(EAN2, _Barcode); + + function EAN2(data, options) { + _classCallCheck(this, EAN2); + + return _possibleConstructorReturn(this, (EAN2.__proto__ || Object.getPrototypeOf(EAN2)).call(this, data, options)); + } + + _createClass(EAN2, [{ + key: 'valid', + value: function valid() { + return this.data.search(/^[0-9]{2}$/) !== -1; + } + }, { + key: 'encode', + value: function encode() { + // Choose the structure based on the number mod 4 + var structure = _constants.EAN2_STRUCTURE[parseInt(this.data) % 4]; + return { + // Start bits + Encode the two digits with 01 in between + data: '1011' + (0, _encoder2.default)(this.data, structure, '01'), + text: this.text + }; + } + }]); + + return EAN2; +}(_Barcode3.default); + +exports.default = EAN2; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/EAN_UPC/EAN5.js b/components/tki-barcode/barcodes/EAN_UPC/EAN5.js new file mode 100644 index 0000000..d1807c3 --- /dev/null +++ b/components/tki-barcode/barcodes/EAN_UPC/EAN5.js @@ -0,0 +1,65 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _constants = require('./constants'); + +var _encoder = require('./encoder'); + +var _encoder2 = _interopRequireDefault(_encoder); + +var _Barcode2 = require('../Barcode'); + +var _Barcode3 = _interopRequireDefault(_Barcode2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation: +// https://en.wikipedia.org/wiki/EAN_5#Encoding + +var checksum = function checksum(data) { + var result = data.split('').map(function (n) { + return +n; + }).reduce(function (sum, a, idx) { + return idx % 2 ? sum + a * 9 : sum + a * 3; + }, 0); + return result % 10; +}; + +var EAN5 = function (_Barcode) { + _inherits(EAN5, _Barcode); + + function EAN5(data, options) { + _classCallCheck(this, EAN5); + + return _possibleConstructorReturn(this, (EAN5.__proto__ || Object.getPrototypeOf(EAN5)).call(this, data, options)); + } + + _createClass(EAN5, [{ + key: 'valid', + value: function valid() { + return this.data.search(/^[0-9]{5}$/) !== -1; + } + }, { + key: 'encode', + value: function encode() { + var structure = _constants.EAN5_STRUCTURE[checksum(this.data)]; + return { + data: '1011' + (0, _encoder2.default)(this.data, structure, '01'), + text: this.text + }; + } + }]); + + return EAN5; +}(_Barcode3.default); + +exports.default = EAN5; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/EAN_UPC/EAN8.js b/components/tki-barcode/barcodes/EAN_UPC/EAN8.js new file mode 100644 index 0000000..8c6d638 --- /dev/null +++ b/components/tki-barcode/barcodes/EAN_UPC/EAN8.js @@ -0,0 +1,81 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _EAN2 = require('./EAN'); + +var _EAN3 = _interopRequireDefault(_EAN2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation: +// http://www.barcodeisland.com/ean8.phtml + +// Calculate the checksum digit +var checksum = function checksum(number) { + var res = number.substr(0, 7).split('').map(function (n) { + return +n; + }).reduce(function (sum, a, idx) { + return idx % 2 ? sum + a : sum + a * 3; + }, 0); + + return (10 - res % 10) % 10; +}; + +var EAN8 = function (_EAN) { + _inherits(EAN8, _EAN); + + function EAN8(data, options) { + _classCallCheck(this, EAN8); + + // Add checksum if it does not exist + if (data.search(/^[0-9]{7}$/) !== -1) { + data += checksum(data); + } + + return _possibleConstructorReturn(this, (EAN8.__proto__ || Object.getPrototypeOf(EAN8)).call(this, data, options)); + } + + _createClass(EAN8, [{ + key: 'valid', + value: function valid() { + return this.data.search(/^[0-9]{8}$/) !== -1 && +this.data[7] === checksum(this.data); + } + }, { + key: 'leftText', + value: function leftText() { + return _get(EAN8.prototype.__proto__ || Object.getPrototypeOf(EAN8.prototype), 'leftText', this).call(this, 0, 4); + } + }, { + key: 'leftEncode', + value: function leftEncode() { + var data = this.data.substr(0, 4); + return _get(EAN8.prototype.__proto__ || Object.getPrototypeOf(EAN8.prototype), 'leftEncode', this).call(this, data, 'LLLL'); + } + }, { + key: 'rightText', + value: function rightText() { + return _get(EAN8.prototype.__proto__ || Object.getPrototypeOf(EAN8.prototype), 'rightText', this).call(this, 4, 4); + } + }, { + key: 'rightEncode', + value: function rightEncode() { + var data = this.data.substr(4, 4); + return _get(EAN8.prototype.__proto__ || Object.getPrototypeOf(EAN8.prototype), 'rightEncode', this).call(this, data, 'RRRR'); + } + }]); + + return EAN8; +}(_EAN3.default); + +exports.default = EAN8; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/EAN_UPC/UPC.js b/components/tki-barcode/barcodes/EAN_UPC/UPC.js new file mode 100644 index 0000000..f811101 --- /dev/null +++ b/components/tki-barcode/barcodes/EAN_UPC/UPC.js @@ -0,0 +1,165 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +exports.checksum = checksum; + +var _encoder = require("./encoder"); + +var _encoder2 = _interopRequireDefault(_encoder); + +var _Barcode2 = require("../Barcode.js"); + +var _Barcode3 = _interopRequireDefault(_Barcode2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation: +// https://en.wikipedia.org/wiki/Universal_Product_Code#Encoding + +var UPC = function (_Barcode) { + _inherits(UPC, _Barcode); + + function UPC(data, options) { + _classCallCheck(this, UPC); + + // Add checksum if it does not exist + if (data.search(/^[0-9]{11}$/) !== -1) { + data += checksum(data); + } + + var _this = _possibleConstructorReturn(this, (UPC.__proto__ || Object.getPrototypeOf(UPC)).call(this, data, options)); + + _this.displayValue = options.displayValue; + + // Make sure the font is not bigger than the space between the guard bars + if (options.fontSize > options.width * 10) { + _this.fontSize = options.width * 10; + } else { + _this.fontSize = options.fontSize; + } + + // Make the guard bars go down half the way of the text + _this.guardHeight = options.height + _this.fontSize / 2 + options.textMargin; + return _this; + } + + _createClass(UPC, [{ + key: "valid", + value: function valid() { + return this.data.search(/^[0-9]{12}$/) !== -1 && this.data[11] == checksum(this.data); + } + }, { + key: "encode", + value: function encode() { + if (this.options.flat) { + return this.flatEncoding(); + } else { + return this.guardedEncoding(); + } + } + }, { + key: "flatEncoding", + value: function flatEncoding() { + var result = ""; + + result += "101"; + result += (0, _encoder2.default)(this.data.substr(0, 6), "LLLLLL"); + result += "01010"; + result += (0, _encoder2.default)(this.data.substr(6, 6), "RRRRRR"); + result += "101"; + + return { + data: result, + text: this.text + }; + } + }, { + key: "guardedEncoding", + value: function guardedEncoding() { + var result = []; + + // Add the first digit + if (this.displayValue) { + result.push({ + data: "00000000", + text: this.text.substr(0, 1), + options: { textAlign: "left", fontSize: this.fontSize } + }); + } + + // Add the guard bars + result.push({ + data: "101" + (0, _encoder2.default)(this.data[0], "L"), + options: { height: this.guardHeight } + }); + + // Add the left side + result.push({ + data: (0, _encoder2.default)(this.data.substr(1, 5), "LLLLL"), + text: this.text.substr(1, 5), + options: { fontSize: this.fontSize } + }); + + // Add the middle bits + result.push({ + data: "01010", + options: { height: this.guardHeight } + }); + + // Add the right side + result.push({ + data: (0, _encoder2.default)(this.data.substr(6, 5), "RRRRR"), + text: this.text.substr(6, 5), + options: { fontSize: this.fontSize } + }); + + // Add the end bits + result.push({ + data: (0, _encoder2.default)(this.data[11], "R") + "101", + options: { height: this.guardHeight } + }); + + // Add the last digit + if (this.displayValue) { + result.push({ + data: "00000000", + text: this.text.substr(11, 1), + options: { textAlign: "right", fontSize: this.fontSize } + }); + } + + return result; + } + }]); + + return UPC; +}(_Barcode3.default); + +// Calulate the checksum digit +// https://en.wikipedia.org/wiki/International_Article_Number_(EAN)#Calculation_of_checksum_digit + + +function checksum(number) { + var result = 0; + + var i; + for (i = 1; i < 11; i += 2) { + result += parseInt(number[i]); + } + for (i = 0; i < 11; i += 2) { + result += parseInt(number[i]) * 3; + } + + return (10 - result % 10) % 10; +} + +exports.default = UPC; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/EAN_UPC/UPCE.js b/components/tki-barcode/barcodes/EAN_UPC/UPCE.js new file mode 100644 index 0000000..2281492 --- /dev/null +++ b/components/tki-barcode/barcodes/EAN_UPC/UPCE.js @@ -0,0 +1,185 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _encoder = require('./encoder'); + +var _encoder2 = _interopRequireDefault(_encoder); + +var _Barcode2 = require('../Barcode.js'); + +var _Barcode3 = _interopRequireDefault(_Barcode2); + +var _UPC = require('./UPC.js'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation: +// https://en.wikipedia.org/wiki/Universal_Product_Code#Encoding +// +// UPC-E documentation: +// https://en.wikipedia.org/wiki/Universal_Product_Code#UPC-E + +var EXPANSIONS = ["XX00000XXX", "XX10000XXX", "XX20000XXX", "XXX00000XX", "XXXX00000X", "XXXXX00005", "XXXXX00006", "XXXXX00007", "XXXXX00008", "XXXXX00009"]; + +var PARITIES = [["EEEOOO", "OOOEEE"], ["EEOEOO", "OOEOEE"], ["EEOOEO", "OOEEOE"], ["EEOOOE", "OOEEEO"], ["EOEEOO", "OEOOEE"], ["EOOEEO", "OEEOOE"], ["EOOOEE", "OEEEOO"], ["EOEOEO", "OEOEOE"], ["EOEOOE", "OEOEEO"], ["EOOEOE", "OEEOEO"]]; + +var UPCE = function (_Barcode) { + _inherits(UPCE, _Barcode); + + function UPCE(data, options) { + _classCallCheck(this, UPCE); + + var _this = _possibleConstructorReturn(this, (UPCE.__proto__ || Object.getPrototypeOf(UPCE)).call(this, data, options)); + // Code may be 6 or 8 digits; + // A 7 digit code is ambiguous as to whether the extra digit + // is a UPC-A check or number system digit. + + + _this.isValid = false; + if (data.search(/^[0-9]{6}$/) !== -1) { + _this.middleDigits = data; + _this.upcA = expandToUPCA(data, "0"); + _this.text = options.text || '' + _this.upcA[0] + data + _this.upcA[_this.upcA.length - 1]; + _this.isValid = true; + } else if (data.search(/^[01][0-9]{7}$/) !== -1) { + _this.middleDigits = data.substring(1, data.length - 1); + _this.upcA = expandToUPCA(_this.middleDigits, data[0]); + + if (_this.upcA[_this.upcA.length - 1] === data[data.length - 1]) { + _this.isValid = true; + } else { + // checksum mismatch + return _possibleConstructorReturn(_this); + } + } else { + return _possibleConstructorReturn(_this); + } + + _this.displayValue = options.displayValue; + + // Make sure the font is not bigger than the space between the guard bars + if (options.fontSize > options.width * 10) { + _this.fontSize = options.width * 10; + } else { + _this.fontSize = options.fontSize; + } + + // Make the guard bars go down half the way of the text + _this.guardHeight = options.height + _this.fontSize / 2 + options.textMargin; + return _this; + } + + _createClass(UPCE, [{ + key: 'valid', + value: function valid() { + return this.isValid; + } + }, { + key: 'encode', + value: function encode() { + if (this.options.flat) { + return this.flatEncoding(); + } else { + return this.guardedEncoding(); + } + } + }, { + key: 'flatEncoding', + value: function flatEncoding() { + var result = ""; + + result += "101"; + result += this.encodeMiddleDigits(); + result += "010101"; + + return { + data: result, + text: this.text + }; + } + }, { + key: 'guardedEncoding', + value: function guardedEncoding() { + var result = []; + + // Add the UPC-A number system digit beneath the quiet zone + if (this.displayValue) { + result.push({ + data: "00000000", + text: this.text[0], + options: { textAlign: "left", fontSize: this.fontSize } + }); + } + + // Add the guard bars + result.push({ + data: "101", + options: { height: this.guardHeight } + }); + + // Add the 6 UPC-E digits + result.push({ + data: this.encodeMiddleDigits(), + text: this.text.substring(1, 7), + options: { fontSize: this.fontSize } + }); + + // Add the end bits + result.push({ + data: "010101", + options: { height: this.guardHeight } + }); + + // Add the UPC-A check digit beneath the quiet zone + if (this.displayValue) { + result.push({ + data: "00000000", + text: this.text[7], + options: { textAlign: "right", fontSize: this.fontSize } + }); + } + + return result; + } + }, { + key: 'encodeMiddleDigits', + value: function encodeMiddleDigits() { + var numberSystem = this.upcA[0]; + var checkDigit = this.upcA[this.upcA.length - 1]; + var parity = PARITIES[parseInt(checkDigit)][parseInt(numberSystem)]; + return (0, _encoder2.default)(this.middleDigits, parity); + } + }]); + + return UPCE; +}(_Barcode3.default); + +function expandToUPCA(middleDigits, numberSystem) { + var lastUpcE = parseInt(middleDigits[middleDigits.length - 1]); + var expansion = EXPANSIONS[lastUpcE]; + + var result = ""; + var digitIndex = 0; + for (var i = 0; i < expansion.length; i++) { + var c = expansion[i]; + if (c === 'X') { + result += middleDigits[digitIndex++]; + } else { + result += c; + } + } + + result = '' + numberSystem + result; + return '' + result + (0, _UPC.checksum)(result); +} + +exports.default = UPCE; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/EAN_UPC/constants.js b/components/tki-barcode/barcodes/EAN_UPC/constants.js new file mode 100644 index 0000000..b00aa62 --- /dev/null +++ b/components/tki-barcode/barcodes/EAN_UPC/constants.js @@ -0,0 +1,30 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +// Standard start end and middle bits +var SIDE_BIN = exports.SIDE_BIN = '101'; +var MIDDLE_BIN = exports.MIDDLE_BIN = '01010'; + +var BINARIES = exports.BINARIES = { + 'L': [// The L (left) type of encoding + '0001101', '0011001', '0010011', '0111101', '0100011', '0110001', '0101111', '0111011', '0110111', '0001011'], + 'G': [// The G type of encoding + '0100111', '0110011', '0011011', '0100001', '0011101', '0111001', '0000101', '0010001', '0001001', '0010111'], + 'R': [// The R (right) type of encoding + '1110010', '1100110', '1101100', '1000010', '1011100', '1001110', '1010000', '1000100', '1001000', '1110100'], + 'O': [// The O (odd) encoding for UPC-E + '0001101', '0011001', '0010011', '0111101', '0100011', '0110001', '0101111', '0111011', '0110111', '0001011'], + 'E': [// The E (even) encoding for UPC-E + '0100111', '0110011', '0011011', '0100001', '0011101', '0111001', '0000101', '0010001', '0001001', '0010111'] +}; + +// Define the EAN-2 structure +var EAN2_STRUCTURE = exports.EAN2_STRUCTURE = ['LL', 'LG', 'GL', 'GG']; + +// Define the EAN-5 structure +var EAN5_STRUCTURE = exports.EAN5_STRUCTURE = ['GGLLL', 'GLGLL', 'GLLGL', 'GLLLG', 'LGGLL', 'LLGGL', 'LLLGG', 'LGLGL', 'LGLLG', 'LLGLG']; + +// Define the EAN-13 structure +var EAN13_STRUCTURE = exports.EAN13_STRUCTURE = ['LLLLLL', 'LLGLGG', 'LLGGLG', 'LLGGGL', 'LGLLGG', 'LGGLLG', 'LGGGLL', 'LGLGLG', 'LGLGGL', 'LGGLGL']; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/EAN_UPC/encoder.js b/components/tki-barcode/barcodes/EAN_UPC/encoder.js new file mode 100644 index 0000000..80d8932 --- /dev/null +++ b/components/tki-barcode/barcodes/EAN_UPC/encoder.js @@ -0,0 +1,27 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _constants = require('./constants'); + +// Encode data string +var encode = function encode(data, structure, separator) { + var encoded = data.split('').map(function (val, idx) { + return _constants.BINARIES[structure[idx]]; + }).map(function (val, idx) { + return val ? val[data[idx]] : ''; + }); + + if (separator) { + var last = data.length - 1; + encoded = encoded.map(function (val, idx) { + return idx < last ? val + separator : val; + }); + } + + return encoded.join(''); +}; + +exports.default = encode; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/EAN_UPC/index.js b/components/tki-barcode/barcodes/EAN_UPC/index.js new file mode 100644 index 0000000..ed0ae04 --- /dev/null +++ b/components/tki-barcode/barcodes/EAN_UPC/index.js @@ -0,0 +1,39 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.UPCE = exports.UPC = exports.EAN2 = exports.EAN5 = exports.EAN8 = exports.EAN13 = undefined; + +var _EAN = require('./EAN13.js'); + +var _EAN2 = _interopRequireDefault(_EAN); + +var _EAN3 = require('./EAN8.js'); + +var _EAN4 = _interopRequireDefault(_EAN3); + +var _EAN5 = require('./EAN5.js'); + +var _EAN6 = _interopRequireDefault(_EAN5); + +var _EAN7 = require('./EAN2.js'); + +var _EAN8 = _interopRequireDefault(_EAN7); + +var _UPC = require('./UPC.js'); + +var _UPC2 = _interopRequireDefault(_UPC); + +var _UPCE = require('./UPCE.js'); + +var _UPCE2 = _interopRequireDefault(_UPCE); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.EAN13 = _EAN2.default; +exports.EAN8 = _EAN4.default; +exports.EAN5 = _EAN6.default; +exports.EAN2 = _EAN8.default; +exports.UPC = _UPC2.default; +exports.UPCE = _UPCE2.default; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/GenericBarcode/index.js b/components/tki-barcode/barcodes/GenericBarcode/index.js new file mode 100644 index 0000000..05c7e2d --- /dev/null +++ b/components/tki-barcode/barcodes/GenericBarcode/index.js @@ -0,0 +1,55 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.GenericBarcode = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _Barcode2 = require("../Barcode.js"); + +var _Barcode3 = _interopRequireDefault(_Barcode2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var GenericBarcode = function (_Barcode) { + _inherits(GenericBarcode, _Barcode); + + function GenericBarcode(data, options) { + _classCallCheck(this, GenericBarcode); + + return _possibleConstructorReturn(this, (GenericBarcode.__proto__ || Object.getPrototypeOf(GenericBarcode)).call(this, data, options)); // Sets this.data and this.text + } + + // Return the corresponding binary numbers for the data provided + + + _createClass(GenericBarcode, [{ + key: "encode", + value: function encode() { + return { + data: "10101010101010101010101010101010101010101", + text: this.text + }; + } + + // Resturn true/false if the string provided is valid for this encoder + + }, { + key: "valid", + value: function valid() { + return true; + } + }]); + + return GenericBarcode; +}(_Barcode3.default); + +exports.GenericBarcode = GenericBarcode; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/ITF/ITF.js b/components/tki-barcode/barcodes/ITF/ITF.js new file mode 100644 index 0000000..10b6346 --- /dev/null +++ b/components/tki-barcode/barcodes/ITF/ITF.js @@ -0,0 +1,69 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _constants = require('./constants'); + +var _Barcode2 = require('../Barcode'); + +var _Barcode3 = _interopRequireDefault(_Barcode2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var ITF = function (_Barcode) { + _inherits(ITF, _Barcode); + + function ITF() { + _classCallCheck(this, ITF); + + return _possibleConstructorReturn(this, (ITF.__proto__ || Object.getPrototypeOf(ITF)).apply(this, arguments)); + } + + _createClass(ITF, [{ + key: 'valid', + value: function valid() { + return this.data.search(/^([0-9]{2})+$/) !== -1; + } + }, { + key: 'encode', + value: function encode() { + var _this2 = this; + + // Calculate all the digit pairs + var encoded = this.data.match(/.{2}/g).map(function (pair) { + return _this2.encodePair(pair); + }).join(''); + + return { + data: _constants.START_BIN + encoded + _constants.END_BIN, + text: this.text + }; + } + + // Calculate the data of a number pair + + }, { + key: 'encodePair', + value: function encodePair(pair) { + var second = _constants.BINARIES[pair[1]]; + + return _constants.BINARIES[pair[0]].split('').map(function (first, idx) { + return (first === '1' ? '111' : '1') + (second[idx] === '1' ? '000' : '0'); + }).join(''); + } + }]); + + return ITF; +}(_Barcode3.default); + +exports.default = ITF; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/ITF/ITF14.js b/components/tki-barcode/barcodes/ITF/ITF14.js new file mode 100644 index 0000000..75687df --- /dev/null +++ b/components/tki-barcode/barcodes/ITF/ITF14.js @@ -0,0 +1,55 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _ITF2 = require('./ITF'); + +var _ITF3 = _interopRequireDefault(_ITF2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +// Calculate the checksum digit +var checksum = function checksum(data) { + var res = data.substr(0, 13).split('').map(function (num) { + return parseInt(num, 10); + }).reduce(function (sum, n, idx) { + return sum + n * (3 - idx % 2 * 2); + }, 0); + + return Math.ceil(res / 10) * 10 - res; +}; + +var ITF14 = function (_ITF) { + _inherits(ITF14, _ITF); + + function ITF14(data, options) { + _classCallCheck(this, ITF14); + + // Add checksum if it does not exist + if (data.search(/^[0-9]{13}$/) !== -1) { + data += checksum(data); + } + return _possibleConstructorReturn(this, (ITF14.__proto__ || Object.getPrototypeOf(ITF14)).call(this, data, options)); + } + + _createClass(ITF14, [{ + key: 'valid', + value: function valid() { + return this.data.search(/^[0-9]{14}$/) !== -1 && +this.data[13] === checksum(this.data); + } + }]); + + return ITF14; +}(_ITF3.default); + +exports.default = ITF14; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/ITF/constants.js b/components/tki-barcode/barcodes/ITF/constants.js new file mode 100644 index 0000000..fede952 --- /dev/null +++ b/components/tki-barcode/barcodes/ITF/constants.js @@ -0,0 +1,9 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var START_BIN = exports.START_BIN = '1010'; +var END_BIN = exports.END_BIN = '11101'; + +var BINARIES = exports.BINARIES = ['00110', '10001', '01001', '11000', '00101', '10100', '01100', '00011', '10010', '01010']; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/ITF/index.js b/components/tki-barcode/barcodes/ITF/index.js new file mode 100644 index 0000000..dd3945e --- /dev/null +++ b/components/tki-barcode/barcodes/ITF/index.js @@ -0,0 +1,19 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.ITF14 = exports.ITF = undefined; + +var _ITF = require('./ITF'); + +var _ITF2 = _interopRequireDefault(_ITF); + +var _ITF3 = require('./ITF14'); + +var _ITF4 = _interopRequireDefault(_ITF3); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.ITF = _ITF2.default; +exports.ITF14 = _ITF4.default; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/MSI/MSI.js b/components/tki-barcode/barcodes/MSI/MSI.js new file mode 100644 index 0000000..d53f5e1 --- /dev/null +++ b/components/tki-barcode/barcodes/MSI/MSI.js @@ -0,0 +1,74 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _Barcode2 = require("../Barcode.js"); + +var _Barcode3 = _interopRequireDefault(_Barcode2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation +// https://en.wikipedia.org/wiki/MSI_Barcode#Character_set_and_binary_lookup + +var MSI = function (_Barcode) { + _inherits(MSI, _Barcode); + + function MSI(data, options) { + _classCallCheck(this, MSI); + + return _possibleConstructorReturn(this, (MSI.__proto__ || Object.getPrototypeOf(MSI)).call(this, data, options)); + } + + _createClass(MSI, [{ + key: "encode", + value: function encode() { + // Start bits + var ret = "110"; + + for (var i = 0; i < this.data.length; i++) { + // Convert the character to binary (always 4 binary digits) + var digit = parseInt(this.data[i]); + var bin = digit.toString(2); + bin = addZeroes(bin, 4 - bin.length); + + // Add 100 for every zero and 110 for every 1 + for (var b = 0; b < bin.length; b++) { + ret += bin[b] == "0" ? "100" : "110"; + } + } + + // End bits + ret += "1001"; + + return { + data: ret, + text: this.text + }; + } + }, { + key: "valid", + value: function valid() { + return this.data.search(/^[0-9]+$/) !== -1; + } + }]); + + return MSI; +}(_Barcode3.default); + +function addZeroes(number, n) { + for (var i = 0; i < n; i++) { + number = "0" + number; + } + return number; +} + +exports.default = MSI; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/MSI/MSI10.js b/components/tki-barcode/barcodes/MSI/MSI10.js new file mode 100644 index 0000000..fca0a5f --- /dev/null +++ b/components/tki-barcode/barcodes/MSI/MSI10.js @@ -0,0 +1,33 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _MSI2 = require('./MSI.js'); + +var _MSI3 = _interopRequireDefault(_MSI2); + +var _checksums = require('./checksums.js'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var MSI10 = function (_MSI) { + _inherits(MSI10, _MSI); + + function MSI10(data, options) { + _classCallCheck(this, MSI10); + + return _possibleConstructorReturn(this, (MSI10.__proto__ || Object.getPrototypeOf(MSI10)).call(this, data + (0, _checksums.mod10)(data), options)); + } + + return MSI10; +}(_MSI3.default); + +exports.default = MSI10; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/MSI/MSI1010.js b/components/tki-barcode/barcodes/MSI/MSI1010.js new file mode 100644 index 0000000..ea87f5b --- /dev/null +++ b/components/tki-barcode/barcodes/MSI/MSI1010.js @@ -0,0 +1,35 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _MSI2 = require('./MSI.js'); + +var _MSI3 = _interopRequireDefault(_MSI2); + +var _checksums = require('./checksums.js'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var MSI1010 = function (_MSI) { + _inherits(MSI1010, _MSI); + + function MSI1010(data, options) { + _classCallCheck(this, MSI1010); + + data += (0, _checksums.mod10)(data); + data += (0, _checksums.mod10)(data); + return _possibleConstructorReturn(this, (MSI1010.__proto__ || Object.getPrototypeOf(MSI1010)).call(this, data, options)); + } + + return MSI1010; +}(_MSI3.default); + +exports.default = MSI1010; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/MSI/MSI11.js b/components/tki-barcode/barcodes/MSI/MSI11.js new file mode 100644 index 0000000..8b18dc7 --- /dev/null +++ b/components/tki-barcode/barcodes/MSI/MSI11.js @@ -0,0 +1,33 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _MSI2 = require('./MSI.js'); + +var _MSI3 = _interopRequireDefault(_MSI2); + +var _checksums = require('./checksums.js'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var MSI11 = function (_MSI) { + _inherits(MSI11, _MSI); + + function MSI11(data, options) { + _classCallCheck(this, MSI11); + + return _possibleConstructorReturn(this, (MSI11.__proto__ || Object.getPrototypeOf(MSI11)).call(this, data + (0, _checksums.mod11)(data), options)); + } + + return MSI11; +}(_MSI3.default); + +exports.default = MSI11; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/MSI/MSI1110.js b/components/tki-barcode/barcodes/MSI/MSI1110.js new file mode 100644 index 0000000..d5f2ab3 --- /dev/null +++ b/components/tki-barcode/barcodes/MSI/MSI1110.js @@ -0,0 +1,35 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _MSI2 = require('./MSI.js'); + +var _MSI3 = _interopRequireDefault(_MSI2); + +var _checksums = require('./checksums.js'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var MSI1110 = function (_MSI) { + _inherits(MSI1110, _MSI); + + function MSI1110(data, options) { + _classCallCheck(this, MSI1110); + + data += (0, _checksums.mod11)(data); + data += (0, _checksums.mod10)(data); + return _possibleConstructorReturn(this, (MSI1110.__proto__ || Object.getPrototypeOf(MSI1110)).call(this, data, options)); + } + + return MSI1110; +}(_MSI3.default); + +exports.default = MSI1110; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/MSI/checksums.js b/components/tki-barcode/barcodes/MSI/checksums.js new file mode 100644 index 0000000..8314d6e --- /dev/null +++ b/components/tki-barcode/barcodes/MSI/checksums.js @@ -0,0 +1,29 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.mod10 = mod10; +exports.mod11 = mod11; +function mod10(number) { + var sum = 0; + for (var i = 0; i < number.length; i++) { + var n = parseInt(number[i]); + if ((i + number.length) % 2 === 0) { + sum += n; + } else { + sum += n * 2 % 10 + Math.floor(n * 2 / 10); + } + } + return (10 - sum % 10) % 10; +} + +function mod11(number) { + var sum = 0; + var weights = [2, 3, 4, 5, 6, 7]; + for (var i = 0; i < number.length; i++) { + var n = parseInt(number[number.length - 1 - i]); + sum += weights[i % weights.length] * n; + } + return (11 - sum % 11) % 11; +} \ No newline at end of file diff --git a/components/tki-barcode/barcodes/MSI/index.js b/components/tki-barcode/barcodes/MSI/index.js new file mode 100644 index 0000000..8eb7e43 --- /dev/null +++ b/components/tki-barcode/barcodes/MSI/index.js @@ -0,0 +1,34 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.MSI1110 = exports.MSI1010 = exports.MSI11 = exports.MSI10 = exports.MSI = undefined; + +var _MSI = require('./MSI.js'); + +var _MSI2 = _interopRequireDefault(_MSI); + +var _MSI3 = require('./MSI10.js'); + +var _MSI4 = _interopRequireDefault(_MSI3); + +var _MSI5 = require('./MSI11.js'); + +var _MSI6 = _interopRequireDefault(_MSI5); + +var _MSI7 = require('./MSI1010.js'); + +var _MSI8 = _interopRequireDefault(_MSI7); + +var _MSI9 = require('./MSI1110.js'); + +var _MSI10 = _interopRequireDefault(_MSI9); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.MSI = _MSI2.default; +exports.MSI10 = _MSI4.default; +exports.MSI11 = _MSI6.default; +exports.MSI1010 = _MSI8.default; +exports.MSI1110 = _MSI10.default; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/codabar/index.js b/components/tki-barcode/barcodes/codabar/index.js new file mode 100644 index 0000000..cd39cdf --- /dev/null +++ b/components/tki-barcode/barcodes/codabar/index.js @@ -0,0 +1,92 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.codabar = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _Barcode2 = require("../Barcode.js"); + +var _Barcode3 = _interopRequireDefault(_Barcode2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding specification: +// http://www.barcodeisland.com/codabar.phtml + +var codabar = function (_Barcode) { + _inherits(codabar, _Barcode); + + function codabar(data, options) { + _classCallCheck(this, codabar); + + if (data.search(/^[0-9\-\$\:\.\+\/]+$/) === 0) { + data = "A" + data + "A"; + } + + var _this = _possibleConstructorReturn(this, (codabar.__proto__ || Object.getPrototypeOf(codabar)).call(this, data.toUpperCase(), options)); + + _this.text = _this.options.text || _this.text.replace(/[A-D]/g, ''); + return _this; + } + + _createClass(codabar, [{ + key: "valid", + value: function valid() { + return this.data.search(/^[A-D][0-9\-\$\:\.\+\/]+[A-D]$/) !== -1; + } + }, { + key: "encode", + value: function encode() { + var result = []; + var encodings = this.getEncodings(); + for (var i = 0; i < this.data.length; i++) { + result.push(encodings[this.data.charAt(i)]); + // for all characters except the last, append a narrow-space ("0") + if (i !== this.data.length - 1) { + result.push("0"); + } + } + return { + text: this.text, + data: result.join('') + }; + } + }, { + key: "getEncodings", + value: function getEncodings() { + return { + "0": "101010011", + "1": "101011001", + "2": "101001011", + "3": "110010101", + "4": "101101001", + "5": "110101001", + "6": "100101011", + "7": "100101101", + "8": "100110101", + "9": "110100101", + "-": "101001101", + "$": "101100101", + ":": "1101011011", + "/": "1101101011", + ".": "1101101101", + "+": "101100110011", + "A": "1011001001", + "B": "1001001011", + "C": "1010010011", + "D": "1010011001" + }; + } + }]); + + return codabar; +}(_Barcode3.default); + +exports.codabar = codabar; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/index.js b/components/tki-barcode/barcodes/index.js new file mode 100644 index 0000000..0b7bcba --- /dev/null +++ b/components/tki-barcode/barcodes/index.js @@ -0,0 +1,34 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _CODE = require('./CODE39/'); + +var _CODE2 = require('./CODE128/'); + +var _EAN_UPC = require('./EAN_UPC/'); + +var _ITF = require('./ITF/'); + +var _MSI = require('./MSI/'); + +var _pharmacode = require('./pharmacode/'); + +var _codabar = require('./codabar'); + +var _GenericBarcode = require('./GenericBarcode/'); + +exports.default = { + CODE39: _CODE.CODE39, + CODE128: _CODE2.CODE128, CODE128A: _CODE2.CODE128A, CODE128B: _CODE2.CODE128B, CODE128C: _CODE2.CODE128C, + EAN13: _EAN_UPC.EAN13, EAN8: _EAN_UPC.EAN8, EAN5: _EAN_UPC.EAN5, EAN2: _EAN_UPC.EAN2, + UPC: _EAN_UPC.UPC, UPCE: _EAN_UPC.UPCE, + ITF14: _ITF.ITF14, + ITF: _ITF.ITF, + MSI: _MSI.MSI, MSI10: _MSI.MSI10, MSI11: _MSI.MSI11, MSI1010: _MSI.MSI1010, MSI1110: _MSI.MSI1110, + PHARMACODE: _pharmacode.pharmacode, + CODABAR: _codabar.codabar, + GENERICBARCODE: _GenericBarcode.GenericBarcode +}; \ No newline at end of file diff --git a/components/tki-barcode/barcodes/pharmacode/index.js b/components/tki-barcode/barcodes/pharmacode/index.js new file mode 100644 index 0000000..243794a --- /dev/null +++ b/components/tki-barcode/barcodes/pharmacode/index.js @@ -0,0 +1,73 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.pharmacode = undefined; + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _Barcode2 = require("../Barcode.js"); + +var _Barcode3 = _interopRequireDefault(_Barcode2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation +// http://www.gomaro.ch/ftproot/Laetus_PHARMA-CODE.pdf + +var pharmacode = function (_Barcode) { + _inherits(pharmacode, _Barcode); + + function pharmacode(data, options) { + _classCallCheck(this, pharmacode); + + var _this = _possibleConstructorReturn(this, (pharmacode.__proto__ || Object.getPrototypeOf(pharmacode)).call(this, data, options)); + + _this.number = parseInt(data, 10); + return _this; + } + + _createClass(pharmacode, [{ + key: "encode", + value: function encode() { + var z = this.number; + var result = ""; + + // http://i.imgur.com/RMm4UDJ.png + // (source: http://www.gomaro.ch/ftproot/Laetus_PHARMA-CODE.pdf, page: 34) + while (!isNaN(z) && z != 0) { + if (z % 2 === 0) { + // Even + result = "11100" + result; + z = (z - 2) / 2; + } else { + // Odd + result = "100" + result; + z = (z - 1) / 2; + } + } + + // Remove the two last zeroes + result = result.slice(0, -2); + + return { + data: result, + text: this.text + }; + } + }, { + key: "valid", + value: function valid() { + return this.number >= 3 && this.number <= 131070; + } + }]); + + return pharmacode; +}(_Barcode3.default); + +exports.pharmacode = pharmacode; \ No newline at end of file diff --git a/components/tki-barcode/tki-barcode.vue b/components/tki-barcode/tki-barcode.vue new file mode 100644 index 0000000..907c6db --- /dev/null +++ b/components/tki-barcode/tki-barcode.vue @@ -0,0 +1,206 @@ + + + + diff --git a/http/index.js b/http/index.js new file mode 100644 index 0000000..4b02a03 --- /dev/null +++ b/http/index.js @@ -0,0 +1,10 @@ +import http from './interface' +import login from './login' +import mine from './mine' +import management from './management' +export default { + login, + mine, + management +} + diff --git a/http/interface.js b/http/interface.js new file mode 100644 index 0000000..52b179d --- /dev/null +++ b/http/interface.js @@ -0,0 +1,135 @@ +/** + * 通用uni-app网络请求 + * 基于 Promise 对象实现更简单的 request 使用方式,支持请求和响应拦截 + */ +export default { + config: { + baseUrl: "http://172.16.100.93:8015", + header: { + "Content-Type": "application/json;charset=UTF-8", + // 'Content-Type':'application/x-www-form-urlencoded' + }, + data: {}, + method: "GET", + dataType: "json" /* 如设为json,会对返回的数据做一次 JSON.parse */, + responseType: "text", + success() {}, + fail() {}, + complete() {}, + }, + interceptor: { + request: null, + response: null, + }, + request(options) { + if (!options) { + options = {}; + } + options.baseUrl = options.baseUrl || this.config.baseUrl; + options.dataType = options.dataType || this.config.dataType; + options.url = options.baseUrl + options.url; + options.data = options.data || {}; + options.method = options.method || this.config.method; + //TODO 加密数据 + options.header = options.header || this.config.header; + //TODO 数据签名 + let _token = { + Authorization: uni.getStorageSync("token") || "undefined", + }; + options.header = Object.assign({}, options.header, _token); + + return new Promise((resolve, reject) => { + let _config = null; + + options.complete = (response) => { + let statusCode = response.statusCode; + response.config = _config; + if (this.interceptor.response) { + let newResponse = this.interceptor.response(response); + if (newResponse) { + response = newResponse; + } + } + if (response.data.status === 401) { + uni.removeStorageSync("oa-token"); + uni.removeStorageSync("oa-user-info"); + uni.redirectTo({ + url: "/pages/login/index", + }); + } + // 统一的响应日志记录 + _reslog(response); + if (statusCode === 200) { + //成功 + resolve(response.data); + } else { + reject(response); + } + }; + + _config = Object.assign({}, this.config, options); + _config.requestId = new Date().getTime(); + + if (this.interceptor.request) { + this.interceptor.request(_config); + } + + uni.request(_config); + }); + }, + get(url, data, options) { + if (!options) { + options = {}; + } + options.url = url; + options.data = data; + options.method = "GET"; + return this.request(options); + }, + post(url, data, options, header) { + if (!options) { + options = {}; + } + options.url = url; + options.data = data; + options.header = header; + options.method = "POST"; + return this.request(options); + }, + put(url, data, options) { + if (!options) { + options = {}; + } + options.url = url; + options.data = data; + options.method = "PUT"; + return this.request(options); + }, + delete(url, data, options) { + if (!options) { + options = {}; + } + options.url = url; + options.data = data; + options.method = "DELETE"; + return this.request(options); + }, +}; + +/** + * 响应接口日志记录 + */ +function _reslog(res) { + let _statusCode = res.data.status; + //TODO 除了接口服务错误外,其他日志调接口异步写入日志数据库 + switch (_statusCode) { + case 200: + break; + case 401: + break; + case 404: + break; + default: + break; + } +} diff --git a/http/login.js b/http/login.js new file mode 100644 index 0000000..339b096 --- /dev/null +++ b/http/login.js @@ -0,0 +1,25 @@ +import http from './interface' + +// 登录 +export const login = (data) => { + return http.request({ + url: '/api/user/login', + method: 'POST', + data + }) +} +// 验证码 +export const code = (data) => { + return http.request({ + url: '/api/user/send', + method: 'POST', + data + }) +} + + +export default { + login, + code + +} diff --git a/http/management.js b/http/management.js new file mode 100644 index 0000000..c02863a --- /dev/null +++ b/http/management.js @@ -0,0 +1,49 @@ +import http from "./interface"; + +// 库存列表 +export const manageList = (data) => { + return http.request({ + url: "/api/inventory/list", + method: "POST", + data, + }); +}; +// 条形码查询 +export const manageCode = (data) => { + return http.request({ + url: "/api/inventory/detail/barcode", + method: "POST", + data, + }); +}; +// 保存 +export const save = (data) => { + return http.request({ + url: "/api/inventory/create", + method: "POST", + data, + }); +}; +// 修改 +export const update = (data) => { + return http.request({ + url: "/api/inventory/update", + method: "POST", + data, + }); +}; +// 库存增加 +export const addNum = (data) => { + return http.request({ + url: "/api/inventory/stock/update", + method: "POST", + data, + }); +}; +export default { + manageList, + manageCode, + save, + update, + addNum +}; diff --git a/http/mine.js b/http/mine.js new file mode 100644 index 0000000..3397cc5 --- /dev/null +++ b/http/mine.js @@ -0,0 +1,22 @@ +import http from './interface' + +// 考勤信息 +export const getWorkingTime = (data) => { + return http.request({ + url: '/oa/working-time/best', + method: 'POST', + data + }) +} +// 获取员工列表 +export const getEmpList = (data) => { + return http.request({ + url: '/department/users', + method: 'POST', + data + }) +} +export default { + getWorkingTime, + getEmpList +} \ No newline at end of file diff --git a/http/readme.md b/http/readme.md new file mode 100644 index 0000000..b81af14 --- /dev/null +++ b/http/readme.md @@ -0,0 +1,198 @@ +**插件使用说明** + +- 基于 Promise 对象实现更简单的 request 使用方式,支持请求和响应拦截 +- 下载后把 vmeitime-http 文件夹 copy 到项目 common/ 目录下 + +## 1. 配置 + +### 1.1 全局配置修改(修改vmeitime-http/interface.js中config和interceptor) +``` javascript + config: { + baseUrl: "https://api.com/api/", + header: { + 'Content-Type':'application/json;charset=UTF-8', + 'Content-Type':'application/x-www-form-urlencoded' + }, + dataType: "json", + responseType: "text" + }, + interceptor: { + request: null, + response: null + } +``` + +### 1.2 具体接口调用时修改(在vmeitime-http/index.js文件中具体业务接口中配置) +``` javascript +//设置baseUrl +http.config.baseUrl = "http://localhost:8080/api/" +//设置请求前拦截器 +http.interceptor.request = (config) => { + //添加通用参数 + config.header = { + "token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + } +} +//设置请求结束后拦截器 +http.interceptor.response = (response) => { + //判断返回状态 执行相应操作 + return response; +} +``` + + +## 2. 使用 + +### 2.1 全局使用(在main.js注册) + +``` // main.js + import api from '@/common/vmeitime-http/' + + // 全局挂载后使用 + Vue.prototype.$api = api +``` + +``` // pages/index/index.vue + + + + +``` + + +### 2.2 局部使用(局部使用,不需要在 main.js 中注册) + +``` // pages/index/index.vue + + + + + +``` + + +## 3. 接口数据加密、接口签名核验 + +在vmeitime-http/interface.js文件中的request(Object)方法中补充修改相应的代码 + +## 4. 接口请求/响应日志记录 + +在vmeitime-http/interface.js文件中的request(Object)方法中补充修改相应的代码 + +## 5. 业务相关接口编写 + +在vmeitime-http/index.js文件中的编写具体业务相关的接口,参考test()方法 + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..c3ff205 --- /dev/null +++ b/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + +
+ + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..270f9dd --- /dev/null +++ b/main.js @@ -0,0 +1,48 @@ +import App from './App' +import Vue from 'vue' +import uView from 'uview-ui' +import store from './store/index.js' +import common from './common/index.js' +import api from '@/http/' +Vue.use(uView) +Vue.prototype.$common = common; +Vue.prototype.$api = api; +Vue.prototype.$baseUrl = "http://172.16.100.93:8015"; // "http://114.218.158.24:9022", "http://58.210.42.242:9085" +Vue.config.productionTip = false +App.mpType = 'app' + +try { + function isPromise(obj) { + return ( + !!obj && + (typeof obj === "object" || typeof obj === "function") && + typeof obj.then === "function" + ); + } + + // 统一 vue2 API Promise 化返回格式与 vue3 保持一致 + uni.addInterceptor({ + returnValue(res) { + if (!isPromise(res)) { + return res; + } + return new Promise((resolve, reject) => { + res.then((res) => { + if (res[0]) { + reject(res[0]); + } else { + resolve(res[1]); + } + }); + }); + }, + }); +} catch (error) { } + +const app = new Vue({ + ...App, + store +}) +app.$mount() + + diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..97098d0 --- /dev/null +++ b/manifest.json @@ -0,0 +1,79 @@ +{ + "name" : "inv-app", + "appid" : "__UNI__6DE03A4", + "description" : "", + "versionName" : "1.0.0", + "versionCode" : "100", + "transformPx" : false, + /* 5+App特有相关 */ + "app-plus" : { + "usingComponents" : true, + "nvueStyleCompiler" : "uni-app", + "compilerVersion" : 3, + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + /* 模块配置 */ + "modules" : { + "Barcode" : {}, + "Camera" : {} + }, + /* 应用发布信息 */ + "distribute" : { + /* android打包配置 */ + "android" : { + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + /* ios打包配置 */ + "ios" : { + "dSYMs" : false + }, + /* SDK配置 */ + "sdkConfigs" : { + "ad" : {} + } + } + }, + /* 快应用特有相关 */ + "quickapp" : {}, + /* 小程序特有相关 */ + "mp-weixin" : { + "appid" : "", + "setting" : { + "urlCheck" : false + }, + "usingComponents" : true + }, + "mp-alipay" : { + "usingComponents" : true + }, + "mp-baidu" : { + "usingComponents" : true + }, + "mp-toutiao" : { + "usingComponents" : true + }, + "uniStatistics" : { + "enable" : false + }, + "vueVersion" : "2" +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..45c6b1a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "inv-app", + "lockfileVersion": 2, + "requires": true, + "packages": {} +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..29a0c7b --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "moment": "^2.29.4" + } +} diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..b82288c --- /dev/null +++ b/pages.json @@ -0,0 +1,63 @@ +{ + "easycom": { + "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue" + }, + "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages + + { + "path" : "pages/login/login", + "style" : + { + "navigationBarTitleText": "", + "enablePullDownRefresh": false, + "app-plus": { + "titleNView": false // 禁用原生导航 + } + } + + } + ,{ + "path" : "pages/management/management", + "style" : + { + "navigationBarTitleText": "", + "enablePullDownRefresh": false, + "app-plus": { + "titleNView": false // 禁用原生导航 + } + } + + } + ,{ + "path" : "pages/mine/mine", + "style" : + { + "navigationBarTitleText": "", + "enablePullDownRefresh": false, + "app-plus": { + "titleNView": false // 禁用原生导航 + } + } + + } + ,{ + "path" : "pages/goodDetail/goodDetail", + "style" : + { + "navigationBarTitleText": "", + "enablePullDownRefresh": false, + "app-plus": { + "titleNView": false // 禁用原生导航 + } + } + + } + ], + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "uni-app", + "navigationBarBackgroundColor": "#F8F8F8", + "backgroundColor": "#F8F8F8" + }, + "uniIdRouter": {} +} diff --git a/pages/goodDetail/goodDetail.vue b/pages/goodDetail/goodDetail.vue new file mode 100644 index 0000000..b39bae1 --- /dev/null +++ b/pages/goodDetail/goodDetail.vue @@ -0,0 +1,515 @@ + + + + + diff --git a/pages/login/login.vue b/pages/login/login.vue new file mode 100644 index 0000000..5cbcb05 --- /dev/null +++ b/pages/login/login.vue @@ -0,0 +1,238 @@ + + + + + diff --git a/pages/management/management.vue b/pages/management/management.vue new file mode 100644 index 0000000..b04aa0e --- /dev/null +++ b/pages/management/management.vue @@ -0,0 +1,488 @@ + + + + + diff --git a/pages/mine/mine.vue b/pages/mine/mine.vue new file mode 100644 index 0000000..b534b4c --- /dev/null +++ b/pages/mine/mine.vue @@ -0,0 +1,213 @@ + + + + + diff --git a/static/background.png b/static/background.png new file mode 100644 index 0000000000000000000000000000000000000000..36ee7826afc57252b812ee41be41338ad64d61ee GIT binary patch literal 91821 zcmZ5{XIN8P*R6t5M5zkWk*ZWddhab11wso&1(X&bw9pYjklu?(5oto`HFTBUn}CD> z5_$`r2pG8A^WOX2@4UbAJW2N2Ywb1HoMX%}cH~n%jXSp(Ze6=}?T(hFs=>8u1lViW zZhj#l0>0U8Q56F|u6r10C||1>VcNWQjqRG2s*;h9)lM6{m4EOVx9JJC1*_$ETa!d$ zXon)9tGUCNEgq+?tjyM`L7t$t@FEQN*oP+!PEE3B_qbL@#x&CG$>430kXAM7y?Ou9 zS!*w^oRK*4BQ@h!US7G9SFP|C5e|;_$Mp26AEp)$?SlPKQdcgm=d1J3jz4a%g$mBP zu>%6}yMk7iBn1aj4wG=pb>nAT&STXP-kpnC0p_h{qs59pl1}fof374B*`B#<^tyR!Y2i;21TXEFVGxr?z{E#ClY^@XR_P#8EEmkd$aRP(|eoe zm*j$(cwu6B_2`d!tSU0{il3ezlUP1ZvtGF#;5u$XXNn2_C0DE^-=~nnJ z2u7KNo5@o8`c%?Kh~~<2+`d}cMN5{=(c)mkbkkqwVGcWqS_>Xcr zanHQuD;c~(@Aln!C(lL;59TMWrc?`;C(N#!R)6xX>F>egV>RZANb0oEi}_U;K`!jA z8;Gb2GM4dc1$E$XZtR`#TS*~`Y;F})_xZ4+rE%Yo;G)N{$`M`4+c(H5Lgp5Pol{Fv zk-vyujSRYFTXaroF* z3_NFfTyv|iE>Mj<;;^1qs65hVk^jei8CHd*Cw487M6MGEVn&eV^mOiz#nK>-IS+Sp zls9)}td=Z$O?q5C6z;)=Ep~$JJyBo^9t=)g)x(dUGI7O4v}UiywouvceA9Y<0P?Ly z&CxzMsu9Q^_DFio7!M6rDT~jouRCbOU$2d^w6%pCLG&M$w^}>=xR`0|DD*#w2kW8R zAR+et6&0kW`8Hhqkr6%L~L@zK9x-tDHUx{FWndcltiHUXCz7A}t5f zI|Bq-PbC8ccQ{D)zL6lVn-=Tf*_N^{%P(r^sOV zw{nqqzuA&=$M8hF4-MR@C92^>5pn9<_`(e#P~raQAhdPpTc zOHP=E6@q6|w({hNm*$YSX$|2@ksIo4WmV|N%w8OB_h@kgIU&GX_^Ptmv0*o4APaYN znA6zUK6=hhL_aau8T zRNWMc4Sy7tFj-vpd~D~9cIB)wVXe3pdvuNM_Lsml$+e*G!W>Yp!wnF%0jQu*o<%|Y z+wh3bisuCuRo}63S^umXFHhnB3Lf8zacN^ICN=Kovo@|@saGIKpCY zQKjCfblb))a@%N@-+6Pv-gZ%FfTm`(^Yd!8%`nSok=+`@kBV*M$cuP|rUBy*Uyu;( z*mV+uU25Fk055jJqBWb$g$GN5vz!@DMurZl)+(}5lH9mOd7lRNn(p{V%k9R29Zu|& z2I%-xco;W5AT(XS%M~=SS64NB zU~|xD`HT4xq{UhLx3aT^lTH7F7g;vlXW_3JH^``=Jh#s=VUu<<<$Ty9PVA;rQKt!e z<0o?y)8fmD()5@IL1tozqBZMUomMT8vLV!?-Va)&c+r>*Q}j=UN-KDYZfvncdECPwYtd`)ajL=(%oi-xm2ippcZPtQdUnoIbl@3j_L~05$)^3WP5VONVX!i zidJIJ6(N4xL%JkCr)eOd;_WUx9bd4N*U#k~6ErE0a?S@X>;%iSWnxd%MZUAyyudWX zF1)Mlm||Azjo$Azkt1S{4u&-vs)nw6FTEpcz7>~nCiam!6_ zd|nXQBHsSPIKMhG>ch=Djn99r+@)g=e~!l3rbgYLOR-nb>!rR!7VMC?QW)`*{$+5I zi=@2(v!OY|2$Tk1vK6jFVxZQ?_`E610Q5Dn;O*4FxrUK=iDj&!^9x(um9sDt4}xU3 zITo8Tq=YuQMP^4N@9X&D;g|GgDpOC4%dql+ED$#YAt}HnTXy5IIQ);VQvXDf=`JkT zDmu#l`jc@kO3681Ln+u^Y*dR8@gNO+C3SXeZAC12ZvOPU6d$&)C18)`#t&LK&!(wT za8cUtD%)u*IV~5Ntf$Dui^<&ac@8e@ z29$-#?)VisHdN?X?`87QTOu?vQYRA4;#(M6V|07PJLQq7nJlPT=~(WBmPI<;tCs5R zJnvm9*1E?(Z^b(Wr|m2s*FnJOTwIDa#7a)kDt5QL$_23S{`$JLA7K%*n(qV9&yOc#-%;QDWKn zL$T-8zKIxlu{x%mwVQS3%inW*ytr(YhV1y`owCB7hVLH+ZC zz$gI0K%b0Zeit1+HS>`64F-AZTJidS2CXs&=?D13idwZZU^ebQA4tM%)&e|4G^N#7 z3Za}sQY`Mitu|)O&}5{3WcD1b#N}YrvZzAeMT&EAfd?5Ym+b=oS@}8>(MO-=;aK&- zCvn{Q8pJIuO=sN`%YA$O^)oXHSepMmN~fpc;c z_7#XmL}|1vlV00Qu|lASWc@jb(ql?VmmBOb1s6QaXU~XaBpFY4Z)b^z2|982VWt$D z5G|7NdD+LONa0O^hZc;nxk(VCaAC>Iqw2!-X~bvM&`Bk~qWRwj&26f4@*MqQe_Yxe zF;<4=vf7p65sQU$j+~iypG3J{qLaEA37+|7S@ic5K>4YK7#57;J)>jaJz$s?mwX65DJ@Op1Dita%VNw0Zt$*l9FbvZF!?7}|F z?#BmJi(P^KEIXC*nD~SkZ?YIL=915P`r4-@x2-DhnhN6>c~Z!mG#?`A^*bRjgidJG zMFLV`XLDW-`{c^_g8;K1brEWyQqCLdSHD`Wv?tp~g1H+hLt-TQ@lJ?$Ug18ni>ct{UqRx!xyB44tnqC`8Ck%WTVvV7U}4iV(1;E#vM*cd;exJ!aSZ# z>yEazo|3m(!&FS8Xn*KMQW=^yw{`DsjCS==U-32HIhh4i+X|1POX^uJlVk16sL&tA zhJ0yvVmBKK84moTWbLiXnYBAZ5u)*H9yWJ&#ARb6FN7o{v!spCt}v2CI2oGvXyXe~ z#^}B-VMwRSCp9)){+KB2s;;=aA~dE0$Qt_`Ri((Qu1Vfq*wuR^xTo@Mlw2CsUh%EE ztgbeh>8`*nrRfshig5*I@-n6Er}m$Sc|a=;S|1N59m|fM(;W5tlts$87oS#i$BA#Z zwJ<>yyjmIXAh!c`hE1zugRItNR?vkeI$kZgmqX)Y7rtVi*+pP>`Ep;OYmukSI<%a; z_;M>edQ$jI1s>c|E|Pm%hsEON7kER_)|Ma?gJ)V-Wq0&RD-lb*0~7n` z`Hoo7PHE4g8}kY%SHTE<<;Ku7C5L?m%O!ew%tHB>G(zky5IJ3ev4TAq14 zUrnWHd##W^Cl0HuPE8D2SC+mZBt3n8J&*%Z`jz^_hQt%?UU@QuRJ+Upid~@>VJ~I` zVOI@rx7k=PiLr2q4d(J*{j=R>@_F9L=NoK)C$fI)?@7q+>1yjP7g^USzZd(o5B=%QGMT`kBTJA`fpO|Xr|~- zkNxT{lpQx| zi#(BCw{m?^se7p6GRK{9v|ISDT|B=MS(eUyJXYrUbo_f({u50hXyxaTe&&TK+q7eK zFP=?)pmKj@SBHR*!zeF3WBXOq@2!7pfqsuc#HWW7=S-}zS{ zD_yUe&-WJ_YucG9^{tMq8C+7eB4r#81m<9TbEdlus;w-$V}^44@yQcDlJ(szI2kXT z--cmJi!PcsnWra{$e!KjJxbY5PIY#KX0-lT(mB<4_9^UY`&Q!s8b~w#@?Sl3L}_b2 z17s{Xu(MnQ+gZXDc~RAi7yi;3=M7LsE-ozjbiM-+%uII)K>BEkTSL#qDZjk``V93{}`a|>v3XJZk|K+xoe!0+m+8$K@psl9gR^E5_Da`c)GMGfkv@}PXr)ge@ ziirUV?yui4AALqux2yEGq|gHkx_hg8~fxm=4Hqz+t`im%CKn zG(XR@XqE;Z)4)o(Nc*#VFE%$>67=b5qqh*g|FvgjOu0yJ{tv=*+siIXqB4FM00}$3 z0LXO>MDa$UEf)1XWzfKPqyomR{lL;kdEUrn6v26-Ze>hj1pCnvaC(~duc+qW%%eg%@s{!l*7 zuq}BPsk(k%in&B@b>6;*djRX0YwIl+$szR5X_%rn@v+2Q|7lRBeNq4QqIEK5$FUw< zWDYbq$fUEPR!!%;Lr$wv59aQJ_^IhAAfc9sR}cxg9>(dcp}0wlgrT65m1o1%ve!NMcLEMm5GHx4>l;j>V2~hoKA1 zdVAjKK59KPs4-Y028()j2i>>Gc!X*=aZB$4S^ub;<0vr0@vQ@2+Gm z`+d&_Bp&y`c(Cu4)IJtI7z2{#D?7w(1-es{jukk1@3C=&q4hD62w4Q6*Ds25E$7D# zxQeX6N;}?bPd})V%BPzBWNflY#8a-?_a2=%1<$)7hLT%a<`F=tQWkInJJ998_1QhnjsSk+>JlMvh zVOMYb<-Ta%UfEws5#LZUw2fiEo}Eo8pCCT+B5$p5IqftwgPOt2#(cCmW_MSH6C3=; zaCFPctQ=swBK(@JM@8+-m1k*B^Tks2D~%6NJ;~hsxS=MV1s@(m3}FrXb43c=*p3OW z;=MOgbquF?%NB?WbHf0V4+~UCTN|Lj`9v4LUGMx$Hpt#Y3jzo5m+B`w%%u_qJulWS zvc>Rr^;r^iwYkX6?4yvcvXK{OUquSaLccC?W4F~N`?uL)l{U9nc>6-+R@};7>r@DQ z*JwX4LYO-g%BNNyjj_sQNk=ei`haAof5^B$^!}yKS_=d~ffpucF1TOG>v-%8eX37U z;ex?YL*1p@^1j}y!cj%wWp8ovNVFC zmgVy>7lI(Gi#kbUX1NHneO{4PWVy#kDW0kosQ+U6J z^s1-igjCaMxOjx&-f^r=H*?cVFS*j0Jm~5f(7rJc(Ycmca~^Ww7)z+-c({*5eTo<>YW2{n1URT?+--J5kke} z5IZCQBopHn*2(_DeZ+|?P;pxbM{aUsDfR@dGM~cWB&>fc#;-r@RjB35I8F3u<;}1a z0JeQWUTJY+LEzD*6(_UE3p)IoOSk2@`CM~N8-SC~X&4^vy@a1_r3giz!M+dhW!(OH@(I3slTC!hMP{ZFuRGU;x1#9!uw=eA7ogpqMeoWE z{Zsr>6s#d0apAi3t#2|-JMF}h3#)LH^#!?SeevxZL&z`-4sP6O>lJ^I-JZ97A#)Al zKT#DpW4%fZ4=rETM zenT=#NNZU;=*2AWRxq`zk%>XpSWr5-xjWLMTKil#3Cf5NkCa)D&I~pe(UgQl7;!lXFAn=sZNg#Gx?c9rYC1Qd1!|ahJH%_6%7c9Ai!H*!l+P77{*X{u+Ti-&l zyRCjHP43tqZO(`-foC13ii7^-uaf`OdpIwu@b|83csBV zv1@*T&?!YOPgmu3F|P}m6A=Jm{QSXVEUdBvyoT{Z49#Ot`f17jX`9`@vBiyLrEVMu zOVw2e`q5U+V4^m{^W!=h-+2J!4fHGSP>=Bfk`LKGl8?(j`)z7@DGUpK32*e5tICHX zDQ3uv6m|t&H{)PfJ)cu%(x#4uW~Z!)Up={gIAnLI*HxofyO(uPQeumW!lqh_Nzg{_ zc6_JYd`OPM(FS#1{GrlWew|o*oj;l@=3#iwL5WTx(u4w}Owc*8OiZuBo#e;=-P6Rr)tvg4gGGT~Z^XF66y@`E7(GVKd|( zpuB28$9Cfz;jvr4qps^uO20lWcAJATxyEz$HS5rx$K=Yrj-gChnNbpN`^^HAMH`&2 z7nU>oAjF6Uq6=g|CM@S%&_Y59BMEelX4He1CQ_EzYZJc%(7cnS7^@5<$ofJc1b;hR z?A1aglRka&sam_F<+<3e;|An0qRrsSz>mR&i5z_|YC1it$?0M7MmmalRf|!70`fiY zP301yPVnIqYp_GSe;U%?Q@i69^o$U0=M=Jocp)3Gwrk>`_pNoASsybF>YbC1g|O!r zDsa52*GD%s#oG8G$q&hbhs|Jny%4)hWAu?wv3c=a$#YcRO}`9V4a4mftGBAs&Myu$ zeKAZRX}KI8o7ahBzKiuh-x(B#Jn%qMqB0{Lq?KH*SG7_}vE?(1U_95QHansUhF9HQUC=3_CAbVGc@n3BxeWPDH%&FKQ|)D&XZ)FB@O43VMghf$Rl%N?X@d*b zIqjZd4k##MLkdD7zyo6?FK(v6ElKxX`S)}MM)iDl{VOIA$P(z%;Pe4J0FxAR7NUHp z^hpb2^SyIjZJwf8L4qRVo&X*v-~<@ z#LeexOPdi~tSTlb_2*!Mqg$WA)kWa1wFc=m0&0wlr7`BKaR{P z<`19M1l}y1|GG1(X%5jAmC-&eZ)*cz6a0T(06E1SLDo(`6|NUAz?UX=F=e%3!G6(Bw%GwtbpUGtOpOn0~`(>n%u(ydxN&$7*H6!ALjEIBo{(9E4b?yn8+Fkg$QGYRi@b(3=b!G8{80U>&Fd6* zug;NU4A8;WLs^2cd{_gF86;k5?>8mTYG-X2XvGvxhB3BhWi|}xn(7$#=B#cJ9Qj?AiuzSG(5G$%!@tZ!iwR)M!hTV$^875I!F7Qlco4Ln|*yuBABDM zEgP|9V(42o84OfXhvcrdw9BW`npvM+3)`y44(Ft$XP+wBRmx%8*Y>>@=4=r|E$~J( z={#@kx3-S+n;lzaNZb=nY^O2(Xo!+t-bUJWhJ@n#jOHO~bE~bUhxVeN9*~XxCf|!k zPyyxY#;W@pDfrT_9v4rN)Qc+>3(+m+iU zQOq&-aI}#Z%q{-%_CJ>|wcaRsK*GQ1n#~QDy?DAKmWvzv_4@?H_SE3f8QVs?Y1FggB8OUJW)hL->vU-pp*3{G?vN0?*Ji6DU zOtwE0^u^i2z~vxnL<()O7I`E!LaV;Oq!L}dTr2*Uyp8fJe6U_Cf7h;6UiQ9H1yV%0&*P_X-|A8pO*LI}B}YV{gV?s^I}dkI zhWnHt;=41rw2W6%>zyv5&h59){<@WoKa{7w_@|HE)bR^27k}HhcJwQn%;5)MmN2?I z%kz>V8kmZ}J4Va2QaVk_qB63MC-kUoYm!yrHF6bp>%diV#T>KxqcOyKbWu)ayEd`c zcqI~*;o|h+qWK|C%yL9LL8XLR;bBmVkLf|tVzW4!A!49AJM?}~bXS{a`}?4BN&wAt z7@rw`cmTUHuj!pXYyvXMD9$C-AsZR|%ox^q)4s64vYA%M*j=8rIB3C;!sYslwj@-s z1&CF~`gWS&Lyvhjva#%v#HORgn$;2;EJ)~!1>*QsAVLSwCTzO1xf7>#nP2x+y2dHZ z6^9Kwc7ze;v#`iQ3vEqWW{bKEiVuxMiqiTZ(v@O45hF%1F2TKX%?kJ?bBNt%40hbI zZj~xS2-Ya}3sCmK)d1>xbq^;C%O^^os`#O0(vI(?1TB7;v+m~@l>uXE1)Z! zdRRjo;x7oBKUOT{Z^sH17nc*OwEVeBjvQO3m7A_>s3>3=ApZE4m3a~qa#;VUaZI9w zQLjL_$AD-te%Z!e;m^oH{QiTcLUCH4-64Na++SEf>#Q>SYl0irK{mS_ceCtrYyIlh zqvhFq)5$YH)4AX~yH6+)Pk@;=}dwHHba$40-KrX%sF7!zVl)BGHG zP!-04>ivELUz#VDbDXNZm;PvThR&q6eV=G(u%+&4;s!*dvgRH)X}+~&z4Hz~;b41% zQ{c%YhQ4d90p41EQJV`aQb?sBb*`);l!*quDa4iQTa(r}Oyj!(cm0@RF=6`*gg#m^ zU6#?;dt`k~uZuQ(skaI7d2lQFabe)N_gxCr*A|Sr4UixTc8y;e=!Y_ffV=VQ5mEjZUHAYF=81d~em>Y$D_u?|;%F+# zt#-=_j1ETFVS=m=?bL3Sd&Ph8+%^21pWVYelee7f^+wpWr7dUvQX8R4)+7y@lhMZ= zn-l*YbIKNNYHCB>o#7N(r#?>jRF8wm+;!~l+)P~Vmwr09i%&;e`q|j+cBnhYc78x* z+b;j8pt4pZkNx~YsD626h5VPcc;Q(L@$%AO2|%b%@4+kB)vbF$;PN}S^3fLHmQoXpYI&x$ADs;wLh5x;oNsEJUtH%7hRGSQXrK00``)VtY<3VO32Gq&n; z*!N|r94htcK5UMpK-{=H1*LWl=fo}`8FnEYWAd<>!;#(B_^Agl_$6Qg;E1G}>B(%( z{+=UN>HGVK_TA$B4Pze33_256|Ag4t%&E0tUb#`s^_vd7`Wup5yZpYzM+<;lB!XVP zL}Kys8#JIB)+giCISiGh(e#L)qQMoTe#{F@7=O61y$44~%in$p{xvSn)Jd|N6{M#E zl3yX@oU^cB=J?5`eShQAA2(BT*N1gcr3H-J<)rK;4j;oJjA2D&Qe+BUaguVHvTn=c zjr3`MNc1DaizmttUM<-k@XKigJm|&MwFK?ngYsg{G3_YARx3~Yi-gT5Ctq#jTPnRY zt8N52P_(O)trE^Z8QxXW=+TFk5mu*6(_6;~niL`BZ9iTGlQzgKR|F@ZNxH#VTVb8w zSehZyG|qBs|EunVq~7h;E9oUd!{wd8fwjWtOTl-Pr~8jb%H7@o4{*XUhx zXBgkOoj(+-`_VAMn^x~Vjqh>H7~@=>KDxxk&ho@WVee*A%4byoKa+g2pSlBu({|5X zbxIYiuo-;b44D~x9hW$rE}fNj*XfTr_^ICOA5>yGRM{XA!-ZB;_eh@#Cs0RShY2l; z~>&Ye7Y(5i1rP>Q_-YUJfz5j?Ysire6i^-Gfxd032AGpqk zt`~mG1IG3o#LAOT$ec)Ry0|%q5(x|K8Ap0HuWwd3B_IbQ44)a!)u~`uq05m|w1Ku2 zxD{sOg=B?BclJ?aA3?9mXr)$Ap5i(_anzR@_kt6OWz7X7hO6&bOyP_83*)7kKQR8V?p=942ef=5qAt*p7k5`R7VX%ooew9WKJU0OmS+U|xurR3wPcw4^zv!hovTfGaJo&AeFnq2`n>D(CR~ z^(do0Lj}a!ER@64^@5tArG%rAHiAQAaD5a}cYi52h%cDD(Ly6q@GWU^OKZomxz6N= zuqP3PT!Xx~Y;}reyr&tt!-%6QU(IB-GFXf1u_?V~0$Og9Uoh=@=tLn8ZPu}+_L?Rx zff8d7E5m?|ByQDcn^2xBkWwH^?PL4m`O~R5T*azt$F%l^hjc=Z}m~o%9`JCW8aJC4_7~U9E=g%i+M}~7YAp_!E!rq zl&y?(c2e_IiTNIm9oC&Zm#yD5ILqWsmt+=NDZf|qB~v4OI`ZOTyj&#KNalnuHTI{Y zUPCIne52u-?P9BWq<_g!A~Kzw4sZTX19qzn)pk1q1(0>JZBcH}H5EoqKTH^sugpe`%QskmM)E`-6Q?v~eTKGn-@9Z5 zGKUQZ()C@+dg|NI8hXyQygP+ zW~O_Q{kg>;tLXVM^CZKdUqv^=9&KOZG_VeZ%kO}89pCodxzRfCuRSOTM^qie;AG=E z7+3B)JP~`+DmwB>>K0GFD8)4T^B~ z>8Puln?1?UM=o4#z~myh)j7F%WXhBGJK!; zNu{CBxsRgYcuPb(pi+MK|G`4zY4&jIA zb>T>T_+%lz%&&&C{sJK8syzYE#;~(#t>`T6ZgxQL{y$Q=U z8eQ~>OK2lMKWwk1Js4Nfv8m@YQa`hxLX$Z$eoE_tc540cTAMfJ_WMhT^j!;dc`?r5>h_d?no3e^=UhH{sdy6_ZaVGQ zZ~9fwlk^5TNeK8@Qm*7HY|%?a9`;}{>S>5`f@CmBmeqFiwrge;7o4spsVh)S=9~{Z z-;BA8IVwgbNd9HW|G>uod}O>=^u=6CbyPiy4Pgy51rB8PYdu@3X5#<-r@yK$MFCQhnw{38J&-E^Fw8~US7q@VPAOt`$i#( z*9qJ)6^jHj)@M7pGgvNLv&gPCMHRsK_5Ww{_mcbKU$eky<_JTR86|ZL3(?(w|4cFz z{xz%%zg`n1gNq%QfBVN27Ci0zy<73WZuhmC?J+lYbO5la$fG3Imhq{hBYB z{!y*|_gWRH{(2f|ne>>c;k%D{L%le$FW&sufQt0M{B!m^XUo6G-@~OKLv3cwqN&ipZ;OU{KNix*bVS$@5#%E{@0p;%k^&jiM)_h z3|_4bD%z3mTMUd#?zU(7uW@e>BqAg3{O_6n9fD@x;e&ha4T!# zNESV2HFF-UF*e8en$22=bQVM81tymL{_THF#gv5r2!@y)LY+trbGyY$NyoqA4-BAY z3eRUIv$64DrH`It+I2apafDUx|9j$zBq==D+=FDr?rebi zFa21&*is{)()sUD2B|;SLFbM*r&jY~|LWV|H5?!b*C^d^{r64|s{VRUjr-UdYN}A*wy$e~{kyW_SIs29~x2KVK<~n1n z&@hV>3uS<8Mt;qTxZv5{ldB&ZP91>{9p=&~&q{V3+TZsmxb7@ra#lh1Ov=Zx8$E~P z7ABfH7}QgU26V8-WLqkNOIo}%;?a?E|9xXtA?_q*El)>OHW%4RV}T4`(2DqOx5^-^ zsI{VP|LRh}+h||I9kN)36daUQs_8Nf+aPhJHIuy%e#@bO5vYTJN7hGh+S<&b8~+l% z-4Uz|Upn;vpsW%4Pi{c5Deg@`pJ+e*C(@n=-C%ED%7{0eNABh}H{zFZ@M4LDaJZN` zU=Eg?)y3q3o=iOl!#LzT;aJ-)CGjmJ3pR=1o4`@Do7t>Q*XhdsfssLGz{eyLYh z^XWD*XLJ;^t@Fu8SX8nY1gDtPF*{}GtQsc?Z5o%J!`!u7ry6LY8>u1H$2%pzOf&qv zk(mDjh?((lx8Rmt-UT22-m+|SwTjVr6tnjFx!$)Pv9X=Rz0>RrMVJ?B^ z6s-Y1sdW{R2L=wQzt~RzvyQwvU$dB9Zt`^d{?8etS9P1b5!(8!ZGJO0xI`Vd+c@*eBhab2!P9Z+;n|C%4@Wma!SC9CRn_w71)xQ=%B3TKi>MIkGkfiKQ#vh9fn`IhIa)5mN7mR#Q9s}XLZ_juMiIdwN*;pwQbD6 zs;-4mh_{+klyMElFH-C|_id&yfa2s>x8X)lsCj)q^Ole6 zp^GTzd{VE3klu;SGq@+ws1{j7J0lms5!AD(QKL~xEc7Y|slQylc4W}a97$%JmDj9@ zu^8d&B{UD2+EF=rF-RbdA=Do0qMu1wvh_bF^Td{#n4g z8Y5TY)r}p8o1@EZ(F=mfN#_;YC?0G)As_ZEERu+{)YA#ZMz7Vshc>P6!Hpf%Witv< zxLSN#`kne#yJR?J!)hzE@3EaMMUIuFzdeL3&cKo_I@$omfMuC=a2HX_HMWix+HO)? zbmGX|srOy-skDQ8>~Ae8xJK`X*C~1G)46D}>VKq`2c7%)luj8h8%EiDaV|eGh`QeR zzJxxWDxge!`smpy;M0tbx-iu2o*!}2!o-!AW%6LJE@AV-CgIy`eE2*vFrrWKs6%%B zbD8-&If3}eC^ci}bsy!`T!KbX_3}lr1?2a)Tx7AyD*ktPDw&$f?Y+OpMk8P7W}A0& zkbwqI4Y6x^`I|q!8)70RrM@Q{AqOrT?-zMbpi75m(f7|>Q@E*<>!cQ<1>UkwgxC7U z=^I%IUYg5~9Q3c=*W6Kz%64e)Khti1d6Mp2sv1mfTo@GACDg^8Af6Od(7te*G7*!4hV?z6{oiuXoF)8fhzfA(uhOOMOKSu=6qJ-Lg7=qztb zE7{Ro>z#Y}RQ;=iyqir=EO8kC@Djur12B=|aXAfqFoCNf5aWE*cQPEyBt{emFA>Uq zpXhCP!Ir7S?IW<^q+|dZs_Wu}>j~*)4rL0A{~8`ws+!=oXL#z^_lPU(?8cjy_T$Ps zT1n5Am5%II=)X6LUe6bSoksnPvDNtE>gJb%N!J*avbI;?B};$q?~vLB>*A(tYxop8 z5Za)!l7RB*`7+xOmNt`Cbp9sonl>z_hraU4->up+sz=r#NP9h0Q&+@y6t6p8|k{@v0)Q8}HssPHpM3Zui7xvrDc~ z+v@D7z|z6j#3{f@Dm$G}RH_MXtobNDjrC|E#K`57Bnq$y5KRIe*)%WEzR@ep^L9hqnu_gnE_QpYh^>MiC-#-kE@73vx?hctse&GN*aq{&mx ztsIXITb`N%IEnBMpkI;tqgRoW)=JdyiC{47seIcz&tzBUmub80}#(?{r#O~`v`d?lzY9)C5N5NcfiklEiFXF3-_>(2%0Pa7j=jAVnzo%1dbaN$j z{*yyDq8dWqz!wEd_VbKmpVH~MND!8C2*pEV&CM31I9 zf|T*$sDjsViUFF@piHJdh=S;;;{oFVS^xTY)7!(y5jCqb`+)T|FVO3>JI`cRj=Q>> zvLp)P3+VRt7`U78TJ9c~dHABUH%I{=?7_-Z?r~# z+cz$^csCCd#A0iaszs=#Z~f5tRw_Taeeb_7q9O%m<5X;AXSf~9(VhvsW=)1@b0{VkHecru9~t{f8K7<$W7V~)1l0oY@IUa zLE)jr#$qnB*g1F9v=u~7ci@RBzq7lay$u!-B;{q65+MS8}UuNUp z5li%%pXd1$1cQ#4i-n|i$JUL=8N1X4ASsX6|5$z`F1WwZf0O7uNzVfi50(CCPf*OH zqoT!$-GyJ;$B#tcC3b3`a;8tTgZ2WiSAfd_-V;*@>k+;+HyGK%#HF{e4~I4m6m&6@ z8iAZciMqKCS!DlBC$j$OLJhnXDvrAM*B`r3lWPaH-xN)~eaOW)Kvu&!y2&xPLfu}@ z)eJUB7|22${`{^Wm;N|OJ0z3evp+87ZrN%B*nK|@eq<10{7P`j2^hi+QHa+@~@TO~}#B z(L*T#z5I-EVaj=jgNz;)PGdIVTam2qhmr!#+Jz5&@D0H(Mlk(I8S3aBak6rx!mDjJ zUW~zb5fQ;b=_jHnC651#v(}QULY9@Dmm#m*Lglb3m=S1dV)b@qz!n8G?M>jKSMhc* z`Bg{#7n$AWlcQt_z+ly0ov7}Db-}|`Fqb*oy83ln?~I8O?q$>|*YQ5=8~EXvypqJL zZBYNIZlWA~$!|pk=J+!)<)Q+V=|E?OwuT{M`R-bqHurS|(JKUT9EHO&lk%NRdR$};Ca z>Qc}((G2(`AJxa%uSug^z#f5Ft%eLLj3LdbW#qj353~;UjamvN9cJAkN4VyctA@{1 zQ5**7q}c!G1%P$ch;xt`R`9Z;jB!W#~ea?WQVCMo)Kh?H1aM)G_`| z6|YX+^Q6l|#ZQ|rd9AJF^qDDkN4Ywztbo@Q4mEC&6~vn8QRo&3q$YpNpkhg^KI}K+ z4bmjD3?mk#Qr$E=Z|Koj(Lnjw?w`|(wAZnX)1J_Zm*@CXs|#0~Ee0av2$uObe8vq$WyMzPlA-!piK9$qE!Q|G4b6oPkG>b?lDE!*E8fYA9w6x}K>2d6-Mpqu3cFB=3}&KG7`?J#l`b%A*D z%MHqV;2TUNN|AJc;cp|37O3F5UwEYE?)alSWXX$j@?Oz@rdd!EQ+PE?d-M3lD`gFu zuQH!2UJz>(3{l!q6I`6Wn_g}#QXu`)<^}Yq6()YUIVxd-&K@YZp>TolO!7i%)9}}u zLiJL<%fZ_fV*2Qa&XVbu7!VdDERwtxp-NHuT2944~xD|HIXJxU<>6 z@BeA5XtgLs?b@4a?b#MJQlmC8Y72s(h*?!to7lTX?3hVx+FC{Jz4t7!_xj!aeva>W ze*Zv@9LarO@Aq|H=lQxOEA#oPuWpZ2>7cS)G8NRwx@+cye@kKKAv_U<11~Lb+O*$9 z_}b`LSG~3C`w&2>LcBM`gMG48sl2d}r<560yhsc5 z{M2HQH+A$$VNhn9qRB2NJ$VIH@xznp&Dic$NZ5PL$-KLae71J`@b&{VUmIGtnX4gB zOehFHK2UP?^RKSP?=R0`P`fUzE;*DR(o^k+mE)z<5)%{!v`)UQ?@81#4n*-)2~KM1 zB=)}=ozm(ZuWsd0Qk-PBUR@Az1Fo24061|%e_S(G0(gefSaKeP?XYOAXS9lIOYZM( zL+Uw%e~UOgEp0JJp7?w!UykXQzEhjemKAn z^EdjTn@r%(XabYHaM=VNvc_dF%?552H+phanaqv*wSdRHDi~)*j9d;%8W&u@6LTPi z<{Ge4X2b*Wh`got2)&692M-ebC_wi-J_B`x`vKo0MRg?JF)@X$?5IK5AG5)jD#a;N zISsrW77vN@i9_nE7jeqdW0hr&@#3Ma^g7mPqJL?VVo`)>&@`hYa?vr}a=alD2y@AL z8N>S2Ihh6UYg8hSr{4Qf0@YOguChHSbH#!~FXqs)Gv?f0Xvi+sz9k~c{7+T~bSK(# z&GOBmaQ}g}_5l`gEkx}q8G9;s`ey6F3JXaiI?An*IO-A0hx7YdmG7WFMS!I)%!513 z+7vky^SRbCa}pvD7tEE!_7;`&X`Bzk!b5Bz^1JPOKwh2)^ldjI=d6}3e0wI;)XlHb z!8o;#cUrhUc2Q~(l+diQWO$Hf$x#cnKUEPVK9c22V3K({5z3y}nrgK)TZ3wI1TS#%5X z7TOl6t5vcm)fcll@)0TjB9W+2=-n1unEV+x#<$FA?O3T}xV&@9P9)7D{5)HpHbmN1 zVQ^7=@BKuYwcO|n9Gs@QRjp=|8QIaPu=H#!_`oSbk&BWk-nfUo_Ed3OH${(gcJgv5 zqI(!8G{bzF{aooFBu{_`msO#-^aulmX2fs3^s-=@sMDiL*a7)jFPJUxpE2c=l%n#j z-&%0lG!KuVPf;76!^p2Z>6e+wJvy&XGHP-nlOIG7ncF&3y!r<_;(1y!GHU-F(=P2M zq4eoRV)(Dy*4zS`pGqb!v@>6MVoxi#z(k|JPBnkOyyzWJQ>m09&kR-val|DkDl*8d zI!FeSB>W0|Z;z?SP#;*UmKb(N~V|minc(&v5B3hEGvfOgmQTqwa>ZccATP1RV|Oc5j5iL#849T&5y>6ccqwkwatyjPtW zCn5Vz1v~6+wDcSh><4whZ%^!=ylZOkt%f*VEZ_%2FBau^9BC284*fBL%Uetv3Fn%# z36aVxy;mI7I$g1C7ySN}HxZhSTV0hFox}}SV&GL<=L&}<<@#&Of&MES@S4$d+$lAD z@-%Mw4wv6@lB-C^p0Wi=ybhzQs2$tP+8Tiy?Mz<9Msvk|R+$4C?4LQ!>BLp8UjBl{ zL9t&754sa#&J^}v^^|EbLVM#^{|T{yI8Lkzv;`Z}CaiL4_oXyzgkzyjFG%_;G*W&w zIQA6MHsk7Pff{!}1C6J4jL&Kdl(KnxusEtqEkF1lt!#Rd+u|;H^!A6_`eiCe)j>{m zSM~bwbn)L($TXOGaZn*fCnh6)-48p3zNZZxwZBEo zp}gAjw#oZmw60}5b{E?0-oG~+@$LM?1?f8|N{@P}HZL2up-q%60yH;QOBxsU`YFW*t4= zUn6V znCV`|E*6Q%a-=41#l!|2$C%@d@pnAE@-I|1IQZH|g*fo^v~W0Y-v-pOR>BSui^UA$ ztWQ^e1w{AyMdHd2O{tJDQofJ*HcI}*5l7R58a>y)vVW^Q;PpFL(?qnXQi`umf41Jh zqX(%tk>=W#HVHzg9 z5`!*Na?RFU@-(7XYMCG_b9Js(!=@oYsd3M}waGCWb)Kq(-9j^gfvPT;7Kl^RpjAs` z)J>x(ECsoO8dPa>$qY*Gctbk%auR(=5GBPonJ|e6rs`a49Pj&4tjNE4N6680MXvpg z;J2oX1M40qie?Thp$h*88aTqcA z6l2rvM_Q}m@UzmpNQ+g(;Jnh7StO?VRlD5s;b}NhAj%I_n^X*V%T%EGyY>;LpPJjE z*n?M7#RXC_N&1AEV%Fe3gO{;`m6OD7!s0?(q|>(k8z}h@6DXL0{A5kEpvGUku*UU? zqs5e|-@J!1b^O=;&eZEBz<0z1#JY9bT`CLv@|&>95`Kpy|K|$xp8Ix8pDiJfD{rJY zscNM+e(1jRAzI)fvQU@#5by@Ggh*=oR_Y&W2a@sG3rkszbVj`UnZs6%*;n8`&gcqn zBSFopY{yW@w$0JhAJ%qU^EQFF@x=c8P~z0B$0-*(H#Ul_{dL`NIhAgz{~&81g!pjnxZY1C3GlQ=225e z)EjjtVE0u~$8m_Hqqx^1KW{Ga3s{+fYG*ME(!0)?ZI5pwl*#~=W#JNfQd%@n5$!JQ z7973=vDjPwL5ec56^aR^Krs)asdMjZyEgbv=CJataFvCyP881Q>(uD@wpk?Q@=45o zW^%6^+$?Krwj9%yZCyo+n4I%D^bX3dz_@jFr?Wj_B1S{H8uVTtbh<1a`tMDKRQnb> z$jMp~@3qpoWmGxyVY+L#vj4OLA+(A2QQkoE$7=>46m=J#1!&`(HvuW!f39Zn8uuu0f0_8>UCa6+*#-Fxe0OWNWq@<$*UJF0}{_^z$ONm;8AzoYtDdWqS^^?AZ(6fH>w4-YP}KibDM6h=m(aM28|5VXMx-pS(p}AW5tG4Uk%+F?Hx*Fj zE887>y}GN}pt9U+Rka0Jaa7Kb`ugteD~~C!T{n6cbC$)kqvXeibQh6trnzEVBV`zT zR2DDo|Se+*p6D;LlDu?c-(Y(d0Qj9#d4EiY%|pu3zbl*<&`p zcQ3}cMsC@W3z>kA*O0}#&4mD;NV_ZD&sP>OtlF;VQu`HL?{oM|M%Or%nOFm*=zVWz z0Pj}6NSYbz(m&CLAF3(6X#|YkSN{IYk4D`N6NV_=D-mLHC67tKvv)(3d~Mptw%pjO z6-{XNyuO?5ubP>$7;i;2Dkg6I)zqK?(n*#6vA|bJqTi>p($$U;K%(5)3}Z$8V45D2mF?#T7F^7Wo(KN4A?UPT(F+O<;{@NsNYOjw>$UymruNEJT z$coM}9|wmAjgze%O#U27p#_;oc5sxO-R-<9b?~VJhpIvLFdA;{?!I5aQwk^ZnQz~Q z6up&htb>95#@P^(--mrJvn zyt@Qri5d*EY0-ZZlKqdw7XKb`&0gc&L(H%f6M{44Ijlk8p%JweR2kCjEoww?b~1yJ zO=f{r&${Zf!HaWa63SZqkuF&}MezyFn$!_If=aX8@f@7ZXU!P0+oF-$voEEiW2@W@ zc;XR*Pc$K~f7WSx=pOz)lediDdd5fqS6Emm9tMV2_FgX?h6by&VdcwxR}=d$oVnRu>POxFn~eS{N;U3HAjmoGK`QXz#LRT~`Eawxh%5n{E5 zFn&k7yh_p=DQ;TfFgAEgqHOr5-oB19$*%@f=eIUJdH)m~^6YntK#fmcD>2_SXrF?I z!MlCfg}8@+Or~IG72a{~Y!}#iwa*u2XiCs&(eL5w;gygX2|e$IFA|%N$-r(9xSz9$A$XpVv0+coKU$FJg+ zLT{yMaRaKf8cA%|OG9+g326*|L_!x81%^G7kPr26usNWpR|)6s1Hz_^E05@e1uvWp z!d_ecnnK3~>jt2!$xND}-chkV8Quzp#iKlY7=5dHF>gE2waP2r~Zw7}fH(ud*)9DD4rHJk(0Gdm#K7*JlVku-z+L(1uw+E4a2+U(w zBHC`=LVBfb@hcXIIA^t`)g?$B(nq<8X`+0r%!PLN5PFuqoVnrAy(%O*QV!}9I#1Yk zb^*B;4In%RE`PAl+Q}I{sPgeDLaj+L3j#Dven;=q*hL#%)yVMz6(Qvg&5585Eg97%zcn+nrf2b@rj51Cz&b-M7NHOLfSwo*5xT4jn8`Fx! zKNqfC{WFT#d2`j^vv;{4MjX``%6Wk>VwVw!V7tOAk zmi=;*|6Hkl!EWAsA}>#Cb4;6%DDJ1oL>rLq@s0E3w19;8`QO~2stgXrC{3#P)r z(D3d`2#&OZB6eT=oxOeAcA8V)bWWR1uU|>vAmRZhA7AyLdHIJV&8Z-0k2GP%a4*X9 zeVYk=Fz_NJ7g|uFT{`IJI`7KRu{$omUWyC?(gQHuU-v~45a|T^ zr=3U;Y!p#yS<8Kwg9Y`>na2eZA6d#hpz?rB2@}$0Xq8j$#V&yQ^bIx6XHrtlV5@O} zCnS#}Gd9$DcE}gXPE15a>!|OSBp)@K+IO zZxh<6KCHJKVrc%gl=)ad`uOKU>x96H@nUk=)#F4hnu1BF~M!Cnv6*T1P{_>GuA7$3;S>GcqoBw3u%98DQ9v_|qu=dIE4MT*L+ zQ<@euf@R`oxzpT59sQw8p^~W6?&pVzvJ0uCaoB!o_>ioS+H^3005BndP?OWNg3_`- zFv?>`rO@A;I<2I~KGjYA1`~R!*(Pj4=60VdoAEKMwGt|e*>_U7bv;TNV(+Sr^ET|% z4ik)uSaj)dj(_5TOJAnS zkovro81@h$vmbgPDWz73-M#<sJS4HF9&i(TC3@X1lED)#GEnl3h@`urXb@rvnI zH}fWP0qPXtU(y#voi7)+O$yKG7ESo73d)c|OGEQF?RzWo_PrR+!C`R+p8_O>q4$4V z7r)(Zy#kE|Yr&2$tT=ErPY0g=j|uEQ1*IV3yLItzGP0AX8~l?>>kstHnZEu|qtU}J zsOP2{W>MZO$Dg(Wo<6gofb>=n<6Y;NyB7K7AIow-v!Pr~DwowZkOF@s)@e`fp<(FN zYRn|}mKaU5Xqkr!)A8T{16oSRMZH^M*=-7s{h-=w7gn5=VYtcv90mX7X$4LI6LODF zI0;x{D9#Njb({gX3DT=7D51ZYiJ>nDGkWcEZ`R)GNC=o^ijHd>Jm%yi8NChmQu7}> zRXCM%jyIYaET&{8J&UQbro5qx8s;Z8LGVr+DB^xUhOSAU#97#M+5)rpHQICd*1d;k zgw4PZQL3|9_#(#P<_k}Oyty&+Q|5uY}kzqeqYTnG{%b3(f zA;#{Gu{_m>Q_GCneMY?1v%#PPRT=yd3L7Ul;8cZ}lrP6`1uezyBRa^7oOo94PLVC=t$r_FhwvX_3Y4LN?vzV?j+lvu-*e9dn6Hxn99!C`Wsh=w_!>cO)5cX<9 z)VZ0ItTa$~A?vR;qvC>j!Q~FIJn-RfA?v&mD9ngT8zK?}`YBF1ZGT_L#y zMC+!8KGb3YOR|`4sB(LQD>$pI{$POdRzhZfgZ#eJ_DCUtoc(nkIy&jKMaAPgAQOLs zJqy|$Y>2lXK%0Tj9VN<^mM>m2g4uDIJ5p(Ock!b>@%Bsg@imbe3fn$i`aRQ*==PEk zZ5CvR`ku8}_<08*GrDZ>oSG%%;q$^^)iJs6_O!FdM`Gz}g_c<&zQaqo8g>N8E5qy> z`Ham@Np_s<*k4-LW8el3Gv$!?gs=GSuj;vv0VN;amX3d4=#kRxK zt5aA%V$#{d!-ZMDVvsVJHm@6 zcaOGsQP-}jKtMm_%{^|(m=(-Z3YSY34|&7Y|TTrvIg&1O`)1}OMY{8P?j zEo3cKn@$Q*Y$+xbOK}J7sj&TPU%}oazpu8&v5n5jrw3}#twnmJDeXLNSeLNv_jcO9 z2?j7$UtU=W!V&{JE&-dvFXF}s;gI3Dz84AkP(B7w2k*9C*iP*RU2y{_zIze)v8#P~ zAyPbC;{;`>!xf}GTPLPG*`6-Kv}f9-KXoX z5aWeWWr@nuNc!MEEPD2FLqnxI7bE_`tykwa*MSjeX&_&K?V7ey%>)N27fV3ezPzPL z+tbHa&~qEN>%2yPD81u|=|!=|j9_!0L!IcW2jiC$xJk~q^}rNE_fy;TvRkOdf=y>- z%Dmpq3VHEFk-i)*;)W-3i3Dk5#eD&=x1ZU-{Q63bL6fD~(}}{*($FaFuaD~0+>pTS z`_Y)sSS3|g<`<`X8MYXZ@#$%eP?^wKoP%?}cXcL#%oOtz1XN=-5*lvzK6} z@0#OQm1&5O{yAC=?JrOg_Au~LW);!HJKdCQjh+@I31LcSAFVIwq#;c!K1pE)nskU& zuzgdsd9cWhR_0*QnKu5gwWiO!gW6Axlpznndf3Gu8h|0^*{Flx>Hmf4t7<(c$4vBeeg zL_J1*(|g@(N>8CQi2u{75T4{d{FAAc$1d^52CyvMoSOZ2zYwN9je@!! z!evUaL6JE;e1=E`4LfzKBgdKU4W+g8yhy>r6W%VqX)f8vL|*uAw(5O8&Mr9$)ZS)w z3#2ji@`-fDP+sDkT&lyj$PWzs$`Rwd=J|x~wa^u>1oMwpJ8W3)2+-NuVR)MI&|>nN z7aOlC1tOg~2?|JHH+hG=vM~;bSgI_f*+v9cE#FWLf1B^}Z(}v0iXEvgN1M=ZP}aZh;v*ic8`)jKeYmVyKADo@T9QmA$i?{tBzN z`I?vxa)k->n+i_HBJ5ptrlH8gM4454(%A8AA;81e{fO`XkE3i70yN#Sbc^Ef9xwk5 zi>C9(^%>4pkHz5!vLaY$;?hkYe}8}Muv%$y0K)4Gd=Mh2GZ zTRuHKk5gt;<`8yw-d59qQ=0pt00Nih*n=d~j`amrfA&2${+SvZwO?e$N_8K5)NJtE z$%12pcOzgj(wb`UiG`p!FNN~H%X62ygu~W}&#Pb>$6+ecYmAIGakskIEU#?rCHtE3 zK7Fr&IAr9b!cURrQf6HpVMeaQsd67*ZB%?2==Z)(D<&LxVNTySD3^`)wW5%6o0!6Sp%M}uVv)Z=dV42PtNJq7PON* zh5jAeA;f!+2biztW~E>q;~N6Lhk8If1IyX6bM>X^QBzQmvx&+MxT&~S}O zysZgOUg-Ti+U*T|eZUJt6fA50Vw8y}u9Veu(+TRMxYfNFKQ)}R6f`bQmLzlm_zgr6 zhN%fL53ygb*>3XBziqRc4s99z)SZm`z4vsX80vs^>uS5pquZa9blnqSH6inf$oy~Z zdXv&?yjUbg9BCU;#OXiAMwPJBL_8yli$dL z5I{4w=NW4)))hzG4yE)&$3GQiw>wN3@VuRc`I*bJ+?x4eS!yS^i*?~gr^Q{{dyGyP zg`X}M-5$IuZd;)rvAeGvI*ST48u&^aWHDApk;?FFcZDNXGw2!5iBy@);Qi3YEMk7F z>0lXzgW^z*6?k@8t_AG%#&^zZ$Lb3~o<{QTQs>{$c;XdVx&|+r$+Aks=8Vun@KnseLq(J)Z9pEVfKWFp0LTCY!Qfee>_?YlN#rD;st4%X+2O$;{o&ok4- zNKUCqI?CIFpT!d&kDiXYa*@6*6zgHTV2aerj`HnV#S60~jgTgtDzCYvurOI_J7 zl?)V1Cn)wJtC9E2BHF%dCxbV`2C?m3RK8j(gXew1k-y~tBG*BElR#0;#XpSIU6%#G ztKtP`3-XpT&pY&BL>gMQIu-`fj$mJVJxG zlKQspJErgV@i=b>TfYcy-+@=x_^#VCS}=rV+^M%1$mQ(dhWQ&`p`Is}`kB0HyUNLk zaC|F8&Iv@8s|QG*{i~<>_NN_e#SBYyVAA>P(rRJ!(tlIMclc46rcdJImn|D?!n|8w z0y>x{(Nw|`VL3+ZY4GH!7z>n4AOl;A@IVv4G_-G6zPMx?!?JOGE9_+sjWTXGJ*KD zOq2-`Xw3p;YVSdMGb+jYEJ>)ENpSSV+Oo)}->QRBzdDOM-!C|=Xeyz+#_$0&;@uIF zd|kN2tZECuaeEXqf9Fy#Y&6hu zLA_2Zn~&b4s%Bm;A~X^P6|?u-z(>A=jbD~m74f^>?Lid?8?ogN>dvFQfk&x*&$+x$mS%5&9ciwQNScZ{3isCLbn_RYP?VAGsDww46Pr@hG@4)G_X6 zV5R1xW(@~9j}}F0vJE4q2Gbu4yfX%(Plefro=nFX9Sp7h81avbUrrHLJhcxJ(!qNn zVU2XNY2k*Fc%nT{(t>T3^nGCbZWHl~%0s8N_n^6q@uwSLFIS7kfvmHCuBs`Ek@_qX zWgG%8XZyDzU6+o>`m_NNy%(s%G-MuYbKI~SS^wz?A}ElXI{OXi%LO$#Ulr>A?;!bh zfC!-jH*Tjy>zZyq+C{T+pJ2g6cxYFtPl{*N#{vEN%X=AQ$^wen&VuPUaG!gEcv7~Eb@_?Q z2zgIwK}PN#pLf4S4>kdVrIWpL^Vs__NAdaRR{EY`P>~LubVMWtL3AjO4a-;Qe6fJt z-)(V-Q?sM2hNm*UM+4?omE!lR7d*Pla@Po(De+V0RvTb~;#aGMNAc~hg_+BJWaaN}$jXTL@~^~NI{Cw@v4g7+#;W)esER92MPSwdPw8t|8` zwTn@_lFPqNisC;t9M=Q+VsfSL67f)HzOHZB0aC|iV>7luSWW6UQD%|a(x62r1)G}I z@S&gv@cGK-)H`#jPfO!lqsnttd~Sn^0htG>oTjTM6~C9pm`lSQ5zl?ER#5+mZLwtt zafblnlKomrhmJqma36Hhj@}dZ_4d!vG4&I6s<(p>O=ZHn*nVgg^?ySb?6CFb7CqM! zPvgSDMje zYIx84C?1gGsDqKh`6_jLttN4A?p+(vDQwZF$F4UhLup1b&6%WUwMmaIL=G9AWITa=qYtfQ(S3ZoS` zMk6F74jyuf*nE}PB z*IbxLr!}l(PU=kyFzlh8SA3gIS{*Fcr;+_g&L|&?T&&Y>D$q>)wMGVioxTtaSG1IO z=Qz#twH$^|(FGDmz4`*jG*u7uV!O1<{-U-@ErUm)k1jxrdv4VikpTPdXP(LM;@^9e z{=RN9b5^$2zk7^Ze;o|XTd#AQ4;R!A0KW0U@Xe*q*h|l)xEg@OEN1Om9sc}>TkCj z2@u~{1AbI>)7^#P$zHNUe7qWO@!QEuit}!$Grtf22wg`~2lO8a+E>5DmWMo_UfrUQ zpc!zCsqvTz0*DCGbxrl1$iWYbkw#ic?4v_~-#`|~1OwlWXohcR58|+xp^mE+MBXsA zKbh>eIdc+coZis{r`>EP(8;o)d7D@b+H-3fvh5>MpY>TG4qvUPoy(sMl^+hKm=g>W zH%hE-B~{%E;h$t|n_A2?4?72*w@s=6iWRPEi$Yn9jwRha7DuUbTJvh%@R;%yb`Y_m z010B-wmHYbS>*Ro{9*1yn5CR1qgolEfDpekETT%aD;TNQEjsjsPFIuJ>dc_j0%G!V zQt3c1q#5GM^!!90X0$|6@kjF-E&h6O0wG#`Pt_lhZeRORm>_N$$TYE1J&#g8`1n{4 zC2pf4BgBf^@ti5sMb#uOPMV(Y=GRr#0j(#n$^qNu?2)gMomVgRh*JtGnpd7>q)A_5 zpv9l1!~EhCo2+qEGqYG$C3>Ebekx3kr;dgZX_0VDD>sjg%Y@rSfV%$$J?v zAwUmqdD_t(7C$me&eM2Y(q`1z_s%bWQ#7g%V{34%?Mg?KpO#1?*#E+WPg1!_6^i^K zMHz+ah~8cHa|-h1siVYdt@-i0GdC%$pae;j-4T9_O=;&}fB=emC$kJz!1hD&+k;Ta zx(@oKYK}vmgZna zxG9VJ-5--LuH&#Y0tHdF$H^H3ZMsCMZ=9nSUyx;roohZotUl%Mj4{s=iOLd*J6MYl zAk0vrC3%xzgjt1HGQ_XmB8i%o`r69#4{`?5nFgIikALrs%l8 z#%zn*0A{Phliz+NU4Do&;Y9+ByzzE`JK^UZYzx*BAy<2^F-s|Z&RrOq%Z?hQ5yvx0 z>|Gi>vxmyjo_815uqdoJWO)O;yn{8_5yA?90wgyEwo)N8%O(4cLf6I@W9kHiH;2p6 z%>?IM@vrWIK084MVwb}EUs>`Qyw7rH))6Xr$fPE3Rk6k6Wco=*In(Sd%9N|8u=1(9 zhW!J>!dD-_p{gNQqpfm_w0kj#C)+E=c2T>*@59a)9;exwIuciIm9R3n?wPirTEAfQ zl{yAjSu7oht1TI)Q*CIPh3V~_Nid~7|BXs}=Tk!PeM`PLxu zs57yzQF~5@03DNy;)H~!pr$XQrq60PK@*j0O)O&(eh~6f`KeT<5`FM6=Eyj87WS<{ zmdkFl1=Ky|=g+zAv24-4L25N6&_|>?y?2NBKo5Wy*?|X;3T)Nu*-#8;K+6lw3d$n3 zM-NLV_CT3nsdv}t>;xUDdC!AifNT9RgT@tj z$*_;jBzF&dN^VD$QSqpj%`44G<(P>={N2@xJLKq<_Wd7b4*JIV{Wx#bAr3a^%)hL}oNVUrJ z&0;<@I?V6^@WGgR=RN*6PHrJ#{I_QQP_5L-MN;Z9%XNn-yrgtrR52b!%xImLcSR7o zYbqBUdK72s5?83aH<|o8*)Q0L)-WB|P2zUqA{ngF<#`a%iGWGjCgs!>QcJp~MlVmMl#JadxsurUBT5^v zq2ozH9d;J+aY1|+!{%|;PAR_1d$(g$hr%99YM3;*QehZVs+EovmUKF$KAK03(~RL` zh#0D9$G%A8K!r6VA@v7N8LiUXI5mvC>!Sc^{vkP@|GG-2{TUZhyiB(UM<(sT5%K0t zvJ-lMmAkp7mA=p+d}RCz2)d~dSKp_z8oz{dH?S2eLEFGAq))vLN@RkuniL4{)%aTr zdd0Wn$3G@^P;T4nzI9E-a9ilcXQ7$DuEXv}4y(U2G^GDo6rE$Cbp5&M)q!pTZ^^r< z%1PxB)!|w6c#%%MRvOl!*7~yN!>=~UT+I~QZ$4`lh7x=jh0eKwanxD*nByaA)~TW( zb*}Wm)4*Thy&VaCwiX7LiSr2C!5c4EI@Sz*Xo-G8$76e9^rg$zUkZIwv^0+KJbvJ4U)El`u;`c?fK#_s_ zk-s8$`#N#kilzjs0U@dLF`bXv0@Ml&n^Q!1&InZ_c}3&4Objm#wxw&}zLXV25(ajc zc799~$c{czngl;P*)htaN&O5J>LW!i!2&K?swfqQM->%?UL&jI{QN_E8phwY8@zV= zS1d7$?^PxneBj$-EWwHHso5jE?LQVqWqD-0Sxg78|`^VmrL19AVE30pp`K`J` z#X7f?8enw`h}*<0-T0_AL{sBcgG9wvxOvXToh+TnFYI(F>DftH+oT!q3^k=*w(p{| zu3u8&O$mDEZteNTQ4v!)zKR_hLV!AN^4qDj8G6)*e zcUH5~Ix$gIetSdt;A?{+ZBHg?EfQXdZ_M}Q8=Pt~GBq*g$!b2XItyBp3GJj9&V$k!u*~i_8akiDt!H3qe!7(*F#{)7j|7V3YEbWuo5y)Li z3;Z6S;YuP2U_14MGT05Js?&BzYpz?>o}ojH-k zIx`JId{;wu^hKiGZ^&mBnhVWyCyG8J^-SUfx}EG6G(ww&{fLZ&>Z_bFr^)AOw9TyU z7_>)JFRv7DgLEINqC|Xbb1sF7q;yg$HY5JjPxV2r&kuyw{w+uEch|>37ye-cf8h5R zgeaLSV0x>7|DXp6tjMwhc3Z~pi8-Q;DQ`0n9HNaA;(n+CS6|+T0be<~`<2$ssJ-;L zsk$qptk`fQo|m}i&wPEj=9XkGvDYV^QzkRmMZYm%T>-FE^RS4*eBf>s=3{!7X!U#a zDK-?X`RW%~i4**LGe(a4_k%{#bX!l*rJ+O-SH3VMjh=8uiD1cE908G*yueqZuQSYU zdDyJ|(N>}bzKsN)S-9t3D{+KCUy_o;UjG4FpY=`qVre)jzo^Ls5p|bqTm?Oe$nZ(7_@mAb(c>)sm`Zf?f&wmfLN{h>Z z1CK}l%PsetJD)UC{vlTS{9gD!!q)p8!tjs_C%$Fp%{y3fkA=-+{<&knbF3AxeRl$X zjp4LLY1Xgg?pEnPkkkhHG1)7T{=s$E?ZMN@s_nWT?uhtrB}ov$hOYEeU5-yV1pxbm?);V748Gu1!TRU z5K%`5t@%U6j{ZxVy2j4q@10$3>Ud?w;MvG#2Jr&Myi;Y!x=c@>y|yWK1*(xP^Ktw> zCHZOgt#ptu7`r^#=D4J8Bo$rWyArcSIe-yKL;|tw@d_&o0wbT3!@0<)L8HD74-n-; zCsf%gd8*iU@|~uG3Pbd`_|%(+M~6Cc z^z3mltNxa^0><%v7GwHjY?YE=a0c$a$I=fdPCQDvaW|n~XV9wtd)L76J5#iD+PMV; zS5Rdc!Z5~1FOPK$yi;6wYo*^&j*_w4%JwmoO$rfs%}NJ`1Q%X(T%Cn5%R{qa~m4&9P!|*&OWB;KE*fuK)DShfkAXmUqs? z5(FS(u!Ce_Sq<9g#phJyteMB>-&PW7)NR90B44dxrJ9^!WIY`F?hLZ4tLfXK=BboQ zB`d49Xo?$UR%0T1y}uggz~Xb*HW)*G*g90Mo*FaO!L}n*0l*mlEVAD1kMz5Cz3ua` z6aSL9M`51<{Yjt(|0k{Kdg<&@z{8Uod*bCUpB{m-`AUHKe&Qdx_Cpfv zDo>7PQLdeBPy-ym^tm-1a zj{_vwP}YQC0svdRIQvHnb(i|KdZ#{s8Z}V~#itaQRVdJn#C2zC9p7Xa5hu5?6IS6uuzv=VDm zfaEpKPoR~0&Zsh_!Z55o?UTIi9Kn~d8drr(hcEAp|Mqn9A?7~H<9?J8po}hfo6K0rPu;1yZt95BV z`&;sUjvUVWeC?PCl;7>m>Mo$JmUl?s48d^%vwg8OQJ*_PFEq(dxb8La{ z0Hf&7t`~iqFAul=sC-ROQwOwnC%=0T<9=YxqW}K6F7<{XI*r#Q_O4z)XR-AiXc1%0Z3J$r7Uja-I?dj_ z&y!?qi?Ov8`8+NfTFoAqM^%_XmRA(^WbX7kEla##or{><%4Bw%ds#Xx(8msugRU5SAEo7Suja#v|g>H5BBT zV9xgcoDdYa+(F2X$OIicJ`z`Unl=h+rHz#7Ad+BI9v|=w_)Q`71}0>?_2&F(lATwj z8(UBPS4P%JU7yaST9LlQ#+X{zw(3J39AlMr#*i_?j^b=b>&)3-^LFl+u~!m75&!G_ z{V(Znjq>mMAjt^qUzA9oC{U&Ecj1aY023@~+8;A^1wbd}J-HOAou0d?+;kgsQ>Fvi zkAG4)$U38H*5G@YA${) z1M$0ZhfHSndtY0rH}z_r46&VOUxYcp@fJ~PwqW#r>E5@AS_*G*V-*<158@F?nz3k= zCJ{!v+JDSD5I2KoLEV@Vcv`BKgK;FqNkT|HB~|q{zW6_*ye0r)arjryS&SN&hep=|M zH8ZGOAYzUBz`3x{ray>zlgWOZ;K*y}Y91AC)fw1tJ78VtgNgoNDr9eNG=!5TDl8QI z9_XvuuzXextOXlj2&e}hc!tKt4&M)%-pw-8%^43awnwx8&^vj&H15n!xv1T?*noeY zvsk>CdR(ynOHfS$kZymfFqeJXy8Mq$s@ptU06qekYjh|~sw zzi<*8BZa4(dYXJO4lxIcDyA)MVNvWJgOVf7md#%udKSGx(Cd5ZU#AUW4xcUrp2}y~ zx+Z1$xcIS}@nPb(^bUlHY#_M)t$!*+Rd;mX&O5}nJ8xFkI=ZBu{EpC0oKDh|`n@f0 zFXx-Oq?5uZ1pd7jz338IOi6?h|M7DubOCJ@!M|wy^J+087W$Yy4RMX}EI3Au$ zB@wLB0B&aSW9f+{G@;AXSzivDJ-v^?UmX z|5;Bip_Kp38{&u}MXiwyA+LCC=7^NOe-mCt#>zY^DZZz=OF9D!dp!2-A+wrvM#K0yY*3AC|>D;+4o~i0^Kxkpfjx^t|DO zLI&bb<1a@I-y2?+?){Jkt;U{qO?j3toP)gHgi&(7(cJrJu3CY)PnBY9h-E#(+$Ys$ zBqTwknVgYc{5mqyjFa;r>Y;w;t0Gc*r3TAygP`8Cp-zP6u$K~N2&+Hhb8%}%CVl5* zskBz0_^qzcAoyj!`4>e>Xwx@r=fX;aG9p4V15<%I(@bF*s3?T0j)<-#E~%%0OB`Cr zWu*lT4`kIuhed>%EwElPYO5HhLz}t_8yZnq-o?h(vs7K$yIWB}! zcFKAWeWadvPL9r_*dBr?xw5LxG0W7+PuJ-DGc7PlcaFKDgpLtgP)8rz!9QI8kE`zv zYO?*d{j8`U2nt9?0g)0y??t2&iXc)FiZm&qg%&zCM0yWOuOdR|p%(?|y@eLQ5E6Qj zPN+BEx%b>Nzw>WqGLw0;-{;wTt+m(sjar(7!X*w?a`8@4Pr8x9NaZ?2GZm2RcDZmI zc$XXx1BV~XW9Z?0uv7zcoh3_^(f@A&^k4nE@hx$kr;y5^5pR}1Eo3XK1)U|gTfw_P zvS1|p8Fdj_JohHEMI~>`%Z&CWxS5iDsfxfs^6PQ!BY+1GP{LjneJeKniB&}AW9b}M z@X{;orW&ir>MWByujZ4vx>#rzk*`rJNVB~7MLKe_OqBttf4c=-xtb76YMGpRXf^6tG7w+Sv4@=y?TGkalH9$=H&%+cAuU*oy;7^v@oSF@-uvfz!y!f2c z(=uI6m?SUrBvZ~rNJ)e! zm|v-~D+f4q3@-5N+3B3QohXnay)2@$2iG%RS6P)WS^E-IY%ZkYb+264@z_-6w-Xt2 zC+kfeg(`p4gCd&jF5#vg9(7oQd-H!63`E?9yQ7n!pj`(2A&3~LSI zL()rpa)jfLD_ZPuNbT?b;|)n(3P#PP*Rw&X2w}Jf<$InX*k=ntnUH{>b}*Gtr`x^E&FYx2h68il zxgF{ifrgo^intFSw%XRi=<7Enh5EaWN1l?i&;l{tKEz{(Ew7qGL2zKZ^wS1~jIq{d z!&&@J<+e+?cA-CNtwcsA4|%i$)sQU+BaN&UM}(eNW)4)(i6g7PYI!TEf3T_x-KwlT zHOrM|+mg=j5)`(_=nC{(u&h=X;sCUGDAr`kx}4U3d`DPBD8cHrf*!R&1FDyzQQaov znQy{->Jyc;TFYl3OXHDEh;7GHw}hQSnXB_E{5u*u1v?Tk&>5+vD09pdfhm%bQ3F{o z*r_#~;jm`hf#@5+3alCD^>a|TppUxx-!%> zjBGt2`sbuOpUHqe=RWxCQP!xL)N810nm4pUa3by?Y$y?!tlKa?Q9uk0C64b5q0@Y+ z6u3RftCfhMP&e}NIa>XiVtVU2-9Nb~G-uEF;vY-BpkGaa^+ib&*Zq_Kxy?==%d7c$ zepEqhKILfd^S-t|=zi#)M_lwkRme={9r*pw`)+PnY{SRJ2EyU*iWEI)PyJ1r>on!8 z3p<~wdcJt=sM$50iFkFNhptb+F4-8Ld0`dL`{iUxgxOcD^tO!a7YD*lla^#P2RYWn zik)7#JuCbaUn9iH0<*(y%$%i?4NKV@u{GYP!>1XRpQ8)qh2V2EwUS+hNbM72oCyo) zi1ER=yoqydzAPx_y4%GV`3&KnQHx?E+P^)Jauz6vaBmr@IAfkv-qWQ#J;N~bc7FNx zq3&YY?r%?6-&2w_Z@C6Vf7XPaITb9#xbJNltr3HGnUf;HGlpBGcN}av8Wc%*0iYSl z=#D{c4q%<|hS#r^52GFe@uIy-JWb9QQPU=A?)Z124v#is>>&LFR(5u)rL&HJ%IH!i z^4{!DPP1Th=uCshlrZP;VOWzs?v&}%;X~FgK3+|#a)PJ!W?9Yk+HaW;6)v=@C~v45{}e)wu+$|wg?Lhc{!q$ z!Abcz2lYdSuE)=g>S@-A#dU4l4IFqWY(0QF>$?k}I}@T`fS)j2RPA^EfFjhr3TSZw zwq%XXPPYiJ7jiw`mhtD>&9yC4qcO4?uJ11&HwI$#|0oe!)*N;7V~A}UT<(Q zNhRSXF8v?+0@o*P-z?~9*#Ec#2Me#V5l`bT>cv8Kmn=t^e1=ET7i97dKuX02K zBlBk+32H%X;o3)T$Xbe9mcSZ0>_IHc@O`y6-yRf*^XV0IpPW6vAlKR z&ss-|aLhR*ED7(8+RWYOD8yJoz(Fqp4KgHx?zR1~dEO783l;C;Rxr364MN^j;VVxi zb@kC`QssvX?4;OX&meu3_9BDy!JnxUT>!F62rDy^RYy!0vJi?0BRnX$l83+b<67O& zOAf->{TO=cmnB2kV=u2}$*J8!_5MhGcSXJ_P9xxil)p$<(?si=DT{0?DnfMS_GXg$C zuAr(8^B@AlJOe5sD%~l!A+x52=1*OdrxN{C{LSCrm0?PK{W5=#`3(KXV142JVp<6L zxn=L6S)9bd&M_8&=Z}I?TEz`zRkAPsjqbEFE%&Iy%LrlC6o~lqtxk*Wm)MK&%MZFO z&Z_*F%f42R71_t=SjcP(cwWMl0^Yp0G&$B7W&Y^JlLVd7*O9eMOl-iTvG)}WRbYQPD$<)8ddtyW68(LHNEKr4>&p2N#FVjks1pjDTL5R zW`zSFfP}`wXRGX4XKT_274<#8f_CYeSqb3-7L0pIu589VP?w6 zo}4f?u72)pWZEo0OdHx)I~?LN3hW*~9>rt1(EjV&D#Di$EW&EF|rk^ zz~6e}aZb>d8g?+Sp~hz{QcI8Bbx>_bqXLaqx3ieq4O;8ROY1jlPt%JxG7=3f?eUHoB9ANtg&)si|8$t5Wbz6*&T;X)Yj+AR12+~B-| zLMW{&C|+mJ-_`7Bp9u%d3ld(=I~y{?`5J3t zpeaxcFcmj7WQ(dd^$b`&tdUa>yueR*mkgwZ$;FMTQy#SmVsNd>Fp+erhX-GL-2btP zulKxO%gkZil$>T?65ui!9PnrI1HpKQvcc}U^H72d)39MSfOL$oOW2ZPBwj*`+RvpP zc8LnHs0#XE3fo)kUpTUTE|gOq4jMKsPB(4BrOLiU?K^MbI&*3%6I_XzalR$;CxJeP zBkJ7&2Z?rvW6F5Q(l&cgYV^Tt!?~G*o+9g}Z<)=KZiQTZ@Vg<5K9pEQzMi#(VM1-%J$lumUN51@UhN9uZ9^$AM zvhsUqDUbf&hBwycpYi!c!TeP~As$TQH3zo0i`z zsXbYwv8+VAL(A67lB5*Kiw4>Y=x(29;MP)vft%n~6gVWZhb(@Y?PZ4dz|cSJ4BE3G z$FGeD2KFvv$NM9rK}9ucG)*2NhBiif7iF(7ldl~Ia~~RpN}FJZW_q0!L!!aS%=6MY-thE$9;cN2aHgo z_R`ge8`gxqv-!O<=J}DK!`QOM&xzET1VouT;X&dI(xHDm8F;1Yh>&Ts!(C1dkKru~~d9g?6&fsN>O85Cj$KFv0?t53Yiythksc>X{ zI1aig*}%<<&3lR(6cKqFpZwjW(o}A_Am7Za2~FI{JW`q9}9_9 z7DjbBYH&lQyOy>mzn1g+ahQuKnRyzRIS%Ape2j%emW0PSY?`xK%jC00Ek6V~&{#zo zm#+ZqT$J-uL%8Jw7;eCjq`nFY1Bf>^U_0ijW(Hrb@LYPri z{kzZFe&t4$tEQed*_kgp+C&Jc&7N$FYJofrPQ-i1xqo8qtaI0X0=T~q*5I-d*^NQ~ z6%Fq@69MB>k(r4_uO4VcjD8i4{RE=zCtVHasuSkCuk{NEuN+ zd_^8%tpqVc;+Q9GN_V7zk%_8)$!h#2c^hc_8wt`MhA|!TH57Ct%~!qaE(5tdJJ{(e z`B>!8GQPZm76qi{HGHjZswJ4U{;9n3Ue{Gm#hHR;VbxTh%Cpk6D_$K0nL|pv+-2dX zsZ!5}eK_uvrfQKTO6j*L%7@lH#Q-iJ;un9Y8m);xA@^wWSi1mNl-!`S(j~ zH957gjnO^I@{nbHN*vC4;jr@~#R6iYu<<3uRsxK$G6<6Xs<1IUMk)k|gBQ$KD|46k z{E?+Qe0J2L>V2ul(4EuNweLEoV#M%vi(SSvsN^E7?tQm5Yw8K+zF_JP+a9)C6OSt< zkEef_qokES`CC_azqW^TLw7$Q*Q;JNxNK{3oiLDtd~aFf?BafUJ4^GE$B`ne0aIgs zULHAfdQyH*!8WkJL6w2>{#HXcaEksp0hBq=yr%(Q1nmp1JQl56;u+oPi|@*x?_#eC zT(*D;c55sFS`I2Ic2~#x&yLQoJ zs$ZU=fe;&5-hOUkA?zm1Y}joffC=0@rh9{G@?l&UcwMfDTvk2K%Kz|w$zN~gsk=U} zXs$@>NNt@I*>W>fFW}Tph#;Kh7M(D`2)(q(Z5FooF-#I(i)${PWlwI`lVvqUu7ev6QTY#(EQ=bZS5@L5;;#=}!U)U{T zmh`h#6!V8tYFL$~eESK|qR!Dd1e(CI&k z{vOkAlSQ@sQ#^B_x-%Ui(7YC*a=?r)sOq)x7xL}BK(3AT`f&+^F2@h6g|UHg?JeCx z^kT>IcgREQcgyZ+uNi`QP$1Y9kcnR6vR1>bvF-}u&BU^OkL!sgXf-G{P{OnB52z_I zi%4kLE2j`MGNu`9zL|2d^wnyPR>Q|>ivv2k_j+3Un}o0hsJyCVxKpgCWM2xvDAXAu zg=ss>ArCt!EUC!^X7q%f=)N6C$JunR_m6oZ|6S8+cfOSo(k%toN~|~Fz8hNO4u44$ zUoUU3QGd8iDZQ2BGbf9=QpVuHqS0@@%aLr<`UR&EJ=(5cNsvsa>lM^y+zCxe_L3v1 zL3}Zd*ZS=cZc{fnouSoG-m6kKii2Cq|2(}*PBt4-!+m-1H~#P5@%2Pr2{}hKhc&U9 ziWQrIUDr4of8mPFp5DUq!Kz$(v8)xtA)MXcKM;be-Byz4lSDb%vxGCPDM=_7vXe6< zBHtcqO?MagWNg+6X+J?x6J(7X{;aR9815q2a?EZk2gh8hhsOr;V?sMUNAgz~425i5 zZ?63N0pnS|?+>cr#&+VacGs(GWJ-;S^Cj)Euc_Jf``K|c~h*E?3&8z;%Y$3Jux#+-&h2J@oXhU|mx zv~y;P+%xL!Zw0ah*?YXWZ^nyA_`mF!kAynWFEO~dCUuc+{QxrFPaJ-9!YPT~Px7>L zV&Rq=tsg(T6>+1yJRb(#LGKpTGQ41IXns3uxjWAAKuY={mh1W%%z#Q8)z^0mW`mgYL-zj8L*uC>orb=)cvJh{qERP6>O}ngHyDs4o-yJ z^D+=)X401>Z_SLpcjK=Z`$vD*RIA|Cw9BLtnE&#jw@VD83AZ3$54nEn6+!+Vvjx@u z?!N^#HdqWb#6F)sn||Z-)RG|Bf0%VOAn=w>U7zgf7KJhY;*%FrQptfrAa!=l(S%}tYHqP-#6tV2Gox*|8EzxQ+B z@{UEMf)wKpQ~#xt&P(&YmD#y_aTbLcL)gy`ZWs>5lV`5zrDU&GwI)dpgG)U63KC@2 z$2((K)nKQ>Eu8kBWYyu}H*f3reKrFZf4M-N=8#tf}v;Rl3K$~ zfek-pIqu|rnF7~??&MqOq*_QxPmhfUv?`|vfeR#d^qT8qW$*kMBR%DCHNR^K!V_et z=wc;yAJy;YMg1*f;_7Ys#{LxOZQlM%48bx?vVoQ&P6A_ErZR9SWy%@!pN5+>jkKwa z7d^70DwcEbQ+lG+JRAcHopHooY{bUBgxT9J+dlt^o6R!Weuu5S_jlSKlIRXelkh!-widj)zeP3Hu>Xwda4!ditW?;`440JkO>eD5wg(4E|&W>JF@ zJM0N-{)87E&T+2t@XToh&HD^}Vbv|$%fZ^TcO3NJkpY0lzLe{KaWbfw&wT9mJgDH=!#6un*ny%~+*S3k5 zHh}BlD@RA$H072Tt=;cqD-E$kPFj_?d(&H=tdpI2ZVBYB&QnD>qd;R3{u8pT%!V% zURs~z^|ZN}5ry(khn!-$8Q&|j+wKTdlC2q^4y9oxVn8|#ChZ z=2OFS>2yB{$_;LVUc-&oSy!L!R<(~V{!II(h>RM9qnnZ1ku?4uVyRM_Yt zx*~$WJm}|Hd04!twGsljER``ycU2S7*iRkm%az3YK^&5thsovnY|D!5L~S)}n44*V z2r}7KiEtk@gZ@Z=KxxPdJvNX@@ESKX&ku3P)D^Pd&DcSCW~|6J`E(^mIZ$5GNr4!I zzDb;*9IO;-_X(doU6Wk&V6`4oORWQ1-)XeYkPq_@u}hh9ttD$Kit;an@h-Nb<4a-v zaP*?M)zaU@Gp&w=J_-!;a_74enkpbyO{v6{&e2^yKz7DZCb|0N@!tok;UVv6jcd1$ z_h&-g9{Dd}HXab&{rNw|#Hca+F@9X$Taq%cQs711?Cg&olH+at)dak{vKz4w1Q~PJ zDnX|~;+6T$uEfBDvlT9VtJMfmhu{Mv(S9o@Ku?htD z78A=pUzmcc(JP)*Cin&$ABAstY6eLM7q~Ib0w(q+kDb0eViTX$%Gu5H9GzEMk>dgM zuLuTu)I4PXYk)UuA3fCEg&fBFo@F4NBd;X4(sQLLLFD6C*yn46z7X0ZVBn?1%eG~W z#K8i8L!oD0PbQ0QItXPUO;va6l6m8$_k@nqlr%%2c$osuRJ2Dd?~<5!cP@!?>#y^< zO7Ds@I!M<|DC;|*-cKvE+W8-Gw|k4rE{|q3z=1UqpnP}yS30Y~srve7>vRGa@v@rz zu2n7DRw2_3xH2TZJK%O$)Ab>$L-YDeAIe{SD{Ht3t4Cp{WB(u@@O-nlb(Q@xKGNG2 zTYv9inWau#rh#z4h^oK4J*GiensE{Nhu!m-R=Q|7rx~RiYh@dxUV_>(-{neoV~s&` zt;C)#u8~nsfoq{g>gbyS#^HB{1T1#OJL3aY|tDegfoat!R;iwH=m z+Rtk;T0{=j{jJI>FEpW)0gsr17Ez?@l8V0r|GWZK`)29m{P)wEotNb@#Tbd9buYWm zS1g{#!iO(j!s!!biREQg9&l^M5C5sfC}VvWLr=WaIkSDTy#{ygANVvevg#+^e7&@~zUiZ!JN@mY2j+)JFfZP$B+6 zGm4g4srL=flSGU;u{H=eu4X$UM)uEr;N`Xj#3y_1INkP2TN}Aqfhdt^(o!tKi*QeY zTTAhwX)1zL;+IQ7I$-^RgQ)&1=vioIWO9;(Ri5WItRWQjynB8O9=GRrBuGze4J9+< z?k7)v<-31!0As1gBi{XQ@vG?dZ?UHonX!G%TZ;T%d|^!!UD#Q;G3d5PPVM=`Y>_$T zTinV#(9D%}*sB=-wQi6OfV6N$X(5pX=*E248&M24Rdx~N^J%o={RCr1?;N)_ma zEko`?hY%TTh-uYGYf6q@4*4q0hYpwf)A3yrY1gFB3Q^@X;q+GGi-wRq|5(WVdK0dv z#%WfN3oy$E$AN$#TC)vtxyOfpcB^VaM*MmXfnLZIC28gi4w!c-%us0O_)+SdOf+7? zyOFvIg1zukeKr_^s~C+v1@>#$%ljBb|L-Vq22No(Su8c&UF<&IZo!z$he29sHd2db z!nXa52&rVY-RIuzEh^|dZR6Z{ql0m`*<1=(&aw9eLZL=aZp!|d!qmE=zpNbHH?Y)) zjn}4)&K5Mte&wcKLyZqfCLQAeVq8A8PDkzQS;=g4gV{*E(vKWdv{)B@5@e=9xhcZY z1$qpvjP~~Dmh*rK!JP@bphX={l1h{qH5{lb!26<^+iKaR%g3frdSI`x?it;}s_fg7 zr`_Qv?R7F4_`F(2ek zz2c#Y`38E@+B=9t!Mn83yHJi$QNhe8WvJfjELj!<{t3PN2?4wpNY*Ge=M|7o_w z#$I=og}AB@?cQ zI{Z7d7rXtgQ)1L5jQ3xV<~0OVW;mr7Rn_*a@6>M_=?3(|2y!SIWNJDD|g-Dy&v)?26ug>1({GQXt!*)n~piK z%o}dqu3I0Wa)A?WjtiUPRf2LM~omD>u*hnx{` z3>C)E3avceAv4Cm^}#eX@;~sGbYi*;+$PRYdNN!*tvLPn0dUR}E7A=9nWxSw5j zj@lyKtk^?#Y{_zvExn#X^1CH1OI#@U83SwrFesFyKlX8x{ndF9pbxaXHJ^0?sa0Ms zVSDMjMt4_ZdZJ36lv9~@Pt2ftTn47@Z4PN2aObny4%+s+-sGus_dHF;zMD!Wb`(Uz ze@bT|FPbMa3Wmtb(+)sawY<>nRp?MizeyPdhW5Jzn!-5>Eqj=^oiZ-h8iyg%-$!y} zQ1#orSv0&kkids=n4RM%OaHQS=>J#r2J5|lwE_m+lt=R+6f%Ukmt;W6eQ~Lcl++rY zb9b~ru5oQrQkvO<$kfS7Vvmpni!(Fpud(p$&lS^=CxYcU#)vG9p)_|B!8Q&1x>XOw zHxgAX;yiL54+GM^&Qe~VI4mqfv+B765J>6N)~Nm8v+nX&1{HLGYH$o%00e!Yk1-Pw8h!5io{;xDJaFw@X{w>_o8ze`caB;% zar5JCj{!${GDWec{cY6~nD(=D?93dwoHKvls`{V*`Cq+j9Q(UskIRa2gRgac`J$2& zWTil^E=Ho0f#aAppg2qIl#Xg zLK50A7(3Yg8$0E)RfuPco1S4#n$n4?gWtt^O09HEybUfykaCCBN&ohStU#0JNu+!IQ*Q}As6I9(XSs(m;jL^+D74Ds zR>zny&0pvIDC56-@8p2lkNnPiV0>dZY1@&|};q^!-rx<%~n zzyqgbLNgk}+UF5Il8mx$P9qRG6TMgze2bka0B4}mRtVq`?7M+dS9gmwadST^2_IOP zRt{#GMBa$CJoVpNE{uz<^SoVH{RsmlW7y;-kAVPcOkvo{8V>9ml(2C2jDAyxzOW-{ zhAgC&+v6&#(IHGZRQpsobpA#=keNAhCC{0-MS=wP9oforb%jwANBqsh?h8l=k47lV2K*!uk+ zVy?qlF6oKM!|~4gu3Gj@XFTvem&Lt3F_7A(ADK$3Yo3lSzK zSreQc; zSaBGGN`$BXkhzXxnrx#FjZ~V1v}Z59@99{JTy^KM);Fo-i8b?$3H{2Utq@-a*KB@N zKR!)Z>W&2RA?}^uJIx7rVU^Pm6E$bdCK;9bgoV)olWu%lpRe50J+;)&Y&WBi7k*v8 z!8GLU^5foAs8?`s2u3ek-dzAjl z3FkZ)&5^sKDwT`Sn|;&tyRYi2T^q`0Ww#9dc}KkIyHMKVBhsStJy`4d&TVF*SxDKh zge)ylNUes=#4gQmbt6SBCFi2CF4nsnofO^OkxJsc{!1U02F~m7VunG2!F*3hg<&rb z;oMpj^Je|c4AcpJ}9ztF>4(bH+5#h*#uQth-kSG;# zptCHN9I=~?eo)%SBkiWT#wM|&HA}W zfv_fde{#>EkRCAkIk>w;5EIDMtlfIfEg%ET4K8b#`u>va+4W*-%u*ES!ky1JEx1$a z@AkT$wFB{hJxYP>M%ZGrDT196ZDp-#q$ldH8Zbe=Z!r>UsYM?DhX*0&z18RrY6DLTclH_pmsl+cIB%8!keSK><+28k%kV8F zz05mD*&bJf7Zm1guoq$-x{CZbL*APd|H}_{>)z*fi%xQxg$C3&1cQz{UqUrvSoOYH znZI~f1JvlNTxFEo2T{kic>|J{o zc;2a#v2(HgA*o%zPYgX(pBSno^D2^K@RFOUz*NOCW!H>!wRg`@kdOhM9k8Y0FRHm1 znLg^GU-AOjVQsqGd-@s@0SVFwn}no@j;#JLRy||gT>Rrft5SJBynR2lS$N@|m?GkW zXTe;ra=q2ivaEL0v#chBb+0*;1nZ7HjoYTL@EnzQ$!9w26ZwpdS zex8YIo^>`e!FLKA{%iIM*F1HvWKEPZ9A^&KTz{zL>6oc>n}a`fvRAFq)VR*H?>W01 z^y|R-1ITc-YxAM{IrCt8aEDZRhzMX`oK&NC1aR;A zihNX1LNzI=C`<>I{~Y<-ygErDyW@wXFAvM3T9o&*y|9`$&Z3SRWX~9_TAZWTg>C0Q zb&AfU?!E&<-FQ5{F~^)ZCEGGKYmL`+1E|_$lvz*sGFaZCDVYOyQtjUSwHqaBNmlzo zTa)415U-H5khgq3m_P<1n%Ub=aY5l6nR!HAae7K48=9d_32&@0Q{zhfN5-};r-Vmp z-6hehHa`F62MG^EVy=cI(zIgL)GJjnHStzrso)H7O{USbc3-C7_i2c+h&H2IvXCe> zev2>mUMn=F@{W3mrn9|mTDWwp`ObJi$4vWWU2|+H-UJl{K7EN~ZCUX@*ze-wZ!@8e zb)#hd-W(1i!{$LoPj-@+uZCl)ftW(Iw~M4hASSdAW^@zaS!hA-1~n~=sJTkSo>BS? zJslH@+IX#Lad-XW?2s<5n|?C!zEo&vD_YMniGx8q=gZ^mf!s_syrG1b%wDc#0#3C<;wx`}*!9vL}3v5?C$!VvcWH zG#6ghdRJATkNtuStD^nEG2twk}y^4>=Z^(5%&+3azana()?Uu2E$u*VDv!KpkUCaHKthuc4T= z?*nmLH-33;l5a;To()E3Hi~}o(5t_zd^LeN{M5aXGcZw@|C%gOzG=XAjhiVxk8<)p zn+BVCx`VZYLQw?et*=gz;X*&)Ye@*!mSeAUCJ+NiNzZt2@kL06dw`1y<&EU>!txav z!x0#zQs1>09ybFsN}56H&)Hsz5QeJ{1U^0qci)na(+B&a?4E78?o?($J!|5B#O|XF&UJo7W5i$7z5k3sJAtZhU#yHyB-!#B8dt#dQeyAAx)hE{rbu;2)o9c&g zid^hu_Y!bsaP|vC@!Mo7tG*EsBm~ONzyVmia`n##mcpXz_7Tqdv9%9M_P4>!9wNNf zYL|LD6~~S;9Y2B#8`%a`jL)2;N2Dj$9l$RgJt39O`0V}W3D91fr{H_0ND6IAi*o1H z$$`qHkv_8tE5KsiF7Mz=koOWnyES*M^0$M$sHuNSKi0d&EU~SS`Efr=yiC58a3CO5 zrrnTmFka>LX#Bi{p7KaA^{tgbJ#^IbTYJlsx5ElWZ$4Ovg$pIFpy!qr^GF6wl?b|G zBVn^J>D1SyOVHvL!FlA0rXQEAW`OApi{8+PQlmKI8bMjdXlGpg4Rj>g(bI_G;~`z! zGhvnBzC;wdt)RKXl?u_fUI~267{dg%gM~%e-@ooq@&#ujeCf*fDQ##~%)K>LxU!-q z3u4OE@F4dQeTn9y==Gnj46B40E@*${g6WUtd6Y+}7)Q!4%ZU$Rrel|>T7Z&dnZ07mm;f6Qfohzyb?I$`05MYXLNSO$z^L`D%^u*MEQDt$-el)Ljkd(p;=Q@kWSfw9(e ziq_UH3L3kjgSq080FEh7KzO0X6DJqSmITx9lk?TFQ%l&+`Fu)INitok@zaYTqyjGl7I#It70pZgs3Bj>%l&NE(E*1eAUZw0X*2Idn5 zKR1hf16;Mfto6HzdiFEw*>BFcX%yDe^+Z#x3|0BJtJ{`YiLA&i=pg5xQp52EOxGrs zOH3^516!lxN1i+7;KWP(9R0e6S`tXvhbS$CE;Hm}US(S(tS-#@E(6-S6Pz}|_&u1` zsu(*sSbR`4>yKPkG?53USal43Sd$69+4=M2>fJ&w0M6MZ?)bXs8(k_H|Di{=G+E@O zy0+~IvxZn?L+!)~Muef|&e2Y9Q^(8i9!fpc*!J@SaE(buUE#GVNTR*k{p%$$oH@ax z8zIG0T1C)^1XQaYQse`L?N-!FnoMSyawomlK5XcMofndr0H;+_-Yl0&jD7&YuPb1g z&^6Rd9Tqs3FY1NOitYO&>ssS+8BxvluXWNFj{iVgJQQy212M2tGOSn5B^jDAyAgdV zjcJ+8_vnU;Ne870kBv1=#h%htIPv6%?a(Pgh-E^fQA1l1xlfA1%N<-mE;HR^}Mv4!6Y`?XicVH(= zhQdw@xbk2M?Lq6{xnIE@j=jc9@%ZHBNjqKd7yc-B z0AN#wszxTme4@G@DPR)r0pt~2>}y_?3VHz7dLqOv11{W(k9KsON-^?y-gFhmNl@D|6WQpP9D^EF0 z4N~4^>Zd^+$J?k>8|bpf?*i(4wIu)SPuR@mOC_oZ>WH&7peW5QX-_@sb2bDlSV|?{ z5@=NwhrvQfP{y!Ut1X^ez*78D-DYIBunJLS6VZPI4bHW$Pu;p`we3ES$-_|}cONek zO$>V2b*5U#{dczk)5M;Q`F~kJ{10Fx%q8rDQ6hR9eG|l7`5Dzd@0`L`D@exS;;!sU zsB~dt0T?7QaH(+ZkJBU1IYYZS&6O*2^-htK#>iizvu;pXL%{}gIJXqPz?j~1CoSB) zY-RF++&PGO4%MCb}`-vpYX0yv0r zw?qVUGtq`tdRD*jG7=IR*7T2FZ^u&(5}1J};M@WLsq{h7=QuA}XPA30Cte4M?mNtH z@atN-nB>i*gv$ft^ob#A5T6;%Ei$}w+)g&hKYBdzi{}>iirW1z;<15KZ*BO^n{Jdd zhzqigu1Hjw9zOGj;^aMZcl{h|M{)r%WMG#fSWzz+2W(Dp7e8V^&h$ZamQ zxc9u;R|l|7$Kv*`G^I%JwWCPXSm~O4PK^T2xiZDiF)XQeZE1CsEtEOQX+*k$5Gd>< zVjT5~?-Olil?&=(ynO-SIAJq@1%sea#r)3XZYgb!;;-QZaiKQt3$yhngL~dIkm<9G zkOAv~-VS6(qVCj>8{pU5F)djz_tDy{@qipgMU*#68s(U^-s*-eJKZN2UFtjIK^Rtq ztniB{^vCac8$BWKGjP0q?(3>4RitzEpX(Z7NjLd@7|1c?Mw{Z1H18RCxCeJGS_%YQ zIk|)6aSF0v+m?`b(|R2-LdOgW#ZA_0uT<&^v@Y9FWQQ#pEe7gS_Cw7x)Zhcg#hyh` zi{5W^S^j5q7LeZx4vf8v+*D2jP~GbQr5qWpJt)A~QQ0DWu3+#xy*q0Nm)T(izpS{jS*iCL8=|w<9Ck|AZ5BvO%&~%?|1grzDEX^0vCznbpW^rG zRj=D@HByyWBxX9>BQvMa@5zT8jT~!=zk}bp68{Hp%&|CsO*zar*}vA8B~EHRm3v@Z7w0P`t)whhXqc+Jt_`!eq9;`|{s^lbOqRLs zK?g03$g|??U}Z(_{%$B}M`tVI_zvA(mYeRO*-+hgckP{mH6-aXBK3QyC(H)hJ<~Mt zE*;p(c?9q0ke|1XK`_F9YjAHSWEh@MF{_xHYwtk%%3Cgu2p6L4JlSd$NuDcXekTpf zl+RR~vuxF0e(^Nwy6=*zh?e|Q2z|I4NLz6SCTb28oP1e+3`J)VktXWOL^Gd0k2=f+_drHWk_uw~*{MG7MH<0Qbc&S`N)8+R)rX%xu zXeRwE-%=ypf<;A&QGJ;D{~_zGyP61)iAta=Rkdp3h5ebPI za%hkSDe0jRgrQq<0EYpFkU?^2-sAl}@!tFV?T6zzbN1Qaz1LcM?ev6@kHZR{{b|3m zGK=1FDvy*zXF*AeDlM4H!HH|ijB=mD-PNk{-{SrVGx=n!+4;1s&|B)>*bsZ&9c=*{ z=hu0Z&vA1A#ubT%v*SeW;$WFGGXS{G3U9`1nvh{Tlbgt!<{b`1He|>sQ zSzJBM{3IBOD;_HIej)Nb3n8~3IQ%e6G~Y0=W>IJi72aZ_;3nBU)mh@n_|3kzTv7)Y z@7m;5zT#R)MN^OwpRH#nUPQCp#mS_jmgN3zoy~{DNYW;&xa9sx8s_q65s=o-uQ5Q)HeK+(GOI`N;6FAQ8^H;m|_1!q(75$IX zI#|~31szNL3K2}eD86k~ew&M-!U$=6^5vG1h1S@B4Bv_q7X)ra)+ojV=?|)-ogB8a zLDts-gFCWYKuHyD*oh4>3ZvKm^8D?3V=n3-OJ7e^kUOF= zt|FxDn{w2U2??Dtn=Kc!g^b|sxS!_4wT;$&@1^m*`7ztwgxxtwOu`br?)d0BcX=Bd zjFeEklrWiTVt7Gik+_KhNv1-2IRk&jk|u-ia`l5U+vPiT3Z*W5zrPho{UoOOO#YE( zPo5yBMw{jbKa;qWdCBhxUZwy({aC4_|6@5H_}=RSzBV|C#<`UDtL^I~Rygr# z;urq?c_v44Y9JEORwD-?9+hh&U752Hmv9yfN*9R1%Dx;ADyd%!c>)$yCAV`7Z%g=HO}+v3f{Mg>OR7VOF~Xa>sl>INN(7*8EY|^$bUJZ ziM%e~Rowu3AE{p2Xjp3UH7fSJs4kDvq{>XQUvA1bW6g%ot7(ySSKfhTl_N$6ZkH1D zp#+39;zOMv=(1541Vx#@u0Q|gh75=SW+JKWWSkB!72{`p)oTkYzHc>ABD77KwHqtv z)8(6Ad;qa5AG&z=V7~1GLYVy{<|4JwGm0idOA`d7dDT1(%Zc)uFr9R1f0DkMdA0S& z>2gbs#^40-tGJiuhEc#YtLTCZI zY&U2*ychj*Uh>jVaB@#|-`d~DL#Zcu@6{D^4u(-HDk_D2TJFeKp zIv@nw*m?!b3Ajw!f14CQobZ`{>jBmJ8`x>smZ}sbli3}tnR}+v;Cmei2gyU-%8gns zx4P?+1lauJ4D}O|P5~i45Xw@AgTT3lWn{$9wgAOZxG^LIgGBey2W{j!CH37p%W)=r zD-f1xS79=~l?F5^l8Yfa>T}{QE+mDZ9;8rxgEZ59IArW?O^J?n1y}p3mo(sI_xf~t z7;=B4pryV7Gqnnd3>rD1^K5p9`6WZo=DRZ6F-)O;>L8-I|68s7#W<6rIvgc{$x?u! zFno)?G;paLnZzzZ49~pPaW{JR<0xto6qI0N*`P`<+vxP5UBOs_zM?ISw%wSH6DMyUI9BD3-1)4qh(b zP|3DAQ5~n>)peBq_H^`HkrY_k*8NXes6kt;tC|C^oA@Z(^Fsypu)4z=eH_KAobRWa za!wlS;hL%Cr(Kcs13?AYsZ->todYy+zV2`=%7v-2oHENWbt?xL)lXgkC~Sl%YkW=k z!9WRQ8&T9LefeKe6jtFEkS}?ta4CT*Xnv3DO95>RZ;`k)lOU+vJ z_cy=s?)at|6t6m{W0Mr|U32lJp3}X2#`Z~3g6t6R1TkwC(`MI6b#9~Bcr#728wyYevuPML>9px98Tg}O&FR_bSd&0#J zRvE3RTrqiQ7a2;u4-a^K#%lCvvs4p1Yc9Yp>+0gL%Jj;s^!}?=xu!`S8itKgEuT24 z?yQJx^6Ixkz&0)$%Zm8{gW@@W2tAjl_(xQ>8?`*(qaC>^1L z*rMCWG;uzUvQ?Ai>5obje$GO6mWP8Fe^FBP%75GoP^tMz|em8U}h?}?w}F)M;}m>wNS(4 zOv`(yBLDlFJnuy;dm3ZSJsH-V-b=tI*?cYA<$x!85tBw7k}L zyRh5s^?h{E81`V*9Bs6=dT_0Kh$ItYHW?59#8?gYUUt7TMRaKxxIor* z5ikO6)<7g=NXRsv=?^FUG^v_f2tu6{lWHMIfW>2pB4vi1=#NdFU8N7GYE$mL(G7@C z0H4tt{XyI`WCQ85+w2Q7Ky^S zx|rx~tH;(BRq>W+jY)-aw$>vu-RZ{C2*Y+h&t|ytxvxLd?t`IA zI3r)Sz*gp5-RrrTaw7!2N0KIDKqo~Kcg65bt2@QTd+(HjLbPGm#rBr>Gmd|eE?*uI z7)jzPn_>O=(B?W0>BYwY<+vE?cPW-MFELi0I@K>XCpA8mG=G{rFXLc0(AQfh4rW^S zliIj|PwnwGKwQS588d>il;V`yi>+d|}A+Mg$9Dkm$apl~UJtpp74 zPRehr`^K!vmM>2j<8AChl(Zrt5=Gr}=DXGBni05Eg88BWyeTvOLFa} z)NXoOhOY{tfTgZbn7MLM-B!1b@cJ8$V?y?)*k3<_3TD@oY@+rE1juJD|SGJ@28% zY1?(Q6HUgmk2MWhtE|zhRczSjX-*m$c6&On@|1KOE^>T&mJ84e@*)Cc!&r7YL&wt9 z26j;m01znT$XnF{yE=;}uiZ}M7bVxXYCMcj4_~=vaQ{teKF(*GE_!Bg|M3e*I(gH! zrwJ)O`^u(iY(WsZbpq6SXN+!zd4jU#mY#6Eoz8_EInw{?4f)Bh2cfehaO#1ZZxFCE z#!+a=>VC~6Y};3RZP}S3_}|i3g6lK{K*Hf;a{wR@ky8CCq5}5UDijet#PSM~GG{FGD zX*^xKd-RGM(A4BQ|7+DX=mkG& zl{t;hDf|4TMu|D-y=Sxfapxyb*o z-C(;(O^qwr4fJPU`}5s)_A_%4^Sj7S>6ZWJ|5acCxMJh8ESo(<<#(^M0kgdzt$xgQ z0(0fDm@s3~XQ*Fhs+rEeZ^0b&g%_p4o9hgUi*)(Vum6JWCV8mj1?}4lu|p)c1TI?% z*%~+YQRUxPz$gF@(N6#7+}R?aB|uXP0i48F#P6sS{=*0dzxcrVg&HS6Ax(_`llPx@ z^v?3;mrm({+ICq$2bL5=_4~hn49w_58Ir``6;R<;$MF8DE9VUhfM*XZPY~_;-`ghp z8;CSVS{q5f6PFD`XhJ1hk(t!E@T;sK@k5j8URt;RUL9Bs?tP}D3gEIlj!B<8FUI^J z*Z%!h-^2i+YAiDPbBiU&LiEavTlCR@e2};>G2WJ^`^UeZ2Dq9b0-GmD%K-fN+K97D zpn1g6_0!Lv?*o*Ll^O^nt5@A3UF0o-bopOx?Lz9t^gYvyNhgU< zsQ3F6)1VtAJug+kvq+kcLq)9n45z$crPXhj#+wIoGDxjNm=Zy?^AznwrP^@YPp+t@v$@Kbo0m3`kt8bAZ?x&5Rt;}l^2R2aIw zi)Ro2I@t8MKR5mU$4{z!0Tmx}Yx{|L_f6;_p*y%hTH^pW+OXm7GrJu!(H(y*!4tHz z;S05lrh12|wW8Iuf@&5KiPfsJbh$`b|YNf1RhA*R|$_ zs7pqC`gGXtQLBE4i%K$*`SMC*k;8SO%EwszNzALOeydd}`i2QgqNOqtWcp<}!`4IC zFZRABsvCD2qVWpb?6swwK@^3roch$+nMeKeeq@}2OVrl}PS_cBF}glbMUw6ro{%5Y z)eq?MjD2{egc=bHvEv;VrKa8|Pr9DAd`-HYjz4cjuPtaJFpbn~{`o29#N+jA#tW|< z4!LZeoi}P(TFV)=3@)23(z)OWn2uIjV!+^FofqoY5I z4OboYiDWi&kG@qIo_^62XfzmIrE7>(H1 z^x?5QvWX_hjQ-GACPNBE&!&bXG%k1(nklBgzEpj0GwRyM?+4kw`V8Mmb{T4+4){YEt z5LtsZAIM*8Y%bM#xh=&J4qnS^eRB}_g##1hYZQB!qYbBs1CFdrz9dIEwD;6Z*M8Of zcaW9Z9Ehpkk5faX4~u|kv$Nha?j;PG8+c|XLo+`v88D#Bm)$!vff)5C`E1pf)eBa@ zVZQ5Ud63{QG*a0(%V2TECdtRInN4l0-bArkv9ZfEp0l6mZ9F${ME`yjka0@CJk8-4 z?axjz&ApzCjL9X$@lTn~>EAN4kOt@J&4m!A|COD~ zbrE*VMXbSV6Qz!|@Vf|hUF53JM$^#k1&TTOrh1{WPXl~Z4jjcrIuMqhZY{r4;pOF6 zrfrJawdXiH#w0Yc7Yqdh=vzOCP#IQ}vhcx;Kzg7f2%1M1M+4d4GQ%pdTde8!p#h7=vmP4?h* zd+iox0xi@St=P#??u?4wBlg*~mpiS_5fn@(a#^}`(-CApM8ReGPGao(1v79N&Z21x zKfy}R^$#^(C)cHs;R%!%>Ff<_H$Z~JC$=~Q{_Oi$93Lu5O03WQT*RU!U@v67{^WWX zCrUbt!5pZp-VG3yK@jvn^JFzcd5TJzgW1$k7*gtsAxknFe%w)a?BjwD-QEL+zX2j5 zXdaJF6CJ(vKI~L~8`;BTWQ&~Y5BvCItU=}!F7n9Ty!HUIPsf-qjw;Lx_h*va*)=F~ z7O1>azcdL#LnTb2|1Nhgefdr+^z7|B&hnuDtp#B9w|wnG6ZGO@Bl@gCf-z~A3iqMx z8T(yt6{417cE+TQ1sD898`2N~sZ{B8T$f_>`t^3XTwG-Sj#+LavUN{v= zhKc?TKVP;PBx?nhHS=<~`L&p#9bYPoySiycBS!j#gr2B7uMEm~X&f#~S zXeE-&$AjFTy+!UM@ruX}H6dHIUv$}V!He5@S10CKwjSV=?>h_|VYatTUMex0KKDTF zTp5|P06k!1XRE;cm%my(7)h`LH4Zj#8)h_b9D253=S02}xZu)rQAN*sKyj0Z0GJwW zoA2qFpJ(Q5uYSZjq5I3NPSy*R=S)FC0R+?l=-toGi*k2ur4uXRka8?&TWIy=XOFLJ zV=fKu5ylZ^<2DQ%`Ah*(D0#JEhIO#UOHjw+1hND`H3vieRFMmsWjBk32t;9Rrd-$M zNMC1q^g&DpzRk_EP%ITVC9xNc5lr`Y!&UjRbiTc+)=!zpPr8DDU$p*_?*3H+lU)zg zUOPJ3ZF)*>{&RSfQo#l2c@?d_k{O8Vxcp@$Ug+a@+PVS=qO=!Md|xJ>7_h?fn%Z!o_u&2SPNqN zs?u-tq)`3Z4O{P@gV$fCh8=uy00^(V>IT|rFucIM;6&KnZtab|o%Nqx5#}WQ9E{8Z z+|qlozIa`99c_-DFO;}8BGfKNgXw{?L}nX7HVNJxtuWsp)95_X;F;Lqt|#g`nX4}Q zx>iP}7Fg90yPm@g_C4|GVQXSFXW}MW6JdZ!t?J?ObYQ%~{;eW59I)^mtLzq8|KleY z{N?~-Vx>Fb5=6~hH1$$`uu=ZzXy+#JTNAm0g^P=)EpxyW$;Zy`W^P0b5;(9dub9p@ z?j*fS(&Q>@XoH^M7J;+~v-FzJSs__#lXRui^l}OCCAwO;k#}S088N=?8sQ;O zmZqF$1KK4g3Q?zLjQDfOhX+MH1=&mufo+%TPiC}ym#`iic!_HIFYVgO8?V~A4K5c> zZ@t}&)Cb+Ue;O5^@F+BQ`YhztJ>&4#n2rHDlCT-vs?|QSB&wZ=n%L_{eQ)IlOM0$TmHv)gAxO!>+@sA`<{I`C*~5oeXtO2s*_=J z`N9p}lRm(sQxUi3JabQ6_G~2t-6gxd;DY7n`$E>-6$EQ&C~?ML0HTR--Dq+k=(kw` z=p~cqo-NIHx)eTRrZh;w>KK~T91F43bopfreQN{MIn!-tq;wu;v*Ya&pT*)F9$Asl zNqa~=*?v$ZZi42&!4P^To+;oBKmr}JlrszMbYZ$di|78kpUp--LC5$~?+7*dFMQ@sZ*}W(q_VT zG#=K%&UyU{MP{;o?JkUMQR7TRGwe4Azo52$ikC89y3`-dJ^T*Q^yovy7bX>zVfkE3 zx^GN)$Z$^-VJ?q!uRbQt{K87hoKIT&%6wUsi45pv8H^*^(p4xbmV?r&k{wYp4OAR- z_$Lxx^wzHEZemVe-1m%)3@$dNb_B0mn*qLvd9qvhW<}t=ZV(mt3$5w3xzG-DGIsl4 zbTTIK_82h}%yfFq`pVvBY_Q7#g3N%?tJHakU+s~;EMPk5$4%Zs&uLWHjCCS)3ObC0 z_6rHgRmxZ9M9A6RAS%;EVEUB+iU|=<>>*y_-ZP%R-S>5p;3#espQW#~Ea*EVZ=j&}mHWIS z+SvS4%6%e33IaD|>(U_>V8k~&rMH#J7FJq#(nk=LZxBmu(va*eJ&X1ixT_T$@9Nq} z|A`cIaVc$;&qm_}oLa(g($0|@*H~~n!at*jE(rR#Nc5*-Q*xSFfhp@kv%zM^$)^>C z^~?^2!bubBu`de{@Uw<Cnmf#H5Q!jaX8?W4M@aSIEITSTMV z9^9fYmrYPVwE6yR$79E288xFCXD60}S>-Q^?T_C@b+$T;ae?RMP3H9gvdRjGynw?u z2xfVwSw7Bsr2wT`UT3~LW1ZBDMM^iFOQSiQr0{GXW^nuJTENTWiv-x3l4cD51Dqg{ z2I7p7{XLLgIz)ij3`qC%QPBjDdD+MI3ezv%-67CG_>BTcqSKP#d+SP(3GMB}Lifrl z4)*cjs-7>Enqd9f>1Ar!(zB#&H?IkSZK%FC>&ONr|4=Z!caCxDo@+TKRG zNJhcq&tUSm6)2$|0({BS{q0Ed4rh?c^v2t5TSj~(^$Yzy{Sk3l{_Ss*L6nzi?LJsH znIGM4PXOoC^3?%lLzYXwZzG0?qKZY$bjATskR)!79=t)sP5>Hd=$cCxUnyUpdYtD^ zN-ez{@hcW-EhJsd5SpADvL64yjdLU~u^O*Vh1YR?g%pt%k^5$`_$Tm^^`A;p9mKgI z+cdn21?bT;9Z8&e__J)6N@2A@lA9voFQUxeyS?V4iZH9@SHkk3XgYh;OlTyHLiqZ| zZ)|xAH3J#zWLST+pj$`MBSe$so9fLJ+6@zgY&!t-Y9O2@Y81Y{_|C;n&{{kiV){!R7QOAoVazg9htQHkxjciao4n zrRkoFuk){%oy^M?hVPXfZoIT=?PQdmk^r8`5)BR2qr%auJ>v$_MLn!zmKeXS;Kp=k zEcYR!7ZabMp&tN2h~oi{`O2pqLWNA9biocI1|$^G zizAD2;=qOYuLX0W1Ui&;`OTh-et#S(7f)EOoq^WUgdok zD3IZKGF*y4md=#sD@kmlb=j4AwC8G+racepXQCq~ z4g3mB0t8lo!@%%;-CAX@hsj0+`N#3j>tsHiH8&Y0wbc zUy9BjQ*KY21*}0fqWv}z)4$kfp%aRm-&}=+ey94?4h`n-0(LL{v*X>Hm#+Kb*(>MW znC3gQc5dd<0^b!^hut_Gcm!DL>zBzcSC{f$3bvZ<@3jTD5T@~lDNIC?B>3IzH-oM z{kgaUcWGger_IPR%dT226!vCla$|{i7JQ;HZz)4X2&Mihj=|NXBaMYToW*=5qE@zg zk!hSkeOYuAD{%{~m1MMum3I9z+H_eB-_ik(c9!)t|6LIv{ z3GRtqoq$(rGFsze_mYJw6&;JjImT+wUk}8zTzCq|?&u)ePYRsAg>mh?$gVpmBWWpz z7+)Y4PWbwG7dVDDEEjl&7sz&UoD{GBB)Znvbnm-{_jK)Wu!F16tnuoYkwpr-$D!2ks7y99F)(*vAC zOGn{HM-(RqOd6r8{LqBS00}N%2(2h^U@LeY__ z3Np1tXqv%9>qQ0ElDN0Sg9HKK{a-k0FgRtAi2}-j3bSclM0VHeM=K!6ctO9UZq4|H zp3!%a`St{er^ul{-W3C(1LgjFDhBG;yUHL-nGHPzh51j7)E&+_R)g@p5A*)o?@Jl+ zHM63$e~a8(tl!?FW!f%RO;s8qh#El7BelCvq+LTr%+h|8o+q!C#rbTm-IM0J7zB5+ z$&T#5_Ni@T8ob9?85m)x-KOdF)#+5soDn=S^ zWzg1nQc6vO5i8R|xFu8f9v*wUL8x)m+~P+79Tyw{YO@n0s6rqHn9H80ZI>K-E^N61W;X`fc^PM4=S$v^NltgX4R4Ky99e*!rOHakXw@7Nc5+#6SnR(EeFDhZxfY; z8s(clrT8rr03umzmYdXFQeN>!>?Ew#dvt{W_2)+qcw;x^H_nTP1}6@)e#UhYysADC z$+4n3pj%?d!S};hIk2ox!?4V@aXCMlMWvjU$K?zC{gKD%%ilK^+ns|jtxgIt_@@;| zWF*q#EAL6wijyeV1;|T(Rs#Dlj3oF)71@sKUr4|?`bHQPC%p9~7|I!b?MmNa+d6(% zu38+&kvU#2nBB6pO9(0gPM`Ud?E*J6?!2M3bD^Xoj}FSK2_udrAR+$sXk}eQXL<=Cf)7^Vo3!RY` zFb!cM@5n{EQ(-rQ2kpWw$-^5lSir#ENkA}kYV}pu(L(TB37l8bv>d-j$UmbXusgv+ z4{)o5KC^cLpT6X8W&8#xXeg!JEO_}l$knF}yQi~s@@c#&8W_T21-cdc-D(rVYnkv3M(q$g%MQas-?ys6ths0jwM3>&2T&QQC0OVS|>U&*Y z4=2hlC&~xN86W<_MS=L!ON_Q*{aYn|qq~qhHhmh6f4(m3OO554J-S^=g<~?3HmBKi zR0D~qKaQhy{`3NTHZ}S+)$Q?pU@wi#`mrk3y+_&u)otNcouf;2brd(!FRZIV`zD z4s5GyMXjFT8pDJcVQq8!Z904xb&2zPvV9^4KXWY2f8d1|_)hhQHTlWe$VAn2Cz&{c zZY=@41^y_0)NLzQBWgFHi|R%rOtk=3QNAz0;jn$f8a&M9-OKVxbk&K2Wm~*|=er!O z%IcwdGATOXRHDTMed+Igu~4ZlD;< z(eQ|CetS~;u+5mmXNAw*Dqd^DyQ9Zugj~>P@O7WVeJGNb50)l&SX(hOCl-!luefoYA;TG!ms%JmA(2DoTSNDNvC0*`K@!w^tH;J=7=%F-( zm4Os$h%4E-&VDASF4aP^Q)Sy<_xhuaeKZ-an3Oo+8T67}8o%UL;_;iruu6qwe}bT& zCQ6$c<_lh90^z=^bKPzvTKOYq`Ew;v_dM->7KawZ&|9+0dzA|LxOSw4 z$cGGvVl@tG0Tcgfd8BkDi94US-oeq8)i4dvF185w)GJ)$o0)TwlI18}Z>3W4?VF9N zFg@9rtNBUd^@`Jpa;~eqfklC$wI1w-Llj|(+CKgqFSbNG?#gFPQ`rz1ISv9IaF#8F zKGTtS8UdMyGJnM{T;kjb`;{5t_|WEsG=WMw#3}SlSW#>J9)MYJ6HEvcsZGn(^QEb! zFnOSE#kC+maHiS>x`2tLWs-Uz$RCAA6K#IVOPn(H6-QDp4esZeZ%BbUI2YJ7SHxE4 zE(2I0C%5YXOOOiv{+4;NW?+#RLJNI4JpJCWcXy0;+5&qKq;jZ$)}?T2p=JK{t!nX| z-*z~|Sh~g1(x4d=o^4mN2c|3H&>~t7TjUiKRdi{oUKAosJQ~?IY|QDX8GLloAR+}a z247|vf)4r|o}y5MnW0snDy4wALcldA5YKUe-|qeVywEw>*oV3($kW6SuaOG>PFMRk z+e{FZ86et^a9q@=^swrgG2#asGqH!BAcJ0MIQQyN3tyajLL?XrYD!6#U~zqwo>(1G z(0wyJp&N__5O`TNr24!g6Oi`#Q5^HHFT)vL)wmCfC|W<-(?2i6GA$JstbUH-n9;gQ zBsShg@T5I~&x}MSMF)Qp?Y{q6abURE0qNco5c-z_jte?_d=3P^15V}d3=V^-mh4&v z;Db;AO$Bn0vnf$Vt8@F)7J1YW5nvv?1eBV9Xu_{5#EixHkSKqPMfTzghA$E`fu`m| z;jL)^0iW^g<)8P!N-A;3iup&SMRhnnS$GCn2{r( zgt;TYTKTH}M>1ckI>tc;(+0S2$k_zdfk5G}%@H5#LJvN@{mjK=XTER-SM!BuUKEfkF@^ za{Y+q`9`%{JL2`KieQ^zxpRZvP6nhWJ-w2L(d*Lg@(?JbZ>8%ukS3CZ;6n*i|Deo1 zj)NjOEB$9x>wGi?(QC>iX|?azNE&rg-1h4f8{MyO=ZOzJS(obT>D?=c8Kbt3sxPGP zbbH;`-$C6LVP;rLLZ?d&Z^HsyO(hvd0c{)=C+xK0#_WmAYjx3~7tmoEb*+c1*V69V zSM$=3GRTkvAX6^JnA(UUPKj7?__Q`|0p90W1ckQ3TgNL0s6(rD{9h|p7DDt# z;WO5*6U)i;TQQHx?Ox~ciZw1zbWJ>8dOpQ=D(UVb8qGID4)eM>;*%pLejnrc7PkO{a^ z;Ua>5qyP;w!r-P3A1eEKL%(ycZIPO5RYX>G-d3=Cd`$oM%;Q+KV7>0r73sP6A*DmH zTAUn}XtWJ}JB19Qw}Nq@1=Zaeecy^0k#` z@tEB21sgUSMYn`}e@~7J4}4){9uOM+m;wda^W92W1u>BxzHBl^8*g&=3C*(+drf-% zGplLHL6FXis=T-H=C%AgzfixKzlhE~0sw@kU8B)NfSdKU>tMo2-ywM~DR;ui>t(QN z3r??M&FQ?A52FbO)dyq77-hHeY1fDrxMAIhUGq)2TD)|bPR4r>*^}}vv+nQ$uqtU? ztxdV3nNMwyGpZb5A=;>TEZSDFwRuUG^R^yrjU9V@Kb8ibG5OYs2d5*uKft5-(w$Gd z0KBYh)FoSBfz#1MErMI^Xv(D~Lo6{fF(~QCo%ni5J7`DW*x*Q@0=>%Ik3@{Vx z789TeW%g)MbU77!;D0||_Z#r(ZS35kb;@!|(#K#Xr|G)m59jhJ)1%lY?x!2qCXXs& zUsnNd&nu z7)}(VQE~JR0MOd~BT6`VnrnrsBwHB;DgJu)0EZ@)AOJ^=bTsf0T#(?K)1YU%c!>Y6 z)ydJw*{R~p4VXaAezni|`5wr#Wgq<9$^gE>b(`ohwdz4*c(N65 zfBSos&Wdwy+ioZ0G@yuT5B&=(D4~sSKn8)EzRvs?C>rsvd>N2No7X2m_%)9rJnh7E zZjR3P(f`&0xKS``%e`b;(-qa&`w5t@4t%6cv;hG9G-$Rb;E^?z3?ngkrEjqQv0B&M zO7-Q1GF|v^!;0ASKD94jLDl0h_X!WjtNHnhRV)C2A@k7Yn~1Zi(A_nlUvb%q?qo!A zE8PaLfO<;3a_1nxM7Hf_tHX+XlMazP;CFk6&Yd6_6!rqBj6*=kg%F*83_xGs%yq83 z3AiOIun^9jogBkYD)pk8bkz+^GF>!MW+v1O1ES zixl~~1L=J!bK#N=FA|inQ_9qU5~E3b!@0*(*V2$sKu)2}Qe7LM7-%a14zr{-7D-Pi zZ)hPr1LV~e&OH}^h12|0gz#PexMxHH5{01QqvKdmrC|8f4B0>cz`6v2EccqSrcW&5 z_MA{xBObwT?|a*Z3+XJs#k^Y2h~Fs@WwMB0A3K2$)5!*O*IUY2zO0&EMi?K%n{uU$ z124^v%K&SU^e0Fsv+{%pbAFU`4;W+__Ljs8=05#&s^*(vNL#tP9(_aINnNK67bDnd z>qPU?0Sh#N>S@^mGI6ee49tSio>(!XuCo3 zo8C9y1gS9MM`SjEp2Aynv~!_ap9)7Uzbgggm z#zFfJa0sku)!h7OSB*={KR7UOV%=C`-&xOlj$7<|CIdVk!FAH$zeM)$DIk9BX|o;B z#iU^ad9-!4UkoIIDE4qN*)C2|rw;mv295yzNxIpR#&Jjz$?O-~ca!U@spbyKbab|W z)7~zi%6NPn3N**aBz-wt2>4Xv{hiwjMWc*Rkp}n^;jjY2_fi2=$dE3%@#(b6v0OI} z112WEr)cX8aF{_`-M&=4I$h)xtcI-Rw8vM zqlPcvio*7n7#_(}KKpkY6mx-@ozm@}6*otyveIz~S{Dc0)d2mkKnR7yXN{Mgcm-nlNKi1W3=fcd1Yi?4l zp4}~bh~DZoJ;)zPl69nCbc&}oWyS{f;56X?dPp8)+ z{@rI3K+^>*ZBSnDM06;K( z0kq}D8$$`xk{Cx1l<0eh13p>uLkZ$~I4EyAEt%%gXIWdxesw!mUrRgTOB8LxxH*Re z;D)NJX<#1Gb_BQ9TaX`VA?v6LBLYwZJ5JXesrp#KqNRis<7j24GzaJVF&z8ig$@Tx|# z*R0SeSJXA*U4Ne6NiF6^2LIF;X-SQ5qDk+GGdG1a?iVq{%Umm)dM=SVJSVI>gRY10AxzWXlrZYH z-i8zvu>6NTlbtC|wK~w=_C2)1!XV;`LH<-oc5H}rv)u+&3aoQ{!nm~nbRMdIhVp{C}dYw`OnVksY{wd6fry1Kku`%7~o<4rMKu~J9sHGtjU-0z9c6Y`VtPu(RiSR$u6CnroKz=g*pW%sXO22qRC3%fV z{Yi-o0cUMmduj<8@|z+++uCq-{qZo-`E1NS6^>60tU<>)G*|PycNQ8g>3Ul(uV^Da z3orl;_%5-;cB|6USb@ZQJNmPSW3D2rT)@Y@ubEbT_G5Kfkb`6?d{*#ow27G=^J6Sv z9fD9jk~5?EEDB8yeH+8bn-(#`R}j1gm{qa5x;0Knc!`h$Ix;w)F!S=Cm-gDj3HBd* zKIq;Cn~X@jG)bNCn5WOPX|r-jGMnBj*94ss)08|}_pe;kcB~|m-nA(2({zZ#?qc{x>fa%iwayELC3gHeKruahzJW8ZaGLH;Da4S(4A>5Mz01^yrXazqEEjGMMubA z>anWRBeoTg#MVFaj3P3$LboaAD-^!y2=DMD@ftZaX=LrcVyn5leiRVh|r z+j@8_xC}|V^*)11szFVw>HCvDRj2c@9!=?nFySYFD^zK6w$nF^Oxspq5M$`sR2Sb0 zpa8v275tMJKc963GMpZp5ef~oD`xjRXZKx#C zThhN`Q@fWy9G(dioanhXee1lK-NFI~sU8FCLCbrfsPobnh4v$UMScgciZ`J^)%W%r zqx$BXL6O)^Gv&W{#Uk0r@R7@AcL(#w+XSqC#W_pQp#7sfuH&uU&rbMgw?^Nf7<@9e?wDlOJ{L)qyOeKF0f9 z7Mrfkc)8CN90>(A-4M*ch1p&r6TXV`;%gO$)^_D1H`(_({rh*#FdLPRWItuZ!lYz- zdt&%5MF3O#K<&rnBto*i;x-JRQfJw^xg%n)ftpxFk^(fB#GACbsN1iv40@#BXH?_B zPsMaiYupnirh!cj2z}iXX&C14X8e zj_JIDT2v7bRY1H#V|v3}ov&OvwS&l;etTZYzT0CYu z9ha&Ya+p8rGnbVQG{~?9LW`v5P6P^u8p7OoeCl-(ZbvnN`C*=0l+3>ZNpGdnm>aMG zkb%wBb<|L2XY1SOx*l+D!%JgFet9S8;DSblA$aN61T(NPY%mIF)T`o_YCHE0;@rbUo$bp+#A0D1JvymoSb@Njb<@&{nfcff304@)VFaBWMuap0E1JlijBN z*M{td_g!gLMXNQ{@a}}JZ$IJ^z@0NS;_@pJzW_LHnh#~e%d$mC1L~EqT;;HdiL>C{ z|C$)2CcQRuRf|%>y4ux&oVW-LwxDmr^@fCg^u#-qwK&cS$xcr_2g^8Z2bb~b@V%N| z)-~~$@gD=6ofh;6VEbrAAdiOV-D1$BQjQA9O3$9&%MGr)6`-HbAdtEL|Fw7KUrDY} z-|v{Em8G3VN9x#IMrIyIz$U3rDSHHh**|b zrlgjnB1ou+3aF^a{NBCm?JszKde?&ATp+AdFHB=PzaIU$aRPbym=`;{87L)|y@#y*@AS%l!YNGg zm-GIEnHTu)<3dTvnO9CeCL0Yp91_Y%o&d<$T!)_jR&s3JnyPH z(6cmgpk&0g{fSSlm38Q+OG0?GPvT#pR(1KxcF)<*NiUz?IyS~tFTc6?JI*%M>$&Mj zE1lXC4WC7H26n!c`LWfnFv5_v=MU7JGaW46E=8~bzju%j|M76zr4*l|rohdQwD;Bt zr?R8%1g(^%F2yq^9xE)jO~FKD;^!SzyR3dmjnBh9eKzxz8~>HJgI~@>AaVUaOE(Bi zaxXgN(tI5}*DENevu0f&BUVsvMczrph8L~B-zqg*k3YhD6>yfFZhQJL3z+#o_A{Ii zW)UT{i923!C;4FJZi#PUdh*XV1r0RLQTm7gv@BKAe=)V_$%(5Xt5nS;nO)YepLR1r zE|a+>G|aqlZ_ePqJ`;4}Z>Pled#Kp6qWSYtN4}MRx`Qe_iCL2RWc?)q%DGd2y#0F^ z4K;7)tDmtO1`h(w9>gP2tLjE7b)Yn_w*+Z;`abxXOYMn07aa1+Uhb;C%Wm&^e-M)s z#2DIm4t>DyHTuoa$?{omZw>^&%EzYF4^D(H65LL6qt2VgOig6A0^?KJ!CoS~nrR8N zr~C`4*RpcF(vJUMI5_CI4LD+wWFQ{BD6G49co*Gu@z4o63>YCE4|Mhq_Fg@)D(aK@ z6D*IF*jB-}FMF?B%KZEuus5onR63#30o$|n&sD#s#!0x5kE1MM?wbK$8fBUOjDvZG zd617VC+O@wKC0{#9SpfrJz0Kk(Vh0j_Nw#UaY(rQ{074*vs^@UEZn$vG-5T3<2q49 zI(mW-syn_jWbZ8(UB||}q*nK*qKb3_@#MsZ7xN5xZx$!HIbJkMJcr{(t2IS+Kriw==w9`G%{uPpwk$T6gG1(os56s=N-^O zJc{r~Ch{LyYx*}rt6n}6DRPKcMff|V7V#Eq{zibdhRz&0e# z=x%frROWLArqQ33Oc&RFzBKgIq4OICgmNV`@x!>+;*hj!b)}qKuO<(}9lX*pv|jj0 zSSG=!cOPc|XEzd;*s-tR+^4G=?su6zQ{G+a zU~p&@!ngT7D1_Rj<#R8;5D}ErkVRCe;Z5l0Q$h5O6A!hU+p0zUqq*1HZ0waeZ_V3( zwJfa7y?L8DPVs;l?7e7Jw~OSd*{0~aWsBOTa-k|sV2$+S&+dOD@{CkfT)6IuUtYzyj_!5yrQooXxyRKbx|E7IPW zy(@aK1?e#|;Fw@@Y?H?##sZbH-d#oiJaTxpgZKCLY;wlyL+Nd#y7Yf$?ypxSIN_f_ zZ^fE?!AOFjq|u8X(a&F`-AT*8e&UAz^Wy%%V`h?X1q0&s9@9~uQJ%hca*oDp06*&x zG3IGD+dU_8{-$V$O2Hq1y{_f@PIsUraoo30n1v0mtBz8>I)zzlpRkM)k6V3j;Q)2n zXmt_NsJ0!yMub8>PtHjNez zzuuZ}f^@jI-(JbqNBYh2xRlwt9XRu2^H<{>6K>ip1RZ(WSBQ^*TB(1*re%s#0uT4# z!_b1gKuK+ZYfy&0`4-=Y`-SE9e{Ldvu06S>{Lm^&G<*?h?LURQVRA|0Gy8{|07CM& zB%MMZx$h2H%Y4#+vjO*SJKgDjdu?-r{S$>Am(7cNq94WE zLkN4c>0SrEoZZw_%VMaibD+Ka)`=U#J>HoRl=52Oj7Y*B{GT0%` ze_PSlnFa_$>TV1S7m8eC?AUHsTx4v7BhZ=X+`yCjjO^Px+dbIs?cMUfL8q>){Z+Mh zK6R}n!242S`z~spub<}w3v=Jo&Id0B?yNPn%sc_^-sgNh`QQgt^|8a7YIy5Cfl*Pd zfHdo@o38iRk&Z5giEjEWIuQxod2FnSdxsz3aZA;H0U}Ag{F=QQIFev??!c<3Y;&O6 z)_G(jZ{SnUW?sbJ&^b@0VJmkAoLDua7T)uq)z|?SEz?Scb zLz7Z8VgJ&JrTjC&{ildgF@DX9Jwb>+hLQUzO)q9=nDf3)-Ye{Q}%K zyUSwPxw$4SfPb3l@nq+=U-eD96jvZk&Tgf{7vugtrvD|RZ}ZjXsN zeTOpqY`m|PaWWP2MEH7>rp8_aMKtes;nrz`^*3QLtRbQ}HpYi|uKYC@lOKmB@O*MeM2r~bv{yzI~7Jboc0Z@9Sa zWmoK_y5aBsn{tk5?iSqNz1=g}YUg<;_Fc4VR@uVC&Iz8#TA;9X+&+P*Y5dXR2$0O+ z!KEg1O^U4c0TV&iO(#NLoT~7e=l=-mh`&Gz4LU&7b$p9ug)jRt10Raw0u<;#%=^n3?(S}2cTNRC!ZW}JC&sGkrX(*TKIVU<2B<(i3{vPmJhcA}>5 zr=^2zMd70t-hTB_guL3GwPRr^R0O|H#`Ks{9^JvC1OZ(EpT18fX_`9=q7(>=gai{4 z%CS{$Jj3aYF%r?wLo0&SkqiAOt*@u7ztPmEE{q&??nDu!crSI^Rd}oJw*NT~M7UgJ z4p%tgv;*zpT1v3*L<_j`TSIqrjsx&PcWJb|QpJTb;zmBA{FHa9G)?=Sc8vRiY2Q9} z#wl|c%BhQ;O!l`X@g&%t$vQT8gcWVz^t+6aWFvmW3JJO=mo3#s)29*{Pq-?ytWyb0 z&*mv~k$7F1X0khi3UO-zy(s29KT0a;v4hC8bzURmIJ$x5?-}%A-B|vdLk&3j+Pf?m z!A@1KI@3k-BIIbUi7W)XPIqf)Q|byH!)p|WlNRur?$?doHPE|3|*gWQ~w$nE1+J2&l^_k`?W#EA89jko$8qB@Xz;M}pO<)*wV!T;P zU~T`Ii-yE>RehnkH*Us|V~Wx=Faugt>7{#BJN;*gt>A9M;(hZAq4Yk!;Xt~k+b@h@ zP=d9{SAqIQ9e*sx|4M!Ovc$8cGBxKR z`f`EC+);4UP2Xi(guI54-$%l>yv**>yf7p!K+ZN;i?IYOf|6db=(ELBj6# zM$=hNiir^;#3WEE{w~MehdYS^YQ9`!b!Nn;4)n{Vo4% z`^RNNR66N%Azp;1385>SKgw1`Q6FK`kLrffwaV43XoBs`v3$YWg-Rlx6QegZ4_ZH_ z_mCNa60&lU6ujmlowyHI*Su0jp`vdfLiz**e^xY039A-DCp=`~->Qg>J?f#V5^5RF zqKD6M_d_5UQpI_3q+QK)CB1YxO}p|vL{vtlT2sm^r#w30pe-bPGGD9h^t5IYBI2Me z$!Y^Br#jvX4tdHJXlk{R3NQ{L*vC;=V2RJsX}KJbz;n7)T5D+39cj>M1M->Te3eIJ zFW8q1?<7-NsmNf=(QloCV<&3}5k-n>N--zeFS0yH^Ivlyk4SR}$8wyD#Whj3@&?^o z$9IuDa8hfmy$Q?I!HcJ?^EY6i4ysnw69@muL&3JPV*m2u-P0k9m1!C#DnU+HmgD5M zyzW&!UXch^c0E(WYB^O78fX+7?h2s?X|Df6JXsDA03!$)sY<6D=S$;FJ*PcO%N&kx zUnwgdsIf~)pXZID%WIVv^Jcm@QMPk}Jb9qb=e9O~CJGrpzN#39L;55Qy5sLxSTqLq zPWsu4XG6unE{d~^*=~9WkUOC!MTo!uWtq8^`_{4fz$ZaY?zit{B2!?b81E7DT!Jp&i;n;Hg|ld9KoRW)J-eea5nPzMjb z6KBBYPGIczn5n&=82ui-t zMZ=GsQfp_Fy#xxE?hjLFy}$ahxw+A9ptGc)1ZmPxEWbm<;Sey)+{HEVFI90QRJddY zNk(!hJ$5QV$2k5X5s6o5*tstSgjk*4eWm1#bi$9la;n$U(54Y--_`+g$uuNsCZ?xF zCEFb%Pk34zrYHt%U+;gB2)#;fNG9B_*1*y) z%)h;r(D|sanL0v3uqxDFfj*_FJs9-ePxLE8KgC*90%XL=H+qFt42ZLgeG~oyu zNLH%MVD`?i$Oqt)0l{26PQLY3f>xCwu(^t4ch_V)(paQ{2UKtoyWR2vmn?6Z;GQstby4!Yx{uHKLZqlo+_+MkdMcim_l>vD+wZf^pipf z)ASI_f-x1TByZ!%KZ@w4ZIdq884C6LKBP1w%9AkJ8g9`GDsGh9o_XCD_Sfaf z82BA~4_R*W)*|+#T45kuTqCy+RktLL6pS3XQ`U^Y@M+%Z;r1g?ln8xxGpKefJ8{v6a-vYq=h9%lmD-xuA06YgH{_d~v3tufdoqK8Rfsw)rH9^AKF zjG43@b3&mpS>XbGnPSVr3~XWmpXYmw`V2u%TG{p4cqU09o}$2TIIlP z72OS;tQ_Lxi%Ejv$tGNk#2pLpk)@)!6}C05`GUGCwPz% zir0fx-`SH$N1B&-(_D)oSrOtsxQ zy=qCyjrx&AN|s))w@1pW{*@afKW~8Vd8j>KGu^5Ro4c?P{gbHV$*EJ0hEw5_u-RLK zQTiv|gy2C556(FYpp@Z2)s#&elM8O8%+G5@OC;y|d8OPQOc6go5Qy(!f5>Y&o!7?Q z7NY3xW%ktdSAA8y^fO@btnQkkB$yx9z8W^#yTX@I$m$%|K||>plrAiVVWI3mhST`M z;?8;l{|DdJvQf=}?(Q0b1z8wU!Qzgj#yJ4tM$wa0gZ0i<%lc4d3reIAmh)^?? z;4p{?RC~>F1ohU$7nZ>~=}JFhiI$LcHQQlYzx+c8HBhOL!d}kQ3hTnu&EwLMB)TOZ zXV8f!=RROQo@@CwsiI^5p?dCI8NXovTU2Q54p26_pAO&3h;@Jmcg`J6_KwiWiyg3H z=G3+KPNZwU%cy0Z|gc4LAW#~`1B4)esD1sE1Roj*%eu;uH>HR~cpI_D<8=Pe4 z9Ws1DI4bF+&okK!_~JiIh*pVxQ3TC+!98r<#V9@guG4!*5;I{LHFhiQbIm=;WR;|O z0Hx1w!&0MJ|L$Y2{<<`g7X`y1RuVX$dV095oZ5P6GmQY6^4;3NR2{x`v;M_AZvY_c zH#T=ERtAm>s3#^Nz>#q zQk(z0zrY($_ZQEoH7fwg`xgj<)%BT{N`HQM@eo30<#U2>O!BVquvTcc`k3=wlSKxuef`PGW=RX>Bk9RFp zX8s7eF)L-Z3C-aE(oIVIY`3F!Wa zm#k^CIfvHQ>Q<{+f7$DbEszvl&GfpfffV*}Yd>0?WB{I16`!v{zAjJlZjB6;{BRUw zpy`2yJx$VVK6Oy+$^uF4!zcA|Pp;)ABZ(Ck$+<9|vwE6Bp4>{Coi9))DIDy-2o$ z#|erw7O2?sYa}axJg@}-I4mbJNM>tK&Q8z z9HRmZrT8qN&fCfgpE?UmsiknV^H36^$rps#n`!n6U%@qOzsqTE8n-)12FV2%i9*P^ zk>%KHXCh_}u-dX`B5=igbz{wrlW>$gxfIgg)#~6lJWG3p$VgMxtF}WRAUAA%n4bLz5%HI>}2)IVFCMn2~CvM3tm>cRv^NDfCQdhep}sNb{Jm*H0o6>kugD zVR$(+E??rKyVrk$r5LBV-7jUIw2AAm5EK~DGtwgVzQM(%C8Jn&h(;LZq}(A2D6gV| zb*m;dm1>HzqU}pF$FoP-#pJPIOZ4hT;T*JN#1FQ^NoQ4)z=9HVx*8%zp?k+V^~Rg$ zb{mpFM+B6PSZy%RvS=gTRot84VYWp~Mvb{`rgjW%o{EdSw?2&797Vxh{mSgRz>3D# zw^YwFQ7+rY1CRG=4z{gj18I$^xmJ&TmY$USL#W^O$X4)miSNwXd4DzF!0NTEGQQVS z>JoZEeQ~;`uj8J8E+~sOTj$dkYVJMmCX)+R;+ao`p^5hH&1EN=?A;IOA5+5U>oLjS zHIt65BO$bkSYF8q21K1u4Lsyb%UdwS)kO7zg>pl@e%(GV_i z0u@Jg&4}vMBE;n>mzcW1go>(Ad9M?Rf9~~n&a>ur=V|^rgU8tNmJ~k+E*}?w0qHYaZHG!YD5+s8Tln7hTF|(5jfaxE=f4|ew=3`d($sY2ic?nQ$(cI~tZ4Vtnck@>f z9`<#hhRf$FYb^0!H9Z~w;OiHH>|epbhAZY2@jBTQJqR@5_%==mg0MaW6WVdRX*Xh%3nWFgQcy7() zgkr@?at>^w{7zLuV^(cJ=!3I(exRJ59}bd8lZ&b%Jp+r#?6z)ONGqF<_1S7o4Nj2G zq4E?Ola#r&4q85L*h}oh_mv& z4D2FD`z;=211qa3L~nmtui3O6NoEM7VLw^!ELLhH6-x5@LFGG@@@k2Ep`REUcB-eegpj~f%5p|5%QFUrecGXE z?_4s$w+z6FcWmFPoZHWoWjgx8u{Iuq5U>lTu0#A>73WK=Ace}^;grovROHA=v16iC zrPa!nGCB5Ig4|A-#&IRyLu$*Dpq}lD+~z}^i<26K3j485e78iy30a|d2aV~07ZOir zdpmIPk1Fn-*F(bkXF8JM_>J2zf?y4q@fQ8G`mHB9l8U5Q`YL#$7*^nDRXoup>dV=b zV#^8PY(d{unWvjithtHV9B2*-+Ex=10x?8 z`M}5rzxBY#2Sz?H@_~^Le(Qme4~%?ZPx)JxN4CRA@u(Sx;yjRT%%iw|i(p4+=ti&_uCQrnfHks_*+BmjU4n zpxtiQCnqP*0KlBRkOl7oz$q!^Z)GlxX|>k(1HkJsPy72)7>38&?e>NXPbUD2i;KI* z$H&hCz>8M+>roWVwpy+4TrMf1>2x|%wOZ{gBJQ)apRBL1&(6=!-z+*?2*7IoLM%K0 zI5RK0Jo$fGNqkQjhDVAlQ3yb5{XxRSD`6PU7BMX&c#_sCi!D7JyOWgiSRTJz035K0 zxDuPyMI%*(kI$toPDImrfjtlar%EFFnX?TMUGMdJkGlBeumJcxyVKa%*bf{NoShKy zp+PA&4?y2_I88=TbYN5g>k5zqyI!w_l=8?K@dDiM9nY^TX_kg+wJZXLj1(V z4iVq-Jns!B07|LfZEv$8rJO0KteRU2BDyJrc)kb(3vZ0Mh={uZAdphZ0{-VYD{=4S z`~H1}0JPRq0MPfnD2fg?o6U=P7c4I?KZS^2us}s1lEO1B5glwa8kh6nS7PoBn$+84r7W=%b+oY8iXCorI z>ihm9xd61*f7+K+TS|G-)dDeH8U+6y$A^p0XWgf@eiH!NS%I7t17x*!tkG!jL!5%K3VXmZu?AiDHeC5ob%X0sWOcD5Ybc7v^niHY-wc-Tr>*wPmQxLu<~ zB3fNrTbn7G0u};bO=Jys0pRGU0-FOC0M5n3T^7FA>q(bEniBv9kshzdCPu_}J#^312>q+4_u!Rt3(hCk=7ZK5yMMD7YZ4mKUUQ4AH9LAXAc>$ZH zBxegG58D+JKl6CmF>u91MEyw`BJ!kfd#spJK=vZyyfMbBvg8v&1Vpr$H8ON{$x0T; zVs5+Gr+JBIjLBTH3L&oX5)c5sN)M=91y0kA3_w)@hCO!&z_1z|_WX{wz<-&%%3hFo RMRWiF002ovPDHLkV1miPf^+}? literal 0 HcmV?d00001 diff --git a/static/login.png b/static/login.png new file mode 100644 index 0000000000000000000000000000000000000000..2a65311f698094f113f9edd783e956bdb299df07 GIT binary patch literal 14226 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 literal 0 HcmV?d00001 diff --git a/static/search.png b/static/search.png new file mode 100644 index 0000000000000000000000000000000000000000..50c8bb84b9da71fdaf40424494eb70d42d7800dc GIT binary patch literal 1454 zcmV;f1yTBmP)Px)Xh}ptR9HvNnR%#`WfaDLPn%`gVzk;W)gSGpv`Eor1!iG{P!_aNm@NdAwis<@ zE0vKZ6%|Do?HNS7t+weO?F(%b)@{K=&1^gIOy|4IojY^qyLIP|2ZpQPyzl!x@7d2Y zqNGH`s=xujp}_9IR=|3|I>1-J*T65pv%nLQzA1ThWto~Sj))C`Nx&((*trYwN!brE4x z-U=L_&nHW|vff!;fJDUlz{>)@l$5WGwIi@TR1_3Lp-plYna^IhD6uGD4lB)&Pb$ zFl?Hafqm0SU9kE^B4S<^&k>SdH;^wgi*6_BvwlJGZ=^ci9}XNNX_kR316BtHO7g$^ zMIz!};5guPNiz&&aTca_0hu6a`U+(lXHj=v&Zup5Ru`gE+Yr7#+Apia_bA}uHYK#T zB<)$9;*HMDar;tyrrh=yy*h2cNJ(xLTOw6$z*I>Wc4-3=O#2(71mf|*O|o0Xce6|D z|5h=SY?b509AHbJug8fCBwbz4`N|Af-skD=a!D@TO(mzqvjF>DG4XldV_9u~ zt39Nrk<)o)Vt#y>d(8I})blxbFO$>}5!RkR+vkw(LA?Or2(%VlZ9PZ3O&nWW>B|h^ z9zT7v|22e1#8BWBV3VAmJc9n(Eqt5lJ86j#z~~$YJb1g+^DW(p7qo;U?{P`r)}EPT zi@^-Z2pv;^X{wQC0DJp=27}wv%>kSENJ&fk9Z04L&(MTptme15#JoImyfmgbCHWLSskpK0^z47wZO3DSd` z_f$mEl18R&l;VA;#|*#RERPACYcq4Y&-BNn-P)2CN5o*Dlk4cgj|Ma%f9i2)=1Oh? zOix%V=D?-_=cH!Lp*#)TQ3b?oqAPbHI{`Q6`p)cW?MnKtRMCrwje)b1*1RhVmFvWP zN$%Qgo(RVo2w-*FJl4ox`4VT_>i_$(wRVdnQ>NXdjA>l_Oj}F`Okr4DMK7)a;)3^u zUzUZ>)4_7r7D;m=!o|B?UuNtCD&?;=(oyaI(1@uz60*jcy~or@{zIDxO!qjtH|r=2WeXhk#1~_a&~l z#~O6$sEG)t-jNx8jvCKAk0vnR&az9TK1g=l0>s#;1ls^!xndaLRxE(lClBx9G z`-r5u3C=vciGJVI{xVTg0nFMsD2ZY_?&rX3S=3C2nY?rRFhf$|&|SdPGmW45r;ml1 zM|@Lk07*qo IM6N<$g5ndm;s5{u literal 0 HcmV?d00001 diff --git a/store/index.js b/store/index.js new file mode 100644 index 0000000..de330ce --- /dev/null +++ b/store/index.js @@ -0,0 +1,39 @@ +import Vue from "vue"; +import Vuex from "vuex"; +import tabBar from "../untils/tabBar.js"; + +Vue.use(Vuex); + +let type = "user_supervisors"; // uni.getStorageSync('sale-user-info').isLeader ? 'user_supervisors' : 'user_staff' + +const store = new Vuex.Store({ + state: { + list: tabBar[type], + doingTotal: 0, // 待办事项总数 + }, + //对数据的处理 + getters: { + tabBarList: (state) => state.list, + doingTotal: (state) => state.doingTotal, + }, + mutations: { + //放置mutations方法 + leaderType(state, payload) { + let type = payload ? "user_supervisors" : "user_staff"; + state.list = tabBar[type].map((item) => { + // if (item.text == "审批") { + // item.badge = "4"; + // } else { + // item.badge = null; + // } + return item; + }); + }, + // 获取待办事项总数 + getDoingTotal(state, doingTotal) { + state.doingTotal = doingTotal; + }, + }, +}); + +export default store; diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..1c39e72 --- /dev/null +++ b/uni.scss @@ -0,0 +1,76 @@ +/** + * 这里是uni-app内置的常用样式变量 + * + * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 + * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App + * + */ + +/** + * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 + * + * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 + */ +@import 'uview-ui/theme.scss'; +/* 颜色变量 */ + +/* 行为相关颜色 */ +$uni-color-primary: #007aff; +$uni-color-success: #4cd964; +$uni-color-warning: #f0ad4e; +$uni-color-error: #dd524d; + +/* 文字基本颜色 */ +$uni-text-color:#333;//基本色 +$uni-text-color-inverse:#fff;//反色 +$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 +$uni-text-color-placeholder: #808080; +$uni-text-color-disable:#c0c0c0; + +/* 背景颜色 */ +$uni-bg-color:#ffffff; +$uni-bg-color-grey:#f8f8f8; +$uni-bg-color-hover:#f1f1f1;//点击状态颜色 +$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 + +/* 边框颜色 */ +$uni-border-color:#c8c7cc; + +/* 尺寸变量 */ + +/* 文字尺寸 */ +$uni-font-size-sm:12px; +$uni-font-size-base:14px; +$uni-font-size-lg:16; + +/* 图片尺寸 */ +$uni-img-size-sm:20px; +$uni-img-size-base:26px; +$uni-img-size-lg:40px; + +/* Border Radius */ +$uni-border-radius-sm: 2px; +$uni-border-radius-base: 3px; +$uni-border-radius-lg: 6px; +$uni-border-radius-circle: 50%; + +/* 水平间距 */ +$uni-spacing-row-sm: 5px; +$uni-spacing-row-base: 10px; +$uni-spacing-row-lg: 15px; + +/* 垂直间距 */ +$uni-spacing-col-sm: 4px; +$uni-spacing-col-base: 8px; +$uni-spacing-col-lg: 12px; + +/* 透明度 */ +$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 + +/* 文章场景相关 */ +$uni-color-title: #2C405A; // 文章标题颜色 +$uni-font-size-title:20px; +$uni-color-subtitle: #555555; // 二级标题颜色 +$uni-font-size-subtitle:26px; +$uni-color-paragraph: #3F536E; // 文章段落颜色 +$uni-font-size-paragraph:15px; diff --git a/uni_modules/superwei-combox/changelog.md b/uni_modules/superwei-combox/changelog.md new file mode 100644 index 0000000..5ba0d60 --- /dev/null +++ b/uni_modules/superwei-combox/changelog.md @@ -0,0 +1,22 @@ +## 1.0.10(2022-10-19) +- 修改文档,更改为不兼容小程序(存在下拉框滑动会自动关闭的问题,后期改进后再兼容,若各位有好的解决方法的话欢迎评论) +## 1.0.9(2022-07-28) +- 完善是否创建新条目功能,并将默认值改为允许 +## 1.0.8(2022-07-26) +- 新增禁用选项和是否创建新条目功能,新增disabledColor和isAllowCreate属性 +## 1.0.7(2022-05-05) +- 解决传入JSON数组后,在模糊匹配项中进行选择,@select事件返回值为undefined且报错的问题 +## 1.0.6(2022-03-24) +- 新增@select事件 +## 1.0.5(2022-03-22) +- 修改文档 +## 1.0.4(2022-03-18) +- 新增isJSON和keyName属性,candidates支持JSON数组格式 +## 1.0.3(2022-03-01) +- 调整为uni_modules目录规范 +## 1.0.2(2022-03-01) +- 基于官方uni-combox组件,解决选择后再次选择不展示全部选项的问题,同时新增选中项默认的文字和背景颜色,也可自定义进行样式覆盖 +## 1.0.1(2022-03-01) +- 无 +## 1.0.0(2022-03-01) +- 无 \ No newline at end of file diff --git a/uni_modules/superwei-combox/components/superwei-combox/superwei-combox.vue b/uni_modules/superwei-combox/components/superwei-combox/superwei-combox.vue new file mode 100644 index 0000000..cf722bd --- /dev/null +++ b/uni_modules/superwei-combox/components/superwei-combox/superwei-combox.vue @@ -0,0 +1,381 @@ + + + + + diff --git a/uni_modules/superwei-combox/package.json b/uni_modules/superwei-combox/package.json new file mode 100644 index 0000000..6dde65e --- /dev/null +++ b/uni_modules/superwei-combox/package.json @@ -0,0 +1,89 @@ +{ + "id": "superwei-combox", + "displayName": "superwei-combox 组合框", + "version": "1.0.10", + "description": "下拉搜索选择组合框,基于官方uni-combox组件,解决选择后再次选择不展示全部选项的问题,支持模糊搜索和JSON数组格式,可设置选中项文字和背景颜色(若使用请一定下载uni_modules版本)", + "keywords": [ + "combox", + "组合框", + "select", + "下拉选择", + "搜索选择" +], + "repository": "", +"engines": { + }, + "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": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "u", + "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" + }, + "小程序": { + "微信": "u", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/superwei-combox/readme.md b/uni_modules/superwei-combox/readme.md new file mode 100644 index 0000000..c0ad179 --- /dev/null +++ b/uni_modules/superwei-combox/readme.md @@ -0,0 +1,104 @@ +## 基本用法 +在 ``template`` 中使用组件 +```html + + + + + +``` + +## API + +### Combox Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|label |String |- |标签文字 | +|value |String |- |combox的值 | +|labelWidth |String |auto |标签宽度,有单位字符串,如:'100px' | +|placeholder|String |- |输入框占位符 | +|candidates |Array/String |[] |候选字段 | +|emptyTips |String |无匹配项 |无匹配项时的提示语 | +|selectedBackground |String |#f5f7fa |选中项背景颜色 | +|selectedColor |String |#409eff |选中项文字颜色 | +|isJSON |Boolean |false |候选字段是否是json数组 | +|keyName |String |- |json数组显示的字段值 | +|disabledColor |String |#ababac |禁用项文字颜色 | +|isAllowCreate |Boolean |true |是否允许用户创建新条目 | + +### Combox Events + +|事件称名 |说明 |返回值 | +|:-: |:-: |:-: | +|@input |combox输入事件 |返回combox输入值| +|@select|combox选择事件 |返回combox选项值| diff --git a/uni_modules/uni-combox/changelog.md b/uni_modules/uni-combox/changelog.md new file mode 100644 index 0000000..23c2748 --- /dev/null +++ b/uni_modules/uni-combox/changelog.md @@ -0,0 +1,15 @@ +## 1.0.1(2021-11-23) +- 优化 label、label-width 属性 +## 1.0.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-combox](https://uniapp.dcloud.io/component/uniui/uni-combox) +## 0.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.0.6(2021-05-12) +- 新增 组件示例地址 +## 0.0.5(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 0.0.4(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 0.0.3(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-combox/components/uni-combox/uni-combox.vue b/uni_modules/uni-combox/components/uni-combox/uni-combox.vue new file mode 100644 index 0000000..d4cb79d --- /dev/null +++ b/uni_modules/uni-combox/components/uni-combox/uni-combox.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/uni_modules/uni-combox/package.json b/uni_modules/uni-combox/package.json new file mode 100644 index 0000000..4a05c3f --- /dev/null +++ b/uni_modules/uni-combox/package.json @@ -0,0 +1,90 @@ +{ + "id": "uni-combox", + "displayName": "uni-combox 组合框", + "version": "1.0.1", + "description": "可以选择也可以输入的表单项 ", + "keywords": [ + "uni-ui", + "uniui", + "combox", + "组合框", + "select" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-combox/readme.md b/uni_modules/uni-combox/readme.md new file mode 100644 index 0000000..ffa2cc8 --- /dev/null +++ b/uni_modules/uni-combox/readme.md @@ -0,0 +1,11 @@ + + +## Combox 组合框 +> **组件名:uni-combox** +> 代码块: `uCombox` + + +组合框组件。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-combox) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/changelog.md b/uni_modules/uni-datetime-picker/changelog.md new file mode 100644 index 0000000..9f09862 --- /dev/null +++ b/uni_modules/uni-datetime-picker/changelog.md @@ -0,0 +1,103 @@ +## 2.2.11(2022-09-19) +- 修复,支付宝小程序样式错乱,[详情](https://github.com/dcloudio/uni-app/issues/3861) +## 2.2.10(2022-09-19) +- 修复,反向选择日期范围,日期显示异常,[详情](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?item_id=209458&rf=false](https://ask.dcloud.net.cn/question/140824?item_id=209458&rf=false) +## 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/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-datetime-picker](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker) +## 2.1.5(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 2.1.4(2021-09-10) +- 修复 hide-second 在移动端的 bug +- 修复 单选赋默认值时,赋值日期未高亮的 bug +- 修复 赋默认值时,移动端未正确显示时间的 bug +## 2.1.3(2021-09-09) +- 新增 hide-second 属性,支持只使用时分,隐藏秒 +## 2.1.2(2021-09-03) +- 优化 取消选中时(范围选)直接开始下一次选择, 避免多点一次 +- 优化 移动端支持清除按钮,同时支持通过 ref 调用组件的 clear 方法 +- 优化 调整字号大小,美化日历界面 +- 修复 因国际化导致的 placeholder 失效的 bug +## 2.1.1(2021-08-24) +- 新增 支持国际化 +- 优化 范围选择器在 pc 端过宽的问题 +## 2.1.0(2021-08-09) +- 新增 适配 vue3 +## 2.0.19(2021-08-09) +- 新增 支持作为 uni-forms 子组件相关功能 +- 修复 在 uni-forms 中使用时,选择时间报 NAN 错误的 bug +## 2.0.18(2021-08-05) +- 修复 type 属性动态赋值无效的 bug +- 修复 ‘确认’按钮被 tabbar 遮盖 bug +- 修复 组件未赋值时范围选左、右日历相同的 bug +## 2.0.17(2021-08-04) +- 修复 范围选未正确显示当前值的 bug +- 修复 h5 平台(移动端)报错 'cale' of undefined 的 bug +## 2.0.16(2021-07-21) +- 新增 return-type 属性支持返回 date 日期对象 +## 2.0.15(2021-07-14) +- 修复 单选日期类型,初始赋值后不在当前日历的 bug +- 新增 clearIcon 属性,显示框的清空按钮可配置显示隐藏(仅 pc 有效) +- 优化 移动端移除显示框的清空按钮,无实际用途 +## 2.0.14(2021-07-14) +- 修复 组件赋值为空,界面未更新的 bug +- 修复 start 和 end 不能动态赋值的 bug +- 修复 范围选类型,用户选择后再次选择右侧日历(结束日期)显示不正确的 bug +## 2.0.13(2021-07-08) +- 修复 范围选择不能动态赋值的 bug +## 2.0.12(2021-07-08) +- 修复 范围选择的初始时间在一个月内时,造成无法选择的bug +## 2.0.11(2021-07-08) +- 优化 弹出层在超出视窗边缘定位不准确的问题 +## 2.0.10(2021-07-08) +- 修复 范围起始点样式的背景色与今日样式的字体前景色融合,导致日期字体看不清的 bug +- 优化 弹出层在超出视窗边缘被遮盖的问题 +## 2.0.9(2021-07-07) +- 新增 maskClick 事件 +- 修复 特殊情况日历 rpx 布局错误的 bug,rpx -> px +- 修复 范围选择时清空返回值不合理的bug,['', ''] -> [] +## 2.0.8(2021-07-07) +- 新增 日期时间显示框支持插槽 +## 2.0.7(2021-07-01) +- 优化 添加 uni-icons 依赖 +## 2.0.6(2021-05-22) +- 修复 图标在小程序上不显示的 bug +- 优化 重命名引用组件,避免潜在组件命名冲突 +## 2.0.5(2021-05-20) +- 优化 代码目录扁平化 +## 2.0.4(2021-05-12) +- 新增 组件示例地址 +## 2.0.3(2021-05-10) +- 修复 ios 下不识别 '-' 日期格式的 bug +- 优化 pc 下弹出层添加边框和阴影 +## 2.0.2(2021-05-08) +- 修复 在 admin 中获取弹出层定位错误的bug +## 2.0.1(2021-05-08) +- 修复 type 属性向下兼容,默认值从 date 变更为 datetime +## 2.0.0(2021-04-30) +- 支持日历形式的日期+时间的范围选择 + > 注意:此版本不向后兼容,不再支持单独时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker) +## 1.0.6(2021-03-18) +- 新增 hide-second 属性,时间支持仅选择时、分 +- 修复 选择跟显示的日期不一样的 bug +- 修复 chang事件触发2次的 bug +- 修复 分、秒 end 范围错误的 bug +- 优化 更好的 nvue 适配 diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue new file mode 100644 index 0000000..a2201d3 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue new file mode 100644 index 0000000..b376470 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue @@ -0,0 +1,924 @@ + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json new file mode 100644 index 0000000..9acf1ab --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json @@ -0,0 +1,22 @@ +{ + "uni-datetime-picker.selectDate": "select date", + "uni-datetime-picker.selectTime": "select time", + "uni-datetime-picker.selectDateTime": "select datetime", + "uni-datetime-picker.startDate": "start date", + "uni-datetime-picker.endDate": "end date", + "uni-datetime-picker.startTime": "start time", + "uni-datetime-picker.endTime": "end time", + "uni-datetime-picker.ok": "ok", + "uni-datetime-picker.clear": "clear", + "uni-datetime-picker.cancel": "cancel", + "uni-datetime-picker.year": "-", + "uni-datetime-picker.month": "", + "uni-calender.MON": "MON", + "uni-calender.TUE": "TUE", + "uni-calender.WED": "WED", + "uni-calender.THU": "THU", + "uni-calender.FRI": "FRI", + "uni-calender.SAT": "SAT", + "uni-calender.SUN": "SUN", + "uni-calender.confirm": "confirm" +} diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json new file mode 100644 index 0000000..d2df5e7 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json @@ -0,0 +1,22 @@ +{ + "uni-datetime-picker.selectDate": "选择日期", + "uni-datetime-picker.selectTime": "选择时间", + "uni-datetime-picker.selectDateTime": "选择日期时间", + "uni-datetime-picker.startDate": "开始日期", + "uni-datetime-picker.endDate": "结束日期", + "uni-datetime-picker.startTime": "开始时间", + "uni-datetime-picker.endTime": "结束时间", + "uni-datetime-picker.ok": "确定", + "uni-datetime-picker.clear": "清除", + "uni-datetime-picker.cancel": "取消", + "uni-datetime-picker.year": "年", + "uni-datetime-picker.month": "月", + "uni-calender.SUN": "日", + "uni-calender.MON": "一", + "uni-calender.TUE": "二", + "uni-calender.WED": "三", + "uni-calender.THU": "四", + "uni-calender.FRI": "五", + "uni-calender.SAT": "六", + "uni-calender.confirm": "确认" +} \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json new file mode 100644 index 0000000..d23fa3c --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json @@ -0,0 +1,22 @@ +{ + "uni-datetime-picker.selectDate": "選擇日期", + "uni-datetime-picker.selectTime": "選擇時間", + "uni-datetime-picker.selectDateTime": "選擇日期時間", + "uni-datetime-picker.startDate": "開始日期", + "uni-datetime-picker.endDate": "結束日期", + "uni-datetime-picker.startTime": "開始时间", + "uni-datetime-picker.endTime": "結束时间", + "uni-datetime-picker.ok": "確定", + "uni-datetime-picker.clear": "清除", + "uni-datetime-picker.cancel": "取消", + "uni-datetime-picker.year": "年", + "uni-datetime-picker.month": "月", + "uni-calender.SUN": "日", + "uni-calender.MON": "一", + "uni-calender.TUE": "二", + "uni-calender.WED": "三", + "uni-calender.THU": "四", + "uni-calender.FRI": "五", + "uni-calender.SAT": "六", + "uni-calender.confirm": "確認" +} \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js new file mode 100644 index 0000000..9601aba --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-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 \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue new file mode 100644 index 0000000..36ba21c --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue @@ -0,0 +1,930 @@ + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue new file mode 100644 index 0000000..b9297ed --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue @@ -0,0 +1,1015 @@ + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js new file mode 100644 index 0000000..efa5773 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js @@ -0,0 +1,410 @@ +class Calendar { + constructor({ + date, + selected, + startDate, + endDate, + range, + // multipleStatus + } = {}) { + // 当前日期 + 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) + // this.multipleStatus = multipleStatus + this.lastHover = false + } + /** + * 设置日期 + * @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) { + dd.setDate(dd.getDate() + AddDayCount) + } else { + dd.setMonth(dd.getMonth() + AddDayCount) // 获取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, + disable: true + }) + } + return dateArr + } + /** + * 获取本月天数 + */ + _currentMonthDys(dateData, full) { + let dateArr = [] + let fullDate = this.date.fullDate + for (let i = 1; i <= dateData; i++) { + let isinfo = false + 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.isLogicBefore(nowDate, this.multipleStatus.before, this.multipleStatus.after), + afterMultiple: this.isLogicAfter(nowDate, this.multipleStatus.before, this.multipleStatus.after), + month: full.month, + disable: !(disableBefore && disableAfter), + isDay, + userChecked: false + } + 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, + 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 + } + } + + /** + * 比较真实起始日期 + */ + + isLogicBefore(currentDay, before, after) { + let logicBefore = before + if (before && after) { + logicBefore = this.dateCompare(before, after) ? before : after + } + return this.dateEqual(logicBefore, currentDay) + } + + isLogicAfter(currentDay, before, after) { + let logicAfter = after + if (before && after) { + logicAfter = this.dateCompare(before, after) ? after : before + } + return this.dateEqual(logicAfter, currentDay) + } + + /** + * 获取日期范围内所有日期 + * @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 + } + + /** + * 获取多选状态 + */ + setMultiple(fullDate) { + let { + before, + after + } = this.multipleStatus + if (!this.range) return + 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.lastHover = false + } 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.lastHover = true + } + } + this._getWeek(fullDate) + } + + /** + * 鼠标 hover 更新多选状态 + */ + setHoverMultiple(fullDate) { + let { + before, + after + } = this.multipleStatus + + if (!this.range) return + if (this.lastHover) return + + 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) + } + + /** + * 更新默认值多选状态 + */ + setDefaultMultiple(before, after) { + this.multipleStatus.before = before + this.multipleStatus.after = after + if (before && after) { + if (this.dateCompare(before, after)) { + this.multipleStatus.data = this.geDateAll(before, after); + this._getWeek(after) + } else { + this.multipleStatus.data = this.geDateAll(after, before); + this._getWeek(before) + } + } + } + + /** + * 获取每周数据 + * @param {Object} dateData + */ + _getWeek(dateData) { + const { + fullDate, + year, + month, + date, + day + } = this.getDate(dateData) + let firstDay = new Date(year, month - 1, 1).getDay() + let currentDay = new Date(year, month, 0).getDate() + let dates = { + lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天 + currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数 + nextMonthDays: [], // 下个月开始几天 + weeks: [] + } + let canlender = [] + const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length) + dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData)) + canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays) + let weeks = {} + // 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天 + for (let i = 0; i < canlender.length; i++) { + if (i % 7 === 0) { + weeks[parseInt(i / 7)] = new Array(7) + } + weeks[parseInt(i / 7)][i % 7] = canlender[i] + } + this.canlender = canlender + this.weeks = weeks + } + + //静态方法 + // static init(date) { + // if (!this.instance) { + // this.instance = new Calendar(date); + // } + // return this.instance; + // } +} + + +export default Calendar diff --git a/uni_modules/uni-datetime-picker/package.json b/uni_modules/uni-datetime-picker/package.json new file mode 100644 index 0000000..f7a2e6a --- /dev/null +++ b/uni_modules/uni-datetime-picker/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-datetime-picker", + "displayName": "uni-datetime-picker 日期选择器", + "version": "2.2.11", + "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" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-datetime-picker/readme.md b/uni_modules/uni-datetime-picker/readme.md new file mode 100644 index 0000000..162fbef --- /dev/null +++ b/uni_modules/uni-datetime-picker/readme.md @@ -0,0 +1,21 @@ + + +> `重要通知:组件升级更新 2.0.0 后,支持日期+时间范围选择,组件 ui 将使用日历选择日期,ui 变化较大,同时支持 PC 和 移动端。此版本不向后兼容,不再支持单独的时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker)。若仍需使用旧版本,可在插件市场下载*非uni_modules版本*,旧版本将不再维护` + +## DatetimePicker 时间选择器 + +> **组件名:uni-datetime-picker** +> 代码块: `uDatetimePicker` + + +该组件的优势是,支持**时间戳**输入和输出(起始时间、终止时间也支持时间戳),可**同时选择**日期和时间。 + +若只是需要单独选择日期和时间,不需要时间戳输入和输出,可使用原生的 picker 组件。 + +**_点击 picker 默认值规则:_** + +- 若设置初始值 value, 会显示在 picker 显示框中 +- 若无初始值 value,则初始值 value 为当前本地时间 Date.now(), 但不会显示在 picker 显示框中 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-icons/changelog.md b/uni_modules/uni-icons/changelog.md new file mode 100644 index 0000000..6449885 --- /dev/null +++ b/uni_modules/uni-icons/changelog.md @@ -0,0 +1,22 @@ +## 1.3.5(2022-01-24) +- 优化 size 属性可以传入不带单位的字符串数值 +## 1.3.4(2022-01-24) +- 优化 size 支持其他单位 +## 1.3.3(2022-01-17) +- 修复 nvue 有些图标不显示的bug,兼容老版本图标 +## 1.3.2(2021-12-01) +- 优化 示例可复制图标名称 +## 1.3.1(2021-11-23) +- 优化 兼容旧组件 type 值 +## 1.3.0(2021-11-19) +- 新增 更多图标 +- 优化 自定义图标使用方式 +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-icons](https://uniapp.dcloud.io/component/uniui/uni-icons) +## 1.1.7(2021-11-08) +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.5(2021-05-12) +- 新增 组件示例地址 +## 1.1.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-icons/components/uni-icons/icons.js b/uni_modules/uni-icons/components/uni-icons/icons.js new file mode 100644 index 0000000..7889936 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/icons.js @@ -0,0 +1,1169 @@ +export default { + "id": "2852637", + "name": "uniui图标库", + "font_family": "uniicons", + "css_prefix_text": "uniui-", + "description": "", + "glyphs": [ + { + "icon_id": "25027049", + "name": "yanse", + "font_class": "color", + "unicode": "e6cf", + "unicode_decimal": 59087 + }, + { + "icon_id": "25027048", + "name": "wallet", + "font_class": "wallet", + "unicode": "e6b1", + "unicode_decimal": 59057 + }, + { + "icon_id": "25015720", + "name": "settings-filled", + "font_class": "settings-filled", + "unicode": "e6ce", + "unicode_decimal": 59086 + }, + { + "icon_id": "25015434", + "name": "shimingrenzheng-filled", + "font_class": "auth-filled", + "unicode": "e6cc", + "unicode_decimal": 59084 + }, + { + "icon_id": "24934246", + "name": "shop-filled", + "font_class": "shop-filled", + "unicode": "e6cd", + "unicode_decimal": 59085 + }, + { + "icon_id": "24934159", + "name": "staff-filled-01", + "font_class": "staff-filled", + "unicode": "e6cb", + "unicode_decimal": 59083 + }, + { + "icon_id": "24932461", + "name": "VIP-filled", + "font_class": "vip-filled", + "unicode": "e6c6", + "unicode_decimal": 59078 + }, + { + "icon_id": "24932462", + "name": "plus_circle_fill", + "font_class": "plus-filled", + "unicode": "e6c7", + "unicode_decimal": 59079 + }, + { + "icon_id": "24932463", + "name": "folder_add-filled", + "font_class": "folder-add-filled", + "unicode": "e6c8", + "unicode_decimal": 59080 + }, + { + "icon_id": "24932464", + "name": "yanse-filled", + "font_class": "color-filled", + "unicode": "e6c9", + "unicode_decimal": 59081 + }, + { + "icon_id": "24932465", + "name": "tune-filled", + "font_class": "tune-filled", + "unicode": "e6ca", + "unicode_decimal": 59082 + }, + { + "icon_id": "24932455", + "name": "a-rilidaka-filled", + "font_class": "calendar-filled", + "unicode": "e6c0", + "unicode_decimal": 59072 + }, + { + "icon_id": "24932456", + "name": "notification-filled", + "font_class": "notification-filled", + "unicode": "e6c1", + "unicode_decimal": 59073 + }, + { + "icon_id": "24932457", + "name": "wallet-filled", + "font_class": "wallet-filled", + "unicode": "e6c2", + "unicode_decimal": 59074 + }, + { + "icon_id": "24932458", + "name": "paihangbang-filled", + "font_class": "medal-filled", + "unicode": "e6c3", + "unicode_decimal": 59075 + }, + { + "icon_id": "24932459", + "name": "gift-filled", + "font_class": "gift-filled", + "unicode": "e6c4", + "unicode_decimal": 59076 + }, + { + "icon_id": "24932460", + "name": "fire-filled", + "font_class": "fire-filled", + "unicode": "e6c5", + "unicode_decimal": 59077 + }, + { + "icon_id": "24928001", + "name": "refreshempty", + "font_class": "refreshempty", + "unicode": "e6bf", + "unicode_decimal": 59071 + }, + { + "icon_id": "24926853", + "name": "location-ellipse", + "font_class": "location-filled", + "unicode": "e6af", + "unicode_decimal": 59055 + }, + { + "icon_id": "24926735", + "name": "person-filled", + "font_class": "person-filled", + "unicode": "e69d", + "unicode_decimal": 59037 + }, + { + "icon_id": "24926703", + "name": "personadd-filled", + "font_class": "personadd-filled", + "unicode": "e698", + "unicode_decimal": 59032 + }, + { + "icon_id": "24923351", + "name": "back", + "font_class": "back", + "unicode": "e6b9", + "unicode_decimal": 59065 + }, + { + "icon_id": "24923352", + "name": "forward", + "font_class": "forward", + "unicode": "e6ba", + "unicode_decimal": 59066 + }, + { + "icon_id": "24923353", + "name": "arrowthinright", + "font_class": "arrow-right", + "unicode": "e6bb", + "unicode_decimal": 59067 + }, + { + "icon_id": "24923353", + "name": "arrowthinright", + "font_class": "arrowthinright", + "unicode": "e6bb", + "unicode_decimal": 59067 + }, + { + "icon_id": "24923354", + "name": "arrowthinleft", + "font_class": "arrow-left", + "unicode": "e6bc", + "unicode_decimal": 59068 + }, + { + "icon_id": "24923354", + "name": "arrowthinleft", + "font_class": "arrowthinleft", + "unicode": "e6bc", + "unicode_decimal": 59068 + }, + { + "icon_id": "24923355", + "name": "arrowthinup", + "font_class": "arrow-up", + "unicode": "e6bd", + "unicode_decimal": 59069 + }, + { + "icon_id": "24923355", + "name": "arrowthinup", + "font_class": "arrowthinup", + "unicode": "e6bd", + "unicode_decimal": 59069 + }, + { + "icon_id": "24923356", + "name": "arrowthindown", + "font_class": "arrow-down", + "unicode": "e6be", + "unicode_decimal": 59070 + },{ + "icon_id": "24923356", + "name": "arrowthindown", + "font_class": "arrowthindown", + "unicode": "e6be", + "unicode_decimal": 59070 + }, + { + "icon_id": "24923349", + "name": "arrowdown", + "font_class": "bottom", + "unicode": "e6b8", + "unicode_decimal": 59064 + },{ + "icon_id": "24923349", + "name": "arrowdown", + "font_class": "arrowdown", + "unicode": "e6b8", + "unicode_decimal": 59064 + }, + { + "icon_id": "24923346", + "name": "arrowright", + "font_class": "right", + "unicode": "e6b5", + "unicode_decimal": 59061 + }, + { + "icon_id": "24923346", + "name": "arrowright", + "font_class": "arrowright", + "unicode": "e6b5", + "unicode_decimal": 59061 + }, + { + "icon_id": "24923347", + "name": "arrowup", + "font_class": "top", + "unicode": "e6b6", + "unicode_decimal": 59062 + }, + { + "icon_id": "24923347", + "name": "arrowup", + "font_class": "arrowup", + "unicode": "e6b6", + "unicode_decimal": 59062 + }, + { + "icon_id": "24923348", + "name": "arrowleft", + "font_class": "left", + "unicode": "e6b7", + "unicode_decimal": 59063 + }, + { + "icon_id": "24923348", + "name": "arrowleft", + "font_class": "arrowleft", + "unicode": "e6b7", + "unicode_decimal": 59063 + }, + { + "icon_id": "24923334", + "name": "eye", + "font_class": "eye", + "unicode": "e651", + "unicode_decimal": 58961 + }, + { + "icon_id": "24923335", + "name": "eye-filled", + "font_class": "eye-filled", + "unicode": "e66a", + "unicode_decimal": 58986 + }, + { + "icon_id": "24923336", + "name": "eye-slash", + "font_class": "eye-slash", + "unicode": "e6b3", + "unicode_decimal": 59059 + }, + { + "icon_id": "24923337", + "name": "eye-slash-filled", + "font_class": "eye-slash-filled", + "unicode": "e6b4", + "unicode_decimal": 59060 + }, + { + "icon_id": "24923305", + "name": "info-filled", + "font_class": "info-filled", + "unicode": "e649", + "unicode_decimal": 58953 + }, + { + "icon_id": "24923299", + "name": "reload-01", + "font_class": "reload", + "unicode": "e6b2", + "unicode_decimal": 59058 + }, + { + "icon_id": "24923195", + "name": "mic_slash_fill", + "font_class": "micoff-filled", + "unicode": "e6b0", + "unicode_decimal": 59056 + }, + { + "icon_id": "24923165", + "name": "map-pin-ellipse", + "font_class": "map-pin-ellipse", + "unicode": "e6ac", + "unicode_decimal": 59052 + }, + { + "icon_id": "24923166", + "name": "map-pin", + "font_class": "map-pin", + "unicode": "e6ad", + "unicode_decimal": 59053 + }, + { + "icon_id": "24923167", + "name": "location", + "font_class": "location", + "unicode": "e6ae", + "unicode_decimal": 59054 + }, + { + "icon_id": "24923064", + "name": "starhalf", + "font_class": "starhalf", + "unicode": "e683", + "unicode_decimal": 59011 + }, + { + "icon_id": "24923065", + "name": "star", + "font_class": "star", + "unicode": "e688", + "unicode_decimal": 59016 + }, + { + "icon_id": "24923066", + "name": "star-filled", + "font_class": "star-filled", + "unicode": "e68f", + "unicode_decimal": 59023 + }, + { + "icon_id": "24899646", + "name": "a-rilidaka", + "font_class": "calendar", + "unicode": "e6a0", + "unicode_decimal": 59040 + }, + { + "icon_id": "24899647", + "name": "fire", + "font_class": "fire", + "unicode": "e6a1", + "unicode_decimal": 59041 + }, + { + "icon_id": "24899648", + "name": "paihangbang", + "font_class": "medal", + "unicode": "e6a2", + "unicode_decimal": 59042 + }, + { + "icon_id": "24899649", + "name": "font", + "font_class": "font", + "unicode": "e6a3", + "unicode_decimal": 59043 + }, + { + "icon_id": "24899650", + "name": "gift", + "font_class": "gift", + "unicode": "e6a4", + "unicode_decimal": 59044 + }, + { + "icon_id": "24899651", + "name": "link", + "font_class": "link", + "unicode": "e6a5", + "unicode_decimal": 59045 + }, + { + "icon_id": "24899652", + "name": "notification", + "font_class": "notification", + "unicode": "e6a6", + "unicode_decimal": 59046 + }, + { + "icon_id": "24899653", + "name": "staff", + "font_class": "staff", + "unicode": "e6a7", + "unicode_decimal": 59047 + }, + { + "icon_id": "24899654", + "name": "VIP", + "font_class": "vip", + "unicode": "e6a8", + "unicode_decimal": 59048 + }, + { + "icon_id": "24899655", + "name": "folder_add", + "font_class": "folder-add", + "unicode": "e6a9", + "unicode_decimal": 59049 + }, + { + "icon_id": "24899656", + "name": "tune", + "font_class": "tune", + "unicode": "e6aa", + "unicode_decimal": 59050 + }, + { + "icon_id": "24899657", + "name": "shimingrenzheng", + "font_class": "auth", + "unicode": "e6ab", + "unicode_decimal": 59051 + }, + { + "icon_id": "24899565", + "name": "person", + "font_class": "person", + "unicode": "e699", + "unicode_decimal": 59033 + }, + { + "icon_id": "24899566", + "name": "email-filled", + "font_class": "email-filled", + "unicode": "e69a", + "unicode_decimal": 59034 + }, + { + "icon_id": "24899567", + "name": "phone-filled", + "font_class": "phone-filled", + "unicode": "e69b", + "unicode_decimal": 59035 + }, + { + "icon_id": "24899568", + "name": "phone", + "font_class": "phone", + "unicode": "e69c", + "unicode_decimal": 59036 + }, + { + "icon_id": "24899570", + "name": "email", + "font_class": "email", + "unicode": "e69e", + "unicode_decimal": 59038 + }, + { + "icon_id": "24899571", + "name": "personadd", + "font_class": "personadd", + "unicode": "e69f", + "unicode_decimal": 59039 + }, + { + "icon_id": "24899558", + "name": "chatboxes-filled", + "font_class": "chatboxes-filled", + "unicode": "e692", + "unicode_decimal": 59026 + }, + { + "icon_id": "24899559", + "name": "contact", + "font_class": "contact", + "unicode": "e693", + "unicode_decimal": 59027 + }, + { + "icon_id": "24899560", + "name": "chatbubble-filled", + "font_class": "chatbubble-filled", + "unicode": "e694", + "unicode_decimal": 59028 + }, + { + "icon_id": "24899561", + "name": "contact-filled", + "font_class": "contact-filled", + "unicode": "e695", + "unicode_decimal": 59029 + }, + { + "icon_id": "24899562", + "name": "chatboxes", + "font_class": "chatboxes", + "unicode": "e696", + "unicode_decimal": 59030 + }, + { + "icon_id": "24899563", + "name": "chatbubble", + "font_class": "chatbubble", + "unicode": "e697", + "unicode_decimal": 59031 + }, + { + "icon_id": "24881290", + "name": "upload-filled", + "font_class": "upload-filled", + "unicode": "e68e", + "unicode_decimal": 59022 + }, + { + "icon_id": "24881292", + "name": "upload", + "font_class": "upload", + "unicode": "e690", + "unicode_decimal": 59024 + }, + { + "icon_id": "24881293", + "name": "weixin", + "font_class": "weixin", + "unicode": "e691", + "unicode_decimal": 59025 + }, + { + "icon_id": "24881274", + "name": "compose", + "font_class": "compose", + "unicode": "e67f", + "unicode_decimal": 59007 + }, + { + "icon_id": "24881275", + "name": "qq", + "font_class": "qq", + "unicode": "e680", + "unicode_decimal": 59008 + }, + { + "icon_id": "24881276", + "name": "download-filled", + "font_class": "download-filled", + "unicode": "e681", + "unicode_decimal": 59009 + }, + { + "icon_id": "24881277", + "name": "pengyouquan", + "font_class": "pyq", + "unicode": "e682", + "unicode_decimal": 59010 + }, + { + "icon_id": "24881279", + "name": "sound", + "font_class": "sound", + "unicode": "e684", + "unicode_decimal": 59012 + }, + { + "icon_id": "24881280", + "name": "trash-filled", + "font_class": "trash-filled", + "unicode": "e685", + "unicode_decimal": 59013 + }, + { + "icon_id": "24881281", + "name": "sound-filled", + "font_class": "sound-filled", + "unicode": "e686", + "unicode_decimal": 59014 + }, + { + "icon_id": "24881282", + "name": "trash", + "font_class": "trash", + "unicode": "e687", + "unicode_decimal": 59015 + }, + { + "icon_id": "24881284", + "name": "videocam-filled", + "font_class": "videocam-filled", + "unicode": "e689", + "unicode_decimal": 59017 + }, + { + "icon_id": "24881285", + "name": "spinner-cycle", + "font_class": "spinner-cycle", + "unicode": "e68a", + "unicode_decimal": 59018 + }, + { + "icon_id": "24881286", + "name": "weibo", + "font_class": "weibo", + "unicode": "e68b", + "unicode_decimal": 59019 + }, + { + "icon_id": "24881288", + "name": "videocam", + "font_class": "videocam", + "unicode": "e68c", + "unicode_decimal": 59020 + }, + { + "icon_id": "24881289", + "name": "download", + "font_class": "download", + "unicode": "e68d", + "unicode_decimal": 59021 + }, + { + "icon_id": "24879601", + "name": "help", + "font_class": "help", + "unicode": "e679", + "unicode_decimal": 59001 + }, + { + "icon_id": "24879602", + "name": "navigate-filled", + "font_class": "navigate-filled", + "unicode": "e67a", + "unicode_decimal": 59002 + }, + { + "icon_id": "24879603", + "name": "plusempty", + "font_class": "plusempty", + "unicode": "e67b", + "unicode_decimal": 59003 + }, + { + "icon_id": "24879604", + "name": "smallcircle", + "font_class": "smallcircle", + "unicode": "e67c", + "unicode_decimal": 59004 + }, + { + "icon_id": "24879605", + "name": "minus-filled", + "font_class": "minus-filled", + "unicode": "e67d", + "unicode_decimal": 59005 + }, + { + "icon_id": "24879606", + "name": "micoff", + "font_class": "micoff", + "unicode": "e67e", + "unicode_decimal": 59006 + }, + { + "icon_id": "24879588", + "name": "closeempty", + "font_class": "closeempty", + "unicode": "e66c", + "unicode_decimal": 58988 + }, + { + "icon_id": "24879589", + "name": "clear", + "font_class": "clear", + "unicode": "e66d", + "unicode_decimal": 58989 + }, + { + "icon_id": "24879590", + "name": "navigate", + "font_class": "navigate", + "unicode": "e66e", + "unicode_decimal": 58990 + }, + { + "icon_id": "24879591", + "name": "minus", + "font_class": "minus", + "unicode": "e66f", + "unicode_decimal": 58991 + }, + { + "icon_id": "24879592", + "name": "image", + "font_class": "image", + "unicode": "e670", + "unicode_decimal": 58992 + }, + { + "icon_id": "24879593", + "name": "mic", + "font_class": "mic", + "unicode": "e671", + "unicode_decimal": 58993 + }, + { + "icon_id": "24879594", + "name": "paperplane", + "font_class": "paperplane", + "unicode": "e672", + "unicode_decimal": 58994 + }, + { + "icon_id": "24879595", + "name": "close", + "font_class": "close", + "unicode": "e673", + "unicode_decimal": 58995 + }, + { + "icon_id": "24879596", + "name": "help-filled", + "font_class": "help-filled", + "unicode": "e674", + "unicode_decimal": 58996 + }, + { + "icon_id": "24879597", + "name": "plus-filled", + "font_class": "paperplane-filled", + "unicode": "e675", + "unicode_decimal": 58997 + }, + { + "icon_id": "24879598", + "name": "plus", + "font_class": "plus", + "unicode": "e676", + "unicode_decimal": 58998 + }, + { + "icon_id": "24879599", + "name": "mic-filled", + "font_class": "mic-filled", + "unicode": "e677", + "unicode_decimal": 58999 + }, + { + "icon_id": "24879600", + "name": "image-filled", + "font_class": "image-filled", + "unicode": "e678", + "unicode_decimal": 59000 + }, + { + "icon_id": "24855900", + "name": "locked-filled", + "font_class": "locked-filled", + "unicode": "e668", + "unicode_decimal": 58984 + }, + { + "icon_id": "24855901", + "name": "info", + "font_class": "info", + "unicode": "e669", + "unicode_decimal": 58985 + }, + { + "icon_id": "24855903", + "name": "locked", + "font_class": "locked", + "unicode": "e66b", + "unicode_decimal": 58987 + }, + { + "icon_id": "24855884", + "name": "camera-filled", + "font_class": "camera-filled", + "unicode": "e658", + "unicode_decimal": 58968 + }, + { + "icon_id": "24855885", + "name": "chat-filled", + "font_class": "chat-filled", + "unicode": "e659", + "unicode_decimal": 58969 + }, + { + "icon_id": "24855886", + "name": "camera", + "font_class": "camera", + "unicode": "e65a", + "unicode_decimal": 58970 + }, + { + "icon_id": "24855887", + "name": "circle", + "font_class": "circle", + "unicode": "e65b", + "unicode_decimal": 58971 + }, + { + "icon_id": "24855888", + "name": "checkmarkempty", + "font_class": "checkmarkempty", + "unicode": "e65c", + "unicode_decimal": 58972 + }, + { + "icon_id": "24855889", + "name": "chat", + "font_class": "chat", + "unicode": "e65d", + "unicode_decimal": 58973 + }, + { + "icon_id": "24855890", + "name": "circle-filled", + "font_class": "circle-filled", + "unicode": "e65e", + "unicode_decimal": 58974 + }, + { + "icon_id": "24855891", + "name": "flag", + "font_class": "flag", + "unicode": "e65f", + "unicode_decimal": 58975 + }, + { + "icon_id": "24855892", + "name": "flag-filled", + "font_class": "flag-filled", + "unicode": "e660", + "unicode_decimal": 58976 + }, + { + "icon_id": "24855893", + "name": "gear-filled", + "font_class": "gear-filled", + "unicode": "e661", + "unicode_decimal": 58977 + }, + { + "icon_id": "24855894", + "name": "home", + "font_class": "home", + "unicode": "e662", + "unicode_decimal": 58978 + }, + { + "icon_id": "24855895", + "name": "home-filled", + "font_class": "home-filled", + "unicode": "e663", + "unicode_decimal": 58979 + }, + { + "icon_id": "24855896", + "name": "gear", + "font_class": "gear", + "unicode": "e664", + "unicode_decimal": 58980 + }, + { + "icon_id": "24855897", + "name": "smallcircle-filled", + "font_class": "smallcircle-filled", + "unicode": "e665", + "unicode_decimal": 58981 + }, + { + "icon_id": "24855898", + "name": "map-filled", + "font_class": "map-filled", + "unicode": "e666", + "unicode_decimal": 58982 + }, + { + "icon_id": "24855899", + "name": "map", + "font_class": "map", + "unicode": "e667", + "unicode_decimal": 58983 + }, + { + "icon_id": "24855825", + "name": "refresh-filled", + "font_class": "refresh-filled", + "unicode": "e656", + "unicode_decimal": 58966 + }, + { + "icon_id": "24855826", + "name": "refresh", + "font_class": "refresh", + "unicode": "e657", + "unicode_decimal": 58967 + }, + { + "icon_id": "24855808", + "name": "cloud-upload", + "font_class": "cloud-upload", + "unicode": "e645", + "unicode_decimal": 58949 + }, + { + "icon_id": "24855809", + "name": "cloud-download-filled", + "font_class": "cloud-download-filled", + "unicode": "e646", + "unicode_decimal": 58950 + }, + { + "icon_id": "24855810", + "name": "cloud-download", + "font_class": "cloud-download", + "unicode": "e647", + "unicode_decimal": 58951 + }, + { + "icon_id": "24855811", + "name": "cloud-upload-filled", + "font_class": "cloud-upload-filled", + "unicode": "e648", + "unicode_decimal": 58952 + }, + { + "icon_id": "24855813", + "name": "redo", + "font_class": "redo", + "unicode": "e64a", + "unicode_decimal": 58954 + }, + { + "icon_id": "24855814", + "name": "images-filled", + "font_class": "images-filled", + "unicode": "e64b", + "unicode_decimal": 58955 + }, + { + "icon_id": "24855815", + "name": "undo-filled", + "font_class": "undo-filled", + "unicode": "e64c", + "unicode_decimal": 58956 + }, + { + "icon_id": "24855816", + "name": "more", + "font_class": "more", + "unicode": "e64d", + "unicode_decimal": 58957 + }, + { + "icon_id": "24855817", + "name": "more-filled", + "font_class": "more-filled", + "unicode": "e64e", + "unicode_decimal": 58958 + }, + { + "icon_id": "24855818", + "name": "undo", + "font_class": "undo", + "unicode": "e64f", + "unicode_decimal": 58959 + }, + { + "icon_id": "24855819", + "name": "images", + "font_class": "images", + "unicode": "e650", + "unicode_decimal": 58960 + }, + { + "icon_id": "24855821", + "name": "paperclip", + "font_class": "paperclip", + "unicode": "e652", + "unicode_decimal": 58962 + }, + { + "icon_id": "24855822", + "name": "settings", + "font_class": "settings", + "unicode": "e653", + "unicode_decimal": 58963 + }, + { + "icon_id": "24855823", + "name": "search", + "font_class": "search", + "unicode": "e654", + "unicode_decimal": 58964 + }, + { + "icon_id": "24855824", + "name": "redo-filled", + "font_class": "redo-filled", + "unicode": "e655", + "unicode_decimal": 58965 + }, + { + "icon_id": "24841702", + "name": "list", + "font_class": "list", + "unicode": "e644", + "unicode_decimal": 58948 + }, + { + "icon_id": "24841489", + "name": "mail-open-filled", + "font_class": "mail-open-filled", + "unicode": "e63a", + "unicode_decimal": 58938 + }, + { + "icon_id": "24841491", + "name": "hand-thumbsdown-filled", + "font_class": "hand-down-filled", + "unicode": "e63c", + "unicode_decimal": 58940 + }, + { + "icon_id": "24841492", + "name": "hand-thumbsdown", + "font_class": "hand-down", + "unicode": "e63d", + "unicode_decimal": 58941 + }, + { + "icon_id": "24841493", + "name": "hand-thumbsup-filled", + "font_class": "hand-up-filled", + "unicode": "e63e", + "unicode_decimal": 58942 + }, + { + "icon_id": "24841494", + "name": "hand-thumbsup", + "font_class": "hand-up", + "unicode": "e63f", + "unicode_decimal": 58943 + }, + { + "icon_id": "24841496", + "name": "heart-filled", + "font_class": "heart-filled", + "unicode": "e641", + "unicode_decimal": 58945 + }, + { + "icon_id": "24841498", + "name": "mail-open", + "font_class": "mail-open", + "unicode": "e643", + "unicode_decimal": 58947 + }, + { + "icon_id": "24841488", + "name": "heart", + "font_class": "heart", + "unicode": "e639", + "unicode_decimal": 58937 + }, + { + "icon_id": "24839963", + "name": "loop", + "font_class": "loop", + "unicode": "e633", + "unicode_decimal": 58931 + }, + { + "icon_id": "24839866", + "name": "pulldown", + "font_class": "pulldown", + "unicode": "e632", + "unicode_decimal": 58930 + }, + { + "icon_id": "24813798", + "name": "scan", + "font_class": "scan", + "unicode": "e62a", + "unicode_decimal": 58922 + }, + { + "icon_id": "24813786", + "name": "bars", + "font_class": "bars", + "unicode": "e627", + "unicode_decimal": 58919 + }, + { + "icon_id": "24813788", + "name": "cart-filled", + "font_class": "cart-filled", + "unicode": "e629", + "unicode_decimal": 58921 + }, + { + "icon_id": "24813790", + "name": "checkbox", + "font_class": "checkbox", + "unicode": "e62b", + "unicode_decimal": 58923 + }, + { + "icon_id": "24813791", + "name": "checkbox-filled", + "font_class": "checkbox-filled", + "unicode": "e62c", + "unicode_decimal": 58924 + }, + { + "icon_id": "24813794", + "name": "shop", + "font_class": "shop", + "unicode": "e62f", + "unicode_decimal": 58927 + }, + { + "icon_id": "24813795", + "name": "headphones", + "font_class": "headphones", + "unicode": "e630", + "unicode_decimal": 58928 + }, + { + "icon_id": "24813796", + "name": "cart", + "font_class": "cart", + "unicode": "e631", + "unicode_decimal": 58929 + } + ] +} diff --git a/uni_modules/uni-icons/components/uni-icons/uni-icons.vue b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue new file mode 100644 index 0000000..86e7444 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.css b/uni_modules/uni-icons/components/uni-icons/uniicons.css new file mode 100644 index 0000000..2f56eab --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uniicons.css @@ -0,0 +1,663 @@ +.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-gift-filled:before { + content: "\e6c4"; +} + +.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-back:before { + content: "\e6b9"; +} + +.uniui-forward:before { + content: "\e6ba"; +} + +.uniui-arrow-right:before { + content: "\e6bb"; +} + +.uniui-arrowthinright:before { + content: "\e6bb"; +} + +.uniui-arrow-left:before { + content: "\e6bc"; +} + +.uniui-arrowthinleft:before { + content: "\e6bc"; +} + +.uniui-arrow-up:before { + content: "\e6bd"; +} + +.uniui-arrowthinup:before { + content: "\e6bd"; +} + +.uniui-arrow-down:before { + content: "\e6be"; +} + +.uniui-arrowthindown:before { + content: "\e6be"; +} + +.uniui-bottom:before { + content: "\e6b8"; +} + +.uniui-arrowdown:before { + content: "\e6b8"; +} + +.uniui-right:before { + content: "\e6b5"; +} + +.uniui-arrowright:before { + content: "\e6b5"; +} + +.uniui-top:before { + content: "\e6b6"; +} + +.uniui-arrowup:before { + content: "\e6b6"; +} + +.uniui-left:before { + content: "\e6b7"; +} + +.uniui-arrowleft:before { + content: "\e6b7"; +} + +.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-cart-filled:before { + content: "\e629"; +} + +.uniui-checkbox:before { + content: "\e62b"; +} + +.uniui-checkbox-filled:before { + content: "\e62c"; +} + +.uniui-shop:before { + content: "\e62f"; +} + +.uniui-headphones:before { + content: "\e630"; +} + +.uniui-cart:before { + content: "\e631"; +} diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.ttf b/uni_modules/uni-icons/components/uni-icons/uniicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..835f33bc9411461b8b9046b3fec742e921d6ce3a GIT binary patch literal 35760 zcmeFacbp?vl{Q?rN>WLsSXIigCAC7gI!S6tox^m`be^1}CwPJ>yxZ{uSzi{WC_=LI+*Wx!<-H!v})21fuKMZQ#fB2Fs zuEGwU_ZyDmuR3&e_s&PS@Be}0T=(JF$l;w=9Als0-iQ4lE^0cm^YDeWhnK#G<4!$@ z>-QZydhsP6Kl0Pv9Cw|EbP-?YO$@C;`+ zuKnR1zxV)MXnddfv56Dn_-W<%#_jZ^d%1f!hyI(6O8C!lXY}93nl=3f9^gzbYS03Jm0vJ;T)Z1IKntfUtypB#zx`e6wG3 zC5AhB&Me^QdH${3yL1otSUp#NN^cKN_yKnkm%XqxczWUgrT^Oo|6lL`SPy&+DZ_DX z1{?B^82rf|!cpSXHhg1*;kZecHy+MI*MqCu>g9T0eYieaf9edzAC9!tJL|pm0UQ~l zBQN;JaG!_sb8)VT%i=%By_I_#_ZIFh?(N(=xVtf?-^|^~y@`7RcMEqbcN=#*_eSmx z?)BVjxU0EqFm9T;Q`~9pTJAdTdhWH{>+qBtxEr~fxSP3Gb60T(xkKDx?g)33JH{R7 zPH-1465x0fg%5CGeb33>TxSiZCZa24wyO7(&Q z>$wfwMs5?gnVaOMxM^;NYvpFSIc_<(f-7(s&u0CxL#u8VbF$klItIryQ@x|5W z48lm`>dOtnnB(dz48rK+>MISxIOOW948n-y>Z=XH*yQSK48kbo>T3axcUVKK~8Y>od!W-aP?gVL3VKU-3CF5aP>U~L7s5+3k`x~;p%%0f{fwn z`wW7#;p+Phg52Ti2MmG);_4R}1X;w@scs-hC9Y0&13^AJNK#+l4o$3aH zH00`3HxT3^SEssxAR)Or)eQt$$+z7tkWDxWPSHIIBXb!IaW`m$ZxcXZRf;QpmZ#4*d zg{!~KAZQq_ewRVeHC+Ae20`m^^>-Kq{lnGoHVB%CtKVY~bP`v;*C1#ou700E&{JIf zeuJQ~xcWN{g6`t#?=lEljH|!fAm}r${tpI0vvKtY41$j1>hCcK+K#I~Xb|)sSAVZT z(12Y1eFi}na`pEc1g*%`|Ir}mN3Q+>gPp}tAE%avLosrF^GJG z`bQ0dZsqD9GYDFitAE@e=v%J-34@?{x%wv!f)3{DpE3yAn5#cz5cD!v|Fl8S&|Lj9 z20>SI_0JjvtVjlpxwFpV+N5QQ~$g{(D+>a3kE^= zbM-G81S^26f5{-&16=*f2Ej7m>R&MkHUd}wszKz<)E_qpb^}-cnn7g6)t@j3wggxI zxp1QBm2=klxXa|a&TVx+;Qp=WwVt{>D}O~9QXW)O>O0h5db_-@^8Ud$^pPT-1=NS-v_4k2r|_kM*0!vaW9xyNll~`AaKH zuPQxR4wv6t{%QC2?wh**v$DGKU?rS_5?F|crGafkiL7dNk-%Y_E4VmkSn6>Hb;SUukEx3l0# zej=BS$yT%Av8Uc*J`xpdRw>aQ5n{34Scli{%@0hjo|#!%t;CXMOO1~vM@By$$wu(0 z7+*JsbCF0c%-{dHFL+pQI~s3&zjaOf89{d%!`6o3fsCO(`6

PqiNa$~E4XJ#a8s%?nsx`&SiQ7Wz{CE9c z{`8HZR6KCoNiFA%;R<(H6}bLFzf?(SM+?JrKi`4-zoGT1F~-8`nx^V-CCOIcNwzPg zI#WEmoNbKdqI?lY^r{&3;lBduQzQ+^Q0Ovsdx3SZltt7_Sx&}T*-Yi_XK}hBNmrzk z`W5H7!&mhB=^p;ZXqR-ILzW%aNuB+jl6J_cC{Fe!sVl1a9E#$&!PeE+C9zxSuy$PP z>g$x)o>=F3@9E@S$%qmyN){klLz;R<&aXN8`s%G@phxt!K zT81!Qp!-;9h;^gnF6KqAb=R^vG3R0;DpNC#m4^5Z7H~65s*`2Ahgr3hz*s8zz3jfW znL^w2rs=k}>2KLH`CU6VU!(9>49tGDeYUM_cJpi-YoG1fXg9e`qb3tGIZf3~W`~Vk z+_(of9#1Aiu46~z_w4uX`$hZgrrCCVb8^4kY#uW^ag({{fJuTlH#}=jxPkvJG+QrO z5v;42>+VFqh{>$Q&3qOg)d0O!i!%&kY|BMI2ELfKh`wYcoAXgOl&XUaoR{scV&Ctz z2$wT{#MU0s`oe9tW!BtSi#avu3(u}dNLK$qDwpcY&#-uC{?Ex+MCJ2pZ*H zRW3zg|H(|IcZL%@9}m5s4~AMMT39UH6mdmtws4dwk^K+4%pduf#r-d8AfSHtKa`My z4*^|Nq3ifBz4`eV~tpG8L+^7iTDPsamOK1#B@gjO)-ZI3CcqWx=BQGQ$~% zsygBw9dTlv)~SLTP)*}^IDETS<~zDKU9`Eoqh-}juY(=-RbwsVd0)s|T2fRJa_906 zhtKC&dWrT&uVd}aO|i9|m5t@{#!BbfSkujG9WZ>1vR=pb`++20D+s%TWry87A=aAN`_naX(i{)_z54|Iq`U0D$tip6 z|3n-9QPK7pft4Mepx3XxE#2OpX8R&-7L(M?gwOaSr`92dWTpgVM$LzEojC*9!@)X( zEtM>h?CvJHog%UAC0SofWe3r$R1`=YFl~(K?OQ+tT6k{X<_+aarMzMDHy3vHy5*~6 zpI5m`PJp~#`6{Km`<(MnZQ9V?{Ux90GC3hLTPOF?EmvA_YTqb$3jT`{l>|O~NdJClgBS=^9WYeU-_ujXEB_^&f{hR%dzo~UKKRo~7mser=`7OEhIlY9BnTL|z>G5u zNioE;_w{dfFt1BhUD|JKeQOHErP5xf*X!IXc8q@y=PsmE7vfA?*D{;-YdXbzILD@@ zp+CKa(Wp&Y+U1R?nSm7h#NsjAvc@suX~<{r^lNl|nt@jU--jh%#6nfDkej&}NxmVb z%i=iGwJxz$4(x=g1#}+ERkBt7aqUELO%We1SV=d%d|p^sUJTB(*TrB6bkfkQkV>fyvTho_Wi?Iw#L**4 ztzO#7vk&{5oCP1>(z0}7%>|G3tn3lEd~R&%s_Ub^Hg~(n#kVeN&5h-)iGb>9^+v@j z*Gw*LX`R0--vhU3L4T0EP{9Q`g9~14sTeXi!Tz>6!tZ!xhKF`IO-2TL>RcP6VKebR zLCf^Q#@K+8q;>J1bg>xItx_}>RGBXgr3{q?1r7V7LMAN!Ll2lC>g#&@S%^S$cmCfh-# zKq|{2<)Cf-uxB*iYDpJA>W&10Caa6RJzSJbHm_=87LVI4NH(kYRivwyC^FLAY zHm17${cU{(*5#0W{=ky^!6Wi`&QM*lT@m?O*Wy{*MX*`^YVxpr^}Ua=Jw+ z6K?AYf-D1FVE9 z4-^IjflvhWp%2_jIH8|Rv3>9Wftx%Ew3x7_&>8+{3C{mN|gzhPLsB3nJv?^Ip= zlG7>myHsaC*y0t~>YwYkxm-57VW6>tacvlA@8c66H#qzuUe%kE|r~htL(@+TTHe8#U8c)MN(q6 zbw?Sj@fSTG(l(t;)049)dJB{mSgDhT$xsz`LH#Q)eF6I|y}+f?^A$;dzFo!hk1#-N z3(pTj=A-->*z$6&@l=$(Q4^lLWHwKQTyKk_kW%byA)|_$>b35idP!?vy;4)$=afH+ zcEt1Hr}|`Hqg7CLs!0cP^EDacfpe>e*PmNP>w1)t|Ec2Et0k#u8MK=eRT#a1{Z@a0 z-k)gy8lk8ee~sD(wykJ`4PuEgZ-DvP8QIPT>^={3+qEBRPumj!I|dvNG6x%%5`GCn zvqfTlH*-6*M}XBe`u@xO&*+(~JGbyC8+B|yE8!*lmmS*Y^atg&@7p0U-3~V9V5dCv zrpB|LUVPQUGf~c>{>+rP@F*K(DrwFfaJDlZyY?kKjCb2vilyywKf?hBUvy{>Q$bma z_AiZs;$<%`C#u?blx?9An1xkQF5^L{Wupx~rxz5jqJpBtDVB1?{q(8@Km0!aQ;;7j z*F>0XCM9IMYf6&}3yBv}qQ9y3BAG_=jN}^6{{7=t>&MxbY5UVh?z@j&b??28 zD8l9*y*wmoA#wC_H0fmuEC2xn6bR?aBA)vx6+#>Mm<>fKuPc?-?WIjQ)tgNAj?;$! zq*iyv9oo;0;)Jg%t-El2skHvWbtUbI#x=Nb!4`Nc{~S==4tP*YDKf$U-ihSuLI;Ze za+6x^7U1BySvK7y6iM^L)1#q8ESc+KSsmxAWyvh^21N3h%cX!oH`AGJeA6l6jpd2X z!S=rQ9G~njuinEP*IP#OyoEo!`aUOUf z?4bJwUT3r6$b{^2b(+*d)XLs^a7ky+_A4$8mh&uV53|u6&mYcfzYGQsF4@kDJbv7CSG1B9&E^hOEaj8a$(8y|+80@;B6YVU#uJ^se{pX=mGXTPl8R)oy0J*5T;Op-cx??be>V)^0B?+s5-b0TsTL z*8=XsbXz6~MEatU)A1DUavsYuZ!o}0sKcSW_Ul0KqS395D&5M9+9gdHT%~6-fRC<* zzV;$UO18{dU;M0pE|7ag9x&N=CBH964mvqqJlnTveW|;zju5|Hs7~z#OFHVa2$5~ zR-A6mc6F>=#nWc{x|!*s)#M9U^8>?^E60{B$8Z~4Iez(ScS*5HbE4liCrL_|XZOVP z8vWrq@1OaJa11&!OSHE1lfhrA5cjI5bC1)1l3v&U{MD{TjDGv zvFw#6P~b#nY!HH|1eARq~q+pf6DZwntGcp^Y_@~u#Lalri5+tQ)*CAg6ak_-@j^m80cy*o%rx@b3aD7E@#fn3kL-r9#}I)4xtNc0OSl@3rt}k zTWER|Sx8|tmoQ${66{{1@6tZqm4tUIT2k=bb)&dit~AU-bSuxS9=?g^SC70XnD#arKpVQIr^`-M& zg&BWP$ETj>Z-zM?q!=~9-_ZLnK=5R$C#t!?{V2J)qc1Z&Gm`0Vx0vK6H5$!Eqo#aw zzRXtJXSy=O+3awpYsRj9u#AKJ<Ys=EfHB(1cz^vvU7&|duoE@6#Ef#yHhGvU+l6HHuVTVr+H9u7tDBxr837F+t z{(oaXOA*(M3b=qLfZffzc$og8&eX$jNXk%1oeUg8phyA^AK}z#v8tkN6HwOt7e8%@ zDW6$oO=gqURi9B}4y)^igy2g06!$yd=~BE&w<&Rh%R2l9tCdfhO#Fj(hah^#%&PtK zCf>`QkOM;G-Gl|cJ0b*9Y1j3iR#JZJx^-56O8NBl&SuL^R-gSbUSJz7Y%4qUI?2VN z%-rx1s16y5qh|n`iuza`W?@Vx2scGbL=x3RVM;1^6he~VS* zlgvyN_A%@F^{9{f&}*IPwEx`tHao9>NKN_QZr;QM{xQ4XdJ{9FelGj_1k?L`<_I(M zH(CAmM|l(5gzzWC7H#ytYeucn8GpOhudpf$?TzxKUeF&XAN7YJLl>~KJjTE>%0OW7 z2YoU%ZW1gG{1xiZOo$qcZHP(&WnmTr0Tipa@?2O=I18ekgQ#^vXYr34I9l;6u%?|L z2sYlGU~g>fTuQi__0(CQ?KQ6mVjE6$C$u}78V@^yhw)DXXR}>@7I$M0y$Ej8e=cBd z28KYE(|-d+5DgTCoK}(6n4KQ7995F#tOfs{D1)j>vebD8xF~`!5{L9kerbDb=|TUp)|kMz zr>i|JEUNud4s@;AwYnH6NH$Xgca!)A?)HuGLKv8w-8TRIF2U*m2Ir0QKLP%hE2b^2 z`BBgCdfUMU^u`X_HjS#i`POtd&vGq&{9w@Yovt-q_|nGwHR$?oc%xoM2g&-IL6bA0)D@A1xbF45L^*&TQALG4pN zvWJ7tAKjV0{n`HUf$|~Qv%T|(C7p<*hdMJzf!AdT#h1H)+Yce%X*F`W_ELWm{DZ-Z zUi5k06xAWf+s$N{#^_XZrwpR5Eb9oBnuLMZ&sb8X03kEF7j{%8>4PmrU7Slp((19^ zq#l0j2S>2${5f~2-Ievbb3JBZUA&D~+~!y@u61It^Bymsk8knBn%(kIO-ltIX9Jq{ zxIf8jU)FwYwcD-C$5v>+W)$F4qk!$UCyOb=zAH!Y9jk37U&+aorNv1Hr~GF-ccKXyOd(KS=@4 zli86>W+ZFu*S6Ja+t|*Nwe8jFww@QCf1Gi2#~Ir4<7!yVjKHK(BT9AK5xVinwyJ_S zh<-4vz90KIr+2l!S%@3x$d_)YyyD0K88@QN2o!#Uv<3wC%7O_ymK+=B6*%6V9mjPr_bjc+&_p9?e!mA<7cJJ@Z@kt-z?VIh!qb}7UJKH z7L$brV+Zb-peyNYPRQ2C4k8mMpb{5~5HznWmYh8a?0vt$vq{0{($=~B{3MJOw#V1$ zx{fzp_{t;Al}~#e_A*QwUV9tD{4Tc7gb`v9HS$EZpSg*bAuTIgpthD0BM;tcow2b?_h*&8lGKumTmVV6wJzc2sknS3*-Bu zi-M_CkPp#T`$kYMcy4k~Y?#Sw1>m(Rl4qc5!TTN&gmC~*`Hq;Y(0A#>4Xbo^?Lq!^x}x_d+Q?(!6XttF5UX+ zKu3`Sg?`cx!1aXwfkA*Tgf$J@5sYf2$B-)vi3{@qB8dI2yuO@Gt{w3zR>2pty5+WG zgX^XyT3dNJtnw_?bm>e>#*qlGU=LZX-?j#<2VwMC*FJ0uYFDNDQmMYBwBesGuP+tm zBH=-AKng>Nt8!~Q0xeVPoDo%!oo;#c)Z~FsV(adFI;Z(jOgv}}$+k5QTiHJ} z9)o95oq0Xhd<|maY095yNGB8<6@)%VMaz0j*6J-&upSiJ3AEH)!TnzKR&&?V!=aGvuifZ&J;R2 z3Ny2t*33>FD&R^=8N%fYHpp%KL&&UD^tccBuLhSc2|O2RWbLp{Wv>~&G|)VTv=0;& zV~P38Jn#3jes6XDGaU*W2>7)t8K<4G3Vy5gjJAbe+M#Iw6>Oes4r(|1}g}L z5t;_pBO=)(z>QN40Ew;HzU!j*)Y6fwV}57Y9TRP$q$Fa)!LVeq#N00LCU3^uD)$Z4 zw*SkHp22~9OIqFRb>Tv@6b=r@5{gx^#NA=1KlYlaqSV%`JFs(m!?%1jKacp_ENrwA zNlX3BR3xJ`I7E(dHV3l?oob2mHH%(QBWgx6mQKV?bT58@gDw0+<%zg0RX!f+3&fq# zn!n;V@s@aiS68G9nVgi2u?s)@g|(Ag*4Z`-RV5IKWDs_iWfcIhGRyx97N5 zPOBZQ{q40Th6lN3?9H;Zjd-;YCk9VAkuMxUUNKOD8Volu0r-L#0&qM~u>jK4%yK|v za<0Zwxf*&47=b1IGk$5Qa(w zngidrd!~A8?ABwwHSPE@mSIk_S^J~^UUtWm-(YuYhn{>wtD3(@-0?k{KZJkCWPeHIsvp1CxEiBfYt5T;t_4DCjQklSkX3CM@Fh;H_x2zCfe1$ z*)ud;+kMRLF4*jA9kM_D&54zcuAae~_O05I&2G7%xHd1TJzN_c=y|xdWUn2m*1Aka zF3f2(u@^}403m3^xfJZ}z>sfbc&Q|l7jVEuY>-?zv}*%E4L}eBS~haLHg3{$xG3vu z->R{JM7B^UOiq7jdaAXpHJ2C|Th-j3O7~Cnr&$V3VC05%cjHlwEHK7}1DUoX0~_g% zw$`cXje|!D&B5?UW;74;7)Ek_6rRh1+&G1p9CA(6v!av|U`T2dv$RA1vs5nj zJJFPt1$+D8NP{=Yck&t%{=6A-s;=l4o(I(9u<#MMf7mmlnjq=^W ze;(1VB{W+{mtw?Gkg>3W7I_V+F9ySr{iNGTH9h)>{EqHwAX!Bo2u2%4Aw@G-gB%!Q zU`PX;(cK-3kG0xW=Z<*)&h0MICb>Lz@MWcaq*puIvt&t6#vO4;wQNgEmc2gP@~PU8 zc^~`eW}C~twKpmlO4EdUn4RE%HbiY%FIQ6_sqk|}F0mV}iPFAz?pUPG$*_CSCB zjCJ;Dcim`bKKF>~X|c)ZMhqdm@!Xur)?t68RGD}K4QY*|hAce4v_K=AcOx8Lu+ z(I0c%U~jbZNyv@>%>jaTCKOfA7XS~D+JIuHcGvV+3J?U@zgTYF{w9+g+=d_oA%v(7 zL?QpJ2jrsi50W<`UE_^-uaP2Z%!MSscq=Q!G+(^6HBK3T8S;`d?AHcV&rd!e%MT!& zFI}VEMW@-`YY<~UfCse3wQJ}mb}HVApV{H8c1`2vQvmrJd7F14$0VlbzAVG6tIeoO zDbT@#-y8OY2o=;-LtF*)FjSeE-b zLNVEY9-J~u+D`@t*hhx7+ha|*@H6qm@Ri!gl_&!2=jVk9@EB%+Wh{{1X_{Dq z-q6LnZWuz4Vq{lH$dhy@xjM}BFI`oM)OU2fFkp`%w}By*JFZ5p)}3oAmDRgMmEH$>E8&oUUv9HW;9tk`UT-$n)?_2A!D4Z^WxK7ZEtmBL zT|UO#N<7=ux*@)G*=$RDTg%MEwx;zhUD>#TDNu`JShr#R&KNes#>Kz}sz#%m@Kik{ zk+~|wj zZ^Zm6ns0?z;c1l1iarlRhZQiE=a3b!9qpa6Bw*gwk~tqq&|KC6Lm=RX(#V<#yslNV z=^7z{rD_g%5X@VY7~%$s0c-;a1aaWYfNlE8ZU(gKA4aq#2QVT4=UimZ3W$XF?MiE( zxNG_PT=v(z>D?LHF4yL=)?Xu#@9E!_W^>s27{65zPMi3x{MnuOuW;gt%==9IExy_A z`Nw>7-Ddv1X8u;+TzTo&Ggdn7(YH@zf3SQ*E`uk3MZf6ni%+^%FdoU+ytHI`vvkcPrbdA$N zkTnoMFsI*4Xap`q`=Fu7BPf?JbZTd>g?3uFm^~-^{jx){y5BCCcct-fmsxnb)5r3X zPfRv9Cq@*dKP0b+6Lkjr)mpqomPQt zt0X^lPzpZ;{RgHr)kwUOdc!#;`FUhX6q6a=-(q*W?Y9@wr_+Vo?34oad9UYEkN0!m zmYi-E1~7B{PI4lb+2wYga;q+v>gK2BpQpCsO>V!Z)LbYumpp#=ez&T+%kxhlU+6B$ zgG{Qu4m_B>-R^Qr+FrXSV)q!QJTycaHq^EJd!T>2Xa?|Q$?>$LU#gz zcZtFlq=B9B1SIG6LZn>Rx5_2HsO|pLh!5Im=!24hAkexW{SjC=o`#j}LTU(~=LBg=R;K2tUd% zfTc{bEt?}LUDgM@E(D-`_EIb^(txv&DMArrOQ612!*z zr$xoLS<<(iZs|%&slHNj&vW>)yIgi0;Ge|ZxJA;p^M}k{{T6Jk7GA--@D@dXqjsb5 z5=DRG*Qhkeo#$NkD;kd~H||w!7g;T4y(C_<{&epR=iX{FYJjKW*`LDAJ`@X&!`Ii1 z>L_|`=(@$X-)TOlF2++EW$ry&F?8|5yxYey!@39?Xf3xBk=BdRyVR-_bkk#|S->!4 z10jk5wF6tHRxOfq2{A*q55x@)bs(uD&JXbzuzn-iAE)sI*sjRw7hHS?PR98hx|KL3 zO9_7Z4*wq(S5r!{dNLzXhdJugez%i{f-lm8-p1I&0&@SuxT*GSn))(VbGQ@w949SsbF^ zaEd1OVS`PJ8Ma$!j*b?V|al&0-PwyIAvZ#+0#}+@jNM(f)TRWzF-YWhRyx%Cb1# zzy?@bQu|r56HhX;ARcu=@16aZ&6v%S#d4?J#Z1!{uZbSiWBHRTIFAp^B2>PHJQ%jr|=h{fKEEZud z?9A+d-Q{a?%IQ?8Ga0uE9-n9yMYTDcaM+>&yE8_qmVw|)A)S!|Ag>S2V2TGlhG4V8 zAKVU;JK%y7jalqLRf*cIcDGrOtjVxnaY?Gjt%l6;af{`n{65K^@3foyvA%bzs7<>BYm_1q3Ju1 z+7UtDjnMnuR*TJ!%Wzc#*S`dPvyhXIAwob?!zuv6N%o>_L7RGlEbR#fW$o!8VrWl$ zLM-TEX=M2ZJgk62tl$X*Jlb~yIQ!3@0P*f(9g+KY-a4x1g1+ag+CF6eG*yPGiA43K zRbuu;b%eDuBw8yK1Sh@ZN=y$cQDYH#0>cYj|s}Y+>1Yhn~QCg0^p;Mgr^D;00ABpbQ+IUZkv}61B0FqgYH^^OLE)g7BzN9(T;GtpuQP|&H%>bBmWC;n0 zG$7rCJW+!BHyy!d=QGbZnnTV%{mB_>c0BWpvpMK^=4KpmJo~IeKjO&X$TN;$#_`Nq z`3F17XJGRr2wpV5xr~8QDI)Gfjya4yeO^9g6QYlcPzDg|Y_EZP6MWqmGy7iWRHb9b zY)Zs>{Ddu}+KwNSRM?@%kJ%VzJ8xQ?4UNIm-Ti(2)NyM>k&Ydg)G%EgR;A;|;enuV zix_V!r_qiw)?PJ z3qFhQw+k_3h(%~6D71VdPaPu}aA}TwWYS!CyI`2qC`lE33X{Duq>pO?8Zd;GyyL)PPH} z&1wIYM3U%LbAl**)~ed=&7S#xwLbqmmTbs)HAMvANaGEdSi_!}{O^vpb3_xIr$ym} zVe03x7{W#<0))AqS_qWwZ^XDTcEF5!uP2N*S@W z%?KD_XY*5=@HBk@ez*}R(~X6;`{@qI+k=Ospd!(IVLZ_qRvLAqIr?72gJxc)ZYn`k zBninV%7Tkv7a;x*|AG!-uFttvk!2AEXJ-)pL&?sq-p(c$Vrw=hmQjh@ELO8M;1R4% z>0%|FRh=onO_H5*D3l6?1ga2(V&i_Q8S6}#BVLc}wY$_nRP|UTfU^#pJ*Ij?(avO0 z4!G?OkJ;fl9!LcPX_!4aUOX>chrUbeb$cOik+X_9Owi6Ed|doO_-(E^@Ozz~ZU{Sx zpT4U29qbMh;9~6tNig@pmE-&PONoj8Ai2OqPDvWDKonjHZZv6!9Del+;3#9vF4`k4 zgcH4T`KDW;0L&<`_LA84dCis$WE2|m4uhBM#f@(HG6Zl`ESnMcTq>)CjlI;QfoTb` zXWTqB4f)qvc!TOWD#zr@=$6Z{bJU~iw$+aX8TN-;Ups}Ifdx1O(nkjcNZyT z1`0fZ1RP8HTm1GTN9Nyogo(}N@?N@A=XQ$ zC(7EHSlGAS=O1`eAaG|j6w}Ak^TG`HErhHl%z;AEZU>K+(!-_D6^prOjrmv=Bs0No zBfr8TcGr^RvQu>u4y5paSFSr$3jwNv|Z^T6a_Gkf${ z?*+a19Lq+uMx=Y?V9G_QS^-97(D z-uX{XTfydVI9;i(6mvOD>}NAQxO{uh4BU_#=`MD8FgcT7iX}7hGuldax%N97@JZ{G z7;@8TcgV_u5D$$Q!fW{_5Nm7&Vh0HUt0E^?p(Y4T%MsW{IHH~{jEZE=bzT6M6WgE* zEFwlA6g?oyq7ifaC12go*#0?;kg(I`37rmkoUSki%*;M^y12TlYxOSLeAZ~t`Sd_~ z;j>{c+ql>2jJrh9YH`J#*1g(;dk-LAp3>T}VJ0|UaKk*oe@gc^>vt_1Smdcwd|jV+ z)k<+`J+lBZOovBdsZmepi3C9Ojj{(`vcpzF{$Ks;xz(%Zw2|ejS1S=>iyvK1WyOu zE+_TF^xl2JNF=!4A8~|TKK})NAG#;v->92?|IxL&vvbu>Y*u&u3Jx$D{9n`ksZ{?m z+N8JaVe9tT9C4RL6wyTv+aB%xd%D9RwjvakoH36id16ip=Ho{~;qK1W`g3-!?qZlq zulHQwTl6G|0%Vi)q3aefAAxdyFemzzYpDgpyWzcbcXzMfyl8lnEv@4pGcRvz8$N=5 zAQldJub)BhA0tjXj)k zJmp9^5LCb3LB|*SpLo-d$)l7bO>`80AfG=om;c6Rj^Z*XLf+rFRK_U+UDyx$`IPQm5TD8QX_z83Tw<$q9r{kQxk z%FkNlTirY}V2DNMbFupj7moa<4Wq}##*STkY{`;i6?E|8rTWfUuZb?zdvbQkvFqq! zY!-NHg#RICNKRqY5xQoWjKCj&AnGQi9zQXrmM$W05EfWU5;9OfBER4s8OG<2>>j5Q zPqlYNFN(Ie=73qX_&gS+YgI?&qF7fu4g^|c_HVgDxYQHJDvM1fe>mH!pKPn;@gweb zeAR3cB}>vQnM{(>&JMa{vmL)J`tP>+57<4wv{~G;C^^|G$tp>fCQ))|AHi;eS4Z`F zy?m{55Z^Rm_S{-M?PwG{c2T6GCEqBx+PS(tsuw(nns}m~g~C}RvtGDE2xp#Cy7u`G zILI$GFfXk31{?s`bdu7@DDHx9J%Ce1rV0gM@QoD|hGF5-98UdP57vOQf$Aq<&ZC$X zv9`z`ajd;HP~lmyEz*|oVC^WEH{*(x!)-yv7kg52u}ewxmIXSWPhfFNr%MgHQ^^RO zuM7p0t}bOjUy%^Y3$nIZXChChgi>EZ=_)G8o|1lRDdx)1qtostyoYWb2q}1UV6dvc zI+=2Z>CvBWpV>@_m)I=u)G7YIfYGFovS6f$W0an&>xIRfP}#L&7O<(*Dh3)=qd-)x&Nv%i0z9wf6M1-p?*%Hto+18ToGH zswZfMy$vouxeTNdWPK?l$O?m(sR^^@t|IwHlCM_5gPyR-;tF*z4{!6hKa8bq+)k6_ zqYL>5kO38}^?jPwWX~Y&Wr&rldUkv^hlJ!BmS04m54HrdG+bD4O#~Cbp1^zo3KRJQ z6dL*;a*T@V>IN%ZxbX*Xxgx`$*eHGZAF(ADLbK1 z8W}cNucw`NI1_8vegHhjhYIKNTq#lr@!+{6cuH>SEfQmdiRUPyA9g2GI!{&y12XX( zCNMCXp@3NkkvuKTv2r}0A75e?+olUnSJT?H38#Z^U(qQbg@@j55v^S-+IZRAv~fd| z09?Cmd8gTw4Eir1mMwrKOTA#(E;&`xSvFjbx-#_Uv?tM~zq!&MB5n^1(P$||43>3z z8Q&-d%2I3;W92xqQgxs7ufUQt$nW!GcZ3TpIKB%2fmwI(UvL=Dg3`w36#q*^2E8=n zJ%a#E4vBUd#BF5q(`itcG4dC~)cmebS{wH_yMy=lMKd?UcXtH94)ydnAC>fqZDGt9{k`AjG4M7;`!V~r_7WOr#c!3t)>g0v(?C0VhEyn6w zc#BqbiklELHRPm$)sMZ5jU&K4D3{6&RM$wdBI5&q$HKG{!&7tdV068Y4D4o6C60H@ z6wKy`#p$<9TbMX)^*Y6jNopc@cchl^AVH&jIo6+QSVTIsLFf&jjpOah+ajXRCC-R` zaawfwEE(2>JibIzwFzkv60K+j*w5(is~fr>&Mw(8FF~l!kC_@kp$;d|S|-L|g@_^~ zN{{kUE&$=?Ir8k8wh;Hx<2sbix@q4A#I$sj;e)i^7(oYG+uWA9cDK)+z$(AACZ;4b zi%zdNWwA_(KBpxjwNAGK%Xx8hNDpb@DY^+btpgCOqhon{`&|+1bnbO`V)=uD13aIKI1J=%ZY)SSk9@GrwO5l53Nj#ygABwrGOr4+D(WR z{A;+gF;=7_G{q0rgqZe~hj>^8t2>(#2bXvcEx~NQ ziTu#eh}UPbC2Ymkd}n*ErD(H-0yFv4(m=?(OdQ^Q@ooV5=hln-S62Y}T;PPeVsF>pem98Zg)?`2{{40(!>$ z27GfF5VgHkd zFMgd8MtZ*X7o|nfo^>FgWuXBqoMO*HCaJn^?9kV}g*3%Wftv>wu*bBXKS9S9vGTJ= zEIO`3D@j~(dte*uGIkHECGYhW zHLoteAA_T}rRAyeRxtn8E*b}0y8;1L4g`aN_O0Ll9_|kOd7q+O)+Nhhr&{`2@X>9| zzX+QIE3Gz<#r?2|29J>lEDOnBn5@VXtYys4pd3d0=s*%GT?e+(xfa}?u=KBN((ZHezNqtAtIutFHaZmwV^y17P0OeIeEy_%XQ9@8U}fCp zqWb|dqU{@FO8?sc86CabOMm|exEvOtKwG}#F9hgPh;TYc8#8h8dHz~Jz=HUFmIN(b zb)IJ}{Otfd45AoqhRgoO-w|MHIHWQq99CcUFAA(z!YqvCo^cIxz1$xch~snykK$kS zM+Q1^6rX!u__qdT@V6C|NH`nTe)*z5I?zdP3bAk|(in@cfi#a2wnsXt5s##adW5c! z2wcb*&{wE{l>rljeWtiI|EMb$az2ts7Fw1~Jvh0n75|n^t{o+GN5_Nih({lFMRLwZ z@)vZkom$pXSiEqoaRn}Wi7fv6T9I!ijfZ9XwYm(Arv&Yv-L}yOjb}})s+K10fh~4q z|3dIG5lStryzb(|Px`}9YQ0O`&Kne<>jvMvj{iqk%p&4IZb)RHikW0Z|Bp4CDy&>d zR~p1N^KJ9rHRyTml>Tqs`uDG6Z2kKA_hRS$>vcQn%wLgX>p`3WbGP;U55%N(^+u{1 zDImI&1zBb^E7pmImjfke6}8P)F1 zOem}kc@^K08~yz%_?9X9`$jY`k7j(qv4L3fVJ4KA&g!NyY3Upc%X9{5_B0YuQVXum zvgI9ELoX_}iQ_Hot#T046J=i^*W6wyw)Zlt#mjzx2y`AH5Niu^uzlIF>~k$W0a?2p z`C2R#n9XD6&WaJWFEq&Bf~#!W0c|?&B4l#3DE~{)i;{mQawKFD>9X0bVzw@1v z$0FLCeqNA7r`3-2^B9YU1HDbD(C$EzvF7j%!M2n#T(G9fVNux|EhS9$qhgl*b=wvu zaQIsuKxfW4!hWYi^_p$N%`J(5)x;u7Au}EhM0vJ4oW_z6AB<$wRC}nkeVEU$JY0x& z^@SPd3lC`@W-A-@raAvfea^pLQ;O<9K5ruWN2 zf1Jd+fO>yql4PFLl28X~wS(6=$FNj&5LVQ~eR>Bqir0vc=(!~*XO+4SJ_`Qujf-W< za$4X&uW9HH2LP{^?~k*+@p65kS+;HAQ?yb()=dK}K%L=LE!Kt32&;N$LGog&ozc?h45T+ihS*B&BgBW$D~QX#6FxNl!j-BgOBvW5MbJnb>IS=u?b^TV zQ}~k}pWMBF=+IbiXL~H(-q|~L2no}tuY1jF;*@U{5=V09g0o3bt5 z?--)uJKmP8_MSs*E|v0s^Xm=)iNlU3zwvdp+xF$huz21c?QXa2(Ju+w&fod{zaySq zY@?CC*-8N&HG#24so`YolbdQJ$pU?9{57cT%eCcL+g!2Ik_cIyNaTpdS}I+0ZN;`# zQ`>m6U}4*)R<@O1rn#qTYdhoq943TVoq1opb8T&U&CKkwA*_Biv}|@}jUlg}7d`|V zsDu9gUB;82rx`hJ)b3w zi;P(fBwzWDwX}7%Z=A)<@R&&m2OUC22stlyI4ogDhgY&!Dx0<(ynHw23EHB+68(-$ zvD&?9>%mJ7IQ~y(*BTqgRfTJRu+QGW1)9|%yZR4O9Bf&@bSSzbaF ziVferb7$?O{ZZld&YpYjxp(fId(WBsIQJf$`kz;)KYe`fQ)3&3DXzBn4W^U{r9bUt zQfIMzJH`%m-@Pr5tOhfVs!F5r!NGJ~T|csZgURNO9!2_GdY6iK$|rS>c?=j;PCm4L z^ob{r9(p_$8_J|IeX5g5D&q<>iwR{Q_HXDUyeWrr#V&kev46gH`8B$a{<6G=(J-6S zzsFxhdk*~;ZDymHVWxU5G z53b8!x>Vdznq1N*OOKSUTtUA!f8`3m$=HcYm-6eTN;{Tz#|Q7cyO1B91mQLOm39;- zM`Ih;u*lK{N=~g?bKwHO-Ni9g(rEyZ>=)qGeP9fofz?1NhN zv)wU;ULPJ+^4Q+B^m}Zj8hkdDy)!g1ROrXhn|2PBhw%U2F6;2z4`aVfcP?KT8SUuH z<~oPRMqW=!ne2w%TsFP*(|(pCzbB1`nXk|9s4ADbNb2G=-oaV8acTODNyaf|tGv+gg_fM3|6Z;Rp zap(X84jeMym(uccvbSHo5p;-eq^s%ybH!mh?%Ye zi=lT|rwpTz$rv9^!a;@7k5vnFV1;ijW`2WH`0?&$eY}t4TdUdA8}BJ)%4J0!fbeHF zmNTUuxwJ{9U2>XkDyjGsr3SFP^?!Td+MnvqZrj!_^>*Q>vun#Rb#_RvW)kf`kcTF% zmU}K5SmmE9l;?A?zw&<4$Jr>G&4h7#sBlt%85#*mYUjpBIQWV!D335{0!iNx5A*eV z9{zq$^2pU+T|Ep->+Htzt8;^MKc3i_T_|FEsR8;H`+lQ*Z&@7Z&H z`ew32ee>kLy-z>Aci+i3)sB~og&X%5bGcif@4l7G74N@MD7NbPGR`3@VVCq)<{Nc5 zQZyeT{UdxZn!`*JDis>z@tV*p*GYit61`BXOT>140DaY5O5s$-w0R&{6_)H=wH1nUoi;q*bnL>%CN@T>J%(*~Q8xZU zZBr0b3sui)6m}y&!?K)$>p63V9!%7Oz};Rhv->dogzhx3iOPd>VhzqQjkZc#0nUsU zaW&g?xO%o>h{UeU)w>N`g!OU!n*rCw%{B`uy${6ROFa#0<}%*oxfL+Tn83#5d#Uz- z%I1{!md3{>(Hg2Rz^97Ru_+b@YO4T~w6J^zN@4*npaNOk9P-gYJpl*NER~CCrZPU! z^F;I${5hcjxsFDy^9|Ijf!*_W17`)r308fCbu&ufked|2-kdV%V!@FEVJiq>8yJ?Q z`Uvkb!t4e*DtUA@*m=_h8X{OT5u_TvCLScrB@+$^A^1Whb|57jaM31oN-&>FTX1&8 zR@z3}u{QJwIx&x8csvCofX8SjJx;r5HzSkx%YPN4Er!~tmf~;=@foa$L@v4b%C9O4sdIbA*#}%;Z z2U@i%0;vTv!lzxU8Kv#2I#$K-#=5nMIBC|lJts-EH3jfNX6W-aIL{9H(EEBDSYv{F`SR@3L( ztB!YC^S}nrb54(YX00BiLfA5@K_Ud3uE15C)3!3}1cB3#Ic+>}T!~S}jYT7cuP9`a zfxe~r_0AR)mEVN65wPMJmZMcN4Je)#x3dk+9d}K89E!qpeWP836VdY}P&Zy(v#JsU z((EGgOGIpz7?WhqLW$`di7`;JOnY8k&3T#Eavas0TB%Ek)tkiHg%a{iH5!^3RfX!- zomREVJRtM5NHa~BF)3nM z7*b9f<{8sQ&JEY`jo7JESynl#2;=VJDcN_Lc0~<5RD?*ca+CFh;Ad*4a?2i+JafbD?lVoGV$Q8G3_@XaJuOs3$xMqx(7btGc8L*Y!YDy6RV}TS zW|t_l8Xhl-tUC=n04@=NMRu=ZmcXZ2s}FTl9AJl#bb)FYK@|*XR>s3N(HjP$3KFCp zcVly_QwS2tGb&Do^C@bwX|$V2N~MP58EJNj=vkx^(kFQZ=#bPzq*@gpkEGYrEY~Q7 zW%@xU7bC|tB8}Hs*X+tTE3Y6+wh$d0YDO$*7eTd-tfPuaw(^rXTCyC+O}I_VVp&SQ luGvs>o}boN(j<8GK{&G!5S5TA{}l46aGCZcmWaKH{|6re5*Yvh literal 0 HcmV?d00001 diff --git a/uni_modules/uni-icons/package.json b/uni_modules/uni-icons/package.json new file mode 100644 index 0000000..d1c4e77 --- /dev/null +++ b/uni_modules/uni-icons/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-icons", + "displayName": "uni-icons 图标", + "version": "1.3.5", + "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。", + "keywords": [ + "uni-ui", + "uniui", + "icon", + "图标" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.2.14" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-icons/readme.md b/uni_modules/uni-icons/readme.md new file mode 100644 index 0000000..86234ba --- /dev/null +++ b/uni_modules/uni-icons/readme.md @@ -0,0 +1,8 @@ +## Icons 图标 +> **组件名:uni-icons** +> 代码块: `uIcons` + +用于展示 icons 图标 。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-scss/changelog.md b/uni_modules/uni-scss/changelog.md new file mode 100644 index 0000000..b863bb0 --- /dev/null +++ b/uni_modules/uni-scss/changelog.md @@ -0,0 +1,8 @@ +## 1.0.3(2022-01-21) +- 优化 组件示例 +## 1.0.2(2021-11-22) +- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题 +## 1.0.1(2021-11-22) +- 修复 vue3中scss语法兼容问题 +## 1.0.0(2021-11-18) +- init diff --git a/uni_modules/uni-scss/index.scss b/uni_modules/uni-scss/index.scss new file mode 100644 index 0000000..1744a5f --- /dev/null +++ b/uni_modules/uni-scss/index.scss @@ -0,0 +1 @@ +@import './styles/index.scss'; diff --git a/uni_modules/uni-scss/package.json b/uni_modules/uni-scss/package.json new file mode 100644 index 0000000..7cc0ccb --- /dev/null +++ b/uni_modules/uni-scss/package.json @@ -0,0 +1,82 @@ +{ + "id": "uni-scss", + "displayName": "uni-scss 辅助样式", + "version": "1.0.3", + "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。", + "keywords": [ + "uni-scss", + "uni-ui", + "辅助样式" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "JS SDK", + "通用 SDK" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "n", + "联盟": "n" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-scss/readme.md b/uni_modules/uni-scss/readme.md new file mode 100644 index 0000000..b7d1c25 --- /dev/null +++ b/uni_modules/uni-scss/readme.md @@ -0,0 +1,4 @@ +`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/index.scss b/uni_modules/uni-scss/styles/index.scss new file mode 100644 index 0000000..ffac4fe --- /dev/null +++ b/uni_modules/uni-scss/styles/index.scss @@ -0,0 +1,7 @@ +@import './setting/_variables.scss'; +@import './setting/_border.scss'; +@import './setting/_color.scss'; +@import './setting/_space.scss'; +@import './setting/_radius.scss'; +@import './setting/_text.scss'; +@import './setting/_styles.scss'; diff --git a/uni_modules/uni-scss/styles/setting/_border.scss b/uni_modules/uni-scss/styles/setting/_border.scss new file mode 100644 index 0000000..12a11c3 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_border.scss @@ -0,0 +1,3 @@ +.uni-border { + border: 1px $uni-border-1 solid; +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_color.scss b/uni_modules/uni-scss/styles/setting/_color.scss new file mode 100644 index 0000000..1ededd9 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_color.scss @@ -0,0 +1,66 @@ + +// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐 +// @mixin get-styles($k,$c) { +// @if $k == size or $k == weight{ +// font-#{$k}:#{$c} +// }@else{ +// #{$k}:#{$c} +// } +// } +$uni-ui-color:( + // 主色 + primary: $uni-primary, + primary-disable: $uni-primary-disable, + primary-light: $uni-primary-light, + // 辅助色 + success: $uni-success, + success-disable: $uni-success-disable, + success-light: $uni-success-light, + warning: $uni-warning, + warning-disable: $uni-warning-disable, + warning-light: $uni-warning-light, + error: $uni-error, + error-disable: $uni-error-disable, + error-light: $uni-error-light, + info: $uni-info, + info-disable: $uni-info-disable, + info-light: $uni-info-light, + // 中性色 + main-color: $uni-main-color, + base-color: $uni-base-color, + secondary-color: $uni-secondary-color, + extra-color: $uni-extra-color, + // 背景色 + bg-color: $uni-bg-color, + // 边框颜色 + border-1: $uni-border-1, + border-2: $uni-border-2, + border-3: $uni-border-3, + border-4: $uni-border-4, + // 黑色 + black:$uni-black, + // 白色 + white:$uni-white, + // 透明 + transparent:$uni-transparent +) !default; +@each $key, $child in $uni-ui-color { + .uni-#{"" + $key} { + color: $child; + } + .uni-#{"" + $key}-bg { + background-color: $child; + } +} +.uni-shadow-sm { + box-shadow: $uni-shadow-sm; +} +.uni-shadow-base { + box-shadow: $uni-shadow-base; +} +.uni-shadow-lg { + box-shadow: $uni-shadow-lg; +} +.uni-mask { + background-color:$uni-mask; +} diff --git a/uni_modules/uni-scss/styles/setting/_radius.scss b/uni_modules/uni-scss/styles/setting/_radius.scss new file mode 100644 index 0000000..9a0428b --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_radius.scss @@ -0,0 +1,55 @@ +@mixin radius($r,$d:null ,$important: false){ + $radius-value:map-get($uni-radius, $r) if($important, !important, null); + // Key exists within the $uni-radius variable + @if (map-has-key($uni-radius, $r) and $d){ + @if $d == t { + border-top-left-radius:$radius-value; + border-top-right-radius:$radius-value; + }@else if $d == r { + border-top-right-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == b { + border-bottom-left-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == l { + border-top-left-radius:$radius-value; + border-bottom-left-radius:$radius-value; + }@else if $d == tl { + border-top-left-radius:$radius-value; + }@else if $d == tr { + border-top-right-radius:$radius-value; + }@else if $d == br { + border-bottom-right-radius:$radius-value; + }@else if $d == bl { + border-bottom-left-radius:$radius-value; + } + }@else{ + border-radius:$radius-value; + } +} + +@each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $key} { + @include radius($key) + } + }@else{ + .uni-radius { + @include radius($key) + } + } +} + +@each $direction in t, r, b, l,tl, tr, br, bl { + @each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $direction}-#{"" + $key} { + @include radius($key,$direction,false) + } + }@else{ + .uni-radius-#{$direction} { + @include radius($key,$direction,false) + } + } + } +} diff --git a/uni_modules/uni-scss/styles/setting/_space.scss b/uni_modules/uni-scss/styles/setting/_space.scss new file mode 100644 index 0000000..3c89528 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_space.scss @@ -0,0 +1,56 @@ + +@mixin fn($space,$direction,$size,$n) { + @if $n { + #{$space}-#{$direction}: #{$size*$uni-space-root}px + } @else { + #{$space}-#{$direction}: #{-$size*$uni-space-root}px + } +} +@mixin get-styles($direction,$i,$space,$n){ + @if $direction == t { + @include fn($space, top,$i,$n); + } + @if $direction == r { + @include fn($space, right,$i,$n); + } + @if $direction == b { + @include fn($space, bottom,$i,$n); + } + @if $direction == l { + @include fn($space, left,$i,$n); + } + @if $direction == x { + @include fn($space, left,$i,$n); + @include fn($space, right,$i,$n); + } + @if $direction == y { + @include fn($space, top,$i,$n); + @include fn($space, bottom,$i,$n); + } + @if $direction == a { + @if $n { + #{$space}:#{$i*$uni-space-root}px; + } @else { + #{$space}:#{-$i*$uni-space-root}px; + } + } +} + +@each $orientation in m,p { + $space: margin; + @if $orientation == m { + $space: margin; + } @else { + $space: padding; + } + @for $i from 0 through 16 { + @each $direction in t, r, b, l, x, y, a { + .uni-#{$orientation}#{$direction}-#{$i} { + @include get-styles($direction,$i,$space,true); + } + .uni-#{$orientation}#{$direction}-n#{$i} { + @include get-styles($direction,$i,$space,false); + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_styles.scss b/uni_modules/uni-scss/styles/setting/_styles.scss new file mode 100644 index 0000000..689afec --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_styles.scss @@ -0,0 +1,167 @@ +/* #ifndef APP-NVUE */ + +$-color-white:#fff; +$-color-black:#000; +@mixin base-style($color) { + color: #fff; + background-color: $color; + border-color: mix($-color-black, $color, 8%); + &:not([hover-class]):active { + background: mix($-color-black, $color, 10%); + border-color: mix($-color-black, $color, 20%); + color: $-color-white; + outline: none; + } +} +@mixin is-color($color) { + @include base-style($color); + &[loading] { + @include base-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &[loading], + &:not([hover-class]):active { + color: $-color-white; + border-color: mix(darken($color,10%), $-color-white); + background-color: mix($color, $-color-white); + } + } + +} +@mixin base-plain-style($color) { + color:$color; + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 70%); + &:not([hover-class]):active { + background: mix($-color-white, $color, 80%); + color: $color; + outline: none; + border-color: mix($-color-white, $color, 50%); + } +} +@mixin is-plain($color){ + &[plain] { + @include base-plain-style($color); + &[loading] { + @include base-plain-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &:active { + color: mix($-color-white, $color, 40%); + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 80%); + } + } + } +} + + +.uni-btn { + margin: 5px; + color: #393939; + border:1px solid #ccc; + font-size: 16px; + font-weight: 200; + background-color: #F9F9F9; + // TODO 暂时处理边框隐藏一边的问题 + overflow: visible; + &::after{ + border: none; + } + + &:not([type]),&[type=default] { + color: #999; + &[loading] { + background: none; + &::before { + margin-right:5px; + } + } + + + + &[disabled]{ + color: mix($-color-white, #999, 60%); + &, + &[loading], + &:active { + color: mix($-color-white, #999, 60%); + background-color: mix($-color-white,$-color-black , 98%); + border-color: mix($-color-white, #999, 85%); + } + } + + &[plain] { + color: #999; + background: none; + border-color: $uni-border-1; + &:not([hover-class]):active { + background: none; + color: mix($-color-white, $-color-black, 80%); + border-color: mix($-color-white, $-color-black, 90%); + outline: none; + } + &[disabled]{ + &, + &[loading], + &:active { + background: none; + color: mix($-color-white, #999, 60%); + border-color: mix($-color-white, #999, 85%); + } + } + } + } + + &:not([hover-class]):active { + color: mix($-color-white, $-color-black, 50%); + } + + &[size=mini] { + font-size: 16px; + font-weight: 200; + border-radius: 8px; + } + + + + &.uni-btn-small { + font-size: 14px; + } + &.uni-btn-mini { + font-size: 12px; + } + + &.uni-btn-radius { + border-radius: 999px; + } + &[type=primary] { + @include is-color($uni-primary); + @include is-plain($uni-primary) + } + &[type=success] { + @include is-color($uni-success); + @include is-plain($uni-success) + } + &[type=error] { + @include is-color($uni-error); + @include is-plain($uni-error) + } + &[type=warning] { + @include is-color($uni-warning); + @include is-plain($uni-warning) + } + &[type=info] { + @include is-color($uni-info); + @include is-plain($uni-info) + } +} +/* #endif */ diff --git a/uni_modules/uni-scss/styles/setting/_text.scss b/uni_modules/uni-scss/styles/setting/_text.scss new file mode 100644 index 0000000..a34d08f --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_text.scss @@ -0,0 +1,24 @@ +@mixin get-styles($k,$c) { + @if $k == size or $k == weight{ + font-#{$k}:#{$c} + }@else{ + #{$k}:#{$c} + } +} + +@each $key, $child in $uni-headings { + /* #ifndef APP-NVUE */ + .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ + /* #ifdef APP-NVUE */ + .container .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ +} diff --git a/uni_modules/uni-scss/styles/setting/_variables.scss b/uni_modules/uni-scss/styles/setting/_variables.scss new file mode 100644 index 0000000..557d3d7 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_variables.scss @@ -0,0 +1,146 @@ +// @use "sass:math"; +@import '../tools/functions.scss'; +// 间距基础倍数 +$uni-space-root: 2 !default; +// 边框半径默认值 +$uni-radius-root:5px !default; +$uni-radius: () !default; +// 边框半径断点 +$uni-radius: map-deep-merge( + ( + 0: 0, + // TODO 当前版本暂时不支持 sm 属性 + // 'sm': math.div($uni-radius-root, 2), + null: $uni-radius-root, + 'lg': $uni-radius-root * 2, + 'xl': $uni-radius-root * 6, + 'pill': 9999px, + 'circle': 50% + ), + $uni-radius +); +// 字体家族 +$body-font-family: 'Roboto', sans-serif !default; +// 文本 +$heading-font-family: $body-font-family !default; +$uni-headings: () !default; +$letterSpacing: -0.01562em; +$uni-headings: map-deep-merge( + ( + 'h1': ( + size: 32px, + weight: 300, + line-height: 50px, + // letter-spacing:-0.01562em + ), + 'h2': ( + size: 28px, + weight: 300, + line-height: 40px, + // letter-spacing: -0.00833em + ), + 'h3': ( + size: 24px, + weight: 400, + line-height: 32px, + // letter-spacing: normal + ), + 'h4': ( + size: 20px, + weight: 400, + line-height: 30px, + // letter-spacing: 0.00735em + ), + 'h5': ( + size: 16px, + weight: 400, + line-height: 24px, + // letter-spacing: normal + ), + 'h6': ( + size: 14px, + weight: 500, + line-height: 18px, + // letter-spacing: 0.0125em + ), + 'subtitle': ( + size: 12px, + weight: 400, + line-height: 20px, + // letter-spacing: 0.00937em + ), + 'body': ( + font-size: 14px, + font-weight: 400, + line-height: 22px, + // letter-spacing: 0.03125em + ), + 'caption': ( + 'size': 12px, + 'weight': 400, + 'line-height': 20px, + // 'letter-spacing': 0.03333em, + // 'text-transform': false + ) + ), + $uni-headings +); + + + +// 主色 +$uni-primary: #2979ff !default; +$uni-primary-disable:lighten($uni-primary,20%) !default; +$uni-primary-light: lighten($uni-primary,25%) !default; + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37 !default; +$uni-success-disable:lighten($uni-success,20%) !default; +$uni-success-light: lighten($uni-success,25%) !default; + +$uni-warning: #f3a73f !default; +$uni-warning-disable:lighten($uni-warning,20%) !default; +$uni-warning-light: lighten($uni-warning,25%) !default; + +$uni-error: #e43d33 !default; +$uni-error-disable:lighten($uni-error,20%) !default; +$uni-error-light: lighten($uni-error,25%) !default; + +$uni-info: #8f939c !default; +$uni-info-disable:lighten($uni-info,20%) !default; +$uni-info-light: lighten($uni-info,25%) !default; + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a !default; // 主要文字 +$uni-base-color: #6a6a6a !default; // 常规文字 +$uni-secondary-color: #909399 !default; // 次要文字 +$uni-extra-color: #c7c7c7 !default; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0 !default; +$uni-border-2: #EDEDED !default; +$uni-border-3: #DCDCDC !default; +$uni-border-4: #B9B9B9 !default; + +// 常规色 +$uni-black: #000000 !default; +$uni-white: #ffffff !default; +$uni-transparent: rgba($color: #000000, $alpha: 0) !default; + +// 背景色 +$uni-bg-color: #f7f7f7 !default; + +/* 水平间距 */ +$uni-spacing-sm: 8px !default; +$uni-spacing-base: 15px !default; +$uni-spacing-lg: 30px !default; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default; +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default; +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default; + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4) !default; diff --git a/uni_modules/uni-scss/styles/tools/functions.scss b/uni_modules/uni-scss/styles/tools/functions.scss new file mode 100644 index 0000000..ac6f63e --- /dev/null +++ b/uni_modules/uni-scss/styles/tools/functions.scss @@ -0,0 +1,19 @@ +// 合并 map +@function map-deep-merge($parent-map, $child-map){ + $result: $parent-map; + @each $key, $child in $child-map { + $parent-has-key: map-has-key($result, $key); + $parent-value: map-get($result, $key); + $parent-type: type-of($parent-value); + $child-type: type-of($child); + $parent-is-map: $parent-type == map; + $child-is-map: $child-type == map; + + @if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){ + $result: map-merge($result, ( $key: $child )); + }@else { + $result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) )); + } + } + @return $result; +}; diff --git a/uni_modules/uni-scss/theme.scss b/uni_modules/uni-scss/theme.scss new file mode 100644 index 0000000..80ee62f --- /dev/null +++ b/uni_modules/uni-scss/theme.scss @@ -0,0 +1,31 @@ +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; +// 主色 +$uni-primary: #2979ff; +// 辅助色 +$uni-success: #4cd964; +// 警告色 +$uni-warning: #f0ad4e; +// 错误色 +$uni-error: #dd524d; +// 描述色 +$uni-info: #909399; +// 中性色 +$uni-main-color: #303133; +$uni-base-color: #606266; +$uni-secondary-color: #909399; +$uni-extra-color: #C0C4CC; +// 背景色 +$uni-bg-color: #f5f5f5; +// 边框颜色 +$uni-border-1: #DCDFE6; +$uni-border-2: #E4E7ED; +$uni-border-3: #EBEEF5; +$uni-border-4: #F2F6FC; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); diff --git a/uni_modules/uni-scss/variables.scss b/uni_modules/uni-scss/variables.scss new file mode 100644 index 0000000..1c062d4 --- /dev/null +++ b/uni_modules/uni-scss/variables.scss @@ -0,0 +1,62 @@ +@import './styles/setting/_variables.scss'; +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; + +// 主色 +$uni-primary: #2979ff; +$uni-primary-disable:mix(#fff,$uni-primary,50%); +$uni-primary-light: mix(#fff,$uni-primary,80%); + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37; +$uni-success-disable:mix(#fff,$uni-success,50%); +$uni-success-light: mix(#fff,$uni-success,80%); + +$uni-warning: #f3a73f; +$uni-warning-disable:mix(#fff,$uni-warning,50%); +$uni-warning-light: mix(#fff,$uni-warning,80%); + +$uni-error: #e43d33; +$uni-error-disable:mix(#fff,$uni-error,50%); +$uni-error-light: mix(#fff,$uni-error,80%); + +$uni-info: #8f939c; +$uni-info-disable:mix(#fff,$uni-info,50%); +$uni-info-light: mix(#fff,$uni-info,80%); + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a; // 主要文字 +$uni-base-color: #6a6a6a; // 常规文字 +$uni-secondary-color: #909399; // 次要文字 +$uni-extra-color: #c7c7c7; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0; +$uni-border-2: #EDEDED; +$uni-border-3: #DCDCDC; +$uni-border-4: #B9B9B9; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); + +// 背景色 +$uni-bg-color: #f7f7f7; + +/* 水平间距 */ +$uni-spacing-sm: 8px; +$uni-spacing-base: 15px; +$uni-spacing-lg: 30px; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5); +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2); +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5); + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4); diff --git a/uni_modules/uni-table/changelog.md b/uni_modules/uni-table/changelog.md new file mode 100644 index 0000000..8233b20 --- /dev/null +++ b/uni_modules/uni-table/changelog.md @@ -0,0 +1,23 @@ +## 1.2.1(2022-06-06) +- 修复 微信小程序存在无使用组件的问题 +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-table](https://uniapp.dcloud.io/component/uniui/uni-table) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-07-08) +- 新增 uni-th 支持 date 日期筛选范围 +## 1.0.6(2021-07-05) +- 新增 uni-th 支持 range 筛选范围 +## 1.0.5(2021-06-28) +- 新增 uni-th 筛选功能 +## 1.0.4(2021-05-12) +- 新增 示例地址 +- 修复 示例项目缺少组件的Bug +## 1.0.3(2021-04-16) +- 新增 sortable 属性,是否开启单列排序 +- 优化 表格多选逻辑 +## 1.0.2(2021-03-22) +- uni-tr 添加 disabled 属性,用于 type=selection 时,设置某行是否可由全选按钮控制 +## 1.0.1(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-table/components/uni-table/uni-table.vue b/uni_modules/uni-table/components/uni-table/uni-table.vue new file mode 100644 index 0000000..91b74fa --- /dev/null +++ b/uni_modules/uni-table/components/uni-table/uni-table.vue @@ -0,0 +1,455 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue b/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue new file mode 100644 index 0000000..fbe1bdc --- /dev/null +++ b/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-td/uni-td.vue b/uni_modules/uni-table/components/uni-td/uni-td.vue new file mode 100644 index 0000000..9ce93e9 --- /dev/null +++ b/uni_modules/uni-table/components/uni-td/uni-td.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-th/filter-dropdown.vue b/uni_modules/uni-table/components/uni-th/filter-dropdown.vue new file mode 100644 index 0000000..bc9a0e3 --- /dev/null +++ b/uni_modules/uni-table/components/uni-th/filter-dropdown.vue @@ -0,0 +1,503 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-th/uni-th.vue b/uni_modules/uni-table/components/uni-th/uni-th.vue new file mode 100644 index 0000000..883e3f2 --- /dev/null +++ b/uni_modules/uni-table/components/uni-th/uni-th.vue @@ -0,0 +1,278 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-thead/uni-thead.vue b/uni_modules/uni-table/components/uni-thead/uni-thead.vue new file mode 100644 index 0000000..0dd18cd --- /dev/null +++ b/uni_modules/uni-table/components/uni-thead/uni-thead.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-tr/table-checkbox.vue b/uni_modules/uni-table/components/uni-tr/table-checkbox.vue new file mode 100644 index 0000000..158f3ff --- /dev/null +++ b/uni_modules/uni-table/components/uni-tr/table-checkbox.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/uni_modules/uni-table/components/uni-tr/uni-tr.vue b/uni_modules/uni-table/components/uni-tr/uni-tr.vue new file mode 100644 index 0000000..f9b9671 --- /dev/null +++ b/uni_modules/uni-table/components/uni-tr/uni-tr.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/uni_modules/uni-table/i18n/en.json b/uni_modules/uni-table/i18n/en.json new file mode 100644 index 0000000..e32023c --- /dev/null +++ b/uni_modules/uni-table/i18n/en.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "Reset", + "filter-dropdown.search": "Search", + "filter-dropdown.submit": "Submit", + "filter-dropdown.filter": "Filter", + "filter-dropdown.gt": "Greater or equal to", + "filter-dropdown.lt": "Less than or equal to", + "filter-dropdown.date": "Date" +} diff --git a/uni_modules/uni-table/i18n/es.json b/uni_modules/uni-table/i18n/es.json new file mode 100644 index 0000000..9afd04b --- /dev/null +++ b/uni_modules/uni-table/i18n/es.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "Reiniciar", + "filter-dropdown.search": "Búsqueda", + "filter-dropdown.submit": "Entregar", + "filter-dropdown.filter": "Filtrar", + "filter-dropdown.gt": "Mayor o igual a", + "filter-dropdown.lt": "Menos que o igual a", + "filter-dropdown.date": "Fecha" +} diff --git a/uni_modules/uni-table/i18n/fr.json b/uni_modules/uni-table/i18n/fr.json new file mode 100644 index 0000000..b006237 --- /dev/null +++ b/uni_modules/uni-table/i18n/fr.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "Réinitialiser", + "filter-dropdown.search": "Chercher", + "filter-dropdown.submit": "Soumettre", + "filter-dropdown.filter": "Filtre", + "filter-dropdown.gt": "Supérieur ou égal à", + "filter-dropdown.lt": "Inférieur ou égal à", + "filter-dropdown.date": "Date" +} diff --git a/uni_modules/uni-table/i18n/index.js b/uni_modules/uni-table/i18n/index.js new file mode 100644 index 0000000..2469dd0 --- /dev/null +++ b/uni_modules/uni-table/i18n/index.js @@ -0,0 +1,12 @@ +import en from './en.json' +import es from './es.json' +import fr from './fr.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + es, + fr, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-table/i18n/zh-Hans.json b/uni_modules/uni-table/i18n/zh-Hans.json new file mode 100644 index 0000000..862af17 --- /dev/null +++ b/uni_modules/uni-table/i18n/zh-Hans.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "重置", + "filter-dropdown.search": "搜索", + "filter-dropdown.submit": "确定", + "filter-dropdown.filter": "筛选", + "filter-dropdown.gt": "大于等于", + "filter-dropdown.lt": "小于等于", + "filter-dropdown.date": "日期范围" +} diff --git a/uni_modules/uni-table/i18n/zh-Hant.json b/uni_modules/uni-table/i18n/zh-Hant.json new file mode 100644 index 0000000..64f8061 --- /dev/null +++ b/uni_modules/uni-table/i18n/zh-Hant.json @@ -0,0 +1,9 @@ +{ + "filter-dropdown.reset": "重置", + "filter-dropdown.search": "搜索", + "filter-dropdown.submit": "確定", + "filter-dropdown.filter": "篩選", + "filter-dropdown.gt": "大於等於", + "filter-dropdown.lt": "小於等於", + "filter-dropdown.date": "日期範圍" +} diff --git a/uni_modules/uni-table/package.json b/uni_modules/uni-table/package.json new file mode 100644 index 0000000..f224ab7 --- /dev/null +++ b/uni_modules/uni-table/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-table", + "displayName": "uni-table 表格", + "version": "1.2.1", + "description": "表格组件,多用于展示多条结构类似的数据,如", + "keywords": [ + "uni-ui", + "uniui", + "table", + "表格" +], + "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-datetime-picker"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "n", + "QQ": "y" + }, + "快应用": { + "华为": "n", + "联盟": "n" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-table/readme.md b/uni_modules/uni-table/readme.md new file mode 100644 index 0000000..bb08c79 --- /dev/null +++ b/uni_modules/uni-table/readme.md @@ -0,0 +1,13 @@ + + +## Table 表单 +> 组件名:``uni-table``,代码块: `uTable`。 + +用于展示多条结构类似的数据 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-table) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + + + diff --git a/untils/tabBar.js b/untils/tabBar.js new file mode 100644 index 0000000..f52096d --- /dev/null +++ b/untils/tabBar.js @@ -0,0 +1,61 @@ +// 主管 +const user_supervisors = [ + { + pagePath: "pages/clockIn/index", + iconPath: "../../static/image/tabbar/clockIn.png", + selectedIconPath: "../../static/image/tabbar/clockIn_check.png", + text: "打卡", + customIcon: false, + }, + { + pagePath: "pages/attendance/index", + iconPath: "../../static/image/tabbar/attendance.png", + selectedIconPath: "../../static/image/tabbar/attendance_check.png", + text: "考勤", + customIcon: false, + }, + { + pagePath: "pages/approval/index", + iconPath: "../../static/image/tabbar/approval.png", + selectedIconPath: "../../static/image/tabbar/approval_check.png", + text: "审批", + customIcon: false, + }, + { + pagePath: "pages/mine/index", + iconPath: "../../static/image/tabbar/mine.png", + selectedIconPath: "../../static/image/tabbar/mine_check.png", + text: "我的", + customIcon: false, + } +] + +// 员工 +const user_staff = [ + { + pagePath: "pages/clockIn/index", + iconPath: "../../static/image/tabbar/clockIn.png", + selectedIconPath: "../../static/image/tabbar/clockIn_check.png", + text: "打卡", + customIcon: false, + }, + { + pagePath: "pages/attendance/index", + iconPath: "../../static/image/tabbar/attendance.png", + selectedIconPath: "../../static/image/tabbar/attendance_check.png", + text: "考勤", + customIcon: false, + }, + { + pagePath: "pages/mine/index", + iconPath: "../../static/image/tabbar/mine.png", + selectedIconPath: "../../static/image/tabbar/mine_check.png", + text: "我的", + customIcon: false, + } +] + +export default { + user_supervisors, + user_staff +} \ No newline at end of file diff --git a/uview-ui/LICENSE b/uview-ui/LICENSE new file mode 100644 index 0000000..8e39ead --- /dev/null +++ b/uview-ui/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 www.uviewui.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/uview-ui/README.md b/uview-ui/README.md new file mode 100644 index 0000000..c78ff47 --- /dev/null +++ b/uview-ui/README.md @@ -0,0 +1,66 @@ +

+ logo +

+

uView 2.0

+

多平台快速开发的UI框架

+ +[![stars](https://img.shields.io/github/stars/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0) +[![forks](https://img.shields.io/github/forks/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0) +[![issues](https://img.shields.io/github/issues/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0/issues) +[![Website](https://img.shields.io/badge/uView-up-blue?style=flat-square)](https://uviewui.com) +[![release](https://img.shields.io/github/v/release/umicro/uView2.0?style=flat-square)](https://gitee.com/umicro/uView2.0/releases) +[![license](https://img.shields.io/github/license/umicro/uView2.0?style=flat-square)](https://en.wikipedia.org/wiki/MIT_License) + +## 说明 + +uView UI,是[uni-app](https://uniapp.dcloud.io/)全面兼容nvue的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水 + +## [官方文档:https://uviewui.com](https://uviewui.com) + + +## 预览 + +您可以通过**微信**扫码,查看最佳的演示效果。 +
+
+ + + +## 链接 + +- [官方文档](https://www.uviewui.com/) +- [更新日志](https://www.uviewui.com/components/changelog.html) +- [升级指南](https://www.uviewui.com/components/changeGuide.html) +- [关于我们](https://www.uviewui.com/cooperation/about.html) + +## 交流反馈 + +欢迎加入我们的QQ群交流反馈:[点此跳转](https://www.uviewui.com/components/addQQGroup.html) + +## 关于PR + +> 我们非常乐意接受各位的优质PR,但在此之前我希望您了解uView2.0是一个需要兼容多个平台的(小程序、h5、ios app、android app)包括nvue页面、vue页面。 +> 所以希望在您修复bug并提交之前尽可能的去这些平台测试一下兼容性。最好能携带测试截图以方便审核。非常感谢! + +## 安装 + +#### **uni-app插件市场链接** —— [https://ext.dcloud.net.cn/plugin?id=1593](https://ext.dcloud.net.cn/plugin?id=1593) + +请通过[官网安装文档](https://www.uviewui.com/components/install.html)了解更详细的内容 + +## 快速上手 + +请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容 + +## 使用方法 +配置easycom规则后,自动按需引入,无需`import`组件,直接引用即可。 + +```html + +``` + +## 版权信息 +uView遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将uView应用到您的产品中。 + diff --git a/uview-ui/changelog.md b/uview-ui/changelog.md new file mode 100644 index 0000000..ca50251 --- /dev/null +++ b/uview-ui/changelog.md @@ -0,0 +1,357 @@ +## 2.0.34(2022-09-25) +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. `u-input`、`u-textarea`增加`ignoreCompositionEvent`属性 +2. 修复`route`方法调用可能报错的问题 +3. 修复`u-no-network`组件`z-index`无效的问题 +4. 修复`textarea`组件在h5上confirmType=""报错的问题 +5. `u-rate`适配`nvue` +6. 优化验证手机号码的正则表达式(根据工信部发布的《电信网编号计划(2017年版)》进行修改。) +7. `form-item`添加`labelPosition`属性 +8. `u-calendar`修复`maxDate`设置为当前日期,并且当前时间大于08:00时无法显示日期列表的问题 (#724) +9. `u-radio`增加一个默认插槽用于自定义修改label内容 (#680) +10. 修复`timeFormat`函数在safari重的兼容性问题 (#664) +## 2.0.33(2022-06-17) +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 修复`loadmore`组件`lineColor`类型错误问题 +2. 修复`u-parse`组件`imgtap`、`linktap`不生效问题 +## 2.0.32(2022-06-16) +# uView2.0重磅发布,利剑出鞘,一统江湖 +1. `u-loadmore`新增自定义颜色、虚/实线 +2. 修复`u-swiper-action`组件部分平台不能上下滑动的问题 +3. 修复`u-list`回弹问题 +4. 修复`notice-bar`组件动画在低端安卓机可能会抖动的问题 +5. `u-loading-page`添加控制图标大小的属性`iconSize` +6. 修复`u-tooltip`组件`color`参数不生效的问题 +7. 修复`u--input`组件使用`blur`事件输出为`undefined`的bug +8. `u-code-input`组件新增键盘弹起时,是否自动上推页面参数`adjustPosition` +9. 修复`image`组件`load`事件无回调对象问题 +10. 修复`button`组件`loadingSize`设置无效问题 +10. 其他修复 +## 2.0.31(2022-04-19) +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 修复`upload`在`vue`页面上传成功后没有成功标志的问题 +2. 解决演示项目中微信小程序模拟上传图片一直出于上传中问题 +3. 修复`u-code-input`组件在`nvue`页面编译到`app`平台上光标异常问题(`app`去除此功能) +4. 修复`actionSheet`组件标题关闭按钮点击事件名称错误的问题 +5. 其他修复 +## 2.0.30(2022-04-04) +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. `u-rate`增加`readonly`属性 +2. `tabs`滑块支持设置背景图片 +3. 修复`u-subsection` `mode`为`subsection`时,滑块样式不正确的问题 +4. `u-code-input`添加光标效果动画 +5. 修复`popup`的`open`事件不触发 +6. 修复`u-flex-column`无效的问题 +7. 修复`u-datetime-picker`索引在特定场合异常问题 +8. 修复`u-datetime-picker`最小时间字符串模板错误问题 +9. `u-swiper`添加`m3u8`验证 +10. `u-swiper`修改判断image和video逻辑 +11. 修复`swiper`无法使用本地图片问题,增加`type`参数 +12. 修复`u-row-notice`格式错误问题 +13. 修复`u-switch`组件当`unit`为`rpx`时,`nodeStyle`消失的问题 +14. 修复`datetime-picker`组件`showToolbar`与`visibleItemCount`属性无效的问题 +15. 修复`upload`组件条件编译位置判断错误,导致`previewImage`属性设置为`false`时,整个组件都会被隐藏的问题 +16. 修复`u-checkbox-group`设置`shape`属性无效的问题 +17. 修复`u-upload`的`capture`传入字符串的时候不生效的问题 +18. 修复`u-action-sheet`组件,关闭事件逻辑错误的问题 +19. 修复`u-list`触顶事件的触发错误的问题 +20. 修复`u-text`只有手机号可拨打的问题 +21. 修复`u-textarea`不能换行的问题 +22. 其他修复 +## 2.0.29(2022-03-13) +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 修复`u--text`组件设置`decoration`属性未生效的问题 +2. 修复`u-datetime-picker`使用`formatter`后返回值不正确 +3. 修复`u-datetime-picker` `intercept` 可能为undefined +4. 修复已设置单位 uni..config.unit = 'rpx'时,线型指示器 `transform` 的位置翻倍,导致指示器超出宽度 +5. 修复mixin中bem方法生成的类名在支付宝和字节小程序中失效 +6. 修复默认值传值为空的时候,打开`u-datetime-picker`报错,不能选中第一列时间的bug +7. 修复`u-datetime-picker`使用`formatter`后返回值不正确 +8. 修复`u-image`组件`loading`无效果的问题 +9. 修复`config.unit`属性设为`rpx`时,导航栏占用高度不足导致塌陷的问题 +10. 修复`u-datetime-picker`组件`itemHeight`无效问题 +11. 其他修复 +## 2.0.28(2022-02-22) +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. search组件新增searchIconSize属性 +2. 兼容Safari/Webkit中传入时间格式如2022-02-17 12:00:56 +3. 修复text value.js 判断日期出format错误问题 +4. priceFormat格式化金额出现精度错误 +5. priceFormat在部分情况下出现精度损失问题 +6. 优化表单rules提示 +7. 修复avatar组件src为空时,展示状态不对 +8. 其他修复 +## 2.0.27(2022-01-28) +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1.样式修复 +## 2.0.26(2022-01-28) +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1.样式修复 +## 2.0.25(2022-01-27) +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 修复text组件mode=price时,可能会导致精度错误的问题 +2. 添加$u.setConfig()方法,可设置uView内置的config, props, zIndex, color属性,详见:[修改uView内置配置方案](https://uviewui.com/components/setting.html#%E9%BB%98%E8%AE%A4%E5%8D%95%E4%BD%8D%E9%85%8D%E7%BD%AE) +3. 优化form组件在errorType=toast时,如果输入错误页面会有抖动的问题 +4. 修复$u.addUnit()对配置默认单位可能无效的问题 +## 2.0.24(2022-01-25) +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 修复swiper在current指定非0时缩放有误 +2. 修复u-icon添加stop属性的时候报错 +3. 优化遗留的通过正则判断rpx单位的问题 +4. 优化Layout布局 vue使用gutter时,会超出固定区域 +5. 优化search组件高度单位问题(rpx -> px) +6. 修复u-image slot 加载和错误的图片失去了高度 +7. 修复u-index-list中footer插槽与header插槽存在性判断错误 +8. 修复部分机型下u-popup关闭时会闪烁 +9. 修复u-image在nvue-app下失去宽高 +10. 修复u-popup运行报错 +11. 修复u-tooltip报错 +12. 修复box-sizing在app下的警告 +13. 修复u-navbar在小程序中报运行时错误 +14. 其他修复 +## 2.0.23(2022-01-24) +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 修复image组件在hx3.3.9的nvue下可能会显示异常的问题 +2. 修复col组件gutter参数带rpx单位处理不正确的问题 +3. 修复text组件单行时无法显示省略号的问题 +4. navbar添加titleStyle参数 +5. 升级到hx3.3.9可消除nvue下控制台样式警告的问题 +## 2.0.22(2022-01-19) +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. $u.page()方法优化,避免在特殊场景可能报错的问题 +2. picker组件添加immediateChange参数 +3. 新增$u.pages()方法 +## 2.0.21(2022-01-19) +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 优化:form组件在用户设置rules的时候提示用户model必传 +2. 优化遗留的通过正则判断rpx单位的问题 +3. 修复微信小程序环境中tabbar组件开启safeAreaInsetBottom属性后,placeholder高度填充不正确 +4. 修复swiper在current指定非0时缩放有误 +5. 修复u-icon添加stop属性的时候报错 +6. 修复upload组件在accept=all的时候没有作用 +7. 修复在text组件mode为phone时call属性无效的问题 +8. 处理u-form clearValidate方法 +9. 其他修复 +## 2.0.20(2022-01-14) +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 修复calendar默认会选择一个日期,如果直接点确定的话,无法取到值的问题 +2. 修复Slider缺少disabled props 还有注释 +3. 修复u-notice-bar点击事件无法拿到index索引值的问题 +4. 修复u-collapse-item在vue文件下,app端自定义插槽不生效的问题 +5. 优化头像为空时显示默认头像 +6. 修复图片地址赋值后判断加载状态为完成问题 +7. 修复日历滚动到默认日期月份区域 +8. search组件暴露点击左边icon事件 +9. 修复u-form clearValidate方法不生效 +10. upload h5端增加返回文件参数(文件的name参数) +11. 处理upload选择文件后url为blob类型无法预览的问题 +12. u-code-input 修复输入框没有往左移出一半屏幕 +13. 修复Upload上传 disabled为true时,控制台报hoverClass类型错误 +14. 临时处理ios app下grid点击坍塌问题 +15. 其他修复 +## 2.0.19(2021-12-29) +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 优化微信小程序包体积可在微信中预览,请升级HbuilderX3.3.4,同时在“运行->运行到小程序模拟器”中勾选“运行时是否压缩代码” +2. 优化微信小程序setData性能,处理某些方法如$u.route()无法在模板中使用的问题 +3. navbar添加autoBack参数 +4. 允许avatar组件的事件冒泡 +5. 修复cell组件报错问题 +6. 其他修复 +## 2.0.18(2021-12-28) +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 修复app端编译报错问题 +2. 重新处理微信小程序端setData过大的性能问题 +3. 修复边框问题 +4. 修复最大最小月份不大于0则没有数据出现的问题 +5. 修复SwipeAction微信小程序端无法上下滑动问题 +6. 修复input的placeholder在小程序端默认显示为true问题 +7. 修复divider组件click事件无效问题 +8. 修复u-code-input maxlength 属性值为 String 类型时显示异常 +9. 修复当 grid只有 1到2时 在小程序端algin设置无效的问题 +10. 处理form-item的label为top时,取消错误提示的左边距 +11. 其他修复 +## 2.0.17(2021-12-26) +## uView正在参与开源中国的“年度最佳项目”评选,之前投过票的现在也可以投票,恳请同学们投一票,[点此帮助uView](https://www.oschina.net/project/top_cn_2021/?id=583) + +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 解决HBuilderX3.3.3.20211225版本导致的样式问题 +2. calendar日历添加monthNum参数 +3. navbar添加center slot +## 2.0.16(2021-12-25) +## uView正在参与开源中国的“年度最佳项目”评选,之前投过票的现在也可以投票,恳请同学们投一票,[点此帮助uView](https://www.oschina.net/project/top_cn_2021/?id=583) + +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 解决微信小程序setData性能问题 +2. 修复count-down组件change事件不触发问题 +## 2.0.15(2021-12-21) +## uView正在参与开源中国的“年度最佳项目”评选,之前投过票的现在也可以投票,恳请同学们投一票,[点此帮助uView](https://www.oschina.net/project/top_cn_2021/?id=583) + +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 修复Cell单元格titleWidth无效 +2. 修复cheakbox组件ischecked不更新 +3. 修复keyboard是否显示"."按键默认值问题 +4. 修复number-keyboard是否显示键盘的"."符号问题 +5. 修复Input输入框 readonly无效 +6. 修复u-avatar 导致打包app、H5时候报错问题 +7. 修复Upload上传deletable无效 +8. 修复upload当设置maxSize时无效的问题 +9. 修复tabs lineWidth传入带单位的字符串的时候偏移量计算错误问题 +10. 修复rate组件在有padding的view内,显示的星星位置和可触摸区域不匹配,无法正常选中星星 +## 2.0.13(2021-12-14) +## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY) + +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 修复配置默认单位为rpx可能会导致自定义导航栏高度异常的问题 +## 2.0.12(2021-12-14) +## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY) + +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 修复tabs组件在vue环境下划线消失的问题 +2. 修复upload组件在安卓小程序无法选择视频的问题 +3. 添加uni.$u.config.unit配置,用于配置参数默认单位,详见:[默认单位配置](https://www.uviewui.com/components/setting.html#%E9%BB%98%E8%AE%A4%E5%8D%95%E4%BD%8D%E9%85%8D%E7%BD%AE) +4. 修复textarea组件在没绑定v-model时,字符统计不生效问题 +5. 修复nvue下控制是否出现滚动条失效问题 +## 2.0.11(2021-12-13) +## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY) + +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. text组件align参数无效的问题 +2. subsection组件添加keyName参数 +3. upload组件无法判断[Object file]类型的问题 +4. 处理notify层级过低问题 +5. codeInput组件添加disabledDot参数 +6. 处理actionSheet组件round参数无效的问题 +7. calendar组件添加round参数用于控制圆角值 +8. 处理swipeAction组件在vue环境下默认被打开的问题 +9. button组件的throttleTime节流参数无效的问题 +10. 解决u-notify手动关闭方法close()无效的问题 +11. input组件readonly不生效问题 +12. tag组件type参数为info不生效问题 +## 2.0.10(2021-12-08) +## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY) + +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 修复button sendMessagePath属性不生效 +2. 修复DatetimePicker选择器title无效 +3. 修复u-toast设置loading=true不生效 +4. 修复u-text金额模式传0报错 +5. 修复u-toast组件的icon属性配置不生效 +6. button的icon在特殊场景下的颜色优化 +7. IndexList优化,增加# +## 2.0.9(2021-12-01) +## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 优化swiper的height支持100%值(仅vue有效),修复嵌入视频时click事件无法触发的问题 +2. 优化tabs组件对list值为空的判断,或者动态变化list时重新计算相关尺寸的问题 +3. 优化datetime-picker组件逻辑,让其后续打开的默认值为上一次的选中值,需要通过v-model绑定值才有效 +4. 修复upload内嵌在其他组件中,选择图片可能不会换行的问题 +## 2.0.8(2021-12-01) +## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 修复toast的position参数无效问题 +2. 处理input在ios nvue上无法获得焦点的问题 +3. avatar-group组件添加extraValue参数,让剩余展示数量可手动控制 +4. tabs组件添加keyName参数用于配置从对象中读取的键名 +5. 处理text组件名字脱敏默认配置无效的问题 +6. 处理picker组件item文本太长换行问题 +## 2.0.7(2021-11-30) +## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 修复radio和checkbox动态改变v-model无效的问题。 +2. 优化form规则validator在微信小程序用法 +3. 修复backtop组件mode参数在微信小程序无效的问题 +4. 处理Album的previewFullImage属性无效的问题 +5. 处理u-datetime-picker组件mode='time'在选择改变时间时,控制台报错的问题 +## 2.0.6(2021-11-27) +## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. 处理tag组件在vue下边框无效的问题。 +2. 处理popup组件圆角参数可能无效的问题。 +3. 处理tabs组件lineColor参数可能无效的问题。 +4. propgress组件在值很小时,显示异常的问题。 +## 2.0.5(2021-11-25) +## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. calendar在vue下显示异常问题。 +2. form组件labelPosition和errorType参数无效的问题 +3. input组件inputAlign无效的问题 +4. 其他一些修复 +## 2.0.4(2021-11-23) +## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0重磅发布,利剑出鞘,一统江湖 + +0. input组件缺失@confirm事件,以及subfix和prefix无效问题 +1. component.scss文件样式在vue下干扰全局布局问题 +2. 修复subsection在vue环境下表现异常的问题 +3. tag组件的bgColor等参数无效的问题 +4. upload组件不换行的问题 +5. 其他的一些修复处理 +## 2.0.3(2021-11-16) +## [点击加群交流反馈:1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. uView2.0已实现全面兼容nvue +2. uView2.0对1.x进行了架构重构,细节和性能都有极大提升 +3. 目前uView2.0为公测阶段,相关细节可能会有变动 +4. 我们写了一份与1.x的对比指南,详见[对比1.x](https://www.uviewui.com/components/diff1.x.html) +5. 处理modal的confirm回调事件拼写错误问题 +6. 处理input组件@input事件参数错误问题 +7. 其他一些修复 +## 2.0.2(2021-11-16) +## [点击加群交流反馈:1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. uView2.0已实现全面兼容nvue +2. uView2.0对1.x进行了架构重构,细节和性能都有极大提升 +3. 目前uView2.0为公测阶段,相关细节可能会有变动 +4. 我们写了一份与1.x的对比指南,详见[对比1.x](https://www.uviewui.com/components/diff1.x.html) +5. 修复input组件formatter参数缺失问题 +6. 优化loading-icon组件的scss写法问题,防止不兼容新版本scss +## 2.0.0(2020-11-15) +## [点击加群交流反馈:1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU) + +# uView2.0重磅发布,利剑出鞘,一统江湖 + +1. uView2.0已实现全面兼容nvue +2. uView2.0对1.x进行了架构重构,细节和性能都有极大提升 +3. 目前uView2.0为公测阶段,相关细节可能会有变动 +4. 我们写了一份与1.x的对比指南,详见[对比1.x](https://www.uviewui.com/components/diff1.x.html) +5. 修复input组件formatter参数缺失问题 + + diff --git a/uview-ui/components/u--form/u--form.vue b/uview-ui/components/u--form/u--form.vue new file mode 100644 index 0000000..fdfc212 --- /dev/null +++ b/uview-ui/components/u--form/u--form.vue @@ -0,0 +1,78 @@ + + + diff --git a/uview-ui/components/u--image/u--image.vue b/uview-ui/components/u--image/u--image.vue new file mode 100644 index 0000000..21b7ab1 --- /dev/null +++ b/uview-ui/components/u--image/u--image.vue @@ -0,0 +1,47 @@ + + + \ No newline at end of file diff --git a/uview-ui/components/u--input/u--input.vue b/uview-ui/components/u--input/u--input.vue new file mode 100644 index 0000000..1e58b01 --- /dev/null +++ b/uview-ui/components/u--input/u--input.vue @@ -0,0 +1,73 @@ + + + \ No newline at end of file diff --git a/uview-ui/components/u--text/u--text.vue b/uview-ui/components/u--text/u--text.vue new file mode 100644 index 0000000..44ee52a --- /dev/null +++ b/uview-ui/components/u--text/u--text.vue @@ -0,0 +1,44 @@ + + + diff --git a/uview-ui/components/u--textarea/u--textarea.vue b/uview-ui/components/u--textarea/u--textarea.vue new file mode 100644 index 0000000..f4df0b9 --- /dev/null +++ b/uview-ui/components/u--textarea/u--textarea.vue @@ -0,0 +1,48 @@ + + + diff --git a/uview-ui/components/u-action-sheet/props.js b/uview-ui/components/u-action-sheet/props.js new file mode 100644 index 0000000..e96e04f --- /dev/null +++ b/uview-ui/components/u-action-sheet/props.js @@ -0,0 +1,54 @@ +export default { + props: { + // 操作菜单是否展示 (默认false) + show: { + type: Boolean, + default: uni.$u.props.actionSheet.show + }, + // 标题 + title: { + type: String, + default: uni.$u.props.actionSheet.title + }, + // 选项上方的描述信息 + description: { + type: String, + default: uni.$u.props.actionSheet.description + }, + // 数据 + actions: { + type: Array, + default: uni.$u.props.actionSheet.actions + }, + // 取消按钮的文字,不为空时显示按钮 + cancelText: { + type: String, + default: uni.$u.props.actionSheet.cancelText + }, + // 点击某个菜单项时是否关闭弹窗 + closeOnClickAction: { + type: Boolean, + default: uni.$u.props.actionSheet.closeOnClickAction + }, + // 处理底部安全区(默认true) + safeAreaInsetBottom: { + type: Boolean, + default: uni.$u.props.actionSheet.safeAreaInsetBottom + }, + // 小程序的打开方式 + openType: { + type: String, + default: uni.$u.props.actionSheet.openType + }, + // 点击遮罩是否允许关闭 (默认true) + closeOnClickOverlay: { + type: Boolean, + default: uni.$u.props.actionSheet.closeOnClickOverlay + }, + // 圆角值 + round: { + type: [Boolean, String, Number], + default: uni.$u.props.actionSheet.round + } + } +} diff --git a/uview-ui/components/u-action-sheet/u-action-sheet.vue b/uview-ui/components/u-action-sheet/u-action-sheet.vue new file mode 100644 index 0000000..26d5d8d --- /dev/null +++ b/uview-ui/components/u-action-sheet/u-action-sheet.vue @@ -0,0 +1,278 @@ + + + + + + diff --git a/uview-ui/components/u-album/props.js b/uview-ui/components/u-album/props.js new file mode 100644 index 0000000..75cdb37 --- /dev/null +++ b/uview-ui/components/u-album/props.js @@ -0,0 +1,59 @@ +export default { + props: { + // 图片地址,Array|Array形式 + urls: { + type: Array, + default: uni.$u.props.album.urls + }, + // 指定从数组的对象元素中读取哪个属性作为图片地址 + keyName: { + type: String, + default: uni.$u.props.album.keyName + }, + // 单图时,图片长边的长度 + singleSize: { + type: [String, Number], + default: uni.$u.props.album.singleSize + }, + // 多图时,图片边长 + multipleSize: { + type: [String, Number], + default: uni.$u.props.album.multipleSize + }, + // 多图时,图片水平和垂直之间的间隔 + space: { + type: [String, Number], + default: uni.$u.props.album.space + }, + // 单图时,图片缩放裁剪的模式 + singleMode: { + type: String, + default: uni.$u.props.album.singleMode + }, + // 多图时,图片缩放裁剪的模式 + multipleMode: { + type: String, + default: uni.$u.props.album.multipleMode + }, + // 最多展示的图片数量,超出时最后一个位置将会显示剩余图片数量 + maxCount: { + type: [String, Number], + default: uni.$u.props.album.maxCount + }, + // 是否可以预览图片 + previewFullImage: { + type: Boolean, + default: uni.$u.props.album.previewFullImage + }, + // 每行展示图片数量,如设置,singleSize和multipleSize将会无效 + rowCount: { + type: [String, Number], + default: uni.$u.props.album.rowCount + }, + // 超出maxCount时是否显示查看更多的提示 + showMore: { + type: Boolean, + default: uni.$u.props.album.showMore + } + } +} diff --git a/uview-ui/components/u-album/u-album.vue b/uview-ui/components/u-album/u-album.vue new file mode 100644 index 0000000..687e2d5 --- /dev/null +++ b/uview-ui/components/u-album/u-album.vue @@ -0,0 +1,259 @@ + + + + + \ No newline at end of file diff --git a/uview-ui/components/u-alert/props.js b/uview-ui/components/u-alert/props.js new file mode 100644 index 0000000..4297e2c --- /dev/null +++ b/uview-ui/components/u-alert/props.js @@ -0,0 +1,44 @@ +export default { + props: { + // 显示文字 + title: { + type: String, + default: uni.$u.props.alert.title + }, + // 主题,success/warning/info/error + type: { + type: String, + default: uni.$u.props.alert.type + }, + // 辅助性文字 + description: { + type: String, + default: uni.$u.props.alert.description + }, + // 是否可关闭 + closable: { + type: Boolean, + default: uni.$u.props.alert.closable + }, + // 是否显示图标 + showIcon: { + type: Boolean, + default: uni.$u.props.alert.showIcon + }, + // 浅或深色调,light-浅色,dark-深色 + effect: { + type: String, + default: uni.$u.props.alert.effect + }, + // 文字是否居中 + center: { + type: Boolean, + default: uni.$u.props.alert.center + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: uni.$u.props.alert.fontSize + } + } +} diff --git a/uview-ui/components/u-alert/u-alert.vue b/uview-ui/components/u-alert/u-alert.vue new file mode 100644 index 0000000..81f7d43 --- /dev/null +++ b/uview-ui/components/u-alert/u-alert.vue @@ -0,0 +1,243 @@ + + + + + diff --git a/uview-ui/components/u-avatar-group/props.js b/uview-ui/components/u-avatar-group/props.js new file mode 100644 index 0000000..58b42ac --- /dev/null +++ b/uview-ui/components/u-avatar-group/props.js @@ -0,0 +1,52 @@ +export default { + props: { + // 头像图片组 + urls: { + type: Array, + default: uni.$u.props.avatarGroup.urls + }, + // 最多展示的头像数量 + maxCount: { + type: [String, Number], + default: uni.$u.props.avatarGroup.maxCount + }, + // 头像形状 + shape: { + type: String, + default: uni.$u.props.avatarGroup.shape + }, + // 图片裁剪模式 + mode: { + type: String, + default: uni.$u.props.avatarGroup.mode + }, + // 超出maxCount时是否显示查看更多的提示 + showMore: { + type: Boolean, + default: uni.$u.props.avatarGroup.showMore + }, + // 头像大小 + size: { + type: [String, Number], + default: uni.$u.props.avatarGroup.size + }, + // 指定从数组的对象元素中读取哪个属性作为图片地址 + keyName: { + type: String, + default: uni.$u.props.avatarGroup.keyName + }, + // 头像之间的遮挡比例 + gap: { + type: [String, Number], + validator(value) { + return value >= 0 && value <= 1 + }, + default: uni.$u.props.avatarGroup.gap + }, + // 需额外显示的值 + extraValue: { + type: [Number, String], + default: uni.$u.props.avatarGroup.extraValue + } + } +} diff --git a/uview-ui/components/u-avatar-group/u-avatar-group.vue b/uview-ui/components/u-avatar-group/u-avatar-group.vue new file mode 100644 index 0000000..7e996d7 --- /dev/null +++ b/uview-ui/components/u-avatar-group/u-avatar-group.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/uview-ui/components/u-avatar/props.js b/uview-ui/components/u-avatar/props.js new file mode 100644 index 0000000..34ca0f2 --- /dev/null +++ b/uview-ui/components/u-avatar/props.js @@ -0,0 +1,78 @@ +export default { + props: { + // 头像图片路径(不能为相对路径) + src: { + type: String, + default: uni.$u.props.avatar.src + }, + // 头像形状,circle-圆形,square-方形 + shape: { + type: String, + default: uni.$u.props.avatar.shape + }, + // 头像尺寸 + size: { + type: [String, Number], + default: uni.$u.props.avatar.size + }, + // 裁剪模式 + mode: { + type: String, + default: uni.$u.props.avatar.mode + }, + // 显示的文字 + text: { + type: String, + default: uni.$u.props.avatar.text + }, + // 背景色 + bgColor: { + type: String, + default: uni.$u.props.avatar.bgColor + }, + // 文字颜色 + color: { + type: String, + default: uni.$u.props.avatar.color + }, + // 文字大小 + fontSize: { + type: [String, Number], + default: uni.$u.props.avatar.fontSize + }, + // 显示的图标 + icon: { + type: String, + default: uni.$u.props.avatar.icon + }, + // 显示小程序头像,只对百度,微信,QQ小程序有效 + mpAvatar: { + type: Boolean, + default: uni.$u.props.avatar.mpAvatar + }, + // 是否使用随机背景色 + randomBgColor: { + type: Boolean, + default: uni.$u.props.avatar.randomBgColor + }, + // 加载失败的默认头像(组件有内置默认图片) + defaultUrl: { + type: String, + default: uni.$u.props.avatar.defaultUrl + }, + // 如果配置了randomBgColor为true,且配置了此值,则从默认的背景色数组中取出对应索引的颜色值,取值0-19之间 + colorIndex: { + type: [String, Number], + // 校验参数规则,索引在0-19之间 + validator(n) { + return uni.$u.test.range(n, [0, 19]) || n === '' + }, + default: uni.$u.props.avatar.colorIndex + }, + // 组件标识符 + name: { + type: String, + default: uni.$u.props.avatar.name + } + } +} diff --git a/uview-ui/components/u-avatar/u-avatar.vue b/uview-ui/components/u-avatar/u-avatar.vue new file mode 100644 index 0000000..3319be5 --- /dev/null +++ b/uview-ui/components/u-avatar/u-avatar.vue @@ -0,0 +1,172 @@ + + + + + diff --git a/uview-ui/components/u-back-top/props.js b/uview-ui/components/u-back-top/props.js new file mode 100644 index 0000000..6c702c2 --- /dev/null +++ b/uview-ui/components/u-back-top/props.js @@ -0,0 +1,54 @@ +export default { + props: { + // 返回顶部的形状,circle-圆形,square-方形 + mode: { + type: String, + default: uni.$u.props.backtop.mode + }, + // 自定义图标 + icon: { + type: String, + default: uni.$u.props.backtop.icon + }, + // 提示文字 + text: { + type: String, + default: uni.$u.props.backtop.text + }, + // 返回顶部滚动时间 + duration: { + type: [String, Number], + default: uni.$u.props.backtop.duration + }, + // 滚动距离 + scrollTop: { + type: [String, Number], + default: uni.$u.props.backtop.scrollTop + }, + // 距离顶部多少距离显示,单位px + top: { + type: [String, Number], + default: uni.$u.props.backtop.top + }, + // 返回顶部按钮到底部的距离,单位px + bottom: { + type: [String, Number], + default: uni.$u.props.backtop.bottom + }, + // 返回顶部按钮到右边的距离,单位px + right: { + type: [String, Number], + default: uni.$u.props.backtop.right + }, + // 层级 + zIndex: { + type: [String, Number], + default: uni.$u.props.backtop.zIndex + }, + // 图标的样式,对象形式 + iconStyle: { + type: Object, + default: uni.$u.props.backtop.iconStyle + } + } +} diff --git a/uview-ui/components/u-back-top/u-back-top.vue b/uview-ui/components/u-back-top/u-back-top.vue new file mode 100644 index 0000000..2d07566 --- /dev/null +++ b/uview-ui/components/u-back-top/u-back-top.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/uview-ui/components/u-badge/props.js b/uview-ui/components/u-badge/props.js new file mode 100644 index 0000000..74c032c --- /dev/null +++ b/uview-ui/components/u-badge/props.js @@ -0,0 +1,72 @@ +export default { + props: { + // 是否显示圆点 + isDot: { + type: Boolean, + default: uni.$u.props.badge.isDot + }, + // 显示的内容 + value: { + type: [Number, String], + default: uni.$u.props.badge.value + }, + // 是否显示 + show: { + type: Boolean, + default: uni.$u.props.badge.show + }, + // 最大值,超过最大值会显示 '{max}+' + max: { + type: [Number, String], + default: uni.$u.props.badge.max + }, + // 主题类型,error|warning|success|primary + type: { + type: String, + default: uni.$u.props.badge.type + }, + // 当数值为 0 时,是否展示 Badge + showZero: { + type: Boolean, + default: uni.$u.props.badge.showZero + }, + // 背景颜色,优先级比type高,如设置,type参数会失效 + bgColor: { + type: [String, null], + default: uni.$u.props.badge.bgColor + }, + // 字体颜色 + color: { + type: [String, null], + default: uni.$u.props.badge.color + }, + // 徽标形状,circle-四角均为圆角,horn-左下角为直角 + shape: { + type: String, + default: uni.$u.props.badge.shape + }, + // 设置数字的显示方式,overflow|ellipsis|limit + // overflow会根据max字段判断,超出显示`${max}+` + // ellipsis会根据max判断,超出显示`${max}...` + // limit会依据1000作为判断条件,超出1000,显示`${value/1000}K`,比如2.2k、3.34w,最多保留2位小数 + numberType: { + type: String, + default: uni.$u.props.badge.numberType + }, + // 设置badge的位置偏移,格式为 [x, y],也即设置的为top和right的值,absolute为true时有效 + offset: { + type: Array, + default: uni.$u.props.badge.offset + }, + // 是否反转背景和字体颜色 + inverted: { + type: Boolean, + default: uni.$u.props.badge.inverted + }, + // 是否绝对定位 + absolute: { + type: Boolean, + default: uni.$u.props.badge.absolute + } + } +} diff --git a/uview-ui/components/u-badge/u-badge.vue b/uview-ui/components/u-badge/u-badge.vue new file mode 100644 index 0000000..53cfc81 --- /dev/null +++ b/uview-ui/components/u-badge/u-badge.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/uview-ui/components/u-button/nvue.scss b/uview-ui/components/u-button/nvue.scss new file mode 100644 index 0000000..490db7d --- /dev/null +++ b/uview-ui/components/u-button/nvue.scss @@ -0,0 +1,46 @@ +$u-button-active-opacity:0.75 !default; +$u-button-loading-text-margin-left:4px !default; +$u-button-text-color: #FFFFFF !default; +$u-button-text-plain-error-color:$u-error !default; +$u-button-text-plain-warning-color:$u-warning !default; +$u-button-text-plain-success-color:$u-success !default; +$u-button-text-plain-info-color:$u-info !default; +$u-button-text-plain-primary-color:$u-primary !default; +.u-button { + &--active { + opacity: $u-button-active-opacity; + } + + &--active--plain { + background-color: rgb(217, 217, 217); + } + + &__loading-text { + margin-left:$u-button-loading-text-margin-left; + } + + &__text, + &__loading-text { + color:$u-button-text-color; + } + + &__text--plain--error { + color:$u-button-text-plain-error-color; + } + + &__text--plain--warning { + color:$u-button-text-plain-warning-color; + } + + &__text--plain--success{ + color:$u-button-text-plain-success-color; + } + + &__text--plain--info { + color:$u-button-text-plain-info-color; + } + + &__text--plain--primary { + color:$u-button-text-plain-primary-color; + } +} \ No newline at end of file diff --git a/uview-ui/components/u-button/props.js b/uview-ui/components/u-button/props.js new file mode 100644 index 0000000..07fd844 --- /dev/null +++ b/uview-ui/components/u-button/props.js @@ -0,0 +1,161 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-16 10:04:04 + * @LastAuthor : LQ + * @lastTime : 2021-08-16 10:04:24 + * @FilePath : /u-view2.0/uview-ui/components/u-button/props.js + */ +export default { + props: { + // 是否细边框 + hairline: { + type: Boolean, + default: uni.$u.props.button.hairline + }, + // 按钮的预置样式,info,primary,error,warning,success + type: { + type: String, + default: uni.$u.props.button.type + }, + // 按钮尺寸,large,normal,small,mini + size: { + type: String, + default: uni.$u.props.button.size + }, + // 按钮形状,circle(两边为半圆),square(带圆角) + shape: { + type: String, + default: uni.$u.props.button.shape + }, + // 按钮是否镂空 + plain: { + type: Boolean, + default: uni.$u.props.button.plain + }, + // 是否禁止状态 + disabled: { + type: Boolean, + default: uni.$u.props.button.disabled + }, + // 是否加载中 + loading: { + type: Boolean, + default: uni.$u.props.button.loading + }, + // 加载中提示文字 + loadingText: { + type: [String, Number], + default: uni.$u.props.button.loadingText + }, + // 加载状态图标类型 + loadingMode: { + type: String, + default: uni.$u.props.button.loadingMode + }, + // 加载图标大小 + loadingSize: { + type: [String, Number], + default: uni.$u.props.button.loadingSize + }, + // 开放能力,具体请看uniapp稳定关于button组件部分说明 + // https://uniapp.dcloud.io/component/button + openType: { + type: String, + default: uni.$u.props.button.openType + }, + // 用于
组件,点击分别会触发 组件的 submit/reset 事件 + // 取值为submit(提交表单),reset(重置表单) + formType: { + type: String, + default: uni.$u.props.button.formType + }, + // 打开 APP 时,向 APP 传递的参数,open-type=launchApp时有效 + // 只微信小程序、QQ小程序有效 + appParameter: { + type: String, + default: uni.$u.props.button.appParameter + }, + // 指定是否阻止本节点的祖先节点出现点击态,微信小程序有效 + hoverStopPropagation: { + type: Boolean, + default: uni.$u.props.button.hoverStopPropagation + }, + // 指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文。只微信小程序有效 + lang: { + type: String, + default: uni.$u.props.button.lang + }, + // 会话来源,open-type="contact"时有效。只微信小程序有效 + sessionFrom: { + type: String, + default: uni.$u.props.button.sessionFrom + }, + // 会话内消息卡片标题,open-type="contact"时有效 + // 默认当前标题,只微信小程序有效 + sendMessageTitle: { + type: String, + default: uni.$u.props.button.sendMessageTitle + }, + // 会话内消息卡片点击跳转小程序路径,open-type="contact"时有效 + // 默认当前分享路径,只微信小程序有效 + sendMessagePath: { + type: String, + default: uni.$u.props.button.sendMessagePath + }, + // 会话内消息卡片图片,open-type="contact"时有效 + // 默认当前页面截图,只微信小程序有效 + sendMessageImg: { + type: String, + default: uni.$u.props.button.sendMessageImg + }, + // 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示, + // 用户点击后可以快速发送小程序消息,open-type="contact"时有效 + showMessageCard: { + type: Boolean, + default: uni.$u.props.button.showMessageCard + }, + // 额外传参参数,用于小程序的data-xxx属性,通过target.dataset.name获取 + dataName: { + type: String, + default: uni.$u.props.button.dataName + }, + // 节流,一定时间内只能触发一次 + throttleTime: { + type: [String, Number], + default: uni.$u.props.button.throttleTime + }, + // 按住后多久出现点击态,单位毫秒 + hoverStartTime: { + type: [String, Number], + default: uni.$u.props.button.hoverStartTime + }, + // 手指松开后点击态保留时间,单位毫秒 + hoverStayTime: { + type: [String, Number], + default: uni.$u.props.button.hoverStayTime + }, + // 按钮文字,之所以通过props传入,是因为slot传入的话 + // nvue中无法控制文字的样式 + text: { + type: [String, Number], + default: uni.$u.props.button.text + }, + // 按钮图标 + icon: { + type: String, + default: uni.$u.props.button.icon + }, + // 按钮图标 + iconColor: { + type: String, + default: uni.$u.props.button.icon + }, + // 按钮颜色,支持传入linear-gradient渐变色 + color: { + type: String, + default: uni.$u.props.button.color + } + } +} diff --git a/uview-ui/components/u-button/u-button.vue b/uview-ui/components/u-button/u-button.vue new file mode 100644 index 0000000..5494351 --- /dev/null +++ b/uview-ui/components/u-button/u-button.vue @@ -0,0 +1,490 @@ + + + + + diff --git a/uview-ui/components/u-button/vue.scss b/uview-ui/components/u-button/vue.scss new file mode 100644 index 0000000..32019b2 --- /dev/null +++ b/uview-ui/components/u-button/vue.scss @@ -0,0 +1,80 @@ +// nvue下hover-class无效 +$u-button-before-top:50% !default; +$u-button-before-left:50% !default; +$u-button-before-width:100% !default; +$u-button-before-height:100% !default; +$u-button-before-transform:translate(-50%, -50%) !default; +$u-button-before-opacity:0 !default; +$u-button-before-background-color:#000 !default; +$u-button-before-border-color:#000 !default; +$u-button-active-before-opacity:.15 !default; +$u-button-icon-margin-left:4px !default; +$u-button-plain-u-button-info-color:$u-info; +$u-button-plain-u-button-success-color:$u-success; +$u-button-plain-u-button-error-color:$u-error; +$u-button-plain-u-button-warning-color:$u-error; + +.u-button { + width: 100%; + + &__text { + white-space: nowrap; + line-height: 1; + } + + &:before { + position: absolute; + top:$u-button-before-top; + left:$u-button-before-left; + width:$u-button-before-width; + height:$u-button-before-height; + border: inherit; + border-radius: inherit; + transform:$u-button-before-transform; + opacity:$u-button-before-opacity; + content: " "; + background-color:$u-button-before-background-color; + border-color:$u-button-before-border-color; + } + + &--active { + &:before { + opacity: .15 + } + } + + &__icon+&__text:not(:empty), + &__loading-text { + margin-left:$u-button-icon-margin-left; + } + + &--plain { + &.u-button--primary { + color: $u-primary; + } + } + + &--plain { + &.u-button--info { + color:$u-button-plain-u-button-info-color; + } + } + + &--plain { + &.u-button--success { + color:$u-button-plain-u-button-success-color; + } + } + + &--plain { + &.u-button--error { + color:$u-button-plain-u-button-error-color; + } + } + + &--plain { + &.u-button--warning { + color:$u-button-plain-u-button-warning-color; + } + } +} diff --git a/uview-ui/components/u-calendar/header.vue b/uview-ui/components/u-calendar/header.vue new file mode 100644 index 0000000..dc4f7d0 --- /dev/null +++ b/uview-ui/components/u-calendar/header.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/uview-ui/components/u-calendar/month.vue b/uview-ui/components/u-calendar/month.vue new file mode 100644 index 0000000..c20937f --- /dev/null +++ b/uview-ui/components/u-calendar/month.vue @@ -0,0 +1,579 @@ + + + + + diff --git a/uview-ui/components/u-calendar/props.js b/uview-ui/components/u-calendar/props.js new file mode 100644 index 0000000..2ad7bc7 --- /dev/null +++ b/uview-ui/components/u-calendar/props.js @@ -0,0 +1,144 @@ +export default { + props: { + // 日历顶部标题 + title: { + type: String, + default: uni.$u.props.calendar.title + }, + // 是否显示标题 + showTitle: { + type: Boolean, + default: uni.$u.props.calendar.showTitle + }, + // 是否显示副标题 + showSubtitle: { + type: Boolean, + default: uni.$u.props.calendar.showSubtitle + }, + // 日期类型选择,single-选择单个日期,multiple-可以选择多个日期,range-选择日期范围 + mode: { + type: String, + default: uni.$u.props.calendar.mode + }, + // mode=range时,第一个日期底部的提示文字 + startText: { + type: String, + default: uni.$u.props.calendar.startText + }, + // mode=range时,最后一个日期底部的提示文字 + endText: { + type: String, + default: uni.$u.props.calendar.endText + }, + // 自定义列表 + customList: { + type: Array, + default: uni.$u.props.calendar.customList + }, + // 主题色,对底部按钮和选中日期有效 + color: { + type: String, + default: uni.$u.props.calendar.color + }, + // 最小的可选日期 + minDate: { + type: [String, Number], + default: uni.$u.props.calendar.minDate + }, + // 最大可选日期 + maxDate: { + type: [String, Number], + default: uni.$u.props.calendar.maxDate + }, + // 默认选中的日期,mode为multiple或range是必须为数组格式 + defaultDate: { + type: [Array, String, Date, null], + default: uni.$u.props.calendar.defaultDate + }, + // mode=multiple时,最多可选多少个日期 + maxCount: { + type: [String, Number], + default: uni.$u.props.calendar.maxCount + }, + // 日期行高 + rowHeight: { + type: [String, Number], + default: uni.$u.props.calendar.rowHeight + }, + // 日期格式化函数 + formatter: { + type: [Function, null], + default: uni.$u.props.calendar.formatter + }, + // 是否显示农历 + showLunar: { + type: Boolean, + default: uni.$u.props.calendar.showLunar + }, + // 是否显示月份背景色 + showMark: { + type: Boolean, + default: uni.$u.props.calendar.showMark + }, + // 确定按钮的文字 + confirmText: { + type: String, + default: uni.$u.props.calendar.confirmText + }, + // 确认按钮处于禁用状态时的文字 + confirmDisabledText: { + type: String, + default: uni.$u.props.calendar.confirmDisabledText + }, + // 是否显示日历弹窗 + show: { + type: Boolean, + default: uni.$u.props.calendar.show + }, + // 是否允许点击遮罩关闭日历 + closeOnClickOverlay: { + type: Boolean, + default: uni.$u.props.calendar.closeOnClickOverlay + }, + // 是否为只读状态,只读状态下禁止选择日期 + readonly: { + type: Boolean, + default: uni.$u.props.calendar.readonly + }, + // 是否展示确认按钮 + showConfirm: { + type: Boolean, + default: uni.$u.props.calendar.showConfirm + }, + // 日期区间最多可选天数,默认无限制,mode = range时有效 + maxRange: { + type: [Number, String], + default: uni.$u.props.calendar.maxRange + }, + // 范围选择超过最多可选天数时的提示文案,mode = range时有效 + rangePrompt: { + type: String, + default: uni.$u.props.calendar.rangePrompt + }, + // 范围选择超过最多可选天数时,是否展示提示文案,mode = range时有效 + showRangePrompt: { + type: Boolean, + default: uni.$u.props.calendar.showRangePrompt + }, + // 是否允许日期范围的起止时间为同一天,mode = range时有效 + allowSameDay: { + type: Boolean, + default: uni.$u.props.calendar.allowSameDay + }, + // 圆角值 + round: { + type: [Boolean, String, Number], + default: uni.$u.props.calendar.round + }, + // 最多展示月份数量 + monthNum: { + type: [Number, String], + default: 3 + } + } +} diff --git a/uview-ui/components/u-calendar/u-calendar.vue b/uview-ui/components/u-calendar/u-calendar.vue new file mode 100644 index 0000000..511f993 --- /dev/null +++ b/uview-ui/components/u-calendar/u-calendar.vue @@ -0,0 +1,384 @@ + + + + + diff --git a/uview-ui/components/u-calendar/util.js b/uview-ui/components/u-calendar/util.js new file mode 100644 index 0000000..ca4736b --- /dev/null +++ b/uview-ui/components/u-calendar/util.js @@ -0,0 +1,85 @@ +export default { + methods: { + // 设置月份数据 + setMonth() { + // 月初是周几 + const day = dayjs(this.date).date(1).day() + const start = day == 0 ? 6 : day - 1 + + // 本月天数 + const days = dayjs(this.date).endOf('month').format('D') + + // 上个月天数 + const prevDays = dayjs(this.date).endOf('month').subtract(1, 'month').format('D') + + // 日期数据 + const arr = [] + // 清空表格 + this.month = [] + + // 添加上月数据 + arr.push( + ...new Array(start).fill(1).map((e, i) => { + const day = prevDays - start + i + 1 + + return { + value: day, + disabled: true, + date: dayjs(this.date).subtract(1, 'month').date(day).format('YYYY-MM-DD') + } + }) + ) + + // 添加本月数据 + arr.push( + ...new Array(days - 0).fill(1).map((e, i) => { + const day = i + 1 + + return { + value: day, + date: dayjs(this.date).date(day).format('YYYY-MM-DD') + } + }) + ) + + // 添加下个月 + arr.push( + ...new Array(42 - days - start).fill(1).map((e, i) => { + const day = i + 1 + + return { + value: day, + disabled: true, + date: dayjs(this.date).add(1, 'month').date(day).format('YYYY-MM-DD') + } + }) + ) + + // 分割数组 + for (let n = 0; n < arr.length; n += 7) { + this.month.push( + arr.slice(n, n + 7).map((e, i) => { + e.index = i + n + + // 自定义信息 + const custom = this.customList.find((c) => c.date == e.date) + + // 农历 + if (this.lunar) { + const { + IDayCn, + IMonthCn + } = this.getLunar(e.date) + e.lunar = IDayCn == '初一' ? IMonthCn : IDayCn + } + + return { + ...e, + ...custom + } + }) + ) + } + } + } +} diff --git a/uview-ui/components/u-car-keyboard/props.js b/uview-ui/components/u-car-keyboard/props.js new file mode 100644 index 0000000..3553647 --- /dev/null +++ b/uview-ui/components/u-car-keyboard/props.js @@ -0,0 +1,14 @@ +export default { + props: { + // 是否打乱键盘按键的顺序 + random: { + type: Boolean, + default: false + }, + // 输入一个中文后,是否自动切换到英文 + autoChange: { + type: Boolean, + default: false + } + } +} diff --git a/uview-ui/components/u-car-keyboard/u-car-keyboard.vue b/uview-ui/components/u-car-keyboard/u-car-keyboard.vue new file mode 100644 index 0000000..51175b5 --- /dev/null +++ b/uview-ui/components/u-car-keyboard/u-car-keyboard.vue @@ -0,0 +1,311 @@ + + + + + diff --git a/uview-ui/components/u-cell-group/props.js b/uview-ui/components/u-cell-group/props.js new file mode 100644 index 0000000..350ef40 --- /dev/null +++ b/uview-ui/components/u-cell-group/props.js @@ -0,0 +1,14 @@ +export default { + props: { + // 分组标题 + title: { + type: String, + default: uni.$u.props.cellGroup.title + }, + // 是否显示外边框 + border: { + type: Boolean, + default: uni.$u.props.cellGroup.border + } + } +} diff --git a/uview-ui/components/u-cell-group/u-cell-group.vue b/uview-ui/components/u-cell-group/u-cell-group.vue new file mode 100644 index 0000000..a9508c0 --- /dev/null +++ b/uview-ui/components/u-cell-group/u-cell-group.vue @@ -0,0 +1,61 @@ + + + + + + diff --git a/uview-ui/components/u-cell/props.js b/uview-ui/components/u-cell/props.js new file mode 100644 index 0000000..da03330 --- /dev/null +++ b/uview-ui/components/u-cell/props.js @@ -0,0 +1,110 @@ +export default { + props: { + // 标题 + title: { + type: [String, Number], + default: uni.$u.props.cell.title + }, + // 标题下方的描述信息 + label: { + type: [String, Number], + default: uni.$u.props.cell.label + }, + // 右侧的内容 + value: { + type: [String, Number], + default: uni.$u.props.cell.value + }, + // 左侧图标名称,或者图片链接(本地文件建议使用绝对地址) + icon: { + type: String, + default: uni.$u.props.cell.icon + }, + // 是否禁用cell + disabled: { + type: Boolean, + default: uni.$u.props.cell.disabled + }, + // 是否显示下边框 + border: { + type: Boolean, + default: uni.$u.props.cell.border + }, + // 内容是否垂直居中(主要是针对右侧的value部分) + center: { + type: Boolean, + default: uni.$u.props.cell.center + }, + // 点击后跳转的URL地址 + url: { + type: String, + default: uni.$u.props.cell.url + }, + // 链接跳转的方式,内部使用的是uView封装的route方法,可能会进行拦截操作 + linkType: { + type: String, + default: uni.$u.props.cell.linkType + }, + // 是否开启点击反馈(表现为点击时加上灰色背景) + clickable: { + type: Boolean, + default: uni.$u.props.cell.clickable + }, + // 是否展示右侧箭头并开启点击反馈 + isLink: { + type: Boolean, + default: uni.$u.props.cell.isLink + }, + // 是否显示表单状态下的必填星号(此组件可能会内嵌入input组件) + required: { + type: Boolean, + default: uni.$u.props.cell.required + }, + // 右侧的图标箭头 + rightIcon: { + type: String, + default: uni.$u.props.cell.rightIcon + }, + // 右侧箭头的方向,可选值为:left,up,down + arrowDirection: { + type: String, + default: uni.$u.props.cell.arrowDirection + }, + // 左侧图标样式 + iconStyle: { + type: [Object, String], + default: () => { + return uni.$u.props.cell.iconStyle + } + }, + // 右侧箭头图标的样式 + rightIconStyle: { + type: [Object, String], + default: () => { + return uni.$u.props.cell.rightIconStyle + } + }, + // 标题的样式 + titleStyle: { + type: [Object, String], + default: () => { + return uni.$u.props.cell.titleStyle + } + }, + // 单位元的大小,可选值为large + size: { + type: String, + default: uni.$u.props.cell.size + }, + // 点击cell是否阻止事件传播 + stop: { + type: Boolean, + default: uni.$u.props.cell.stop + }, + // 标识符,cell被点击时返回 + name: { + type: [Number, String], + default: uni.$u.props.cell.name + } + } +} diff --git a/uview-ui/components/u-cell/u-cell.vue b/uview-ui/components/u-cell/u-cell.vue new file mode 100644 index 0000000..b099c90 --- /dev/null +++ b/uview-ui/components/u-cell/u-cell.vue @@ -0,0 +1,229 @@ + + + + + diff --git a/uview-ui/components/u-checkbox-group/props.js b/uview-ui/components/u-checkbox-group/props.js new file mode 100644 index 0000000..2f818a1 --- /dev/null +++ b/uview-ui/components/u-checkbox-group/props.js @@ -0,0 +1,82 @@ +export default { + props: { + // 标识符 + name: { + type: String, + default: uni.$u.props.checkboxGroup.name + }, + // 绑定的值 + value: { + type: Array, + default: uni.$u.props.checkboxGroup.value + }, + // 形状,circle-圆形,square-方形 + shape: { + type: String, + default: uni.$u.props.checkboxGroup.shape + }, + // 是否禁用全部checkbox + disabled: { + type: Boolean, + default: uni.$u.props.checkboxGroup.disabled + }, + + // 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值 + activeColor: { + type: String, + default: uni.$u.props.checkboxGroup.activeColor + }, + // 未选中的颜色 + inactiveColor: { + type: String, + default: uni.$u.props.checkboxGroup.inactiveColor + }, + + // 整个组件的尺寸,默认px + size: { + type: [String, Number], + default: uni.$u.props.checkboxGroup.size + }, + // 布局方式,row-横向,column-纵向 + placement: { + type: String, + default: uni.$u.props.checkboxGroup.placement + }, + // label的字体大小,px单位 + labelSize: { + type: [String, Number], + default: uni.$u.props.checkboxGroup.labelSize + }, + // label的字体颜色 + labelColor: { + type: [String], + default: uni.$u.props.checkboxGroup.labelColor + }, + // 是否禁止点击文本操作 + labelDisabled: { + type: Boolean, + default: uni.$u.props.checkboxGroup.labelDisabled + }, + // 图标颜色 + iconColor: { + type: String, + default: uni.$u.props.checkboxGroup.iconColor + }, + // 图标的大小,单位px + iconSize: { + type: [String, Number], + default: uni.$u.props.checkboxGroup.iconSize + }, + // 勾选图标的对齐方式,left-左边,right-右边 + iconPlacement: { + type: String, + default: uni.$u.props.checkboxGroup.iconPlacement + }, + // 竖向配列时,是否显示下划线 + borderBottom: { + type: Boolean, + default: uni.$u.props.checkboxGroup.borderBottom + } + + } +} diff --git a/uview-ui/components/u-checkbox-group/u-checkbox-group.vue b/uview-ui/components/u-checkbox-group/u-checkbox-group.vue new file mode 100644 index 0000000..7a6b4fa --- /dev/null +++ b/uview-ui/components/u-checkbox-group/u-checkbox-group.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/uview-ui/components/u-checkbox/props.js b/uview-ui/components/u-checkbox/props.js new file mode 100644 index 0000000..93f4fd9 --- /dev/null +++ b/uview-ui/components/u-checkbox/props.js @@ -0,0 +1,69 @@ +export default { + props: { + // checkbox的名称 + name: { + type: [String, Number, Boolean], + default: uni.$u.props.checkbox.name + }, + // 形状,square为方形,circle为圆型 + shape: { + type: String, + default: uni.$u.props.checkbox.shape + }, + // 整体的大小 + size: { + type: [String, Number], + default: uni.$u.props.checkbox.size + }, + // 是否默认选中 + checked: { + type: Boolean, + default: uni.$u.props.checkbox.checked + }, + // 是否禁用 + disabled: { + type: [String, Boolean], + default: uni.$u.props.checkbox.disabled + }, + // 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值 + activeColor: { + type: String, + default: uni.$u.props.checkbox.activeColor + }, + // 未选中的颜色 + inactiveColor: { + type: String, + default: uni.$u.props.checkbox.inactiveColor + }, + // 图标的大小,单位px + iconSize: { + type: [String, Number], + default: uni.$u.props.checkbox.iconSize + }, + // 图标颜色 + iconColor: { + type: String, + default: uni.$u.props.checkbox.iconColor + }, + // label提示文字,因为nvue下,直接slot进来的文字,由于特殊的结构,无法修改样式 + label: { + type: [String, Number], + default: uni.$u.props.checkbox.label + }, + // label的字体大小,px单位 + labelSize: { + type: [String, Number], + default: uni.$u.props.checkbox.labelSize + }, + // label的颜色 + labelColor: { + type: String, + default: uni.$u.props.checkbox.labelColor + }, + // 是否禁止点击提示语选中复选框 + labelDisabled: { + type: [String, Boolean], + default: uni.$u.props.checkbox.labelDisabled + } + } +} diff --git a/uview-ui/components/u-checkbox/u-checkbox.vue b/uview-ui/components/u-checkbox/u-checkbox.vue new file mode 100644 index 0000000..6429cca --- /dev/null +++ b/uview-ui/components/u-checkbox/u-checkbox.vue @@ -0,0 +1,344 @@ + + + + + diff --git a/uview-ui/components/u-circle-progress/props.js b/uview-ui/components/u-circle-progress/props.js new file mode 100644 index 0000000..d776cfb --- /dev/null +++ b/uview-ui/components/u-circle-progress/props.js @@ -0,0 +1,8 @@ +export default { + props: { + percentage: { + type: [String, Number], + default: uni.$u.props.circleProgress.percentage + } + } +} diff --git a/uview-ui/components/u-circle-progress/u-circle-progress.vue b/uview-ui/components/u-circle-progress/u-circle-progress.vue new file mode 100644 index 0000000..d1ee286 --- /dev/null +++ b/uview-ui/components/u-circle-progress/u-circle-progress.vue @@ -0,0 +1,198 @@ + + + + + diff --git a/uview-ui/components/u-code-input/props.js b/uview-ui/components/u-code-input/props.js new file mode 100644 index 0000000..0f016ee --- /dev/null +++ b/uview-ui/components/u-code-input/props.js @@ -0,0 +1,79 @@ +export default { + props: { + // 键盘弹起时,是否自动上推页面 + adjustPosition: { + type: Boolean, + default: uni.$u.props.codeInput.adjustPosition + }, + // 最大输入长度 + maxlength: { + type: [String, Number], + default: uni.$u.props.codeInput.maxlength + }, + // 是否用圆点填充 + dot: { + type: Boolean, + default: uni.$u.props.codeInput.dot + }, + // 显示模式,box-盒子模式,line-底部横线模式 + mode: { + type: String, + default: uni.$u.props.codeInput.mode + }, + // 是否细边框 + hairline: { + type: Boolean, + default: uni.$u.props.codeInput.hairline + }, + // 字符间的距离 + space: { + type: [String, Number], + default: uni.$u.props.codeInput.space + }, + // 预置值 + value: { + type: [String, Number], + default: uni.$u.props.codeInput.value + }, + // 是否自动获取焦点 + focus: { + type: Boolean, + default: uni.$u.props.codeInput.focus + }, + // 字体是否加粗 + bold: { + type: Boolean, + default: uni.$u.props.codeInput.bold + }, + // 字体颜色 + color: { + type: String, + default: uni.$u.props.codeInput.color + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: uni.$u.props.codeInput.fontSize + }, + // 输入框的大小,宽等于高 + size: { + type: [String, Number], + default: uni.$u.props.codeInput.size + }, + // 是否隐藏原生键盘,如果想用自定义键盘的话,需设置此参数为true + disabledKeyboard: { + type: Boolean, + default: uni.$u.props.codeInput.disabledKeyboard + }, + // 边框和线条颜色 + borderColor: { + type: String, + default: uni.$u.props.codeInput.borderColor + }, + // 是否禁止输入"."符号 + disabledDot: { + type: Boolean, + default: uni.$u.props.codeInput.disabledDot + } + } +} diff --git a/uview-ui/components/u-code-input/u-code-input.vue b/uview-ui/components/u-code-input/u-code-input.vue new file mode 100644 index 0000000..96241cf --- /dev/null +++ b/uview-ui/components/u-code-input/u-code-input.vue @@ -0,0 +1,252 @@ + + + + + diff --git a/uview-ui/components/u-code/props.js b/uview-ui/components/u-code/props.js new file mode 100644 index 0000000..eaf80d0 --- /dev/null +++ b/uview-ui/components/u-code/props.js @@ -0,0 +1,34 @@ +export default { + props: { + // 倒计时总秒数 + seconds: { + type: [String, Number], + default: uni.$u.props.code.seconds + }, + // 尚未开始时提示 + startText: { + type: String, + default: uni.$u.props.code.startText + }, + // 正在倒计时中的提示 + changeText: { + type: String, + default: uni.$u.props.code.changeText + }, + // 倒计时结束时的提示 + endText: { + type: String, + default: uni.$u.props.code.endText + }, + // 是否在H5刷新或各端返回再进入时继续倒计时 + keepRunning: { + type: Boolean, + default: uni.$u.props.code.keepRunning + }, + // 为了区分多个页面,或者一个页面多个倒计时组件本地存储的继续倒计时变了 + uniqueKey: { + type: String, + default: uni.$u.props.code.uniqueKey + } + } +} diff --git a/uview-ui/components/u-code/u-code.vue b/uview-ui/components/u-code/u-code.vue new file mode 100644 index 0000000..f79a09a --- /dev/null +++ b/uview-ui/components/u-code/u-code.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/uview-ui/components/u-col/props.js b/uview-ui/components/u-col/props.js new file mode 100644 index 0000000..0622251 --- /dev/null +++ b/uview-ui/components/u-col/props.js @@ -0,0 +1,29 @@ +export default { + props: { + // 占父容器宽度的多少等分,总分为12份 + span: { + type: [String, Number], + default: uni.$u.props.col.span + }, + // 指定栅格左侧的间隔数(总12栏) + offset: { + type: [String, Number], + default: uni.$u.props.col.offset + }, + // 水平排列方式,可选值为`start`(或`flex-start`)、`end`(或`flex-end`)、`center`、`around`(或`space-around`)、`between`(或`space-between`) + justify: { + type: String, + default: uni.$u.props.col.justify + }, + // 垂直对齐方式,可选值为top、center、bottom、stretch + align: { + type: String, + default: uni.$u.props.col.align + }, + // 文字对齐方式 + textAlign: { + type: String, + default: uni.$u.props.col.textAlign + } + } +} diff --git a/uview-ui/components/u-col/u-col.vue b/uview-ui/components/u-col/u-col.vue new file mode 100644 index 0000000..8be1517 --- /dev/null +++ b/uview-ui/components/u-col/u-col.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/uview-ui/components/u-collapse-item/props.js b/uview-ui/components/u-collapse-item/props.js new file mode 100644 index 0000000..bd5749b --- /dev/null +++ b/uview-ui/components/u-collapse-item/props.js @@ -0,0 +1,59 @@ +export default { + props: { + // 标题 + title: { + type: String, + default: uni.$u.props.collapseItem.title + }, + // 标题右侧内容 + value: { + type: String, + default: uni.$u.props.collapseItem.value + }, + // 标题下方的描述信息 + label: { + type: String, + default: uni.$u.props.collapseItem.label + }, + // 是否禁用折叠面板 + disabled: { + type: Boolean, + default: uni.$u.props.collapseItem.disabled + }, + // 是否展示右侧箭头并开启点击反馈 + isLink: { + type: Boolean, + default: uni.$u.props.collapseItem.isLink + }, + // 是否开启点击反馈 + clickable: { + type: Boolean, + default: uni.$u.props.collapseItem.clickable + }, + // 是否显示内边框 + border: { + type: Boolean, + default: uni.$u.props.collapseItem.border + }, + // 标题的对齐方式 + align: { + type: String, + default: uni.$u.props.collapseItem.align + }, + // 唯一标识符 + name: { + type: [String, Number], + default: uni.$u.props.collapseItem.name + }, + // 标题左侧图片,可为绝对路径的图片或内置图标 + icon: { + type: String, + default: uni.$u.props.collapseItem.icon + }, + // 面板展开收起的过渡时间,单位ms + duration: { + type: Number, + default: uni.$u.props.collapseItem.duration + } + } +} diff --git a/uview-ui/components/u-collapse-item/u-collapse-item.vue b/uview-ui/components/u-collapse-item/u-collapse-item.vue new file mode 100644 index 0000000..0e1b703 --- /dev/null +++ b/uview-ui/components/u-collapse-item/u-collapse-item.vue @@ -0,0 +1,225 @@ + + + + + diff --git a/uview-ui/components/u-collapse/props.js b/uview-ui/components/u-collapse/props.js new file mode 100644 index 0000000..7ee6d31 --- /dev/null +++ b/uview-ui/components/u-collapse/props.js @@ -0,0 +1,19 @@ +export default { + props: { + // 当前展开面板的name,非手风琴模式:[],手风琴模式:string | number + value: { + type: [String, Number, Array, null], + default: uni.$u.props.collapse.value + }, + // 是否手风琴模式 + accordion: { + type: Boolean, + default: uni.$u.props.collapse.accordion + }, + // 是否显示外边框 + border: { + type: Boolean, + default: uni.$u.props.collapse.border + } + } +} diff --git a/uview-ui/components/u-collapse/u-collapse.vue b/uview-ui/components/u-collapse/u-collapse.vue new file mode 100644 index 0000000..fc188a2 --- /dev/null +++ b/uview-ui/components/u-collapse/u-collapse.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/uview-ui/components/u-column-notice/props.js b/uview-ui/components/u-column-notice/props.js new file mode 100644 index 0000000..4809154 --- /dev/null +++ b/uview-ui/components/u-column-notice/props.js @@ -0,0 +1,55 @@ +export default { + props: { + // 显示的内容,字符串 + text: { + type: [Array], + default: uni.$u.props.columnNotice.text + }, + // 是否显示左侧的音量图标 + icon: { + type: String, + default: uni.$u.props.columnNotice.icon + }, + // 通告模式,link-显示右箭头,closable-显示右侧关闭图标 + mode: { + type: String, + default: uni.$u.props.columnNotice.mode + }, + // 文字颜色,各图标也会使用文字颜色 + color: { + type: String, + default: uni.$u.props.columnNotice.color + }, + // 背景颜色 + bgColor: { + type: String, + default: uni.$u.props.columnNotice.bgColor + }, + // 字体大小,单位px + fontSize: { + type: [String, Number], + default: uni.$u.props.columnNotice.fontSize + }, + // 水平滚动时的滚动速度,即每秒滚动多少px(px),这有利于控制文字无论多少时,都能有一个恒定的速度 + speed: { + type: [String, Number], + default: uni.$u.props.columnNotice.speed + }, + // direction = row时,是否使用步进形式滚动 + step: { + type: Boolean, + default: uni.$u.props.columnNotice.step + }, + // 滚动一个周期的时间长,单位ms + duration: { + type: [String, Number], + default: uni.$u.props.columnNotice.duration + }, + // 是否禁止用手滑动切换 + // 目前HX2.6.11,只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序 + disableTouch: { + type: Boolean, + default: uni.$u.props.columnNotice.disableTouch + } + } +} diff --git a/uview-ui/components/u-column-notice/u-column-notice.vue b/uview-ui/components/u-column-notice/u-column-notice.vue new file mode 100644 index 0000000..fc39532 --- /dev/null +++ b/uview-ui/components/u-column-notice/u-column-notice.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/uview-ui/components/u-count-down/props.js b/uview-ui/components/u-count-down/props.js new file mode 100644 index 0000000..d62f025 --- /dev/null +++ b/uview-ui/components/u-count-down/props.js @@ -0,0 +1,24 @@ +export default { + props: { + // 倒计时时长,单位ms + time: { + type: [String, Number], + default: uni.$u.props.countDown.time + }, + // 时间格式,DD-日,HH-时,mm-分,ss-秒,SSS-毫秒 + format: { + type: String, + default: uni.$u.props.countDown.format + }, + // 是否自动开始倒计时 + autoStart: { + type: Boolean, + default: uni.$u.props.countDown.autoStart + }, + // 是否展示毫秒倒计时 + millisecond: { + type: Boolean, + default: uni.$u.props.countDown.millisecond + } + } +} diff --git a/uview-ui/components/u-count-down/u-count-down.vue b/uview-ui/components/u-count-down/u-count-down.vue new file mode 100644 index 0000000..b5e85a6 --- /dev/null +++ b/uview-ui/components/u-count-down/u-count-down.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/uview-ui/components/u-count-down/utils.js b/uview-ui/components/u-count-down/utils.js new file mode 100644 index 0000000..8c75005 --- /dev/null +++ b/uview-ui/components/u-count-down/utils.js @@ -0,0 +1,62 @@ +// 补0,如1 -> 01 +function padZero(num, targetLength = 2) { + let str = `${num}` + while (str.length < targetLength) { + str = `0${str}` + } + return str +} +const SECOND = 1000 +const MINUTE = 60 * SECOND +const HOUR = 60 * MINUTE +const DAY = 24 * HOUR +export function parseTimeData(time) { + const days = Math.floor(time / DAY) + const hours = Math.floor((time % DAY) / HOUR) + const minutes = Math.floor((time % HOUR) / MINUTE) + const seconds = Math.floor((time % MINUTE) / SECOND) + const milliseconds = Math.floor(time % SECOND) + return { + days, + hours, + minutes, + seconds, + milliseconds + } +} +export function parseFormat(format, timeData) { + let { + days, + hours, + minutes, + seconds, + milliseconds + } = timeData + // 如果格式化字符串中不存在DD(天),则将天的时间转为小时中去 + if (format.indexOf('DD') === -1) { + hours += days * 24 + } else { + // 对天补0 + format = format.replace('DD', padZero(days)) + } + // 其他同理于DD的格式化处理方式 + if (format.indexOf('HH') === -1) { + minutes += hours * 60 + } else { + format = format.replace('HH', padZero(hours)) + } + if (format.indexOf('mm') === -1) { + seconds += minutes * 60 + } else { + format = format.replace('mm', padZero(minutes)) + } + if (format.indexOf('ss') === -1) { + milliseconds += seconds * 1000 + } else { + format = format.replace('ss', padZero(seconds)) + } + return format.replace('SSS', padZero(milliseconds, 3)) +} +export function isSameSecond(time1, time2) { + return Math.floor(time1 / 1000) === Math.floor(time2 / 1000) +} diff --git a/uview-ui/components/u-count-to/props.js b/uview-ui/components/u-count-to/props.js new file mode 100644 index 0000000..86873c1 --- /dev/null +++ b/uview-ui/components/u-count-to/props.js @@ -0,0 +1,59 @@ +export default { + props: { + // 开始的数值,默认从0增长到某一个数 + startVal: { + type: [String, Number], + default: uni.$u.props.countTo.startVal + }, + // 要滚动的目标数值,必须 + endVal: { + type: [String, Number], + default: uni.$u.props.countTo.endVal + }, + // 滚动到目标数值的动画持续时间,单位为毫秒(ms) + duration: { + type: [String, Number], + default: uni.$u.props.countTo.duration + }, + // 设置数值后是否自动开始滚动 + autoplay: { + type: Boolean, + default: uni.$u.props.countTo.autoplay + }, + // 要显示的小数位数 + decimals: { + type: [String, Number], + default: uni.$u.props.countTo.decimals + }, + // 是否在即将到达目标数值的时候,使用缓慢滚动的效果 + useEasing: { + type: Boolean, + default: uni.$u.props.countTo.useEasing + }, + // 十进制分割 + decimal: { + type: [String, Number], + default: uni.$u.props.countTo.decimal + }, + // 字体颜色 + color: { + type: String, + default: uni.$u.props.countTo.color + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: uni.$u.props.countTo.fontSize + }, + // 是否加粗字体 + bold: { + type: Boolean, + default: uni.$u.props.countTo.bold + }, + // 千位分隔符,类似金额的分割(¥23,321.05中的",") + separator: { + type: String, + default: uni.$u.props.countTo.separator + } + } +} diff --git a/uview-ui/components/u-count-to/u-count-to.vue b/uview-ui/components/u-count-to/u-count-to.vue new file mode 100644 index 0000000..417b732 --- /dev/null +++ b/uview-ui/components/u-count-to/u-count-to.vue @@ -0,0 +1,184 @@ + + + + + diff --git a/uview-ui/components/u-datetime-picker/props.js b/uview-ui/components/u-datetime-picker/props.js new file mode 100644 index 0000000..f44c0f9 --- /dev/null +++ b/uview-ui/components/u-datetime-picker/props.js @@ -0,0 +1,116 @@ +export default { + props: { + // 是否打开组件 + show: { + type: Boolean, + default: uni.$u.props.datetimePicker.show + }, + // 是否展示顶部的操作栏 + showToolbar: { + type: Boolean, + default: uni.$u.props.datetimePicker.showToolbar + }, + // 绑定值 + value: { + type: [String, Number], + default: uni.$u.props.datetimePicker.value + }, + // 顶部标题 + title: { + type: String, + default: uni.$u.props.datetimePicker.title + }, + // 展示格式,mode=date为日期选择,mode=time为时间选择,mode=year-month为年月选择,mode=datetime为日期时间选择 + mode: { + type: String, + default: uni.$u.props.datetimePicker.mode + }, + // 可选的最大时间 + maxDate: { + type: Number, + // 最大默认值为后10年 + default: uni.$u.props.datetimePicker.maxDate + }, + // 可选的最小时间 + minDate: { + type: Number, + // 最小默认值为前10年 + default: uni.$u.props.datetimePicker.minDate + }, + // 可选的最小小时,仅mode=time有效 + minHour: { + type: Number, + default: uni.$u.props.datetimePicker.minHour + }, + // 可选的最大小时,仅mode=time有效 + maxHour: { + type: Number, + default: uni.$u.props.datetimePicker.maxHour + }, + // 可选的最小分钟,仅mode=time有效 + minMinute: { + type: Number, + default: uni.$u.props.datetimePicker.minMinute + }, + // 可选的最大分钟,仅mode=time有效 + maxMinute: { + type: Number, + default: uni.$u.props.datetimePicker.maxMinute + }, + // 选项过滤函数 + filter: { + type: [Function, null], + default: uni.$u.props.datetimePicker.filter + }, + // 选项格式化函数 + formatter: { + type: [Function, null], + default: uni.$u.props.datetimePicker.formatter + }, + // 是否显示加载中状态 + loading: { + type: Boolean, + default: uni.$u.props.datetimePicker.loading + }, + // 各列中,单个选项的高度 + itemHeight: { + type: [String, Number], + default: uni.$u.props.datetimePicker.itemHeight + }, + // 取消按钮的文字 + cancelText: { + type: String, + default: uni.$u.props.datetimePicker.cancelText + }, + // 确认按钮的文字 + confirmText: { + type: String, + default: uni.$u.props.datetimePicker.confirmText + }, + // 取消按钮的颜色 + cancelColor: { + type: String, + default: uni.$u.props.datetimePicker.cancelColor + }, + // 确认按钮的颜色 + confirmColor: { + type: String, + default: uni.$u.props.datetimePicker.confirmColor + }, + // 每列中可见选项的数量 + visibleItemCount: { + type: [String, Number], + default: uni.$u.props.datetimePicker.visibleItemCount + }, + // 是否允许点击遮罩关闭选择器 + closeOnClickOverlay: { + type: Boolean, + default: uni.$u.props.datetimePicker.closeOnClickOverlay + }, + // 各列的默认索引 + defaultIndex: { + type: Array, + default: uni.$u.props.datetimePicker.defaultIndex + } + } +} diff --git a/uview-ui/components/u-datetime-picker/u-datetime-picker.vue b/uview-ui/components/u-datetime-picker/u-datetime-picker.vue new file mode 100644 index 0000000..18d8dcc --- /dev/null +++ b/uview-ui/components/u-datetime-picker/u-datetime-picker.vue @@ -0,0 +1,360 @@ + + + + + diff --git a/uview-ui/components/u-divider/props.js b/uview-ui/components/u-divider/props.js new file mode 100644 index 0000000..1fa8359 --- /dev/null +++ b/uview-ui/components/u-divider/props.js @@ -0,0 +1,44 @@ +export default { + props: { + // 是否虚线 + dashed: { + type: Boolean, + default: uni.$u.props.divider.dashed + }, + // 是否细线 + hairline: { + type: Boolean, + default: uni.$u.props.divider.hairline + }, + // 是否以点替代文字,优先于text字段起作用 + dot: { + type: Boolean, + default: uni.$u.props.divider.dot + }, + // 内容文本的位置,left-左边,center-中间,right-右边 + textPosition: { + type: String, + default: uni.$u.props.divider.textPosition + }, + // 文本内容 + text: { + type: [String, Number], + default: uni.$u.props.divider.text + }, + // 文本大小 + textSize: { + type: [String, Number], + default: uni.$u.props.divider.textSize + }, + // 文本颜色 + textColor: { + type: String, + default: uni.$u.props.divider.textColor + }, + // 线条颜色 + lineColor: { + type: String, + default: uni.$u.props.divider.lineColor + } + } +} diff --git a/uview-ui/components/u-divider/u-divider.vue b/uview-ui/components/u-divider/u-divider.vue new file mode 100644 index 0000000..b629da6 --- /dev/null +++ b/uview-ui/components/u-divider/u-divider.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/uview-ui/components/u-dropdown-item/props.js b/uview-ui/components/u-dropdown-item/props.js new file mode 100644 index 0000000..501a1f0 --- /dev/null +++ b/uview-ui/components/u-dropdown-item/props.js @@ -0,0 +1,36 @@ +export default { + props: { + // 当前选中项的value值 + value: { + type: [Number, String, Array], + default: '' + }, + // 菜单项标题 + title: { + type: [String, Number], + default: '' + }, + // 选项数据,如果传入了默认slot,此参数无效 + options: { + type: Array, + default() { + return [] + } + }, + // 是否禁用此菜单项 + disabled: { + type: Boolean, + default: false + }, + // 下拉弹窗的高度 + height: { + type: [Number, String], + default: 'auto' + }, + // 点击遮罩是否可以收起弹窗 + closeOnClickOverlay: { + type: Boolean, + default: true + } + } +} diff --git a/uview-ui/components/u-dropdown-item/u-dropdown-item.vue b/uview-ui/components/u-dropdown-item/u-dropdown-item.vue new file mode 100644 index 0000000..f830291 --- /dev/null +++ b/uview-ui/components/u-dropdown-item/u-dropdown-item.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/uview-ui/components/u-dropdown/props.js b/uview-ui/components/u-dropdown/props.js new file mode 100644 index 0000000..5f8465e --- /dev/null +++ b/uview-ui/components/u-dropdown/props.js @@ -0,0 +1,65 @@ +export default { + props: { + // 标题选中时的样式 + activeStyle: { + type: [String, Object], + default: () => ({ + color: '#2979ff', + fontSize: '14px' + }) + }, + // 标题未选中时的样式 + inactiveStyle: { + type: [String, Object], + default: () => ({ + color: '#606266', + fontSize: '14px' + }) + }, + // 点击遮罩是否关闭菜单 + closeOnClickMask: { + type: Boolean, + default: true + }, + // 点击当前激活项标题是否关闭菜单 + closeOnClickSelf: { + type: Boolean, + default: true + }, + // 过渡时间 + duration: { + type: [Number, String], + default: 300 + }, + // 标题菜单的高度 + height: { + type: [Number, String], + default: 40 + }, + // 是否显示下边框 + borderBottom: { + type: Boolean, + default: false + }, + // 标题的字体大小 + titleSize: { + type: [Number, String], + default: 14 + }, + // 下拉出来的内容部分的圆角值 + borderRadius: { + type: [Number, String], + default: 0 + }, + // 菜单右侧的icon图标 + menuIcon: { + type: String, + default: 'arrow-down' + }, + // 菜单右侧图标的大小 + menuIconSize: { + type: [Number, String], + default: 14 + } + } +} diff --git a/uview-ui/components/u-dropdown/u-dropdown.vue b/uview-ui/components/u-dropdown/u-dropdown.vue new file mode 100644 index 0000000..f830291 --- /dev/null +++ b/uview-ui/components/u-dropdown/u-dropdown.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/uview-ui/components/u-empty/props.js b/uview-ui/components/u-empty/props.js new file mode 100644 index 0000000..78662f8 --- /dev/null +++ b/uview-ui/components/u-empty/props.js @@ -0,0 +1,59 @@ +export default { + props: { + // 内置图标名称,或图片路径,建议绝对路径 + icon: { + type: String, + default: uni.$u.props.empty.icon + }, + // 提示文字 + text: { + type: String, + default: uni.$u.props.empty.text + }, + // 文字颜色 + textColor: { + type: String, + default: uni.$u.props.empty.textColor + }, + // 文字大小 + textSize: { + type: [String, Number], + default: uni.$u.props.empty.textSize + }, + // 图标的颜色 + iconColor: { + type: String, + default: uni.$u.props.empty.iconColor + }, + // 图标的大小 + iconSize: { + type: [String, Number], + default: uni.$u.props.empty.iconSize + }, + // 选择预置的图标类型 + mode: { + type: String, + default: uni.$u.props.empty.mode + }, + // 图标宽度,单位px + width: { + type: [String, Number], + default: uni.$u.props.empty.width + }, + // 图标高度,单位px + height: { + type: [String, Number], + default: uni.$u.props.empty.height + }, + // 是否显示组件 + show: { + type: Boolean, + default: uni.$u.props.empty.show + }, + // 组件距离上一个元素之间的距离,默认px单位 + marginTop: { + type: [String, Number], + default: uni.$u.props.empty.marginTop + } + } +} diff --git a/uview-ui/components/u-empty/u-empty.vue b/uview-ui/components/u-empty/u-empty.vue new file mode 100644 index 0000000..03d6a27 --- /dev/null +++ b/uview-ui/components/u-empty/u-empty.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/uview-ui/components/u-form-item/props.js b/uview-ui/components/u-form-item/props.js new file mode 100644 index 0000000..7b16655 --- /dev/null +++ b/uview-ui/components/u-form-item/props.js @@ -0,0 +1,48 @@ +export default { + props: { + // input的label提示语 + label: { + type: String, + default: uni.$u.props.formItem.label + }, + // 绑定的值 + prop: { + type: String, + default: uni.$u.props.formItem.prop + }, + // 是否显示表单域的下划线边框 + borderBottom: { + type: [String, Boolean], + default: uni.$u.props.formItem.borderBottom + }, + // label的位置,left-左边,top-上边 + labelPosition: { + type: String, + default: uni.$u.props.formItem.labelPosition + }, + // label的宽度,单位px + labelWidth: { + type: [String, Number], + default: uni.$u.props.formItem.labelWidth + }, + // 右侧图标 + rightIcon: { + type: String, + default: uni.$u.props.formItem.rightIcon + }, + // 左侧图标 + leftIcon: { + type: String, + default: uni.$u.props.formItem.leftIcon + }, + // 是否显示左边的必填星号,只作显示用,具体校验必填的逻辑,请在rules中配置 + required: { + type: Boolean, + default: uni.$u.props.formItem.required + }, + leftIconStyle: { + type: [String, Object], + default: uni.$u.props.formItem.leftIconStyle, + } + } +} diff --git a/uview-ui/components/u-form-item/u-form-item.vue b/uview-ui/components/u-form-item/u-form-item.vue new file mode 100644 index 0000000..6aa8d69 --- /dev/null +++ b/uview-ui/components/u-form-item/u-form-item.vue @@ -0,0 +1,235 @@ + + + + + diff --git a/uview-ui/components/u-form/props.js b/uview-ui/components/u-form/props.js new file mode 100644 index 0000000..f2a629c --- /dev/null +++ b/uview-ui/components/u-form/props.js @@ -0,0 +1,45 @@ +export default { + props: { + // 当前form的需要验证字段的集合 + model: { + type: Object, + default: uni.$u.props.form.model + }, + // 验证规则 + rules: { + type: [Object, Function, Array], + default: uni.$u.props.form.rules + }, + // 有错误时的提示方式,message-提示信息,toast-进行toast提示 + // border-bottom-下边框呈现红色,none-无提示 + errorType: { + type: String, + default: uni.$u.props.form.errorType + }, + // 是否显示表单域的下划线边框 + borderBottom: { + type: Boolean, + default: uni.$u.props.form.borderBottom + }, + // label的位置,left-左边,top-上边 + labelPosition: { + type: String, + default: uni.$u.props.form.labelPosition + }, + // label的宽度,单位px + labelWidth: { + type: [String, Number], + default: uni.$u.props.form.labelWidth + }, + // lable字体的对齐方式 + labelAlign: { + type: String, + default: uni.$u.props.form.labelAlign + }, + // lable的样式,对象形式 + labelStyle: { + type: Object, + default: uni.$u.props.form.labelStyle + } + } +} diff --git a/uview-ui/components/u-form/u-form.vue b/uview-ui/components/u-form/u-form.vue new file mode 100644 index 0000000..fe2dde2 --- /dev/null +++ b/uview-ui/components/u-form/u-form.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/uview-ui/components/u-gap/props.js b/uview-ui/components/u-gap/props.js new file mode 100644 index 0000000..89953e3 --- /dev/null +++ b/uview-ui/components/u-gap/props.js @@ -0,0 +1,24 @@ +export default { + props: { + // 背景颜色(默认transparent) + bgColor: { + type: String, + default: uni.$u.props.gap.bgColor + }, + // 分割槽高度,单位px(默认30) + height: { + type: [String, Number], + default: uni.$u.props.gap.height + }, + // 与上一个组件的距离 + marginTop: { + type: [String, Number], + default: uni.$u.props.gap.marginTop + }, + // 与下一个组件的距离 + marginBottom: { + type: [String, Number], + default: uni.$u.props.gap.marginBottom + } + } +} diff --git a/uview-ui/components/u-gap/u-gap.vue b/uview-ui/components/u-gap/u-gap.vue new file mode 100644 index 0000000..e4429f0 --- /dev/null +++ b/uview-ui/components/u-gap/u-gap.vue @@ -0,0 +1,38 @@ + + + + + diff --git a/uview-ui/components/u-grid-item/props.js b/uview-ui/components/u-grid-item/props.js new file mode 100644 index 0000000..06c3c66 --- /dev/null +++ b/uview-ui/components/u-grid-item/props.js @@ -0,0 +1,14 @@ +export default { + props: { + // 宫格的name + name: { + type: [String, Number, null], + default: uni.$u.props.gridItem.name + }, + // 背景颜色 + bgColor: { + type: String, + default: uni.$u.props.gridItem.bgColor + } + } +} diff --git a/uview-ui/components/u-grid-item/u-grid-item.vue b/uview-ui/components/u-grid-item/u-grid-item.vue new file mode 100644 index 0000000..fc0c7cf --- /dev/null +++ b/uview-ui/components/u-grid-item/u-grid-item.vue @@ -0,0 +1,209 @@ + + + + + diff --git a/uview-ui/components/u-grid/props.js b/uview-ui/components/u-grid/props.js new file mode 100644 index 0000000..87b0f6a --- /dev/null +++ b/uview-ui/components/u-grid/props.js @@ -0,0 +1,19 @@ +export default { + props: { + // 分成几列 + col: { + type: [String, Number], + default: uni.$u.props.grid.col + }, + // 是否显示边框 + border: { + type: Boolean, + default: uni.$u.props.grid.border + }, + // 宫格对齐方式,表现为数量少的时候,靠左,居中,还是靠右 + align: { + type: String, + default: uni.$u.props.grid.align + } + } +} diff --git a/uview-ui/components/u-grid/u-grid.vue b/uview-ui/components/u-grid/u-grid.vue new file mode 100644 index 0000000..b43cc27 --- /dev/null +++ b/uview-ui/components/u-grid/u-grid.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/uview-ui/components/u-icon/icons.js b/uview-ui/components/u-icon/icons.js new file mode 100644 index 0000000..f4d0fe2 --- /dev/null +++ b/uview-ui/components/u-icon/icons.js @@ -0,0 +1,214 @@ +export default { + 'uicon-level': '\ue693', + 'uicon-column-line': '\ue68e', + 'uicon-checkbox-mark': '\ue807', + 'uicon-folder': '\ue7f5', + 'uicon-movie': '\ue7f6', + 'uicon-star-fill': '\ue669', + 'uicon-star': '\ue65f', + 'uicon-phone-fill': '\ue64f', + 'uicon-phone': '\ue622', + 'uicon-apple-fill': '\ue881', + 'uicon-chrome-circle-fill': '\ue885', + 'uicon-backspace': '\ue67b', + 'uicon-attach': '\ue632', + 'uicon-cut': '\ue948', + 'uicon-empty-car': '\ue602', + 'uicon-empty-coupon': '\ue682', + 'uicon-empty-address': '\ue646', + 'uicon-empty-favor': '\ue67c', + 'uicon-empty-permission': '\ue686', + 'uicon-empty-news': '\ue687', + 'uicon-empty-search': '\ue664', + 'uicon-github-circle-fill': '\ue887', + 'uicon-rmb': '\ue608', + 'uicon-person-delete-fill': '\ue66a', + 'uicon-reload': '\ue788', + 'uicon-order': '\ue68f', + 'uicon-server-man': '\ue6bc', + 'uicon-search': '\ue62a', + 'uicon-fingerprint': '\ue955', + 'uicon-more-dot-fill': '\ue630', + 'uicon-scan': '\ue662', + 'uicon-share-square': '\ue60b', + 'uicon-map': '\ue61d', + 'uicon-map-fill': '\ue64e', + 'uicon-tags': '\ue629', + 'uicon-tags-fill': '\ue651', + 'uicon-bookmark-fill': '\ue63b', + 'uicon-bookmark': '\ue60a', + 'uicon-eye': '\ue613', + 'uicon-eye-fill': '\ue641', + 'uicon-mic': '\ue64a', + 'uicon-mic-off': '\ue649', + 'uicon-calendar': '\ue66e', + 'uicon-calendar-fill': '\ue634', + 'uicon-trash': '\ue623', + 'uicon-trash-fill': '\ue658', + 'uicon-play-left': '\ue66d', + 'uicon-play-right': '\ue610', + 'uicon-minus': '\ue618', + 'uicon-plus': '\ue62d', + 'uicon-info': '\ue653', + 'uicon-info-circle': '\ue7d2', + 'uicon-info-circle-fill': '\ue64b', + 'uicon-question': '\ue715', + 'uicon-error': '\ue6d3', + 'uicon-close': '\ue685', + 'uicon-checkmark': '\ue6a8', + 'uicon-android-circle-fill': '\ue67e', + 'uicon-android-fill': '\ue67d', + 'uicon-ie': '\ue87b', + 'uicon-IE-circle-fill': '\ue889', + 'uicon-google': '\ue87a', + 'uicon-google-circle-fill': '\ue88a', + 'uicon-setting-fill': '\ue872', + 'uicon-setting': '\ue61f', + 'uicon-minus-square-fill': '\ue855', + 'uicon-plus-square-fill': '\ue856', + 'uicon-heart': '\ue7df', + 'uicon-heart-fill': '\ue851', + 'uicon-camera': '\ue7d7', + 'uicon-camera-fill': '\ue870', + 'uicon-more-circle': '\ue63e', + 'uicon-more-circle-fill': '\ue645', + 'uicon-chat': '\ue620', + 'uicon-chat-fill': '\ue61e', + 'uicon-bag-fill': '\ue617', + 'uicon-bag': '\ue619', + 'uicon-error-circle-fill': '\ue62c', + 'uicon-error-circle': '\ue624', + 'uicon-close-circle': '\ue63f', + 'uicon-close-circle-fill': '\ue637', + 'uicon-checkmark-circle': '\ue63d', + 'uicon-checkmark-circle-fill': '\ue635', + 'uicon-question-circle-fill': '\ue666', + 'uicon-question-circle': '\ue625', + 'uicon-share': '\ue631', + 'uicon-share-fill': '\ue65e', + 'uicon-shopping-cart': '\ue621', + 'uicon-shopping-cart-fill': '\ue65d', + 'uicon-bell': '\ue609', + 'uicon-bell-fill': '\ue640', + 'uicon-list': '\ue650', + 'uicon-list-dot': '\ue616', + 'uicon-zhihu': '\ue6ba', + 'uicon-zhihu-circle-fill': '\ue709', + 'uicon-zhifubao': '\ue6b9', + 'uicon-zhifubao-circle-fill': '\ue6b8', + 'uicon-weixin-circle-fill': '\ue6b1', + 'uicon-weixin-fill': '\ue6b2', + 'uicon-twitter-circle-fill': '\ue6ab', + 'uicon-twitter': '\ue6aa', + 'uicon-taobao-circle-fill': '\ue6a7', + 'uicon-taobao': '\ue6a6', + 'uicon-weibo-circle-fill': '\ue6a5', + 'uicon-weibo': '\ue6a4', + 'uicon-qq-fill': '\ue6a1', + 'uicon-qq-circle-fill': '\ue6a0', + 'uicon-moments-circel-fill': '\ue69a', + 'uicon-moments': '\ue69b', + 'uicon-qzone': '\ue695', + 'uicon-qzone-circle-fill': '\ue696', + 'uicon-baidu-circle-fill': '\ue680', + 'uicon-baidu': '\ue681', + 'uicon-facebook-circle-fill': '\ue68a', + 'uicon-facebook': '\ue689', + 'uicon-car': '\ue60c', + 'uicon-car-fill': '\ue636', + 'uicon-warning-fill': '\ue64d', + 'uicon-warning': '\ue694', + 'uicon-clock-fill': '\ue638', + 'uicon-clock': '\ue60f', + 'uicon-edit-pen': '\ue612', + 'uicon-edit-pen-fill': '\ue66b', + 'uicon-email': '\ue611', + 'uicon-email-fill': '\ue642', + 'uicon-minus-circle': '\ue61b', + 'uicon-minus-circle-fill': '\ue652', + 'uicon-plus-circle': '\ue62e', + 'uicon-plus-circle-fill': '\ue661', + 'uicon-file-text': '\ue663', + 'uicon-file-text-fill': '\ue665', + 'uicon-pushpin': '\ue7e3', + 'uicon-pushpin-fill': '\ue86e', + 'uicon-grid': '\ue673', + 'uicon-grid-fill': '\ue678', + 'uicon-play-circle': '\ue647', + 'uicon-play-circle-fill': '\ue655', + 'uicon-pause-circle-fill': '\ue654', + 'uicon-pause': '\ue8fa', + 'uicon-pause-circle': '\ue643', + 'uicon-eye-off': '\ue648', + 'uicon-eye-off-outline': '\ue62b', + 'uicon-gift-fill': '\ue65c', + 'uicon-gift': '\ue65b', + 'uicon-rmb-circle-fill': '\ue657', + 'uicon-rmb-circle': '\ue677', + 'uicon-kefu-ermai': '\ue656', + 'uicon-server-fill': '\ue751', + 'uicon-coupon-fill': '\ue8c4', + 'uicon-coupon': '\ue8ae', + 'uicon-integral': '\ue704', + 'uicon-integral-fill': '\ue703', + 'uicon-home-fill': '\ue964', + 'uicon-home': '\ue965', + 'uicon-hourglass-half-fill': '\ue966', + 'uicon-hourglass': '\ue967', + 'uicon-account': '\ue628', + 'uicon-plus-people-fill': '\ue626', + 'uicon-minus-people-fill': '\ue615', + 'uicon-account-fill': '\ue614', + 'uicon-thumb-down-fill': '\ue726', + 'uicon-thumb-down': '\ue727', + 'uicon-thumb-up': '\ue733', + 'uicon-thumb-up-fill': '\ue72f', + 'uicon-lock-fill': '\ue979', + 'uicon-lock-open': '\ue973', + 'uicon-lock-opened-fill': '\ue974', + 'uicon-lock': '\ue97a', + 'uicon-red-packet-fill': '\ue690', + 'uicon-photo-fill': '\ue98b', + 'uicon-photo': '\ue98d', + 'uicon-volume-off-fill': '\ue659', + 'uicon-volume-off': '\ue644', + 'uicon-volume-fill': '\ue670', + 'uicon-volume': '\ue633', + 'uicon-red-packet': '\ue691', + 'uicon-download': '\ue63c', + 'uicon-arrow-up-fill': '\ue6b0', + 'uicon-arrow-down-fill': '\ue600', + 'uicon-play-left-fill': '\ue675', + 'uicon-play-right-fill': '\ue676', + 'uicon-rewind-left-fill': '\ue679', + 'uicon-rewind-right-fill': '\ue67a', + 'uicon-arrow-downward': '\ue604', + 'uicon-arrow-leftward': '\ue601', + 'uicon-arrow-rightward': '\ue603', + 'uicon-arrow-upward': '\ue607', + 'uicon-arrow-down': '\ue60d', + 'uicon-arrow-right': '\ue605', + 'uicon-arrow-left': '\ue60e', + 'uicon-arrow-up': '\ue606', + 'uicon-skip-back-left': '\ue674', + 'uicon-skip-forward-right': '\ue672', + 'uicon-rewind-right': '\ue66f', + 'uicon-rewind-left': '\ue671', + 'uicon-arrow-right-double': '\ue68d', + 'uicon-arrow-left-double': '\ue68c', + 'uicon-wifi-off': '\ue668', + 'uicon-wifi': '\ue667', + 'uicon-empty-data': '\ue62f', + 'uicon-empty-history': '\ue684', + 'uicon-empty-list': '\ue68b', + 'uicon-empty-page': '\ue627', + 'uicon-empty-order': '\ue639', + 'uicon-man': '\ue697', + 'uicon-woman': '\ue69c', + 'uicon-man-add': '\ue61c', + 'uicon-man-add-fill': '\ue64c', + 'uicon-man-delete': '\ue61a', + 'uicon-man-delete-fill': '\ue66a', + 'uicon-zh': '\ue70a', + 'uicon-en': '\ue692' +} diff --git a/uview-ui/components/u-icon/props.js b/uview-ui/components/u-icon/props.js new file mode 100644 index 0000000..71845b7 --- /dev/null +++ b/uview-ui/components/u-icon/props.js @@ -0,0 +1,89 @@ +export default { + props: { + // 图标类名 + name: { + type: String, + default: uni.$u.props.icon.name + }, + // 图标颜色,可接受主题色 + color: { + type: String, + default: uni.$u.props.icon.color + }, + // 字体大小,单位px + size: { + type: [String, Number], + default: uni.$u.props.icon.size + }, + // 是否显示粗体 + bold: { + type: Boolean, + default: uni.$u.props.icon.bold + }, + // 点击图标的时候传递事件出去的index(用于区分点击了哪一个) + index: { + type: [String, Number], + default: uni.$u.props.icon.index + }, + // 触摸图标时的类名 + hoverClass: { + type: String, + default: uni.$u.props.icon.hoverClass + }, + // 自定义扩展前缀,方便用户扩展自己的图标库 + customPrefix: { + type: String, + default: uni.$u.props.icon.customPrefix + }, + // 图标右边或者下面的文字 + label: { + type: [String, Number], + default: uni.$u.props.icon.label + }, + // label的位置,只能右边或者下边 + labelPos: { + type: String, + default: uni.$u.props.icon.labelPos + }, + // label的大小 + labelSize: { + type: [String, Number], + default: uni.$u.props.icon.labelSize + }, + // label的颜色 + labelColor: { + type: String, + default: uni.$u.props.icon.labelColor + }, + // label与图标的距离 + space: { + type: [String, Number], + default: uni.$u.props.icon.space + }, + // 图片的mode + imgMode: { + type: String, + default: uni.$u.props.icon.imgMode + }, + // 用于显示图片小图标时,图片的宽度 + width: { + type: [String, Number], + default: uni.$u.props.icon.width + }, + // 用于显示图片小图标时,图片的高度 + height: { + type: [String, Number], + default: uni.$u.props.icon.height + }, + // 用于解决某些情况下,让图标垂直居中的用途 + top: { + type: [String, Number], + default: uni.$u.props.icon.top + }, + // 是否阻止事件传播 + stop: { + type: Boolean, + default: uni.$u.props.icon.stop + } + } +} diff --git a/uview-ui/components/u-icon/u-icon.vue b/uview-ui/components/u-icon/u-icon.vue new file mode 100644 index 0000000..9340328 --- /dev/null +++ b/uview-ui/components/u-icon/u-icon.vue @@ -0,0 +1,234 @@ + + + + + diff --git a/uview-ui/components/u-image/props.js b/uview-ui/components/u-image/props.js new file mode 100644 index 0000000..2eabb74 --- /dev/null +++ b/uview-ui/components/u-image/props.js @@ -0,0 +1,84 @@ +export default { + props: { + // 图片地址 + src: { + type: String, + default: uni.$u.props.image.src + }, + // 裁剪模式 + mode: { + type: String, + default: uni.$u.props.image.mode + }, + // 宽度,单位任意 + width: { + type: [String, Number], + default: uni.$u.props.image.width + }, + // 高度,单位任意 + height: { + type: [String, Number], + default: uni.$u.props.image.height + }, + // 图片形状,circle-圆形,square-方形 + shape: { + type: String, + default: uni.$u.props.image.shape + }, + // 圆角,单位任意 + radius: { + type: [String, Number], + default: uni.$u.props.image.radius + }, + // 是否懒加载,微信小程序、App、百度小程序、字节跳动小程序 + lazyLoad: { + type: Boolean, + default: uni.$u.props.image.lazyLoad + }, + // 开启长按图片显示识别微信小程序码菜单 + showMenuByLongpress: { + type: Boolean, + default: uni.$u.props.image.showMenuByLongpress + }, + // 加载中的图标,或者小图片 + loadingIcon: { + type: String, + default: uni.$u.props.image.loadingIcon + }, + // 加载失败的图标,或者小图片 + errorIcon: { + type: String, + default: uni.$u.props.image.errorIcon + }, + // 是否显示加载中的图标或者自定义的slot + showLoading: { + type: Boolean, + default: uni.$u.props.image.showLoading + }, + // 是否显示加载错误的图标或者自定义的slot + showError: { + type: Boolean, + default: uni.$u.props.image.showError + }, + // 是否需要淡入效果 + fade: { + type: Boolean, + default: uni.$u.props.image.fade + }, + // 只支持网络资源,只对微信小程序有效 + webp: { + type: Boolean, + default: uni.$u.props.image.webp + }, + // 过渡时间,单位ms + duration: { + type: [String, Number], + default: uni.$u.props.image.duration + }, + // 背景颜色,用于深色页面加载图片时,为了和背景色融合 + bgColor: { + type: String, + default: uni.$u.props.image.bgColor + } + } +} diff --git a/uview-ui/components/u-image/u-image.vue b/uview-ui/components/u-image/u-image.vue new file mode 100644 index 0000000..473e35b --- /dev/null +++ b/uview-ui/components/u-image/u-image.vue @@ -0,0 +1,232 @@ + + + + + diff --git a/uview-ui/components/u-index-anchor/props.js b/uview-ui/components/u-index-anchor/props.js new file mode 100644 index 0000000..6d8b59a --- /dev/null +++ b/uview-ui/components/u-index-anchor/props.js @@ -0,0 +1,29 @@ +export default { + props: { + // 列表锚点文本内容 + text: { + type: [String, Number], + default: uni.$u.props.indexAnchor.text + }, + // 列表锚点文字颜色 + color: { + type: String, + default: uni.$u.props.indexAnchor.color + }, + // 列表锚点文字大小,单位默认px + size: { + type: [String, Number], + default: uni.$u.props.indexAnchor.size + }, + // 列表锚点背景颜色 + bgColor: { + type: String, + default: uni.$u.props.indexAnchor.bgColor + }, + // 列表锚点高度,单位默认px + height: { + type: [String, Number], + default: uni.$u.props.indexAnchor.height + } + } +} diff --git a/uview-ui/components/u-index-anchor/u-index-anchor.vue b/uview-ui/components/u-index-anchor/u-index-anchor.vue new file mode 100644 index 0000000..b95ddef --- /dev/null +++ b/uview-ui/components/u-index-anchor/u-index-anchor.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/uview-ui/components/u-index-item/props.js b/uview-ui/components/u-index-item/props.js new file mode 100644 index 0000000..7c11331 --- /dev/null +++ b/uview-ui/components/u-index-item/props.js @@ -0,0 +1,5 @@ +export default { + props: { + + } +} diff --git a/uview-ui/components/u-index-item/u-index-item.vue b/uview-ui/components/u-index-item/u-index-item.vue new file mode 100644 index 0000000..0bc7fb3 --- /dev/null +++ b/uview-ui/components/u-index-item/u-index-item.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/uview-ui/components/u-index-list/props.js b/uview-ui/components/u-index-list/props.js new file mode 100644 index 0000000..354d459 --- /dev/null +++ b/uview-ui/components/u-index-list/props.js @@ -0,0 +1,29 @@ +export default { + props: { + // 右边锚点非激活的颜色 + inactiveColor: { + type: String, + default: uni.$u.props.indexList.inactiveColor + }, + // 右边锚点激活的颜色 + activeColor: { + type: String, + default: uni.$u.props.indexList.activeColor + }, + // 索引字符列表,数组形式 + indexList: { + type: Array, + default: uni.$u.props.indexList.indexList + }, + // 是否开启锚点自动吸顶 + sticky: { + type: Boolean, + default: uni.$u.props.indexList.sticky + }, + // 自定义导航栏的高度 + customNavHeight: { + type: [String, Number], + default: uni.$u.props.indexList.customNavHeight + } + } +} diff --git a/uview-ui/components/u-index-list/u-index-list.vue b/uview-ui/components/u-index-list/u-index-list.vue new file mode 100644 index 0000000..d712618 --- /dev/null +++ b/uview-ui/components/u-index-list/u-index-list.vue @@ -0,0 +1,440 @@ + + + + + diff --git a/uview-ui/components/u-input/props.js b/uview-ui/components/u-input/props.js new file mode 100644 index 0000000..2c50870 --- /dev/null +++ b/uview-ui/components/u-input/props.js @@ -0,0 +1,187 @@ +export default { + props: { + // 输入的值 + value: { + type: [String, Number], + default: uni.$u.props.input.value + }, + // 输入框类型 + // number-数字输入键盘,app-vue下可以输入浮点数,app-nvue和小程序平台下只能输入整数 + // idcard-身份证输入键盘,微信、支付宝、百度、QQ小程序 + // digit-带小数点的数字键盘,App的nvue页面、微信、支付宝、百度、头条、QQ小程序 + // text-文本输入键盘 + type: { + type: String, + default: uni.$u.props.input.type + }, + // 如果 textarea 是在一个 position:fixed 的区域,需要显示指定属性 fixed 为 true, + // 兼容性:微信小程序、百度小程序、字节跳动小程序、QQ小程序 + fixed: { + type: Boolean, + default: uni.$u.props.input.fixed + }, + // 是否禁用输入框 + disabled: { + type: Boolean, + default: uni.$u.props.input.disabled + }, + // 禁用状态时的背景色 + disabledColor: { + type: String, + default: uni.$u.props.input.disabledColor + }, + // 是否显示清除控件 + clearable: { + type: Boolean, + default: uni.$u.props.input.clearable + }, + // 是否密码类型 + password: { + type: Boolean, + default: uni.$u.props.input.password + }, + // 最大输入长度,设置为 -1 的时候不限制最大长度 + maxlength: { + type: [String, Number], + default: uni.$u.props.input.maxlength + }, + // 输入框为空时的占位符 + placeholder: { + type: String, + default: uni.$u.props.input.placeholder + }, + // 指定placeholder的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/ + placeholderClass: { + type: String, + default: uni.$u.props.input.placeholderClass + }, + // 指定placeholder的样式 + placeholderStyle: { + type: [String, Object], + default: uni.$u.props.input.placeholderStyle + }, + // 是否显示输入字数统计,只在 type ="text"或type ="textarea"时有效 + showWordLimit: { + type: Boolean, + default: uni.$u.props.input.showWordLimit + }, + // 设置右下角按钮的文字,有效值:send|search|next|go|done,兼容性详见uni-app文档 + // https://uniapp.dcloud.io/component/input + // https://uniapp.dcloud.io/component/textarea + confirmType: { + type: String, + default: uni.$u.props.input.confirmType + }, + // 点击键盘右下角按钮时是否保持键盘不收起,H5无效 + confirmHold: { + type: Boolean, + default: uni.$u.props.input.confirmHold + }, + // focus时,点击页面的时候不收起键盘,微信小程序有效 + holdKeyboard: { + type: Boolean, + default: uni.$u.props.input.holdKeyboard + }, + // 自动获取焦点 + // 在 H5 平台能否聚焦以及软键盘是否跟随弹出,取决于当前浏览器本身的实现。nvue 页面不支持,需使用组件的 focus()、blur() 方法控制焦点 + focus: { + type: Boolean, + default: uni.$u.props.input.focus + }, + // 键盘收起时,是否自动失去焦点,目前仅App3.0.0+有效 + autoBlur: { + type: Boolean, + default: uni.$u.props.input.autoBlur + }, + // 是否去掉 iOS 下的默认内边距,仅微信小程序,且type=textarea时有效 + disableDefaultPadding: { + type: Boolean, + default: uni.$u.props.input.disableDefaultPadding + }, + // 指定focus时光标的位置 + cursor: { + type: [String, Number], + default: uni.$u.props.input.cursor + }, + // 输入框聚焦时底部与键盘的距离 + cursorSpacing: { + type: [String, Number], + default: uni.$u.props.input.cursorSpacing + }, + // 光标起始位置,自动聚集时有效,需与selection-end搭配使用 + selectionStart: { + type: [String, Number], + default: uni.$u.props.input.selectionStart + }, + // 光标结束位置,自动聚集时有效,需与selection-start搭配使用 + selectionEnd: { + type: [String, Number], + default: uni.$u.props.input.selectionEnd + }, + // 键盘弹起时,是否自动上推页面 + adjustPosition: { + type: Boolean, + default: uni.$u.props.input.adjustPosition + }, + // 输入框内容对齐方式,可选值为:left|center|right + inputAlign: { + type: String, + default: uni.$u.props.input.inputAlign + }, + // 输入框字体的大小 + fontSize: { + type: [String, Number], + default: uni.$u.props.input.fontSize + }, + // 输入框字体颜色 + color: { + type: String, + default: uni.$u.props.input.color + }, + // 输入框前置图标 + prefixIcon: { + type: String, + default: uni.$u.props.input.prefixIcon + }, + // 前置图标样式,对象或字符串 + prefixIconStyle: { + type: [String, Object], + default: uni.$u.props.input.prefixIconStyle + }, + // 输入框后置图标 + suffixIcon: { + type: String, + default: uni.$u.props.input.suffixIcon + }, + // 后置图标样式,对象或字符串 + suffixIconStyle: { + type: [String, Object], + default: uni.$u.props.input.suffixIconStyle + }, + // 边框类型,surround-四周边框,bottom-底部边框,none-无边框 + border: { + type: String, + default: uni.$u.props.input.border + }, + // 是否只读,与disabled不同之处在于disabled会置灰组件,而readonly则不会 + readonly: { + type: Boolean, + default: uni.$u.props.input.readonly + }, + // 输入框形状,circle-圆形,square-方形 + shape: { + type: String, + default: uni.$u.props.input.shape + }, + // 用于处理或者过滤输入框内容的方法 + formatter: { + type: [Function, null], + default: uni.$u.props.input.formatter + }, + // 是否忽略组件内对文本合成系统事件的处理 + ignoreCompositionEvent: { + type: Boolean, + default: true + } + } +} diff --git a/uview-ui/components/u-input/u-input.vue b/uview-ui/components/u-input/u-input.vue new file mode 100644 index 0000000..30073eb --- /dev/null +++ b/uview-ui/components/u-input/u-input.vue @@ -0,0 +1,354 @@ + + + + + diff --git a/uview-ui/components/u-keyboard/props.js b/uview-ui/components/u-keyboard/props.js new file mode 100644 index 0000000..cfdb00a --- /dev/null +++ b/uview-ui/components/u-keyboard/props.js @@ -0,0 +1,84 @@ +export default { + props: { + // 键盘的类型,number-数字键盘,card-身份证键盘,car-车牌号键盘 + mode: { + type: String, + default: uni.$u.props.keyboard.mode + }, + // 是否显示键盘的"."符号 + dotDisabled: { + type: Boolean, + default: uni.$u.props.keyboard.dotDisabled + }, + // 是否显示顶部工具条 + tooltip: { + type: Boolean, + default: uni.$u.props.keyboard.tooltip + }, + // 是否显示工具条中间的提示 + showTips: { + type: Boolean, + default: uni.$u.props.keyboard.showTips + }, + // 工具条中间的提示文字 + tips: { + type: String, + default: uni.$u.props.keyboard.tips + }, + // 是否显示工具条左边的"取消"按钮 + showCancel: { + type: Boolean, + default: uni.$u.props.keyboard.showCancel + }, + // 是否显示工具条右边的"完成"按钮 + showConfirm: { + type: Boolean, + default: uni.$u.props.keyboard.showConfirm + }, + // 是否打乱键盘按键的顺序 + random: { + type: Boolean, + default: uni.$u.props.keyboard.random + }, + // 是否开启底部安全区适配,开启的话,会在iPhoneX机型底部添加一定的内边距 + safeAreaInsetBottom: { + type: Boolean, + default: uni.$u.props.keyboard.safeAreaInsetBottom + }, + // 是否允许通过点击遮罩关闭键盘 + closeOnClickOverlay: { + type: Boolean, + default: uni.$u.props.keyboard.closeOnClickOverlay + }, + // 控制键盘的弹出与收起 + show: { + type: Boolean, + default: uni.$u.props.keyboard.show + }, + // 是否显示遮罩,某些时候数字键盘时,用户希望看到自己的数值,所以可能不想要遮罩 + overlay: { + type: Boolean, + default: uni.$u.props.keyboard.overlay + }, + // z-index值 + zIndex: { + type: [String, Number], + default: uni.$u.props.keyboard.zIndex + }, + // 取消按钮的文字 + cancelText: { + type: String, + default: uni.$u.props.keyboard.cancelText + }, + // 确认按钮的文字 + confirmText: { + type: String, + default: uni.$u.props.keyboard.confirmText + }, + // 输入一个中文后,是否自动切换到英文 + autoChange: { + type: Boolean, + default: uni.$u.props.keyboard.autoChange + } + } +} diff --git a/uview-ui/components/u-keyboard/u-keyboard.vue b/uview-ui/components/u-keyboard/u-keyboard.vue new file mode 100644 index 0000000..14228cb --- /dev/null +++ b/uview-ui/components/u-keyboard/u-keyboard.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/uview-ui/components/u-line-progress/props.js b/uview-ui/components/u-line-progress/props.js new file mode 100644 index 0000000..a4210bd --- /dev/null +++ b/uview-ui/components/u-line-progress/props.js @@ -0,0 +1,28 @@ +export default { + props: { + // 激活部分的颜色 + activeColor: { + type: String, + default: uni.$u.props.lineProgress.activeColor + }, + inactiveColor: { + type: String, + default: uni.$u.props.lineProgress.color + }, + // 进度百分比,数值 + percentage: { + type: [String, Number], + default: uni.$u.props.lineProgress.inactiveColor + }, + // 是否在进度条内部显示百分比的值 + showText: { + type: Boolean, + default: uni.$u.props.lineProgress.showText + }, + // 进度条的高度,单位px + height: { + type: [String, Number], + default: uni.$u.props.lineProgress.height + } + } +} diff --git a/uview-ui/components/u-line-progress/u-line-progress.vue b/uview-ui/components/u-line-progress/u-line-progress.vue new file mode 100644 index 0000000..4e27931 --- /dev/null +++ b/uview-ui/components/u-line-progress/u-line-progress.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/uview-ui/components/u-line/props.js b/uview-ui/components/u-line/props.js new file mode 100644 index 0000000..2308cc3 --- /dev/null +++ b/uview-ui/components/u-line/props.js @@ -0,0 +1,33 @@ +export default { + props: { + color: { + type: String, + default: uni.$u.props.line.color + }, + // 长度,竖向时表现为高度,横向时表现为长度,可以为百分比,带px单位的值等 + length: { + type: [String, Number], + default: uni.$u.props.line.length + }, + // 线条方向,col-竖向,row-横向 + direction: { + type: String, + default: uni.$u.props.line.direction + }, + // 是否显示细边框 + hairline: { + type: Boolean, + default: uni.$u.props.line.hairline + }, + // 线条与上下左右元素的间距,字符串形式,如"30px"、"20px 30px" + margin: { + type: [String, Number], + default: uni.$u.props.line.margin + }, + // 是否虚线,true-虚线,false-实线 + dashed: { + type: Boolean, + default: uni.$u.props.line.dashed + } + } +} diff --git a/uview-ui/components/u-line/u-line.vue b/uview-ui/components/u-line/u-line.vue new file mode 100644 index 0000000..e0a6d92 --- /dev/null +++ b/uview-ui/components/u-line/u-line.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/uview-ui/components/u-link/props.js b/uview-ui/components/u-link/props.js new file mode 100644 index 0000000..d39353f --- /dev/null +++ b/uview-ui/components/u-link/props.js @@ -0,0 +1,39 @@ +export default { + props: { + // 文字颜色 + color: { + type: String, + default: uni.$u.props.link.color + }, + // 字体大小,单位px + fontSize: { + type: [String, Number], + default: uni.$u.props.link.fontSize + }, + // 是否显示下划线 + underLine: { + type: Boolean, + default: uni.$u.props.link.underLine + }, + // 要跳转的链接 + href: { + type: String, + default: uni.$u.props.link.href + }, + // 小程序中复制到粘贴板的提示语 + mpTips: { + type: String, + default: uni.$u.props.link.mpTips + }, + // 下划线颜色 + lineColor: { + type: String, + default: uni.$u.props.link.lineColor + }, + // 超链接的问题,不使用slot形式传入,是因为nvue下无法修改颜色 + text: { + type: String, + default: uni.$u.props.link.text + } + } +} diff --git a/uview-ui/components/u-link/u-link.vue b/uview-ui/components/u-link/u-link.vue new file mode 100644 index 0000000..c6802a5 --- /dev/null +++ b/uview-ui/components/u-link/u-link.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/uview-ui/components/u-list-item/props.js b/uview-ui/components/u-list-item/props.js new file mode 100644 index 0000000..58ddc49 --- /dev/null +++ b/uview-ui/components/u-list-item/props.js @@ -0,0 +1,9 @@ +export default { + props: { + // 用于滚动到指定item + anchor: { + type: [String, Number], + default: uni.$u.props.listItem.anchor + } + } +} diff --git a/uview-ui/components/u-list-item/u-list-item.vue b/uview-ui/components/u-list-item/u-list-item.vue new file mode 100644 index 0000000..1a25db6 --- /dev/null +++ b/uview-ui/components/u-list-item/u-list-item.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/uview-ui/components/u-list/props.js b/uview-ui/components/u-list/props.js new file mode 100644 index 0000000..25406f4 --- /dev/null +++ b/uview-ui/components/u-list/props.js @@ -0,0 +1,76 @@ +export default { + props: { + // 控制是否出现滚动条,仅nvue有效 + showScrollbar: { + type: Boolean, + default: uni.$u.props.list.showScrollbar + }, + // 距底部多少时触发scrolltolower事件 + lowerThreshold: { + type: [String, Number], + default: uni.$u.props.list.lowerThreshold + }, + // 距顶部多少时触发scrolltoupper事件,非nvue有效 + upperThreshold: { + type: [String, Number], + default: uni.$u.props.list.upperThreshold + }, + // 设置竖向滚动条位置 + scrollTop: { + type: [String, Number], + default: uni.$u.props.list.scrollTop + }, + // 控制 onscroll 事件触发的频率,仅nvue有效 + offsetAccuracy: { + type: [String, Number], + default: uni.$u.props.list.offsetAccuracy + }, + // 启用 flexbox 布局。开启后,当前节点声明了display: flex就会成为flex container,并作用于其孩子节点,仅微信小程序有效 + enableFlex: { + type: Boolean, + default: uni.$u.props.list.enableFlex + }, + // 是否按分页模式显示List,默认值false + pagingEnabled: { + type: Boolean, + default: uni.$u.props.list.pagingEnabled + }, + // 是否允许List滚动 + scrollable: { + type: Boolean, + default: uni.$u.props.list.scrollable + }, + // 值应为某子元素id(id不能以数字开头) + scrollIntoView: { + type: String, + default: uni.$u.props.list.scrollIntoView + }, + // 在设置滚动条位置时使用动画过渡 + scrollWithAnimation: { + type: Boolean, + default: uni.$u.props.list.scrollWithAnimation + }, + // iOS点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,只对微信小程序有效 + enableBackToTop: { + type: Boolean, + default: uni.$u.props.list.enableBackToTop + }, + // 列表的高度 + height: { + type: [String, Number], + default: uni.$u.props.list.height + }, + // 列表宽度 + width: { + type: [String, Number], + default: uni.$u.props.list.width + }, + // 列表前后预渲染的屏数,1代表一个屏幕的高度,1.5代表1个半屏幕高度 + preLoadScreen: { + type: [String, Number], + default: uni.$u.props.list.preLoadScreen + } + // vue下,是否开启虚拟列表 + + } +} diff --git a/uview-ui/components/u-list/u-list.vue b/uview-ui/components/u-list/u-list.vue new file mode 100644 index 0000000..4447cab --- /dev/null +++ b/uview-ui/components/u-list/u-list.vue @@ -0,0 +1,157 @@ + + + + + diff --git a/uview-ui/components/u-loading-icon/props.js b/uview-ui/components/u-loading-icon/props.js new file mode 100644 index 0000000..c35524e --- /dev/null +++ b/uview-ui/components/u-loading-icon/props.js @@ -0,0 +1,59 @@ +export default { + props: { + // 是否显示组件 + show: { + type: Boolean, + default: uni.$u.props.loadingIcon.show + }, + // 颜色 + color: { + type: String, + default: uni.$u.props.loadingIcon.color + }, + // 提示文字颜色 + textColor: { + type: String, + default: uni.$u.props.loadingIcon.textColor + }, + // 文字和图标是否垂直排列 + vertical: { + type: Boolean, + default: uni.$u.props.loadingIcon.vertical + }, + // 模式选择,circle-圆形,spinner-花朵形,semicircle-半圆形 + mode: { + type: String, + default: uni.$u.props.loadingIcon.mode + }, + // 图标大小,单位默认px + size: { + type: [String, Number], + default: uni.$u.props.loadingIcon.size + }, + // 文字大小 + textSize: { + type: [String, Number], + default: uni.$u.props.loadingIcon.textSize + }, + // 文字内容 + text: { + type: [String, Number], + default: uni.$u.props.loadingIcon.text + }, + // 动画模式 + timingFunction: { + type: String, + default: uni.$u.props.loadingIcon.timingFunction + }, + // 动画执行周期时间 + duration: { + type: [String, Number], + default: uni.$u.props.loadingIcon.duration + }, + // mode=circle时的暗边颜色 + inactiveColor: { + type: String, + default: uni.$u.props.loadingIcon.inactiveColor + } + } +} diff --git a/uview-ui/components/u-loading-icon/u-loading-icon.vue b/uview-ui/components/u-loading-icon/u-loading-icon.vue new file mode 100644 index 0000000..2ede5c3 --- /dev/null +++ b/uview-ui/components/u-loading-icon/u-loading-icon.vue @@ -0,0 +1,343 @@ + + + + + diff --git a/uview-ui/components/u-loading-page/props.js b/uview-ui/components/u-loading-page/props.js new file mode 100644 index 0000000..e239b61 --- /dev/null +++ b/uview-ui/components/u-loading-page/props.js @@ -0,0 +1,49 @@ +export default { + props: { + // 提示内容 + loadingText: { + type: [String, Number], + default: uni.$u.props.loadingPage.loadingText + }, + // 文字上方用于替换loading动画的图片 + image: { + type: String, + default: uni.$u.props.loadingPage.image + }, + // 加载动画的模式,circle-圆形,spinner-花朵形,semicircle-半圆形 + loadingMode: { + type: String, + default: uni.$u.props.loadingPage.loadingMode + }, + // 是否加载中 + loading: { + type: Boolean, + default: uni.$u.props.loadingPage.loading + }, + // 背景色 + bgColor: { + type: String, + default: uni.$u.props.loadingPage.bgColor + }, + // 文字颜色 + color: { + type: String, + default: uni.$u.props.loadingPage.color + }, + // 文字大小 + fontSize: { + type: [String, Number], + default: uni.$u.props.loadingPage.fontSize + }, + // 图标大小 + iconSize: { + type: [String, Number], + default: uni.$u.props.loadingPage.fontSize + }, + // 加载中图标的颜色,只能rgb或者十六进制颜色值 + loadingColor: { + type: String, + default: uni.$u.props.loadingPage.loadingColor + } + } +} diff --git a/uview-ui/components/u-loading-page/u-loading-page.vue b/uview-ui/components/u-loading-page/u-loading-page.vue new file mode 100644 index 0000000..03a78ad --- /dev/null +++ b/uview-ui/components/u-loading-page/u-loading-page.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/uview-ui/components/u-loadmore/props.js b/uview-ui/components/u-loadmore/props.js new file mode 100644 index 0000000..1e67d89 --- /dev/null +++ b/uview-ui/components/u-loadmore/props.js @@ -0,0 +1,94 @@ +export default { + props: { + // 组件状态,loadmore-加载前的状态,loading-加载中的状态,nomore-没有更多的状态 + status: { + type: String, + default: uni.$u.props.loadmore.status + }, + // 组件背景色 + bgColor: { + type: String, + default: uni.$u.props.loadmore.bgColor + }, + // 是否显示加载中的图标 + icon: { + type: Boolean, + default: uni.$u.props.loadmore.icon + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: uni.$u.props.loadmore.fontSize + }, + // 图标大小 + iconSize: { + type: [String, Number], + default: uni.$u.props.loadmore.iconSize + }, + // 字体颜色 + color: { + type: String, + default: uni.$u.props.loadmore.color + }, + // 加载中状态的图标,spinner-花朵状图标,circle-圆圈状,semicircle-半圆 + loadingIcon: { + type: String, + default: uni.$u.props.loadmore.loadingIcon + }, + // 加载前的提示语 + loadmoreText: { + type: String, + default: uni.$u.props.loadmore.loadmoreText + }, + // 加载中提示语 + loadingText: { + type: String, + default: uni.$u.props.loadmore.loadingText + }, + // 没有更多的提示语 + nomoreText: { + type: String, + default: uni.$u.props.loadmore.nomoreText + }, + // 在“没有更多”状态下,是否显示粗点 + isDot: { + type: Boolean, + default: uni.$u.props.loadmore.isDot + }, + // 加载中图标的颜色 + iconColor: { + type: String, + default: uni.$u.props.loadmore.iconColor + }, + // 上边距 + marginTop: { + type: [String, Number], + default: uni.$u.props.loadmore.marginTop + }, + // 下边距 + marginBottom: { + type: [String, Number], + default: uni.$u.props.loadmore.marginBottom + }, + // 高度,单位px + height: { + type: [String, Number], + default: uni.$u.props.loadmore.height + }, + // 是否显示左边分割线 + line: { + type: Boolean, + default: uni.$u.props.loadmore.line + }, + // 线条颜色 + lineColor: { + type: String, + default: uni.$u.props.loadmore.lineColor + }, + // 是否虚线,true-虚线,false-实线 + dashed: { + type: Boolean, + default: uni.$u.props.loadmore.dashed + } + } +} diff --git a/uview-ui/components/u-loadmore/u-loadmore.vue b/uview-ui/components/u-loadmore/u-loadmore.vue new file mode 100644 index 0000000..73c79fe --- /dev/null +++ b/uview-ui/components/u-loadmore/u-loadmore.vue @@ -0,0 +1,150 @@ + + + + + diff --git a/uview-ui/components/u-modal/props.js b/uview-ui/components/u-modal/props.js new file mode 100644 index 0000000..f76672c --- /dev/null +++ b/uview-ui/components/u-modal/props.js @@ -0,0 +1,84 @@ +export default { + props: { + // 是否展示modal + show: { + type: Boolean, + default: uni.$u.props.modal.show + }, + // 标题 + title: { + type: [String], + default: uni.$u.props.modal.title + }, + // 弹窗内容 + content: { + type: String, + default: uni.$u.props.modal.content + }, + // 确认文案 + confirmText: { + type: String, + default: uni.$u.props.modal.confirmText + }, + // 取消文案 + cancelText: { + type: String, + default: uni.$u.props.modal.cancelText + }, + // 是否显示确认按钮 + showConfirmButton: { + type: Boolean, + default: uni.$u.props.modal.showConfirmButton + }, + // 是否显示取消按钮 + showCancelButton: { + type: Boolean, + default: uni.$u.props.modal.showCancelButton + }, + // 确认按钮颜色 + confirmColor: { + type: String, + default: uni.$u.props.modal.confirmColor + }, + // 取消文字颜色 + cancelColor: { + type: String, + default: uni.$u.props.modal.cancelColor + }, + // 对调确认和取消的位置 + buttonReverse: { + type: Boolean, + default: uni.$u.props.modal.buttonReverse + }, + // 是否开启缩放效果 + zoom: { + type: Boolean, + default: uni.$u.props.modal.zoom + }, + // 是否异步关闭,只对确定按钮有效 + asyncClose: { + type: Boolean, + default: uni.$u.props.modal.asyncClose + }, + // 是否允许点击遮罩关闭modal + closeOnClickOverlay: { + type: Boolean, + default: uni.$u.props.modal.closeOnClickOverlay + }, + // 给一个负的margin-top,往上偏移,避免和键盘重合的情况 + negativeTop: { + type: [String, Number], + default: uni.$u.props.modal.negativeTop + }, + // modal宽度,不支持百分比,可以数值,px,rpx单位 + width: { + type: [String, Number], + default: uni.$u.props.modal.width + }, + // 确认按钮的样式,circle-圆形,square-方形,如设置,将不会显示取消按钮 + confirmButtonShape: { + type: String, + default: uni.$u.props.modal.confirmButtonShape + } + } +} diff --git a/uview-ui/components/u-modal/u-modal.vue b/uview-ui/components/u-modal/u-modal.vue new file mode 100644 index 0000000..4c37ae2 --- /dev/null +++ b/uview-ui/components/u-modal/u-modal.vue @@ -0,0 +1,227 @@ + + + + + diff --git a/uview-ui/components/u-navbar/props.js b/uview-ui/components/u-navbar/props.js new file mode 100644 index 0000000..5398de2 --- /dev/null +++ b/uview-ui/components/u-navbar/props.js @@ -0,0 +1,84 @@ +export default { + props: { + // 是否开启顶部安全区适配 + safeAreaInsetTop: { + type: Boolean, + default: uni.$u.props.navbar.safeAreaInsetTop + }, + // 固定在顶部时,是否生成一个等高元素,以防止塌陷 + placeholder: { + type: Boolean, + default: uni.$u.props.navbar.placeholder + }, + // 是否固定在顶部 + fixed: { + type: Boolean, + default: uni.$u.props.navbar.fixed + }, + // 是否显示下边框 + border: { + type: Boolean, + default: uni.$u.props.navbar.border + }, + // 左边的图标 + leftIcon: { + type: String, + default: uni.$u.props.navbar.leftIcon + }, + // 左边的提示文字 + leftText: { + type: String, + default: uni.$u.props.navbar.leftText + }, + // 左右的提示文字 + rightText: { + type: String, + default: uni.$u.props.navbar.rightText + }, + // 右边的图标 + rightIcon: { + type: String, + default: uni.$u.props.navbar.rightIcon + }, + // 标题 + title: { + type: [String, Number], + default: uni.$u.props.navbar.title + }, + // 背景颜色 + bgColor: { + type: String, + default: uni.$u.props.navbar.bgColor + }, + // 标题的宽度 + titleWidth: { + type: [String, Number], + default: uni.$u.props.navbar.titleWidth + }, + // 导航栏高度 + height: { + type: [String, Number], + default: uni.$u.props.navbar.height + }, + // 左侧返回图标的大小 + leftIconSize: { + type: [String, Number], + default: uni.$u.props.navbar.leftIconSize + }, + // 左侧返回图标的颜色 + leftIconColor: { + type: String, + default: uni.$u.props.navbar.leftIconColor + }, + // 点击左侧区域(返回图标),是否自动返回上一页 + autoBack: { + type: Boolean, + default: uni.$u.props.navbar.autoBack + }, + // 标题的样式,对象或字符串 + titleStyle: { + type: [String, Object], + default: uni.$u.props.navbar.titleStyle + } + } +} diff --git a/uview-ui/components/u-navbar/u-navbar.vue b/uview-ui/components/u-navbar/u-navbar.vue new file mode 100644 index 0000000..2b206b7 --- /dev/null +++ b/uview-ui/components/u-navbar/u-navbar.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/uview-ui/components/u-no-network/props.js b/uview-ui/components/u-no-network/props.js new file mode 100644 index 0000000..9f3af62 --- /dev/null +++ b/uview-ui/components/u-no-network/props.js @@ -0,0 +1,19 @@ +export default { + props: { + // 页面文字提示 + tips: { + type: String, + default: uni.$u.props.noNetwork.tips + }, + // 一个z-index值,用于设置没有网络这个组件的层次,因为页面可能会有其他定位的元素层级过高,导致此组件被覆盖 + zIndex: { + type: [String, Number], + default: uni.$u.props.noNetwork.zIndex + }, + // image 没有网络的图片提示 + image: { + type: String, + default: uni.$u.props.noNetwork.image + } + } +} diff --git a/uview-ui/components/u-no-network/u-no-network.vue b/uview-ui/components/u-no-network/u-no-network.vue new file mode 100644 index 0000000..9710729 --- /dev/null +++ b/uview-ui/components/u-no-network/u-no-network.vue @@ -0,0 +1,220 @@ + + + + + diff --git a/uview-ui/components/u-notice-bar/props.js b/uview-ui/components/u-notice-bar/props.js new file mode 100644 index 0000000..7040c29 --- /dev/null +++ b/uview-ui/components/u-notice-bar/props.js @@ -0,0 +1,70 @@ +export default { + props: { + // 显示的内容,数组 + text: { + type: [Array, String], + default: uni.$u.props.noticeBar.text + }, + // 通告滚动模式,row-横向滚动,column-竖向滚动 + direction: { + type: String, + default: uni.$u.props.noticeBar.direction + }, + // direction = row时,是否使用步进形式滚动 + step: { + type: Boolean, + default: uni.$u.props.noticeBar.step + }, + // 是否显示左侧的音量图标 + icon: { + type: String, + default: uni.$u.props.noticeBar.icon + }, + // 通告模式,link-显示右箭头,closable-显示右侧关闭图标 + mode: { + type: String, + default: uni.$u.props.noticeBar.mode + }, + // 文字颜色,各图标也会使用文字颜色 + color: { + type: String, + default: uni.$u.props.noticeBar.color + }, + // 背景颜色 + bgColor: { + type: String, + default: uni.$u.props.noticeBar.bgColor + }, + // 水平滚动时的滚动速度,即每秒滚动多少px(px),这有利于控制文字无论多少时,都能有一个恒定的速度 + speed: { + type: [String, Number], + default: uni.$u.props.noticeBar.speed + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: uni.$u.props.noticeBar.fontSize + }, + // 滚动一个周期的时间长,单位ms + duration: { + type: [String, Number], + default: uni.$u.props.noticeBar.duration + }, + // 是否禁止用手滑动切换 + // 目前HX2.6.11,只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序 + disableTouch: { + type: Boolean, + default: uni.$u.props.noticeBar.disableTouch + }, + // 跳转的页面路径 + url: { + type: String, + default: uni.$u.props.noticeBar.url + }, + // 页面跳转的类型 + linkType: { + type: String, + default: uni.$u.props.noticeBar.linkType + } + } +} diff --git a/uview-ui/components/u-notice-bar/u-notice-bar.vue b/uview-ui/components/u-notice-bar/u-notice-bar.vue new file mode 100644 index 0000000..a06eb39 --- /dev/null +++ b/uview-ui/components/u-notice-bar/u-notice-bar.vue @@ -0,0 +1,101 @@ + + + + diff --git a/uview-ui/components/u-notify/props.js b/uview-ui/components/u-notify/props.js new file mode 100644 index 0000000..57a9d71 --- /dev/null +++ b/uview-ui/components/u-notify/props.js @@ -0,0 +1,49 @@ +export default { + props: { + // 到顶部的距离 + top: { + type: [String, Number], + default: uni.$u.props.notify.top + }, + // 是否展示组件 + // show: { + // type: Boolean, + // default: uni.$u.props.notify.show + // }, + // type主题,primary,success,warning,error + type: { + type: String, + default: uni.$u.props.notify.type + }, + // 字体颜色 + color: { + type: String, + default: uni.$u.props.notify.color + }, + // 背景颜色 + bgColor: { + type: String, + default: uni.$u.props.notify.bgColor + }, + // 展示的文字内容 + message: { + type: String, + default: uni.$u.props.notify.message + }, + // 展示时长,为0时不消失,单位ms + duration: { + type: [String, Number], + default: uni.$u.props.notify.duration + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: uni.$u.props.notify.fontSize + }, + // 是否留出顶部安全距离(状态栏高度) + safeAreaInsetTop: { + type: Boolean, + default: uni.$u.props.notify.safeAreaInsetTop + } + } +} diff --git a/uview-ui/components/u-notify/u-notify.vue b/uview-ui/components/u-notify/u-notify.vue new file mode 100644 index 0000000..30adb72 --- /dev/null +++ b/uview-ui/components/u-notify/u-notify.vue @@ -0,0 +1,211 @@ + + + + + diff --git a/uview-ui/components/u-number-box/props.js b/uview-ui/components/u-number-box/props.js new file mode 100644 index 0000000..fb0fa94 --- /dev/null +++ b/uview-ui/components/u-number-box/props.js @@ -0,0 +1,109 @@ +export default { + props: { + // 步进器标识符,在change回调返回 + name: { + type: [String, Number], + default: uni.$u.props.numberBox.name + }, + // 用于双向绑定的值,初始化时设置设为默认min值(最小值) + value: { + type: [String, Number], + default: uni.$u.props.numberBox.value + }, + // 最小值 + min: { + type: [String, Number], + default: uni.$u.props.numberBox.min + }, + // 最大值 + max: { + type: [String, Number], + default: uni.$u.props.numberBox.max + }, + // 加减的步长,可为小数 + step: { + type: [String, Number], + default: uni.$u.props.numberBox.step + }, + // 是否只允许输入整数 + integer: { + type: Boolean, + default: uni.$u.props.numberBox.integer + }, + // 是否禁用,包括输入框,加减按钮 + disabled: { + type: Boolean, + default: uni.$u.props.numberBox.disabled + }, + // 是否禁用输入框 + disabledInput: { + type: Boolean, + default: uni.$u.props.numberBox.disabledInput + }, + // 是否开启异步变更,开启后需要手动控制输入值 + asyncChange: { + type: Boolean, + default: uni.$u.props.numberBox.asyncChange + }, + // 输入框宽度,单位为px + inputWidth: { + type: [String, Number], + default: uni.$u.props.numberBox.inputWidth + }, + // 是否显示减少按钮 + showMinus: { + type: Boolean, + default: uni.$u.props.numberBox.showMinus + }, + // 是否显示增加按钮 + showPlus: { + type: Boolean, + default: uni.$u.props.numberBox.showPlus + }, + // 显示的小数位数 + decimalLength: { + type: [String, Number, null], + default: uni.$u.props.numberBox.decimalLength + }, + // 是否开启长按加减手势 + longPress: { + type: Boolean, + default: uni.$u.props.numberBox.longPress + }, + // 输入框文字和加减按钮图标的颜色 + color: { + type: String, + default: uni.$u.props.numberBox.color + }, + // 按钮大小,宽高等于此值,单位px,输入框高度和此值保持一致 + buttonSize: { + type: [String, Number], + default: uni.$u.props.numberBox.buttonSize + }, + // 输入框和按钮的背景颜色 + bgColor: { + type: String, + default: uni.$u.props.numberBox.bgColor + }, + // 指定光标于键盘的距离,避免键盘遮挡输入框,单位px + cursorSpacing: { + type: [String, Number], + default: uni.$u.props.numberBox.cursorSpacing + }, + // 是否禁用增加按钮 + disablePlus: { + type: Boolean, + default: uni.$u.props.numberBox.disablePlus + }, + // 是否禁用减少按钮 + disableMinus: { + type: Boolean, + default: uni.$u.props.numberBox.disableMinus + }, + // 加减按钮图标的样式 + iconStyle: { + type: [Object, String], + default: uni.$u.props.numberBox.iconStyle + } + } +} diff --git a/uview-ui/components/u-number-box/u-number-box.vue b/uview-ui/components/u-number-box/u-number-box.vue new file mode 100644 index 0000000..69211c5 --- /dev/null +++ b/uview-ui/components/u-number-box/u-number-box.vue @@ -0,0 +1,416 @@ + + + + + diff --git a/uview-ui/components/u-number-keyboard/props.js b/uview-ui/components/u-number-keyboard/props.js new file mode 100644 index 0000000..5e3bf55 --- /dev/null +++ b/uview-ui/components/u-number-keyboard/props.js @@ -0,0 +1,19 @@ +export default { + props: { + // 键盘的类型,number-数字键盘,card-身份证键盘 + mode: { + type: String, + default: uni.$u.props.numberKeyboard.value + }, + // 是否显示键盘的"."符号 + dotDisabled: { + type: Boolean, + default: uni.$u.props.numberKeyboard.dotDisabled + }, + // 是否打乱键盘按键的顺序 + random: { + type: Boolean, + default: uni.$u.props.numberKeyboard.random + } + } +} diff --git a/uview-ui/components/u-number-keyboard/u-number-keyboard.vue b/uview-ui/components/u-number-keyboard/u-number-keyboard.vue new file mode 100644 index 0000000..4f505c6 --- /dev/null +++ b/uview-ui/components/u-number-keyboard/u-number-keyboard.vue @@ -0,0 +1,196 @@ + + + + + diff --git a/uview-ui/components/u-overlay/props.js b/uview-ui/components/u-overlay/props.js new file mode 100644 index 0000000..e6974df --- /dev/null +++ b/uview-ui/components/u-overlay/props.js @@ -0,0 +1,24 @@ +export default { + props: { + // 是否显示遮罩 + show: { + type: Boolean, + default: uni.$u.props.overlay.show + }, + // 层级z-index + zIndex: { + type: [String, Number], + default: uni.$u.props.overlay.zIndex + }, + // 遮罩的过渡时间,单位为ms + duration: { + type: [String, Number], + default: uni.$u.props.overlay.duration + }, + // 不透明度值,当做rgba的第四个参数 + opacity: { + type: [String, Number], + default: uni.$u.props.overlay.opacity + } + } +} diff --git a/uview-ui/components/u-overlay/u-overlay.vue b/uview-ui/components/u-overlay/u-overlay.vue new file mode 100644 index 0000000..92de4e9 --- /dev/null +++ b/uview-ui/components/u-overlay/u-overlay.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/uview-ui/components/u-parse/node/node.vue b/uview-ui/components/u-parse/node/node.vue new file mode 100644 index 0000000..73e30fd --- /dev/null +++ b/uview-ui/components/u-parse/node/node.vue @@ -0,0 +1,499 @@ +