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.
@@ -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 Loading1 from "./Loading1.vue";
2
- import Loading2 from "./Loading2.vue";
3
- import { App } from "vue";
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
@@ -8,8 +8,8 @@
8
8
 
9
9
  <script>
10
10
  export default {
11
- name: "SyLoading1",
12
- };
11
+ name: 'SyLoading1'
12
+ }
13
13
  </script>
14
14
 
15
15
  <script lang="ts" setup></script>
@@ -6,16 +6,16 @@
6
6
 
7
7
  <script lang="ts">
8
8
  export default {
9
- name: "SyLoading2",
10
- };
9
+ name: 'SyLoading2'
10
+ }
11
11
  </script>
12
12
 
13
13
  <script lang="ts" setup>
14
- const props = defineProps({
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
@@ -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>
@@ -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>
@@ -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>