maooo-skyline-ui-system 0.1.1

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 (117) hide show
  1. package/README.md +157 -0
  2. package/miniprogram_dist/button/button.js +43 -0
  3. package/miniprogram_dist/button/button.json +5 -0
  4. package/miniprogram_dist/button/button.wxml +12 -0
  5. package/miniprogram_dist/button/button.wxs +23 -0
  6. package/miniprogram_dist/button/button.wxss +133 -0
  7. package/miniprogram_dist/calendar/calendar.js +549 -0
  8. package/miniprogram_dist/calendar/calendar.json +8 -0
  9. package/miniprogram_dist/calendar/calendar.wxml +79 -0
  10. package/miniprogram_dist/calendar/calendar.wxss +265 -0
  11. package/miniprogram_dist/card/card.js +22 -0
  12. package/miniprogram_dist/card/card.json +5 -0
  13. package/miniprogram_dist/card/card.wxml +9 -0
  14. package/miniprogram_dist/card/card.wxss +34 -0
  15. package/miniprogram_dist/countdown/countdown.js +213 -0
  16. package/miniprogram_dist/countdown/countdown.json +3 -0
  17. package/miniprogram_dist/countdown/countdown.wxml +9 -0
  18. package/miniprogram_dist/countdown/countdown.wxss +33 -0
  19. package/miniprogram_dist/form/form.js +12 -0
  20. package/miniprogram_dist/form/form.json +5 -0
  21. package/miniprogram_dist/form/form.wxml +12 -0
  22. package/miniprogram_dist/form/form.wxss +35 -0
  23. package/miniprogram_dist/form-group/form-group.js +53 -0
  24. package/miniprogram_dist/form-group/form-group.json +5 -0
  25. package/miniprogram_dist/form-group/form-group.wxml +11 -0
  26. package/miniprogram_dist/form-group/form-group.wxss +50 -0
  27. package/miniprogram_dist/form-input/form-input.js +48 -0
  28. package/miniprogram_dist/form-input/form-input.json +8 -0
  29. package/miniprogram_dist/form-input/form-input.wxml +28 -0
  30. package/miniprogram_dist/form-input/form-input.wxss +3 -0
  31. package/miniprogram_dist/form-textarea/form-textarea.js +34 -0
  32. package/miniprogram_dist/form-textarea/form-textarea.json +8 -0
  33. package/miniprogram_dist/form-textarea/form-textarea.wxml +20 -0
  34. package/miniprogram_dist/form-textarea/form-textarea.wxss +3 -0
  35. package/miniprogram_dist/icon/_iconfont/iconfont.js +63 -0
  36. package/miniprogram_dist/icon/_iconfont/iconfont.json +4 -0
  37. package/miniprogram_dist/icon/_iconfont/iconfont.wxml +8 -0
  38. package/miniprogram_dist/icon/_iconfont/iconfont.wxss +3 -0
  39. package/miniprogram_dist/icon/icon.js +41 -0
  40. package/miniprogram_dist/icon/icon.json +7 -0
  41. package/miniprogram_dist/icon/icon.wxml +3 -0
  42. package/miniprogram_dist/icon/icon.wxss +13 -0
  43. package/miniprogram_dist/image-cropper/image-cropper.js +703 -0
  44. package/miniprogram_dist/image-cropper/image-cropper.json +3 -0
  45. package/miniprogram_dist/image-cropper/image-cropper.wxml +58 -0
  46. package/miniprogram_dist/image-cropper/image-cropper.wxss +195 -0
  47. package/miniprogram_dist/index.js +4 -0
  48. package/miniprogram_dist/input/input.js +119 -0
  49. package/miniprogram_dist/input/input.json +7 -0
  50. package/miniprogram_dist/input/input.wxml +38 -0
  51. package/miniprogram_dist/input/input.wxss +52 -0
  52. package/miniprogram_dist/media-upload/media-upload.js +1108 -0
  53. package/miniprogram_dist/media-upload/media-upload.json +7 -0
  54. package/miniprogram_dist/media-upload/media-upload.wxml +98 -0
  55. package/miniprogram_dist/media-upload/media-upload.wxss +149 -0
  56. package/miniprogram_dist/navbar/navbar.js +191 -0
  57. package/miniprogram_dist/navbar/navbar.json +6 -0
  58. package/miniprogram_dist/navbar/navbar.wxml +25 -0
  59. package/miniprogram_dist/navbar/navbar.wxss +60 -0
  60. package/miniprogram_dist/notify/notify.js +342 -0
  61. package/miniprogram_dist/notify/notify.json +5 -0
  62. package/miniprogram_dist/notify/notify.wxml +27 -0
  63. package/miniprogram_dist/notify/notify.wxss +246 -0
  64. package/miniprogram_dist/notify/service.js +69 -0
  65. package/miniprogram_dist/oss-upload/oss-upload.js +505 -0
  66. package/miniprogram_dist/oss-upload/oss-upload.json +6 -0
  67. package/miniprogram_dist/oss-upload/oss-upload.wxml +20 -0
  68. package/miniprogram_dist/oss-upload/oss-upload.wxss +5 -0
  69. package/miniprogram_dist/popup/popup.js +36 -0
  70. package/miniprogram_dist/popup/popup.json +5 -0
  71. package/miniprogram_dist/popup/popup.wxml +14 -0
  72. package/miniprogram_dist/popup/popup.wxss +138 -0
  73. package/miniprogram_dist/popup-page/popup-page.js +341 -0
  74. package/miniprogram_dist/popup-page/popup-page.json +8 -0
  75. package/miniprogram_dist/popup-page/popup-page.wxml +65 -0
  76. package/miniprogram_dist/popup-page/popup-page.wxss +92 -0
  77. package/miniprogram_dist/progress/progress.js +161 -0
  78. package/miniprogram_dist/progress/progress.json +5 -0
  79. package/miniprogram_dist/progress/progress.wxml +16 -0
  80. package/miniprogram_dist/progress/progress.wxss +81 -0
  81. package/miniprogram_dist/rate/rate.js +127 -0
  82. package/miniprogram_dist/rate/rate.json +5 -0
  83. package/miniprogram_dist/rate/rate.wxml +32 -0
  84. package/miniprogram_dist/rate/rate.wxs +21 -0
  85. package/miniprogram_dist/rate/rate.wxss +126 -0
  86. package/miniprogram_dist/stepper/stepper.js +153 -0
  87. package/miniprogram_dist/stepper/stepper.json +5 -0
  88. package/miniprogram_dist/stepper/stepper.wxml +19 -0
  89. package/miniprogram_dist/stepper/stepper.wxss +66 -0
  90. package/miniprogram_dist/switch/switch.js +29 -0
  91. package/miniprogram_dist/switch/switch.json +3 -0
  92. package/miniprogram_dist/switch/switch.wxml +10 -0
  93. package/miniprogram_dist/switch/switch.wxss +71 -0
  94. package/miniprogram_dist/textarea/textarea.js +83 -0
  95. package/miniprogram_dist/textarea/textarea.json +5 -0
  96. package/miniprogram_dist/textarea/textarea.wxml +14 -0
  97. package/miniprogram_dist/textarea/textarea.wxss +33 -0
  98. package/miniprogram_dist/theme/theme.wxss +64 -0
  99. package/miniprogram_dist/toast/toast.js +51 -0
  100. package/miniprogram_dist/toast/toast.json +5 -0
  101. package/miniprogram_dist/toast/toast.wxml +13 -0
  102. package/miniprogram_dist/toast/toast.wxss +143 -0
  103. package/miniprogram_dist/upload/upload.js +276 -0
  104. package/miniprogram_dist/upload/upload.json +3 -0
  105. package/miniprogram_dist/upload/upload.wxml +36 -0
  106. package/miniprogram_dist/upload/upload.wxss +136 -0
  107. package/miniprogram_dist/utils/class.js +37 -0
  108. package/miniprogram_dist/utils/device.js +67 -0
  109. package/miniprogram_dist/utils/dom.js +51 -0
  110. package/miniprogram_dist/utils/event.js +28 -0
  111. package/miniprogram_dist/utils/form.js +39 -0
  112. package/miniprogram_dist/utils/function.js +63 -0
  113. package/miniprogram_dist/utils/index.js +21 -0
  114. package/miniprogram_dist/utils/props.js +51 -0
  115. package/miniprogram_dist/utils/style.js +52 -0
  116. package/miniprogram_dist/utils/theme.js +30 -0
  117. package/package.json +31 -0
