sykj 0.1.1 → 0.1.2

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.
@@ -1,158 +1,130 @@
1
1
  <template>
2
- <div
3
- @click="makeFocus"
4
- class="keyboardcon defaultCss"
5
- :class="[
6
- keyStore.keyboardcon ? 'show' : '',
7
- toUpKeyCase ? 'upKeyCase' : '',
8
- ]"
9
- @contextmenu.prevent="makeFocus"
10
- >
11
- <!-- 中文拼音列表 -->
12
- <div class="chinese">
13
- <div
14
- v-if="keyStore.isChinese === true && cn_input?.length"
15
- class="pinyin"
16
- @touchmove.stop.prevent
17
- >
18
- <div>
19
- <span>{{ cn_input }}</span>
20
- </div>
21
- </div>
22
- <div class="wenzi" v-if="cn_list_str.length >= 1">
23
- <div
24
- class="wenzi_box"
25
- :class="showMore ? 'wenzi_box_more' : ''"
26
- :style="huanhang ? `flex-wrap: wrap;` : ''"
27
- >
28
- <span
29
- @click="chineseCli(item)"
30
- v-for="(item, index) in cn_list_str"
31
- :key="index"
32
- >{{ item }}</span
33
- >
34
- </div>
35
- <div class="moreText" @click="moreTextCli">
36
- <el-icon
37
- :style="`transform: rotateZ(${showMore ? 180 : 0}deg)`"
38
- >
39
- <ArrowDownBold />
40
- </el-icon>
41
- </div>
42
- </div>
2
+ <div
3
+ @click="makeFocus"
4
+ class="keyboardcon defaultCss"
5
+ :class="[keyStore.keyboardcon ? 'show' : '', toUpKeyCase ? 'upKeyCase' : '']"
6
+ @contextmenu.prevent="makeFocus"
7
+ >
8
+ <!-- 中文拼音列表 -->
9
+ <div class="chinese">
10
+ <div
11
+ v-if="keyStore.isChinese === true && cn_input?.length"
12
+ class="pinyin"
13
+ @touchmove.stop.prevent
14
+ >
15
+ <div>
16
+ <span>{{ cn_input }}</span>
43
17
  </div>
44
- <!-- 纯数字 -->
18
+ </div>
19
+ <div class="wenzi" v-if="cn_list_str.length >= 1">
45
20
  <div
46
- class="number_list"
47
- @touchmove.stop.prevent
48
- v-show="keyStore.inputType == 'number'"
21
+ class="wenzi_box"
22
+ :class="showMore ? 'wenzi_box_more' : ''"
23
+ :style="huanhang ? `flex-wrap: wrap;` : ''"
49
24
  >
50
- <div class="key_item" v-for="(item, index) in lists" :key="item">
51
- <div
52
- class="key"
53
- @click.stop="choosekey(item, index)"
54
- v-if="!Array.isArray(item) && index < 11"
55
- >
56
- <span>{{ item }}</span>
57
- </div>
58
- <div class="keys" v-else-if="index < 11">
59
- <span @click.stop="choosekey(item[0], index)">{{
60
- item[0]
61
- }}</span>
62
- <span @click.stop="choosekey(item[1], index)">{{
63
- item[1]
64
- }}</span>
65
- </div>
66
- <div
67
- class="key del"
68
- @click.stop="choosekey(item, index)"
69
- v-if="index == '11'"
70
- >
71
- <img src="./static/key/del.svg" alt="" />
72
- </div>
73
- </div>
25
+ <span
26
+ @click="chineseCli(item)"
27
+ v-for="(item, index) in cn_list_str"
28
+ :key="index"
29
+ >{{ item }}</span
30
+ >
31
+ </div>
32
+ <div class="moreText" @click="moreTextCli">
33
+ <el-icon :style="`transform: rotateZ(${showMore ? 180 : 0}deg)`">
34
+ <ArrowDownBold />
35
+ </el-icon>
74
36
  </div>
75
- <!-- 26键 -->
37
+ </div>
38
+ </div>
39
+ <!-- 纯数字 -->
40
+ <div
41
+ class="number_list"
42
+ @touchmove.stop.prevent
43
+ v-show="keyStore.inputType == 'number'"
44
+ >
45
+ <div class="key_item" v-for="(item, index) in lists" :key="item">
76
46
  <div
77
- class="text_list"
78
- :class="[isSymbol ? 'isSymbol' : '']"
79
- @touchmove.stop.prevent
80
- v-show="keyStore.inputType != 'number'"
81
- ref="pressArea"
47
+ class="key"
48
+ @click.stop="choosekey(item, index)"
49
+ v-if="!Array.isArray(item) && index < 11"
82
50
  >
83
- <div
84
- class="key_item_row"
85
- v-for="(item, index) in lists"
86
- :key="index"
87
- >
88
- <div
89
- class="key_item_column"
90
- @touchstart="startPress"
91
- @touchend="endPress"
92
- @touchcancel="cancelPress"
93
- v-for="(item1, index1) in item"
94
- @click.stop="choosekey(item1, index1)"
95
- :key="item1"
96
- >
97
- <div class="key" v-if="item1.length == 1">
98
- <span>{{ item1 }}</span>
99
- </div>
100
- <div
101
- class="key"
102
- :class="toUpKeyCase ? 'toUpKeyCase' : ''"
103
- v-else
104
- >
105
- <!-- {{ item1 }} -->
106
- <img
107
- v-if="item1 == 'del'"
108
- :class="item1"
109
- src="./static/key/del.svg"
110
- alt=""
111
- />
112
- <img
113
- v-else-if="item1 == 'shift'"
114
- :class="item1"
115
- src="./static/key/shift.svg"
116
- alt=""
117
- />
118
- <img
119
- v-else-if="item1 == 'space'"
120
- :class="item1"
121
- src="./static/key/space.svg"
122
- alt=""
123
- />
124
- <img
125
- v-else-if="item1 == 'enter'"
126
- :class="item1"
127
- src="./static/key/enter.svg"
128
- alt=""
129
- />
130
- <span v-else-if="item1.length > 1" :class="item1">{{
131
- item1
132
- }}</span>
133
- <span v-else :class="item1">{{ item1 }}</span>
134
- </div>
135
- </div>
136
- </div>
51
+ <span>{{ item }}</span>
137
52
  </div>
138
- <!-- 中英文切换 -->
139
- <div class="btns" @touchmove.stop.prevent>
140
- <div v-show="keyStore.showCheckChinese" @click="checkChinese">
141
- <!-- <el-icon><Switch /></el-icon -->
142
- <span :class="keyStore.isChinese ? 'ch' : ''">中</span>/<span
143
- :class="keyStore.isChinese ? '' : 'ch'"
144
- >英</span
145
- >
146
- </div>
147
- <span @click.stop>确认</span>
53
+ <div class="keys" v-else-if="index < 11">
54
+ <span @click.stop="choosekey(item[0], index)">{{ item[0] }}</span>
55
+ <span @click.stop="choosekey(item[1], index)">{{ item[1] }}</span>
148
56
  </div>
149
- <!-- <div class="symbol_list" v-show="keyStore.inputType == 'symbol'"></div> -->
57
+ <div class="key del" @click.stop="choosekey(item, index)" v-if="index == '11'">
58
+ <img src="./static/key/del.svg" alt="" />
59
+ </div>
60
+ </div>
150
61
  </div>
62
+ <!-- 26键 -->
63
+ <div
64
+ class="text_list"
65
+ :class="[isSymbol ? 'isSymbol' : '']"
66
+ @touchmove.stop.prevent
67
+ v-show="keyStore.inputType != 'number'"
68
+ ref="pressArea"
69
+ >
70
+ <div class="key_item_row" v-for="(item, index) in lists" :key="index">
71
+ <div
72
+ class="key_item_column"
73
+ @touchstart="startPress"
74
+ @touchend="endPress"
75
+ @touchcancel="cancelPress"
76
+ v-for="(item1, index1) in item"
77
+ @click.stop="choosekey(item1, index1)"
78
+ :key="item1"
79
+ >
80
+ <div class="key" v-if="item1.length == 1">
81
+ <span>{{ item1 }}</span>
82
+ </div>
83
+ <div class="key" :class="toUpKeyCase ? 'toUpKeyCase' : ''" v-else>
84
+ <!-- {{ item1 }} -->
85
+ <img v-if="item1 == 'del'" :class="item1" src="./static/key/del.svg" alt="" />
86
+ <img
87
+ v-else-if="item1 == 'shift'"
88
+ :class="item1"
89
+ src="./static/key/shift.svg"
90
+ alt=""
91
+ />
92
+ <img
93
+ v-else-if="item1 == 'space'"
94
+ :class="item1"
95
+ src="./static/key/space.svg"
96
+ alt=""
97
+ />
98
+ <img
99
+ v-else-if="item1 == 'enter'"
100
+ :class="item1"
101
+ src="./static/key/enter.svg"
102
+ alt=""
103
+ />
104
+ <span v-else-if="item1.length > 1" :class="item1">{{ item1 }}</span>
105
+ <span v-else :class="item1">{{ item1 }}</span>
106
+ </div>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ <!-- 中英文切换 -->
111
+ <div class="btns" @touchmove.stop.prevent>
112
+ <div v-show="keyStore.showCheckChinese" @click="checkChinese">
113
+ <!-- <el-icon><Switch /></el-icon -->
114
+ <span :class="keyStore.isChinese ? 'ch' : ''">中</span>/<span
115
+ :class="keyStore.isChinese ? '' : 'ch'"
116
+ >英</span
117
+ >
118
+ </div>
119
+ <span @click.stop>确认</span>
120
+ </div>
121
+ <!-- <div class="symbol_list" v-show="keyStore.inputType == 'symbol'"></div> -->
122
+ </div>
151
123
  </template>
