sykj 0.1.8 → 0.2.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/README.md +10 -10
- package/lib/common.ts +33 -12
- package/main/index.ts +1 -1
- package/main/utils/withInstall.ts +10 -0
- package/package.json +67 -53
- package/packages/button/index.ts +5 -0
- package/packages/button/src/index.vue +138 -0
- package/packages/dialog/index.ts +5 -0
- package/packages/dialog/src/index.vue +142 -0
- package/packages/keyboard/index.ts +11 -6
- package/packages/keyboard/src/Keyboardcon.vue +464 -401
- package/packages/keyboard/src/theme.scss +2 -2
- package/packages/keyboard/src/utils/focus.ts +34 -0
- package/packages/keyboard/src/utils/store.ts +19 -0
- package/packages/loading/index.ts +5 -12
- package/packages/loading/{Loading1.vue → src/Loading1.vue} +2 -2
- package/packages/loading/{Loading2.vue → src/Loading2.vue} +6 -6
- package/packages/loading/src/index.vue +38 -0
- package/packages/message/index.ts +128 -0
- package/packages/message/src/index.vue +177 -0
- package/packages/message-box/index.ts +59 -0
- package/packages/message-box/src/assets/error.png +0 -0
- package/packages/message-box/src/assets/error.svg +3 -0
- package/packages/message-box/src/assets/tip.png +0 -0
- package/packages/message-box/src/assets/tip.svg +3 -0
- package/packages/message-box/src/assets/warning.png +0 -0
- package/packages/message-box/src/assets/warning.svg +3 -0
- package/packages/message-box/src/index.vue +195 -0
- package/types/component.d.ts +9 -3
- package/types/global.d.ts +3 -3
- package/types/index.d.ts +1 -1
- package/lib/focus.ts +0 -40
- package/lib/store.ts +0 -5
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
--keyboard_background: #ffffffdd;
|
|
4
4
|
--key_background: #00000006;
|
|
5
5
|
--key_color: #000000aa;
|
|
6
|
-
--key_filter: invert(90%) opacity(.9);
|
|
6
|
+
--key_filter: invert(90%) opacity(0.9);
|
|
7
7
|
--key_active_background: #00000038;
|
|
8
8
|
}
|
|
9
9
|
|
|
@@ -14,4 +14,4 @@ html.dark {
|
|
|
14
14
|
--key_color: #e1f7ff;
|
|
15
15
|
--key_filter: invert(10%);
|
|
16
16
|
--key_active_background: #ffffff38;
|
|
17
|
-
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import keyboard from './store'
|
|
2
|
+
|
|
3
|
+
// const keyboard = keyboard
|
|
4
|
+
let st: any = null
|
|
5
|
+
|
|
6
|
+
document.addEventListener('focusin', (event) => {
|
|
7
|
+
const target = event.target as HTMLElement
|
|
8
|
+
if (target?.tagName === 'INPUT' || target?.tagName === 'TEXTAREA') {
|
|
9
|
+
if (!isEditableFormComponent(target)) return
|
|
10
|
+
clearTimeout(st)
|
|
11
|
+
keyboard.open()
|
|
12
|
+
keyboard.currentElement = event.target
|
|
13
|
+
}
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
document.addEventListener('focusout', (event) => {
|
|
17
|
+
const target = event.target as HTMLElement
|
|
18
|
+
if (target?.tagName === 'INPUT' || target?.tagName === 'TEXTAREA') {
|
|
19
|
+
if (!isEditableFormComponent(target)) return
|
|
20
|
+
keyboard.close()
|
|
21
|
+
}
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
// 是否展示输入法
|
|
25
|
+
const isEditableFormComponent = (el: HTMLElement): boolean => {
|
|
26
|
+
// 类型守卫
|
|
27
|
+
const notType: Array<string> = ['checkbox', 'radio']
|
|
28
|
+
if (!(el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement))
|
|
29
|
+
return false
|
|
30
|
+
if (el.readOnly || notType.includes(el.type)) {
|
|
31
|
+
return false
|
|
32
|
+
}
|
|
33
|
+
return true
|
|
34
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// ;(window.globalThis as any).$sy = {
|
|
2
|
+
// key: {
|
|
3
|
+
// show_keyboard: false
|
|
4
|
+
// }
|
|
5
|
+
// }
|
|
6
|
+
|
|
7
|
+
class Keyboard {
|
|
8
|
+
key: any
|
|
9
|
+
open: any
|
|
10
|
+
close: any
|
|
11
|
+
currentElement: EventTarget | null
|
|
12
|
+
constructor() {
|
|
13
|
+
// this.key = {}
|
|
14
|
+
this.currentElement = null
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const keyboard = new Keyboard()
|
|
19
|
+
export default keyboard
|
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export { Loading1, Loading2 };
|
|
7
|
-
|
|
8
|
-
// 安装函数
|
|
9
|
-
export function install(Vue: App) {
|
|
10
|
-
Vue.component(Loading1.name, Loading1);
|
|
11
|
-
Vue.component(Loading2.name, Loading2);
|
|
12
|
-
}
|
|
1
|
+
import _SyLoading from './src/index.vue'
|
|
2
|
+
import { withInstall } from '../../main/utils/withInstall'
|
|
3
|
+
_SyLoading.name = 'SyLoading'
|
|
4
|
+
export const SyLoading = withInstall(_SyLoading)
|
|
5
|
+
export default SyLoading
|
|
@@ -6,16 +6,16 @@
|
|
|
6
6
|
|
|
7
7
|
<script lang="ts">
|
|
8
8
|
export default {
|
|
9
|
-
name:
|
|
10
|
-
}
|
|
9
|
+
name: 'SyLoading2'
|
|
10
|
+
}
|
|
11
11
|
</script>
|
|
12
12
|
|
|
13
13
|
<script lang="ts" setup>
|
|
14
|
-
|
|
14
|
+
defineProps({
|
|
15
15
|
size: {
|
|
16
|
-
default: 1
|
|
17
|
-
}
|
|
18
|
-
})
|
|
16
|
+
default: 1
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
19
|
</script>
|
|
20
20
|
|
|
21
21
|
<style lang="scss" scoped>
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="sy-loading">
|
|
3
|
+
<component :is="loadingType" />
|
|
4
|
+
</div>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import { computed } from 'vue'
|
|
9
|
+
import type { Component } from 'vue'
|
|
10
|
+
import SyLoading1 from './Loading1.vue'
|
|
11
|
+
import SyLoading2 from './Loading2.vue'
|
|
12
|
+
|
|
13
|
+
defineOptions({ name: 'SyLoading' })
|
|
14
|
+
// 定义 props
|
|
15
|
+
const props = defineProps<{
|
|
16
|
+
type: number
|
|
17
|
+
}>()
|
|
18
|
+
|
|
19
|
+
// 组件映射表
|
|
20
|
+
const loadingComponents: Record<string, Component> = {
|
|
21
|
+
'1': SyLoading1,
|
|
22
|
+
'2': SyLoading2
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// 根据 props 动态确定渲染的组件
|
|
26
|
+
const loadingType = computed(() => {
|
|
27
|
+
return loadingComponents[props.type] || SyLoading1 // 默认返回 SyLoading1
|
|
28
|
+
})
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<style lang="scss" scoped>
|
|
32
|
+
.SyLoading {
|
|
33
|
+
display: inline-block;
|
|
34
|
+
.loadAni {
|
|
35
|
+
pointer-events: none;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
</style>
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { createApp, reactive, h } from 'vue'
|
|
2
|
+
import type { App } from 'vue'
|
|
3
|
+
import MessageProvider from './src/index.vue'
|
|
4
|
+
|
|
5
|
+
type MsgType = 'info' | 'success' | 'warning' | 'error'
|
|
6
|
+
interface MsgOptions {
|
|
7
|
+
message: string
|
|
8
|
+
type?: MsgType
|
|
9
|
+
duration?: number // ms
|
|
10
|
+
icon?: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let seed = 1
|
|
14
|
+
|
|
15
|
+
class MessageService {
|
|
16
|
+
private container!: HTMLElement
|
|
17
|
+
private vm!: App<Element>
|
|
18
|
+
private state = reactive<{ list: any[] }>({ list: [] })
|
|
19
|
+
|
|
20
|
+
private ensureMount() {
|
|
21
|
+
if (this.vm) return
|
|
22
|
+
this.container = document.createElement('div')
|
|
23
|
+
document.body.appendChild(this.container)
|
|
24
|
+
this.vm = createApp({
|
|
25
|
+
render: () =>
|
|
26
|
+
h(MessageProvider, {
|
|
27
|
+
messages: this.state.list,
|
|
28
|
+
onClose: (id: number) => this.close(id),
|
|
29
|
+
onPause: (id: number) => this.pause(id),
|
|
30
|
+
onResume: (id: number) => this.resume(id)
|
|
31
|
+
})
|
|
32
|
+
})
|
|
33
|
+
this.vm.mount(this.container)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
open(options: MsgOptions) {
|
|
37
|
+
// todo : 可添加多条提示框
|
|
38
|
+
// this.state.list = []
|
|
39
|
+
if (this.state.list.length > 0) {
|
|
40
|
+
this.state.list.shift()
|
|
41
|
+
}
|
|
42
|
+
this.ensureMount()
|
|
43
|
+
const id = seed++
|
|
44
|
+
const opts = Object.assign({ type: 'info', duration: 3000 }, options)
|
|
45
|
+
console.log('🚀 ~ open ~ opts:', opts)
|
|
46
|
+
const item: any = {
|
|
47
|
+
id,
|
|
48
|
+
message: opts.message,
|
|
49
|
+
type: opts.type,
|
|
50
|
+
duration: opts.duration,
|
|
51
|
+
icon: opts.icon || '',
|
|
52
|
+
startAt: Date.now(),
|
|
53
|
+
remaining: opts.duration,
|
|
54
|
+
timer: null
|
|
55
|
+
}
|
|
56
|
+
this.state.list.push(item)
|
|
57
|
+
this.startTimer(item)
|
|
58
|
+
return {
|
|
59
|
+
id,
|
|
60
|
+
close: () => this.close(id)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private startTimer(item: any) {
|
|
65
|
+
if (!item.duration || item.duration <= 0) return
|
|
66
|
+
item.startAt = Date.now()
|
|
67
|
+
item.timer = window.setTimeout(() => {
|
|
68
|
+
this.close(item.id)
|
|
69
|
+
}, item.remaining)
|
|
70
|
+
}
|
|
71
|
+
pause(id: number) {
|
|
72
|
+
const item = this.state.list.find((i) => i.id === id)
|
|
73
|
+
if (!item || !item.timer) return
|
|
74
|
+
clearTimeout(item.timer)
|
|
75
|
+
const elapsed = Date.now() - (item.startAt || Date.now())
|
|
76
|
+
item.remaining = Math.max(0, item.remaining - elapsed)
|
|
77
|
+
item.timer = null
|
|
78
|
+
}
|
|
79
|
+
resume(id: number) {
|
|
80
|
+
const item = this.state.list.find((i) => i.id === id)
|
|
81
|
+
if (!item || item.timer) return
|
|
82
|
+
this.startTimer(item)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
close(id: number) {
|
|
86
|
+
const idx = this.state.list.findIndex((i) => i.id === id)
|
|
87
|
+
if (idx !== -1) {
|
|
88
|
+
const itm = this.state.list[idx]
|
|
89
|
+
this.state.list.splice(idx, 1)
|
|
90
|
+
if (itm.onClose)
|
|
91
|
+
try {
|
|
92
|
+
itm.onClose()
|
|
93
|
+
} catch {}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// 实例
|
|
99
|
+
const service = new MessageService()
|
|
100
|
+
|
|
101
|
+
// 函数式调用(核心:直接 SyMessage('xxx'))
|
|
102
|
+
function SyMessage(options: string | MsgOptions) {
|
|
103
|
+
console.log('🚀 ~ SyMessage ~ options:', options)
|
|
104
|
+
if (typeof options === 'string') {
|
|
105
|
+
return service.open({ message: options })
|
|
106
|
+
} else {
|
|
107
|
+
return service.open(options)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// 附加静态方法
|
|
112
|
+
SyMessage.info = (msg: string | MsgOptions) =>
|
|
113
|
+
service.open(typeof msg === 'string' ? { message: msg, type: 'info' } : msg)
|
|
114
|
+
SyMessage.success = (msg: string | MsgOptions) =>
|
|
115
|
+
service.open(
|
|
116
|
+
typeof msg === 'string' ? { message: msg, type: 'success' } : msg
|
|
117
|
+
)
|
|
118
|
+
SyMessage.warning = (msg: string | MsgOptions) =>
|
|
119
|
+
service.open(
|
|
120
|
+
typeof msg === 'string' ? { message: msg, type: 'warning' } : msg
|
|
121
|
+
)
|
|
122
|
+
SyMessage.error = (msg: string | MsgOptions) =>
|
|
123
|
+
service.open(
|
|
124
|
+
typeof msg === 'string' ? { message: msg, type: 'error' } : msg
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
export { SyMessage }
|
|
128
|
+
export default SyMessage
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="sy-message-root" aria-live="polite">
|
|
3
|
+
<transition-group
|
|
4
|
+
name="sy-message-fade"
|
|
5
|
+
tag="div"
|
|
6
|
+
class="sy-message-root-list"
|
|
7
|
+
>
|
|
8
|
+
<div
|
|
9
|
+
v-for="m in messages"
|
|
10
|
+
:key="m.id"
|
|
11
|
+
:class="['sy-message', 'sy-message--' + m.type]"
|
|
12
|
+
@mouseenter="pause(m.id)"
|
|
13
|
+
@mouseleave="resume(m.id)"
|
|
14
|
+
>
|
|
15
|
+
<div class="sy-message__content">
|
|
16
|
+
<slot name="icon">
|
|
17
|
+
<span class="sy-message__icon" v-if="m.icon">
|
|
18
|
+
{{ m.icon }}
|
|
19
|
+
</span>
|
|
20
|
+
</slot>
|
|
21
|
+
<div class="sy-message__text" v-html="m.message"></div>
|
|
22
|
+
<!-- <button class="sy-message__close" @click="close(m.id)">
|
|
23
|
+
×
|
|
24
|
+
</button> -->
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
</transition-group>
|
|
28
|
+
</div>
|
|
29
|
+
</template>
|
|
30
|
+
|
|
31
|
+
<script setup lang="ts">
|
|
32
|
+
interface MessageItem {
|
|
33
|
+
id: number
|
|
34
|
+
message: string
|
|
35
|
+
type: 'info' | 'success' | 'warning' | 'error'
|
|
36
|
+
duration: number // ms
|
|
37
|
+
onClose?: () => void
|
|
38
|
+
timer?: number | null
|
|
39
|
+
remaining?: number
|
|
40
|
+
startAt?: number
|
|
41
|
+
icon?: string
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const props = defineProps<{ messages: MessageItem[] }>()
|
|
45
|
+
const emit = defineEmits(['close', 'pause', 'resume'])
|
|
46
|
+
|
|
47
|
+
const messages = props.messages as MessageItem[]
|
|
48
|
+
|
|
49
|
+
// function close(id: number) {
|
|
50
|
+
// emit('close', id)
|
|
51
|
+
// }
|
|
52
|
+
function pause(id: number) {
|
|
53
|
+
console.log('pause')
|
|
54
|
+
|
|
55
|
+
emit('pause', id)
|
|
56
|
+
}
|
|
57
|
+
function resume(id: number) {
|
|
58
|
+
console.log('resume')
|
|
59
|
+
|
|
60
|
+
emit('resume', id)
|
|
61
|
+
}
|
|
62
|
+
</script>
|
|
63
|
+
|
|
64
|
+
<style scoped lang="scss">
|
|
65
|
+
.sy-message-root {
|
|
66
|
+
position: fixed;
|
|
67
|
+
top: 0px;
|
|
68
|
+
left: 0;
|
|
69
|
+
right: 0px;
|
|
70
|
+
margin: auto;
|
|
71
|
+
z-index: 9999;
|
|
72
|
+
display: flex;
|
|
73
|
+
flex-direction: column;
|
|
74
|
+
gap: 8px;
|
|
75
|
+
|
|
76
|
+
// width: fit-content;
|
|
77
|
+
transition: all 0.2s ease-in-out;
|
|
78
|
+
// border: 1px solid red;
|
|
79
|
+
/* position: relative; */
|
|
80
|
+
// height: 200px;
|
|
81
|
+
}
|
|
82
|
+
.sy-message {
|
|
83
|
+
background: #fff;
|
|
84
|
+
box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
|
|
85
|
+
border-radius: 0 0 8px 8px;
|
|
86
|
+
padding: 10px 12px;
|
|
87
|
+
display: flex;
|
|
88
|
+
align-items: center;
|
|
89
|
+
justify-content: space-between;
|
|
90
|
+
overflow: hidden;
|
|
91
|
+
margin: auto;
|
|
92
|
+
left: 0;
|
|
93
|
+
right: 0;
|
|
94
|
+
// width: 100%;
|
|
95
|
+
position: absolute;
|
|
96
|
+
width: fit-content;
|
|
97
|
+
}
|
|
98
|
+
.sy-message__content {
|
|
99
|
+
display: flex;
|
|
100
|
+
align-items: center;
|
|
101
|
+
gap: 8px;
|
|
102
|
+
// width: 100%;
|
|
103
|
+
width: fit-content;
|
|
104
|
+
}
|
|
105
|
+
.sy-message__icon {
|
|
106
|
+
font-weight: 700;
|
|
107
|
+
margin-right: 6px;
|
|
108
|
+
}
|
|
109
|
+
.sy-message__text {
|
|
110
|
+
flex: 1;
|
|
111
|
+
line-height: 1.2;
|
|
112
|
+
word-break: break-word;
|
|
113
|
+
color: white;
|
|
114
|
+
}
|
|
115
|
+
.sy-message__close {
|
|
116
|
+
border: 0;
|
|
117
|
+
background: transparent;
|
|
118
|
+
cursor: pointer;
|
|
119
|
+
font-size: 16px;
|
|
120
|
+
padding: 0 6px;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.sy-message--success {
|
|
124
|
+
background: #67c23a;
|
|
125
|
+
}
|
|
126
|
+
.sy-message--info {
|
|
127
|
+
background: #909399;
|
|
128
|
+
}
|
|
129
|
+
.sy-message--warning {
|
|
130
|
+
background: #e6a23c;
|
|
131
|
+
}
|
|
132
|
+
.sy-message--error {
|
|
133
|
+
background: #f56c6c;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.sy-message-root-list {
|
|
137
|
+
// background-color: #f9f9f9;
|
|
138
|
+
// border: 1px solid #ddd;
|
|
139
|
+
// box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
|
140
|
+
position: relative;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.sy-message-fade-enter-from,
|
|
144
|
+
.sy-message-fade-leave-to {
|
|
145
|
+
opacity: 0;
|
|
146
|
+
transform: translateY(-20px);
|
|
147
|
+
}
|
|
148
|
+
.sy-message-fade-enter-active,
|
|
149
|
+
.sy-message-fade-leave-active {
|
|
150
|
+
transition: all 240ms cubic-bezier(0.2, 0.8, 0.2, 1);
|
|
151
|
+
// position: absolute;
|
|
152
|
+
|
|
153
|
+
/* width: 100%; */
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.sy-message-fade-move {
|
|
157
|
+
transition: transform 240ms ease;
|
|
158
|
+
}
|
|
159
|
+
// .sy-message-fade-leave-active {
|
|
160
|
+
// position: absolute !important;
|
|
161
|
+
// }
|
|
162
|
+
|
|
163
|
+
// .sy-message-fade {
|
|
164
|
+
// transform: translateY(-20px);
|
|
165
|
+
// }
|
|
166
|
+
|
|
167
|
+
// .sy-message-fade-enter,
|
|
168
|
+
// .sy-message-fade-leave-to
|
|
169
|
+
// /* .sy-message-fade-leave-active for below version 2.1.8 */ {
|
|
170
|
+
// opacity: 0;
|
|
171
|
+
// transform: translateY(-20px);
|
|
172
|
+
// }
|
|
173
|
+
|
|
174
|
+
.sy-message-fade-leave-active {
|
|
175
|
+
position: absolute;
|
|
176
|
+
}
|
|
177
|
+
</style>
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { createApp, h } from 'vue'
|
|
2
|
+
import MessageBox from './src/index.vue'
|
|
3
|
+
|
|
4
|
+
export interface DialogOptions {
|
|
5
|
+
title?: string
|
|
6
|
+
message?: string
|
|
7
|
+
confirmText?: string
|
|
8
|
+
cancelText?: string
|
|
9
|
+
inputPlaceholder?: string
|
|
10
|
+
inputValue?: string
|
|
11
|
+
icon?: 'tip' | 'warning' | 'error'
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function mountDialog(props: any) {
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
const container = document.createElement('div')
|
|
17
|
+
document.body.appendChild(container)
|
|
18
|
+
const app = createApp({
|
|
19
|
+
render() {
|
|
20
|
+
return h(MessageBox, {
|
|
21
|
+
...props,
|
|
22
|
+
// 当用户点击后,组件内部会先触发 requestClose(可选),并把 visible 设为 false,
|
|
23
|
+
// 等动画结束后会触发 closed,此时我们才 resolve/reject 并卸载。
|
|
24
|
+
onRequestClose: () => {
|
|
25
|
+
// 可选:在这里做一些即时响应(比如记录日志),但不要卸载
|
|
26
|
+
// console.log('requestClose', r)
|
|
27
|
+
},
|
|
28
|
+
onClosed: (r: any) => {
|
|
29
|
+
// r = { type: 'confirm'|'cancel', value?: any } 或 null
|
|
30
|
+
if (r?.type === 'confirm') {
|
|
31
|
+
resolve(r.value === undefined ? true : r.value)
|
|
32
|
+
} else {
|
|
33
|
+
reject(new Error('cancel'))
|
|
34
|
+
}
|
|
35
|
+
// 关闭后立即卸载(因为 after-leave 已执行,动画已完成)
|
|
36
|
+
app.unmount()
|
|
37
|
+
container.remove()
|
|
38
|
+
}
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
app.mount(container)
|
|
43
|
+
})
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const SyMessageBox = {
|
|
47
|
+
alert(message: string, title = '提示', options: DialogOptions = {}) {
|
|
48
|
+
return mountDialog({ ...options, type: 'alert', message, title })
|
|
49
|
+
},
|
|
50
|
+
confirm(message: string, title = '确认', options: DialogOptions = {}) {
|
|
51
|
+
return mountDialog({ ...options, type: 'confirm', message, title })
|
|
52
|
+
},
|
|
53
|
+
prompt(message: string, title = '输入', options: DialogOptions = {}) {
|
|
54
|
+
return mountDialog({ ...options, type: 'prompt', message, title })
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export { SyMessageBox }
|
|
59
|
+
export default SyMessageBox
|
|
Binary file
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="116" height="106" viewBox="0 0 116 106">
|
|
2
|
+
<image id="矢量智能对象" width="116" height="106" xlink:href="data:img/png;base64,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"/>
|
|
3
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="152" height="112" viewBox="0 0 152 112">
|
|
2
|
+
<image id="矢量智能对象" width="152" height="112" xlink:href="data:img/png;base64,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"/>
|
|
3
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="116" height="106" viewBox="0 0 116 106">
|
|
2
|
+
<image id="矢量智能对象" width="116" height="106" xlink:href="data:img/png;base64,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"/>
|
|
3
|
+
</svg>
|