distinctui-uni 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,419 +1,475 @@
1
- <template>
2
- <view v-if="wrapperShow">
3
- <view
4
- class="d-popup__mask"
5
- :class="{ 'animate-fade-in': innerShow, 'animate-fade-out': !innerShow }"
6
- v-if="mask"
7
- :style="{ background: maskBackground }"
8
- @tap.stop="onClickMask"
9
- @touchmove.stop.prevent="stop"
10
- />
11
- <view
12
- class="d-popup__popup"
13
- :class="{ 'animate-slide-up': innerShow, 'animate-slide-down': !innerShow }"
14
- :style="[popupStyle]"
15
- @tap.stop="stop"
16
- >
17
- <view class="d-popup__popup__top" v-if="showSlideIcon" @touchmove.stop="handleClose" @tap.stop="handleClose">
18
- <view class="d-popup__slide-icon" />
19
- </view>
20
- <view class="d-popup__popup__hd">
21
- <view class="d-popup__popup__hd__left">
22
- <view v-if="showMoreBtn" class="d-popup__popup__more" hover-class="d-active" @tap.stop="clickMore">
23
- <image
24
- mode="widthFix"
25
- class="d-popup__popup__more-icon"
26
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAFDUlEQVR4nO3b0W1URxiG4bM0gFMBpAKMgOtsCaYCSAV2KsBUgKkgUAHuIMk1IEwHUEGM4BrnXwVLZLV8MvbZmQl6Hmk0g2+s/0jv7C4Liwn4JoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAYPpB79+7tnp2dPajjbq2dOq/2abFYnNR2Wuukzs9fvnx5Uuf/FbONP9uQgSyXy51Pnz7t10M9qD/u1LqI03rgR69evXpc52EtzbZu6NkWtYZy586dvdqe1Lo5Xc67aZp+e/369XHtQzFb9G4acLZFrWHcvXv3yZfb58rqVjoc6VYy28WMNtui1hDqBvq9tofTvJ7VjfRr7V2Z7bsNMdvKolZ39ZCPatuvNbu6kR7XjXQ4dWK2y+k927nugdRD3qvtRa1tul830nHtTZntyrrM9rWugSzrbz0+fvz4po43p+16Vw/659qbWZptDs1nW7eo1U19uDusD3eP6rh1rV+yzTaP1rOt6xpIvUz/XdtOrRZO6zb6qfYmzDabprOt6xZI3ULLuoX+qGMz165du93im1uzzavVbJt0C6RuoaPa9mu19LRuo4Pat8pss2sy2ybdAqmb6M+6iX6pYzP1fvavej+7nLbMbPNqNdsmPQN5Uw96t47N1IM+qQd9u45bZbZ5tZptk26B1Ev1WW3N1Uv11mc22/xazLZJl1+68iM/aLPNr8Vsm3T5pSv1oE9qu1Wrpbf1oHdr3yqzza7JbJt0C6Tey/6wH/bMNq9Ws23SLZC6iY5q26/V0tO6iQ5q3yqzza7JbJt0C2T1XzI/f/78po7NtPrCyWzzajXbJt0CWanb6LS267Va+FC30E7tTZhtNk1nW9c1kHo/e1jvZx/Vcevqfezjeh97ODVitnm0nm1d10CW//6z6ZM63qi1Te/rFro5NbQ02xyaz7auayAr9XK9V9uLWtt0vx70ce1Nme3Kusz2te6BrGzzJbv3S7TZLqf3bOeGCGSlbqRn0zQ9qDWn53UDPZw6M9t3G2K2lWECWZnzRhrlBjpntosZbbahAlmpG2mvtqNaN2pdxvtaB3UDHdc+FLNFQ862qDWkL7fSQR2v17qID3X7HI10+3yL2f5j6NmGDeTcl29uH9ZD3K0Hv1M/ulVr5W397LR+dlLftD7r9U3rVZht/NmGDwR6EggEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBIJ/AEZQjudcAs0hAAAAAElFTkSuQmCC"
27
- />
28
- </view>
29
- <slot v-else name="header-left"></slot>
30
- </view>
31
- <view class="d-popup__popup__hd__middle">
32
- <span v-if="title" class="d-popup__popup__hd__title ellipse-one-line">{{ title }}</span>
33
- <slot v-else name="header-middle"></slot>
34
- </view>
35
- <view class="d-popup__popup__hd__right">
36
- <view v-if="closabled" class="d-popup__popup__close" @tap.stop="handleClose" hover-class="d-active">
37
- <image
38
- mode="widthFix"
39
- class="d-popup__popup__close-icon"
40
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAAXNSR0IArs4c6QAAADZQTFRFAAAAAAAAQEBAMzMzMzMzMzMzNDQ0MjIyNDQ0MzMzNDQ0NDQ0MzMzMzMzMzMzMzMzNDQ0NTU1nbBS4wAAAA90Uk5TAAIEBQ8UWXBxpKyys/b+RAoM/gAAAMRJREFUSMftlUsOwyAMRMMfAqnh/petqqpqBBgYKdnFSw/Yj2Am2/bEjSGsN7yqnRVVyh6UJLdeRjpslXNEZWd2yL0Q+bppLK+SdJcnfSTTLdOjkolpzghsoV9rvZAcFGN5GHnA0wUY8nRKTniaRVOeCmOB50yl1ArPiSqEJZ4/Vc5rPN9QIRPloLa7NqBI6KHRz4peHDoa6PCh440+IPSJoiaA2gxqZCaNrTLWkp+ZsWvtPo78qrF7Yd3ggoxvfihPXBpv888R1ZroG5MAAAAASUVORK5CYII="
41
- />
42
- </view>
43
- <slot v-else name="header-right"></slot>
44
- </view>
45
- </view>
46
- <view class="d-popup__popup__bd" scroll-y scroll-with-animation>
47
- <slot name="body">
48
- <view class="d-popup__popup__bd__desc">{{ desc }}</view>
49
- <view class="d-popup__popup__bd__tips">{{ tips }}</view>
50
- </slot>
51
- <view style="width: 100%; height: 100rpx" v-if="!hiddenFooter" />
52
- </view>
53
- <view class="d-popup__popup__ft d-popup__popup__ft__tool" v-if="!hiddenFooter">
54
- <slot name="footer">
55
- <view class="d-popup__popup__ft__buttons">
56
- <d-button width="272rpx" type="secondary" margin="0 15rpx">次要按钮</d-button>
57
- <d-button width="272rpx" type="primary" margin="0 15rpx">主按钮</d-button>
58
- </view>
59
- </slot>
60
- </view>
61
- <view class="d-popup__safe-bottom"></view>
62
- </view>
63
- </view>
64
- </template>
65
-
66
- <script>
67
- /*如果底部有自定义导航栏,可适当设置内容padding-bottom值*/
68
- export default {
69
- name: "d-popup",
70
- emits: ['update:show', 'clickMore', 'close', 'open', 'clickMask'],
71
- props: {
72
- // 是否显示
73
- show: {
74
- type: Boolean,
75
- default: false
76
- },
77
- // 是否展示更多按钮
78
- showMoreBtn: {
79
- type: Boolean,
80
- default: false
81
- },
82
- // 是否展示关闭按钮
83
- closabled: {
84
- type: Boolean,
85
- default: true
86
- },
87
- // 标题
88
- title: {
89
- type: String,
90
- default: ""
91
- },
92
- // 辅助操作描述内容
93
- desc: {
94
- type: String,
95
- default: ""
96
- },
97
- // 辅助操作提示内容
98
- tips: {
99
- type: String,
100
- default: ""
101
- },
102
- //背景颜色
103
- background: {
104
- type: String,
105
- default: "#fff"
106
- },
107
- // Popup圆角
108
- radius: {
109
- type: String,
110
- default: "24rpx"
111
- },
112
- // 是否显示遮罩
113
- mask: {
114
- type: Boolean,
115
- default: true
116
- },
117
- // 点击遮罩 是否可关闭
118
- maskClosable: {
119
- type: Boolean,
120
- default: true
121
- },
122
- // 遮罩背景色
123
- maskBackground: {
124
- type: String,
125
- default: "rgba(0,0,0,.6)"
126
- },
127
- // 弹窗固定高度
128
- height: {
129
- type: String,
130
- default: ""
131
- },
132
- // 弹窗最大高度
133
- maxHeight: {
134
- type: String,
135
- default: "75%"
136
- },
137
- // 顶部是否显示下滑Icon
138
- showSlideIcon: {
139
- type: Boolean,
140
- default: false
141
- },
142
- // 隐藏底部(同时最大高度底部遮罩也会消失)
143
- hiddenFooter: {
144
- type: Boolean,
145
- default: false
146
- }
147
- },
148
- data() {
149
- return {
150
- wrapperShow: false,
151
- innerShow: false
152
- };
153
- },
154
- computed: {
155
- popupStyle() {
156
- const style = {
157
- borderTopLeftRadius: this.radius,
158
- borderTopRightRadius: this.radius,
159
- background: this.background,
160
- maxHeight: this.maxHeight
161
- };
162
- // 只有当 height 有值时才设置 height 属性,避免影响现有组件
163
- if (this.height) {
164
- style.height = this.height;
165
- }
166
- return style;
167
- }
168
- },
169
- watch: {
170
- show(nv) {
171
- if (nv) {
172
- this.wrapperShow = true;
173
- this.innerShow = true;
174
- this.$emit('open');
175
- } else {
176
- this.innerShow = false;
177
- setTimeout(() => {
178
- this.wrapperShow = false;
179
- }, 300);
180
- }
181
- }
182
- },
183
- methods: {
184
- onClickMask() {
185
- this.$emit('clickMask');
186
- if (!this.maskClosable) return;
187
- this.handleClose();
188
- },
189
-
190
- handleClose() {
191
- this.$emit("update:show", false);
192
- this.$emit("close");
193
- },
194
-
195
- clickMore() {
196
- this.$emit("clickMore");
197
- },
198
-
199
- stop() {
200
- // do nothing
201
- }
202
- }
203
- };
204
- </script>
205
-
206
- <style scoped>
207
- @keyframes fadeIn {
208
- from {
209
- opacity: 0;
210
- }
211
- to {
212
- opacity: 1;
213
- }
214
- }
215
-
216
- @keyframes fadeOut {
217
- from {
218
- opacity: 1;
219
- }
220
- to {
221
- opacity: 0;
222
- }
223
- }
224
-
225
- @keyframes slideUp {
226
- from {
227
- transform: translate3d(0, 100%, 0);
228
- }
229
-
230
- to {
231
- transform: translate3d(0, 0, 0);
232
- }
233
- }
234
-
235
- @keyframes slideDown {
236
- from {
237
- transform: translate3d(0, 0, 0);
238
- }
239
-
240
- to {
241
- transform: translate3d(0, 100%, 0);
242
- }
243
- }
244
-
245
- .animate_fade-in {
246
- animation: fadeIn ease 0.3s forwards;
247
- }
248
-
249
- .animate_fade-out {
250
- animation: fadeOut ease 0.3s forwards;
251
- }
252
-
253
- .animate-slide-up {
254
- animation: slideUp ease 0.3s forwards;
255
- }
256
-
257
- .animate-slide-down {
258
- animation: slideDown ease 0.3s forwards;
259
- }
260
-
261
- .d-active {
262
- opacity: 0.6;
263
- }
264
-
265
- .d-popup__mask {
266
- position: fixed;
267
- left: 0;
268
- right: 0;
269
- top: 0;
270
- bottom: 0;
271
- z-index: 1000;
272
- }
273
-
274
- .d-popup__popup {
275
- position: fixed;
276
- left: 0;
277
- right: 0;
278
- bottom: 0;
279
- min-height: 255rpx;
280
- max-height: 75%;
281
- z-index: 5000;
282
- overflow: hidden;
283
- box-sizing: border-box;
284
- display: flex;
285
- flex-direction: column;
286
- outline: 0;
287
- }
288
- .d-popup__popup__more-icon {
289
- width: 42rpx;
290
- height: 42rpx;
291
- }
292
-
293
- .d-popup__slide-icon {
294
- width: 100rpx;
295
- height: 8rpx;
296
- border-radius: 30rpx;
297
- background: #d8d8d8;
298
- }
299
-
300
- .d-popup__popup__close-icon {
301
- width: 32rpx;
302
- height: 32rpx;
303
- }
304
-
305
- .d-popup__popup-show {
306
- transform: translate3d(0, 0, 0);
307
- }
308
-
309
- .d-popup__popup__top {
310
- width: 100%;
311
- display: flex;
312
- flex-direction: column;
313
- align-items: center;
314
- padding: 20rpx 0 10rpx;
315
- }
316
-
317
- .d-popup__popup__hd {
318
- display: grid;
319
- grid-template-columns: auto 1fr auto;
320
- padding: 30rpx 30rpx 40rpx 30rpx;
321
- }
322
-
323
- .d-popup__popup__hd__left {
324
- min-width: 30rpx;
325
- padding-right: 10rpx;
326
- }
327
-
328
- .d-popup__popup__hd__middle {
329
- text-align: center;
330
- flex: 1;
331
- margin: 0 10rpx;
332
- }
333
-
334
- .d-popup__popup__hd__right {
335
- min-width: 30rpx;
336
- padding-left: 10rpx;
337
- }
338
-
339
- .d-popup__popup__hd__title {
340
- line-height: 48rpx;
341
- font-size: 34rpx;
342
- color: #3d3d3d;
343
- font-weight: bold;
344
- }
345
-
346
- .d-popup__popup__bd {
347
- padding: 0 30rpx;
348
- box-sizing: border-box;
349
- width: 100%;
350
- overflow-y: auto;
351
- }
352
-
353
- .d-popup__popup__bd__desc {
354
- font-size: 32rpx;
355
- font-weight: bold;
356
- color: #333;
357
- line-height: 42rpx;
358
- }
359
-
360
- .d-popup__popup__bd__tips {
361
- font-size: 30rpx;
362
- color: #666;
363
- line-height: 40rpx;
364
- margin-top: 20rpx;
365
- }
366
-
367
- .d-popup__popup__ft {
368
- position: relative;
369
- z-index: 9;
370
- }
371
-
372
- .d-popup__safe-bottom {
373
- height: env(safe-area-inset-bottom);
374
- }
375
-
376
- .d-popup__popup__ft__tool {
377
- position: relative;
378
- z-index: 50;
379
- }
380
-
381
- .d-popup__popup__ft__tool::before {
382
- content: "";
383
- height: 100rpx;
384
- background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, #ffffff 100%);
385
- position: absolute;
386
- bottom: calc(100% - 1px);
387
- left: 0;
388
- right: 0;
389
- transform: translateZ(0);
390
- pointer-events: none;
391
- background-image: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, #ffffff 100%);
392
- }
393
-
394
- .d-popup__popup__ft__mask {
395
- position: absolute;
396
- bottom: 0;
397
- left: 0;
398
- width: 100%;
399
- height: 100rpx;
400
- opacity: 1;
401
- }
402
-
403
- .d-popup__popup__ft__buttons {
404
- display: flex;
405
- align-items: center;
406
- justify-content: center;
407
- padding-bottom: 60rpx;
408
- }
409
-
410
- .ellipse-one-line {
411
- word-break: break-all;
412
- text-overflow: ellipsis;
413
- display: -webkit-box;
414
- /*! autoprefixer: off */
415
- -webkit-box-orient: vertical;
416
- -webkit-line-clamp: 1;
417
- overflow: hidden;
418
- }
419
- </style>
1
+ <template>
2
+ <view v-if="wrapperShow">
3
+ <view
4
+ class="d-popup__mask"
5
+ :class="{ 'animate-fade-in': innerShow, 'animate-fade-out': !innerShow }"
6
+ v-if="mask"
7
+ :style="{ background: maskBackground }"
8
+ @tap.stop="onClickMask"
9
+ @touchmove.stop.prevent="stop"
10
+ />
11
+ <view
12
+ class="d-popup__popup"
13
+ :class="{ 'animate-slide-up': innerShow, 'animate-slide-down': !innerShow }"
14
+ :style="[popupStyle]"
15
+ @tap.stop="stop"
16
+ @touchmove="onPopupTouchMove"
17
+ >
18
+ <view class="d-popup__popup__top" v-if="showSlideIcon" @touchmove.stop="handleClose" @tap.stop="handleClose">
19
+ <view class="d-popup__slide-icon" />
20
+ </view>
21
+ <view class="d-popup__popup__hd" @touchmove.stop="stop">
22
+ <view class="d-popup__popup__hd__left">
23
+ <view v-if="showMoreBtn" class="d-popup__popup__more" hover-class="d-active" @tap.stop="clickMore">
24
+ <image
25
+ mode="widthFix"
26
+ class="d-popup__popup__more-icon"
27
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAFDUlEQVR4nO3b0W1URxiG4bM0gFMBpAKMgOtsCaYCSAV2KsBUgKkgUAHuIMk1IEwHUEGM4BrnXwVLZLV8MvbZmQl6Hmk0g2+s/0jv7C4Liwn4JoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAYPpB79+7tnp2dPajjbq2dOq/2abFYnNR2Wuukzs9fvnx5Uuf/FbONP9uQgSyXy51Pnz7t10M9qD/u1LqI03rgR69evXpc52EtzbZu6NkWtYZy586dvdqe1Lo5Xc67aZp+e/369XHtQzFb9G4acLZFrWHcvXv3yZfb58rqVjoc6VYy28WMNtui1hDqBvq9tofTvJ7VjfRr7V2Z7bsNMdvKolZ39ZCPatuvNbu6kR7XjXQ4dWK2y+k927nugdRD3qvtRa1tul830nHtTZntyrrM9rWugSzrbz0+fvz4po43p+16Vw/659qbWZptDs1nW7eo1U19uDusD3eP6rh1rV+yzTaP1rOt6xpIvUz/XdtOrRZO6zb6qfYmzDabprOt6xZI3ULLuoX+qGMz165du93im1uzzavVbJt0C6RuoaPa9mu19LRuo4Pat8pss2sy2ybdAqmb6M+6iX6pYzP1fvavej+7nLbMbPNqNdsmPQN5Uw96t47N1IM+qQd9u45bZbZ5tZptk26B1Ev1WW3N1Uv11mc22/xazLZJl1+68iM/aLPNr8Vsm3T5pSv1oE9qu1Wrpbf1oHdr3yqzza7JbJt0C6Tey/6wH/bMNq9Ws23SLZC6iY5q26/V0tO6iQ5q3yqzza7JbJt0C2T1XzI/f/78po7NtPrCyWzzajXbJt0CWanb6LS267Va+FC30E7tTZhtNk1nW9c1kHo/e1jvZx/Vcevqfezjeh97ODVitnm0nm1d10CW//6z6ZM63qi1Te/rFro5NbQ02xyaz7auayAr9XK9V9uLWtt0vx70ce1Nme3Kusz2te6BrGzzJbv3S7TZLqf3bOeGCGSlbqRn0zQ9qDWn53UDPZw6M9t3G2K2lWECWZnzRhrlBjpntosZbbahAlmpG2mvtqNaN2pdxvtaB3UDHdc+FLNFQ862qDWkL7fSQR2v17qID3X7HI10+3yL2f5j6NmGDeTcl29uH9ZD3K0Hv1M/ulVr5W397LR+dlLftD7r9U3rVZht/NmGDwR6EggEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBIJ/AEZQjudcAs0hAAAAAElFTkSuQmCC"
28
+ />
29
+ </view>
30
+ <slot v-else name="header-left"></slot>
31
+ </view>
32
+ <view class="d-popup__popup__hd__middle">
33
+ <span v-if="title" class="d-popup__popup__hd__title ellipse-one-line">{{ title }}</span>
34
+ <slot v-else name="header-middle"></slot>
35
+ </view>
36
+ <view class="d-popup__popup__hd__right">
37
+ <view v-if="closabled" class="d-popup__popup__close" @tap.stop="handleClose" hover-class="d-active">
38
+ <image
39
+ mode="widthFix"
40
+ class="d-popup__popup__close-icon"
41
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAAXNSR0IArs4c6QAAADZQTFRFAAAAAAAAQEBAMzMzMzMzMzMzNDQ0MjIyNDQ0MzMzNDQ0NDQ0MzMzMzMzMzMzMzMzNDQ0NTU1nbBS4wAAAA90Uk5TAAIEBQ8UWXBxpKyys/b+RAoM/gAAAMRJREFUSMftlUsOwyAMRMMfAqnh/petqqpqBBgYKdnFSw/Yj2Am2/bEjSGsN7yqnRVVyh6UJLdeRjpslXNEZWd2yL0Q+bppLK+SdJcnfSTTLdOjkolpzghsoV9rvZAcFGN5GHnA0wUY8nRKTniaRVOeCmOB50yl1ArPiSqEJZ4/Vc5rPN9QIRPloLa7NqBI6KHRz4peHDoa6PCh440+IPSJoiaA2gxqZCaNrTLWkp+ZsWvtPo78qrF7Yd3ggoxvfihPXBpv888R1ZroG5MAAAAASUVORK5CYII="
42
+ />
43
+ </view>
44
+ <slot v-else name="header-right"></slot>
45
+ </view>
46
+ </view>
47
+ <!-- scrollableBody 时:scroll-view + 固定高度,真机可手势滚动 -->
48
+ <template v-if="scrollableBody">
49
+ <view class="d-popup__popup__bd-wrap" @touchmove.stop="stop">
50
+ <scroll-view
51
+ class="d-popup__popup__bd d-popup__popup__bd--scroll"
52
+ scroll-y
53
+ :scroll-with-animation="true"
54
+ :show-scrollbar="false"
55
+ >
56
+ <slot name="body">
57
+ <view class="d-popup__popup__bd__desc">{{ desc }}</view>
58
+ <view class="d-popup__popup__bd__tips">{{ tips }}</view>
59
+ </slot>
60
+ <view style="width: 100%; height: 100rpx" v-if="!hiddenFooter" />
61
+ </scroll-view>
62
+ </view>
63
+ </template>
64
+ <!-- 默认:原有 view+scroll-y,弹窗按内容高度,不影响现有用法 -->
65
+ <view v-else class="d-popup__popup__bd d-popup__popup__bd--plain" scroll-y scroll-with-animation>
66
+ <slot name="body">
67
+ <view class="d-popup__popup__bd__desc">{{ desc }}</view>
68
+ <view class="d-popup__popup__bd__tips">{{ tips }}</view>
69
+ </slot>
70
+ <view style="width: 100%; height: 100rpx" v-if="!hiddenFooter" />
71
+ </view>
72
+ <view class="d-popup__popup__ft d-popup__popup__ft__tool" v-if="!hiddenFooter" @touchmove.stop="stop">
73
+ <slot name="footer">
74
+ <view class="d-popup__popup__ft__buttons">
75
+ <d-button width="272rpx" type="secondary" margin="0 15rpx">次要按钮</d-button>
76
+ <d-button width="272rpx" type="primary" margin="0 15rpx">主按钮</d-button>
77
+ </view>
78
+ </slot>
79
+ </view>
80
+ <view class="d-popup__safe-bottom" @touchmove.stop="stop"></view>
81
+ </view>
82
+ </view>
83
+ </template>
84
+
85
+ <script>
86
+ /*如果底部有自定义导航栏,可适当设置内容padding-bottom值*/
87
+ export default {
88
+ name: "d-popup",
89
+ emits: ['update:show', 'clickMore', 'close', 'open', 'clickMask'],
90
+ props: {
91
+ // 是否显示
92
+ show: {
93
+ type: Boolean,
94
+ default: false
95
+ },
96
+ // 是否展示更多按钮
97
+ showMoreBtn: {
98
+ type: Boolean,
99
+ default: false
100
+ },
101
+ // 是否展示关闭按钮
102
+ closabled: {
103
+ type: Boolean,
104
+ default: true
105
+ },
106
+ // 标题
107
+ title: {
108
+ type: String,
109
+ default: ""
110
+ },
111
+ // 辅助操作描述内容
112
+ desc: {
113
+ type: String,
114
+ default: ""
115
+ },
116
+ // 辅助操作提示内容
117
+ tips: {
118
+ type: String,
119
+ default: ""
120
+ },
121
+ //背景颜色
122
+ background: {
123
+ type: String,
124
+ default: "#fff"
125
+ },
126
+ // Popup圆角
127
+ radius: {
128
+ type: String,
129
+ default: "24rpx"
130
+ },
131
+ // 是否显示遮罩
132
+ mask: {
133
+ type: Boolean,
134
+ default: true
135
+ },
136
+ // 点击遮罩 是否可关闭
137
+ maskClosable: {
138
+ type: Boolean,
139
+ default: true
140
+ },
141
+ // 遮罩背景色
142
+ maskBackground: {
143
+ type: String,
144
+ default: "rgba(0,0,0,.6)"
145
+ },
146
+ // 弹窗固定高度
147
+ height: {
148
+ type: String,
149
+ default: ""
150
+ },
151
+ // 弹窗最大高度
152
+ maxHeight: {
153
+ type: String,
154
+ default: "75%"
155
+ },
156
+ // 顶部是否显示下滑Icon
157
+ showSlideIcon: {
158
+ type: Boolean,
159
+ default: false
160
+ },
161
+ // 隐藏底部(同时最大高度底部遮罩也会消失)
162
+ hiddenFooter: {
163
+ type: Boolean,
164
+ default: false
165
+ },
166
+ // 内容区是否可滚动(长内容时设为 true,弹窗会占满 maxHeight 并使用 scroll-view 保证真机可滑;默认 false 保持原有按内容高度,不影响现有用法)
167
+ scrollableBody: {
168
+ type: Boolean,
169
+ default: false
170
+ }
171
+ },
172
+ data() {
173
+ return {
174
+ wrapperShow: false,
175
+ innerShow: false
176
+ };
177
+ },
178
+ computed: {
179
+ popupStyle() {
180
+ const style = {
181
+ borderTopLeftRadius: this.radius,
182
+ borderTopRightRadius: this.radius,
183
+ background: this.background,
184
+ maxHeight: this.maxHeight
185
+ };
186
+ // 有固定 height 时用 height;仅当 scrollableBody 时用 maxHeight 作为 height(真机 scroll-view 需明确高度),否则不设 height 保持按内容高度
187
+ if (this.height) {
188
+ style.height = this.height;
189
+ } else if (this.scrollableBody) {
190
+ style.height = this.maxHeight;
191
+ }
192
+ return style;
193
+ }
194
+ },
195
+ watch: {
196
+ show(nv) {
197
+ if (nv) {
198
+ this.wrapperShow = true;
199
+ this.innerShow = true;
200
+ this.$emit('open');
201
+ } else {
202
+ this.innerShow = false;
203
+ setTimeout(() => {
204
+ this.wrapperShow = false;
205
+ }, 300);
206
+ }
207
+ }
208
+ },
209
+ methods: {
210
+ onClickMask() {
211
+ this.$emit('clickMask');
212
+ if (!this.maskClosable) return;
213
+ this.handleClose();
214
+ },
215
+
216
+ handleClose() {
217
+ this.$emit("update:show", false);
218
+ this.$emit("close");
219
+ },
220
+
221
+ clickMore() {
222
+ this.$emit("clickMore");
223
+ },
224
+
225
+ stop() {
226
+ // 仅用于 @touchmove.stop 占位,阻止冒泡由修饰符完成
227
+ },
228
+
229
+ onPopupTouchMove(e) {
230
+ // 仅在不使用 scrollableBody 时在弹层统一拦截,防穿透且不绑在内容区上避免影响原有滚动
231
+ if (!this.scrollableBody) {
232
+ e.stopPropagation();
233
+ }
234
+ }
235
+ }
236
+ };
237
+ </script>
238
+
239
+ <style scoped>
240
+ @keyframes fadeIn {
241
+ from {
242
+ opacity: 0;
243
+ }
244
+ to {
245
+ opacity: 1;
246
+ }
247
+ }
248
+
249
+ @keyframes fadeOut {
250
+ from {
251
+ opacity: 1;
252
+ }
253
+ to {
254
+ opacity: 0;
255
+ }
256
+ }
257
+
258
+ @keyframes slideUp {
259
+ from {
260
+ transform: translate3d(0, 100%, 0);
261
+ }
262
+
263
+ to {
264
+ transform: translate3d(0, 0, 0);
265
+ }
266
+ }
267
+
268
+ @keyframes slideDown {
269
+ from {
270
+ transform: translate3d(0, 0, 0);
271
+ }
272
+
273
+ to {
274
+ transform: translate3d(0, 100%, 0);
275
+ }
276
+ }
277
+
278
+ .animate_fade-in {
279
+ animation: fadeIn ease 0.3s forwards;
280
+ }
281
+
282
+ .animate_fade-out {
283
+ animation: fadeOut ease 0.3s forwards;
284
+ }
285
+
286
+ .animate-slide-up {
287
+ animation: slideUp ease 0.3s forwards;
288
+ }
289
+
290
+ .animate-slide-down {
291
+ animation: slideDown ease 0.3s forwards;
292
+ }
293
+
294
+ .d-active {
295
+ opacity: 0.6;
296
+ }
297
+
298
+ .d-popup__mask {
299
+ position: fixed;
300
+ left: 0;
301
+ right: 0;
302
+ top: 0;
303
+ bottom: 0;
304
+ z-index: 1000;
305
+ }
306
+
307
+ .d-popup__popup {
308
+ position: fixed;
309
+ left: 0;
310
+ right: 0;
311
+ bottom: 0;
312
+ min-height: 255rpx;
313
+ max-height: 75%;
314
+ z-index: 5000;
315
+ overflow: hidden;
316
+ box-sizing: border-box;
317
+ display: flex;
318
+ flex-direction: column;
319
+ outline: 0;
320
+ }
321
+ .d-popup__popup__more-icon {
322
+ width: 42rpx;
323
+ height: 42rpx;
324
+ }
325
+
326
+ .d-popup__slide-icon {
327
+ width: 100rpx;
328
+ height: 8rpx;
329
+ border-radius: 30rpx;
330
+ background: #d8d8d8;
331
+ }
332
+
333
+ .d-popup__popup__close-icon {
334
+ width: 32rpx;
335
+ height: 32rpx;
336
+ }
337
+
338
+ .d-popup__popup-show {
339
+ transform: translate3d(0, 0, 0);
340
+ }
341
+
342
+ .d-popup__popup__top {
343
+ width: 100%;
344
+ display: flex;
345
+ flex-direction: column;
346
+ align-items: center;
347
+ padding: 20rpx 0 10rpx;
348
+ }
349
+
350
+ .d-popup__popup__hd {
351
+ display: grid;
352
+ grid-template-columns: auto 1fr auto;
353
+ padding: 30rpx 30rpx 40rpx 30rpx;
354
+ }
355
+
356
+ .d-popup__popup__hd__left {
357
+ min-width: 30rpx;
358
+ padding-right: 10rpx;
359
+ }
360
+
361
+ .d-popup__popup__hd__middle {
362
+ text-align: center;
363
+ flex: 1;
364
+ margin: 0 10rpx;
365
+ }
366
+
367
+ .d-popup__popup__hd__right {
368
+ min-width: 30rpx;
369
+ padding-left: 10rpx;
370
+ }
371
+
372
+ .d-popup__popup__hd__title {
373
+ line-height: 48rpx;
374
+ font-size: 34rpx;
375
+ color: #3d3d3d;
376
+ font-weight: bold;
377
+ }
378
+
379
+ .d-popup__popup__bd-wrap {
380
+ flex: 1;
381
+ min-height: 0;
382
+ overflow: hidden;
383
+ display: flex;
384
+ flex-direction: column;
385
+ }
386
+
387
+ .d-popup__popup__bd {
388
+ padding: 0 30rpx;
389
+ box-sizing: border-box;
390
+ width: 100%;
391
+ }
392
+
393
+ .d-popup__popup__bd--plain {
394
+ overflow-y: auto;
395
+ }
396
+
397
+ .d-popup__popup__bd--scroll {
398
+ height: 100%;
399
+ /* 隐藏滚动条:小程序由 show-scrollbar="false" 控制,H5 等由 CSS 兜底 */
400
+ scrollbar-width: none;
401
+ -ms-overflow-style: none;
402
+ }
403
+ .d-popup__popup__bd--scroll::-webkit-scrollbar {
404
+ display: none;
405
+ width: 0;
406
+ height: 0;
407
+ }
408
+
409
+ .d-popup__popup__bd__desc {
410
+ font-size: 32rpx;
411
+ font-weight: bold;
412
+ color: #333;
413
+ line-height: 42rpx;
414
+ }
415
+
416
+ .d-popup__popup__bd__tips {
417
+ font-size: 30rpx;
418
+ color: #666;
419
+ line-height: 40rpx;
420
+ margin-top: 20rpx;
421
+ }
422
+
423
+ .d-popup__popup__ft {
424
+ position: relative;
425
+ z-index: 9;
426
+ }
427
+
428
+ .d-popup__safe-bottom {
429
+ height: env(safe-area-inset-bottom);
430
+ }
431
+
432
+ .d-popup__popup__ft__tool {
433
+ position: relative;
434
+ z-index: 50;
435
+ }
436
+
437
+ .d-popup__popup__ft__tool::before {
438
+ content: "";
439
+ height: 100rpx;
440
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, #ffffff 100%);
441
+ position: absolute;
442
+ bottom: calc(100% - 1px);
443
+ left: 0;
444
+ right: 0;
445
+ transform: translateZ(0);
446
+ pointer-events: none;
447
+ background-image: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, #ffffff 100%);
448
+ }
449
+
450
+ .d-popup__popup__ft__mask {
451
+ position: absolute;
452
+ bottom: 0;
453
+ left: 0;
454
+ width: 100%;
455
+ height: 100rpx;
456
+ opacity: 1;
457
+ }
458
+
459
+ .d-popup__popup__ft__buttons {
460
+ display: flex;
461
+ align-items: center;
462
+ justify-content: center;
463
+ padding-bottom: 60rpx;
464
+ }
465
+
466
+ .ellipse-one-line {
467
+ word-break: break-all;
468
+ text-overflow: ellipsis;
469
+ display: -webkit-box;
470
+ /*! autoprefixer: off */
471
+ -webkit-box-orient: vertical;
472
+ -webkit-line-clamp: 1;
473
+ overflow: hidden;
474
+ }
475
+ </style>
package/package.json CHANGED
@@ -1,94 +1,95 @@
1
- {
2
- "name": "distinctui-uni",
3
- "version": "0.2.1",
4
- "description": "Distinct MiniProgram UI",
5
- "author": "benzheng <benzheng@distinctclinic.com>",
6
- "scripts": {
7
- "build": "cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
8
- "dev": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch",
9
- "info": "node node_modules/@dcloudio/vue-cli-plugin-uni/commands/info.js",
10
- "test": "cross-env UNI_PLATFORM=mp-weixin jest -i",
11
- "build:lib": "node ./scripts/build/index.js",
12
- "publish:lib": "node ./scripts/publish/index.js"
13
- },
14
- "main": "lib/index.js",
15
- "files": [
16
- "lib"
17
- ],
18
- "publishConfig": {
19
- "access": "public",
20
- "registry": "https://registry.npmjs.org/"
21
- },
22
- "keywords": [
23
- "MiniProgram",
24
- "UI",
25
- "Components"
26
- ],
27
- "dependencies": {
28
- "@dcloudio/uni-app": "^2.0.2-3080720230703001",
29
- "@dcloudio/uni-app-plus": "^2.0.2-3080720230703001",
30
- "@dcloudio/uni-h5": "^2.0.2-3080720230703001",
31
- "@dcloudio/uni-i18n": "^2.0.2-3080720230703001",
32
- "@dcloudio/uni-mp-360": "^2.0.2-3080720230703001",
33
- "@dcloudio/uni-mp-alipay": "^2.0.2-3080720230703001",
34
- "@dcloudio/uni-mp-baidu": "^2.0.2-3080720230703001",
35
- "@dcloudio/uni-mp-jd": "^2.0.2-3080720230703001",
36
- "@dcloudio/uni-mp-kuaishou": "^2.0.2-3080720230703001",
37
- "@dcloudio/uni-mp-lark": "^2.0.2-3080720230703001",
38
- "@dcloudio/uni-mp-qq": "^2.0.2-3080720230703001",
39
- "@dcloudio/uni-mp-toutiao": "^2.0.2-3080720230703001",
40
- "@dcloudio/uni-mp-vue": "^2.0.2-3080720230703001",
41
- "@dcloudio/uni-mp-weixin": "^2.0.2-3080720230703001",
42
- "@dcloudio/uni-mp-xhs": "^2.0.2-3080720230703001",
43
- "@dcloudio/uni-quickapp-native": "^2.0.2-3080720230703001",
44
- "@dcloudio/uni-quickapp-webview": "^2.0.2-3080720230703001",
45
- "@dcloudio/uni-stacktracey": "^2.0.2-3080720230703001",
46
- "@dcloudio/uni-stat": "^2.0.2-3080720230703001",
47
- "@vue/shared": "^3.0.0",
48
- "core-js": "^3.8.3",
49
- "less": "^4.2.0",
50
- "less-loader": "^11.1.3",
51
- "vue": ">= 2.6.14 < 2.7",
52
- "vuex": "^3.2.0"
53
- },
54
- "devDependencies": {
55
- "@dcloudio/types": "^3.3.2",
56
- "@dcloudio/uni-automator": "^2.0.2-3080720230703001",
57
- "@dcloudio/uni-cli-i18n": "^2.0.2-3080720230703001",
58
- "@dcloudio/uni-cli-shared": "^2.0.2-3080720230703001",
59
- "@dcloudio/uni-helper-json": "*",
60
- "@dcloudio/uni-migration": "^2.0.2-3080720230703001",
61
- "@dcloudio/uni-template-compiler": "^2.0.2-3080720230703001",
62
- "@dcloudio/vue-cli-plugin-hbuilderx": "^2.0.2-3080720230703001",
63
- "@dcloudio/vue-cli-plugin-uni": "^2.0.2-3080720230703001",
64
- "@dcloudio/vue-cli-plugin-uni-optimize": "^2.0.2-3080720230703001",
65
- "@dcloudio/webpack-uni-mp-loader": "^2.0.2-3080720230703001",
66
- "@dcloudio/webpack-uni-pages-loader": "^2.0.2-3080720230703001",
67
- "@vue/cli-plugin-babel": "~5.0.0",
68
- "@vue/cli-service": "~5.0.0",
69
- "babel-plugin-import": "^1.11.0",
70
- "cross-env": "^7.0.2",
71
- "jest": "^25.4.0",
72
- "mini-types": "*",
73
- "miniprogram-api-typings": "*",
74
- "postcss-comment": "^2.0.0",
75
- "vue-template-compiler": ">= 2.6.14 < 2.7"
76
- },
77
- "browserslist": [
78
- "Android >= 4.4",
79
- "ios >= 9"
80
- ],
81
- "directories": {
82
- "lib": "lib",
83
- "test": "__tests__"
84
- },
85
- "homepage": "",
86
- "license": "MIT",
87
- "repository": {
88
- "type": "git",
89
- "url": "https://git.distinctclinic.com/distinct-healthcare-mobile/distinct-ui"
90
- },
91
- "uni-app": {
92
- "scripts": {}
93
- }
94
- }
1
+ {
2
+ "name": "distinctui-uni",
3
+ "version": "0.2.2",
4
+ "description": "Distinct MiniProgram UI",
5
+ "author": "benzheng <benzheng@distinctclinic.com>",
6
+ "scripts": {
7
+ "build": "cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
8
+ "dev": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch",
9
+ "info": "node node_modules/@dcloudio/vue-cli-plugin-uni/commands/info.js",
10
+ "test": "cross-env UNI_PLATFORM=mp-weixin jest -i",
11
+ "build:lib": "node ./scripts/build/index.js",
12
+ "publish:lib": "node ./scripts/publish/index.js",
13
+ "publish:lib:only": "node ./scripts/publish/publish-only.js"
14
+ },
15
+ "main": "lib/index.js",
16
+ "files": [
17
+ "lib"
18
+ ],
19
+ "publishConfig": {
20
+ "access": "public",
21
+ "registry": "https://registry.npmjs.com/"
22
+ },
23
+ "keywords": [
24
+ "MiniProgram",
25
+ "UI",
26
+ "Components"
27
+ ],
28
+ "dependencies": {
29
+ "@dcloudio/uni-app": "^2.0.2-3080720230703001",
30
+ "@dcloudio/uni-app-plus": "^2.0.2-3080720230703001",
31
+ "@dcloudio/uni-h5": "^2.0.2-3080720230703001",
32
+ "@dcloudio/uni-i18n": "^2.0.2-3080720230703001",
33
+ "@dcloudio/uni-mp-360": "^2.0.2-3080720230703001",
34
+ "@dcloudio/uni-mp-alipay": "^2.0.2-3080720230703001",
35
+ "@dcloudio/uni-mp-baidu": "^2.0.2-3080720230703001",
36
+ "@dcloudio/uni-mp-jd": "^2.0.2-3080720230703001",
37
+ "@dcloudio/uni-mp-kuaishou": "^2.0.2-3080720230703001",
38
+ "@dcloudio/uni-mp-lark": "^2.0.2-3080720230703001",
39
+ "@dcloudio/uni-mp-qq": "^2.0.2-3080720230703001",
40
+ "@dcloudio/uni-mp-toutiao": "^2.0.2-3080720230703001",
41
+ "@dcloudio/uni-mp-vue": "^2.0.2-3080720230703001",
42
+ "@dcloudio/uni-mp-weixin": "^2.0.2-3080720230703001",
43
+ "@dcloudio/uni-mp-xhs": "^2.0.2-3080720230703001",
44
+ "@dcloudio/uni-quickapp-native": "^2.0.2-3080720230703001",
45
+ "@dcloudio/uni-quickapp-webview": "^2.0.2-3080720230703001",
46
+ "@dcloudio/uni-stacktracey": "^2.0.2-3080720230703001",
47
+ "@dcloudio/uni-stat": "^2.0.2-3080720230703001",
48
+ "@vue/shared": "^3.0.0",
49
+ "core-js": "^3.8.3",
50
+ "less": "^4.2.0",
51
+ "less-loader": "^11.1.3",
52
+ "vue": ">= 2.6.14 < 2.7",
53
+ "vuex": "^3.2.0"
54
+ },
55
+ "devDependencies": {
56
+ "@dcloudio/types": "^3.3.2",
57
+ "@dcloudio/uni-automator": "^2.0.2-3080720230703001",
58
+ "@dcloudio/uni-cli-i18n": "^2.0.2-3080720230703001",
59
+ "@dcloudio/uni-cli-shared": "^2.0.2-3080720230703001",
60
+ "@dcloudio/uni-helper-json": "*",
61
+ "@dcloudio/uni-migration": "^2.0.2-3080720230703001",
62
+ "@dcloudio/uni-template-compiler": "^2.0.2-3080720230703001",
63
+ "@dcloudio/vue-cli-plugin-hbuilderx": "^2.0.2-3080720230703001",
64
+ "@dcloudio/vue-cli-plugin-uni": "^2.0.2-3080720230703001",
65
+ "@dcloudio/vue-cli-plugin-uni-optimize": "^2.0.2-3080720230703001",
66
+ "@dcloudio/webpack-uni-mp-loader": "^2.0.2-3080720230703001",
67
+ "@dcloudio/webpack-uni-pages-loader": "^2.0.2-3080720230703001",
68
+ "@vue/cli-plugin-babel": "~5.0.0",
69
+ "@vue/cli-service": "~5.0.0",
70
+ "babel-plugin-import": "^1.11.0",
71
+ "cross-env": "^7.0.2",
72
+ "jest": "^25.4.0",
73
+ "mini-types": "*",
74
+ "miniprogram-api-typings": "*",
75
+ "postcss-comment": "^2.0.0",
76
+ "vue-template-compiler": ">= 2.6.14 < 2.7"
77
+ },
78
+ "browserslist": [
79
+ "Android >= 4.4",
80
+ "ios >= 9"
81
+ ],
82
+ "directories": {
83
+ "lib": "lib",
84
+ "test": "__tests__"
85
+ },
86
+ "homepage": "",
87
+ "license": "MIT",
88
+ "repository": {
89
+ "type": "git",
90
+ "url": "https://git.distinctclinic.com/distinct-healthcare-mobile/distinct-ui"
91
+ },
92
+ "uni-app": {
93
+ "scripts": {}
94
+ }
95
+ }