152
124
 
153
125
  <script>
154
126
  export default {
155
- name: "SyKeyboard",
127
+ name: "SyKeyboard",
156
128
  };
157
129
  </script>
158
130
 
@@ -162,11 +134,11 @@ import { onMounted, reactive, ref, onBeforeUnmount, watchEffect } from "vue";
162
134
  //#region init ------------------------------------------------------------
163
135
  const globalKey = window.globalThis.$sy.key;
164
136
  const keyStore = reactive({
165
- keyboardcon: false,
166
- currentElement: null,
167
- inputType: true ? "text" : "number",
168
- showCheckChinese: !false, //是否展示中文输入切换
169
- isChinese: false,
137
+ keyboardcon: false,
138
+ currentElement: null,
139
+ inputType: true ? "text" : "number",
140
+ showCheckChinese: !false, //是否展示中文输入切换
141
+ isChinese: false,
170
142
  });
171
143
  const isSymbol = ref(false);
172
144
  //#endregion -----------------------------------------------------------
@@ -177,117 +149,113 @@ const isSymbol = ref(false);
177
149
 
178
150
  let st = null;
179
151
  watchEffect(() => {
180
- if (keyStore.keyboardcon) {
181
- clearTimeout(st);
182
- document.body.style = "padding-bottom:30vh;";
183
- } else {
184
- st = setTimeout(() => {
185
- document.body.style = "padding:0;";
186
- }, 0);
187
- }
152
+ if (keyStore.keyboardcon) {
153
+ clearTimeout(st);
154
+ document.body.style = "padding-bottom:30vh;";
155
+ } else {
156
+ st = setTimeout(() => {
157
+ document.body.style = "padding:0;";
158
+ }, 0);
159
+ }
188
160
  });
189
161
 
190
162
  const numberKeyBoradMap = [1, 2, 3, 4, 5, 6, 7, 8, 9, [".", ":"], 0, "del"];
191
163
  const textKeyMap = [
192
- ["q", "w", "e", "r", "t", "y", "u", "i", "o", "p"],
193
- ["a", "s", "d", "f", "g", "h", "j", "k", "l"],
194
- ["shift", "z", "x", "c", "v", "b", "n", "m", "del"],
195
- ["&123", "space", "enter"],
164
+ ["q", "w", "e", "r", "t", "y", "u", "i", "o", "p"],
165
+ ["a", "s", "d", "f", "g", "h", "j", "k", "l"],
166
+ ["shift", "z", "x", "c", "v", "b", "n", "m", "del"],
167
+ ["&123", "space", "enter"],
196
168
  ];
197
169
 
198
170
  const symbolMap1 = [
199
- [1, 2, 3, 4, 5, 6, 7, 8, 9, 0],
200
- ["-", "/", ":", ";", "(", ")", "$", "&", "@", '"'],
201
- ["#+=", ".", ",", "?", "!", "'", "del"],
202
- ["ABC", "space", "enter"],
171
+ [1, 2, 3, 4, 5, 6, 7, 8, 9, 0],
172
+ ["-", "/", ":", ";", "(", ")", "$", "&", "@", '"'],
173
+ ["#+=", ".", ",", "?", "!", "'", "del"],
174
+ ["ABC", "space", "enter"],
203
175
  ];
204
176
 
205
177
  const symbolMap2 = [
206
- ["[", "]", "{", "}", "#", "%", "^", "*", "+", "="],
207
- ["_", "\\", "|", "~", "<", ">", "€", "£", "¥", "·"],
208
- ["123", ".", ",", "?", "!", "'", "del"],
209
- ["ABC", "space", "enter"],
178
+ ["[", "]", "{", "}", "#", "%", "^", "*", "+", "="],
179
+ ["_", "\\", "|", "~", "<", ">", "€", "£", "¥", "·"],
180
+ ["123", ".", ",", "?", "!", "'", "del"],
181
+ ["ABC", "space", "enter"],
210
182
  ];
211
183
 
212
184
  const showMore = ref(false);
213
185
  const huanhang = ref(false);
214
186
  const moreTextCli = () => {
215
- // keyStore.currentElement.focus();
216
- globalKey.currentElement.focus();
217
-
218
- showMore.value = !showMore.value;
219
- if (showMore.value) {
220
- huanhang.value = true;
221
- } else {
222
- setTimeout(() => {
223
- huanhang.value = false;
224
- }, 500);
225
- }
187
+ // keyStore.currentElement.focus();
188
+ globalKey.currentElement.focus();
189
+
190
+ showMore.value = !showMore.value;
191
+ if (showMore.value) {
192
+ huanhang.value = true;
193
+ } else {
194
+ setTimeout(() => {
195
+ huanhang.value = false;
196
+ }, 500);
197
+ }
226
198
  };
227
199
  const chineseCli = (item) => {
228
- // keyStore.currentElement.focus();
229
- globalKey.currentElement.focus();
230
- setInputValue(item);
231
- selectCN(item);
232
- console.log(cn_input.value);
233
- if (!cn_input.value) {
234
- showMore.value = false;
235
- }
200
+ // keyStore.currentElement.focus();
201
+ globalKey.currentElement.focus();
202
+ setInputValue(item);
203
+ selectCN(item);
204
+ console.log(cn_input.value);
205
+ if (!cn_input.value) {
206
+ showMore.value = false;
207
+ }
236
208
  };
237
209
 
238
210
  //选择中文
239
211
  const selectCN = (text) => {
240
- let strList = cn_input.value.split("'");
241
- if (strList.length === 1 || text.length >= strList.length) {
242
- cn_input.value = "";
243
- cn_list_str.value = [];
244
- // l_min.value = 0;
245
- // l_max.value = 10;
246
- return;
247
- }
248
- setCn_input(text);
212
+ let strList = cn_input.value.split("'");
213
+ if (strList.length === 1 || text.length >= strList.length) {
214
+ cn_input.value = "";
215
+ cn_list_str.value = [];
216
+ // l_min.value = 0;
217
+ // l_max.value = 10;
218
+ return;
219
+ }
220
+ setCn_input(text);
249
221
  };
250
222
  //设置中文输入
