dolphin-weex-ui 0.2.13 → 0.2.17

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 (48) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/index.native.js +3802 -1588
  3. package/dist/index.native.js.map +1 -1
  4. package/dist/index.web.js +4388 -1726
  5. package/dist/index.web.js.map +1 -1
  6. package/index.js +24 -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 +138 -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 +24 -0
  16. package/packages/dof-col/index.js +1 -0
  17. package/packages/dof-col/index.vue +34 -0
  18. package/packages/dof-gear/index.js +1 -0
  19. package/packages/dof-gear/index.vue +206 -0
  20. package/packages/dof-gear/range.js +26 -0
  21. package/packages/dof-icon-button/index.js +1 -0
  22. package/packages/dof-icon-button/index.vue +88 -0
  23. package/packages/dof-progress/index.vue +53 -56
  24. package/packages/dof-row/index.js +1 -0
  25. package/packages/dof-row/index.vue +21 -0
  26. package/packages/dof-slider/index.js +1 -0
  27. package/packages/dof-slider/index.vue +251 -0
  28. package/packages/dof-slider-scale/index.js +1 -0
  29. package/packages/dof-slider-scale/index.vue +52 -0
  30. package/packages/dof-step-action/index.js +1 -0
  31. package/packages/dof-step-action/index.vue +113 -0
  32. package/packages/dof-switch/index.vue +45 -7
  33. package/packages/dof-tag/index.js +1 -1
  34. package/packages/dof-tag/index.vue +56 -127
  35. package/packages/dof-tag-group/index.js +1 -0
  36. package/packages/dof-tag-group/index.vue +19 -0
  37. package/packages/dof-taged/index.js +1 -0
  38. package/packages/dof-taged/index.vue +140 -0
  39. package/packages/utils/direction.js +7 -0
  40. package/packages/utils/dom.js +11 -0
  41. package/packages/utils/math-extension.js +3 -0
  42. package/packages/utils/mix-child.js +57 -0
  43. package/packages/utils/mix-parent.js +14 -0
  44. package/packages/utils/mix-selectable-child.js +69 -0
  45. package/packages/utils/mix-selectable-parent.js +29 -0
  46. package/packages/utils/touch.js +76 -0
  47. package/packages/utils/transition.js +130 -0
  48. package/packages/utils/vue-extension.js +32 -0
