@composy/keyboard-core 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -0
- package/dist/index.js +3605 -0
- package/dist/index.js.map +1 -0
- package/dist/index.min.js +1 -0
- package/es/icons.d.ts +58 -0
- package/es/icons.d.ts.map +1 -0
- package/es/icons.js +34 -0
- package/es/icons.js.map +1 -0
- package/es/index.d.ts +12 -0
- package/es/index.d.ts.map +1 -0
- package/es/index.js +36 -0
- package/es/layouts/amount.d.ts +14 -0
- package/es/layouts/amount.d.ts.map +1 -0
- package/es/layouts/amount.js +175 -0
- package/es/layouts/amount.js.map +1 -0
- package/es/layouts/bankcard.d.ts +15 -0
- package/es/layouts/bankcard.d.ts.map +1 -0
- package/es/layouts/bankcard.js +99 -0
- package/es/layouts/bankcard.js.map +1 -0
- package/es/layouts/email.d.ts +11 -0
- package/es/layouts/email.d.ts.map +1 -0
- package/es/layouts/email.js +126 -0
- package/es/layouts/email.js.map +1 -0
- package/es/layouts/idcard.d.ts +16 -0
- package/es/layouts/idcard.d.ts.map +1 -0
- package/es/layouts/idcard.js +99 -0
- package/es/layouts/idcard.js.map +1 -0
- package/es/layouts/index.d.ts +54 -0
- package/es/layouts/index.d.ts.map +1 -0
- package/es/layouts/index.js +78 -0
- package/es/layouts/index.js.map +1 -0
- package/es/layouts/license-plate.d.ts +35 -0
- package/es/layouts/license-plate.d.ts.map +1 -0
- package/es/layouts/license-plate.js +290 -0
- package/es/layouts/license-plate.js.map +1 -0
- package/es/layouts/number.d.ts +14 -0
- package/es/layouts/number.d.ts.map +1 -0
- package/es/layouts/number.js +168 -0
- package/es/layouts/number.js.map +1 -0
- package/es/layouts/phone.d.ts +15 -0
- package/es/layouts/phone.d.ts.map +1 -0
- package/es/layouts/phone.js +175 -0
- package/es/layouts/phone.js.map +1 -0
- package/es/layouts/punct.d.ts +7 -0
- package/es/layouts/punct.d.ts.map +1 -0
- package/es/layouts/punct.js +112 -0
- package/es/layouts/punct.js.map +1 -0
- package/es/layouts/qwerty.d.ts +10 -0
- package/es/layouts/qwerty.d.ts.map +1 -0
- package/es/layouts/qwerty.js +116 -0
- package/es/layouts/qwerty.js.map +1 -0
- package/es/layouts/search.d.ts +7 -0
- package/es/layouts/search.d.ts.map +1 -0
- package/es/layouts/search.js +101 -0
- package/es/layouts/search.js.map +1 -0
- package/es/layouts/symbol.d.ts +14 -0
- package/es/layouts/symbol.d.ts.map +1 -0
- package/es/layouts/symbol.js +194 -0
- package/es/layouts/symbol.js.map +1 -0
- package/es/layouts/url.d.ts +7 -0
- package/es/layouts/url.d.ts.map +1 -0
- package/es/layouts/url.js +99 -0
- package/es/layouts/url.js.map +1 -0
- package/es/layouts/verifycode.d.ts +15 -0
- package/es/layouts/verifycode.d.ts.map +1 -0
- package/es/layouts/verifycode.js +100 -0
- package/es/layouts/verifycode.js.map +1 -0
- package/es/managers/index.d.ts +8 -0
- package/es/managers/index.d.ts.map +1 -0
- package/es/managers/index.js +14 -0
- package/es/managers/keyboard-manager.d.ts +130 -0
- package/es/managers/keyboard-manager.d.ts.map +1 -0
- package/es/managers/keyboard-manager.js +374 -0
- package/es/managers/keyboard-manager.js.map +1 -0
- package/es/managers/keyboard-renderer.d.ts +115 -0
- package/es/managers/keyboard-renderer.d.ts.map +1 -0
- package/es/managers/keyboard-renderer.js +283 -0
- package/es/managers/keyboard-renderer.js.map +1 -0
- package/es/managers/position-manager.d.ts +72 -0
- package/es/managers/position-manager.d.ts.map +1 -0
- package/es/managers/position-manager.js +199 -0
- package/es/managers/position-manager.js.map +1 -0
- package/es/themes/index.d.ts +70 -0
- package/es/themes/index.d.ts.map +1 -0
- package/es/themes/index.js +99 -0
- package/es/themes/index.js.map +1 -0
- package/es/themes/presets.d.ts +39 -0
- package/es/themes/presets.d.ts.map +1 -0
- package/es/themes/presets.js +207 -0
- package/es/themes/presets.js.map +1 -0
- package/es/themes/types.d.ts +118 -0
- package/es/themes/types.d.ts.map +1 -0
- package/es/themes/types.js +10 -0
- package/es/types/index.d.ts +7 -0
- package/es/types/index.d.ts.map +1 -0
- package/es/types/index.js +10 -0
- package/es/types/keyboard.d.ts +253 -0
- package/es/types/keyboard.d.ts.map +1 -0
- package/es/types/keyboard.js +10 -0
- package/es/types/position.d.ts +139 -0
- package/es/types/position.d.ts.map +1 -0
- package/es/types/position.js +10 -0
- package/es/utils/device.d.ts +45 -0
- package/es/utils/device.d.ts.map +1 -0
- package/es/utils/device.js +111 -0
- package/es/utils/device.js.map +1 -0
- package/es/utils/dom.d.ts +69 -0
- package/es/utils/dom.d.ts.map +1 -0
- package/es/utils/dom.js +134 -0
- package/es/utils/dom.js.map +1 -0
- package/es/utils/event-emitter.d.ts +52 -0
- package/es/utils/event-emitter.d.ts.map +1 -0
- package/es/utils/event-emitter.js +99 -0
- package/es/utils/event-emitter.js.map +1 -0
- package/es/utils/formatters.d.ts +51 -0
- package/es/utils/formatters.d.ts.map +1 -0
- package/es/utils/formatters.js +57 -0
- package/es/utils/formatters.js.map +1 -0
- package/es/utils/index.d.ts +10 -0
- package/es/utils/index.d.ts.map +1 -0
- package/es/utils/index.js +16 -0
- package/es/utils/random.d.ts +71 -0
- package/es/utils/random.d.ts.map +1 -0
- package/es/utils/random.js +292 -0
- package/es/utils/random.js.map +1 -0
- package/esm/icons.d.ts +58 -0
- package/esm/icons.d.ts.map +1 -0
- package/esm/icons.js +34 -0
- package/esm/icons.js.map +1 -0
- package/esm/index.d.ts +12 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +37 -0
- package/esm/layouts/amount.d.ts +14 -0
- package/esm/layouts/amount.d.ts.map +1 -0
- package/esm/layouts/amount.js +175 -0
- package/esm/layouts/amount.js.map +1 -0
- package/esm/layouts/bankcard.d.ts +15 -0
- package/esm/layouts/bankcard.d.ts.map +1 -0
- package/esm/layouts/bankcard.js +99 -0
- package/esm/layouts/bankcard.js.map +1 -0
- package/esm/layouts/email.d.ts +11 -0
- package/esm/layouts/email.d.ts.map +1 -0
- package/esm/layouts/email.js +126 -0
- package/esm/layouts/email.js.map +1 -0
- package/esm/layouts/idcard.d.ts +16 -0
- package/esm/layouts/idcard.d.ts.map +1 -0
- package/esm/layouts/idcard.js +99 -0
- package/esm/layouts/idcard.js.map +1 -0
- package/esm/layouts/index.d.ts +54 -0
- package/esm/layouts/index.d.ts.map +1 -0
- package/esm/layouts/index.js +78 -0
- package/esm/layouts/index.js.map +1 -0
- package/esm/layouts/license-plate.d.ts +35 -0
- package/esm/layouts/license-plate.d.ts.map +1 -0
- package/esm/layouts/license-plate.js +290 -0
- package/esm/layouts/license-plate.js.map +1 -0
- package/esm/layouts/number.d.ts +14 -0
- package/esm/layouts/number.d.ts.map +1 -0
- package/esm/layouts/number.js +168 -0
- package/esm/layouts/number.js.map +1 -0
- package/esm/layouts/phone.d.ts +15 -0
- package/esm/layouts/phone.d.ts.map +1 -0
- package/esm/layouts/phone.js +175 -0
- package/esm/layouts/phone.js.map +1 -0
- package/esm/layouts/punct.d.ts +7 -0
- package/esm/layouts/punct.d.ts.map +1 -0
- package/esm/layouts/punct.js +112 -0
- package/esm/layouts/punct.js.map +1 -0
- package/esm/layouts/qwerty.d.ts +10 -0
- package/esm/layouts/qwerty.d.ts.map +1 -0
- package/esm/layouts/qwerty.js +116 -0
- package/esm/layouts/qwerty.js.map +1 -0
- package/esm/layouts/search.d.ts +7 -0
- package/esm/layouts/search.d.ts.map +1 -0
- package/esm/layouts/search.js +101 -0
- package/esm/layouts/search.js.map +1 -0
- package/esm/layouts/symbol.d.ts +14 -0
- package/esm/layouts/symbol.d.ts.map +1 -0
- package/esm/layouts/symbol.js +194 -0
- package/esm/layouts/symbol.js.map +1 -0
- package/esm/layouts/url.d.ts +7 -0
- package/esm/layouts/url.d.ts.map +1 -0
- package/esm/layouts/url.js +99 -0
- package/esm/layouts/url.js.map +1 -0
- package/esm/layouts/verifycode.d.ts +15 -0
- package/esm/layouts/verifycode.d.ts.map +1 -0
- package/esm/layouts/verifycode.js +100 -0
- package/esm/layouts/verifycode.js.map +1 -0
- package/esm/managers/index.d.ts +8 -0
- package/esm/managers/index.d.ts.map +1 -0
- package/esm/managers/index.js +14 -0
- package/esm/managers/keyboard-manager.d.ts +130 -0
- package/esm/managers/keyboard-manager.d.ts.map +1 -0
- package/esm/managers/keyboard-manager.js +374 -0
- package/esm/managers/keyboard-manager.js.map +1 -0
- package/esm/managers/keyboard-renderer.d.ts +115 -0
- package/esm/managers/keyboard-renderer.d.ts.map +1 -0
- package/esm/managers/keyboard-renderer.js +283 -0
- package/esm/managers/keyboard-renderer.js.map +1 -0
- package/esm/managers/position-manager.d.ts +72 -0
- package/esm/managers/position-manager.d.ts.map +1 -0
- package/esm/managers/position-manager.js +199 -0
- package/esm/managers/position-manager.js.map +1 -0
- package/esm/themes/index.d.ts +70 -0
- package/esm/themes/index.d.ts.map +1 -0
- package/esm/themes/index.js +99 -0
- package/esm/themes/index.js.map +1 -0
- package/esm/themes/presets.d.ts +39 -0
- package/esm/themes/presets.d.ts.map +1 -0
- package/esm/themes/presets.js +207 -0
- package/esm/themes/presets.js.map +1 -0
- package/esm/themes/types.d.ts +118 -0
- package/esm/themes/types.d.ts.map +1 -0
- package/esm/themes/types.js +10 -0
- package/esm/types/index.d.ts +7 -0
- package/esm/types/index.d.ts.map +1 -0
- package/esm/types/index.js +10 -0
- package/esm/types/keyboard.d.ts +253 -0
- package/esm/types/keyboard.d.ts.map +1 -0
- package/esm/types/keyboard.js +10 -0
- package/esm/types/position.d.ts +139 -0
- package/esm/types/position.d.ts.map +1 -0
- package/esm/types/position.js +10 -0
- package/esm/utils/device.d.ts +45 -0
- package/esm/utils/device.d.ts.map +1 -0
- package/esm/utils/device.js +111 -0
- package/esm/utils/device.js.map +1 -0
- package/esm/utils/dom.d.ts +69 -0
- package/esm/utils/dom.d.ts.map +1 -0
- package/esm/utils/dom.js +134 -0
- package/esm/utils/dom.js.map +1 -0
- package/esm/utils/event-emitter.d.ts +52 -0
- package/esm/utils/event-emitter.d.ts.map +1 -0
- package/esm/utils/event-emitter.js +99 -0
- package/esm/utils/event-emitter.js.map +1 -0
- package/esm/utils/formatters.d.ts +51 -0
- package/esm/utils/formatters.d.ts.map +1 -0
- package/esm/utils/formatters.js +57 -0
- package/esm/utils/formatters.js.map +1 -0
- package/esm/utils/index.d.ts +10 -0
- package/esm/utils/index.d.ts.map +1 -0
- package/esm/utils/index.js +16 -0
- package/esm/utils/random.d.ts +71 -0
- package/esm/utils/random.d.ts.map +1 -0
- package/esm/utils/random.js +292 -0
- package/esm/utils/random.js.map +1 -0
- package/lib/icons.cjs +44 -0
- package/lib/icons.cjs.map +1 -0
- package/lib/icons.d.ts +58 -0
- package/lib/index.cjs +141 -0
- package/lib/index.d.ts +12 -0
- package/lib/layouts/amount.cjs +177 -0
- package/lib/layouts/amount.cjs.map +1 -0
- package/lib/layouts/amount.d.ts +14 -0
- package/lib/layouts/bankcard.cjs +100 -0
- package/lib/layouts/bankcard.cjs.map +1 -0
- package/lib/layouts/bankcard.d.ts +15 -0
- package/lib/layouts/email.cjs +128 -0
- package/lib/layouts/email.cjs.map +1 -0
- package/lib/layouts/email.d.ts +11 -0
- package/lib/layouts/idcard.cjs +100 -0
- package/lib/layouts/idcard.cjs.map +1 -0
- package/lib/layouts/idcard.d.ts +16 -0
- package/lib/layouts/index.cjs +107 -0
- package/lib/layouts/index.cjs.map +1 -0
- package/lib/layouts/index.d.ts +54 -0
- package/lib/layouts/license-plate.cjs +296 -0
- package/lib/layouts/license-plate.cjs.map +1 -0
- package/lib/layouts/license-plate.d.ts +35 -0
- package/lib/layouts/number.cjs +170 -0
- package/lib/layouts/number.cjs.map +1 -0
- package/lib/layouts/number.d.ts +14 -0
- package/lib/layouts/phone.cjs +177 -0
- package/lib/layouts/phone.cjs.map +1 -0
- package/lib/layouts/phone.d.ts +15 -0
- package/lib/layouts/punct.cjs +113 -0
- package/lib/layouts/punct.cjs.map +1 -0
- package/lib/layouts/punct.d.ts +7 -0
- package/lib/layouts/qwerty.cjs +117 -0
- package/lib/layouts/qwerty.cjs.map +1 -0
- package/lib/layouts/qwerty.d.ts +10 -0
- package/lib/layouts/search.cjs +102 -0
- package/lib/layouts/search.cjs.map +1 -0
- package/lib/layouts/search.d.ts +7 -0
- package/lib/layouts/symbol.cjs +196 -0
- package/lib/layouts/symbol.cjs.map +1 -0
- package/lib/layouts/symbol.d.ts +14 -0
- package/lib/layouts/url.cjs +100 -0
- package/lib/layouts/url.cjs.map +1 -0
- package/lib/layouts/url.d.ts +7 -0
- package/lib/layouts/verifycode.cjs +101 -0
- package/lib/layouts/verifycode.cjs.map +1 -0
- package/lib/layouts/verifycode.d.ts +15 -0
- package/lib/managers/index.cjs +20 -0
- package/lib/managers/index.d.ts +8 -0
- package/lib/managers/keyboard-manager.cjs +376 -0
- package/lib/managers/keyboard-manager.cjs.map +1 -0
- package/lib/managers/keyboard-manager.d.ts +130 -0
- package/lib/managers/keyboard-renderer.cjs +285 -0
- package/lib/managers/keyboard-renderer.cjs.map +1 -0
- package/lib/managers/keyboard-renderer.d.ts +115 -0
- package/lib/managers/position-manager.cjs +201 -0
- package/lib/managers/position-manager.cjs.map +1 -0
- package/lib/managers/position-manager.d.ts +72 -0
- package/lib/package.json +3 -0
- package/lib/themes/index.cjs +117 -0
- package/lib/themes/index.cjs.map +1 -0
- package/lib/themes/index.d.ts +70 -0
- package/lib/themes/presets.cjs +214 -0
- package/lib/themes/presets.cjs.map +1 -0
- package/lib/themes/presets.d.ts +39 -0
- package/lib/themes/types.cjs +11 -0
- package/lib/themes/types.d.ts +118 -0
- package/lib/types/index.cjs +11 -0
- package/lib/types/index.d.ts +7 -0
- package/lib/types/keyboard.cjs +11 -0
- package/lib/types/keyboard.d.ts +253 -0
- package/lib/types/position.cjs +11 -0
- package/lib/types/position.d.ts +139 -0
- package/lib/utils/device.cjs +120 -0
- package/lib/utils/device.cjs.map +1 -0
- package/lib/utils/device.d.ts +45 -0
- package/lib/utils/dom.cjs +148 -0
- package/lib/utils/dom.cjs.map +1 -0
- package/lib/utils/dom.d.ts +69 -0
- package/lib/utils/event-emitter.cjs +100 -0
- package/lib/utils/event-emitter.cjs.map +1 -0
- package/lib/utils/event-emitter.d.ts +52 -0
- package/lib/utils/formatters.cjs +66 -0
- package/lib/utils/formatters.cjs.map +1 -0
- package/lib/utils/formatters.d.ts +51 -0
- package/lib/utils/index.cjs +58 -0
- package/lib/utils/index.d.ts +10 -0
- package/lib/utils/random.cjs +301 -0
- package/lib/utils/random.cjs.map +1 -0
- package/lib/utils/random.d.ts +71 -0
- package/package.json +121 -0
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* ***********************************
|
|
3
|
+
* @composy/keyboard-core v0.0.1 *
|
|
4
|
+
* Built with rollup *
|
|
5
|
+
* Build time: 2024-08-17 11:33:29 *
|
|
6
|
+
* Build mode: production *
|
|
7
|
+
* Minified: No *
|
|
8
|
+
* ***********************************
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
11
|
+
const require_index = require("../layouts/index.cjs");
|
|
12
|
+
const require_event_emitter = require("../utils/event-emitter.cjs");
|
|
13
|
+
const require_device = require("../utils/device.cjs");
|
|
14
|
+
const require_dom = require("../utils/dom.cjs");
|
|
15
|
+
//#region src/managers/keyboard-manager.ts
|
|
16
|
+
const DEFAULT_OPTIONS = {
|
|
17
|
+
type: "qwerty",
|
|
18
|
+
value: "",
|
|
19
|
+
maxLength: void 0,
|
|
20
|
+
defaultUpperCase: false,
|
|
21
|
+
closeOnClickOutside: true,
|
|
22
|
+
enableSound: false,
|
|
23
|
+
enableVibrate: true,
|
|
24
|
+
customLayouts: {}
|
|
25
|
+
};
|
|
26
|
+
var KeyboardManager = class extends require_event_emitter.EventEmitter {
|
|
27
|
+
constructor(options = {}) {
|
|
28
|
+
super();
|
|
29
|
+
/** 当前布局配置 */
|
|
30
|
+
this.currentLayout = null;
|
|
31
|
+
this.options = {
|
|
32
|
+
...DEFAULT_OPTIONS,
|
|
33
|
+
...options
|
|
34
|
+
};
|
|
35
|
+
if (options.customLayouts) Object.entries(options.customLayouts).forEach(([name, layout]) => {
|
|
36
|
+
this.options.customLayouts[name] = layout;
|
|
37
|
+
});
|
|
38
|
+
this.state = {
|
|
39
|
+
visible: false,
|
|
40
|
+
type: this.options.type,
|
|
41
|
+
isUpperCase: this.options.defaultUpperCase,
|
|
42
|
+
value: this.options.value,
|
|
43
|
+
cursorPosition: this.options.value.length,
|
|
44
|
+
maxLength: this.options.maxLength,
|
|
45
|
+
inputElement: null
|
|
46
|
+
};
|
|
47
|
+
this.loadLayout(this.options.type);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 获取当前状态
|
|
51
|
+
*/
|
|
52
|
+
getState() {
|
|
53
|
+
return { ...this.state };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 获取当前布局配置
|
|
57
|
+
*/
|
|
58
|
+
getLayout() {
|
|
59
|
+
return this.currentLayout;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 获取配置选项
|
|
63
|
+
*/
|
|
64
|
+
getOptions() {
|
|
65
|
+
return { ...this.options };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 加载键盘布局
|
|
69
|
+
*/
|
|
70
|
+
loadLayout(type) {
|
|
71
|
+
let layout = this.options.customLayouts[type];
|
|
72
|
+
if (!layout) layout = require_index.getLayout(type);
|
|
73
|
+
if (!layout) {
|
|
74
|
+
console.error(`[KeyboardManager] Layout "${type}" not found`);
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
this.currentLayout = layout;
|
|
78
|
+
if (layout.supportShift) this.state.isUpperCase = layout.defaultUpperCase ?? this.options.defaultUpperCase;
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 显示键盘
|
|
83
|
+
*/
|
|
84
|
+
show(inputElement) {
|
|
85
|
+
if (this.state.visible) return;
|
|
86
|
+
this.state.visible = true;
|
|
87
|
+
this.state.inputElement = inputElement ?? null;
|
|
88
|
+
if (inputElement) {
|
|
89
|
+
this.state.value = inputElement.value;
|
|
90
|
+
this.state.cursorPosition = require_dom.getInputCursorPosition(inputElement);
|
|
91
|
+
}
|
|
92
|
+
this.emitStateChange();
|
|
93
|
+
this.emit("show", { type: this.state.type });
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 隐藏键盘
|
|
97
|
+
*/
|
|
98
|
+
hide() {
|
|
99
|
+
if (!this.state.visible) return;
|
|
100
|
+
const prevType = this.state.type;
|
|
101
|
+
this.state.visible = false;
|
|
102
|
+
this.state.inputElement = null;
|
|
103
|
+
this.emitStateChange();
|
|
104
|
+
this.emit("hide", { type: prevType });
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 切换键盘显示/隐藏
|
|
108
|
+
*/
|
|
109
|
+
toggle(inputElement) {
|
|
110
|
+
if (this.state.visible) this.hide();
|
|
111
|
+
else this.show(inputElement);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 切换键盘类型
|
|
115
|
+
*/
|
|
116
|
+
switchType(type) {
|
|
117
|
+
if (this.state.type === type) return;
|
|
118
|
+
const fromType = this.state.type;
|
|
119
|
+
if (!this.loadLayout(type)) return;
|
|
120
|
+
this.state.type = type;
|
|
121
|
+
this.emitStateChange();
|
|
122
|
+
this.emit("switch", {
|
|
123
|
+
from: fromType,
|
|
124
|
+
to: type
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* 切换大小写
|
|
129
|
+
*/
|
|
130
|
+
toggleShift() {
|
|
131
|
+
if (!this.currentLayout?.supportShift) return;
|
|
132
|
+
this.state.isUpperCase = !this.state.isUpperCase;
|
|
133
|
+
this.emitStateChange();
|
|
134
|
+
this.emit("shift", { isUpperCase: this.state.isUpperCase });
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* 设置大小写状态
|
|
138
|
+
*/
|
|
139
|
+
setShift(isUpperCase) {
|
|
140
|
+
if (!this.currentLayout?.supportShift) return;
|
|
141
|
+
if (this.state.isUpperCase === isUpperCase) return;
|
|
142
|
+
this.state.isUpperCase = isUpperCase;
|
|
143
|
+
this.emitStateChange();
|
|
144
|
+
this.emit("shift", { isUpperCase });
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* 处理按键
|
|
148
|
+
*/
|
|
149
|
+
handleKey(key) {
|
|
150
|
+
if (this.options.enableVibrate && require_device.isMobile()) require_device.vibrate(10);
|
|
151
|
+
this.emit("keypress", {
|
|
152
|
+
key,
|
|
153
|
+
value: this.state.value
|
|
154
|
+
});
|
|
155
|
+
switch (key.type) {
|
|
156
|
+
case "char":
|
|
157
|
+
case "space":
|
|
158
|
+
this.handleCharKey(key);
|
|
159
|
+
break;
|
|
160
|
+
case "backspace":
|
|
161
|
+
this.handleBackspace();
|
|
162
|
+
break;
|
|
163
|
+
case "shift":
|
|
164
|
+
this.toggleShift();
|
|
165
|
+
break;
|
|
166
|
+
case "clear":
|
|
167
|
+
this.handleClear();
|
|
168
|
+
break;
|
|
169
|
+
case "enter":
|
|
170
|
+
case "done":
|
|
171
|
+
this.handleConfirm();
|
|
172
|
+
break;
|
|
173
|
+
case "close":
|
|
174
|
+
this.hide();
|
|
175
|
+
break;
|
|
176
|
+
case "tab":
|
|
177
|
+
this.handleTab(key);
|
|
178
|
+
break;
|
|
179
|
+
case "custom": break;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* 处理字符输入
|
|
184
|
+
*/
|
|
185
|
+
handleCharKey(key) {
|
|
186
|
+
const keyValue = this.getKeyValue(key);
|
|
187
|
+
if (!keyValue) return;
|
|
188
|
+
const input = this.state.inputElement;
|
|
189
|
+
if (input) {
|
|
190
|
+
const result = require_dom.insertTextAtCursor(input, keyValue, this.state.maxLength);
|
|
191
|
+
input.value = result.value;
|
|
192
|
+
require_dom.setInputCursorPosition(input, result.cursorPosition);
|
|
193
|
+
this.state.value = result.value;
|
|
194
|
+
this.state.cursorPosition = result.cursorPosition;
|
|
195
|
+
input.dispatchEvent(new Event("input", { bubbles: true }));
|
|
196
|
+
} else {
|
|
197
|
+
if (this.state.maxLength && this.state.value.length >= this.state.maxLength) return;
|
|
198
|
+
const newValue = this.state.value.slice(0, this.state.cursorPosition) + keyValue + this.state.value.slice(this.state.cursorPosition);
|
|
199
|
+
this.state.value = newValue;
|
|
200
|
+
this.state.cursorPosition += keyValue.length;
|
|
201
|
+
}
|
|
202
|
+
this.emitStateChange();
|
|
203
|
+
this.emit("input", {
|
|
204
|
+
value: this.state.value,
|
|
205
|
+
key
|
|
206
|
+
});
|
|
207
|
+
this.autoSwitchLicensePlate();
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* 处理退格
|
|
211
|
+
*/
|
|
212
|
+
handleBackspace() {
|
|
213
|
+
const input = this.state.inputElement;
|
|
214
|
+
if (input) {
|
|
215
|
+
const result = require_dom.deleteCharBeforeCursor(input);
|
|
216
|
+
input.value = result.value;
|
|
217
|
+
require_dom.setInputCursorPosition(input, result.cursorPosition);
|
|
218
|
+
this.state.value = result.value;
|
|
219
|
+
this.state.cursorPosition = result.cursorPosition;
|
|
220
|
+
input.dispatchEvent(new Event("input", { bubbles: true }));
|
|
221
|
+
this.emitStateChange();
|
|
222
|
+
this.emit("backspace", {
|
|
223
|
+
deletedChar: result.deletedChar,
|
|
224
|
+
value: this.state.value
|
|
225
|
+
});
|
|
226
|
+
} else {
|
|
227
|
+
if (this.state.cursorPosition === 0) return;
|
|
228
|
+
const deletedChar = this.state.value.charAt(this.state.cursorPosition - 1);
|
|
229
|
+
this.state.value = this.state.value.slice(0, this.state.cursorPosition - 1) + this.state.value.slice(this.state.cursorPosition);
|
|
230
|
+
this.state.cursorPosition--;
|
|
231
|
+
this.emitStateChange();
|
|
232
|
+
this.emit("backspace", {
|
|
233
|
+
deletedChar,
|
|
234
|
+
value: this.state.value
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
this.autoSwitchLicensePlate();
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* 车牌号智能切换逻辑
|
|
241
|
+
* 根据当前值长度自动切换键盘布局
|
|
242
|
+
* 只有 2 种布局:省份键盘(第1位)和 字母+数字混合键盘(第2-8位)
|
|
243
|
+
*/
|
|
244
|
+
autoSwitchLicensePlate() {
|
|
245
|
+
if (!this.state.type.startsWith("license-plate")) return;
|
|
246
|
+
const len = this.state.value.length;
|
|
247
|
+
let targetType = null;
|
|
248
|
+
if (len === 0) targetType = "license-plate-province";
|
|
249
|
+
else targetType = "license-plate-alphanumeric";
|
|
250
|
+
if (targetType && this.state.type !== targetType) this.switchType(targetType);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* 处理清空
|
|
254
|
+
*/
|
|
255
|
+
handleClear() {
|
|
256
|
+
const previousValue = this.state.value;
|
|
257
|
+
if (this.state.inputElement) {
|
|
258
|
+
this.state.inputElement.value = "";
|
|
259
|
+
this.state.inputElement.dispatchEvent(new Event("input", { bubbles: true }));
|
|
260
|
+
}
|
|
261
|
+
this.state.value = "";
|
|
262
|
+
this.state.cursorPosition = 0;
|
|
263
|
+
this.emitStateChange();
|
|
264
|
+
this.emit("clear", { previousValue });
|
|
265
|
+
this.autoSwitchLicensePlate();
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* 处理确认
|
|
269
|
+
*/
|
|
270
|
+
handleConfirm() {
|
|
271
|
+
this.emit("confirm", { value: this.state.value });
|
|
272
|
+
this.hide();
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* 处理切换键盘
|
|
276
|
+
*/
|
|
277
|
+
handleTab(key) {
|
|
278
|
+
const targetType = key.data?.targetType;
|
|
279
|
+
if (targetType) this.switchType(targetType);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* 获取按键的实际输出值
|
|
283
|
+
*/
|
|
284
|
+
getKeyValue(key) {
|
|
285
|
+
const value = key.value ?? key.label;
|
|
286
|
+
if (typeof value === "string") return value;
|
|
287
|
+
return this.state.isUpperCase ? value.upper : value.lower;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* 获取按键的显示文本
|
|
291
|
+
*/
|
|
292
|
+
getKeyLabel(key) {
|
|
293
|
+
const label = key.label;
|
|
294
|
+
if (typeof label === "string") return label;
|
|
295
|
+
return this.state.isUpperCase ? label.upper : label.lower;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* 设置值
|
|
299
|
+
*/
|
|
300
|
+
setValue(value) {
|
|
301
|
+
this.state.value = value;
|
|
302
|
+
this.state.cursorPosition = value.length;
|
|
303
|
+
if (this.state.inputElement) {
|
|
304
|
+
this.state.inputElement.value = value;
|
|
305
|
+
require_dom.setInputCursorPosition(this.state.inputElement, value.length);
|
|
306
|
+
}
|
|
307
|
+
this.emitStateChange();
|
|
308
|
+
this.autoSwitchLicensePlate();
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* 追加值(在光标位置插入文本)
|
|
312
|
+
*/
|
|
313
|
+
appendValue(text) {
|
|
314
|
+
if (!text) return;
|
|
315
|
+
const input = this.state.inputElement;
|
|
316
|
+
if (input) {
|
|
317
|
+
const result = require_dom.insertTextAtCursor(input, text, this.state.maxLength);
|
|
318
|
+
input.value = result.value;
|
|
319
|
+
require_dom.setInputCursorPosition(input, result.cursorPosition);
|
|
320
|
+
this.state.value = result.value;
|
|
321
|
+
this.state.cursorPosition = result.cursorPosition;
|
|
322
|
+
input.dispatchEvent(new Event("input", { bubbles: true }));
|
|
323
|
+
} else {
|
|
324
|
+
if (this.state.maxLength && this.state.value.length + text.length > this.state.maxLength) text = text.slice(0, this.state.maxLength - this.state.value.length);
|
|
325
|
+
const newValue = this.state.value.slice(0, this.state.cursorPosition) + text + this.state.value.slice(this.state.cursorPosition);
|
|
326
|
+
this.state.value = newValue;
|
|
327
|
+
this.state.cursorPosition += text.length;
|
|
328
|
+
}
|
|
329
|
+
this.emitStateChange();
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* 设置最大长度
|
|
333
|
+
*/
|
|
334
|
+
setMaxLength(maxLength) {
|
|
335
|
+
this.state.maxLength = maxLength;
|
|
336
|
+
this.emitStateChange();
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* 绑定输入框
|
|
340
|
+
*/
|
|
341
|
+
bindInput(input) {
|
|
342
|
+
this.state.inputElement = input;
|
|
343
|
+
this.state.value = input.value;
|
|
344
|
+
this.state.cursorPosition = require_dom.getInputCursorPosition(input);
|
|
345
|
+
this.emitStateChange();
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* 解绑输入框
|
|
349
|
+
*/
|
|
350
|
+
unbindInput() {
|
|
351
|
+
this.state.inputElement = null;
|
|
352
|
+
this.emitStateChange();
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* 发送状态变化事件
|
|
356
|
+
*/
|
|
357
|
+
emitStateChange() {
|
|
358
|
+
this.emit("stateChange", { ...this.state });
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* 销毁
|
|
362
|
+
*/
|
|
363
|
+
destroy() {
|
|
364
|
+
this.hide();
|
|
365
|
+
this.clear();
|
|
366
|
+
this.state.inputElement = null;
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
function createKeyboardManager(options) {
|
|
370
|
+
return new KeyboardManager(options);
|
|
371
|
+
}
|
|
372
|
+
//#endregion
|
|
373
|
+
exports.KeyboardManager = KeyboardManager;
|
|
374
|
+
exports.createKeyboardManager = createKeyboardManager;
|
|
375
|
+
/*! End of @composy/keyboard-core | Powered by @composy/builder */
|
|
376
|
+
//# sourceMappingURL=keyboard-manager.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyboard-manager.cjs","names":[],"sources":["../../src/managers/keyboard-manager.ts"],"sourcesContent":["/**\n * 键盘管理器\n * @module managers/keyboard-manager\n */\n\nimport type {\n KeyboardConfig,\n KeyboardEventMap,\n KeyboardOptions,\n KeyboardState,\n KeyboardType,\n KeyDefinition,\n} from '../types'\nimport { getLayout } from '../layouts'\nimport { EventEmitter } from '../utils/event-emitter'\nimport { isMobile, vibrate } from '../utils/device'\nimport {\n deleteCharBeforeCursor,\n getInputCursorPosition,\n insertTextAtCursor,\n setInputCursorPosition,\n} from '../utils/dom'\n\n/**\n * 默认键盘选项\n */\nconst DEFAULT_OPTIONS: Required<KeyboardOptions> = {\n type: 'qwerty',\n value: '',\n maxLength: undefined as unknown as number,\n defaultUpperCase: false,\n closeOnClickOutside: true,\n enableSound: false,\n enableVibrate: true,\n customLayouts: {},\n}\n\n/**\n * 键盘管理器类\n * 处理键盘状态管理、输入处理等核心逻辑\n */\nexport class KeyboardManager extends EventEmitter<KeyboardEventMap> {\n /** 配置选项 */\n private options: Required<KeyboardOptions>\n\n /** 当前状态 */\n private state: KeyboardState\n\n /** 当前布局配置 */\n private currentLayout: KeyboardConfig | null = null\n\n constructor(options: KeyboardOptions = {}) {\n super()\n this.options = { ...DEFAULT_OPTIONS, ...options }\n\n // 注册自定义布局\n if (options.customLayouts) {\n Object.entries(options.customLayouts).forEach(([name, layout]) => {\n // 这里不用 registerLayout 以避免覆盖内置布局的警告\n this.options.customLayouts[name] = layout\n })\n }\n\n // 初始化状态\n this.state = {\n visible: false,\n type: this.options.type,\n isUpperCase: this.options.defaultUpperCase,\n value: this.options.value,\n cursorPosition: this.options.value.length,\n maxLength: this.options.maxLength,\n inputElement: null,\n }\n\n // 加载初始布局\n this.loadLayout(this.options.type)\n }\n\n /**\n * 获取当前状态\n */\n getState(): Readonly<KeyboardState> {\n return { ...this.state }\n }\n\n /**\n * 获取当前布局配置\n */\n getLayout(): KeyboardConfig | null {\n return this.currentLayout\n }\n\n /**\n * 获取配置选项\n */\n getOptions(): Readonly<Required<KeyboardOptions>> {\n return { ...this.options }\n }\n\n /**\n * 加载键盘布局\n */\n private loadLayout(type: KeyboardType | string): boolean {\n // 先从自定义布局查找\n let layout = this.options.customLayouts[type]\n\n // 再从内置布局查找\n if (!layout) {\n layout = getLayout(type) as KeyboardConfig\n }\n\n if (!layout) {\n console.error(`[KeyboardManager] Layout \"${type}\" not found`)\n return false\n }\n\n this.currentLayout = layout\n\n // 更新大小写状态\n if (layout.supportShift) {\n this.state.isUpperCase = layout.defaultUpperCase ?? this.options.defaultUpperCase\n }\n\n return true\n }\n\n /**\n * 显示键盘\n */\n show(inputElement?: HTMLInputElement | HTMLTextAreaElement): void {\n if (this.state.visible) return\n\n this.state.visible = true\n this.state.inputElement = inputElement ?? null\n\n // 同步输入框的值\n if (inputElement) {\n this.state.value = inputElement.value\n this.state.cursorPosition = getInputCursorPosition(inputElement)\n }\n\n this.emitStateChange()\n this.emit('show', { type: this.state.type })\n }\n\n /**\n * 隐藏键盘\n */\n hide(): void {\n if (!this.state.visible) return\n\n const prevType = this.state.type\n this.state.visible = false\n this.state.inputElement = null\n\n this.emitStateChange()\n this.emit('hide', { type: prevType })\n }\n\n /**\n * 切换键盘显示/隐藏\n */\n toggle(inputElement?: HTMLInputElement | HTMLTextAreaElement): void {\n if (this.state.visible) {\n this.hide()\n }\n else {\n this.show(inputElement)\n }\n }\n\n /**\n * 切换键盘类型\n */\n switchType(type: KeyboardType | string): void {\n if (this.state.type === type) return\n\n const fromType = this.state.type\n if (!this.loadLayout(type)) return\n\n this.state.type = type as KeyboardType\n\n this.emitStateChange()\n this.emit('switch', { from: fromType, to: type as KeyboardType })\n }\n\n /**\n * 切换大小写\n */\n toggleShift(): void {\n if (!this.currentLayout?.supportShift) return\n\n this.state.isUpperCase = !this.state.isUpperCase\n this.emitStateChange()\n this.emit('shift', { isUpperCase: this.state.isUpperCase })\n }\n\n /**\n * 设置大小写状态\n */\n setShift(isUpperCase: boolean): void {\n if (!this.currentLayout?.supportShift) return\n if (this.state.isUpperCase === isUpperCase) return\n\n this.state.isUpperCase = isUpperCase\n this.emitStateChange()\n this.emit('shift', { isUpperCase })\n }\n\n /**\n * 处理按键\n */\n handleKey(key: KeyDefinition): void {\n // 触发震动反馈\n if (this.options.enableVibrate && isMobile()) {\n vibrate(10)\n }\n\n this.emit('keypress', { key, value: this.state.value })\n\n switch (key.type) {\n case 'char':\n case 'space':\n this.handleCharKey(key)\n break\n case 'backspace':\n this.handleBackspace()\n break\n case 'shift':\n this.toggleShift()\n break\n case 'clear':\n this.handleClear()\n break\n case 'enter':\n case 'done':\n this.handleConfirm()\n break\n case 'close':\n this.hide()\n break\n case 'tab':\n this.handleTab(key)\n break\n case 'custom':\n // 自定义按键,只触发事件\n break\n }\n }\n\n /**\n * 处理字符输入\n */\n private handleCharKey(key: KeyDefinition): void {\n const keyValue = this.getKeyValue(key)\n if (!keyValue) return\n\n const input = this.state.inputElement\n\n if (input) {\n // 如果有绑定输入框,直接操作输入框\n const result = insertTextAtCursor(input, keyValue, this.state.maxLength)\n input.value = result.value\n setInputCursorPosition(input, result.cursorPosition)\n this.state.value = result.value\n this.state.cursorPosition = result.cursorPosition\n\n // 触发原生 input 事件\n input.dispatchEvent(new Event('input', { bubbles: true }))\n }\n else {\n // 没有输入框,直接修改内部值\n if (this.state.maxLength && this.state.value.length >= this.state.maxLength) {\n return\n }\n const newValue = this.state.value.slice(0, this.state.cursorPosition)\n + keyValue\n + this.state.value.slice(this.state.cursorPosition)\n this.state.value = newValue\n this.state.cursorPosition += keyValue.length\n }\n\n this.emitStateChange()\n this.emit('input', { value: this.state.value, key })\n\n // 车牌号智能切换\n this.autoSwitchLicensePlate()\n }\n\n /**\n * 处理退格\n */\n private handleBackspace(): void {\n const input = this.state.inputElement\n\n if (input) {\n const result = deleteCharBeforeCursor(input)\n input.value = result.value\n setInputCursorPosition(input, result.cursorPosition)\n this.state.value = result.value\n this.state.cursorPosition = result.cursorPosition\n\n // 触发原生 input 事件\n input.dispatchEvent(new Event('input', { bubbles: true }))\n\n this.emitStateChange()\n this.emit('backspace', { deletedChar: result.deletedChar, value: this.state.value })\n }\n else {\n if (this.state.cursorPosition === 0) return\n\n const deletedChar = this.state.value.charAt(this.state.cursorPosition - 1)\n this.state.value = this.state.value.slice(0, this.state.cursorPosition - 1)\n + this.state.value.slice(this.state.cursorPosition)\n this.state.cursorPosition--\n\n this.emitStateChange()\n this.emit('backspace', { deletedChar, value: this.state.value })\n }\n\n // 车牌号智能切换\n this.autoSwitchLicensePlate()\n }\n\n /**\n * 车牌号智能切换逻辑\n * 根据当前值长度自动切换键盘布局\n * 只有 2 种布局:省份键盘(第1位)和 字母+数字混合键盘(第2-8位)\n */\n private autoSwitchLicensePlate(): void {\n // 只在车牌键盘类型时生效\n if (!this.state.type.startsWith('license-plate')) return\n\n const len = this.state.value.length\n let targetType: string | null = null\n\n if (len === 0) {\n // 第1位:省份简称\n targetType = 'license-plate-province'\n }\n else {\n // 第2-8位:字母+数字混合键盘\n // (第2位虽然只能输入字母,但显示混合键盘,用户自己知道不能输入数字)\n targetType = 'license-plate-alphanumeric'\n }\n\n // 如果需要切换\n if (targetType && this.state.type !== targetType) {\n this.switchType(targetType)\n }\n }\n\n /**\n * 处理清空\n */\n private handleClear(): void {\n const previousValue = this.state.value\n\n if (this.state.inputElement) {\n this.state.inputElement.value = ''\n this.state.inputElement.dispatchEvent(new Event('input', { bubbles: true }))\n }\n\n this.state.value = ''\n this.state.cursorPosition = 0\n\n this.emitStateChange()\n this.emit('clear', { previousValue })\n \n // 车牌号智能切换\n this.autoSwitchLicensePlate()\n }\n\n /**\n * 处理确认\n */\n private handleConfirm(): void {\n this.emit('confirm', { value: this.state.value })\n this.hide()\n }\n\n /**\n * 处理切换键盘\n */\n private handleTab(key: KeyDefinition): void {\n const targetType = key.data?.targetType as KeyboardType | string | undefined\n if (targetType) {\n this.switchType(targetType)\n }\n }\n\n /**\n * 获取按键的实际输出值\n */\n private getKeyValue(key: KeyDefinition): string {\n const value = key.value ?? key.label\n\n if (typeof value === 'string') {\n return value\n }\n\n return this.state.isUpperCase ? value.upper : value.lower\n }\n\n /**\n * 获取按键的显示文本\n */\n getKeyLabel(key: KeyDefinition): string {\n const label = key.label\n\n if (typeof label === 'string') {\n return label\n }\n\n return this.state.isUpperCase ? label.upper : label.lower\n }\n\n /**\n * 设置值\n */\n setValue(value: string): void {\n this.state.value = value\n this.state.cursorPosition = value.length\n\n if (this.state.inputElement) {\n this.state.inputElement.value = value\n setInputCursorPosition(this.state.inputElement, value.length)\n }\n\n this.emitStateChange()\n \n // 车牌号智能切换\n this.autoSwitchLicensePlate()\n }\n\n /**\n * 追加值(在光标位置插入文本)\n */\n appendValue(text: string): void {\n if (!text) return\n\n const input = this.state.inputElement\n\n if (input) {\n const result = insertTextAtCursor(input, text, this.state.maxLength)\n input.value = result.value\n setInputCursorPosition(input, result.cursorPosition)\n this.state.value = result.value\n this.state.cursorPosition = result.cursorPosition\n\n // 触发原生 input 事件\n input.dispatchEvent(new Event('input', { bubbles: true }))\n }\n else {\n if (this.state.maxLength && this.state.value.length + text.length > this.state.maxLength) {\n text = text.slice(0, this.state.maxLength - this.state.value.length)\n }\n const newValue = this.state.value.slice(0, this.state.cursorPosition)\n + text\n + this.state.value.slice(this.state.cursorPosition)\n this.state.value = newValue\n this.state.cursorPosition += text.length\n }\n\n this.emitStateChange()\n }\n\n /**\n * 设置最大长度\n */\n setMaxLength(maxLength?: number): void {\n this.state.maxLength = maxLength\n this.emitStateChange()\n }\n\n /**\n * 绑定输入框\n */\n bindInput(input: HTMLInputElement | HTMLTextAreaElement): void {\n this.state.inputElement = input\n this.state.value = input.value\n this.state.cursorPosition = getInputCursorPosition(input)\n this.emitStateChange()\n }\n\n /**\n * 解绑输入框\n */\n unbindInput(): void {\n this.state.inputElement = null\n this.emitStateChange()\n }\n\n /**\n * 发送状态变化事件\n */\n private emitStateChange(): void {\n this.emit('stateChange', { ...this.state })\n }\n\n /**\n * 销毁\n */\n destroy(): void {\n this.hide()\n this.clear()\n this.state.inputElement = null\n }\n}\n\n/**\n * 创建键盘管理器实例\n */\nexport function createKeyboardManager(options?: KeyboardOptions): KeyboardManager {\n return new KeyboardManager(options)\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 键盘管理器
|
|
3
|
+
* @module managers/keyboard-manager
|
|
4
|
+
*/
|
|
5
|
+
import type { KeyboardConfig, KeyboardEventMap, KeyboardOptions, KeyboardState, KeyboardType, KeyDefinition } from '../types';
|
|
6
|
+
import { EventEmitter } from '../utils/event-emitter';
|
|
7
|
+
/**
|
|
8
|
+
* 键盘管理器类
|
|
9
|
+
* 处理键盘状态管理、输入处理等核心逻辑
|
|
10
|
+
*/
|
|
11
|
+
export declare class KeyboardManager extends EventEmitter<KeyboardEventMap> {
|
|
12
|
+
/** 配置选项 */
|
|
13
|
+
private options;
|
|
14
|
+
/** 当前状态 */
|
|
15
|
+
private state;
|
|
16
|
+
/** 当前布局配置 */
|
|
17
|
+
private currentLayout;
|
|
18
|
+
constructor(options?: KeyboardOptions);
|
|
19
|
+
/**
|
|
20
|
+
* 获取当前状态
|
|
21
|
+
*/
|
|
22
|
+
getState(): Readonly<KeyboardState>;
|
|
23
|
+
/**
|
|
24
|
+
* 获取当前布局配置
|
|
25
|
+
*/
|
|
26
|
+
getLayout(): KeyboardConfig | null;
|
|
27
|
+
/**
|
|
28
|
+
* 获取配置选项
|
|
29
|
+
*/
|
|
30
|
+
getOptions(): Readonly<Required<KeyboardOptions>>;
|
|
31
|
+
/**
|
|
32
|
+
* 加载键盘布局
|
|
33
|
+
*/
|
|
34
|
+
private loadLayout;
|
|
35
|
+
/**
|
|
36
|
+
* 显示键盘
|
|
37
|
+
*/
|
|
38
|
+
show(inputElement?: HTMLInputElement | HTMLTextAreaElement): void;
|
|
39
|
+
/**
|
|
40
|
+
* 隐藏键盘
|
|
41
|
+
*/
|
|
42
|
+
hide(): void;
|
|
43
|
+
/**
|
|
44
|
+
* 切换键盘显示/隐藏
|
|
45
|
+
*/
|
|
46
|
+
toggle(inputElement?: HTMLInputElement | HTMLTextAreaElement): void;
|
|
47
|
+
/**
|
|
48
|
+
* 切换键盘类型
|
|
49
|
+
*/
|
|
50
|
+
switchType(type: KeyboardType | string): void;
|
|
51
|
+
/**
|
|
52
|
+
* 切换大小写
|
|
53
|
+
*/
|
|
54
|
+
toggleShift(): void;
|
|
55
|
+
/**
|
|
56
|
+
* 设置大小写状态
|
|
57
|
+
*/
|
|
58
|
+
setShift(isUpperCase: boolean): void;
|
|
59
|
+
/**
|
|
60
|
+
* 处理按键
|
|
61
|
+
*/
|
|
62
|
+
handleKey(key: KeyDefinition): void;
|
|
63
|
+
/**
|
|
64
|
+
* 处理字符输入
|
|
65
|
+
*/
|
|
66
|
+
private handleCharKey;
|
|
67
|
+
/**
|
|
68
|
+
* 处理退格
|
|
69
|
+
*/
|
|
70
|
+
private handleBackspace;
|
|
71
|
+
/**
|
|
72
|
+
* 车牌号智能切换逻辑
|
|
73
|
+
* 根据当前值长度自动切换键盘布局
|
|
74
|
+
* 只有 2 种布局:省份键盘(第1位)和 字母+数字混合键盘(第2-8位)
|
|
75
|
+
*/
|
|
76
|
+
private autoSwitchLicensePlate;
|
|
77
|
+
/**
|
|
78
|
+
* 处理清空
|
|
79
|
+
*/
|
|
80
|
+
private handleClear;
|
|
81
|
+
/**
|
|
82
|
+
* 处理确认
|
|
83
|
+
*/
|
|
84
|
+
private handleConfirm;
|
|
85
|
+
/**
|
|
86
|
+
* 处理切换键盘
|
|
87
|
+
*/
|
|
88
|
+
private handleTab;
|
|
89
|
+
/**
|
|
90
|
+
* 获取按键的实际输出值
|
|
91
|
+
*/
|
|
92
|
+
private getKeyValue;
|
|
93
|
+
/**
|
|
94
|
+
* 获取按键的显示文本
|
|
95
|
+
*/
|
|
96
|
+
getKeyLabel(key: KeyDefinition): string;
|
|
97
|
+
/**
|
|
98
|
+
* 设置值
|
|
99
|
+
*/
|
|
100
|
+
setValue(value: string): void;
|
|
101
|
+
/**
|
|
102
|
+
* 追加值(在光标位置插入文本)
|
|
103
|
+
*/
|
|
104
|
+
appendValue(text: string): void;
|
|
105
|
+
/**
|
|
106
|
+
* 设置最大长度
|
|
107
|
+
*/
|
|
108
|
+
setMaxLength(maxLength?: number): void;
|
|
109
|
+
/**
|
|
110
|
+
* 绑定输入框
|
|
111
|
+
*/
|
|
112
|
+
bindInput(input: HTMLInputElement | HTMLTextAreaElement): void;
|
|
113
|
+
/**
|
|
114
|
+
* 解绑输入框
|
|
115
|
+
*/
|
|
116
|
+
unbindInput(): void;
|
|
117
|
+
/**
|
|
118
|
+
* 发送状态变化事件
|
|
119
|
+
*/
|
|
120
|
+
private emitStateChange;
|
|
121
|
+
/**
|
|
122
|
+
* 销毁
|
|
123
|
+
*/
|
|
124
|
+
destroy(): void;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 创建键盘管理器实例
|
|
128
|
+
*/
|
|
129
|
+
export declare function createKeyboardManager(options?: KeyboardOptions): KeyboardManager;
|
|
130
|
+
//# sourceMappingURL=keyboard-manager.d.ts.map
|