dolphin-weex-ui 0.2.13 → 0.2.15

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.
Files changed (45) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/index.native.js +3812 -1591
  3. package/dist/index.native.js.map +1 -1
  4. package/dist/index.web.js +4387 -1725
  5. package/dist/index.web.js.map +1 -1
  6. package/index.js +22 -0
  7. package/package.json +1 -1
  8. package/packages/dof-board/index.js +1 -0
  9. package/packages/dof-board/index.vue +63 -0
  10. package/packages/dof-card/index.js +1 -1
  11. package/packages/dof-card/index.vue +140 -411
  12. package/packages/dof-card-group/index.js +1 -0
  13. package/packages/dof-card-group/index.vue +18 -0
  14. package/packages/dof-card-item/index.js +1 -0
  15. package/packages/dof-card-item/index.vue +29 -0
  16. package/packages/dof-col/index.js +1 -0
  17. package/packages/dof-col/index.vue +23 -0
  18. package/packages/dof-icon-button/index.js +1 -0
  19. package/packages/dof-icon-button/index.vue +88 -0
  20. package/packages/dof-progress/index.vue +53 -56
  21. package/packages/dof-row/index.js +1 -0
  22. package/packages/dof-row/index.vue +21 -0
  23. package/packages/dof-slider/index.js +1 -0
  24. package/packages/dof-slider/index.vue +256 -0
  25. package/packages/dof-slider-scale/index.js +1 -0
  26. package/packages/dof-slider-scale/index.vue +52 -0
  27. package/packages/dof-step-action/index.js +1 -0
  28. package/packages/dof-step-action/index.vue +113 -0
  29. package/packages/dof-switch/index.vue +45 -7
  30. package/packages/dof-tag/index.js +1 -1
  31. package/packages/dof-tag/index.vue +60 -127
  32. package/packages/dof-tag-group/index.js +1 -0
  33. package/packages/dof-tag-group/index.vue +19 -0
  34. package/packages/dof-taged/index.js +1 -0
  35. package/packages/dof-taged/index.vue +140 -0
  36. package/packages/utils/direction.js +7 -0
  37. package/packages/utils/dom.js +11 -0
  38. package/packages/utils/math-extension.js +3 -0
  39. package/packages/utils/mix-child.js +57 -0
  40. package/packages/utils/mix-parent.js +14 -0
  41. package/packages/utils/mix-selectable-child.js +69 -0
  42. package/packages/utils/mix-selectable-parent.js +29 -0
  43. package/packages/utils/touch.js +76 -0
  44. package/packages/utils/transition.js +130 -0
  45. package/packages/utils/vue-extension.js +32 -0
@@ -1,299 +1,139 @@
1
1
  <template>