251
223
  const setCn_input = (text) => {
252
- const singleDict = dict;
253
- let itemList = [];
254
- for (let key in singleDict) {
255
- let value = singleDict[key];
256
- if (typeof value === "string") {
257
- let valueList = value.split("");
258
- let item = valueList.find((item) => item === text);
259
- if (item) {
260
- itemList.push(key);
261
- }
262
- }
224
+ const singleDict = dict;
225
+ let itemList = [];
226
+ for (let key in singleDict) {
227
+ let value = singleDict[key];
228
+ if (typeof value === "string") {
229
+ let valueList = value.split("");
230
+ let item = valueList.find((item) => item === text);
231
+ if (item) {
232
+ itemList.push(key);
233
+ }
263
234
  }
264
- let str = "";
265
- const cn_inputList = cn_input.value.split("'");
266
- for (let i = 0; i < cn_inputList.length; i++) {
267
- let item = cn_inputList[i];
268
- for (let key of itemList) {
269
- let list = key.split("");
270
- let count = 0;
271
- for (let k = 0; k < list.length; k++) {
272
- if (key.charAt(k) === item.charAt(k)) {
273
- count += 1;
274
- if (
275
- k === 0 &&
276
- item.length != key.length &&
277
- key.length > item.length
278
- ) {
279
- // 用于处理首单词缩写法
280
- str = item;
281
- }
282
- }
283
- if (count === list.length) {
284
- str = item;
285
- }
286
- }
235
+ }
236
+ let str = "";
237
+ const cn_inputList = cn_input.value.split("'");
238
+ for (let i = 0; i < cn_inputList.length; i++) {
239
+ let item = cn_inputList[i];
240
+ for (let key of itemList) {
241
+ let list = key.split("");
242
+ let count = 0;
243
+ for (let k = 0; k < list.length; k++) {
244
+ if (key.charAt(k) === item.charAt(k)) {
245
+ count += 1;
246
+ if (k === 0 && item.length != key.length && key.length > item.length) {
247
+ // 用于处理首单词缩写法
248
+ str = item;
249
+ }
250
+ }
251
+ if (count === list.length) {
252
+ str = item;
287
253
  }
254
+ }
288
255
  }
289
- cn_input.value = cn_inputList.filter((item) => item != str).join("'");
290
- findChinese();
256
+ }
257
+ cn_input.value = cn_inputList.filter((item) => item != str).join("'");
258
+ findChinese();
291
259
  };
292
260
 
293
261
  let lists = ref([]);
@@ -296,176 +264,174 @@ let active = ref(1);
296
264
  let toUpKeyCase = ref(false);
297
265
 
298
266
  const choosekey = (item) => {
299
- try {
300
- // keyStore.currentElement.focus();
301
- globalKey.currentElement.focus();
302
- } catch (error) {}
303
-
304
- switch (item) {
305
- case "del":
306
- if (keyStore.isChinese && cn_input.value?.length) {
307
- // 处理拼音删除
308
- delPinyin();
309
- } else {
310
- // 普通删除
311
- delInputText();
312
- }
313
-
314
- break;
315
- case "shift":
316
- toUpKeyCase.value = !toUpKeyCase.value;
317
- lists.value = lists.value.map((i) => {
318
- i = i.map((j) => {
319
- if (j.length == 1) {
320
- if (toUpKeyCase.value) return j.toUpperCase();
321
- else return j.toLowerCase();
322
- } else {
323
- return j;
324
- }
325
- });
326
- return i;
327
- });
328
- break;
329
- case "space":
330
- // keyStore.currentElement.value += " ";
331
- setInputValue(" ");
332
- break;
333
- case "&123":
334
- lists.value = symbolMap1;
335
- toUpKeyCase.value = false;
336
- isSymbol.value = true;
337
-
338
- break;
339
- case "ABC":
340
- lists.value = textKeyMap;
341
- isSymbol.value = false;
342
- break;
343
- case "#+=":
344
- lists.value = symbolMap2;
345
- break;
346
- case "123":
347
- lists.value = symbolMap1;
348
-
349
- break;
350
- case "enter":
351
- // keyStore.currentElement.value += "\n";
352
- globalKey.currentElement.value += "\n";
353
- break;
354
- default:
355
- if (keyStore.isChinese && !toUpKeyCase.value) {
356
- chinese(item);
357
- } else {
358
- setInputValue(item);
359
- }
360
-
361
- break;
362
- }
267
+ try {
268
+ // keyStore.currentElement.focus();
269
+ globalKey.currentElement.focus();
270
+ } catch (error) {}
271
+
272
+ switch (item) {
273
+ case "del":
274
+ if (keyStore.isChinese && cn_input.value?.length) {
275
+ // 处理拼音删除
276
+ delPinyin();
277
+ } else {
278
+ // 普通删除
279
+ delInputText();
280
+ }
281
+
282
+ break;
283
+ case "shift":
284
+ toUpKeyCase.value = !toUpKeyCase.value;
285
+ lists.value = lists.value.map((i) => {
286
+ i = i.map((j) => {
287
+ if (j.length == 1) {
288
+ if (toUpKeyCase.value) return j.toUpperCase();
289
+ else return j.toLowerCase();
290
+ } else {
291
+ return j;
292
+ }
293
+ });
294
+ return i;
295
+ });
296
+ break;
297
+ case "space":
298
+ // keyStore.currentElement.value += " ";
299
+ setInputValue(" ");
300
+ break;
301
+ case "&123":
302
+ lists.value = symbolMap1;
303
+ toUpKeyCase.value = false;
304
+ isSymbol.value = true;
305
+
306
+ break;
307
+ case "ABC":
308
+ lists.value = textKeyMap;
309
+ isSymbol.value = false;
310
+ break;
311
+ case "#+=":
312
+ lists.value = symbolMap2;
313
+ break;
314
+ case "123":
315
+ lists.value = symbolMap1;
316
+
317
+ break;
318
+ case "enter":
319
+ // keyStore.currentElement.value += "\n";
320
+ globalKey.currentElement.value += "\n";
321
+ break;
322
+ default:
323
+ if (keyStore.isChinese && !toUpKeyCase.value) {
324
+ chinese(item);
325
+ } else {
326
+ setInputValue(item);
327
+ }
328
+
329
+ break;
330
+ }
363
331
  };
364
332
 
365
333
  /**删除字符串的某个字符*/
366
334
  const delStringLast = (text, index) => {
367
- if (index < 0) return;
368
- let arrText = text.split("");
369
- if (index > 0) {
370
- arrText[index - 1] = "";
371
- } else {
372
- arrText[index] = "";
373
- }
374
-
375
- arrText = arrText.filter((item) => item);
376
- const endIndex = arrText.length - 1;
377
- if (arrText[endIndex] === "'") {
378
- arrText[endIndex] = "";
379
- }
380
- let result = arrText.join("");
381
-
382
- return result;
335
+ if (index < 0) return;
336
+ let arrText = text.split("");
337
+ if (index > 0) {
338
+ arrText[index - 1] = "";
339
+ } else {
340
+ arrText[index] = "";
341
+ }
342
+
343
+ arrText = arrText.filter((item) => item);
344
+ const endIndex = arrText.length - 1;
345
+ if (arrText[endIndex] === "'") {
346
+ arrText[endIndex] = "";
347
+ }
348
+ let result = arrText.join("");
349
+
350
+ return result;
383
351
  };
384
352
  // 拼音删除
385
353
  const delPinyin = () => {
386
- cn_input.value = delStringLast(cn_input.value, cn_input.value.length);
387
- if (cn_input.value === "") {
388
- cn_list_str.value = [];
389
- return;
390
- }
391
- const specialPinYin = ["u", "v", "i"].includes(cn_input.value.split("")[0]);
392
- if (cn_list_str.value && cn_list_str.value.length === 1 && specialPinYin) {
393
- //@ts-ignore
394
- cn_list_str.value = [cn_input.value];
395
- return;
396
- }
397
- let re = new RegExp(`^${cn_input.value}\\w*`);
398
- let keys = Object.keys(dict)
399
- .filter((key) => {
400
- const result = re.test(key);
401
- return result;
402
- })
403
- .sort();
404
-
405
- cn_list_str.value =
406
- (keys.length > 1
407
- ? keys.reduce((a, b) => a + dict[b], "")
408
- : dict[keys[0]]) || "".split("");
409
-
410
- findChinese("del");
354
+ cn_input.value = delStringLast(cn_input.value, cn_input.value.length);
355
+ if (cn_input.value === "") {
356
+ cn_list_str.value = [];
357
+ return;
358
+ }
359
+ const specialPinYin = ["u", "v", "i"].includes(cn_input.value.split("")[0]);
360
+ if (cn_list_str.value && cn_list_str.value.length === 1 && specialPinYin) {
361
+ //@ts-ignore
362
+ cn_list_str.value = [cn_input.value];
363
+ return;
364
+ }
365
+ let re = new RegExp(`^${cn_input.value}\\w*`);
366
+ let keys = Object.keys(dict)
367
+ .filter((key) => {
368
+ const result = re.test(key);
369
+ return result;
370
+ })
371
+ .sort();
372
+
373
+ cn_list_str.value =
374
+ (keys.length > 1 ? keys.reduce((a, b) => a + dict[b], "") : dict[keys[0]]) ||
375
+ "".split("");
376
+
377
+ findChinese("del");
411
378
  };
412
379
 
413
380
  // 普通删除字符
414
381
  const delInputText = () => {
415
- // let carePos = getCaretPosition(keyStore.currentElement);
416
- let carePos = getCaretPosition(globalKey.currentElement);
417
- // let text = keyStore.currentElement.value;
418
- let text = globalKey.currentElement.value;
419
- if (carePos <= 0 || carePos > text.length) {
420
- // keyStore.currentElement.value = text;
421
- globalKey.currentElement.value = text;
422
- } else {
423
- // keyStore.currentElement.value =
424
- // text.slice(0, carePos - 1) + text.slice(carePos);
425
- globalKey.currentElement.value =
426
- text.slice(0, carePos - 1) + text.slice(carePos);
427
- }
428
- // keyStore.currentElement.setSelectionRange(carePos - 1, carePos - 1);
429
- globalKey.currentElement.setSelectionRange(carePos - 1, carePos - 1);
430
- triggerModel();
382
+ // let carePos = getCaretPosition(keyStore.currentElement);
383
+ let carePos = getCaretPosition(globalKey.currentElement);
384
+ // let text = keyStore.currentElement.value;
385
+ let text = globalKey.currentElement.value;
386
+ if (carePos <= 0 || carePos > text.length) {
387
+ // keyStore.currentElement.value = text;
388
+ globalKey.currentElement.value = text;
389
+ } else {
390
+ // keyStore.currentElement.value =
391
+ // text.slice(0, carePos - 1) + text.slice(carePos);
392
+ globalKey.currentElement.value = text.slice(0, carePos - 1) + text.slice(carePos);
393
+ }
394
+ // keyStore.currentElement.setSelectionRange(carePos - 1, carePos - 1);
395
+ globalKey.currentElement.setSelectionRange(carePos - 1, carePos - 1);
396
+ triggerModel();
431
397
  };
432
398
 
433
399
  // 输入内容
434
400
  const setInputValue = (item) => {
435
- item = `${item}`;
436
- // let carePos = getCaretPosition(keyStore.currentElement);
437
- let carePos = getCaretPosition(globalKey.currentElement);
438
-
439
- // let text = keyStore.currentElement.value;
440
- let text = globalKey.currentElement.value;
441
-
442
- if (carePos <= 0) {
443
- text = item + text;
444
- } else if (carePos > text.length) {
445
- text = text + item;
446
- } else {
447
- text = text.slice(0, carePos) + item + text.slice(carePos);
448
- }
449
-
450
- // if (toUpKeyCase.value) {
451
- // // keyStore.currentElement.value = `${text}`.toUpperCase();
452
- // globalKey.currentElement.value = `${text}`.toUpperCase();
453
- // } else {
454
- // // keyStore.currentElement.value = text;
455
- // globalKey.currentElement.value = text;
456
- // }
457
- globalKey.currentElement.value = text;
458
- carePos += item.length + 1;
459
-
460
- // keyStore.currentElement.setSelectionRange(carePos - 1, carePos - 1);
461
- globalKey.currentElement.setSelectionRange(carePos - 1, carePos - 1);
462
- triggerModel();
463
- // const reg = /^[a-zA-Z]$/;
464
- // if (toUpKeyCase.value && reg.test(item)) {
465
- // keyStore.currentElement.value += item.toUpperCase();
466
- // } else {
467
- // keyStore.currentElement.value += item;
468
- // }
401
+ item = `${item}`;
402
+ // let carePos = getCaretPosition(keyStore.currentElement);
403
+ let carePos = getCaretPosition(globalKey.currentElement);
404
+
405
+ // let text = keyStore.currentElement.value;
406
+ let text = globalKey.currentElement.value;
407
+
408
+ if (carePos <= 0) {
409
+ text = item + text;
410
+ } else if (carePos > text.length) {
411
+ text = text + item;
412
+ } else {
413
+ text = text.slice(0, carePos) + item + text.slice(carePos);
414
+ }
415
+
416
+ // if (toUpKeyCase.value) {
417
+ // // keyStore.currentElement.value = `${text}`.toUpperCase();
418
+ // globalKey.currentElement.value = `${text}`.toUpperCase();
419
+ // } else {
420
+ // // keyStore.currentElement.value = text;
421
+ // globalKey.currentElement.value = text;
422
+ // }
423
+ globalKey.currentElement.value = text;
424
+ carePos += item.length + 1;
425
+
426
+ // keyStore.currentElement.setSelectionRange(carePos - 1, carePos - 1);
427
+ globalKey.currentElement.setSelectionRange(carePos - 1, carePos - 1);
428
+ triggerModel();
429
+ // const reg = /^[a-zA-Z]$/;
430
+ // if (toUpKeyCase.value && reg.test(item)) {
431
+ // keyStore.currentElement.value += item.toUpperCase();
432
+ // } else {
433
+ // keyStore.currentElement.value += item;
434
+ // }
469
435
  };
470
436
 
471
437
  const cn_input = ref("");
@@ -479,244 +445,236 @@ let doubleSpell = {};
479
445
 
480
446
  // 获取词库
481
447
  const getChinese = () => {
482
- const promise = import("./static/dict/baseDict.json").then((res) => {
483
- dict = res;
448
+ const promise = import("./static/dict/baseDict.json").then((res) => {
449
+ dict = res;
450
+ });
451
+
452
+ const promise1 = import("./static/dict/chowder.json").then((res) => {
453
+ doubleSpell = res;
454
+ });
455
+ promiseList.push(promise1);
456
+ Promise.all(promiseList)
457
+ .then(() => {
458
+ console.log("加载完成");
459
+ })
460
+ .catch((err) => {
461
+ console.error("词库错误", err);
484
462
  });
485
-
486
- const promise1 = import("./static/dict/chowder.json").then((res) => {
487
- doubleSpell = res;
488
- });
489
- promiseList.push(promise1);
490
- Promise.all(promiseList)
491
- .then(() => {
492
- console.log("加载完成");
493
- })
494
- .catch((err) => {
495
- console.error("词库错误", err);
496
- });
497
463
  };
498
464
  getChinese();
499
465
 
500
466
  // 中文输入
501
467
  const chinese = (key) => {
502
- const reg = /^[a-zA-Z]$/;
503
- if (!reg.test(key)) {
504
- setInputValue(key);
505
- return;
506
- }
507
- cn_input.value += key; //拼音输入框添加拼音
508
- if (cn_input.value[0] == "'") {
509
- cn_input.value = cn_input.value.slice(1);
510
- }
511
- const specialPinYin = ["u", "v", "i"].includes(cn_input.value.split("")[0]); //判断是否是特殊拼音
512
- if (specialPinYin) {
513
- //如果是特殊拼音
514
- if (!cn_list_str.value.length) {
515
- //如果没有拼音列表
516
- //@ts-ignore
517
- cn_list_str.value = [key]; //拼音列表添加拼音
518
- } else {
519
- const value = cn_list_str.value[0] + key; //拼音列表第一个拼音加上当前拼音
520
- //@ts-ignore
521
- cn_list_str.value[0] = value; //拼音列表第一个拼音替换为新的拼音
522
- }
523
- return;
468
+ const reg = /^[a-zA-Z]$/;
469
+ if (!reg.test(key)) {
470
+ setInputValue(key);
471
+ return;
472
+ }
473
+ cn_input.value += key; //拼音输入框添加拼音
474
+ if (cn_input.value[0] == "'") {
475
+ cn_input.value = cn_input.value.slice(1);
476
+ }
477
+ const specialPinYin = ["u", "v", "i"].includes(cn_input.value.split("")[0]); //判断是否是特殊拼音
478
+ if (specialPinYin) {
479
+ //如果是特殊拼音
480
+ if (!cn_list_str.value.length) {
481
+ //如果没有拼音列表
482
+ //@ts-ignore
483
+ cn_list_str.value = [key]; //拼音列表添加拼音
484
+ } else {
485
+ const value = cn_list_str.value[0] + key; //拼音列表第一个拼音加上当前拼音
486
+ //@ts-ignore
487
+ cn_list_str.value[0] = value; //拼音列表第一个拼音替换为新的拼音
524
488
  }
489
+ return;
490
+ }
525
491
 
526
- findChinese("add", key); //查找中文
492
+ findChinese("add", key); //查找中文
527
493
  };
528
494
 
529
495
  // 查字典
530
496
  const findChinese = (type, key) => {
531
- // type = del key不需要传,type = add key必须要传
532
- l_min.value = 0; //最小值
533
- l_max.value = 10; //最大值
534
- const pinYinList = cn_input.value.split("'"); //拼音列表
535
- let pinYin = pinYinList[pinYinList.length - 1]; //当前拼音
536
-
537
- let re = new RegExp(`^${pinYin}\\w*`); //正则,匹配当前拼音开头的拼音
538
- let keys = Object.keys(dict) //获取拼音字典的key
539
- .filter((item) => {
540
- //过滤
541
- let strList = pinYin.split(""); //当前拼音转数组
542
-
543
- const temp = ["h", "o", "n", "a", "e"].includes(
544
- strList[strList.length - 1] //判断是否是特殊拼音
545
- );
546
- if (pinYin.length >= 2 && !temp) {
547
- //如果是特殊拼音
548
- if (item === pinYin) return true; //如果拼音字典的key等于当前拼音,返回true
549
- } else {
550
- let result = re.test(item); //如果不是特殊拼音,返回正则匹配结果
551
- return result;
552
- }
553
- })
554
- .sort();
555
- cn_list_str.value =
556
- keys.length > 1
557
- ? keys.reduce((a, b) => a + dict[b], "")
558
- : dict[keys[0]]; //如果拼音列表大于1,拼接拼音列表,否则直接赋值
559
- // cn_list_str.value = cn_list_str.value.replaceAll("[object Object]", "");
560
-
561
- if (!cn_list_str.value || (!cn_list_str.value.length && type === "del")) {
562
- //如果拼音列表不存在或者拼音列表长度为0并且type为del
563
- cn_input.value = cn_input.value.replace(
564
- new RegExp(`(.*)${key}`),
565
- `$1'${key}`
566
- );
567
- }
568
-
569
- if (!cn_list_str.value && !Array.isArray(cn_list_str.value)) {
570
- cn_list_str.value = [];
571
- }
497
+ // type = del key不需要传,type = add key必须要传
498
+ l_min.value = 0; //最小值
499
+ l_max.value = 10; //最大值
500
+ const pinYinList = cn_input.value.split("'"); //拼音列表
501
+ let pinYin = pinYinList[pinYinList.length - 1]; //当前拼音
502
+
503
+ let re = new RegExp(`^${pinYin}\\w*`); //正则,匹配当前拼音开头的拼音
504
+ let keys = Object.keys(dict) //获取拼音字典的key
505
+ .filter((item) => {
506
+ //过滤
507
+ let strList = pinYin.split(""); //当前拼音转数组
508
+
509
+ const temp = ["h", "o", "n", "a", "e"].includes(
510
+ strList[strList.length - 1] //判断是否是特殊拼音
511
+ );
512
+ if (pinYin.length >= 2 && !temp) {
513
+ //如果是特殊拼音
514
+ if (item === pinYin) return true; //如果拼音字典的key等于当前拼音,返回true
515
+ } else {
516
+ let result = re.test(item); //如果不是特殊拼音,返回正则匹配结果
517
+ return result;
518
+ }
519
+ })
520
+ .sort();
521
+ cn_list_str.value =
522
+ keys.length > 1 ? keys.reduce((a, b) => a + dict[b], "") : dict[keys[0]]; //如果拼音列表大于1,拼接拼音列表,否则直接赋值
523
+ // cn_list_str.value = cn_list_str.value.replaceAll("[object Object]", "");
524
+
525
+ if (!cn_list_str.value || (!cn_list_str.value.length && type === "del")) {
526
+ //如果拼音列表不存在或者拼音列表长度为0并且type为del
527
+ cn_input.value = cn_input.value.replace(new RegExp(`(.*)${key}`), `$1'${key}`);
528
+ }
529
+
530
+ if (!cn_list_str.value && !Array.isArray(cn_list_str.value)) {
531
+ cn_list_str.value = [];
532
+ }
572
533
 
573
- keys = cn_input.value.split("'");
534
+ keys = cn_input.value.split("'");
574
535
 
575
- if (keys.length >= 2) {
576
- cn_list_str.value = [];
577
- findDoubleSpell();
578
- }
536
+ if (keys.length >= 2) {
537
+ cn_list_str.value = [];
538
+ findDoubleSpell();
539
+ }
579
540
  };
580
541
 
581
542
  // 连续输入
582
543
  const findDoubleSpell = () => {
583
- let keys = cn_input.value.split("'");
584
- const partDict = doubleSpell[cn_input.value.charAt(0)];
585
- if (!partDict) return;
586
- if (["an"].includes(keys[keys.length - 1])) {
587
- let tempStr = keys[keys.length - 2];
588
- if (["n"].includes(tempStr.charAt(tempStr.length - 1))) {
589
- let newTempStr = tempStr.slice(0, tempStr.length - 1);
590
- keys = [
591
- newTempStr,
592
- tempStr.slice(tempStr.length - 1) + keys[keys.length - 1],
593
- ];
594
- cn_input.value = keys.join("'");
595
- }
544
+ let keys = cn_input.value.split("'");
545
+ const partDict = doubleSpell[cn_input.value.charAt(0)];
546
+ if (!partDict) return;
547
+ if (["an"].includes(keys[keys.length - 1])) {
548
+ let tempStr = keys[keys.length - 2];
549
+ if (["n"].includes(tempStr.charAt(tempStr.length - 1))) {
550
+ let newTempStr = tempStr.slice(0, tempStr.length - 1);
551
+ keys = [newTempStr, tempStr.slice(tempStr.length - 1) + keys[keys.length - 1]];
552
+ cn_input.value = keys.join("'");
596
553
  }
554
+ }
597
555
 
598
- let keyResult = Object.keys(partDict).filter((key) => {
599
- const keys = key.split("'");
600
- const cn_inputList = cn_input.value.split("'");
601
- const isLen = cn_inputList.length === keys.length;
602
- if (!isLen) return;
603
- let result = true;
604
- for (let i = 0; i < keys.length; i++) {
605
- if (keys[i].charAt(0) != cn_inputList[i].charAt(0)) {
606
- result = false;
607
- } else {
608
- const keyItemList = keys[i].split("");
609
- const strList = cn_inputList[i].split("");
610
- for (let j = 0; j < strList.length; j++) {
611
- if (!strList[j]) break;
612
- if (keyItemList[j] != strList[j]) {
613
- result = false;
614
- }
615
- }
616
- }
617
- }
618
- if (result && isLen) {
619
- return partDict[key];
620
- }
621
- });
622
-
623
- let strList = [];
624
- let singleDictList = [];
625
- const singleDict = dict;
626
- for (let key of keyResult) {
627
- let keyList = key.split("'");
628
- strList.push(partDict[key].split(","));
629
- for (let item of keyList) {
630
- if (singleDict[item]) {
631
- singleDictList.push(singleDict[item].split(""));
632
- }
556
+ let keyResult = Object.keys(partDict).filter((key) => {
557
+ const keys = key.split("'");
558
+ const cn_inputList = cn_input.value.split("'");
559
+ const isLen = cn_inputList.length === keys.length;
560
+ if (!isLen) return;
561
+ let result = true;
562
+ for (let i = 0; i < keys.length; i++) {
563
+ if (keys[i].charAt(0) != cn_inputList[i].charAt(0)) {
564
+ result = false;
565
+ } else {
566
+ const keyItemList = keys[i].split("");
567
+ const strList = cn_inputList[i].split("");
568
+ for (let j = 0; j < strList.length; j++) {
569
+ if (!strList[j]) break;
570
+ if (keyItemList[j] != strList[j]) {
571
+ result = false;
572
+ }
633
573
  }
574
+ }
634
575
  }
635
- if (!keyResult.length && keys.length) {
636
- for (let item of keys) {
637
- if (singleDict[item]) {
638
- singleDictList.push(singleDict[item].split(""));
639
- }
640
- }
576
+ if (result && isLen) {
577
+ return partDict[key];
578
+ }
579
+ });
580
+
581
+ let strList = [];
582
+ let singleDictList = [];
583
+ const singleDict = dict;
584
+ for (let key of keyResult) {
585
+ let keyList = key.split("'");
586
+ strList.push(partDict[key].split(","));
587
+ for (let item of keyList) {
588
+ if (singleDict[item]) {
589
+ singleDictList.push(singleDict[item].split(""));
590
+ }
641
591
  }
592
+ }
593
+ if (!keyResult.length && keys.length) {
594
+ for (let item of keys) {
595
+ if (singleDict[item]) {
596
+ singleDictList.push(singleDict[item].split(""));
597
+ }
598
+ }
599
+ }
642
600
 
643
- singleDictList = Array.from(new Set(singleDictList.flat(2)));
644
- strList = strList
645
- .flat(2)
646
- //@ts-ignore
647
- .sort((a, b) => {
648
- if (b.length > a.length) return -1;
649
- })
650
- .reverse();
601
+ singleDictList = Array.from(new Set(singleDictList.flat(2)));
602
+ strList = strList
603
+ .flat(2)
651
604
  //@ts-ignore
652
- cn_list_str.value = strList.concat(singleDictList);
605
+ .sort((a, b) => {
606
+ if (b.length > a.length) return -1;
607
+ })
608
+ .reverse();
609
+ //@ts-ignore
610
+ cn_list_str.value = strList.concat(singleDictList);
653
611
  };
654
612
 
655
613
  //获取光标位置
656
614
  const getCaretPosition = (element) => {
657
- let carePos = 0;
658
- try {
659
- carePos = element.selectionStart;
660
- } catch (error) {}
661
- cursorPosition.value = carePos;
662
- return carePos;
663
- // sel,
664
- // range;
665
-
666
- // if (window.getSelection) {
667
- // sel = window.getSelection();
668
-
669
- // if (sel?.rangeCount) {
670
- // range = sel.getRangeAt(0);
671
- // console.log(
672
- // "🚀 ~ file: Keyboardcon.vue:459 ~ getCaretPosition ~ range:",
673
- // range
674
- // );
675
- // if (range.commonAncestorContainer.children[0] == element) {
676
- // // carePos = range.endOffset;
677
- // carePos = range.endOffset;
678
-
679
- // if (
680
- // range.commonAncestorContainer
681
- // // range.commonAncestorContainer.length !=
682
- // // range.commonAncestorContainer.data.trim().length
683
- // ) {
684
- // carePos -= 1;
685
- // }
686
- // }
687
- // }
688
- // }
615
+ let carePos = 0;
616
+ try {
617
+ carePos = element.selectionStart;
618
+ } catch (error) {}
619
+ cursorPosition.value = carePos;
620
+ return carePos;
621
+ // sel,
622
+ // range;
623
+
624
+ // if (window.getSelection) {
625
+ // sel = window.getSelection();
626
+
627
+ // if (sel?.rangeCount) {
628
+ // range = sel.getRangeAt(0);
629
+ // console.log(
630
+ // "🚀 ~ file: Keyboardcon.vue:459 ~ getCaretPosition ~ range:",
631
+ // range
632
+ // );
633
+ // if (range.commonAncestorContainer.children[0] == element) {
634
+ // // carePos = range.endOffset;
635
+ // carePos = range.endOffset;
636
+
637
+ // if (
638
+ // range.commonAncestorContainer
639
+ // // range.commonAncestorContainer.length !=
640
+ // // range.commonAncestorContainer.data.trim().length
641
+ // ) {
642
+ // carePos -= 1;
643
+ // }
644
+ // }
645
+ // }
646
+ // }
689
647
  };
690
648
 
691
649
  // 符号切换
692
650
  const checkChinese = (item) => {
693
- console.log(cn_list_str.value);
694
- cn_input.value = "";
695
- cn_list_str.value = [];
696
- showMore.value = false;
697
- // keyStore.currentElement.focus();
698
- // keyStore.isChinese = !keyStore.isChinese;
699
- globalKey.currentElement.focus();
700
- keyStore.isChinese = !keyStore.isChinese;
651
+ console.log(cn_list_str.value);
652
+ cn_input.value = "";
653
+ cn_list_str.value = [];
654
+ showMore.value = false;
655
+ // keyStore.currentElement.focus();
656
+ // keyStore.isChinese = !keyStore.isChinese;
657
+ globalKey.currentElement.focus();
658
+ keyStore.isChinese = !keyStore.isChinese;
701
659
  };
702
660
 
703
661
  // 类型
704
662
  watchEffect(() => {
705
- if (keyStore.inputType == "number") {
706
- lists.value = numberKeyBoradMap;
707
- } else {
708
- lists.value = textKeyMap;
709
- }
663
+ if (keyStore.inputType == "number") {
664
+ lists.value = numberKeyBoradMap;
665
+ } else {
666
+ lists.value = textKeyMap;
667
+ }
710
668
  });
711
669
 
712
670
  //#endregion -----------------------------------------------------------
713
671
 
714
672
  //#region $sy global ------------------------------------------------------------
715
673
  const showKeyboard = () => {
716
- keyStore.keyboardcon = true;
674
+ keyStore.keyboardcon = true;
717
675
  };
718
676
  const hideKeyboard = () => {
719
- keyStore.keyboardcon = false;
677
+ keyStore.keyboardcon = false;
720
678
  };
721
679
  window.globalThis.$sy.key.open = showKeyboard;
722
680
  window.globalThis.$sy.key.close = hideKeyboard;
@@ -725,11 +683,11 @@ window.globalThis.$sy.key.close = hideKeyboard;
725
683
  //#region input ⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️
726
684
  // 手动触发input事件
727
685
  const triggerModel = () => {
728
- globalKey.currentElement.dispatchEvent(new Event("input"));
686
+ globalKey.currentElement.dispatchEvent(new Event("input"));
729
687
  };
730
688
 
731
689
  const makeFocus = (e) => {
732
- globalKey.currentElement.focus();
690
+ globalKey.currentElement.focus();
733
691
  };
734
692
 
735
693
  //#endregion ⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️
@@ -745,33 +703,32 @@ const longpressSt = ref(false);
745
703
 
746
704
  // 定义长按事件逻辑
747
705
  const onLongPress = (t) => {
748
- // alert("长按事件触发");
749
- longpressSt.value = setInterval(() => {
750
- // console.log("长按触发", t);
751
- choosekey(t);
752
- }, 50);
706
+ // alert("长按事件触发");
707
+ longpressSt.value = setInterval(() => {
708
+ // console.log("长按触发", t);
709
+ choosekey(t);
710
+ }, 50);
753
711
  };
754
712
 
755
713
  // 开始按压的处理函数
756
714
  const startPress = (e) => {
757
- let value =
758
- e.target.children[0]?.innerText || e.target.children[0].className;
759
- if (value != "del") return;
760
- pressTimer.value = setTimeout(() => {
761
- onLongPress(value);
762
- }, 500); // 设置长按时间为500毫秒
715
+ let value = e.target.children[0]?.innerText || e.target.children[0].className;
716
+ if (value != "del") return;
717
+ pressTimer.value = setTimeout(() => {
718
+ onLongPress(value);
719
+ }, 500); // 设置长按时间为500毫秒
763
720
  };
764
721
 
765
722
  // 结束按压的处理函数
766
723
  const endPress = () => {
767
- clearTimeout(pressTimer.value);
768
- clearInterval(longpressSt.value);
724
+ clearTimeout(pressTimer.value);
725
+ clearInterval(longpressSt.value);
769
726
  };
770
727
 
771
728
  // 取消按压的处理函数
772
729
  const cancelPress = () => {
773
- clearTimeout(pressTimer.value);
774
- clearInterval(longpressSt.value);
730
+ clearTimeout(pressTimer.value);
731
+ clearInterval(longpressSt.value);
775
732
  };
776
733
 
777
734
  // 添加和清理事件监听器
@@ -785,446 +742,445 @@ const cancelPress = () => {
785
742
  @import "./theme.scss";
786
743
 
787
744
  .defaultCss {
788
- --h: 4vh;
789
- --gap: 0.6vh;
790
- --fontSize: 2vh;
791
- --borra: 0.4vh;
745
+ --h: 4vh;
746
+ --gap: 0.6vh;
747
+ --fontSize: 2vh;
748
+ --borra: 0.4vh;
792
749
  }
793
750
 
794
751
  .upKeyCase {
795
- --fontSize: 2vh;
752
+ --fontSize: 2vh;
796
753
  }
797
754
 
798
755
  .keyboardcon {
799
- position: fixed;
800
- background-color: #212123;
801
- width: 100%;
802
- max-width: 1280px;
803
- margin: auto;
804
- left: 0;
805
- right: 0;
806
- bottom: 0;
807
- font-size: var(--fontSize);
808
- padding: 1.2vh 1.2vh 0.6vh;
756
+ position: fixed;
757
+ background-color: #212123;
758
+ width: 100%;
759
+ max-width: 1280px;
760
+ margin: auto;
761
+ left: 0;
762
+ right: 0;
763
+ bottom: 0;
764
+ font-size: var(--fontSize);
765
+ padding: 1.2vh 1.2vh 0.6vh;
766
+ box-sizing: border-box;
767
+ box-shadow: 0 0 1.5vh 0 rgb(117, 117, 117);
768
+ z-index: 10000;
769
+ // // @include key_background("keyboard_background");
770
+ background: var(--keyboard_background);
771
+ border-radius: 1.2vh 1.2vh 0 0;
772
+ transition: all 0.2s;
773
+ & * {
809
774
  box-sizing: border-box;
810
- box-shadow: 0 0 1.5vh 0 rgb(117, 117, 117);
811
- z-index: 10000;
812
- // // @include key_background("keyboard_background");
813
- background: var(--keyboard_background);
814
- border-radius: 1.2vh 1.2vh 0 0;
815
- transition: all 0.2s;
816
- & * {
817
- box-sizing: border-box;
775
+ }
776
+ .btns {
777
+ color: rgb(0, 123, 255);
778
+ display: flex;
779
+ justify-content: space-between;
780
+ align-items: center;
781
+ margin: 1.2vh 0;
782
+ font-size: 1.2vh;
783
+ cursor: pointer;
784
+ > div {
785
+ height: 1.2vh;
786
+ span {
787
+ color: gainsboro;
788
+ transition: all 0.3s;
789
+ }
790
+ }
791
+
792
+ .ch {
793
+ font-size: 1.4vh;
794
+ color: rgb(0, 123, 255);
795
+ }
796
+ }
797
+
798
+ .chinese {
799
+ // border: 1px solid red;
800
+
801
+ .pinyin {
802
+ padding: 4px;
803
+ box-sizing: border-box;
804
+ // border: 1px solid red;
818
805
  }
819
- .btns {
820
- color: rgb(0, 123, 255);
806
+
807
+ .wenzi {
808
+ position: relative;
809
+ height: 3.6vh;
810
+
811
+ // border: 1px solid red;
812
+ background: var(--keyboard_background);
813
+ margin-bottom: 0.6vh;
814
+ .wenzi_box {
821
815
  display: flex;
822
- justify-content: space-between;
823
- align-items: center;
824
- margin: 1.2vh 0;
825
- font-size: 1.2vh;
826
- cursor: pointer;
827
- > div {
828
- height: 1.2vh;
829
- span {
830
- color: gainsboro;
831
- transition: all 0.3s;
832
- }
816
+ // flex-wrap: wrap;
817
+ gap: 10px;
818
+ padding: 5px;
819
+ overflow: auto;
820
+ &::-webkit-scrollbar {
821
+ display: none; /* 适用于 Chrome, Safari 和 Opera */
833
822
  }
823
+ scrollbar-width: none; /* 适用于 Firefox */
824
+ position: absolute;
825
+ left: 0;
826
+ top: 0;
827
+ width: 98%;
828
+ height: 100%;
829
+ background: var(--keyboard_background);
830
+ z-index: 1;
831
+ transition: all 0.5s;
832
+ box-sizing: border-box;
834
833
 
835
- .ch {
836
- font-size: 1.4vh;
837
- color: rgb(0, 123, 255);
834
+ span {
835
+ flex-shrink: 0;
836
+ padding: 0.24vh 0.48vh;
837
+ border-radius: 6px;
838
+ // border: 1px solid red;
839
+ height: fit-content;
840
+
841
+ &:active {
842
+ // @include key_background("key_active_background");
843
+ background: var(--key_active_background);
844
+ box-shadow: inset 0px 0px 2px 2px #65708220;
845
+ transform: scale(0.99);
846
+ }
838
847
  }
839
- }
848
+ }
849
+
850
+ .wenzi_box_more {
851
+ // flex-wrap: wrap;
852
+ padding-right: 1.8vh;
853
+ box-sizing: border-box;
854
+ width: 102%;
855
+ left: -0.18vh;
856
+ // height: 31vh;
857
+ height: 25vh;
840
858
 
841
- .chinese {
859
+ // border: 1px solid red;
860
+ }
861
+
862
+ .moreText {
863
+ position: absolute;
864
+ height: 3.5vh;
865
+ top: 0;
866
+ right: -5px;
867
+ z-index: 100;
868
+ padding: 0 0.3vh;
869
+ display: flex;
870
+ justify-content: center;
871
+ align-items: center;
872
+ border-radius: var(--borra);
842
873
  // border: 1px solid red;
843
874
 
844
- .pinyin {
845
- padding: 4px;
846
- box-sizing: border-box;
847
- // border: 1px solid red;
875
+ // @include key_background("keyboard_background");
876
+ background: var(--keyboard_background);
877
+
878
+ &:active {
879
+ // @include key_background("key_active_background");
880
+ background: var(--key_active_background);
881
+ box-shadow: inset 0px 0px 2px 2px #65708220;
882
+ transform: scale(0.99);
848
883
  }
849
884
 
850
- .wenzi {
851
- position: relative;
852
- height: 3.6vh;
885
+ .el-icon {
886
+ transition: all 0.4s ease;
887
+ }
888
+ }
889
+ }
890
+ }
891
+
892
+ .number_list {
893
+ display: grid;
894
+ grid-template-columns: repeat(3, 1fr);
895
+ text-align: center;
896
+ gap: var(--gap);
897
+
898
+ .key_item {
899
+ border-radius: 3px;
900
+ font-weight: bold;
901
+ overflow: hidden;
902
+ user-select: none;
903
+ // @include key_color("key_color");
904
+ color: var(--key_color);
905
+ .key {
906
+ box-shadow: inset 0px 0px 2px 0px #8f9eae;
907
+ // @include key_background("key_background");
908
+ border-radius: var(--borra);
909
+
910
+ background: var(--keyboard_background);
911
+ height: var(--h);
912
+ display: flex;
913
+ justify-content: center;
914
+ align-items: center;
915
+ // padding: 6px 0;
853
916
 
854
- // border: 1px solid red;
855
- background: var(--keyboard_background);
856
- margin-bottom: 0.6vh;
857
- .wenzi_box {
858
- display: flex;
859
- // flex-wrap: wrap;
860
- gap: 10px;
861
- padding: 5px;
862
- overflow: auto;
863
- &::-webkit-scrollbar {
864
- display: none; /* 适用于 Chrome, Safari 和 Opera */
865
- }
866
- scrollbar-width: none; /* 适用于 Firefox */
867
- position: absolute;
868
- left: 0;
869
- top: 0;
870
- width: 98%;
871
- height: 100%;
872
- background: var(--keyboard_background);
873
- z-index: 1;
874
- transition: all 0.5s;
875
- box-sizing: border-box;
876
-
877
- span {
878
- flex-shrink: 0;
879
- padding: 0.24vh 0.48vh;
880
- border-radius: 6px;
881
- // border: 1px solid red;
882
- height: fit-content;
883
-
884
- &:active {
885
- // @include key_background("key_active_background");
886
- background: var(--key_active_background);
887
- box-shadow: inset 0px 0px 2px 2px #65708220;
888
- transform: scale(0.99);
889
- }
890
- }
891
- }
917
+ &:active {
918
+ // @include key_background("key_active_background");
919
+ background: var(--key_active_background);
920
+ box-shadow: inset 0px 0px 2px 2px #65708220;
921
+ transform: scale(0.99);
922
+ }
923
+ }
892
924
 
893
- .wenzi_box_more {
894
- // flex-wrap: wrap;
895
- padding-right: 1.8vh;
896
- box-sizing: border-box;
897
- width: 102%;
898
- left: -0.18vh;
899
- // height: 31vh;
900
- height: 25vh;
925
+ .keys {
926
+ display: flex;
927
+ gap: 4px;
928
+ height: var(--h);
929
+ display: flex;
930
+ justify-content: center;
931
+ align-items: center;
901
932
 
902
- // border: 1px solid red;
903
- }
933
+ span {
934
+ flex: 1;
935
+ box-shadow: inset 0px 0px 2px 0px #8f9eae;
936
+ // @include key_background("key_background");
937
+ background: var(--key_background);
938
+ border-radius: 3px;
939
+ height: 100%;
940
+ display: flex;
941
+ justify-content: center;
942
+ align-items: center;
943
+
944
+ &:active {
945
+ // @include key_background("key_active_background");
946
+ background: var(--key_active_background);
947
+ box-shadow: inset 0px 0px 2px 2px #65708220;
948
+ transform: scale(0.99);
949
+ }
950
+ }
951
+ }
904
952
 
905
- .moreText {
906
- position: absolute;
907
- height: 3.5vh;
908
- top: 0;
909
- right: -5px;
910
- z-index: 100;
911
- padding: 0 0.3vh;
912
- display: flex;
913
- justify-content: center;
914
- align-items: center;
915
- border-radius: var(--borra);
916
- // border: 1px solid red;
917
-
918
- // @include key_background("keyboard_background");
919
- background: var(--keyboard_background);
920
-
921
- &:active {
922
- // @include key_background("key_active_background");
923
- background: var(--key_active_background);
924
- box-shadow: inset 0px 0px 2px 2px #65708220;
925
- transform: scale(0.99);
926
- }
927
-
928
- .el-icon {
929
- transition: all 0.4s ease;
930
- }
931
- }
953
+ .del {
954
+ display: flex;
955
+ justify-content: center;
956
+ align-items: center;
957
+ height: var(--h);
958
+
959
+ img {
960
+ transform: scale(0.9);
961
+ // @include filter("key_filter");
962
+ height: 100%;
963
+ filter: var(--key_filter);
932
964
  }
965
+ }
933
966
  }
967
+ }
968
+
969
+ .text_list {
970
+ --symbolP: 0 5%;
971
+ }
972
+ .isSymbol {
973
+ --symbolP: 0;
974
+ }
975
+ .text_list {
976
+ display: grid;
977
+ grid-template-columns: repeat(1, 1fr);
978
+ text-align: center;
979
+ gap: var(--gap);
980
+ color: rgb(238, 238, 238);
981
+
982
+ .key_item_row {
983
+ display: flex;
984
+ gap: var(--gap);
985
+ width: 100%;
986
+ // border: 1px solid red;
987
+ // 全部
988
+ .key_item_column {
989
+ // flex: 1;
990
+ font-weight: bold;
991
+ color: var(--key_color);
992
+ overflow: hidden;
993
+ user-select: none;
994
+ box-sizing: border-box;
995
+ display: flex;
996
+ justify-content: center;
997
+ align-items: center;
998
+ height: var(--h);
999
+ & span,
1000
+ & img {
1001
+ pointer-events: none;
1002
+ }
1003
+ .key {
1004
+ border-radius: var(--borra);
1005
+ display: flex;
1006
+ justify-content: center;
1007
+ align-items: center;
1008
+ height: 100%;
1009
+ width: 100%;
1010
+ font-size: var(--fontSize);
1011
+ box-shadow: inset 0px 0px 2px 0px #8f9eae;
1012
+
1013
+ background: var(--key_background);
1014
+ span {
1015
+ height: fit-content;
1016
+ line-height: 1.2vh;
1017
+ // border: 1px solid red;
1018
+ }
934
1019
 
935
- .number_list {
936
- display: grid;
937
- grid-template-columns: repeat(3, 1fr);
938
- text-align: center;
939
- gap: var(--gap);
1020
+ &:active {
1021
+ background: var(--key_active_background);
1022
+ box-shadow: inset 0px 0px 2px 2px #65708220;
1023
+ transform: scale(0.99);
1024
+ }
1025
+ }
1026
+ }
1027
+
1028
+ // 单独第一行
1029
+ &:nth-child(1) {
1030
+ // justify-content: center;
1031
+ .key_item_column {
1032
+ // border: 1px solid red;
1033
+ flex: 1;
1034
+ flex-shrink: 0;
1035
+ .key {
1036
+ padding: 0;
1037
+ box-sizing: border-box;
1038
+ }
1039
+ // flex: 1;
1040
+ }
1041
+ }
940
1042
 
941
- .key_item {
942
- border-radius: 3px;
943
- font-weight: bold;
944
- overflow: hidden;
945
- user-select: none;
946
- // @include key_color("key_color");
947
- color: var(--key_color);
1043
+ // 单独第2行
1044
+ &:nth-child(2) {
1045
+ display: flex;
1046
+ justify-content: center;
1047
+ padding: var(--symbolP);
1048
+ .key_item_column {
1049
+ flex-shrink: 0;
1050
+ flex: 1;
1051
+ .key {
1052
+ padding: 0;
1053
+ box-sizing: border-box;
1054
+ }
1055
+ }
1056
+
1057
+ // grid-template-columns: repeat(9, 1fr);
1058
+ }
1059
+
1060
+ --flw: 10%; // 3 4 头尾
1061
+ --mflw: 60px;
1062
+ // 单独第3行
1063
+ &:nth-child(3) {
1064
+ justify-self: center;
1065
+ display: flex;
1066
+
1067
+ .key_item_column {
1068
+ // flex: 1;
1069
+ &:nth-child(1) {
1070
+ padding: 0;
948
1071
  .key {
949
- box-shadow: inset 0px 0px 2px 0px #8f9eae;
950
- // @include key_background("key_background");
951
- border-radius: var(--borra);
952
-
953
- background: var(--keyboard_background);
954
- height: var(--h);
955
- display: flex;
956
- justify-content: center;
957
- align-items: center;
958
- // padding: 6px 0;
959
-
960
- &:active {
961
- // @include key_background("key_active_background");
962
- background: var(--key_active_background);
963
- box-shadow: inset 0px 0px 2px 2px #65708220;
964
- transform: scale(0.99);
965
- }
1072
+ box-sizing: border-box;
1073
+ display: flex;
1074
+ justify-content: center;
1075
+ align-items: center;
1076
+ font-size: 1.8vh;
1077
+ // border: 1px solid red;
1078
+ img {
1079
+ transform: scale(0.7);
1080
+ // @include filter("key_filter");
1081
+ filter: var(--key_filter);
1082
+ }
966
1083
  }
967
1084
 
968
- .keys {
969
- display: flex;
970
- gap: 4px;
971
- height: var(--h);
972
- display: flex;
973
- justify-content: center;
974
- align-items: center;
975
-
976
- span {
977
- flex: 1;
978
- box-shadow: inset 0px 0px 2px 0px #8f9eae;
979
- // @include key_background("key_background");
980
- background: var(--key_background);
981
- border-radius: 3px;
982
- height: 100%;
983
- display: flex;
984
- justify-content: center;
985
- align-items: center;
986
-
987
- &:active {
988
- // @include key_background("key_active_background");
989
- background: var(--key_active_background);
990
- box-shadow: inset 0px 0px 2px 2px #65708220;
991
- transform: scale(0.99);
992
- }
993
- }
1085
+ .toUpKeyCase {
1086
+ // box-shadow: none;
1087
+ // border: 1px solid red; ´
1088
+ img {
1089
+ // filter: invert(100%);
1090
+ }
994
1091
  }
995
-
996
- .del {
997
- display: flex;
998
- justify-content: center;
999
- align-items: center;
1000
- height: var(--h);
1001
-
1002
- img {
1003
- transform: scale(0.9);
1004
- // @include filter("key_filter");
1005
- height: 100%;
1006
- filter: var(--key_filter);
1007
- }
1092
+ }
1093
+
1094
+ &:first-child,
1095
+ &:last-child {
1096
+ width: var(--flw);
1097
+ min-width: var(--mflw);
1098
+
1099
+ img {
1100
+ transform: scale(0.8);
1101
+ height: 80%;
1102
+ // @include filter("key_filter");
1103
+ filter: var(--key_filter);
1008
1104
  }
1105
+ }
1106
+
1107
+ &:not(&:first-child, &:last-child) {
1108
+ flex: 1;
1109
+ }
1110
+
1111
+ .key {
1112
+ padding: 0;
1113
+ box-sizing: border-box;
1114
+ }
1009
1115
  }
1010
- }
1116
+ }
1011
1117
 
1012
- .text_list {
1013
- --symbolP: 0 5%;
1014
- }
1015
- .isSymbol {
1016
- --symbolP: 0;
1017
- }
1018
- .text_list {
1019
- display: grid;
1020
- grid-template-columns: repeat(1, 1fr);
1021
- text-align: center;
1022
- gap: var(--gap);
1023
- color: rgb(238, 238, 238);
1024
-
1025
- .key_item_row {
1026
- display: flex;
1027
- gap: var(--gap);
1028
- width: 100%;
1029
- // border: 1px solid red;
1030
- // 全部
1031
- .key_item_column {
1032
- // flex: 1;
1033
- font-weight: bold;
1034
- color: var(--key_color);
1035
- overflow: hidden;
1036
- user-select: none;
1037
- box-sizing: border-box;
1038
- display: flex;
1039
- justify-content: center;
1040
- align-items: center;
1041
- height: var(--h);
1042
- & span,
1043
- & img {
1044
- pointer-events: none;
1045
- }
1046
- .key {
1047
- border-radius: var(--borra);
1048
- display: flex;
1049
- justify-content: center;
1050
- align-items: center;
1051
- height: 100%;
1052
- width: 100%;
1053
- font-size: var(--fontSize);
1054
- box-shadow: inset 0px 0px 2px 0px #8f9eae;
1055
-
1056
- background: var(--key_background);
1057
- span {
1058
- height: fit-content;
1059
- line-height: 1.2vh;
1060
- // border: 1px solid red;
1061
- }
1062
-
1063
- &:active {
1064
- background: var(--key_active_background);
1065
- box-shadow: inset 0px 0px 2px 2px #65708220;
1066
- transform: scale(0.99);
1067
- }
1068
- }
1069
- }
1118
+ // 单独第4行
1119
+ &:nth-child(4) {
1120
+ grid-template-columns: 0.3fr 1fr 0.3fr;
1070
1121
 
1071
- // 单独第一行
1072
- &:nth-child(1) {
1073
- // justify-content: center;
1074
- .key_item_column {
1075
- // border: 1px solid red;
1076
- flex: 1;
1077
- flex-shrink: 0;
1078
- .key {
1079
- padding: 0;
1080
- box-sizing: border-box;
1081
- }
1082
- // flex: 1;
1083
- }
1084
- }
1122
+ .key_item_column {
1123
+ flex-shrink: 0;
1124
+
1125
+ // flex: 1;
1126
+ font-weight: 400;
1127
+ // border: 1px solid red;
1128
+ .key {
1129
+ padding: 0;
1130
+ box-sizing: border-box;
1131
+ font-size: 1.8vh;
1132
+ font-weight: bold;
1085
1133
 
1086
- // 单独第2行
1087
- &:nth-child(2) {
1088
- display: flex;
1089
- justify-content: center;
1090
- padding: var(--symbolP);
1091
- .key_item_column {
1092
- flex-shrink: 0;
1093
- flex: 1;
1094
- .key {
1095
- padding: 0;
1096
- box-sizing: border-box;
1097
- }
1098
- }
1099
-
1100
- // grid-template-columns: repeat(9, 1fr);
1134
+ img {
1135
+ height: 100%;
1101
1136
  }
1137
+ }
1102
1138
 
1103
- --flw: 10%; // 3 4 头尾
1104
- --mflw: 60px;
1105
- // 单独第3行
1106
- &:nth-child(3) {
1107
- justify-self: center;
1108
- display: flex;
1109
-
1110
- .key_item_column {
1111
- // flex: 1;
1112
- &:nth-child(1) {
1113
- padding: 0;
1114
- .key {
1115
- box-sizing: border-box;
1116
- display: flex;
1117
- justify-content: center;
1118
- align-items: center;
1119
- font-size: 1.8vh;
1120
- // border: 1px solid red;
1121
- img {
1122
- transform: scale(0.7);
1123
- // @include filter("key_filter");
1124
- filter: var(--key_filter);
1125
- }
1126
- }
1127
-
1128
- .toUpKeyCase {
1129
- box-shadow: none;
1130
- // border: 1px solid red; ´
1131
-
1132
- img {
1133
- filter: invert(100%);
1134
- }
1135
- }
1136
- }
1137
-
1138
- &:first-child,
1139
- &:last-child {
1140
- width: var(--flw);
1141
- min-width: var(--mflw);
1142
-
1143
- img {
1144
- transform: scale(0.8);
1145
- height: 80%;
1146
- // @include filter("key_filter");
1147
- filter: var(--key_filter);
1148
- }
1149
- }
1150
-
1151
- &:not(&:first-child, &:last-child) {
1152
- flex: 1;
1153
- }
1154
-
1155
- .key {
1156
- padding: 0;
1157
- box-sizing: border-box;
1158
- }
1159
- }
1139
+ &:first-child,
1140
+ &:last-child {
1141
+ width: var(--flw);
1142
+ min-width: var(--mflw);
1143
+ // font-size: 14px;
1144
+
1145
+ display: flex;
1146
+ justify-content: center;
1147
+ align-items: center;
1148
+
1149
+ .key {
1150
+ display: flex;
1151
+ justify-content: center;
1152
+ align-items: center;
1153
+
1154
+ img {
1155
+ transform: scale(0.8);
1156
+ filter: var(--key_filter);
1157
+ }
1160
1158
  }
1159
+ }
1160
+
1161
+ &:nth-child(2) {
1162
+ flex: 1;
1161
1163
 
1162
- // 单独第4行
1163
- &:nth-child(4) {
1164
- grid-template-columns: 0.3fr 1fr 0.3fr;
1165
-
1166
- .key_item_column {
1167
- flex-shrink: 0;
1168
-
1169
- // flex: 1;
1170
- font-weight: 400;
1171
- // border: 1px solid red;
1172
- .key {
1173
- padding: 0;
1174
- box-sizing: border-box;
1175
- font-size: 1.8vh;
1176
- font-weight: bold;
1177
-
1178
- img {
1179
- height: 100%;
1180
- }
1181
- }
1182
-
1183
- &:first-child,
1184
- &:last-child {
1185
- width: var(--flw);
1186
- min-width: var(--mflw);
1187
- // font-size: 14px;
1188
-
1189
- display: flex;
1190
- justify-content: center;
1191
- align-items: center;
1192
-
1193
- .key {
1194
- display: flex;
1195
- justify-content: center;
1196
- align-items: center;
1197
-
1198
- img {
1199
- transform: scale(0.8);
1200
- filter: var(--key_filter);
1201
- }
1202
- }
1203
- }
1204
-
1205
- &:nth-child(2) {
1206
- flex: 1;
1207
-
1208
- img {
1209
- transform: scale(0.8);
1210
- filter: var(--key_filter);
1211
- }
1212
- }
1213
- }
1164
+ img {
1165
+ transform: scale(0.8);
1166
+ filter: var(--key_filter);
1214
1167
  }
1168
+ }
1215
1169
  }
1170
+ }
1216
1171
  }
1172
+ }
1217
1173
  }
1218
1174
 
1219
1175
  // 显示动画
1220
1176
  .keyboardcon {
1221
- transition: all 0.3s ease-in-out;
1222
- transform: translateY(100%);
1223
- opacity: 0;
1177
+ transition: all 0.3s ease-in-out;
1178
+ transform: translateY(100%);
1179
+ opacity: 0;
1224
1180
  }
1225
1181
 
1226
1182
  .show {
1227
- transform: translateY(0%);
1228
- opacity: 1;
1183
+ transform: translateY(0%);
1184
+ opacity: 1;
1229
1185
  }
1230
1186
  </style>