@@ -0,0 +1,265 @@
1
+ .mo-calendar {
2
+ box-sizing: border-box;
3
+ display: flex;
4
+ flex-direction: column;
5
+ height: 100%;
6
+ min-height: 0;
7
+ background-color: var(--mo-color-background-surface, #FFFFFF);
8
+ }
9
+
10
+ .mo-calendar__header {
11
+ box-sizing: border-box;
12
+ display: flex;
13
+ flex: none;
14
+ flex-direction: row;
15
+ align-items: center;
16
+ justify-content: space-between;
17
+ height: 120rpx;
18
+ padding: 0 23rpx 0 38rpx;
19
+ background-color: var(--mo-color-background-surface, #FFFFFF);
20
+ }
21
+
22
+ .mo-calendar__header-side,
23
+ .mo-calendar__close {
24
+ flex: none;
25
+ width: 48rpx;
26
+ height: 48rpx;
27
+ }
28
+
29
+ .mo-calendar__title {
30
+ flex: 1;
31
+ color: var(--mo-color-text-primary, #111111);
32
+ font-size: var(--mo-font-size-title-2, 36rpx);
33
+ font-weight: var(--mo-font-weight-semibold, 600);
34
+ line-height: var(--mo-line-height-title-2, 50rpx);
35
+ text-align: center;
36
+ }
37
+
38
+ .mo-calendar__close {
39
+ display: flex;
40
+ align-items: center;
41
+ justify-content: center;
42
+ position: relative;
43
+ }
44
+
45
+ .mo-calendar__week {
46
+ display: flex;
47
+ flex: none;
48
+ flex-direction: row;
49
+ align-items: center;
50
+ height: 72rpx;
51
+ background-color: var(--mo-color-background-surface, #FFFFFF);
52
+ }
53
+
54
+ .mo-calendar__week-text {
55
+ flex: 1;
56
+ color: var(--mo-color-text-tertiary, #999999);
57
+ font-size: 26rpx;
58
+ font-weight: 500;
59
+ line-height: 36rpx;
60
+ text-align: center;
61
+ }
62
+
63
+ .mo-calendar__month-scroll {
64
+ flex: 1;
65
+ height: 0;
66
+ min-height: 0;
67
+ }
68
+
69
+ .mo-calendar__months {
70
+ display: flex;
71
+ min-height: 0;
72
+ flex-direction: column;
73
+ }
74
+
75
+ .mo-calendar__month {
76
+ display: flex;
77
+ flex-direction: column;
78
+ }
79
+
80
+ .mo-calendar__month:last-child {
81
+ margin-bottom: 0;
82
+ }
83
+
84
+ .mo-calendar__month-header {
85
+ box-sizing: border-box;
86
+ display: flex;
87
+ flex: none;
88
+ align-items: center;
89
+ justify-content: center;
90
+ height: 94rpx;
91
+ background-color: var(--mo-color-background-subtle, #FAFAFA);
92
+ }
93
+
94
+ .mo-calendar__month-title {
95
+ display: block;
96
+ color: var(--mo-color-text-primary, #111111);
97
+ font-size: var(--mo-font-size-title-2, 36rpx);
98
+ font-weight: var(--mo-font-weight-semibold, 600);
99
+ line-height: var(--mo-line-height-title-2, 50rpx);
100
+ text-align: center;
101
+ }
102
+
103
+ .mo-calendar__days {
104
+ display: flex;
105
+ flex-wrap: wrap;
106
+ padding: 24rpx 25rpx 26rpx;
107
+ background-color: var(--mo-color-background-surface, #FFFFFF);
108
+ }
109
+
110
+ .mo-calendar__day {
111
+ box-sizing: border-box;
112
+ display: flex;
113
+ align-items: center;
114
+ justify-content: center;
115
+ position: relative;
116
+ width: 14.285714%;
117
+ height: 112rpx;
118
+ color: var(--mo-color-text-primary, #111111);
119
+ }
120
+
121
+ .mo-calendar__day.is-empty {
122
+ pointer-events: none;
123
+ }
124
+
125
+ .mo-calendar__day.is-disabled {
126
+ color: var(--mo-color-text-disabled, #CCCCCC);
127
+ }
128
+
129
+ .mo-calendar__day-content {
130
+ box-sizing: border-box;
131
+ display: flex;
132
+ flex-direction: column;
133
+ align-items: center;
134
+ justify-content: center;
135
+ width: 88rpx;
136
+ height: 88rpx;
137
+ border-radius: var(--mo-radius-pill, 999rpx);
138
+ }
139
+
140
+ .mo-calendar__day-content.is-selected {
141
+ background-color: var(--mo-color-text-primary, #111111);
142
+ }
143
+
144
+ .mo-calendar__day-content.is-today:not(.is-selected):not(.is-disabled) .mo-calendar__day-number {
145
+ color: var(--mo-color-brand-primary, #FECBE7);
146
+ }
147
+
148
+ .mo-calendar__day-number {
149
+ color: var(--mo-color-text-primary, #111111);
150
+ font-size: var(--mo-font-size-title-4, 28rpx);
151
+ font-weight: var(--mo-font-weight-medium, 500);
152
+ line-height: 37rpx;
153
+ }
154
+
155
+ .mo-calendar__day-badge {
156
+ box-sizing: border-box;
157
+ position: absolute;
158
+ top: 12rpx;
159
+ right: 6rpx;
160
+ min-width: 26rpx;
161
+ height: 25rpx;
162
+ padding: 0 4rpx;
163
+ border-radius: 6rpx;
164
+ background-color: var(--mo-color-background-subtle, #FAFAFA);
165
+ color: var(--mo-color-text-tertiary, #999999);
166
+ font-size: 18rpx;
167
+ line-height: 25rpx;
168
+ text-align: center;
169
+ z-index: 1;
170
+ }
171
+
172
+ .mo-calendar__day-sub {
173
+ display: block;
174
+ max-width: 100%;
175
+ color: var(--mo-color-text-amount, #FF3E7A);
176
+ font-size: var(--mo-font-size-caption, 20rpx);
177
+ font-weight: var(--mo-font-weight-regular, 400);
178
+ line-height: 27rpx;
179
+ text-align: center;
180
+ }
181
+
182
+ .mo-calendar__day-content.is-disabled .mo-calendar__day-number {
183
+ color: var(--mo-color-text-disabled, #CCCCCC);
184
+ }
185
+
186
+ .mo-calendar__day-content.is-selected .mo-calendar__day-number {
187
+ color: var(--mo-color-text-inverse, #FFFFFF);
188
+ }
189
+
190
+ .mo-calendar__day-content.is-disabled .mo-calendar__day-sub {
191
+ color: var(--mo-color-text-disabled, #CCCCCC);
192
+ }
193
+
194
+ .mo-calendar__day-content.is-selected .mo-calendar__day-sub {
195
+ color: rgba(255, 255, 255, 0.8);
196
+ }
197
+
198
+ .mo-calendar__tags {
199
+ display: flex;
200
+ flex: none;
201
+ flex-direction: column;
202
+ padding: 60rpx 38rpx 42rpx;
203
+ border-top: 1rpx solid rgba(0, 0, 0, 0.04);
204
+ background-color: var(--mo-color-background-surface, #FFFFFF);
205
+ }
206
+
207
+ .mo-calendar__tag-title {
208
+ display: block;
209
+ margin-bottom: 26rpx;
210
+ color: var(--mo-color-text-primary, #111111);
211
+ font-size: var(--mo-font-size-title-3, 34rpx);
212
+ font-weight: var(--mo-font-weight-semibold, 600);
213
+ line-height: var(--mo-line-height-title-3, 48rpx);
214
+ }
215
+
216
+ .mo-calendar__tag-scroll {
217
+ width: 100%;
218
+ white-space: nowrap;
219
+ height: 60rpx;
220
+ }
221
+
222
+ .mo-calendar__tag-list {
223
+ display: flex;
224
+ flex-direction: row;
225
+ align-items: center;
226
+ height: 100%;
227
+ }
228
+
229
+ .mo-calendar__tag {
230
+ box-sizing: border-box;
231
+ display: flex;
232
+ flex: none;
233
+ flex-direction: row;
234
+ align-items: center;
235
+ justify-content: center;
236
+ min-width: 103rpx;
237
+ height: 60rpx;
238
+ margin-right: 24rpx;
239
+ padding: 0 24rpx;
240
+ border-radius: 12rpx;
241
+ background-color: var(--mo-color-background-subtle, #FAFAFA);
242
+ }
243
+
244
+ .mo-calendar__tag:last-child {
245
+ margin-right: 0;
246
+ }
247
+
248
+ .mo-calendar__tag.is-selected {
249
+ background-color: var(--mo-color-text-primary, #111111);
250
+ }
251
+
252
+ .mo-calendar__tag-label {
253
+ color: var(--mo-color-text-primary, #111111);
254
+ font-size: var(--mo-font-size-body, 24rpx);
255
+ font-weight: var(--mo-font-weight-regular, 400);
256
+ line-height: var(--mo-line-height-body, 34rpx);
257
+ }
258
+
259
+ .mo-calendar__tag.is-selected .mo-calendar__tag-label {
260
+ color: var(--mo-color-text-inverse, #FFFFFF);
261
+ }
262
+
263
+ .mo-calendar__tag.is-disabled .mo-calendar__tag-label {
264
+ color: var(--mo-color-text-disabled, #CCCCCC);
265
+ }
@@ -0,0 +1,22 @@
1
+ Component({
2
+ properties: {
3
+ title: {
4
+ type: String,
5
+ value: ""
6
+ },
7
+ desc: {
8
+ type: String,
9
+ value: ""
10
+ },
11
+ clickable: {
12
+ type: Boolean,
13
+ value: false
14
+ }
15
+ },
16
+ methods: {
17
+ handleClick(event) {
18
+ if (!this.data.clickable) return;
19
+ this.triggerEvent("click", event.detail);
20
+ }
21
+ }
22
+ });
@@ -0,0 +1,5 @@
1
+ {
2
+ "component": true,
3
+ "styleIsolation": "apply-shared",
4
+ "usingComponents": {}
5
+ }
@@ -0,0 +1,9 @@
1
+ <view class="mo-card {{clickable ? 'is-clickable' : ''}}" bindtap="handleClick">
2
+ <view wx:if="{{title || desc}}" class="mo-card__header">
3
+ <text wx:if="{{title}}" class="mo-card__title">{{title}}</text>
4
+ <text wx:if="{{desc}}" class="mo-card__desc">{{desc}}</text>
5
+ </view>
6
+ <view class="mo-card__body">
7
+ <slot></slot>
8
+ </view>
9
+ </view>
@@ -0,0 +1,34 @@
1
+ .mo-card {
2
+ padding: 24rpx;
3
+ border-radius: 16rpx;
4
+ background: var(--mo-color-background-surface, #FFFFFF);
5
+ box-shadow: 0 2rpx 8rpx rgba(31, 35, 41, 0.08);
6
+ }
7
+
8
+ .mo-card.is-clickable {
9
+ transition: opacity 120ms ease;
10
+ }
11
+
12
+ .mo-card.is-clickable:active {
13
+ opacity: 0.78;
14
+ }
15
+
16
+ .mo-card__header {
17
+ display: flex;
18
+ flex-direction: column;
19
+ gap: 8rpx;
20
+ margin-bottom: 16rpx;
21
+ }
22
+
23
+ .mo-card__title {
24
+ color: var(--mo-color-text-primary, #111111);
25
+ font-size: 32rpx;
26
+ font-weight: 600;
27
+ line-height: 46rpx;
28
+ }
29
+
30
+ .mo-card__desc {
31
+ color: var(--mo-color-text-secondary, #666666);
32
+ font-size: 26rpx;
33
+ line-height: 36rpx;
34
+ }
@@ -0,0 +1,213 @@
1
+ const SECOND = 1000;
2
+ const MINUTE = 60 * SECOND;
3
+ const HOUR = 60 * MINUTE;
4
+ const DAY = 24 * HOUR;
5
+
6
+ function normalizeTime(time) {
7
+ const value = Number(time);
8
+ if (!Number.isFinite(value) || value <= 0) return 0;
9
+ return Math.floor(value);
10
+ }
11
+
12
+ function hasToken(format, token) {
13
+ return String(format || "").indexOf(token) !== -1;
14
+ }
15
+
16
+ function padNumber(value) {
17
+ const normalized = Math.max(0, Math.floor(Number(value) || 0));
18
+ return normalized < 10 ? `0${normalized}` : String(normalized);
19
+ }
20
+
21
+ function getParts(time, format) {
22
+ const normalizedTime = normalizeTime(time);
23
+ const showDays = hasToken(format, "DD");
24
+ const showHours = hasToken(format, "HH");
25
+ const showMinutes = hasToken(format, "mm");
26
+ const showSeconds = hasToken(format, "ss");
27
+ const totalSeconds = Math.ceil(normalizedTime / SECOND);
28
+ const days = Math.floor(totalSeconds / 86400);
29
+ const hours = showDays ? Math.floor((totalSeconds % 86400) / 3600) : Math.floor(totalSeconds / 3600);
30
+ const minutes = showHours ? Math.floor((totalSeconds % 3600) / 60) : Math.floor(totalSeconds / 60);
31
+ const seconds = showMinutes || showHours || showDays ? totalSeconds % 60 : totalSeconds;
32
+
33
+ return {
34
+ time: normalizedTime,
35
+ days: showDays ? days : 0,
36
+ hours: showHours ? hours : 0,
37
+ minutes: showMinutes ? minutes : 0,
38
+ seconds: showSeconds ? seconds : 0
39
+ };
40
+ }
41
+
42
+ function createItems(parts, format) {
43
+ const showDays = hasToken(format, "DD");
44
+ const showHours = hasToken(format, "HH");
45
+ const showMinutes = hasToken(format, "mm");
46
+ const showSeconds = hasToken(format, "ss");
47
+ const items = [];
48
+ let hasTimeSegment = false;
49
+
50
+ if (showDays) {
51
+ items.push({
52
+ key: "days",
53
+ value: padNumber(parts.days),
54
+ unit: "天",
55
+ prefix: ""
56
+ });
57
+ }
58
+
59
+ if (showHours) {
60
+ items.push({
61
+ key: "hours",
62
+ value: padNumber(parts.hours),
63
+ unit: "",
64
+ prefix: ""
65
+ });
66
+ hasTimeSegment = true;
67
+ }
68
+
69
+ if (showMinutes) {
70
+ items.push({
71
+ key: "minutes",
72
+ value: padNumber(parts.minutes),
73
+ unit: "",
74
+ prefix: hasTimeSegment ? ":" : ""
75
+ });
76
+ hasTimeSegment = true;
77
+ }
78
+
79
+ if (showSeconds) {
80
+ items.push({
81
+ key: "seconds",
82
+ value: padNumber(parts.seconds),
83
+ unit: "",
84
+ prefix: hasTimeSegment ? ":" : ""
85
+ });
86
+ }
87
+
88
+ if (!items.length) {
89
+ items.push({
90
+ key: "seconds",
91
+ value: "00",
92
+ unit: "",
93
+ prefix: ""
94
+ });
95
+ }
96
+
97
+ return items;
98
+ }
99
+
100
+ Component({
101
+ options: {
102
+ styleIsolation: "apply-shared"
103
+ },
104
+ properties: {
105
+ time: {
106
+ type: Number,
107
+ value: 0,
108
+ observer: "handleTimeChange"
109
+ },
110
+ format: {
111
+ type: String,
112
+ value: "DD:HH:mm:ss",
113
+ observer: "renderCurrent"
114
+ },
115
+ customClass: {
116
+ type: String,
117
+ value: ""
118
+ }
119
+ },
120
+ data: {
121
+ items: createItems(getParts(0, "DD:HH:mm:ss"), "DD:HH:mm:ss"),
122
+ remainingTime: 0,
123
+ isFinished: true
124
+ },
125
+ lifetimes: {
126
+ attached() {
127
+ this.pageHidden = false;
128
+ this.resetCountdown(this.data.time);
129
+ },
130
+ detached() {
131
+ this.clearTimer();
132
+ }
133
+ },
134
+ pageLifetimes: {
135
+ hide() {
136
+ this.pageHidden = true;
137
+ this.clearTimer();
138
+ },
139
+ show() {
140
+ this.pageHidden = false;
141
+ if (!this.endTime || this.finishedEmitted) return;
142
+ this.tick();
143
+ }
144
+ },
145
+ methods: {
146
+ handleTimeChange(time) {
147
+ this.resetCountdown(time);
148
+ },
149
+ clearTimer() {
150
+ if (!this.timer) return;
151
+ clearTimeout(this.timer);
152
+ this.timer = null;
153
+ },
154
+ resetCountdown(time) {
155
+ const normalizedTime = normalizeTime(time);
156
+
157
+ this.clearTimer();
158
+
159
+ if (normalizedTime <= 0) {
160
+ this.endTime = 0;
161
+ this.finishedEmitted = true;
162
+ this.renderRemaining(0);
163
+ return;
164
+ }
165
+
166
+ this.endTime = Date.now() + normalizedTime;
167
+ this.finishedEmitted = false;
168
+
169
+ if (this.pageHidden) {
170
+ this.renderRemaining(normalizedTime);
171
+ return;
172
+ }
173
+
174
+ this.tick();
175
+ },
176
+ renderCurrent() {
177
+ const remainingTime = this.endTime ? Math.max(0, this.endTime - Date.now()) : normalizeTime(this.data.time);
178
+ this.renderRemaining(remainingTime);
179
+ },
180
+ renderRemaining(time) {
181
+ const remainingTime = normalizeTime(time);
182
+ const parts = getParts(remainingTime, this.data.format);
183
+
184
+ this.setData({
185
+ items: createItems(parts, this.data.format),
186
+ remainingTime: parts.time,
187
+ isFinished: parts.time <= 0
188
+ });
189
+
190
+ return parts;
191
+ },
192
+ tick() {
193
+ this.clearTimer();
194
+
195
+ const remainingTime = this.endTime ? Math.max(0, this.endTime - Date.now()) : 0;
196
+ const detail = this.renderRemaining(remainingTime);
197
+
198
+ if (remainingTime <= 0) {
199
+ if (!this.finishedEmitted) {
200
+ this.finishedEmitted = true;
201
+ this.triggerEvent("change", detail);
202
+ this.triggerEvent("finish", detail);
203
+ }
204
+ return;
205
+ }
206
+
207
+ this.triggerEvent("change", detail);
208
+ this.timer = setTimeout(() => {
209
+ this.tick();
210
+ }, SECOND);
211
+ }
212
+ }
213
+ });
@@ -0,0 +1,3 @@
1
+ {
2
+ "component": true
3
+ }
@@ -0,0 +1,9 @@
1
+ <view class="mo-countdown {{customClass}} {{isFinished ? 'is-finished' : ''}}">
2
+ <block wx:for="{{items}}" wx:key="key">
3
+ <text wx:if="{{item.prefix}}" class="mo-countdown__separator">{{item.prefix}}</text>
4
+ <view class="mo-countdown__item mo-countdown__item--{{item.key}}">
5
+ <text class="mo-countdown__value">{{item.value}}</text>
6
+ <text wx:if="{{item.unit}}" class="mo-countdown__unit">{{item.unit}}</text>
7
+ </view>
8
+ </block>
9
+ </view>
@@ -0,0 +1,33 @@
1
+ .mo-countdown {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ color: var(--mo-color-text-primary, #111111);
5
+ font-size: inherit;
6
+ font-weight: inherit;
7
+ line-height: inherit;
8
+ vertical-align: middle;
9
+ }
10
+
11
+ .mo-countdown__item {
12
+ display: inline-flex;
13
+ align-items: center;
14
+ }
15
+
16
+ .mo-countdown__value {
17
+ font-size: inherit;
18
+ font-weight: inherit;
19
+ line-height: inherit;
20
+ }
21
+
22
+ .mo-countdown__unit {
23
+ margin-left: 4rpx;
24
+ font-size: inherit;
25
+ font-weight: inherit;
26
+ line-height: inherit;
27
+ }
28
+
29
+ .mo-countdown__separator {
30
+ font-size: inherit;
31
+ font-weight: inherit;
32
+ line-height: inherit;
33
+ }
@@ -0,0 +1,12 @@
1
+ Component({
2
+ properties: {
3
+ title: {
4
+ type: String,
5
+ value: ""
6
+ },
7
+ desc: {
8
+ type: String,
9
+ value: ""
10
+ }
11
+ }
12
+ });
@@ -0,0 +1,5 @@
1
+ {
2
+ "component": true,
3
+ "styleIsolation": "apply-shared",
4
+ "usingComponents": {}
5
+ }
@@ -0,0 +1,12 @@
1
+ <view class="mo-form">
2
+ <view wx:if="{{title || desc}}" class="mo-form__header">
3
+ <text wx:if="{{title}}" class="mo-form__title">{{title}}</text>
4
+ <text wx:if="{{desc}}" class="mo-form__desc">{{desc}}</text>
5
+ </view>
6
+ <view class="mo-form__body">
7
+ <slot></slot>
8
+ </view>
9
+ <view class="mo-form__actions">
10
+ <slot name="actions"></slot>
11
+ </view>
12
+ </view>
@@ -0,0 +1,35 @@
1
+ .mo-form {
2
+ padding: 24rpx;
3
+ border-radius: 16rpx;
4
+ background: var(--mo-color-background-surface, #FFFFFF);
5
+ }
6
+
7
+ .mo-form__header {
8
+ display: flex;
9
+ flex-direction: column;
10
+ gap: 8rpx;
11
+ margin-bottom: 24rpx;
12
+ }
13
+
14
+ .mo-form__title {
15
+ color: var(--mo-color-text-primary, #111111);
16
+ font-size: 32rpx;
17
+ font-weight: 600;
18
+ line-height: 46rpx;
19
+ }
20
+
21
+ .mo-form__desc {
22
+ color: var(--mo-color-text-secondary, #666666);
23
+ font-size: 26rpx;
24
+ line-height: 36rpx;
25
+ }
26
+
27
+ .mo-form__body {
28
+ display: flex;
29
+ flex-direction: column;
30
+ gap: 16rpx;
31
+ }
32
+
33
+ .mo-form__actions {
34
+ margin-top: 24rpx;
35
+ }