2
- <div
3
- class="wrapper"
4
- :class="[disabled ? 'card-disabled-opacity' : 'card-abled-opacity']"
5
- >
6
- <div
7
- :class="[
8
- 'dof-card',
9
- isHighlight && 'dof-card-highlight',
10
- hasTopBorder && 'card-top-border',
11
- hasBottomBorder && 'card-bottom-border',
12
- hasMargin && 'card-margin'
13
- ]"
14
- :style="cardStyleComp"
15
- :accessible="autoAccessible"
16
- :aria-label="`${label},${title},${desc}`"
17
- @click="cardClicked"
18
- >
19
- <slot>
20
- <div class="image-container" v-if="itemImg && itemImg != ''">
21
- <div
22
- class="img-bg"
23
- :style="{ backgroundColor: iconColor ? iconColor : 'transparent' }"
24
- >
25
- <image :src="itemImg" class="item-img" :style="itemImgSizeComp">
26
- </image>
27
- </div>
28
- </div>
29
-
30
- <div class="main-wrapper">
31
- <div
32
- :class="[
33
- 'main-content',
34
- hasTopSubBorder && 'card-top-border',
35
- hasSubBottomBorder && 'card-bottom-border',
36
- hasVerticalIndent && 'card-indent'
37
- ]"
38
- :style="dynamicSizeComp"
39
- >
40
- <slot name="label">
41
- <div v-if="label">
42
- <text class="card-label-text" :style="textColorComp">{{
43
- label
44
- }}</text>
45
- </div>
46
- </slot>
47
- <div class="card-title-container">
48
- <slot name="title">
49
- <div class="card-title-wrapper">
50
- <div class="card-title-content">
51
- <image
52
- v-if="avatarIcon"
53
- class="avatar-icon"
54
- :src="avatarIcon"
55
- :style="{
56
- backgroundColor: iconColor ? iconColor : 'transparent'
57
- }"
58
- ></image>
59
- <text
60
- :class="[
61
- 'card-title-text',
62
- !titleTag && 'titleMultiText'
63
- ]"
64
- :style="textColorComp"
65
- >{{ title }}</text
66
- >
67
- <slot name="tag">
68
- <div
69
- class="card-title-tag"
70
- v-if="titleTag"
71
- :style="{
72
- backgroundColor: iconColor ? iconColor : '#f2f2f2'
73
- }"
74
- >
75
- <text class="card-title-tag-text">{{ titleTag }}</text>
76
- </div>
77
- </slot>
78
- </div>
79
- </div>
80
- <div class="desc-wrapper" v-if="desc">
81
- <slot name="desc">
82
- <text class="card-desc-text" :style="textColorComp">{{
83
- desc
84
- }}</text>
85
- </slot>
86
- </div>
87
- </slot>
88
- </div>
89
- <slot name="value"></slot>
90
- <slot></slot>
91
- <div class="right-content">
92
- <slot name="rightText">
93
- <div class="right-text-wrapper" v-if="rightText">
94
- <text
95
- :class="['right-text', !itemImg && 'single-line-text']"
96
- :style="rightTextStyleComp"
97
- >{{ rightText }}</text
98
- >
99
- </div>
100
- </slot>
101
- <text
102
- class="extra-content-text"
103
- :style="textColorComp"
104
- v-if="extraContent"
105
- >{{ extraContent }}</text
106
- >
107
- <slot name="switch"></slot>
108
-
109
- <div class="arrow-wrapper" v-if="hasArrow">
110
- <slot name="arrow">
111
- <image
112
- :src="arrowIcon"
113
- class="card-arrow-icon"
114
- :aria-hidden="true"
115
- ></image>
116
- </slot>
117
- </div>
118
- </div>
119
- </div>
120
- </div>
121
- </slot>
2
+ <div class="dof-card">
3
+ <div class="dof-card-header" @click="onSelect">
4
+ <image
5
+ v-if="isActive"
6
+ :class="[
7
+ 'dof-card-header-stamp',
8
+ tag === 'right' ? 'dof-card-header-stamp--right' : 'dof-card-header-stamp--left'
9
+ ]"
10
+ :src="stampSrc"
11
+ ></image>
12
+ <div class="dof-card-header-content">
13
+ <slot></slot>
14
+ </div>
15
+ <div class="dof-card-header-arrow-wrapper" v-if="collapsable" @click="onCollapse">
16
+ <image
17
+ ref="arrow"
18
+ class="dof-card-header-arrow"
19
+ src="http://dolphin-weex-dev.msmartlife.cn/static/component/card/image/arrow-down.png"
20
+ ></image>
21
+ </div>
22
+ </div>
23
+ <div v-if="collapsable" ref="body" class="dof-card-body">
24
+ <slot name="body"></slot>
122
25
  </div>
123
26
  </div>
124
27
  </template>
125
28
 
126
29
  <script>
