From 4722f9d1992e54850311f73752ed0aba8f216de0 Mon Sep 17 00:00:00 2001 From: wkj <278599135@qq.com> Date: Tue, 12 Jul 2022 16:24:49 +0800 Subject: [PATCH] =?UTF-8?q?business=20=E7=9B=AE=E5=BD=95=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/UI/divider/index.json | 3 + app/components/UI/divider/index.less | 31 + app/components/UI/divider/index.ts | 15 + app/components/UI/divider/index.wxml | 2 + app/components/UI/fab/index.json | 3 + app/components/UI/fab/index.less | 82 ++ app/components/UI/fab/index.ts | 89 ++ app/components/UI/fab/index.wxml | 5 + app/components/extraFile/gallery/index.json | 2 +- app/components/message/index.json | 2 +- app/config/styles/_base.less | 2 +- app/miniprogram_npm/config/styles/_base.less | 1 + .../config/styles/_mixins.less | 1 + app/miniprogram_npm/config/styles/_theme.less | 1 + .../lin-ui/action-sheet/index.js | 124 +++ .../lin-ui/action-sheet/index.json | 8 + .../lin-ui/action-sheet/index.less | 34 + .../lin-ui/action-sheet/index.wxml | 26 + app/miniprogram_npm/lin-ui/album/index.js | 189 ++++ app/miniprogram_npm/lin-ui/album/index.json | 5 + app/miniprogram_npm/lin-ui/album/index.less | 47 + app/miniprogram_npm/lin-ui/album/index.wxml | 12 + app/miniprogram_npm/lin-ui/album/index.wxs | 79 ++ app/miniprogram_npm/lin-ui/arc-popup/index.js | 166 ++++ .../lin-ui/arc-popup/index.json | 6 + .../lin-ui/arc-popup/index.less | 25 + .../lin-ui/arc-popup/index.wxml | 24 + app/miniprogram_npm/lin-ui/avatar/index.js | 70 ++ app/miniprogram_npm/lin-ui/avatar/index.json | 6 + app/miniprogram_npm/lin-ui/avatar/index.less | 84 ++ app/miniprogram_npm/lin-ui/avatar/index.wxml | 12 + app/miniprogram_npm/lin-ui/badge/index.js | 93 ++ app/miniprogram_npm/lin-ui/badge/index.json | 6 + app/miniprogram_npm/lin-ui/badge/index.less | 54 ++ app/miniprogram_npm/lin-ui/badge/index.wxml | 7 + .../lin-ui/behaviors/computeOffset.js | 19 + .../lin-ui/behaviors/countdown.js | 222 +++++ app/miniprogram_npm/lin-ui/behaviors/hover.js | 10 + app/miniprogram_npm/lin-ui/behaviors/rules.js | 144 ++++ .../lin-ui/behaviors/scrollCenter.js | 57 ++ .../lin-ui/behaviors/transition.js | 122 +++ .../lin-ui/behaviors/validator.js | 21 + .../lin-ui/behaviors/watchShow.js | 26 + .../lin-ui/behaviors/zIndex.js | 10 + app/miniprogram_npm/lin-ui/button/index.js | 94 ++ app/miniprogram_npm/lin-ui/button/index.json | 6 + app/miniprogram_npm/lin-ui/button/index.less | 207 +++++ app/miniprogram_npm/lin-ui/button/index.wxml | 39 + .../lin-ui/calendar/calendar.wxml | 29 + .../lin-ui/calendar/components/day/index.js | 16 + .../lin-ui/calendar/components/day/index.json | 3 + .../lin-ui/calendar/components/day/index.less | 67 ++ .../lin-ui/calendar/components/day/index.wxml | 8 + .../lin-ui/calendar/components/day/index.wxs | 27 + .../calendar/components/header/index.js | 15 + .../calendar/components/header/index.json | 3 + .../calendar/components/header/index.less | 29 + .../calendar/components/header/index.wxml | 20 + .../calendar/components/mounth/index.js | 195 +++++ .../calendar/components/mounth/index.json | 6 + .../calendar/components/mounth/index.less | 21 + .../calendar/components/mounth/index.wxml | 24 + .../calendar/components/mounth/index.wxs | 12 + app/miniprogram_npm/lin-ui/calendar/config.js | 3 + app/miniprogram_npm/lin-ui/calendar/dete.js | 42 + app/miniprogram_npm/lin-ui/calendar/index.js | 346 ++++++++ .../lin-ui/calendar/index.json | 10 + .../lin-ui/calendar/index.less | 36 + .../lin-ui/calendar/index.wxml | 10 + app/miniprogram_npm/lin-ui/calendar/index.wxs | 37 + app/miniprogram_npm/lin-ui/calendar/util.js | 113 +++ app/miniprogram_npm/lin-ui/calendar/utils.wxs | 24 + .../capsule-bar/icons/capsule-left-black.png | Bin 0 -> 550 bytes .../capsule-bar/icons/capsule-left-white.png | Bin 0 -> 552 bytes .../capsule-bar/icons/capsule-right-black.png | Bin 0 -> 591 bytes .../capsule-bar/icons/capsule-right-white.png | Bin 0 -> 600 bytes .../lin-ui/capsule-bar/index.js | 179 ++++ .../lin-ui/capsule-bar/index.json | 3 + .../lin-ui/capsule-bar/index.less | 79 ++ .../lin-ui/capsule-bar/index.wxml | 60 ++ app/miniprogram_npm/lin-ui/card/index.js | 47 + app/miniprogram_npm/lin-ui/card/index.json | 4 + app/miniprogram_npm/lin-ui/card/index.less | 138 +++ app/miniprogram_npm/lin-ui/card/index.wxml | 25 + .../lin-ui/checkbox-group/index.js | 120 +++ .../lin-ui/checkbox-group/index.json | 7 + .../lin-ui/checkbox-group/index.less | 18 + .../lin-ui/checkbox-group/index.wxml | 4 + app/miniprogram_npm/lin-ui/checkbox/index.js | 115 +++ .../lin-ui/checkbox/index.json | 6 + .../lin-ui/checkbox/index.less | 57 ++ .../lin-ui/checkbox/index.wxml | 7 + app/miniprogram_npm/lin-ui/circle/index.js | 133 +++ app/miniprogram_npm/lin-ui/circle/index.json | 4 + app/miniprogram_npm/lin-ui/circle/index.less | 45 + app/miniprogram_npm/lin-ui/circle/index.wxml | 10 + .../lin-ui/collapse-item/index.js | 137 +++ .../lin-ui/collapse-item/index.json | 7 + .../lin-ui/collapse-item/index.less | 36 + .../lin-ui/collapse-item/index.wxml | 13 + app/miniprogram_npm/lin-ui/collapse/index.js | 133 +++ .../lin-ui/collapse/index.json | 5 + .../lin-ui/collapse/index.less | 0 .../lin-ui/collapse/index.wxml | 3 + .../lin-ui/combined-tabs/index.js | 256 ++++++ .../lin-ui/combined-tabs/index.json | 7 + .../lin-ui/combined-tabs/index.less | 260 ++++++ .../lin-ui/combined-tabs/index.wxml | 44 + .../lin-ui/common/async-validator/index.js | 258 ++++++ .../lin-ui/common/async-validator/messages.js | 56 ++ .../common/async-validator/rule/enum.js | 22 + .../common/async-validator/rule/index.js | 15 + .../common/async-validator/rule/pattern.js | 36 + .../common/async-validator/rule/range.js | 59 ++ .../common/async-validator/rule/required.js | 21 + .../common/async-validator/rule/type.js | 91 ++ .../common/async-validator/rule/whitespace.js | 20 + .../lin-ui/common/async-validator/util.js | 176 ++++ .../common/async-validator/validator/array.js | 29 + .../async-validator/validator/boolean.js | 29 + .../common/async-validator/validator/date.js | 32 + .../common/async-validator/validator/enum.js | 30 + .../common/async-validator/validator/float.js | 30 + .../common/async-validator/validator/index.js | 33 + .../async-validator/validator/integer.js | 30 + .../async-validator/validator/method.js | 29 + .../async-validator/validator/number.js | 30 + .../async-validator/validator/object.js | 29 + .../async-validator/validator/pattern.js | 32 + .../async-validator/validator/regexp.js | 29 + .../async-validator/validator/required.js | 10 + .../async-validator/validator/string.js | 34 + .../common/async-validator/validator/type.js | 20 + .../core/behaviors/doNothingBehavior.js | 8 + .../lin-ui/core/utils/data-util.js | 25 + .../lin-ui/core/utils/event-bus.js | 48 ++ .../lin-ui/core/utils/event-util.js | 12 + .../lin-ui/core/utils/node-util.js | 49 ++ .../lin-ui/core/utils/pixel-util.js | 33 + app/miniprogram_npm/lin-ui/countdown/index.js | 18 + .../lin-ui/countdown/index.json | 6 + .../lin-ui/countdown/index.less | 21 + .../lin-ui/countdown/index.wxml | 3 + app/miniprogram_npm/lin-ui/counter/index.js | 129 +++ app/miniprogram_npm/lin-ui/counter/index.json | 6 + app/miniprogram_npm/lin-ui/counter/index.less | 68 ++ app/miniprogram_npm/lin-ui/counter/index.wxml | 25 + .../lin-ui/custom-tab-bar/index.js | 121 +++ .../lin-ui/custom-tab-bar/index.json | 3 + .../lin-ui/custom-tab-bar/index.less | 99 +++ .../lin-ui/custom-tab-bar/index.wxml | 33 + app/miniprogram_npm/lin-ui/dialog/index.js | 214 +++++ app/miniprogram_npm/lin-ui/dialog/index.json | 6 + app/miniprogram_npm/lin-ui/dialog/index.less | 76 ++ app/miniprogram_npm/lin-ui/dialog/index.wxml | 20 + app/miniprogram_npm/lin-ui/error-tip/index.js | 24 + .../lin-ui/error-tip/index.json | 6 + .../lin-ui/error-tip/index.less | 8 + .../lin-ui/error-tip/index.wxml | 1 + app/miniprogram_npm/lin-ui/filter/array.wxs | 174 ++++ .../lin-ui/filter/classnames.wxs | 33 + app/miniprogram_npm/lin-ui/filter/is.wxs | 70 ++ app/miniprogram_npm/lin-ui/filter/object.wxs | 12 + app/miniprogram_npm/lin-ui/filter/string.wxs | 178 ++++ .../lin-ui/filter/zero-padding.wxs | 8 + app/miniprogram_npm/lin-ui/form-item/index.js | 84 ++ .../lin-ui/form-item/index.json | 6 + .../lin-ui/form-item/index.less | 88 ++ .../lin-ui/form-item/index.wxml | 16 + app/miniprogram_npm/lin-ui/form/index.js | 181 ++++ app/miniprogram_npm/lin-ui/form/index.json | 6 + app/miniprogram_npm/lin-ui/form/index.less | 1 + app/miniprogram_npm/lin-ui/form/index.wxml | 14 + app/miniprogram_npm/lin-ui/grid-item/index.js | 52 ++ .../lin-ui/grid-item/index.json | 6 + .../lin-ui/grid-item/index.less | 12 + .../lin-ui/grid-item/index.wxml | 9 + app/miniprogram_npm/lin-ui/grid/index.js | 85 ++ app/miniprogram_npm/lin-ui/grid/index.json | 6 + app/miniprogram_npm/lin-ui/grid/index.less | 24 + app/miniprogram_npm/lin-ui/grid/index.wxml | 10 + app/miniprogram_npm/lin-ui/icon/index.js | 29 + app/miniprogram_npm/lin-ui/icon/index.json | 6 + app/miniprogram_npm/lin-ui/icon/index.less | 203 +++++ app/miniprogram_npm/lin-ui/icon/index.wxml | 4 + .../lin-ui/image-clipper-tools/index.js | 80 ++ .../lin-ui/image-clipper-tools/index.json | 4 + .../lin-ui/image-clipper-tools/index.less | 21 + .../lin-ui/image-clipper-tools/index.wxml | 28 + .../lin-ui/image-clipper/calculate.js | 262 ++++++ .../lin-ui/image-clipper/images/close.png | Bin 0 -> 2768 bytes .../lin-ui/image-clipper/images/photo.png | Bin 0 -> 1288 bytes .../image-clipper/images/rotate-along.png | Bin 0 -> 1796 bytes .../image-clipper/images/rotate-inverse.png | Bin 0 -> 1786 bytes .../lin-ui/image-clipper/images/sure.png | Bin 0 -> 2620 bytes .../lin-ui/image-clipper/index.js | 815 ++++++++++++++++++ .../lin-ui/image-clipper/index.json | 4 + .../lin-ui/image-clipper/index.less | 131 +++ .../lin-ui/image-clipper/index.wxml | 68 ++ .../lin-ui/image-picker/image/add.png | Bin 0 -> 381 bytes .../lin-ui/image-picker/index.js | 318 +++++++ .../lin-ui/image-picker/index.json | 7 + .../lin-ui/image-picker/index.less | 88 ++ .../lin-ui/image-picker/index.wxml | 25 + .../lin-ui/index-anchor/index.js | 115 +++ .../lin-ui/index-anchor/index.json | 6 + .../lin-ui/index-anchor/index.less | 19 + .../lin-ui/index-anchor/index.wxml | 11 + .../lin-ui/index-list/index.js | 451 ++++++++++ .../lin-ui/index-list/index.json | 4 + .../lin-ui/index-list/index.less | 49 ++ .../lin-ui/index-list/index.wxml | 15 + app/miniprogram_npm/lin-ui/input/index.js | 165 ++++ app/miniprogram_npm/lin-ui/input/index.json | 7 + app/miniprogram_npm/lin-ui/input/index.less | 94 ++ app/miniprogram_npm/lin-ui/input/index.wxml | 55 ++ app/miniprogram_npm/lin-ui/label/index.js | 119 +++ app/miniprogram_npm/lin-ui/label/index.json | 7 + app/miniprogram_npm/lin-ui/label/index.less | 93 ++ app/miniprogram_npm/lin-ui/label/index.wxml | 35 + app/miniprogram_npm/lin-ui/list/index.js | 107 +++ app/miniprogram_npm/lin-ui/list/index.json | 8 + app/miniprogram_npm/lin-ui/list/index.less | 65 ++ app/miniprogram_npm/lin-ui/list/index.wxml | 43 + app/miniprogram_npm/lin-ui/loading/index.js | 87 ++ app/miniprogram_npm/lin-ui/loading/index.json | 6 + app/miniprogram_npm/lin-ui/loading/index.less | 434 ++++++++++ app/miniprogram_npm/lin-ui/loading/index.wxml | 77 ++ app/miniprogram_npm/lin-ui/loadmore/index.js | 84 ++ .../lin-ui/loadmore/index.json | 6 + .../lin-ui/loadmore/index.less | 53 ++ .../lin-ui/loadmore/index.wxml | 19 + app/miniprogram_npm/lin-ui/mask/index.js | 84 ++ app/miniprogram_npm/lin-ui/mask/index.json | 6 + app/miniprogram_npm/lin-ui/mask/index.less | 30 + app/miniprogram_npm/lin-ui/mask/index.wxml | 13 + app/miniprogram_npm/lin-ui/message/index.js | 95 ++ app/miniprogram_npm/lin-ui/message/index.json | 6 + app/miniprogram_npm/lin-ui/message/index.less | 47 + app/miniprogram_npm/lin-ui/message/index.wxml | 10 + .../lin-ui/notice-bar/index.js | 161 ++++ .../lin-ui/notice-bar/index.json | 8 + .../lin-ui/notice-bar/index.less | 48 ++ .../lin-ui/notice-bar/index.wxml | 17 + app/miniprogram_npm/lin-ui/panel/index.js | 30 + app/miniprogram_npm/lin-ui/panel/index.json | 6 + app/miniprogram_npm/lin-ui/panel/index.less | 26 + app/miniprogram_npm/lin-ui/panel/index.wxml | 15 + app/miniprogram_npm/lin-ui/picker/index.js | 188 ++++ app/miniprogram_npm/lin-ui/picker/index.json | 7 + app/miniprogram_npm/lin-ui/picker/index.less | 97 +++ app/miniprogram_npm/lin-ui/picker/index.wxml | 41 + app/miniprogram_npm/lin-ui/popup/index.js | 145 ++++ app/miniprogram_npm/lin-ui/popup/index.json | 4 + app/miniprogram_npm/lin-ui/popup/index.less | 161 ++++ app/miniprogram_npm/lin-ui/popup/index.wxml | 12 + app/miniprogram_npm/lin-ui/price/index.js | 108 +++ app/miniprogram_npm/lin-ui/price/index.json | 4 + app/miniprogram_npm/lin-ui/price/index.less | 12 + app/miniprogram_npm/lin-ui/price/index.wxml | 7 + app/miniprogram_npm/lin-ui/progress/index.js | 137 +++ .../lin-ui/progress/index.json | 4 + .../lin-ui/progress/index.less | 43 + .../lin-ui/progress/index.wxml | 16 + .../lin-ui/radio-group/index.js | 115 +++ .../lin-ui/radio-group/index.json | 7 + .../lin-ui/radio-group/index.less | 13 + .../lin-ui/radio-group/index.wxml | 4 + app/miniprogram_npm/lin-ui/radio/index.js | 87 ++ app/miniprogram_npm/lin-ui/radio/index.json | 4 + app/miniprogram_npm/lin-ui/radio/index.less | 46 + app/miniprogram_npm/lin-ui/radio/index.wxml | 9 + app/miniprogram_npm/lin-ui/rate/index.js | 74 ++ app/miniprogram_npm/lin-ui/rate/index.json | 6 + app/miniprogram_npm/lin-ui/rate/index.less | 19 + app/miniprogram_npm/lin-ui/rate/index.wxml | 10 + .../lin-ui/search-bar/index.js | 155 ++++ .../lin-ui/search-bar/index.json | 7 + .../lin-ui/search-bar/index.less | 90 ++ .../lin-ui/search-bar/index.wxml | 38 + .../lin-ui/segment-item/index.js | 74 ++ .../lin-ui/segment-item/index.json | 4 + .../lin-ui/segment-item/index.less | 0 .../lin-ui/segment-item/index.wxml | 1 + app/miniprogram_npm/lin-ui/segment/index.js | 164 ++++ app/miniprogram_npm/lin-ui/segment/index.json | 8 + app/miniprogram_npm/lin-ui/segment/index.less | 283 ++++++ app/miniprogram_npm/lin-ui/segment/index.wxml | 27 + app/miniprogram_npm/lin-ui/skeleton/index.js | 100 +++ .../lin-ui/skeleton/index.json | 4 + .../lin-ui/skeleton/index.less | 59 ++ .../lin-ui/skeleton/index.wxml | 25 + .../lin-ui/slide-view/index.js | 187 ++++ .../lin-ui/slide-view/index.json | 5 + .../lin-ui/slide-view/index.less | 10 + .../lin-ui/slide-view/index.wxml | 24 + app/miniprogram_npm/lin-ui/spin/index.js | 19 + app/miniprogram_npm/lin-ui/spin/index.json | 6 + app/miniprogram_npm/lin-ui/spin/index.less | 209 +++++ app/miniprogram_npm/lin-ui/spin/index.wxml | 10 + .../lin-ui/status-show/image/address.png | Bin 0 -> 6578 bytes .../lin-ui/status-show/image/cart.png | Bin 0 -> 7026 bytes .../lin-ui/status-show/image/data.png | Bin 0 -> 4679 bytes .../lin-ui/status-show/image/error.png | Bin 0 -> 5020 bytes .../lin-ui/status-show/image/network.png | Bin 0 -> 6493 bytes .../lin-ui/status-show/image/order.png | Bin 0 -> 5756 bytes .../lin-ui/status-show/image/product.png | Bin 0 -> 4224 bytes .../lin-ui/status-show/image/success.png | Bin 0 -> 4921 bytes .../lin-ui/status-show/index.js | 153 ++++ .../lin-ui/status-show/index.json | 6 + .../lin-ui/status-show/index.less | 44 + .../lin-ui/status-show/index.wxml | 20 + app/miniprogram_npm/lin-ui/step/index.js | 50 ++ app/miniprogram_npm/lin-ui/step/index.json | 6 + app/miniprogram_npm/lin-ui/step/index.less | 183 ++++ app/miniprogram_npm/lin-ui/step/index.wxml | 75 ++ app/miniprogram_npm/lin-ui/steps/index.js | 81 ++ app/miniprogram_npm/lin-ui/steps/index.json | 7 + app/miniprogram_npm/lin-ui/steps/index.less | 20 + app/miniprogram_npm/lin-ui/steps/index.wxml | 3 + .../lin-ui/sticky-item/index.js | 133 +++ .../lin-ui/sticky-item/index.json | 4 + .../lin-ui/sticky-item/index.less | 24 + .../lin-ui/sticky-item/index.wxml | 16 + app/miniprogram_npm/lin-ui/sticky/index.js | 163 ++++ app/miniprogram_npm/lin-ui/sticky/index.json | 4 + app/miniprogram_npm/lin-ui/sticky/index.less | 0 app/miniprogram_npm/lin-ui/sticky/index.wxml | 3 + app/miniprogram_npm/lin-ui/switch/index.js | 67 ++ app/miniprogram_npm/lin-ui/switch/index.json | 4 + app/miniprogram_npm/lin-ui/switch/index.less | 37 + app/miniprogram_npm/lin-ui/switch/index.wxml | 6 + app/miniprogram_npm/lin-ui/tab-bar/index.js | 100 +++ app/miniprogram_npm/lin-ui/tab-bar/index.json | 7 + app/miniprogram_npm/lin-ui/tab-bar/index.less | 46 + app/miniprogram_npm/lin-ui/tab-bar/index.wxml | 15 + app/miniprogram_npm/lin-ui/tabpanel/index.js | 80 ++ .../lin-ui/tabpanel/index.json | 4 + .../lin-ui/tabpanel/index.less | 6 + .../lin-ui/tabpanel/index.wxml | 4 + app/miniprogram_npm/lin-ui/tabs/index.js | 167 ++++ app/miniprogram_npm/lin-ui/tabs/index.json | 8 + app/miniprogram_npm/lin-ui/tabs/index.less | 330 +++++++ app/miniprogram_npm/lin-ui/tabs/index.wxml | 57 ++ app/miniprogram_npm/lin-ui/tag/index.js | 73 ++ app/miniprogram_npm/lin-ui/tag/index.json | 6 + app/miniprogram_npm/lin-ui/tag/index.less | 142 +++ app/miniprogram_npm/lin-ui/tag/index.wxml | 10 + app/miniprogram_npm/lin-ui/textarea/index.js | 117 +++ .../lin-ui/textarea/index.json | 7 + .../lin-ui/textarea/index.less | 79 ++ .../lin-ui/textarea/index.wxml | 29 + app/miniprogram_npm/lin-ui/toast/index.js | 197 +++++ app/miniprogram_npm/lin-ui/toast/index.json | 7 + app/miniprogram_npm/lin-ui/toast/index.less | 103 +++ app/miniprogram_npm/lin-ui/toast/index.wxml | 11 + .../lin-ui/transition/index.js | 24 + .../lin-ui/transition/index.json | 7 + .../lin-ui/transition/index.less | 79 ++ .../lin-ui/transition/index.wxml | 8 + .../lin-ui/utils/device-util.js | 62 ++ app/miniprogram_npm/lin-ui/utils/util.js | 25 + .../lin-ui/water-flow/index.js | 97 +++ .../lin-ui/water-flow/index.json | 7 + .../lin-ui/water-flow/index.less | 10 + .../lin-ui/water-flow/index.wxml | 16 + app/pages/address/list/index.json | 4 +- app/pages/address/upsert/index.json | 10 +- app/pages/mobile/login/index.json | 2 +- app/pages/mobile/me/index.json | 2 +- app/pages/token/me/index.json | 6 +- app/pages/user/manage/detail/index.json | 8 +- app/pages/user/manage/index.json | 6 +- app/pages/user/manage/upsert/index.json | 8 +- app/pages/user/search/index.json | 22 +- app/pages/userEntityGrant/confirm/index.json | 4 +- app/pages/userEntityGrant/grant/index.json | 2 +- app/pages/userRelation/onEntity/index.json | 18 +- app/pages/userRelation/onUser/index.json | 20 +- app/pages/wechatQrCode/scan/index.json | 2 +- lib/aspects/AspectDict.d.ts | 12 +- 381 files changed, 19592 insertions(+), 69 deletions(-) create mode 100644 app/components/UI/divider/index.json create mode 100644 app/components/UI/divider/index.less create mode 100644 app/components/UI/divider/index.ts create mode 100644 app/components/UI/divider/index.wxml create mode 100644 app/components/UI/fab/index.json create mode 100644 app/components/UI/fab/index.less create mode 100644 app/components/UI/fab/index.ts create mode 100644 app/components/UI/fab/index.wxml create mode 100644 app/miniprogram_npm/config/styles/_base.less create mode 100644 app/miniprogram_npm/config/styles/_mixins.less create mode 100644 app/miniprogram_npm/config/styles/_theme.less create mode 100644 app/miniprogram_npm/lin-ui/action-sheet/index.js create mode 100644 app/miniprogram_npm/lin-ui/action-sheet/index.json create mode 100644 app/miniprogram_npm/lin-ui/action-sheet/index.less create mode 100644 app/miniprogram_npm/lin-ui/action-sheet/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/album/index.js create mode 100644 app/miniprogram_npm/lin-ui/album/index.json create mode 100644 app/miniprogram_npm/lin-ui/album/index.less create mode 100644 app/miniprogram_npm/lin-ui/album/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/album/index.wxs create mode 100644 app/miniprogram_npm/lin-ui/arc-popup/index.js create mode 100644 app/miniprogram_npm/lin-ui/arc-popup/index.json create mode 100644 app/miniprogram_npm/lin-ui/arc-popup/index.less create mode 100644 app/miniprogram_npm/lin-ui/arc-popup/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/avatar/index.js create mode 100644 app/miniprogram_npm/lin-ui/avatar/index.json create mode 100644 app/miniprogram_npm/lin-ui/avatar/index.less create mode 100644 app/miniprogram_npm/lin-ui/avatar/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/badge/index.js create mode 100644 app/miniprogram_npm/lin-ui/badge/index.json create mode 100644 app/miniprogram_npm/lin-ui/badge/index.less create mode 100644 app/miniprogram_npm/lin-ui/badge/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/behaviors/computeOffset.js create mode 100644 app/miniprogram_npm/lin-ui/behaviors/countdown.js create mode 100644 app/miniprogram_npm/lin-ui/behaviors/hover.js create mode 100644 app/miniprogram_npm/lin-ui/behaviors/rules.js create mode 100644 app/miniprogram_npm/lin-ui/behaviors/scrollCenter.js create mode 100644 app/miniprogram_npm/lin-ui/behaviors/transition.js create mode 100644 app/miniprogram_npm/lin-ui/behaviors/validator.js create mode 100644 app/miniprogram_npm/lin-ui/behaviors/watchShow.js create mode 100644 app/miniprogram_npm/lin-ui/behaviors/zIndex.js create mode 100644 app/miniprogram_npm/lin-ui/button/index.js create mode 100644 app/miniprogram_npm/lin-ui/button/index.json create mode 100644 app/miniprogram_npm/lin-ui/button/index.less create mode 100644 app/miniprogram_npm/lin-ui/button/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/calendar/calendar.wxml create mode 100644 app/miniprogram_npm/lin-ui/calendar/components/day/index.js create mode 100644 app/miniprogram_npm/lin-ui/calendar/components/day/index.json create mode 100644 app/miniprogram_npm/lin-ui/calendar/components/day/index.less create mode 100644 app/miniprogram_npm/lin-ui/calendar/components/day/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/calendar/components/day/index.wxs create mode 100644 app/miniprogram_npm/lin-ui/calendar/components/header/index.js create mode 100644 app/miniprogram_npm/lin-ui/calendar/components/header/index.json create mode 100644 app/miniprogram_npm/lin-ui/calendar/components/header/index.less create mode 100644 app/miniprogram_npm/lin-ui/calendar/components/header/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/calendar/components/mounth/index.js create mode 100644 app/miniprogram_npm/lin-ui/calendar/components/mounth/index.json create mode 100644 app/miniprogram_npm/lin-ui/calendar/components/mounth/index.less create mode 100644 app/miniprogram_npm/lin-ui/calendar/components/mounth/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/calendar/components/mounth/index.wxs create mode 100644 app/miniprogram_npm/lin-ui/calendar/config.js create mode 100644 app/miniprogram_npm/lin-ui/calendar/dete.js create mode 100644 app/miniprogram_npm/lin-ui/calendar/index.js create mode 100644 app/miniprogram_npm/lin-ui/calendar/index.json create mode 100644 app/miniprogram_npm/lin-ui/calendar/index.less create mode 100644 app/miniprogram_npm/lin-ui/calendar/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/calendar/index.wxs create mode 100644 app/miniprogram_npm/lin-ui/calendar/util.js create mode 100644 app/miniprogram_npm/lin-ui/calendar/utils.wxs create mode 100644 app/miniprogram_npm/lin-ui/capsule-bar/icons/capsule-left-black.png create mode 100644 app/miniprogram_npm/lin-ui/capsule-bar/icons/capsule-left-white.png create mode 100644 app/miniprogram_npm/lin-ui/capsule-bar/icons/capsule-right-black.png create mode 100644 app/miniprogram_npm/lin-ui/capsule-bar/icons/capsule-right-white.png create mode 100644 app/miniprogram_npm/lin-ui/capsule-bar/index.js create mode 100644 app/miniprogram_npm/lin-ui/capsule-bar/index.json create mode 100644 app/miniprogram_npm/lin-ui/capsule-bar/index.less create mode 100644 app/miniprogram_npm/lin-ui/capsule-bar/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/card/index.js create mode 100644 app/miniprogram_npm/lin-ui/card/index.json create mode 100644 app/miniprogram_npm/lin-ui/card/index.less create mode 100644 app/miniprogram_npm/lin-ui/card/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/checkbox-group/index.js create mode 100644 app/miniprogram_npm/lin-ui/checkbox-group/index.json create mode 100644 app/miniprogram_npm/lin-ui/checkbox-group/index.less create mode 100644 app/miniprogram_npm/lin-ui/checkbox-group/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/checkbox/index.js create mode 100644 app/miniprogram_npm/lin-ui/checkbox/index.json create mode 100644 app/miniprogram_npm/lin-ui/checkbox/index.less create mode 100644 app/miniprogram_npm/lin-ui/checkbox/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/circle/index.js create mode 100644 app/miniprogram_npm/lin-ui/circle/index.json create mode 100644 app/miniprogram_npm/lin-ui/circle/index.less create mode 100644 app/miniprogram_npm/lin-ui/circle/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/collapse-item/index.js create mode 100644 app/miniprogram_npm/lin-ui/collapse-item/index.json create mode 100644 app/miniprogram_npm/lin-ui/collapse-item/index.less create mode 100644 app/miniprogram_npm/lin-ui/collapse-item/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/collapse/index.js create mode 100644 app/miniprogram_npm/lin-ui/collapse/index.json create mode 100644 app/miniprogram_npm/lin-ui/collapse/index.less create mode 100644 app/miniprogram_npm/lin-ui/collapse/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/combined-tabs/index.js create mode 100644 app/miniprogram_npm/lin-ui/combined-tabs/index.json create mode 100644 app/miniprogram_npm/lin-ui/combined-tabs/index.less create mode 100644 app/miniprogram_npm/lin-ui/combined-tabs/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/index.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/messages.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/rule/enum.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/rule/index.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/rule/pattern.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/rule/range.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/rule/required.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/rule/type.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/rule/whitespace.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/util.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/validator/array.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/validator/boolean.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/validator/date.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/validator/enum.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/validator/float.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/validator/index.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/validator/integer.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/validator/method.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/validator/number.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/validator/object.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/validator/pattern.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/validator/regexp.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/validator/required.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/validator/string.js create mode 100644 app/miniprogram_npm/lin-ui/common/async-validator/validator/type.js create mode 100644 app/miniprogram_npm/lin-ui/core/behaviors/doNothingBehavior.js create mode 100644 app/miniprogram_npm/lin-ui/core/utils/data-util.js create mode 100644 app/miniprogram_npm/lin-ui/core/utils/event-bus.js create mode 100644 app/miniprogram_npm/lin-ui/core/utils/event-util.js create mode 100644 app/miniprogram_npm/lin-ui/core/utils/node-util.js create mode 100644 app/miniprogram_npm/lin-ui/core/utils/pixel-util.js create mode 100644 app/miniprogram_npm/lin-ui/countdown/index.js create mode 100644 app/miniprogram_npm/lin-ui/countdown/index.json create mode 100644 app/miniprogram_npm/lin-ui/countdown/index.less create mode 100644 app/miniprogram_npm/lin-ui/countdown/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/counter/index.js create mode 100644 app/miniprogram_npm/lin-ui/counter/index.json create mode 100644 app/miniprogram_npm/lin-ui/counter/index.less create mode 100644 app/miniprogram_npm/lin-ui/counter/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/custom-tab-bar/index.js create mode 100644 app/miniprogram_npm/lin-ui/custom-tab-bar/index.json create mode 100644 app/miniprogram_npm/lin-ui/custom-tab-bar/index.less create mode 100644 app/miniprogram_npm/lin-ui/custom-tab-bar/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/dialog/index.js create mode 100644 app/miniprogram_npm/lin-ui/dialog/index.json create mode 100644 app/miniprogram_npm/lin-ui/dialog/index.less create mode 100644 app/miniprogram_npm/lin-ui/dialog/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/error-tip/index.js create mode 100644 app/miniprogram_npm/lin-ui/error-tip/index.json create mode 100644 app/miniprogram_npm/lin-ui/error-tip/index.less create mode 100644 app/miniprogram_npm/lin-ui/error-tip/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/filter/array.wxs create mode 100644 app/miniprogram_npm/lin-ui/filter/classnames.wxs create mode 100644 app/miniprogram_npm/lin-ui/filter/is.wxs create mode 100644 app/miniprogram_npm/lin-ui/filter/object.wxs create mode 100644 app/miniprogram_npm/lin-ui/filter/string.wxs create mode 100644 app/miniprogram_npm/lin-ui/filter/zero-padding.wxs create mode 100644 app/miniprogram_npm/lin-ui/form-item/index.js create mode 100644 app/miniprogram_npm/lin-ui/form-item/index.json create mode 100644 app/miniprogram_npm/lin-ui/form-item/index.less create mode 100644 app/miniprogram_npm/lin-ui/form-item/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/form/index.js create mode 100644 app/miniprogram_npm/lin-ui/form/index.json create mode 100644 app/miniprogram_npm/lin-ui/form/index.less create mode 100644 app/miniprogram_npm/lin-ui/form/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/grid-item/index.js create mode 100644 app/miniprogram_npm/lin-ui/grid-item/index.json create mode 100644 app/miniprogram_npm/lin-ui/grid-item/index.less create mode 100644 app/miniprogram_npm/lin-ui/grid-item/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/grid/index.js create mode 100644 app/miniprogram_npm/lin-ui/grid/index.json create mode 100644 app/miniprogram_npm/lin-ui/grid/index.less create mode 100644 app/miniprogram_npm/lin-ui/grid/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/icon/index.js create mode 100644 app/miniprogram_npm/lin-ui/icon/index.json create mode 100644 app/miniprogram_npm/lin-ui/icon/index.less create mode 100644 app/miniprogram_npm/lin-ui/icon/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/image-clipper-tools/index.js create mode 100644 app/miniprogram_npm/lin-ui/image-clipper-tools/index.json create mode 100644 app/miniprogram_npm/lin-ui/image-clipper-tools/index.less create mode 100644 app/miniprogram_npm/lin-ui/image-clipper-tools/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/image-clipper/calculate.js create mode 100644 app/miniprogram_npm/lin-ui/image-clipper/images/close.png create mode 100644 app/miniprogram_npm/lin-ui/image-clipper/images/photo.png create mode 100644 app/miniprogram_npm/lin-ui/image-clipper/images/rotate-along.png create mode 100644 app/miniprogram_npm/lin-ui/image-clipper/images/rotate-inverse.png create mode 100644 app/miniprogram_npm/lin-ui/image-clipper/images/sure.png create mode 100644 app/miniprogram_npm/lin-ui/image-clipper/index.js create mode 100644 app/miniprogram_npm/lin-ui/image-clipper/index.json create mode 100644 app/miniprogram_npm/lin-ui/image-clipper/index.less create mode 100644 app/miniprogram_npm/lin-ui/image-clipper/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/image-picker/image/add.png create mode 100644 app/miniprogram_npm/lin-ui/image-picker/index.js create mode 100644 app/miniprogram_npm/lin-ui/image-picker/index.json create mode 100644 app/miniprogram_npm/lin-ui/image-picker/index.less create mode 100644 app/miniprogram_npm/lin-ui/image-picker/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/index-anchor/index.js create mode 100644 app/miniprogram_npm/lin-ui/index-anchor/index.json create mode 100644 app/miniprogram_npm/lin-ui/index-anchor/index.less create mode 100644 app/miniprogram_npm/lin-ui/index-anchor/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/index-list/index.js create mode 100644 app/miniprogram_npm/lin-ui/index-list/index.json create mode 100644 app/miniprogram_npm/lin-ui/index-list/index.less create mode 100644 app/miniprogram_npm/lin-ui/index-list/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/input/index.js create mode 100644 app/miniprogram_npm/lin-ui/input/index.json create mode 100644 app/miniprogram_npm/lin-ui/input/index.less create mode 100644 app/miniprogram_npm/lin-ui/input/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/label/index.js create mode 100644 app/miniprogram_npm/lin-ui/label/index.json create mode 100644 app/miniprogram_npm/lin-ui/label/index.less create mode 100644 app/miniprogram_npm/lin-ui/label/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/list/index.js create mode 100644 app/miniprogram_npm/lin-ui/list/index.json create mode 100644 app/miniprogram_npm/lin-ui/list/index.less create mode 100644 app/miniprogram_npm/lin-ui/list/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/loading/index.js create mode 100644 app/miniprogram_npm/lin-ui/loading/index.json create mode 100644 app/miniprogram_npm/lin-ui/loading/index.less create mode 100644 app/miniprogram_npm/lin-ui/loading/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/loadmore/index.js create mode 100644 app/miniprogram_npm/lin-ui/loadmore/index.json create mode 100644 app/miniprogram_npm/lin-ui/loadmore/index.less create mode 100644 app/miniprogram_npm/lin-ui/loadmore/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/mask/index.js create mode 100644 app/miniprogram_npm/lin-ui/mask/index.json create mode 100644 app/miniprogram_npm/lin-ui/mask/index.less create mode 100644 app/miniprogram_npm/lin-ui/mask/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/message/index.js create mode 100644 app/miniprogram_npm/lin-ui/message/index.json create mode 100644 app/miniprogram_npm/lin-ui/message/index.less create mode 100644 app/miniprogram_npm/lin-ui/message/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/notice-bar/index.js create mode 100644 app/miniprogram_npm/lin-ui/notice-bar/index.json create mode 100644 app/miniprogram_npm/lin-ui/notice-bar/index.less create mode 100644 app/miniprogram_npm/lin-ui/notice-bar/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/panel/index.js create mode 100644 app/miniprogram_npm/lin-ui/panel/index.json create mode 100644 app/miniprogram_npm/lin-ui/panel/index.less create mode 100644 app/miniprogram_npm/lin-ui/panel/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/picker/index.js create mode 100644 app/miniprogram_npm/lin-ui/picker/index.json create mode 100644 app/miniprogram_npm/lin-ui/picker/index.less create mode 100644 app/miniprogram_npm/lin-ui/picker/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/popup/index.js create mode 100644 app/miniprogram_npm/lin-ui/popup/index.json create mode 100644 app/miniprogram_npm/lin-ui/popup/index.less create mode 100644 app/miniprogram_npm/lin-ui/popup/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/price/index.js create mode 100644 app/miniprogram_npm/lin-ui/price/index.json create mode 100644 app/miniprogram_npm/lin-ui/price/index.less create mode 100644 app/miniprogram_npm/lin-ui/price/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/progress/index.js create mode 100644 app/miniprogram_npm/lin-ui/progress/index.json create mode 100644 app/miniprogram_npm/lin-ui/progress/index.less create mode 100644 app/miniprogram_npm/lin-ui/progress/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/radio-group/index.js create mode 100644 app/miniprogram_npm/lin-ui/radio-group/index.json create mode 100644 app/miniprogram_npm/lin-ui/radio-group/index.less create mode 100644 app/miniprogram_npm/lin-ui/radio-group/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/radio/index.js create mode 100644 app/miniprogram_npm/lin-ui/radio/index.json create mode 100644 app/miniprogram_npm/lin-ui/radio/index.less create mode 100644 app/miniprogram_npm/lin-ui/radio/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/rate/index.js create mode 100644 app/miniprogram_npm/lin-ui/rate/index.json create mode 100644 app/miniprogram_npm/lin-ui/rate/index.less create mode 100644 app/miniprogram_npm/lin-ui/rate/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/search-bar/index.js create mode 100644 app/miniprogram_npm/lin-ui/search-bar/index.json create mode 100644 app/miniprogram_npm/lin-ui/search-bar/index.less create mode 100644 app/miniprogram_npm/lin-ui/search-bar/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/segment-item/index.js create mode 100644 app/miniprogram_npm/lin-ui/segment-item/index.json create mode 100644 app/miniprogram_npm/lin-ui/segment-item/index.less create mode 100644 app/miniprogram_npm/lin-ui/segment-item/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/segment/index.js create mode 100644 app/miniprogram_npm/lin-ui/segment/index.json create mode 100644 app/miniprogram_npm/lin-ui/segment/index.less create mode 100644 app/miniprogram_npm/lin-ui/segment/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/skeleton/index.js create mode 100644 app/miniprogram_npm/lin-ui/skeleton/index.json create mode 100644 app/miniprogram_npm/lin-ui/skeleton/index.less create mode 100644 app/miniprogram_npm/lin-ui/skeleton/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/slide-view/index.js create mode 100644 app/miniprogram_npm/lin-ui/slide-view/index.json create mode 100644 app/miniprogram_npm/lin-ui/slide-view/index.less create mode 100644 app/miniprogram_npm/lin-ui/slide-view/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/spin/index.js create mode 100644 app/miniprogram_npm/lin-ui/spin/index.json create mode 100644 app/miniprogram_npm/lin-ui/spin/index.less create mode 100644 app/miniprogram_npm/lin-ui/spin/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/status-show/image/address.png create mode 100644 app/miniprogram_npm/lin-ui/status-show/image/cart.png create mode 100644 app/miniprogram_npm/lin-ui/status-show/image/data.png create mode 100644 app/miniprogram_npm/lin-ui/status-show/image/error.png create mode 100644 app/miniprogram_npm/lin-ui/status-show/image/network.png create mode 100644 app/miniprogram_npm/lin-ui/status-show/image/order.png create mode 100644 app/miniprogram_npm/lin-ui/status-show/image/product.png create mode 100644 app/miniprogram_npm/lin-ui/status-show/image/success.png create mode 100644 app/miniprogram_npm/lin-ui/status-show/index.js create mode 100644 app/miniprogram_npm/lin-ui/status-show/index.json create mode 100644 app/miniprogram_npm/lin-ui/status-show/index.less create mode 100644 app/miniprogram_npm/lin-ui/status-show/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/step/index.js create mode 100644 app/miniprogram_npm/lin-ui/step/index.json create mode 100644 app/miniprogram_npm/lin-ui/step/index.less create mode 100644 app/miniprogram_npm/lin-ui/step/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/steps/index.js create mode 100644 app/miniprogram_npm/lin-ui/steps/index.json create mode 100644 app/miniprogram_npm/lin-ui/steps/index.less create mode 100644 app/miniprogram_npm/lin-ui/steps/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/sticky-item/index.js create mode 100644 app/miniprogram_npm/lin-ui/sticky-item/index.json create mode 100644 app/miniprogram_npm/lin-ui/sticky-item/index.less create mode 100644 app/miniprogram_npm/lin-ui/sticky-item/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/sticky/index.js create mode 100644 app/miniprogram_npm/lin-ui/sticky/index.json create mode 100644 app/miniprogram_npm/lin-ui/sticky/index.less create mode 100644 app/miniprogram_npm/lin-ui/sticky/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/switch/index.js create mode 100644 app/miniprogram_npm/lin-ui/switch/index.json create mode 100644 app/miniprogram_npm/lin-ui/switch/index.less create mode 100644 app/miniprogram_npm/lin-ui/switch/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/tab-bar/index.js create mode 100644 app/miniprogram_npm/lin-ui/tab-bar/index.json create mode 100644 app/miniprogram_npm/lin-ui/tab-bar/index.less create mode 100644 app/miniprogram_npm/lin-ui/tab-bar/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/tabpanel/index.js create mode 100644 app/miniprogram_npm/lin-ui/tabpanel/index.json create mode 100644 app/miniprogram_npm/lin-ui/tabpanel/index.less create mode 100644 app/miniprogram_npm/lin-ui/tabpanel/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/tabs/index.js create mode 100644 app/miniprogram_npm/lin-ui/tabs/index.json create mode 100644 app/miniprogram_npm/lin-ui/tabs/index.less create mode 100644 app/miniprogram_npm/lin-ui/tabs/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/tag/index.js create mode 100644 app/miniprogram_npm/lin-ui/tag/index.json create mode 100644 app/miniprogram_npm/lin-ui/tag/index.less create mode 100644 app/miniprogram_npm/lin-ui/tag/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/textarea/index.js create mode 100644 app/miniprogram_npm/lin-ui/textarea/index.json create mode 100644 app/miniprogram_npm/lin-ui/textarea/index.less create mode 100644 app/miniprogram_npm/lin-ui/textarea/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/toast/index.js create mode 100644 app/miniprogram_npm/lin-ui/toast/index.json create mode 100644 app/miniprogram_npm/lin-ui/toast/index.less create mode 100644 app/miniprogram_npm/lin-ui/toast/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/transition/index.js create mode 100644 app/miniprogram_npm/lin-ui/transition/index.json create mode 100644 app/miniprogram_npm/lin-ui/transition/index.less create mode 100644 app/miniprogram_npm/lin-ui/transition/index.wxml create mode 100644 app/miniprogram_npm/lin-ui/utils/device-util.js create mode 100644 app/miniprogram_npm/lin-ui/utils/util.js create mode 100644 app/miniprogram_npm/lin-ui/water-flow/index.js create mode 100644 app/miniprogram_npm/lin-ui/water-flow/index.json create mode 100644 app/miniprogram_npm/lin-ui/water-flow/index.less create mode 100644 app/miniprogram_npm/lin-ui/water-flow/index.wxml diff --git a/app/components/UI/divider/index.json b/app/components/UI/divider/index.json new file mode 100644 index 000000000..32640e0dc --- /dev/null +++ b/app/components/UI/divider/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} \ No newline at end of file diff --git a/app/components/UI/divider/index.less b/app/components/UI/divider/index.less new file mode 100644 index 000000000..b0c5212f4 --- /dev/null +++ b/app/components/UI/divider/index.less @@ -0,0 +1,31 @@ +/** index.wxss **/ +.divider { + margin: 0; + flex-shrink: 0; + border-width: 0; + border-style: solid; + border-color: rgb(0 0 0 / 12%); + border-bottom-width: thin; +} + +.flexItem { + align-self: stretch; + height: auto; +} + +.vertical { + height: 100%; + border-bottom-width: 0; + border-right-width: thin; + margin: 0rpx 8rpx; +} + +.horizontal { + display: block; + unicode-bidi: isolate; + margin-block-start: 0.5em; + margin-block-end: 0.5em; + margin-inline-start: auto; + margin-inline-end: auto; + overflow: hidden; +} diff --git a/app/components/UI/divider/index.ts b/app/components/UI/divider/index.ts new file mode 100644 index 000000000..34b599dc9 --- /dev/null +++ b/app/components/UI/divider/index.ts @@ -0,0 +1,15 @@ + +Component({ + properties: { + // circle || square + mode: { + type: String, + value: '' + }, + // small || large || default + flexItem: { + type: Boolean, + value: false, + }, + } +}); \ No newline at end of file diff --git a/app/components/UI/divider/index.wxml b/app/components/UI/divider/index.wxml new file mode 100644 index 000000000..90d3adc25 --- /dev/null +++ b/app/components/UI/divider/index.wxml @@ -0,0 +1,2 @@ + +
\ No newline at end of file diff --git a/app/components/UI/fab/index.json b/app/components/UI/fab/index.json new file mode 100644 index 000000000..32640e0dc --- /dev/null +++ b/app/components/UI/fab/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} \ No newline at end of file diff --git a/app/components/UI/fab/index.less b/app/components/UI/fab/index.less new file mode 100644 index 000000000..ae8d1d7ec --- /dev/null +++ b/app/components/UI/fab/index.less @@ -0,0 +1,82 @@ +@import "../../../config/styles/_base.less"; + +.btn-view { + position: fixed; +} + +.fab { + display: inline-flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + outline: 0; + margin: 0; + padding: 0; + cursor: pointer; + user-select: none; + vertical-align: middle; + color: #fff; + width: 112rpx; + height: 112rpx; + z-index: 1050; + font-size: 0.875rem; + line-height: 1.75; + text-transform: uppercase; + border-radius: 50%; + transition: background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + box-shadow: 0 3px 5px -1px rgb(0 0 0 / 20%), 0 6px 10px 0 rgb(0 0 0 / 14%), 0 1px 18px 0 rgb(0 0 0 / 12%); + + &:active { + box-shadow: 0 7px 8px -4px rgb(0 0 0 / 20%), 0 12px 17px 2px rgb(0 0 0 / 14%), 0 5px 22px 4px rgb(0 0 0 / 12%); + } + + &-default { + background-color: @default-color; + } + + &-success { + background-color: @success-color; + } + + &-warning { + background-color: @warning-color; + } + + &-error { + background-color: @error-color; + } +} + +.ripple { + position: relative; + overflow: hidden; +} + +.ripple:focus { + outline: none; +} + +.ripple::after { + content: ""; + display: block; + position: absolute; + top: -10px; + left: -10px; + right: -10px; + bottom: -10px; + pointer-events: none; + background-color: #888; + background-repeat: no-repeat; + background-position: 50%; + opacity: 0; + transition: all 0.3s; +} + +.ripple:active::after { + opacity: 0.3; + top: 0; + left: 0; + right: 0; + bottom: 0; + transition: 0s; +} diff --git a/app/components/UI/fab/index.ts b/app/components/UI/fab/index.ts new file mode 100644 index 000000000..90ca5dba5 --- /dev/null +++ b/app/components/UI/fab/index.ts @@ -0,0 +1,89 @@ +Component({ + + properties: { + // button组建标识 + bottom: { + type: Number, + value: 50, + }, + right: { + type: Number, + value: 32, + }, + name: { + type: String, + value: 'lin' + }, + type: { + type: String, + value: 'default', + options: ['warning', 'success', 'error', 'default'] + }, + plain: Boolean, + size: { + type: String, + value: 'medium', + options: ['medium', 'large', 'mini', 'long'] + }, + shape: { + type: String, + value: 'circle', + options: ['square', 'circle', 'semicircle'] + }, + disabled: { + type: Boolean, + value: false, + }, + special: { + type: Boolean, + value: false, + }, + // 微信原生接口 + width: Number, + height: Number, + icon: String, + image: String, + bgColor: String, + iconColor: String, + iconSize: String, + openType: String, + appParameter: String, + lang: String, + hoverStopPropagation: Boolean, + hoverStartTime: { + type: Number, + value: 20 + }, + hoverStayTime: { + type: Number, + value: 70 + }, + sessionFrom: { + type: String, + value: '' + }, + sendMessageTitle: String, + sendMessagePath: String, + sendMessageImg: String, + showMessageCard: Boolean, + formType: String, + disabledHover: { + type: Boolean, + value: false + } + }, + methods: { + // button点击事件 + handleTap() { + if (this.data.disabled || this.data.loading) return false; + this.triggerEvent('click', {}, { + bubbles: true, + composed: true + }); + }, + // 开放能力事件回调 + openTypeEvent(data:any) { + this.triggerEvent(data.type, data.detail, {}); + } + } +}); diff --git a/app/components/UI/fab/index.wxml b/app/components/UI/fab/index.wxml new file mode 100644 index 000000000..dc9ccfd22 --- /dev/null +++ b/app/components/UI/fab/index.wxml @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/app/components/extraFile/gallery/index.json b/app/components/extraFile/gallery/index.json index 623a1dbd2..7214fb2f0 100644 --- a/app/components/extraFile/gallery/index.json +++ b/app/components/extraFile/gallery/index.json @@ -1,7 +1,7 @@ { "component": true, "usingComponents": { - "l-icon": "../../../lin-ui/icon/index" + "l-icon": "../../../miniprogram_npm/lin-ui/icon/index" }, "componentGenerics": { "item": true diff --git a/app/components/message/index.json b/app/components/message/index.json index a462ad2d7..8751111de 100644 --- a/app/components/message/index.json +++ b/app/components/message/index.json @@ -1,6 +1,6 @@ { "component": true, "usingComponents": { - "l-icon": "../../lin-ui/icon/index" + "l-icon": "../../miniprogram_npm/lin-ui/icon/index" } } \ No newline at end of file diff --git a/app/config/styles/_base.less b/app/config/styles/_base.less index 726cc5a8a..d21c7dbea 100644 --- a/app/config/styles/_base.less +++ b/app/config/styles/_base.less @@ -1,4 +1,4 @@ -@import "_theme"; +@import "./_theme.less"; // Color diff --git a/app/miniprogram_npm/config/styles/_base.less b/app/miniprogram_npm/config/styles/_base.less new file mode 100644 index 000000000..77a8e90ff --- /dev/null +++ b/app/miniprogram_npm/config/styles/_base.less @@ -0,0 +1 @@ +@import "../../../config/styles/_base.less"; diff --git a/app/miniprogram_npm/config/styles/_mixins.less b/app/miniprogram_npm/config/styles/_mixins.less new file mode 100644 index 000000000..66779a67c --- /dev/null +++ b/app/miniprogram_npm/config/styles/_mixins.less @@ -0,0 +1 @@ +@import "../../../config/styles/_mixins.less"; \ No newline at end of file diff --git a/app/miniprogram_npm/config/styles/_theme.less b/app/miniprogram_npm/config/styles/_theme.less new file mode 100644 index 000000000..db9b4a3d1 --- /dev/null +++ b/app/miniprogram_npm/config/styles/_theme.less @@ -0,0 +1 @@ +@import "../../../config/styles/_theme.less"; diff --git a/app/miniprogram_npm/lin-ui/action-sheet/index.js b/app/miniprogram_npm/lin-ui/action-sheet/index.js new file mode 100644 index 000000000..c49619421 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/action-sheet/index.js @@ -0,0 +1,124 @@ +import zIndex from '../behaviors/zIndex'; +import hover from '../behaviors/hover'; + +Component({ + behaviors: [zIndex,hover], + externalClasses: ['l-class-title', 'l-class-item', 'l-class-cancel','l-title-class','l-item-class','l-cancel-class'], + properties: { + locked: Boolean, + showCancel: Boolean, + show: Boolean, + itemList: Array, + cancelText: { + type: String, + value: '取消' + }, + title: String, + zIndex:{ + type:Number, + value: 777 + }, + openApi: { + type: Boolean, + value: true, + } + }, + data: { + success: '', + fail: '', + isIphoneX: false + }, + attached() { + if (this.data.openApi) { + this.initActionSheet(); + } + this.initUIAdapter(); + }, + + pageLifetimes: { + show() { + if (this.data.openApi) { + this.initActionSheet(); + } + + }, + }, + methods: { + /** + * 区分UI尺寸 + */ + initUIAdapter() { + wx.getSystemInfo({ + success: (res) => { + this.setData({ + isIphoneX: res.model === 'iPhone X', + }); + } + }); + }, + initActionSheet() { + wx.lin = wx.lin || {}; + wx.lin.showActionSheet = (options={}) => { + const { + itemList = [], + success = null, + fail = null, + title = '', + locked = false, + cancelText = '取消', + showCancel = false, + } = options; + this.setData({ + itemList: itemList.slice(0, 10), + success, + fail, + title, + locked, + cancelText, + showCancel, + show: true, + }); + return this; + }; + }, + handleClickItem(e) { + const { + success + } = this.data; + success && success({ ...e.currentTarget.dataset }); + this.triggerEvent('linitemtap', { ...e.currentTarget.dataset },{ bubbles: true, composed: true }); + this._hideActionSheet(); + }, + + _showActionSheet() { + this.setData({ + show: true + }); + }, + + _hideActionSheet() { + this.setData({ + show: false + }); + }, + + handleClickCancel() { + const { + fail + } = this.data; + fail && fail({ + errMsg: 'showactionsheet:fail cancel' + }); + this.triggerEvent('lincancel', { + errMsg: 'showactionsheet:fail cancel' + },{ bubbles: true, composed: true }); + this._hideActionSheet(); + }, + + handleClickPopUp() { + if (!this.data.locked) { + this.handleClickCancel(); + } + }, + } +}); diff --git a/app/miniprogram_npm/lin-ui/action-sheet/index.json b/app/miniprogram_npm/lin-ui/action-sheet/index.json new file mode 100644 index 000000000..248ca904c --- /dev/null +++ b/app/miniprogram_npm/lin-ui/action-sheet/index.json @@ -0,0 +1,8 @@ +{ + "component": true, + "usingComponents": { + "l-icon":"../icon/index", + "l-popup":"../popup/index", + "l-button":"../button/index" + } + } \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/action-sheet/index.less b/app/miniprogram_npm/lin-ui/action-sheet/index.less new file mode 100644 index 000000000..ba6e8af7d --- /dev/null +++ b/app/miniprogram_npm/lin-ui/action-sheet/index.less @@ -0,0 +1,34 @@ +.l-action-sheet { + background: #f7f7f7; +} + +.l-item-button { + height: 88rpx; + line-height: 88rpx; + text-align: center; + background: #fff; + border-bottom: 2rpx solid #f3f3f3; + font-size: 28rpx; + color: #45526b; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + overflow: hidden; +} + +.l-cancel { + margin-top: 12rpx; +} + +.l-cancel-x .l-item-button { + padding-bottom: 44rpx; +} + +.l-image-button > .l-button-text { + margin-left: 20rpx; +} + +.list-hover { + opacity: 0.8; +} diff --git a/app/miniprogram_npm/lin-ui/action-sheet/index.wxml b/app/miniprogram_npm/lin-ui/action-sheet/index.wxml new file mode 100644 index 000000000..028f193b8 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/action-sheet/index.wxml @@ -0,0 +1,26 @@ + + + + {{ title }} + + + + + + + {{ item.name }} + + + + + + {{ cancelText }} + + + + diff --git a/app/miniprogram_npm/lin-ui/album/index.js b/app/miniprogram_npm/lin-ui/album/index.js new file mode 100644 index 000000000..6a6371402 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/album/index.js @@ -0,0 +1,189 @@ +// miniprogram_npm/lin-ui/album/index.js +Component({ + externalClasses: ['l-class', 'l-single-image-class', 'l-multi-image-class'], + properties: { + urls: { + type: Array + }, + // 是否可以预览 + preview: { + type: Boolean, + value: true + }, + gapRow: { + type: Number, + value: 10, + }, + gapColumn: { + type: Number, + value: 10, + }, + // 单图时长边大小 + singleSize: { + type: Number, + value: 360, + }, + // 多图时图片边长 + multipleSize: { + type: Number, + value: 158, + }, + // 单图显示模式 + singleMode: { + type: String, + value: 'aspectFit', + }, + // 多图显示模式 + multipleMode: { + type: String, + value: 'aspectFill', + }, + key: { + type: String, + value: 'url' + }, + maxNumber: { + type: Number, + value: 9 + }, + customRowNumber: { + type: Boolean, + value: false + }, + everyRowNumber: { + type: Number, + value: 3 + }, + previewFullImage: { + type: Boolean, + value: true, + } + }, + + data: { + // 传值方式是新方式还是旧方式 + newType: true, + // 单图短边大小 + shortSideValue: 0, + // 用于显示的图片列表 + showUrls: [], + // 传入的url长度是否大于maxNumber指定的数量 + isLong: false, + }, + + observers: { + 'urls': function () { + this.init(); + } + }, + + methods: { + + /** + * 在 urls 数据变化后进行初始化 + */ + init() { + // 取出参数 + let {urls, maxNumber, key} = this.data; + + // 如果 urls 长度超出指定图片数量,则将其截断 + if (urls.length > maxNumber) { + urls = urls.slice(0, maxNumber); + this.setData({ + isLong: true, + }); + } + + this.setData({ + showUrls: urls + }); + + if (!this.data.customRowNumber) { + let urlLength = this.data.showUrls.length; + if (urlLength > 1 && urlLength < 5 && urlLength !== 3) { + this.setData({ + everyRowNumber: 2 + }); + } else (this.setData({ + everyRowNumber: 3 + })); + } + + // 判断传入模式 + const newType = this.judgeType(); + this.setData({ + newType + }); + + if (urls.length === 1) { + this.horizontalOrVertical(newType ? urls[0][key] : urls[0]); + } + }, + + // 判断传入的urls是字符串列表(old模式)还是对象列表(new模式) + judgeType() { + const urls = this.data.urls; + if (urls.length !== 0) { + if (typeof (urls[0]) !== 'object') { + return false; + } + } + return true; + }, + + //判断照片是横屏还是竖屏并计算短边的长度 + //如不指定短边的长度,短边会默认显示image组件的长度 + horizontalOrVertical: function (src) { + wx.getImageInfo({ + src: src, + success: (res) => { + const longSide = res.width >= res.height ? res.width : res.height; + const shortSide = res.width >= res.height ? res.height : res.width; + this.setData({ + horizontalScreen: res.width >= res.height, + shortSideValue: shortSide * this.data.singleSize / longSide + }); + } + }); + }, + + onPreviewTap(e) { + const index = e.currentTarget.id; + let urls; + if (this.data.previewFullImage) { + urls = this.data.urls; + } else { + urls = this.data.showUrls; + } + + let tempFilePath = ''; + let previewImageList = []; + const newType = this.data.newType; + const key = this.data.key; + + if (newType) { + tempFilePath = urls[index][key]; + for (let i = 0; i < urls.length; i++) { + previewImageList.push(urls[i][key]); + } + } else { + tempFilePath = urls[index]; + previewImageList = urls; + } + + let detail = { + index, // 下标 + current: urls[index], // 当前显示图片的http链接 + all: urls // 需要预览的图片http链接列表 + }; + let option = {}; + if (this.data.preview === true) { + wx.previewImage({ + current: tempFilePath, // 当前显示图片的http链接 + urls: previewImageList // 需要预览的图片http链接列表 + }); + } + this.triggerEvent('lintap', detail, option); + } + } +}); diff --git a/app/miniprogram_npm/lin-ui/album/index.json b/app/miniprogram_npm/lin-ui/album/index.json new file mode 100644 index 000000000..78013bdeb --- /dev/null +++ b/app/miniprogram_npm/lin-ui/album/index.json @@ -0,0 +1,5 @@ +{ + "component": true, + "usingComponents": { + } +} \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/album/index.less b/app/miniprogram_npm/lin-ui/album/index.less new file mode 100644 index 000000000..35b7bfab2 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/album/index.less @@ -0,0 +1,47 @@ +/* miniprogram_npm/lin-ui/picture-album/index.wxss */ +.container { + display: grid; +} + +.vertical { + height: 360rpx; +} + +.parent { + display: inline-grid; + grid-template-columns: repeat(auto-fill); +} + +.child { + box-sizing: border-box; + background-color: white; + flex: 0 0 44%; + height: 100px; + border: 1px solid red; + margin-top: 4%; + margin-left: 2%; + margin-right: 2%; +} + +.dimback { + background: #000; +} + +.dim { + opacity: 0.6; + filter: alpha(opacity=60); +} + +.imageContainer { + position: relative; +} + +.imageContainer:last-child > .text { + color: white; + font-weight: bold; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: larger; +} diff --git a/app/miniprogram_npm/lin-ui/album/index.wxml b/app/miniprogram_npm/lin-ui/album/index.wxml new file mode 100644 index 000000000..288ccc403 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/album/index.wxml @@ -0,0 +1,12 @@ + + + + + + + + +{{urls.length-maxNumber}} + + + + diff --git a/app/miniprogram_npm/lin-ui/album/index.wxs b/app/miniprogram_npm/lin-ui/album/index.wxs new file mode 100644 index 000000000..b41eda00a --- /dev/null +++ b/app/miniprogram_npm/lin-ui/album/index.wxs @@ -0,0 +1,79 @@ +var containerStyle = function (urls, multipleSize, gapRow, gapColumn) { + if (urls.length === 2 || urls.length === 4) { + return 'width:' + (2 * multipleSize + gapRow) + 'rpx; grid-row-gap:' + gapColumn + 'rpx; grid-column-gap:' + gapRow + 'rpx;grid-template-columns:repeat(auto-fit, ' + multipleSize + 'rpx);' + } else { + return 'width:' + (3 * multipleSize + 2 * gapRow) + 'rpx; grid-row-gap:' + gapColumn + 'rpx; grid-column-gap:' + gapRow + 'rpx;grid-template-columns:repeat(auto-fit, ' + multipleSize + 'rpx);' + } + +} + +var blockClass = function (urls, horizontalScreen) { + if (urls.length === 1) { + if (horizontalScreen) { + return 'l-single-image-class' + } else { + return 'vertical l-single-image-class' + } + } else { + return 'l-multi-image-class' + } +} + +var blockStyle = function (urls, horizontalScreen, shortSideValue, singleSize, multipleSize) { + if (urls.length === 1) { + if (horizontalScreen) { + return 'height:' + shortSideValue + 'rpx;width:' + singleSize + 'rpx;' + } else { + return 'width:' + shortSideValue + 'rpx;height:' + singleSize + 'rpx;' + } + } else { + return 'height:' + multipleSize + 'rpx;width:' + multipleSize + 'rpx;' + } +} + +var gridStyle = function (gapRow, gapColumn, multipleSize, everyRowNumber) { + return 'display:inline-grid;grid-template-columns: repeat(' + everyRowNumber + ',' + multipleSize + 'rpx);grid-row-gap:' + gapRow + 'rpx;grid-column-gap:' + gapColumn + 'rpx;' +} + +var dimBack = function (isLong, index, maxNumber, previewFullImage) { + if (previewFullImage) { + if (isLong) { + if (index == maxNumber - 1) { + return 'dimback' + } + } + } + return '' +} + +var dim = function (isLong, index, maxNumber, previewFullImage) { + if (previewFullImage) { + if (isLong) { + if (index == maxNumber - 1) { + return 'dim' + } + } + } + return '' +} + +var image = function (isLong, index, maxNumber, previewFullImage) { + if (previewFullImage) { + if (isLong) { + if (index == maxNumber - 1) { + return true + } + } + } + return false +} + +module.exports = { + containerStyle: containerStyle, + blockClass: blockClass, + blockStyle: blockStyle, + gridStyle: gridStyle, + dimBack: dimBack, + dim: dim, + image: image, +} diff --git a/app/miniprogram_npm/lin-ui/arc-popup/index.js b/app/miniprogram_npm/lin-ui/arc-popup/index.js new file mode 100644 index 000000000..bd86b2efe --- /dev/null +++ b/app/miniprogram_npm/lin-ui/arc-popup/index.js @@ -0,0 +1,166 @@ +import validator from '../behaviors/validator'; +import zIndex from '../behaviors/zIndex'; +const detail = true; +const option = { + bubbles: true, + composed: true +}; + +Component({ + /** + * 组件的属性列表 + */ + behaviors: [zIndex, validator], + externalClasses: ['l-class', 'l-panel-class', 'l-bg-class', 'l-header-class'], + options: { + multipleSlots: true // 在组件定义时的选项中启用多slot支持 + }, + properties: { + // 显示与隐藏 + show: { + type: Boolean, + value: false + }, + // 最大高度 + maxHeight: { + type: Number, + value: 600 + }, + // 最小高度 + minHeight: { + type: Number, + value: 200 + }, + // 顶部弧度 + arcRadius: { + type: Number, + value: 18 + }, + // 动画效果的显示和隐藏 + transition: { + type: Boolean, + value: true + }, + // 锁定 + locked: { + type: Boolean, + value: false + }, + // 背景透明度 + opacity: { + type: Number, + value: 0.4 + }, + // 弹出方向 + direction: { + type: String, + options: ['top', 'bottom'], + value: 'bottom' + }, + // header是否吸顶 + headerFixed: { + type: Boolean, + value: true + } + }, + + /** + * 组件的初始数据 + */ + data: { + _arcRadiusTop: 12, + _ardRadiusBottom: 18, + arcStyle: '' + }, + + /** + * 侦听器 + */ + observers: { + 'show': function (show) { + if (show) { + this.triggerEvent('linshow', detail, option); + this.getArcPopupStyle(); + } else { + this.triggerEvent('linclose', detail, option); + } + }, + 'arcRadius': function (arcRadius) { + if (this.properties.direction === 'top') { + this.data._arcRadiusTop = arcRadius; + } else { + this.data._ardRadiusBottom = arcRadius; + } + this.getArcPopupStyle(); + } + }, + + pageLifetimes: { + show() { + this._init(); + }, + }, + + /** + * 组件的方法列表 + */ + methods: { + _init() { + wx.lin = wx.lin || {}; + wx.lin.showArcPopup = (options) => { + const { + zIndex = 99, + tranistion = true, + direction = 'bottom', + locked = false + } = { + ...options + }; + this.setData({ + zIndex, + tranistion, + direction, + locked, + show: true + }); + }; + wx.lin.hideArcPopup = () => { + this.setData({ + show: false + }); + }; + }, + getArcPopupStyle() { + const direction = this.properties.direction; + const arcRadiusTop = this.data._arcRadiusTop; + const ardRadiusBottom = this.data._ardRadiusBottom; + const maxHeight = this.properties.maxHeight; + const minHeight = this.properties.minHeight; + const arcStyle = ` + border-bottom-left-radius:${direction === 'top' ? arcRadiusTop : 0}rpx; + border-bottom-right-radius:${direction === 'top' ? arcRadiusTop : 0}rpx; + border-top-left-radius:${direction === 'bottom' ? ardRadiusBottom : 0}rpx; + border-top-right-radius:${direction === 'bottom' ? ardRadiusBottom : 0}rpx; + max-height:${maxHeight}rpx; + min-height:${minHeight}rpx; + `; + this.setData({ + arcStyle, + }); + }, + onArcPopupTap() { + if (this.data.locked) { + return; + } + if (this.properties.show) { + this.setData({ + show: false + }); + } + } + }, + + ready() { + this.getArcPopupStyle(); + } +}); diff --git a/app/miniprogram_npm/lin-ui/arc-popup/index.json b/app/miniprogram_npm/lin-ui/arc-popup/index.json new file mode 100644 index 000000000..e72f4f50f --- /dev/null +++ b/app/miniprogram_npm/lin-ui/arc-popup/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "l-popup": "../popup/index" + } +} \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/arc-popup/index.less b/app/miniprogram_npm/lin-ui/arc-popup/index.less new file mode 100644 index 000000000..f915b1af3 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/arc-popup/index.less @@ -0,0 +1,25 @@ +.container-arc-popup { + width: 100%; +} + +.arc-popup { + overflow: hidden; + width: 100%; + background: #fff; +} + +.content-arc-popup { + padding: 30rpx; + box-sizing: border-box; +} + +.header-popup { + width: 100%; + z-index: 999; + + &.fixed { + position: sticky; + top: 0; + background-color: #fff; + } +} diff --git a/app/miniprogram_npm/lin-ui/arc-popup/index.wxml b/app/miniprogram_npm/lin-ui/arc-popup/index.wxml new file mode 100644 index 000000000..16118eb68 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/arc-popup/index.wxml @@ -0,0 +1,24 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/avatar/index.js b/app/miniprogram_npm/lin-ui/avatar/index.js new file mode 100644 index 000000000..cec5f2a7f --- /dev/null +++ b/app/miniprogram_npm/lin-ui/avatar/index.js @@ -0,0 +1,70 @@ +Component({ + externalClasses: [ + 'l-class', + 'l-class-text', + 'l-text-class' + ], + properties: { + icon: String, + iconColor: { + type: String, + value: '#3963BC' + }, + iconSize: { + type: String, + value: '28' + }, + text: String, + src: String, + openData: { + type: Array, + observer: '_initOpenData' + }, + shape: { + type: String, + value: 'circle' + }, + mode: { + type: String, + value: 'scaleToFill' + }, + size: { + type: Number, + value: 120, + }, + placement: { + type: String, + value: 'right' + }, + }, + data: { + _isHaveUserNickName: false, + _isHaveUserAvatarUrl: false, + _iconSize: '', + _iconColor: '#ffffff' + }, + methods: { + _initOpenData: function (openData) { + this._isHaveUserAvatarUrl(openData); + this._isHaveUserNickName(openData); + }, + + _isHaveUserAvatarUrl: function (openData) { + this.setData({ + _isHaveUserAvatarUrl: openData.indexOf('userAvatarUrl') !== -1 + }); + }, + + _isHaveUserNickName: function (openData) { + this.setData({ + _isHaveUserNickName: openData.indexOf('userNickName') !== -1 + }); + }, + tapAvatar: function (e) { + this.triggerEvent('lintap', e, { + bubbles: true, + composed: true + }); + }, + } +}); \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/avatar/index.json b/app/miniprogram_npm/lin-ui/avatar/index.json new file mode 100644 index 000000000..dd10af0a0 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/avatar/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "l-icon":"../icon/index" + } + } \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/avatar/index.less b/app/miniprogram_npm/lin-ui/avatar/index.less new file mode 100644 index 000000000..9885a4b4a --- /dev/null +++ b/app/miniprogram_npm/lin-ui/avatar/index.less @@ -0,0 +1,84 @@ +@import "../../config/styles/_base.less"; + +.l-avatar { + display: inline-flex; + justify-content: center; + align-items: center; +} + +.l-avatar-image { + flex: 1; + display: inline-flex; + justify-content: center; + align-items: center; + background: @avatar-bg; + overflow: hidden; +} + +.l-avatar-text { + display: inline-block; + height: max-content; + width: max-content; + font-size: 28rpx; + color: rgb(69 82 107 / 100%); + line-height: 40px; +} + +.open-data { + width: 100%; + height: 100%; +} + +.l-avatar-text .open-data, +.l-avatar-text .l-avatar-text-text { + font-size: inherit; + color: inherit; + line-height: inherit; +} + +.l-square { + border-radius: 8rpx; +} + +.l-circle { + border-radius: 50%; +} + +.l-placement-left, +.l-placement-right { + align-items: center; + justify-content: center; +} + +.l-placement-left { + margin-right: 24rpx; + flex-direction: row-reverse; +} + +.l-placement-left .l-avatar-text { + margin-right: 24rpx; +} + +.l-placement-right { + flex-direction: row; +} + +.l-placement-right .l-avatar-text { + margin-left: 24rpx; +} + +.l-placement-top { + flex-direction: column-reverse; +} + +.l-placement-top .l-avatar-text { + margin-bottom: 12rpx; +} + +.l-placement-bottom { + flex-direction: column; +} + +.l-placement-bottom .l-avatar-text { + margin-top: 12rpx; +} diff --git a/app/miniprogram_npm/lin-ui/avatar/index.wxml b/app/miniprogram_npm/lin-ui/avatar/index.wxml new file mode 100644 index 000000000..61b126977 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/avatar/index.wxml @@ -0,0 +1,12 @@ + + + + + + + + + + {{text}} + + diff --git a/app/miniprogram_npm/lin-ui/badge/index.js b/app/miniprogram_npm/lin-ui/badge/index.js new file mode 100644 index 000000000..5a4c41a00 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/badge/index.js @@ -0,0 +1,93 @@ +import validator from '../behaviors/validator'; + +Component({ + externalClasses: ['l-class', 'l-class-self', 'l-self-class'], + behaviors: [validator], + properties: { + // 红点模式 + dot: { + type: Boolean, + value: false + }, + shape: { + type: String, + value: 'horn', + options: ['horn', 'circle'] + }, + value: { + type: String, + value: '0' + }, + mode: { + type: String, + value: 'number', + options: ['number', 'text'] + }, + // 数字最大值 + maxCount: { + type: Number, + value: 99 + }, + // 数字形式 + numberType: { + type: String, + value: 'overflow', + options: ['overflow', 'limit', 'ellipsis'] + }, + show: { + type: Boolean, + value: true + } + }, + data: { + finalCount: 0 + }, + observers: { + 'value': function () { + this.finalCount(); + } + }, + methods: { + // 最终数字 + finalCount() { + if (isNaN(Number(this.data.value)) || (this.data.mode === 'text')) { + this.setData({ + finalCount: this.data.value + }); + } else { + this.switchType(); + } + }, + switchType() { + switch (this.data.numberType) { + case 'overflow': + this.setData({ + finalCount: Number(this.data.value) > Number(this.data.maxCount) ? `${this.data.maxCount}+` : this.data.value + }); + break; + case 'ellipsis': + this.setData({ + finalCount: Number(this.data.value) > Number(this.data.maxCount) ? '...' : this.data.value + }); + break; + case 'limit': + this.setData({ + finalCount: Number(this.data.value) > 999 ? (Number(this.data.value) >= 9999 ? Math.floor(this.data.value / 10000 * 100) / 100 + 'w' : Math.floor(this.data.value / 1000 * 100) / 100 + 'k') : this.data.value + }); + break; + default: + this.setData({ + finalCount: Number(this.data.value) + }); + break; + } + }, + // 点击事件 + handleTap() { + this.triggerEvent('lintap', {}, { + bubbles: true, + composed: true + }); + }, + } +}); diff --git a/app/miniprogram_npm/lin-ui/badge/index.json b/app/miniprogram_npm/lin-ui/badge/index.json new file mode 100644 index 000000000..e56592f89 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/badge/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + + } +} \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/badge/index.less b/app/miniprogram_npm/lin-ui/badge/index.less new file mode 100644 index 000000000..458ebb54d --- /dev/null +++ b/app/miniprogram_npm/lin-ui/badge/index.less @@ -0,0 +1,54 @@ +@import "../../config/styles/_base.less"; + +.l-badge { + position: relative; + display: inline-block; + line-height: 1; + vertical-align: middle; + + &-content { + max-width: 650rpx; + left: 70%; + background-color: #ff474b; + color: #fff; + position: absolute; + font-size: 20rpx; + display: inline-block; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + text-align: center; + box-sizing: border-box; + z-index: 10; + letter-spacing: 0.5rpx; + + &-horn { + height: 28rpx; + min-width: 54rpx; + padding: 0 8rpx; + border-radius: 14rpx 14rpx 14rpx 0rpx; + line-height: 28rpx; + top: -10rpx; + } + + &-circle { + height: 32rpx; + min-width: 32rpx; + padding: 0 10rpx; + border-radius: 16rpx; + line-height: 32rpx; + top: -10rpx; + } + } + + &-dot { + height: 16rpx; + width: 16rpx; + transform: translateX(50%); + border-radius: 50%; + background-color: #ff474b; + position: absolute; + top: -4rpx; + right: 0rpx; + } +} diff --git a/app/miniprogram_npm/lin-ui/badge/index.wxml b/app/miniprogram_npm/lin-ui/badge/index.wxml new file mode 100644 index 000000000..33c6be888 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/badge/index.wxml @@ -0,0 +1,7 @@ + + + + + {{finalCount}} + + diff --git a/app/miniprogram_npm/lin-ui/behaviors/computeOffset.js b/app/miniprogram_npm/lin-ui/behaviors/computeOffset.js new file mode 100644 index 000000000..381f723ab --- /dev/null +++ b/app/miniprogram_npm/lin-ui/behaviors/computeOffset.js @@ -0,0 +1,19 @@ +// eslint-disable-next-line no-undef +export default Behavior({ + behaviors: [], + properties: {}, + data: { + distance: 0 + }, + attached(){ + this.offsetMargin(); + }, + methods: { + offsetMargin() { + const { windowHeight, screenHeight } = wx.getSystemInfoSync(); + this.setData({ + distance: (screenHeight-windowHeight ) + }); + } + } +}); \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/behaviors/countdown.js b/app/miniprogram_npm/lin-ui/behaviors/countdown.js new file mode 100644 index 000000000..4da21f6cc --- /dev/null +++ b/app/miniprogram_npm/lin-ui/behaviors/countdown.js @@ -0,0 +1,222 @@ +// eslint-disable-next-line no-undef +export default Behavior({ + behaviors: [], + properties: { + time: { + optionalTypes: [String, Object], + value: new Date().getTime() + 86400000, + observer: function (newVal, oldVal) { + if (newVal && !oldVal) { + this.getLatestTime(); + } + } + }, + status: { + type: Boolean, + value: true, + observer: function (newVal) { + if (newVal) { + this.init(); + } else if (!newVal) { + clearInterval(this.data.timer); + } + } + }, + timeType: { + type: String, + value: 'datetime' + }, + format: { + type: String, + value: '{%d}天{%h}时{%m}分{%s}秒' + }, + isZeroPadd: { + type: Boolean, + value: true, + }, + countdownType: { + type: String, + value: 'normal' + }, + isClearInterval: { + type: Boolean, + value: true + } + }, + data: { + initAddTime: 0, + timer: null, + date: [], + }, + ready: function () { + this.getLatestTime(); + }, + + detached: function () { + if (this.data.isClearInterval) { + clearInterval(this.data.timer); + } + }, + + pageLifetimes: { + hide() { + if (this.data.isClearInterval) { + clearInterval(this.data.timer); + } + + }, + show() { + if (this.data.isClearInterval) { + this.getLatestTime(); + } + } + }, + + methods: { + // 自动补零 + zeroPadding(num) { + num = num.toString(); + return num[1] ? num : '0' + num; + }, + + init() { + clearInterval(this.data.timer); + const timer = setTimeout(() => { + this.getLatestTime.call(this); + }, 1000); + this.setData({ + timer + }); + }, + + getLatestTime() { + let { + time, + status, + timeType, + initAddTime, + countdownType, + } = this.data; + // IOS不支持2019-04-23 的日期格式 + let countDownTime = time; + if (countdownType === 'normal') { //当countdownType === normal时,不影响之前的代码 + if (timeType !== 'second') { + countDownTime = typeof time === 'string' ? countDownTime.replace(/-/g, '/') : countDownTime; + countDownTime = Math.ceil((new Date(countDownTime).getTime() - new Date().getTime()) / 1000); + } + + if (countDownTime < 0 && timeType !== 'second') { + this._getTimeValue(0); + this.CountdownEnd(); + return; + } + + if (countDownTime - initAddTime > 0) { + this.getLatestForCountDown(countDownTime); + } else if (countDownTime - initAddTime < 0) { + this.getLatestForAddTime(countDownTime); + } else if (countDownTime - initAddTime === 0) { + if (initAddTime <= 0) { + this._getTimeValue(countDownTime); + } + this.CountdownEnd(); + } + + if (status && countDownTime - initAddTime !== 0) { + this.init.call(this); + } + + } else if (countdownType === 'anniversary') { // 当countdownType === anniversary时,为纪念日模式 + if (timeType === 'second') { // 纪念日模式不能设置timeType === second + console.error(`countdownType为${countdownType}类型时,不可设置timeType值为second`); + } else { + countDownTime = typeof time === 'string' ? countDownTime.replace(/-/g, '/') : countDownTime; + countDownTime = Math.ceil((new Date().getTime() - new Date(countDownTime).getTime()) / 1000); + if (countDownTime >= 0) { // countDownTime计算结果不能为负数 + this.getLatestForCountDown(countDownTime); + this.init.call(this); + } else { + console.error('time传值错误'); + } + } + } else { // countdownType 不能设置为 normal,anniversary 以外的值 + console.error('错误的countdownType类型'); + } + }, + + getLatestForAddTime(countDownTime) { + let { + initAddTime + } = this.data; + if (initAddTime !== Math.abs(countDownTime)) { + initAddTime++; + this._getTimeValue(initAddTime); + this.setData({ + initAddTime + }); + } + }, + + getLatestForCountDown(countDownTime) { + this._getTimeValue(countDownTime); + this.setData({ + time: this.data.timeType === 'second' ? --countDownTime : this.data.time, + }); + }, + + _getTimeValue(countDownTime) { + const { + format + } = this.data; + const date = []; + const fomatArray = format.split(/(\{.*?\})/); + const formatType = [{ + key: '{%d}', + type: 'day', + count: 86400 + }, { + key: '{%h}', + type: 'hour', + count: 3600 + }, { + key: '{%m}', + type: 'minute', + count: 60 + }, { + key: '{%s}', + type: 'second', + count: 1, + }]; + let diffSecond = countDownTime; + formatType.forEach(format => { + const index = this._findTimeName(fomatArray, format.key); + if (index === -1) return; + const name = fomatArray[index]; + const formatItem = { + type: format.type, + name, + value: parseInt(diffSecond / format.count) + }; + if (this.data.isZeroPadd) { + formatItem.value = this.zeroPadding(formatItem.value); + } + diffSecond %= format.count; + date.push(formatItem); + }); + this.setData({ + date + }); + return date; + }, + + _findTimeName(fomatArray, str) { + const index = fomatArray.indexOf(str); + if (index === -1) return -1; + return index + 1; + }, + + CountdownEnd() { + this.triggerEvent('linend', {}); + }, + } +}); \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/behaviors/hover.js b/app/miniprogram_npm/lin-ui/behaviors/hover.js new file mode 100644 index 000000000..1cd5d97c3 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/behaviors/hover.js @@ -0,0 +1,10 @@ +// eslint-disable-next-line no-undef +export default Behavior({ + behaviors: [], + properties: { + isHover:{ + type: Boolean, + value: true + } + } +}); \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/behaviors/rules.js b/app/miniprogram_npm/lin-ui/behaviors/rules.js new file mode 100644 index 000000000..0a3efb1d4 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/behaviors/rules.js @@ -0,0 +1,144 @@ +import Schema from '../common/async-validator/index'; +import validator from '../behaviors/validator'; + +/** + * @param tipType String [toast , message , text] + */ +// eslint-disable-next-line no-undef +export default Behavior({ + behaviors: [validator], + properties: { + // 校验 + rules: { + optionalTypes: [Object, Array], + value: [] + }, + tipType: { + type: String, + value: 'toast', + options: ['toast', 'message', 'text'] + } + }, + data: { + schema: '', + tipFun: { + 'message': 'showMessage', + 'toast': 'showToast', + }, + tipContent: { + 'message': 'content', + 'toast': 'title', + }, + errorText: '', + errors: [] + }, + + methods: { + initRules() { + // const rulesName = this.data.name; + const { + rules + } = this.data; + if (!rules) return; + // 如果rule 是单个object + if (Object.prototype.toString.call(rules) === '[object Object]') { + this.data.rules = [rules]; + } + + this.data.rules.forEach(item => { + if (!item.trigger) { + item.trigger = []; + return; + } + if (typeof item.trigger === 'string') { + item.trigger = [item.trigger]; + return; + } + // if(Object.prototype.toString.call(item.trigger) === '[object Object]') { + // item.trigger = ['blur']; + // return; + // } + }); + + }, + getNeedValidateRule(type) { + const rulesName = this.data.name; + const { + rules + } = this.data; + if (!rules) return; + + const list = type ? rules.filter(item => { + return item.trigger.indexOf(type) > -1; + }) : rules; + const schema = new Schema({ + [rulesName]: list, + }); + this.setData({ + schema, + }); + return list; + }, + validatorData(value, type) { + const { + tipType, + tipFun, + tipContent + } = this.data; + const rules = this.getNeedValidateRule(type); + + if (!rules) return; + + // 把空字符串设置为 undefined ,见 issue 856 + // async-validator 对空字符串会进行类型检查,与required会冲突 + Object.getOwnPropertyNames(value).forEach((key) => { + if (value[key] === '') { + value[key] = undefined; + } + }); + + this.data.schema.validate(value, (errors) => { + this.setData({ + errors: errors || [] + }); + + this.triggerEvent('linvalidate', { + errors, + isError: !!errors + }); + + if (errors && tipType) { + const funName = tipFun[tipType]; + const contentName = tipContent[tipType]; + if (tipType === 'text') { + this.setData({ + errorText: errors[0].message + }); + return errors; + } + + if (!wx.lin || !wx.lin[funName]) { + wx.showToast({ + icon: 'none', + title: `请在页面内引入${tipType}组件` + }); + return errors; + } + + wx.lin[funName] && wx.lin[funName]({ + [contentName]: errors[0].message, + duration: 1500, + mask: false, + }); + return errors; + } else if (!errors && tipType) { + this.setData({ + errorText: '' + }); + } + + }); + + } + } +}); diff --git a/app/miniprogram_npm/lin-ui/behaviors/scrollCenter.js b/app/miniprogram_npm/lin-ui/behaviors/scrollCenter.js new file mode 100644 index 000000000..67090cdbf --- /dev/null +++ b/app/miniprogram_npm/lin-ui/behaviors/scrollCenter.js @@ -0,0 +1,57 @@ +// eslint-disable-next-line no-undef +export default Behavior({ + methods: { + getRect(selector, all = false) { + return new Promise((resolve, reject) => { + const query = wx.createSelectorQuery().in(this); + const type = all ? query.selectAll(selector) : query.select(selector); + type.boundingClientRect((res) => { + if (!res) return reject('找不到元素'); + resolve(res); + }).exec(); + }); + }, + queryScrollNode(res, currentIndex, type = 'width') { + if (currentIndex < 0) return; + const currentRect = res[currentIndex]; + this.getRect('.l-tabsscroll').then(_ => { + if (!_) return console.error('找不到元素'); + const scrollWidth = _[type]; + let transformDistance = res + .slice(0, currentIndex) + .reduce((prev, curr) => prev + curr[type], 0); + transformDistance += (currentRect[type] - scrollWidth) / 2; + + if (type === 'width') { + this.setData({ + transformX: transformDistance, + transformY: 0 + }); + } else { + this.setData({ + transformX: 0, + transformY: transformDistance + }); + } + }).catch(err => { + console.error(err); + }); + }, + queryMultipleNodes() { + const { + placement, + currentIndex + } = this.data; + this.getRect('.l-tabs-item', true) + .then((res) => { + if (['top', 'bottom'].indexOf(placement) !== -1) { + this.queryScrollNode(res, currentIndex); + } else { + this.queryScrollNode(res, currentIndex, 'height'); + } + }).catch(err => { + console.error(err); + }); + } + } +}); diff --git a/app/miniprogram_npm/lin-ui/behaviors/transition.js b/app/miniprogram_npm/lin-ui/behaviors/transition.js new file mode 100644 index 000000000..2fb6fa367 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/behaviors/transition.js @@ -0,0 +1,122 @@ +const isObj = (x) => { + const type = typeof x; + return x !== null && (type === 'object' || type === 'function'); +}; +const getClassNames = (name) => ({ + enter: `l-${name}-enter l-${name}-enter-active l-enter-class l-enter-active-class`, + 'enter-to': `l-${name}-enter-to l-${name}-enter-active l-enter-to-class l-enter-active-class`, + leave: `l-${name}-leave l-${name}-leave-active l-leave-class l-leave-active-class`, + 'leave-to': `l-${name}-leave-to l-${name}-leave-active l-leave-to-class l-leave-active-class` +}); +const nextTick = () => new Promise(resolve => setTimeout(resolve, 1000 / 30)); +export default (showDefaultValue) => { + // eslint-disable-next-line no-undef + return Behavior({ + properties: { + customStyle: String, + show: { + type: Boolean, + value: showDefaultValue, + observer: 'observeShow' + }, + duration: { + type: null, + value: 300, + observer: 'observeDuration' + }, + name: { + type: String, + value: 'fade' + } + }, + data: { + type: '', + inited: false, + display: false + }, + attached() { + if (this.data.show) { + this.enter(); + } + }, + methods: { + observeShow(value) { + value ? this.enter() : this.leave(); + }, + enter() { + const { duration, name } = this.data; + const classNames = getClassNames(name); + const currentDuration = isObj(duration) ? duration.enter : duration; + this.status = 'enter'; + this.triggerEvent('linbeforeenter'); + Promise.resolve() + .then(nextTick) + .then(() => { + this.checkStatus('enter'); + this.triggerEvent('linenter'); + this.setData({ + inited: true, + display: true, + classes: classNames.enter, + currentDuration + }); + }) + .then(nextTick) + .then(() => { + this.checkStatus('enter'); + this.transitionEnded = false; + this.setData({ + classes: classNames['enter-to'] + }); + }) + .catch(() => { }); + }, + leave() { + if (!this.data.display) { + return; + } + const { duration, name } = this.data; + const classNames = getClassNames(name); + const currentDuration = isObj(duration) ? duration.leave : duration; + this.status = 'leave'; + this.triggerEvent('linbeforeleave'); + Promise.resolve() + .then(nextTick) + .then(() => { + this.checkStatus('leave'); + this.triggerEvent('linleave'); + this.setData({ + classes: classNames.leave, + currentDuration + }); + }) + .then(nextTick) + .then(() => { + this.checkStatus('leave'); + this.transitionEnded = false; + setTimeout(() => this.onTransitionEnd(), currentDuration); + this.setData({ + classes: classNames['leave-to'] + }); + }) + .catch(() => { }); + }, + checkStatus(status) { + if (status !== this.status) { + throw new Error(`incongruent status: ${status}`); + } + }, + onTransitionEnd() { + if (this.transitionEnded) { + return; + } + this.transitionEnded = true; + this.triggerEvent(`linafter${this.status}`); + const { show, display } = this.data; + if (!show && display) { + this.setData({ display: false }); + } + } + } + }); +}; diff --git a/app/miniprogram_npm/lin-ui/behaviors/validator.js b/app/miniprogram_npm/lin-ui/behaviors/validator.js new file mode 100644 index 000000000..e2a5f9503 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/behaviors/validator.js @@ -0,0 +1,21 @@ +// eslint-disable-next-line no-undef +export default Behavior({ + definitionFilter(defFields) { + const { + properties + } = defFields; + const propsKey = Object.keys(properties); + propsKey.forEach(name => { + const { + options + } = properties[name]; + if (options) { + properties[name].observer = function (newValue) { + if (!options.includes(newValue) && newValue) { + console.error(`${name}: ${newValue} must be in the [${options}]`); + } + }; + } + }); + } +}); \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/behaviors/watchShow.js b/app/miniprogram_npm/lin-ui/behaviors/watchShow.js new file mode 100644 index 000000000..d2569e84e --- /dev/null +++ b/app/miniprogram_npm/lin-ui/behaviors/watchShow.js @@ -0,0 +1,26 @@ +// eslint-disable-next-line no-undef +export default Behavior({ + observers: { + 'show': function (show) { + show && this.changeStatus(); + if (!show) this.setData({ + status: show + }); + } + }, + methods: { + changeStatus() { + this.setData({ + status: true + }); + if (this.data.timer) clearTimeout(this.data.timer); + this.data.timer = setTimeout(() => { + this.setData({ + status: false + }); + if (this.data.success) this.data.success(); + this.data.timer = null; + }, this.properties.duration); + } + } +}); \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/behaviors/zIndex.js b/app/miniprogram_npm/lin-ui/behaviors/zIndex.js new file mode 100644 index 000000000..3e3d94131 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/behaviors/zIndex.js @@ -0,0 +1,10 @@ +// eslint-disable-next-line no-undef +export default Behavior({ + behaviors: [], + properties: { + zIndex:{ + type: Number, + value: 777 + } + } +}); \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/button/index.js b/app/miniprogram_npm/lin-ui/button/index.js new file mode 100644 index 000000000..8258369b5 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/button/index.js @@ -0,0 +1,94 @@ +import validator from '../behaviors/validator'; + +Component({ + externalClasses: [ + 'l-class', + 'l-label-class', + 'l-hover-class', + 'l-img-class', + 'l-icon-class' + ], + behaviors: [validator], + properties: { + // button组建标识 + name: { + type: String, + value: 'lin' + }, + type: { + type: String, + value: 'default', + options: ['warning', 'success', 'error', 'default'] + }, + plain: Boolean, + size: { + type: String, + value: 'medium', + options: ['medium', 'large', 'mini', 'long'] + }, + shape: { + type: String, + value: 'circle', + options: ['square', 'circle', 'semicircle'] + }, + disabled: { + type: Boolean, + value: false, + }, + special: { + type: Boolean, + value: false, + }, + loading: { + type: Boolean, + value: false, + }, + // 微信原生接口 + width: Number, + height: Number, + icon: String, + image: String, + bgColor: String, + iconColor: String, + iconSize: String, + openType: String, + appParameter: String, + lang: String, + hoverStopPropagation: Boolean, + hoverStartTime: { + type: Number, + value: 20 + }, + hoverStayTime: { + type: Number, + value: 70 + }, + sessionFrom: { + type: String, + value: '' + }, + sendMessageTitle: String, + sendMessagePath: String, + sendMessageImg: String, + showMessageCard: Boolean, + formType: String, + disabledHover: { + type: Boolean, + value: false + } + }, + methods: { + // button点击事件 + handleTap() { + if (this.data.disabled || this.data.loading) return false; + this.triggerEvent('lintap', {}, { + bubbles: true, + composed: true + }); + }, + // 开放能力事件回调 + openTypeEvent(data) { + this.triggerEvent(data.type, data.detail, {}); + } + } +}); diff --git a/app/miniprogram_npm/lin-ui/button/index.json b/app/miniprogram_npm/lin-ui/button/index.json new file mode 100644 index 000000000..c01e2d7e6 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/button/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "l-icon":"../icon/index" + } +} \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/button/index.less b/app/miniprogram_npm/lin-ui/button/index.less new file mode 100644 index 000000000..06bc5b000 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/button/index.less @@ -0,0 +1,207 @@ +@import "../../config/styles/_base.less"; +@import "../../config/styles/_mixins.less"; + +.btn-hover::before { + .active(); +} + +.special-container { + display: flex; +} + +.l-btn { + display: inline-flex; + align-items: center; + justify-content: center; + white-space: nowrap; + font-size: 28rpx; + position: relative; + color: #fff; + padding: 0 12rpx; + box-sizing: border-box; + + // img-size + &-img { + &-mini { + width: @btn-height-mini/2; + height: @btn-height-mini/2; + } + + &-medium { + width: @btn-height/2; + height: @btn-height/2; + } + + &-large { + height: @btn-height-large/2; + width: @btn-height-large/2; + } + } + + // Size + &-long { + border-radius: 0; + height: 88rpx; + width: 100%; + } + + &-medium { + height: @btn-height; + min-width: @btn-width; + } + + &-large { + height: @btn-height-large; + min-width: @btn-width-large; + } + + &-mini { + height: @btn-height-mini; + min-width: @btn-width-mini; + font-size: @size-font-mini; + } + + //Type + &-default { + background-color: @default-color; + } + + &-success { + background-color: @success-color; + } + + &-warning { + background-color: @warning-color; + color: #333; + } + + &-error { + background-color: @error-color; + } + + // Shape + &-square { + border-radius: 0; + } + + &-semicircle { + border-radius: @btn-circle-size; + } + + &-large&-semicircle { + border-radius: @btn-circle-size-large; + } + + &-mini&-semicircle { + border-radius: @btn-circle-size-mini; + } + + &-circle { + border-radius: @btn-circle-size/5; + } + + &-large&-circle { + border-radius: @btn-circle-size-large/5; + } + + &-mini&-circle { + border-radius: @btn-circle-size-mini/5; + } + + // Plain + &-plain { + background-color: #fff; + color: @default-color; + border: 2rpx solid @default-color; + } + + &-success&-plain { + background-color: #fff; + color: @success-color; + border: 2rpx solid @success-color; + } + + &-error&-plain { + background-color: #fff; + color: @error-color; + border: 2rpx solid @error-color; + } + + &-warning&-plain { + background-color: #fff; + color: @warning-color; + border: 2rpx solid @warning-color; + } + + // Loading + &-loading { + opacity: 0.6; + display: inline-block; + vertical-align: middle; + width: 24rpx; + height: 24rpx; + background: transparent; + border-radius: 50%; + border: 4rpx solid @btn-loading-color; + border-color: @btn-loading-color @btn-loading-color @btn-loading-color transparent; + animation: btn-spin 0.6s linear; + animation-iteration-count: infinite; + + &-default { + border: 4rpx solid @default-color; + border-color: @default-color @default-color @default-color transparent; + } + + &-success { + border: 4rpx solid @success-color; + border-color: @success-color @success-color @success-color transparent; + } + + &-error { + border: 4rpx solid @error-color; + border-color: @error-color @error-color @error-color transparent; + } + + &-warning { + border: 4rpx solid @warning-color; + border-color: @warning-color @warning-color @warning-color transparent; + } + } + + // Disabled + &-disabled { + opacity: 0.8; + } +} + +.icon { + display: flex !important; +} + +.margin { + &-mini { + margin-right: 10rpx; + } + + &-medium { + margin-right: 18rpx; + } + + &-large { + margin-right: 24rpx; + } + + &-long { + margin-right: 24rpx; + } +} + +@keyframes btn-spin { + 0% { + transform: rotate(0); + } + + 100% { + transform: rotate(360deg); + } +} diff --git a/app/miniprogram_npm/lin-ui/button/index.wxml b/app/miniprogram_npm/lin-ui/button/index.wxml new file mode 100644 index 000000000..f81facf96 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/button/index.wxml @@ -0,0 +1,39 @@ + + diff --git a/app/miniprogram_npm/lin-ui/calendar/calendar.wxml b/app/miniprogram_npm/lin-ui/calendar/calendar.wxml new file mode 100644 index 000000000..2ee37006d --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/calendar.wxml @@ -0,0 +1,29 @@ + + + diff --git a/app/miniprogram_npm/lin-ui/calendar/components/day/index.js b/app/miniprogram_npm/lin-ui/calendar/components/day/index.js new file mode 100644 index 000000000..885993dd3 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/components/day/index.js @@ -0,0 +1,16 @@ +Component({ + data: {}, + properties: { + text: null, + topInfo: null, + bottomInfo: null, + type: null, + color: { + type: String, + value: '' + } + }, + methods: { + + } +}); \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/calendar/components/day/index.json b/app/miniprogram_npm/lin-ui/calendar/components/day/index.json new file mode 100644 index 000000000..32640e0dc --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/components/day/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/calendar/components/day/index.less b/app/miniprogram_npm/lin-ui/calendar/components/day/index.less new file mode 100644 index 000000000..a2c736456 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/components/day/index.less @@ -0,0 +1,67 @@ +@import "../../../../config/styles/_base.less"; + +.calendar-day-container { + display: flex; + flex-direction: column; + height: 100%; + align-items: center; + position: relative; + color: #666; + + &.selected { + background-color: @default-color; + color: #fff; + border-radius: 8rpx; + } + + &.start { + background-color: @default-color; + color: #fff; + border-radius: 8rpx; + } + + &.end { + background-color: @default-color; + color: #fff; + border-radius: 8rpx; + } + + &.disabled { + color: #c8c9cc; + cursor: default; + background: #fff; + } + + &.middle { + color: @default-color; + + &::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: currentcolor; + opacity: 0.1; + content: ""; + } + } + // background-color: red; + // color: #eff9f0; + .top { + height: 24rpx; + line-height: 24rpx; + font-size: 16rpx; + } + + .text { + flex: 1; + font-size: 32rpx; + } + + .bottom { + height: 24rpx; + line-height: 24rpx; + font-size: 16rpx; + } +} diff --git a/app/miniprogram_npm/lin-ui/calendar/components/day/index.wxml b/app/miniprogram_npm/lin-ui/calendar/components/day/index.wxml new file mode 100644 index 000000000..b352152c1 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/components/day/index.wxml @@ -0,0 +1,8 @@ + + + {{ topInfo }} + {{ text }} + {{ bottomInfo }} + \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/calendar/components/day/index.wxs b/app/miniprogram_npm/lin-ui/calendar/components/day/index.wxs new file mode 100644 index 000000000..b81bd182a --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/components/day/index.wxs @@ -0,0 +1,27 @@ +function getDayStyle(type, color) { + var style = []; + + if (color) { + if ( + type === 'start' || + type === 'end' || + type === 'selected' + ) { + style.push(['background', color]); + } else if (type === 'middle') { + style.push(['color', color]); + // style.push(['background', color]); + // style.push(['opacity', '0.1']); + } + } + + return style + .map(function(item) { + return item.join(':'); + }) + .join(';'); +} + +module.exports = { + getDayStyle: getDayStyle, +}; \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/calendar/components/header/index.js b/app/miniprogram_npm/lin-ui/calendar/components/header/index.js new file mode 100644 index 000000000..29aa51a81 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/components/header/index.js @@ -0,0 +1,15 @@ +Component({ + data: { + weekdays: ['日', '一', '二', '三', '四', '五', '六'] + }, + properties: { + title: { + type: String, + value: '日期选择' + }, + subTitle: String, + showTitle: Boolean, + showSubtitle: Boolean + }, + methods: {} +}); \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/calendar/components/header/index.json b/app/miniprogram_npm/lin-ui/calendar/components/header/index.json new file mode 100644 index 000000000..32640e0dc --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/components/header/index.json @@ -0,0 +1,3 @@ +{ + "component": true +} \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/calendar/components/header/index.less b/app/miniprogram_npm/lin-ui/calendar/components/header/index.less new file mode 100644 index 000000000..d2d0eb929 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/components/header/index.less @@ -0,0 +1,29 @@ +.calendar-header-container { + .calendar-header-container_title { + text-align: center; + padding: 20rpx 0; + font-size: 36rpx; + line-height: 44rpx; + } + + .calendar-header-container_subtitle { + text-align: center; + font-size: 36rpx; + line-height: 44rpx; + margin-bottom: 30rpx; + } + + .calendar-header__weekdays { + display: flex; + justify-content: center; + align-items: center; + margin: 0 20rpx; + padding: 10rpx 0; + border-bottom: 1rpx solid #f3f3f3; + + .calendar-header__weekday { + width: 14.285%; + text-align: center; + } + } +} diff --git a/app/miniprogram_npm/lin-ui/calendar/components/header/index.wxml b/app/miniprogram_npm/lin-ui/calendar/components/header/index.wxml new file mode 100644 index 000000000..3dfeb5e48 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/components/header/index.wxml @@ -0,0 +1,20 @@ + + + + + {{ title }} + + + + + {{ subTitle }} + + + + + {{ item }} + + + \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/calendar/components/mounth/index.js b/app/miniprogram_npm/lin-ui/calendar/components/mounth/index.js new file mode 100644 index 000000000..446351dce --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/components/mounth/index.js @@ -0,0 +1,195 @@ +import { compareDay, getMonthEndDay } from '../../util'; +import * as config from '../../config'; +Component({ + data: { + days: [] + }, + properties: { + minDate: { + type: Object, + optionalTypes: [String, null], + }, + maxDate: { + type: Object, + optionalTypes: [String, null], + }, + formatter: { + type: null, + observer: 'setDays' + }, + date: { + type: null, + observer: 'setDays' + }, + currentDate: { + type: Array, + optionalTypes: [null], + observer() { + this.setDays(); + } + }, + type: { + type: String, + observer: 'setDays' + }, + showMonthTitle: Boolean, + color: { + type: String, + value: '' + } + }, + methods: { + + /** + * 某一天的点击事件 + */ + onClick(event) { + const { item } = event.currentTarget.dataset; + if (item.type !== 'disabled' && item.type !== 'empty') { + this.triggerEvent('clickDay', item); + } + }, + debounce(fn) { + let timer; + return () => { + let that = this; + let args = arguments; + if(timer) clearTimeout(timer); + timer = setTimeout(function() { + fn.apply(that, args); + }, 300); + }; + }, + setDays() { + this.debounce(this.setDay)(); + }, + /** + * 设置某月分的天数 + */ + setDay() { + let days = []; + const startDate = new Date(this.data.date); + const year = startDate.getFullYear(); + const month = startDate.getMonth(); + const day = new Date(year, month, 1).getDay(); + + const totalDay = getMonthEndDay(year, month + 1); + + for (let day = 1; day <= totalDay; day++) { + const date = new Date(year, month, day).getTime(); + const type = this.getDayType(date); + + + let config = { + date, + type, + text: day, + bottomInfo: this.getBottomInfo(type), + topInfo: '' + }; + + if (this.data.formatter) { + config = this.data.formatter(config); + } + days.push(config); + } + + for(let i = 0; i < day; i++) { + days.unshift({ + type: 'empty' + }); + } + + this.setData({ + days + }); + }, + + isDateInCurrent(date) { + const { currentDate } = this.data; + return currentDate.some(item => { + return compareDay(item, date) === 0; + }); + }, + + getMultipleDayType(date) { + const { currentDate } = this.data; + + if (!Array.isArray(currentDate)) { + return ''; + } + + if (this.isDateInCurrent(date)) { + return 'selected'; + } + + return ''; + }, + + getRangeDayType(day) { + const { currentDate } = this.data; + if (!Array.isArray(currentDate)) { + return; + } + + const [startDay, endDay] = currentDate; + + if (!startDay) { + return; + } + const compareToStart = compareDay(day, startDay); + + if (!endDay) { + return compareToStart === 0 ? 'start' : ''; + } + + const compareToEnd = compareDay(day, endDay); + + if (compareToStart === 0) { + return 'start'; + } + + if (compareToEnd === 0) { + return 'end'; + } + + if (compareToStart > 0 && compareToEnd < 0) { + return 'middle'; + } + }, + + // date 循环的某一天 + getDayType(date) { + const { type, minDate, maxDate, currentDate } = this.data; + + if (compareDay(date, minDate) < 0 || compareDay(date, maxDate) > 0) { + return 'disabled'; + } + + if (type === config.TYPE_SINGLE) { + return compareDay(date, currentDate) === 0 ? 'selected' : ''; + } + + if (type === config.TYPE_MULTIPLE) { + return this.getMultipleDayType(date); + } + + if (type === config.TYPE_RANGE) { + return this.getRangeDayType(date); + } + }, + + getBottomInfo(type) { + if (this.data.type === config.TYPE_RANGE) { + if (type === 'start') { + return '开始'; + } + if (type === 'end') { + return '结束'; + } + return ''; + } + return ''; + } + } +}); \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/calendar/components/mounth/index.json b/app/miniprogram_npm/lin-ui/calendar/components/mounth/index.json new file mode 100644 index 000000000..d03ef78a3 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/components/mounth/index.json @@ -0,0 +1,6 @@ +{ + "component": true, + "usingComponents": { + "day":"../day/index" + } +} diff --git a/app/miniprogram_npm/lin-ui/calendar/components/mounth/index.less b/app/miniprogram_npm/lin-ui/calendar/components/mounth/index.less new file mode 100644 index 000000000..ef20cc02c --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/components/mounth/index.less @@ -0,0 +1,21 @@ +.calendar-mounth-container { + color: #333; + display: flex; + flex-direction: column; + + .title { + text-align: center; + font-weight: 800; + } + + .calendar-day-container { + display: flex; + flex-wrap: wrap; + + .calendar-day-wrap { + width: 14.285%; + // height: 110rpx; + // padding: 10rpx 0; + } + } +} diff --git a/app/miniprogram_npm/lin-ui/calendar/components/mounth/index.wxml b/app/miniprogram_npm/lin-ui/calendar/components/mounth/index.wxml new file mode 100644 index 000000000..50f6332b1 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/components/mounth/index.wxml @@ -0,0 +1,24 @@ + + + + + {{ computed.formatMonthTitle(date) }} + + + + + + + \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/calendar/components/mounth/index.wxs b/app/miniprogram_npm/lin-ui/calendar/components/mounth/index.wxs new file mode 100644 index 000000000..3e860b4e4 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/components/mounth/index.wxs @@ -0,0 +1,12 @@ +/* eslint-disable */ + +function formatMonthTitle(date) { + date = getDate(date); + return date.getFullYear() + '年' + (date.getMonth() + 1) + '月'; +} + + + +module.exports = { + formatMonthTitle: formatMonthTitle +}; diff --git a/app/miniprogram_npm/lin-ui/calendar/config.js b/app/miniprogram_npm/lin-ui/calendar/config.js new file mode 100644 index 000000000..a6dfbfdad --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/config.js @@ -0,0 +1,3 @@ +export const TYPE_SINGLE = 'single'; +export const TYPE_RANGE = 'range'; +export const TYPE_MULTIPLE = 'multiple'; \ No newline at end of file diff --git a/app/miniprogram_npm/lin-ui/calendar/dete.js b/app/miniprogram_npm/lin-ui/calendar/dete.js new file mode 100644 index 000000000..504c16f82 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/dete.js @@ -0,0 +1,42 @@ +const formatFlags = { + format: function (format, date) { + date = new Date(date); + let ret; + const opt = { + 'y+': date.getFullYear().toString(), // 年 + 'M+': (date.getMonth() + 1).toString(), // 月 + 'd+': date.getDate().toString(), // 日 + }; + for (let k in opt) { + ret = new RegExp('(' + k + ')').exec(format); + if (ret) { + format = format.replace(ret[1], (ret[1].length === 1) ? opt[k] : this.padZero(opt[k], ret[1].length)); + } + } + return format; + }, + + /** + * PC 端微信不支持 padStart,这里写一个补 0 函数 + * 如果测试已兼容,则可使用原生 padStart + * issue #1277 + */ + padZero(str, length) { + let res = str; + for (let i = 0; i < length - str; i++) { + res = '0' + res; + } + return res; + } +}; + +formatFlags.format('yyyy/MM/dd', new Date()); +formatFlags.format('yyyy-MM-dd', new Date()); +formatFlags.format('yyyy-M-dd', new Date()); +formatFlags.format('yyyy-M-d', new Date()); +// formatFlags.format('yy-M-dd', new Date()) +formatFlags.format('M-dd', new Date()); +formatFlags.format('MM-dd', new Date()); + + +export default formatFlags; diff --git a/app/miniprogram_npm/lin-ui/calendar/index.js b/app/miniprogram_npm/lin-ui/calendar/index.js new file mode 100644 index 000000000..53912025f --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/index.js @@ -0,0 +1,346 @@ +import eventBus from '../core/utils/event-bus.js'; +import validator from '../behaviors/validator'; +import rules from '../behaviors/rules'; +import * as config from './config'; +import formatFlags from './dete'; + +import { getDayByOffset, getDate, compareDay, calcDateNum, copyDates, getTime, formatMonthTitle, compareMonth, getMonths } from './util'; + +Component({ + externalClasses: [ + 'l-class' + ], + behaviors: ['wx://form-field', validator, rules], + properties: { + show: { + type: Boolean, + value: false, + observer(val) { + if (val) { + this.initRect(); + this.scrollIntoView(); + } + } + }, + type: { + type: String, + value: config.TYPE_SINGLE, + options: [config.TYPE_SINGLE, config.TYPE_MULTIPLE, config.TYPE_RANGE], + observer() { + this.setData({ currentDate: this.initCurrentDate() }); + } + }, + color: { + type: String, + value: '' + }, + defaultDate: { + optionalTypes: [String, Number, Date, Array], + value: '', + observer() { + this.setData({ currentDate: this.initCurrentDate() }); + } + }, + format: { + type: String, + value: 'timestamp' + }, + formatter: { + type: Function, + optionalTypes: [null], + value: null + }, + minDate: { + type: String, + optionalTypes: [null, Number], + value: Date.now() + }, + maxDate: { + type: String, + optionalTypes: [null, Number], + value: new Date( + new Date().getFullYear(), + new Date().getMonth() + 6, + new Date().getDate() + ).getTime() + }, + minSelect: { + type: Number, + optionalTypes: [null], + value: null + }, + maxSelect: { + type: Number, + optionalTypes: [null], + value: null + }, + allowSameDay: Boolean, + showConfirm: { + type: Boolean, + value: true + }, + confirmText: { + type: String, + value: '确认' + }, + maxLimitMessage: { + type: String + }, + minLimitMessage: { + type: String + }, + showTitle: { + type: Boolean, + value: true + }, + showSubtitle: { + type: Boolean, + value: true + }, + title: { + type: String, + value: '日期选择' + } + + }, + lifetimes: { + attached() { + this.setData({ + currentDate: this.initCurrentDate() + }); + }, + ready() { + if (this.data.show) { + this.initRect(); + this.scrollIntoView(); + } + } + }, + data: { + currentDate: null, + types: config, + subTitle: '', + scrollIntoViewIndex: '' + }, + methods: { + clickDay(event) { + const { type, currentDate, maxLimitMessage, maxSelect, allowSameDay } = this.data; + const { date } = event.detail; + if(type === config.TYPE_SINGLE) { + this.setData({ + currentDate: getTime(date) + }); + this.triggerEvent('linclickday', copyDates(date)); + this.triggerEvent('linselect', copyDates(date)); + } + if(type === config.TYPE_MULTIPLE) { + let _index = null; + const isSelected = currentDate.some((item, index) => { + const res = compareDay(item, date) === 0; + if(res) { + _index = index; + } + return res; + }); + + if(isSelected) { + // 取消选择 + currentDate.splice(_index, 1); + this.setData({ + currentDate: getTime(currentDate) + }); + this.triggerEvent('linunselect', copyDates(currentDate)); + } else { + if(maxSelect && currentDate.length >= maxSelect) { + wx.lin.showToast({ + title: maxLimitMessage || `选择天数不能超过 ${ maxSelect } 天` + }); + this.triggerEvent('linclickday', copyDates(date)); + return; + } + // 添加 + this.setData({ + currentDate: getTime([...currentDate, date]) + }); + this.triggerEvent('linselect', copyDates([...currentDate, date])); + } + this.triggerEvent('linclickday', copyDates(date)); + } + + if(type === config.TYPE_RANGE) { + const [startDay, endDay] = currentDate; + if (startDay && !endDay) { + const compareToStart = compareDay(date, startDay); + if (compareToStart === 1) { + if(this.checkSelectRange([startDay, date])) { + this.setData({ + currentDate: getTime([startDay, date]) + }); + this.triggerEvent('linselect', copyDates([startDay, date])); + } + } + else if (compareToStart === -1) { + // 选择结束日期在开始日期之前 重新开始选择 + this.setData({ + currentDate: getTime([date, null]) + }); + } else if(allowSameDay){ + this.setData({ + currentDate: getTime([date, date]) + }); + } + } + else { + // 重新开始选择 + this.setData({ + currentDate: getTime([date, null]) + }); + } + } + }, + + checkSelectRange(date) { + const { maxSelect, maxLimitMessage, minSelect, minLimitMessage } = this.data; + if (maxSelect && calcDateNum(date) > maxSelect) { + + wx.lin.showToast({ + title: maxLimitMessage || `选择天数不能超过 ${ maxSelect } 天` + }); + return false; + } + + if (minSelect && calcDateNum(date) < minSelect) { + wx.lin.showToast({ + title: minLimitMessage || `选择天数不能少于 ${ minSelect } 天` + }); + return false; + } + + return true; + }, + + initCurrentDate() { + + const { type, minDate, defaultDate, maxDate } = this.data; + const defaultDateIsArr = Array.isArray(defaultDate); + + if (type === config.TYPE_SINGLE) { + if(!defaultDate) { + return minDate; + } + if(defaultDateIsArr) { + return minDate; + } + if(compareDay(defaultDate, minDate) === -1) { + return minDate; + } + if(compareDay(defaultDate, maxDate) === 1) { + return maxDate; + } + return defaultDate; + } + + if(type === config.TYPE_MULTIPLE) { + if(!defaultDate) { + return []; + } + if(defaultDateIsArr) { + return defaultDate.filter(item => { + return compareDay(item, minDate) === 1 && compareDay(item, maxDate) === -1; + }); + } + if(compareDay(defaultDate, minDate) === -1) { + return [minDate]; + } + if(compareDay(defaultDate, maxDate) === 1) { + return [maxDate]; + } + return [minDate]; + } + + if(type === config.TYPE_RANGE) { + if(defaultDateIsArr) { + let [startDay = minDate, endDay] = defaultDate; + if(compareDay(startDay, minDate) === -1 || compareDay(startDay, maxDate) !== -1) { + startDay = minDate; + } + if(!endDay) { + endDay = getDayByOffset(getDate(startDay), 1).getTime(); + } + if(compareDay(endDay, maxDate) === 1 || compareDay(endDay, minDate) === -1) { + endDay = getDayByOffset(getDate(startDay), 1).getTime(); + } + return [ + startDay, + endDay + ]; + } + return [ + minDate, + getDayByOffset(getDate(minDate), 1).getTime() + ]; + } + }, + initRect() { + if (!this.contentObserver !== null && this.contentObserver !== undefined) { + this.contentObserver.disconnect(); + } + const contentObserver = this.createIntersectionObserver({ + thresholds: [0, 0.1, 0.9, 1], + observeAll: true + }); + this.contentObserver = contentObserver; + contentObserver.relativeTo('.calendar-body-wrap'); + contentObserver.observe('.month', res => { + if (res.boundingClientRect.top <= res.relativeRect.top) { + // @ts-ignore + this.setData({ subTitle: formatMonthTitle(res.dataset.date) }); + } + }); + }, + scrollIntoView() { + setTimeout(() => { + const { currentDate, type, show, minDate, maxDate } = this.data; + const targetDate = type === 'single' ? currentDate : currentDate[0]; + const displayed = show; + if (!targetDate || !displayed) { + return; + } + const months = getMonths(minDate, maxDate); + months.some((month, index) => { + if (compareMonth(month, targetDate) === 0) { + this.setData({ scrollIntoViewIndex: `month${index}` }); + return true; + } + return false; + }); + }, 100); + }, + closePicker() { + this.setData({ + show: false + }); + }, + onClickConfirm() { + const {format, type, currentDate} = this.data; + eventBus.emit(`lin-form-blur-${this.id}`, this.id); + let value = null; + if(type === 'single') { + value = format !== 'timestamp' ? formatFlags.format('yyyy-MM-dd', currentDate) : currentDate; + } else { + value = currentDate.map(item => { + return format !== 'timestamp' ? formatFlags.format('yyyy-MM-dd', item) : item; + }); + } + this.triggerEvent('linconfirm', value); + }, + getValues() { + return this.data.currentDate; + }, + reset() { + this.setData({ + currentDate: null + }); + } + } +}); diff --git a/app/miniprogram_npm/lin-ui/calendar/index.json b/app/miniprogram_npm/lin-ui/calendar/index.json new file mode 100644 index 000000000..e97f93a53 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/index.json @@ -0,0 +1,10 @@ +{ + "component": true, + "usingComponents": { + "header":"./components/header/index", + "mounth":"./components/mounth/index", + "l-toast": "../toast/index", + "l-popup": "../popup/index", + "l-button": "../button/index" + } +} diff --git a/app/miniprogram_npm/lin-ui/calendar/index.less b/app/miniprogram_npm/lin-ui/calendar/index.less new file mode 100644 index 000000000..ee7b2250e --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/index.less @@ -0,0 +1,36 @@ +@import "../../config/styles/_theme.less"; +@import "../../config/styles/_mixins.less"; + +.calendar-container { + display: flex; + height: 1000rpx; + flex-direction: column; + background-color: #fff; + + .calendar-body-wrap { + flex: 1; + overflow: auto; + padding: 0 20rpx; + width: auto; + } +} + +// .bottom { +// width: 100%; +// background: #fff; +// height: 300rpx; +// overflow: hidden; +// text-align: center; +// line-height: 300rpx; +// font-size: 28rpx; +// color: #555; +// border-top-left-radius: 12rpx; +// border-top-right-radius: 12rpx; +// } + +.bottom-button { + padding: 0 !important; + .safe-area-inset-bottom(); + + box-sizing: content-box !important; +} diff --git a/app/miniprogram_npm/lin-ui/calendar/index.wxml b/app/miniprogram_npm/lin-ui/calendar/index.wxml new file mode 100644 index 000000000..9fc43c450 --- /dev/null +++ b/app/miniprogram_npm/lin-ui/calendar/index.wxml @@ -0,0 +1,10 @@ + + + +