@@ -1,299 +1,137 @@
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: {
36
+ collapsable: {
187
37
  type: Boolean,
188
38
  default: false
189
39
  },
190
- hasBottomBorder: {
40
+ selectable: {
191
41
  type: Boolean,
192
42
  default: false
193
43
  },
194
- hasTopSubBorder: {
44
+ selected: {
195
45
  type: Boolean,
196
46
  default: false
197
47
  },
198
- hasSubBottomBorder: {
48
+ collapsed: {
199
49
  type: Boolean,
200
50
  default: false
201
51
  },
202
- hasMargin: {
203
- type: Boolean,
204
- default: false
205
- },
206
- hasVerticalIndent: {
207
- type: Boolean,
208
- default: true
209
- },
210
- hasSwitch: {
211
- type: Boolean,
212
- default: false
213
- },
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
+ getBoundingClientRect(this.$refs.body, res => {
80
+ if (res.result) {
81
+ this.bodyHeight = res.size.height
82
+ if (this.collapsed_) {
83
+ this.collapseBody(0)
247
84
  }
248
- } else {
249
- return {}
250
85
  }
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
- }
86
+ })
87
+
88
+ if (this.collapsed_) {
89
+ this.collapseArrow()
90
+ }
91
+ },
92
+ methods: {
93
+ onSelect() {
94
+ this.$emit('select', !this.selected)
95
+ if (this.parent) {
96
+ this.parent.triggerChange(this.value)
263
97
  }
264
98
  },
265
- dynamicSizeComp() {
266
- if (this.itemImg) {
267
- return {
268
- height: '160px'
269
- }
99
+ onCollapse(e) {
100
+ this.collapsed_ = !this.collapsed_
101
+ this.$emit('collapse', this.collapsed_)
102
+ if (this.collapsed_) {
103
+ this.collapseBody()
104
+ this.collapseArrow()
270
105
  } else {
271
- return {
272
- // paddingLeft: '32px'
273
- }
106
+ this.expandeBody()
107
+ this.expandeArrow()
274
108
  }
275
109
  },
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')
110
+ collapseBody(duration = 360) {
111
+ Transition.Default()
112
+ .duration(duration)
113
+ .height(0)
114
+ .needLayout(true)
115
+ .run(this.$refs.body)
116
+ },
117
+ collapseArrow() {
118
+ Transition.Default()
119
+ .rotateZ(-180)
120
+ .transformOrigin('center')
121
+ .run(this.$refs.arrow)
122
+ },
123
+ expandeBody(duration = 360) {
124
+ Transition.Default()
125
+ .duration(duration)
126
+ .height(this.bodyHeight)
127
+ .needLayout(true)
128
+ .run(this.$refs.body)
129
+ },
130
+ expandeArrow() {
131
+ Transition.Default()
132
+ .rotateZ(0)
133
+ .transformOrigin('center')
134
+ .run(this.$refs.arrow)
297
135
  }
298
136
  }
299
137
  }
@@ -301,174 +139,63 @@ export default {
301
139
 
302
140
  <style scoped>
303
141
  .dof-card {
304
- flex-direction: row;
305
- align-items: center;
142
+ border-radius: 32px;
143
+ overflow: hidden;
306
144
  background-color: #ffffff;
307
145
  }
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
146
 
321
- .img-bg {
322
- border-radius: 48px;
323
- margin-left: 32px;
324
- }
325
-
326
- .item-img {
327
- width: 64px;
328
- height: 64px;
329
- }
330
-
331
- .main-wrapper {
332
- flex: 1;
333
- padding: 0 0px 0 32px;
334
- }
335
- .main-content {
336
- flex: 1;
337
- flex-direction: row;
338
- align-items: center;
339
- }
340
-
341
- .card-indent {
342
- padding: 16px 0;
343
- }
344
- .card-margin {
345
- margin-bottom: 16px;
147
+ .dof-card--active {
148
+ background-color: #f2f2f2;
346
149
  }
347
150
 
348
- .card-title-container {
349
- flex: 1;
350
- }
351
- .card-title-wrapper {
352
- flex: 1;
151
+ .dof-card-header {
152
+ position: relative;
353
153
  flex-direction: row;
354
154
  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;
377
- overflow: hidden;
378
- padding: 20px 0;
379
- }
380
-
381
- .titleMultiText {
382
- flex: 1;
155
+ padding-left: 32px;
156
+ padding-right: 32px;
157
+ padding-top: 32px;
158
+ padding-bottom: 32px;
383
159
  }
384
160
 
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;
161
+ .dof-card-header-stamp {
162
+ position: absolute;
163
+ top: 0px;
164
+ width: 48px;
165
+ height: 48px;
411
166
  overflow: hidden;
167
+ z-index: 100;
412
168
  }
413
169
 
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;
421
- }
422
-
423
- .card-bottom-border {
424
- border-bottom-color: #f2f2f2;
425
- border-bottom-width: 1px;
170
+ .dof-card-header-stamp--left {
171
+ left: 0px;
172
+ border-top-left-radius: 32px;
426
173
  }
427
174
 
428
- .card-label-text {
429
- font-size: 30px;
430
- color: #666666;
431
- width: 188px;
432
- margin-right: 10px;
175
+ .dof-card-header-stamp--right {
176
+ right: 0px;
177
+ border-top-right-radius: 32px;
433
178
  }
434
179
 
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;
180
+ .dof-card-header-content {
181
+ flex: 1;
182
+ flex-direction: column;
458
183
  }
459
184
 
460
- .arrow-wrapper {
461
- padding-left: 20px;
185
+ .dof-card-header-arrow-wrapper {
186
+ margin-right: 4px;
462
187
  }
463
188
 
464
- .card-arrow-icon {
465
- width: 22px;
466
- height: 22px;
189
+ .dof-card-header-arrow {
190
+ width: 24px;
191
+ height: 24px;
192
+ margin-left: 12px;
193
+ margin-right: 12px;
194
+ margin-top: 12px;
195
+ margin-bottom: 12px;
467
196
  }
468
197
 
469
- .extra-content-text {
470
- font-size: 28px;
471
- color: #999999;
472
- margin-right: 4px;
198
+ .dof-card-body {
199
+ position: relative;
473
200
  }
474
201
  </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,24 @@
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
+ padding-left: 16px;
16
+ padding-right: 16px;
17
+ }
18
+
19
+ .dof-card-item-content {
20
+ border-top-style: solid;
21
+ border-top-width: 1px;
22
+ border-top-color: #f2f2f2;
23
+ }
24
+ </style>
@@ -0,0 +1 @@
1
+ export { default } from './index.vue'
@@ -0,0 +1,34 @@
1
+ <template>
2
+ <div class="dof-col" :style="style">
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
+ props: {
12
+ gap: {
13
+ type: Number,
14
+ default: 20
15
+ }
16
+ },
17
+ computed: {
18
+ style() {
19
+ const res = {}
20
+ if (!this.isLast) {
21
+ res.marginRight = `${this.gap}px`
22
+ }
23
+ return res
24
+ }
25
+ }
26
+ }
27
+ </script>
28
+
29
+ <style scoped>
30
+ .dof-col {
31
+ flex: 1;
32
+ flex-direction: column;
33
+ }
34
+ </style>