127
- const icon = require('../setting/icon.base64.js')
30
+ import { mixSelectableChild } from '../utils/mix-selectable-child.js'
31
+ import { Transition } from '../utils/transition.js'
32
+ import { getBoundingClientRect } from '../utils/dom.js'
128
33
  export default {
34
+ mixins: [mixSelectableChild('dof-card-group')],
129
35
  props: {
130
- label: {
131
- type: String,
132
- default: ''
133
- },
134
- isHighlight: {
135
- type: Boolean,
136
- default: true
137
- },
138
- title: {
139
- type: String,
140
- default: ''
141
- },
142
- titleTag: {
143
- type: String,
144
- default: ''
145
- },
146
- extraContent: {
147
- type: String,
148
- default: ''
149
- },
150
- desc: {
151
- type: String,
152
- default: ''
153
- },
154
- itemImg: {
155
- type: String,
156
- default: ''
157
- },
158
- itemImgSize: {
159
- type: String,
160
- default: 'normal'
161
- },
162
- avatarIcon: {
163
- type: String,
164
- default: ''
165
- },
166
- cardStyle: {
167
- type: Object,
168
- default: () => ({})
169
- },
170
- rightTextStyle: {
171
- type: Object,
172
- default: () => ({})
173
- },
174
- backgroundColor: {
175
- type: String,
176
- default: '#ffffff'
177
- },
178
- textColor: {
179
- type: String,
180
- default: ''
181
- },
182
- iconColor: {
183
- type: String,
184
- default: ''
185
- },
186
- hasTopBorder: {
187
- type: Boolean,
188
- default: false
189
- },
190
- hasBottomBorder: {
191
- type: Boolean,
192
- default: false
193
- },
194
- hasTopSubBorder: {
36
+ collapsable: {
195
37
  type: Boolean,
196
38
  default: false
197
39
  },
198
- hasSubBottomBorder: {
40
+ selectable: {
199
41
  type: Boolean,
200
42
  default: false
201
43
  },
202
- hasMargin: {
44
+ selected: {
203
45
  type: Boolean,
204
46
  default: false
205
47
  },
206
- hasVerticalIndent: {
207
- type: Boolean,
208
- default: true
209
- },
210
- hasSwitch: {
48
+ collapsed: {
211
49
  type: Boolean,
212
50
  default: false
213
51
  },
214
- hasArrow: {
215
- type: Boolean,
216
- default: false
217
- },
218
- rightText: {
52
+ tag: {
219
53
  type: String,
220
- default: ''
221
- },
222
- disabled: {
223
- type: Boolean,
224
- default: false
225
- },
226
- autoAccessible: {
227
- type: Boolean,
228
- default: true
54
+ default: 'right'
55
+ }
56
+ },
57
+ model: {
58
+ prop: 'selected',
59
+ event: 'select'
60
+ },
61
+ data() {
62
+ return {
63
+ active_: false,
64
+ collapsed_: this.collapsed,
65
+ bodyHeight: 0
229
66
  }
230
67
  },
231
- data: () => ({
232
- arrowIcon: icon.arrowIconNew
233
- }),
234
68
  computed: {
235
- cardStyleComp() {
236
- const { cardStyle, backgroundColor, disabled } = this
237
- return {
238
- backgroundColor,
239
- ...cardStyle
240
- }
69
+ stampSrc() {
70
+ return this.tag === 'right'
71
+ ? 'http://dolphin-weex-dev.msmartlife.cn/static/component/card/image/stamp.png'
72
+ : 'http://dolphin-weex-dev.msmartlife.cn/static/component/card/image/stamp-left.png'
241
73
  },
242
- textColorComp() {
243
- const { textColor } = this
244
- if (textColor) {
245
- return {
246
- color: textColor
74
+ isActive() {
75
+ return (this.selectable && this.selected) || this.isSelected
76
+ }
77
+ },
78
+ mounted() {
79
+ setTimeout(() => {
80
+ getBoundingClientRect(this.$refs.body, res => {
81
+ if (res.result) {
82
+ this.bodyHeight = res.size.height
83
+ if (this.collapsed_) {
84
+ this.collapseBody(0)
85
+ }
247
86
  }
248
- } else {
249
- return {}
87
+ })
88
+
89
+ if (this.collapsed_) {
90
+ this.collapseArrow()
250
91
  }
251
- },
252
- rightTextStyleComp() {
253
- const { textColor, rightTextStyle } = this
254
- if (textColor) {
255
- return {
256
- color: textColor,
257
- ...rightTextStyle
258
- }
259
- } else {
260
- return {
261
- ...rightTextStyle
262
- }
92
+ }, 0)
93
+ },
94
+ methods: {
95
+ onSelect() {
96
+ this.$emit('select', !this.selected)
97
+ if (this.parent) {
98
+ this.parent.triggerChange(this.value)
263
99
  }
264
100
  },
265
- dynamicSizeComp() {
266
- if (this.itemImg) {
267
- return {
268
- height: '160px'
269
- }
101
+ onCollapse(e) {
102
+ this.collapsed_ = !this.collapsed_
103
+ this.$emit('collapse', this.collapsed_)
104
+ if (this.collapsed_) {
105
+ this.collapseBody()
106
+ this.collapseArrow()
270
107
  } else {
271
- return {
272
- // paddingLeft: '32px'
273
- }
108
+ this.expandeBody()
109
+ this.expandeArrow()
274
110
  }
275
111
  },
276
- itemImgSizeComp() {
277
- let { itemImgSize } = this
278
- if (itemImgSize === 'max') {
279
- return {
280
- width: '96px',
281
- height: '96px'
282
- }
283
- } else if (itemImgSize === 'min') {
284
- return {
285
- width: '40px',
286
- height: '40px'
287
- }
288
- } else {
289
- return {}
290
- }
291
- }
292
- },
293
- methods: {
294
- cardClicked() {
295
- const { disabled } = this
296
- !disabled && this.$emit('dofCardClicked')
112
+ collapseBody(duration = 360) {
113
+ Transition.Default()
114
+ .duration(duration)
115
+ .height(0)
116
+ .needLayout(true)
117
+ .run(this.$refs.body)
118
+ },
119
+ collapseArrow() {
120
+ Transition.Default()
121
+ .rotateZ(-180)
122
+ .transformOrigin('center')
123
+ .run(this.$refs.arrow)
124
+ },
125
+ expandeBody(duration = 360) {
126
+ Transition.Default()
127
+ .duration(duration)
128
+ .height(this.bodyHeight)
129
+ .needLayout(true)
130
+ .run(this.$refs.body)
131
+ },
132
+ expandeArrow() {
133
+ Transition.Default()
134
+ .rotateZ(0)
135
+ .transformOrigin('center')
136
+ .run(this.$refs.arrow)
297
137
  }
298
138
  }
299
139
  }
@@ -301,174 +141,63 @@ export default {
301
141
 
302
142
  <style scoped>
303
143
  .dof-card {
304
- flex-direction: row;
305
- align-items: center;
144
+ border-radius: 16px;
145
+ overflow: hidden;
306
146
  background-color: #ffffff;
307
147
  }
308
- .dof-card-highlight:active {
309
- background-color: #f5f5f5;
310
- }
311
- .card-disabled-opacity {
312
- opacity: 0.3;
313
- }
314
- .card-abled-opacity {
315
- opacity: 1;
316
- }
317
- .image-container {
318
- padding: 32px 0;
319
- }
320
148
 
321
- .img-bg {
322
- border-radius: 48px;
323
- margin-left: 32px;
324
- }
325
-
326
- .item-img {
327
- width: 64px;
328
- height: 64px;
149
+ .dof-card--active {
150
+ background-color: #f2f2f2;
329
151
  }
330
152
 
331
- .main-wrapper {
332
- flex: 1;
333
- padding: 0 0px 0 32px;
334
- }
335
- .main-content {
336
- flex: 1;
153
+ .dof-card-header {
154
+ position: relative;
337
155
  flex-direction: row;
338
156
  align-items: center;
157
+ padding-left: 16px;
158
+ padding-right: 16px;
159
+ padding-top: 16px;
160
+ padding-bottom: 16px;
339
161
  }
340
162
 
341
- .card-indent {
342
- padding: 16px 0;
343
- }
344
- .card-margin {
345
- margin-bottom: 16px;
346
- }
347
-
348
- .card-title-container {
349
- flex: 1;
350
- }
351
- .card-title-wrapper {
352
- flex: 1;
353
- flex-direction: row;
354
- align-items: center;
355
- }
356
- .card-title-content {
357
- flex: 1;
358
- flex-direction: row;
359
- justify-content: flex-start;
360
- align-items: center;
361
- }
362
- .avatar-icon {
363
- width: 56px;
364
- height: 56px;
365
- border-radius: 24px;
366
- margin-right: 24px;
367
- }
368
-
369
- .card-title-text {
370
- font-family: PingFangSC-Regular;
371
- /* max-width: 260px; */
372
- font-size: 32px;
373
- line-height: 32px;
374
- color: #000000;
375
- lines: 1;
376
- text-overflow: ellipsis;
163
+ .dof-card-header-stamp {
164
+ position: absolute;
165
+ top: 0px;
166
+ width: 48px;
167
+ height: 48px;
377
168
  overflow: hidden;
378
- padding: 20px 0;
169
+ z-index: 100;
379
170
  }
380
171
 
381
- .titleMultiText {
382
- flex: 1;
172
+ .dof-card-header-stamp--left {
173
+ left: 0px;
174
+ border-top-left-radius: 16px;
383
175
  }
384
176
 
385
- .card-title-tag {
386
- width: 92px;
387
- height: 50px;
388
- justify-content: center;
389
- align-items: center;
390
- text-align: center;
391
- background-color: #f2f2f2;
392
- border-radius: 24px;
393
- margin-left: 18px;
394
- }
395
- .card-title-tag-text {
396
- font-family: PingFangSC-Medium;
397
- font-size: 24px;
398
- color: #666666;
399
- line-height: 24px;
400
- }
401
- .card-desc-text {
402
- font-family: PingFangSC-Regular;
403
- font-size: 24px;
404
- color: #8a8a8f;
405
- line-height: 32px;
406
- /* desc和title的间距 */
407
- margin-top: 4px;
408
- margin-right: 30px;
409
- lines: 2;
410
- text-overflow: ellipsis;
411
- overflow: hidden;
412
- }
413
-
414
- .desc-wrapper {
415
- padding-bottom: 30px;
416
- min-height: 36px;
417
- }
418
- .card-top-border {
419
- border-top-color: #f2f2f2;
420
- border-top-width: 1px;
177
+ .dof-card-header-stamp--right {
178
+ right: 0px;
179
+ border-top-right-radius: 16px;
421
180
  }
422
181
 
423
- .card-bottom-border {
424
- border-bottom-color: #f2f2f2;
425
- border-bottom-width: 1px;
426
- }
427
-
428
- .card-label-text {
429
- font-size: 30px;
430
- color: #666666;
431
- width: 188px;
432
- margin-right: 10px;
433
- }
434
-
435
- .right-content {
436
- flex-direction: row;
437
- align-items: center;
438
- justify-content: flex-end;
439
- padding-right: 32px;
440
- /* padding-left: 80px; */
441
- }
442
- .right-text-wrapper {
443
- margin-left: 20px;
444
- }
445
-
446
- .right-text {
447
- font-family: PingFangSC-Regular;
448
- font-size: 32px;
449
- color: #000000;
450
- letter-spacing: 0;
451
- text-align: right;
452
- }
453
-
454
- .single-line-text {
455
- font-size: 24px;
456
- line-height: 34px;
457
- color: #8a8a8f;
182
+ .dof-card-header-content {
183
+ flex: 1;
184
+ flex-direction: column;
458
185
  }
459
186
 
460
- .arrow-wrapper {
461
- padding-left: 20px;
187
+ .dof-card-header-arrow-wrapper {
188
+ margin-right: 4px;
462
189
  }
463
190
 
464
- .card-arrow-icon {
465
- width: 22px;
466
- height: 22px;
191
+ .dof-card-header-arrow {
192
+ width: 24px;
193
+ height: 24px;
194
+ margin-left: 12px;
195
+ margin-right: 12px;
196
+ margin-top: 12px;
197
+ margin-bottom: 12px;
467
198
  }
468
199
 
469
- .extra-content-text {
470
- font-size: 28px;
471
- color: #999999;
472
- margin-right: 4px;
200
+ .dof-card-body {
201
+ position: relative;
473
202
  }
474
203
  </style>
@@ -0,0 +1 @@
1
+ export { default } from './index.vue'
@@ -0,0 +1,18 @@
1
+ <template>
2
+ <div class="dof-card-group">
3
+ <slot></slot>
4
+ </div>
5
+ </template>
6
+
7
+ <script>
8
+ import { mixSelectableParent } from '../utils/mix-selectable-parent.js'
9
+ export default {
10
+ mixins: [mixSelectableParent('dof-card-group')]
11
+ }
12
+ </script>
13
+
14
+ <style scoped>
15
+ .dof-card-group {
16
+ flex-direction: column;
17
+ }
18
+ </style>
@@ -0,0 +1 @@
1
+ export { default } from './index.vue'
@@ -0,0 +1,29 @@
1
+ <template>
2
+ <div class="dof-card-item">
3
+ <div class="dof-card-item-content">
4
+ <slot></slot>
5
+ </div>
6
+ </div>
7
+ </template>
8
+
9
+ <script>
10
+ export default {}
11
+ </script>
12
+
13
+ <style scoped>
14
+ .dof-card-item {
15
+ flex: 1;
16
+ flex-direction: column;
17
+ padding-top: 16px;
18
+ padding-bottom: 16px;
19
+ padding-left: 16px;
20
+ padding-right: 16px;
21
+ }
22
+
23
+ .dof-card-item-content {
24
+ flex: 1;
25
+ border-top-style: solid;
26
+ border-top-width: 1px;
27
+ border-top-color: #f2f2f2;
28
+ }
29
+ </style>
@@ -0,0 +1 @@
1
+ export { default } from './index.vue'
@@ -0,0 +1,23 @@
1
+ <template>
2
+ <div :class="['dof-col', !isLast && 'dof-col--gap']">
3
+ <slot></slot>
4
+ </div>
5
+ </template>
6
+
7
+ <script>
8
+ import { mixChild } from '../utils/mix-child.js'
9
+ export default {
10
+ mixins: [mixChild('dof-row')]
11
+ }
12
+ </script>
13
+
14
+ <style scoped>
15
+ .dof-col {
16
+ flex: 1;
17
+ flex-direction: column;
18
+ }
19
+
20
+ .dof-col--gap {
21
+ margin-right: 10px;
22
+ }
23
+ </style>
@@ -0,0 +1 @@
1
+ export { default } from './index.vue'