stellar-ui-plus 1.24.26 → 1.25.0
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.
- package/components/ste-app-update/method.ts +1 -0
- package/components/ste-app-update/props.ts +11 -11
- package/components/ste-app-update/ste-app-update.vue +2 -7
- package/components/ste-radio/README.md +1 -1
- package/components/ste-radio/ste-radio.vue +2 -7
- package/components/ste-radio-group/ste-radio-group.vue +2 -1
- package/components/ste-select-seat/ATTRIBUTES.md +18 -0
- package/components/ste-select-seat/README.md +280 -0
- package/components/ste-select-seat/canvasUtils.ts +42 -0
- package/components/ste-select-seat/config.json +5 -0
- package/components/ste-select-seat/internals/gridUtils.ts +23 -0
- package/components/ste-select-seat/internals/seatLayout.ts +169 -0
- package/components/ste-select-seat/internals/useSeatInteraction.ts +540 -0
- package/components/ste-select-seat/props.ts +37 -0
- package/components/ste-select-seat/ste-select-seat.easycom.json +62 -0
- package/components/ste-select-seat/ste-select-seat.vue +517 -0
- package/components/ste-select-seat/types.d.ts +33 -0
- package/components/ste-select-seat/useData.ts +179 -0
- package/components/ste-select-seat/useTouchCompat.ts +89 -0
- package/components/ste-simple-calendar/ATTRIBUTES.md +17 -0
- package/components/ste-simple-calendar/README.md +112 -0
- package/components/ste-simple-calendar/config.json +5 -0
- package/components/ste-simple-calendar/props.ts +32 -0
- package/components/ste-simple-calendar/ste-simple-calendar.easycom.json +60 -0
- package/components/ste-simple-calendar/ste-simple-calendar.vue +265 -0
- package/components/ste-simple-calendar/type.d.ts +30 -0
- package/components/ste-simple-calendar/useData.ts +60 -0
- package/components/ste-skeleton/ATTRIBUTES.md +7 -0
- package/components/ste-skeleton/README.md +82 -0
- package/components/ste-skeleton/config.json +5 -0
- package/components/ste-skeleton/props.ts +7 -0
- package/components/ste-skeleton/ste-skeleton.easycom.json +38 -0
- package/components/ste-skeleton/ste-skeleton.vue +90 -0
- package/components/ste-slide-verify/ATTRIBUTES.md +27 -0
- package/components/ste-slide-verify/README.md +118 -0
- package/components/ste-slide-verify/config.json +5 -0
- package/components/ste-slide-verify/props.ts +43 -0
- package/components/ste-slide-verify/ste-slide-verify.easycom.json +119 -0
- package/components/ste-slide-verify/ste-slide-verify.vue +535 -0
- package/index.ts +8 -0
- package/package.json +1 -1
- package/types/components.d.ts +8 -0
- package/types/index.d.ts +2 -0
- package/types/refComponents.d.ts +8 -0
|
@@ -0,0 +1,535 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed, getCurrentInstance, nextTick, onBeforeUnmount, onMounted, ref, watch, type ComponentPublicInstance, type CSSProperties } from 'vue';
|
|
3
|
+
import { useColorStore } from '../../store/color';
|
|
4
|
+
import utils from '../../utils/utils';
|
|
5
|
+
import propsData, { slideVerifyEmits, type SlideVerifyDetail } from './props';
|
|
6
|
+
|
|
7
|
+
const componentName = `ste-slide-verify`;
|
|
8
|
+
|
|
9
|
+
defineOptions({
|
|
10
|
+
name: componentName,
|
|
11
|
+
options: {
|
|
12
|
+
virtualHost: true,
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
const props = defineProps(propsData);
|
|
17
|
+
const emits = defineEmits(slideVerifyEmits);
|
|
18
|
+
|
|
19
|
+
const { getColor } = useColorStore();
|
|
20
|
+
const themeColor = getColor()?.steThemeColor || '#0090FF';
|
|
21
|
+
const instance = getCurrentInstance() as unknown as ComponentPublicInstance;
|
|
22
|
+
|
|
23
|
+
const isDragging = ref(false);
|
|
24
|
+
const isSuccess = ref(false);
|
|
25
|
+
const isFail = ref(false);
|
|
26
|
+
const trackWidth = ref(0);
|
|
27
|
+
const sliderLeft = ref(0);
|
|
28
|
+
const startX = ref(0);
|
|
29
|
+
const startLeft = ref(0);
|
|
30
|
+
const imageSuccessProgress = ref(1);
|
|
31
|
+
const currentAngle = ref(0);
|
|
32
|
+
const disableImageTransition = ref(false);
|
|
33
|
+
|
|
34
|
+
let failTimer: ReturnType<typeof setTimeout> | null = null;
|
|
35
|
+
|
|
36
|
+
const sliderSizePx = computed(() => {
|
|
37
|
+
const size = Number(utils.formatPx(props.size, 'num'));
|
|
38
|
+
return Number.isNaN(size) ? 0 : size;
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const maxSliderLeft = computed(() => {
|
|
42
|
+
const max = trackWidth.value - sliderSizePx.value;
|
|
43
|
+
return max > 0 ? max : 0;
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const progress = computed(() => {
|
|
47
|
+
if (!maxSliderLeft.value) return 0;
|
|
48
|
+
return sliderLeft.value / maxSliderLeft.value;
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const currentText = computed(() => {
|
|
52
|
+
if (isSuccess.value) return props.successText;
|
|
53
|
+
if (isFail.value) return props.failText;
|
|
54
|
+
if (props.text) return props.text;
|
|
55
|
+
return props.mode === 'image' ? '向右滑动转动图片' : '向右滑动验证';
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const sliderIconColor = computed(() => {
|
|
59
|
+
if (isSuccess.value || isFail.value) return '#ffffff';
|
|
60
|
+
return activeVisualColor.value;
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const activeColor = computed(() => {
|
|
64
|
+
return props.activeColor || themeColor;
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const activeVisualColor = computed(() => {
|
|
68
|
+
const match = String(activeColor.value).match(/(#[0-9a-fA-F]{3,8}|rgba?\([^)]+\))/);
|
|
69
|
+
return match ? match[1] : themeColor;
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const inactiveColor = computed(() => {
|
|
73
|
+
return props.inactiveColor || '#f4f4f5';
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const sliderBorderColor = computed(() => {
|
|
77
|
+
return isDragging.value ? utils.Color.formatColor(activeVisualColor.value, 0.12) : 'transparent';
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const textColor = computed(() => {
|
|
81
|
+
if (isSuccess.value) return props.successColor;
|
|
82
|
+
if (isFail.value) return props.failColor;
|
|
83
|
+
return isDragging.value ? activeVisualColor.value : '#5f6b7a';
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
const rootClass = computed(() => {
|
|
87
|
+
let className = '';
|
|
88
|
+
if (isDragging.value) className += ' ste-slide-verify-dragging';
|
|
89
|
+
if (isSuccess.value) className += ' ste-slide-verify-success';
|
|
90
|
+
if (isFail.value) className += ' ste-slide-verify-fail';
|
|
91
|
+
if (props.disabled) className += ' ste-slide-verify-disabled';
|
|
92
|
+
if (props.mode === 'image') className += ' ste-slide-verify-image-mode';
|
|
93
|
+
return className;
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
const rootStyle = computed(() => {
|
|
97
|
+
return {
|
|
98
|
+
'--slide-verify-size': utils.addUnit(props.size),
|
|
99
|
+
'--slide-verify-active-color': activeColor.value,
|
|
100
|
+
'--slide-verify-inactive-color': inactiveColor.value,
|
|
101
|
+
'--slide-verify-success-color': props.successColor,
|
|
102
|
+
'--slide-verify-fail-color': props.failColor,
|
|
103
|
+
'--slide-verify-text-color': textColor.value,
|
|
104
|
+
};
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
const trackStyle = computed(() => {
|
|
108
|
+
const style: CSSProperties = {
|
|
109
|
+
height: utils.addUnit(props.size),
|
|
110
|
+
background: inactiveColor.value,
|
|
111
|
+
};
|
|
112
|
+
return style;
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
const progressStyle = computed(() => {
|
|
116
|
+
const style: CSSProperties = {
|
|
117
|
+
width: `${Math.min(trackWidth.value, sliderLeft.value + sliderSizePx.value / 2)}px`,
|
|
118
|
+
opacity: isSuccess.value || isFail.value ? 0.28 : isDragging.value ? 0.22 : 0.16,
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
if (isSuccess.value) {
|
|
122
|
+
style.background = props.successColor;
|
|
123
|
+
} else if (isFail.value) {
|
|
124
|
+
style.background = props.failColor;
|
|
125
|
+
} else {
|
|
126
|
+
style.background = activeVisualColor.value;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return style;
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
const sliderStyle = computed(() => {
|
|
133
|
+
const style: CSSProperties = {
|
|
134
|
+
width: `${sliderSizePx.value}px`,
|
|
135
|
+
height: utils.addUnit(props.size),
|
|
136
|
+
left: `${sliderLeft.value}px`,
|
|
137
|
+
background: '#ffffff',
|
|
138
|
+
borderColor: sliderBorderColor.value,
|
|
139
|
+
color: sliderIconColor.value,
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
if (isSuccess.value) {
|
|
143
|
+
style.background = props.successColor;
|
|
144
|
+
style.borderColor = props.successColor;
|
|
145
|
+
style.color = '#ffffff';
|
|
146
|
+
} else if (isFail.value) {
|
|
147
|
+
style.background = props.failColor;
|
|
148
|
+
style.borderColor = props.failColor;
|
|
149
|
+
style.color = '#ffffff';
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return style;
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
const textStyle = computed(() => {
|
|
156
|
+
return {} as CSSProperties;
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
const imageStyle = computed(() => {
|
|
160
|
+
return {
|
|
161
|
+
width: utils.addUnit(props.imageSize),
|
|
162
|
+
height: utils.addUnit(props.imageSize),
|
|
163
|
+
transform: `rotate(${currentAngle.value}deg)`,
|
|
164
|
+
transition: disableImageTransition.value ? 'none' : undefined,
|
|
165
|
+
};
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
function setImageAngle(angle: number, immediate = false) {
|
|
169
|
+
if (!immediate) {
|
|
170
|
+
currentAngle.value = angle;
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
disableImageTransition.value = true;
|
|
175
|
+
currentAngle.value = angle;
|
|
176
|
+
|
|
177
|
+
nextTick(() => {
|
|
178
|
+
setTimeout(() => {
|
|
179
|
+
disableImageTransition.value = false;
|
|
180
|
+
}, 0);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function getRandomImageSuccessProgress() {
|
|
185
|
+
return Number((Math.random() * 0.54 + 0.23).toFixed(4));
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function normalizeAngle(angle: number) {
|
|
189
|
+
const result = angle % 360;
|
|
190
|
+
return result >= 0 ? result : result + 360;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function clearFailTimer() {
|
|
194
|
+
if (failTimer) {
|
|
195
|
+
clearTimeout(failTimer);
|
|
196
|
+
failTimer = null;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function buildDetail(): SlideVerifyDetail {
|
|
201
|
+
return {
|
|
202
|
+
mode: props.mode,
|
|
203
|
+
progress: progress.value,
|
|
204
|
+
angle: normalizeAngle(currentAngle.value),
|
|
205
|
+
left: sliderLeft.value,
|
|
206
|
+
maxLeft: maxSliderLeft.value,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function getImageSuccessLeft() {
|
|
211
|
+
return Number((maxSliderLeft.value * imageSuccessProgress.value).toFixed(2));
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function setSuccessState() {
|
|
215
|
+
clearFailTimer();
|
|
216
|
+
isDragging.value = false;
|
|
217
|
+
isFail.value = false;
|
|
218
|
+
isSuccess.value = true;
|
|
219
|
+
if (props.mode === 'image') {
|
|
220
|
+
sliderLeft.value = getImageSuccessLeft();
|
|
221
|
+
setImageAngle(0, true);
|
|
222
|
+
} else {
|
|
223
|
+
sliderLeft.value = maxSliderLeft.value;
|
|
224
|
+
currentAngle.value = 0;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function setDefaultState() {
|
|
229
|
+
clearFailTimer();
|
|
230
|
+
isDragging.value = false;
|
|
231
|
+
isSuccess.value = false;
|
|
232
|
+
isFail.value = false;
|
|
233
|
+
sliderLeft.value = 0;
|
|
234
|
+
startLeft.value = 0;
|
|
235
|
+
startX.value = 0;
|
|
236
|
+
if (props.mode === 'image') {
|
|
237
|
+
imageSuccessProgress.value = getRandomImageSuccessProgress();
|
|
238
|
+
setImageAngle(Number((imageSuccessProgress.value * 360).toFixed(2)), true);
|
|
239
|
+
} else {
|
|
240
|
+
imageSuccessProgress.value = 1;
|
|
241
|
+
currentAngle.value = 0;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function syncModelValue(value: boolean) {
|
|
246
|
+
if (value) {
|
|
247
|
+
setSuccessState();
|
|
248
|
+
} else if (!isDragging.value) {
|
|
249
|
+
setDefaultState();
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
async function init() {
|
|
254
|
+
await nextTick();
|
|
255
|
+
const rect = await utils.querySelector<false>('.ste-slide-verify-track', instance);
|
|
256
|
+
trackWidth.value = rect?.width || 0;
|
|
257
|
+
syncModelValue(props.modelValue);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function reset() {
|
|
261
|
+
setDefaultState();
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function checkVerification() {
|
|
265
|
+
if (props.mode === 'slide') {
|
|
266
|
+
return progress.value >= 1;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const angle = normalizeAngle(currentAngle.value);
|
|
270
|
+
return angle <= props.angleThreshold || angle >= 360 - props.angleThreshold;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
function getClientX(event: TouchEvent | MouseEvent) {
|
|
274
|
+
if ('touches' in event) {
|
|
275
|
+
return event.touches[0]?.clientX ?? startX.value;
|
|
276
|
+
}
|
|
277
|
+
return event.clientX;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function updateByClientX(clientX: number) {
|
|
281
|
+
if (!maxSliderLeft.value) return;
|
|
282
|
+
let left = startLeft.value + clientX - startX.value;
|
|
283
|
+
if (left < 0) left = 0;
|
|
284
|
+
if (left > maxSliderLeft.value) left = maxSliderLeft.value;
|
|
285
|
+
|
|
286
|
+
sliderLeft.value = left;
|
|
287
|
+
|
|
288
|
+
if (props.mode === 'image') {
|
|
289
|
+
currentAngle.value = Number(normalizeAngle((imageSuccessProgress.value - progress.value) * 360).toFixed(2));
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
emits('change', buildDetail());
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function touchStart(event: TouchEvent | MouseEvent) {
|
|
296
|
+
if (props.disabled || isSuccess.value || isFail.value) return;
|
|
297
|
+
|
|
298
|
+
clearFailTimer();
|
|
299
|
+
isFail.value = false;
|
|
300
|
+
isDragging.value = true;
|
|
301
|
+
startX.value = getClientX(event);
|
|
302
|
+
startLeft.value = sliderLeft.value;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
function touchMove(event: TouchEvent | MouseEvent) {
|
|
306
|
+
if (!isDragging.value || props.disabled || isSuccess.value || isFail.value) return;
|
|
307
|
+
updateByClientX(getClientX(event));
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
function touchEnd() {
|
|
311
|
+
// #ifdef WEB
|
|
312
|
+
removeListenner();
|
|
313
|
+
// #endif
|
|
314
|
+
|
|
315
|
+
if (!isDragging.value || props.disabled || isSuccess.value || isFail.value) return;
|
|
316
|
+
|
|
317
|
+
isDragging.value = false;
|
|
318
|
+
|
|
319
|
+
const detail = buildDetail();
|
|
320
|
+
|
|
321
|
+
if (checkVerification()) {
|
|
322
|
+
setSuccessState();
|
|
323
|
+
emits('update:modelValue', true);
|
|
324
|
+
emits('success', buildDetail());
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
emits('update:modelValue', false);
|
|
329
|
+
|
|
330
|
+
if (props.showFail) {
|
|
331
|
+
isFail.value = true;
|
|
332
|
+
emits('fail', detail);
|
|
333
|
+
|
|
334
|
+
if (props.failDuration > 0) {
|
|
335
|
+
failTimer = setTimeout(() => {
|
|
336
|
+
reset();
|
|
337
|
+
}, props.failDuration);
|
|
338
|
+
}
|
|
339
|
+
} else {
|
|
340
|
+
emits('fail', detail);
|
|
341
|
+
reset();
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
function handleWindowResize() {
|
|
346
|
+
init();
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// #ifdef WEB
|
|
350
|
+
function mouseDown(event: MouseEvent) {
|
|
351
|
+
if (props.disabled || isSuccess.value || isFail.value) return;
|
|
352
|
+
touchStart(event);
|
|
353
|
+
window.addEventListener('mousemove', touchMove);
|
|
354
|
+
window.addEventListener('mouseup', touchEnd);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
function removeListenner() {
|
|
358
|
+
window.removeEventListener('mousemove', touchMove);
|
|
359
|
+
window.removeEventListener('mouseup', touchEnd);
|
|
360
|
+
}
|
|
361
|
+
// #endif
|
|
362
|
+
|
|
363
|
+
watch(
|
|
364
|
+
() => props.modelValue,
|
|
365
|
+
value => {
|
|
366
|
+
syncModelValue(value);
|
|
367
|
+
}
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
watch(
|
|
371
|
+
() => [props.mode, props.imageUrl, props.size, props.imageSize],
|
|
372
|
+
() => {
|
|
373
|
+
init();
|
|
374
|
+
}
|
|
375
|
+
);
|
|
376
|
+
|
|
377
|
+
onMounted(() => {
|
|
378
|
+
init();
|
|
379
|
+
uni.onWindowResize(handleWindowResize);
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
onBeforeUnmount(() => {
|
|
383
|
+
clearFailTimer();
|
|
384
|
+
uni.offWindowResize(handleWindowResize);
|
|
385
|
+
// #ifdef WEB
|
|
386
|
+
removeListenner();
|
|
387
|
+
// #endif
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
defineExpose({ init, reset });
|
|
391
|
+
</script>
|
|
392
|
+
|
|
393
|
+
<template>
|
|
394
|
+
<view class="ste-slide-verify-root" :class="[rootClass]" :style="[rootStyle]" data-test="slide-verify">
|
|
395
|
+
<image v-if="mode === 'image' && imageUrl" class="ste-slide-verify-image" :src="imageUrl" :style="[imageStyle]" mode="aspectFill"></image>
|
|
396
|
+
<view class="ste-slide-verify-track" :style="[trackStyle]">
|
|
397
|
+
<view class="ste-slide-verify-progress" :style="[progressStyle]"></view>
|
|
398
|
+
<view class="ste-slide-verify-text" :style="[textStyle]">
|
|
399
|
+
<ste-text>{{ currentText }}</ste-text>
|
|
400
|
+
</view>
|
|
401
|
+
<view
|
|
402
|
+
class="ste-slide-verify-slider"
|
|
403
|
+
:style="[sliderStyle]"
|
|
404
|
+
@touchstart.stop="touchStart"
|
|
405
|
+
@touchmove.stop.prevent="touchMove"
|
|
406
|
+
@touchend="touchEnd"
|
|
407
|
+
@touchcancel="touchEnd"
|
|
408
|
+
@mousedown.stop="mouseDown"
|
|
409
|
+
>
|
|
410
|
+
<view class="slider-icon">
|
|
411
|
+
<ste-icon v-if="isSuccess" code="" :size="28" color="#ffffff"></ste-icon>
|
|
412
|
+
<template v-else>
|
|
413
|
+
<view class="slider-icon-item">
|
|
414
|
+
<ste-icon code="" :size="22" :color="sliderIconColor"></ste-icon>
|
|
415
|
+
</view>
|
|
416
|
+
<view class="slider-icon-item slider-icon-item-overlap">
|
|
417
|
+
<ste-icon code="" :size="22" :color="sliderIconColor"></ste-icon>
|
|
418
|
+
</view>
|
|
419
|
+
</template>
|
|
420
|
+
</view>
|
|
421
|
+
</view>
|
|
422
|
+
</view>
|
|
423
|
+
</view>
|
|
424
|
+
</template>
|
|
425
|
+
|
|
426
|
+
<style lang="scss" scoped>
|
|
427
|
+
.ste-slide-verify-root {
|
|
428
|
+
width: 100%;
|
|
429
|
+
display: flex;
|
|
430
|
+
flex-direction: column;
|
|
431
|
+
align-items: center;
|
|
432
|
+
row-gap: 28rpx;
|
|
433
|
+
|
|
434
|
+
&.ste-slide-verify-disabled {
|
|
435
|
+
opacity: 0.6;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
.ste-slide-verify-image {
|
|
439
|
+
border-radius: 50%;
|
|
440
|
+
display: block;
|
|
441
|
+
object-fit: cover;
|
|
442
|
+
background: #ffffff;
|
|
443
|
+
box-shadow: 0 18rpx 40rpx rgba(15, 35, 95, 0.08);
|
|
444
|
+
transition: transform 0.15s linear;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
.ste-slide-verify-track {
|
|
448
|
+
width: 100%;
|
|
449
|
+
position: relative;
|
|
450
|
+
overflow: hidden;
|
|
451
|
+
border-radius: 14rpx;
|
|
452
|
+
user-select: none;
|
|
453
|
+
box-sizing: border-box;
|
|
454
|
+
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.72);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
.ste-slide-verify-progress {
|
|
458
|
+
position: absolute;
|
|
459
|
+
left: 0;
|
|
460
|
+
top: 0;
|
|
461
|
+
bottom: 0;
|
|
462
|
+
border-radius: 14rpx;
|
|
463
|
+
transition:
|
|
464
|
+
width 0.25s ease,
|
|
465
|
+
opacity 0.25s ease,
|
|
466
|
+
background-color 0.25s ease;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
.ste-slide-verify-text {
|
|
470
|
+
position: absolute;
|
|
471
|
+
inset: 0;
|
|
472
|
+
display: flex;
|
|
473
|
+
align-items: center;
|
|
474
|
+
justify-content: center;
|
|
475
|
+
padding: 0 56rpx;
|
|
476
|
+
color: var(--slide-verify-text-color);
|
|
477
|
+
font-size: 28rpx;
|
|
478
|
+
font-weight: 600;
|
|
479
|
+
letter-spacing: 0.4rpx;
|
|
480
|
+
z-index: 1;
|
|
481
|
+
pointer-events: none;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
.ste-slide-verify-slider {
|
|
485
|
+
position: absolute;
|
|
486
|
+
left: 0;
|
|
487
|
+
top: 50%;
|
|
488
|
+
transform: translateY(-50%);
|
|
489
|
+
z-index: 2;
|
|
490
|
+
border-radius: 10rpx;
|
|
491
|
+
border-width: 1px;
|
|
492
|
+
border-style: solid;
|
|
493
|
+
display: flex;
|
|
494
|
+
align-items: center;
|
|
495
|
+
justify-content: center;
|
|
496
|
+
color: var(--slide-verify-active-color);
|
|
497
|
+
transition:
|
|
498
|
+
left 0.3s ease,
|
|
499
|
+
background-color 0.3s ease,
|
|
500
|
+
border-color 0.3s ease;
|
|
501
|
+
|
|
502
|
+
.slider-icon {
|
|
503
|
+
display: flex;
|
|
504
|
+
align-items: center;
|
|
505
|
+
justify-content: center;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
.slider-icon-item {
|
|
509
|
+
display: flex;
|
|
510
|
+
align-items: center;
|
|
511
|
+
justify-content: center;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
.slider-icon-item-overlap {
|
|
515
|
+
margin-left: -14rpx;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
&.ste-slide-verify-dragging {
|
|
520
|
+
.ste-slide-verify-progress,
|
|
521
|
+
.ste-slide-verify-slider,
|
|
522
|
+
.ste-slide-verify-image {
|
|
523
|
+
transition: none;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
.ste-slide-verify-slider {
|
|
527
|
+
box-shadow: none;
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
&.ste-slide-verify-image-mode {
|
|
532
|
+
row-gap: 34rpx;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
</style>
|
package/index.ts
CHANGED
|
@@ -116,8 +116,16 @@ import steSearchBox from "./components/ste-search-box/ste-search-box.vue"
|
|
|
116
116
|
export const SteSearchBox = steSearchBox
|
|
117
117
|
import steSelect from "./components/ste-select/ste-select.vue"
|
|
118
118
|
export const SteSelect = steSelect
|
|
119
|
+
import steSelectSeat from "./components/ste-select-seat/ste-select-seat.vue"
|
|
120
|
+
export const SteSelectSeat = steSelectSeat
|
|
119
121
|
import steSignature from "./components/ste-signature/ste-signature.vue"
|
|
120
122
|
export const SteSignature = steSignature
|
|
123
|
+
import steSimpleCalendar from "./components/ste-simple-calendar/ste-simple-calendar.vue"
|
|
124
|
+
export const SteSimpleCalendar = steSimpleCalendar
|
|
125
|
+
import steSkeleton from "./components/ste-skeleton/ste-skeleton.vue"
|
|
126
|
+
export const SteSkeleton = steSkeleton
|
|
127
|
+
import steSlideVerify from "./components/ste-slide-verify/ste-slide-verify.vue"
|
|
128
|
+
export const SteSlideVerify = steSlideVerify
|
|
121
129
|
import steSlider from "./components/ste-slider/ste-slider.vue"
|
|
122
130
|
export const SteSlider = steSlider
|
|
123
131
|
import steStep from "./components/ste-step/ste-step.vue"
|
package/package.json
CHANGED
package/types/components.d.ts
CHANGED
|
@@ -57,7 +57,11 @@ import steScrollToItem from "../components/ste-scroll-to-item/ste-scroll-to-item
|
|
|
57
57
|
import steSearch from "../components/ste-search/ste-search.vue"
|
|
58
58
|
import steSearchBox from "../components/ste-search-box/ste-search-box.vue"
|
|
59
59
|
import steSelect from "../components/ste-select/ste-select.vue"
|
|
60
|
+
import steSelectSeat from "../components/ste-select-seat/ste-select-seat.vue"
|
|
60
61
|
import steSignature from "../components/ste-signature/ste-signature.vue"
|
|
62
|
+
import steSimpleCalendar from "../components/ste-simple-calendar/ste-simple-calendar.vue"
|
|
63
|
+
import steSkeleton from "../components/ste-skeleton/ste-skeleton.vue"
|
|
64
|
+
import steSlideVerify from "../components/ste-slide-verify/ste-slide-verify.vue"
|
|
61
65
|
import steSlider from "../components/ste-slider/ste-slider.vue"
|
|
62
66
|
import steStep from "../components/ste-step/ste-step.vue"
|
|
63
67
|
import steStepper from "../components/ste-stepper/ste-stepper.vue"
|
|
@@ -147,7 +151,11 @@ import steWatermark from "../components/ste-watermark/ste-watermark.vue"
|
|
|
147
151
|
SteSearch: typeof steSearch;
|
|
148
152
|
SteSearchBox: typeof steSearchBox;
|
|
149
153
|
SteSelect: typeof steSelect;
|
|
154
|
+
SteSelectSeat: typeof steSelectSeat;
|
|
150
155
|
SteSignature: typeof steSignature;
|
|
156
|
+
SteSimpleCalendar: typeof steSimpleCalendar;
|
|
157
|
+
SteSkeleton: typeof steSkeleton;
|
|
158
|
+
SteSlideVerify: typeof steSlideVerify;
|
|
151
159
|
SteSlider: typeof steSlider;
|
|
152
160
|
SteStep: typeof steStep;
|
|
153
161
|
SteStepper: typeof steStepper;
|
package/types/index.d.ts
CHANGED
package/types/refComponents.d.ts
CHANGED
|
@@ -57,7 +57,11 @@ import steScrollToItem from "../components/ste-scroll-to-item/ste-scroll-to-item
|
|
|
57
57
|
import steSearch from "../components/ste-search/ste-search.vue"
|
|
58
58
|
import steSearchBox from "../components/ste-search-box/ste-search-box.vue"
|
|
59
59
|
import steSelect from "../components/ste-select/ste-select.vue"
|
|
60
|
+
import steSelectSeat from "../components/ste-select-seat/ste-select-seat.vue"
|
|
60
61
|
import steSignature from "../components/ste-signature/ste-signature.vue"
|
|
62
|
+
import steSimpleCalendar from "../components/ste-simple-calendar/ste-simple-calendar.vue"
|
|
63
|
+
import steSkeleton from "../components/ste-skeleton/ste-skeleton.vue"
|
|
64
|
+
import steSlideVerify from "../components/ste-slide-verify/ste-slide-verify.vue"
|
|
61
65
|
import steSlider from "../components/ste-slider/ste-slider.vue"
|
|
62
66
|
import steStep from "../components/ste-step/ste-step.vue"
|
|
63
67
|
import steStepper from "../components/ste-stepper/ste-stepper.vue"
|
|
@@ -142,7 +146,11 @@ export type RefScrollToItem = InstanceType<typeof steScrollToItem>
|
|
|
142
146
|
export type RefSearch = InstanceType<typeof steSearch>
|
|
143
147
|
export type RefSearchBox = InstanceType<typeof steSearchBox>
|
|
144
148
|
export type RefSelect = InstanceType<typeof steSelect>
|
|
149
|
+
export type RefSelectSeat = InstanceType<typeof steSelectSeat>
|
|
145
150
|
export type RefSignature = InstanceType<typeof steSignature>
|
|
151
|
+
export type RefSimpleCalendar = InstanceType<typeof steSimpleCalendar>
|
|
152
|
+
export type RefSkeleton = InstanceType<typeof steSkeleton>
|
|
153
|
+
export type RefSlideVerify = InstanceType<typeof steSlideVerify>
|
|
146
154
|
export type RefSlider = InstanceType<typeof steSlider>
|
|
147
155
|
export type RefStep = InstanceType<typeof steStep>
|
|
148
156
|
export type RefStepper = InstanceType<typeof steStepper>
|