@composy/keyboard-core 0.0.1 → 0.0.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.
Files changed (339) hide show
  1. package/README.md +156 -37
  2. package/dist/index.js +1540 -1395
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.min.js +2981 -1
  5. package/dist/index.min.js.map +1 -0
  6. package/es/.dts-output-manifest.json +1 -0
  7. package/es/.dts.tsbuildinfo +1 -0
  8. package/es/icons.d.ts +0 -1
  9. package/es/icons.js +1 -1
  10. package/es/icons.js.map +1 -1
  11. package/es/index.d.ts +3 -4
  12. package/es/index.js +15 -15
  13. package/es/layouts/amount.d.ts +0 -1
  14. package/es/layouts/amount.js +1 -1
  15. package/es/layouts/amount.js.map +1 -1
  16. package/es/layouts/bankcard.d.ts +0 -1
  17. package/es/layouts/bankcard.js +1 -1
  18. package/es/layouts/bankcard.js.map +1 -1
  19. package/es/layouts/email.d.ts +0 -1
  20. package/es/layouts/email.js +1 -1
  21. package/es/layouts/email.js.map +1 -1
  22. package/es/layouts/idcard.d.ts +0 -1
  23. package/es/layouts/idcard.js +1 -1
  24. package/es/layouts/idcard.js.map +1 -1
  25. package/es/layouts/index.d.ts +11 -12
  26. package/es/layouts/index.js +23 -23
  27. package/es/layouts/index.js.map +1 -1
  28. package/es/layouts/license-plate.d.ts +0 -1
  29. package/es/layouts/license-plate.js +1 -1
  30. package/es/layouts/license-plate.js.map +1 -1
  31. package/es/layouts/number.d.ts +0 -1
  32. package/es/layouts/number.js +1 -1
  33. package/es/layouts/number.js.map +1 -1
  34. package/es/layouts/phone.d.ts +0 -1
  35. package/es/layouts/phone.js +1 -1
  36. package/es/layouts/phone.js.map +1 -1
  37. package/es/layouts/punct.d.ts +0 -1
  38. package/es/layouts/punct.js +1 -1
  39. package/es/layouts/punct.js.map +1 -1
  40. package/es/layouts/qwerty.d.ts +0 -1
  41. package/es/layouts/qwerty.js +1 -1
  42. package/es/layouts/qwerty.js.map +1 -1
  43. package/es/layouts/search.d.ts +0 -1
  44. package/es/layouts/search.js +1 -1
  45. package/es/layouts/search.js.map +1 -1
  46. package/es/layouts/symbol.d.ts +0 -1
  47. package/es/layouts/symbol.js +1 -1
  48. package/es/layouts/symbol.js.map +1 -1
  49. package/es/layouts/url.d.ts +0 -1
  50. package/es/layouts/url.js +1 -1
  51. package/es/layouts/url.js.map +1 -1
  52. package/es/layouts/verifycode.d.ts +0 -1
  53. package/es/layouts/verifycode.js +1 -1
  54. package/es/layouts/verifycode.js.map +1 -1
  55. package/es/managers/index.d.ts +1 -2
  56. package/es/managers/index.js +1 -1
  57. package/es/managers/keyboard-manager.d.ts +2 -1
  58. package/es/managers/keyboard-manager.js +79 -22
  59. package/es/managers/keyboard-manager.js.map +1 -1
  60. package/es/managers/keyboard-renderer.d.ts +3 -2
  61. package/es/managers/keyboard-renderer.js +81 -39
  62. package/es/managers/keyboard-renderer.js.map +1 -1
  63. package/es/managers/position-manager.d.ts +4 -3
  64. package/es/managers/position-manager.js +42 -21
  65. package/es/managers/position-manager.js.map +1 -1
  66. package/es/themes/index.d.ts +1 -2
  67. package/es/themes/index.js +2 -1
  68. package/es/themes/index.js.map +1 -1
  69. package/es/themes/presets.d.ts +0 -1
  70. package/es/themes/presets.js +1 -1
  71. package/es/themes/presets.js.map +1 -1
  72. package/es/themes/types.d.ts +1 -1
  73. package/es/themes/types.js +1 -1
  74. package/es/types/index.d.ts +0 -1
  75. package/es/types/index.js +1 -1
  76. package/es/types/keyboard.d.ts +0 -1
  77. package/es/types/keyboard.js +1 -1
  78. package/es/types/position.d.ts +0 -1
  79. package/es/types/position.js +1 -1
  80. package/es/utils/device.d.ts +0 -1
  81. package/es/utils/device.js +11 -7
  82. package/es/utils/device.js.map +1 -1
  83. package/es/utils/dom.d.ts +4 -1
  84. package/es/utils/dom.js +25 -7
  85. package/es/utils/dom.js.map +1 -1
  86. package/es/utils/event-emitter.d.ts +0 -1
  87. package/es/utils/event-emitter.js +2 -1
  88. package/es/utils/event-emitter.js.map +1 -1
  89. package/es/utils/formatters.d.ts +0 -1
  90. package/es/utils/formatters.js +4 -4
  91. package/es/utils/formatters.js.map +1 -1
  92. package/es/utils/index.d.ts +2 -3
  93. package/es/utils/index.js +5 -5
  94. package/es/utils/random.d.ts +4 -1
  95. package/es/utils/random.js +2 -2
  96. package/es/utils/random.js.map +1 -1
  97. package/esm/icons.js +1 -1
  98. package/esm/icons.js.map +1 -1
  99. package/esm/index.js +15 -15
  100. package/esm/layouts/amount.js +1 -1
  101. package/esm/layouts/amount.js.map +1 -1
  102. package/esm/layouts/bankcard.js +1 -1
  103. package/esm/layouts/bankcard.js.map +1 -1
  104. package/esm/layouts/email.js +1 -1
  105. package/esm/layouts/email.js.map +1 -1
  106. package/esm/layouts/idcard.js +1 -1
  107. package/esm/layouts/idcard.js.map +1 -1
  108. package/esm/layouts/index.js +23 -23
  109. package/esm/layouts/index.js.map +1 -1
  110. package/esm/layouts/license-plate.js +1 -1
  111. package/esm/layouts/license-plate.js.map +1 -1
  112. package/esm/layouts/number.js +1 -1
  113. package/esm/layouts/number.js.map +1 -1
  114. package/esm/layouts/phone.js +1 -1
  115. package/esm/layouts/phone.js.map +1 -1
  116. package/esm/layouts/punct.js +1 -1
  117. package/esm/layouts/punct.js.map +1 -1
  118. package/esm/layouts/qwerty.js +1 -1
  119. package/esm/layouts/qwerty.js.map +1 -1
  120. package/esm/layouts/search.js +1 -1
  121. package/esm/layouts/search.js.map +1 -1
  122. package/esm/layouts/symbol.js +1 -1
  123. package/esm/layouts/symbol.js.map +1 -1
  124. package/esm/layouts/url.js +1 -1
  125. package/esm/layouts/url.js.map +1 -1
  126. package/esm/layouts/verifycode.js +1 -1
  127. package/esm/layouts/verifycode.js.map +1 -1
  128. package/esm/managers/index.js +1 -1
  129. package/esm/managers/keyboard-manager.js +79 -22
  130. package/esm/managers/keyboard-manager.js.map +1 -1
  131. package/esm/managers/keyboard-renderer.js +81 -39
  132. package/esm/managers/keyboard-renderer.js.map +1 -1
  133. package/esm/managers/position-manager.js +42 -21
  134. package/esm/managers/position-manager.js.map +1 -1
  135. package/esm/themes/index.js +2 -1
  136. package/esm/themes/index.js.map +1 -1
  137. package/esm/themes/presets.js +1 -1
  138. package/esm/themes/presets.js.map +1 -1
  139. package/esm/utils/device.js +11 -7
  140. package/esm/utils/device.js.map +1 -1
  141. package/esm/utils/dom.js +25 -7
  142. package/esm/utils/dom.js.map +1 -1
  143. package/esm/utils/event-emitter.js +2 -1
  144. package/esm/utils/event-emitter.js.map +1 -1
  145. package/esm/utils/formatters.js +4 -4
  146. package/esm/utils/formatters.js.map +1 -1
  147. package/esm/utils/random.js +2 -2
  148. package/esm/utils/random.js.map +1 -1
  149. package/lib/icons.cjs +1 -1
  150. package/lib/icons.cjs.map +1 -1
  151. package/{esm/icons.d.ts → lib/icons.d.cts} +0 -1
  152. package/lib/index.cjs +14 -13
  153. package/{esm/index.d.ts → lib/index.d.cts} +3 -4
  154. package/lib/layouts/amount.cjs +1 -1
  155. package/lib/layouts/amount.cjs.map +1 -1
  156. package/{esm/layouts/amount.d.ts → lib/layouts/amount.d.cts} +0 -1
  157. package/lib/layouts/bankcard.cjs +1 -1
  158. package/lib/layouts/bankcard.cjs.map +1 -1
  159. package/{esm/layouts/bankcard.d.ts → lib/layouts/bankcard.d.cts} +0 -1
  160. package/lib/layouts/email.cjs +1 -1
  161. package/lib/layouts/email.cjs.map +1 -1
  162. package/lib/layouts/{email.d.ts → email.d.cts} +0 -1
  163. package/lib/layouts/idcard.cjs +1 -1
  164. package/lib/layouts/idcard.cjs.map +1 -1
  165. package/{esm/layouts/idcard.d.ts → lib/layouts/idcard.d.cts} +0 -1
  166. package/lib/layouts/index.cjs +23 -23
  167. package/lib/layouts/index.cjs.map +1 -1
  168. package/{esm/layouts/index.d.ts → lib/layouts/index.d.cts} +11 -12
  169. package/lib/layouts/license-plate.cjs +1 -1
  170. package/lib/layouts/license-plate.cjs.map +1 -1
  171. package/{esm/layouts/license-plate.d.ts → lib/layouts/license-plate.d.cts} +0 -1
  172. package/lib/layouts/number.cjs +1 -1
  173. package/lib/layouts/number.cjs.map +1 -1
  174. package/{esm/layouts/number.d.ts → lib/layouts/number.d.cts} +0 -1
  175. package/lib/layouts/phone.cjs +1 -1
  176. package/lib/layouts/phone.cjs.map +1 -1
  177. package/lib/layouts/{phone.d.ts → phone.d.cts} +0 -1
  178. package/lib/layouts/punct.cjs +1 -1
  179. package/lib/layouts/punct.cjs.map +1 -1
  180. package/lib/layouts/{punct.d.ts → punct.d.cts} +0 -1
  181. package/lib/layouts/qwerty.cjs +1 -1
  182. package/lib/layouts/qwerty.cjs.map +1 -1
  183. package/{esm/layouts/qwerty.d.ts → lib/layouts/qwerty.d.cts} +0 -1
  184. package/lib/layouts/search.cjs +1 -1
  185. package/lib/layouts/search.cjs.map +1 -1
  186. package/{esm/layouts/search.d.ts → lib/layouts/search.d.cts} +0 -1
  187. package/lib/layouts/symbol.cjs +1 -1
  188. package/lib/layouts/symbol.cjs.map +1 -1
  189. package/{esm/layouts/symbol.d.ts → lib/layouts/symbol.d.cts} +0 -1
  190. package/lib/layouts/url.cjs +1 -1
  191. package/lib/layouts/url.cjs.map +1 -1
  192. package/{esm/layouts/url.d.ts → lib/layouts/url.d.cts} +0 -1
  193. package/lib/layouts/verifycode.cjs +1 -1
  194. package/lib/layouts/verifycode.cjs.map +1 -1
  195. package/lib/layouts/{verifycode.d.ts → verifycode.d.cts} +0 -1
  196. package/lib/managers/index.cjs +1 -1
  197. package/lib/managers/{index.d.ts → index.d.cts} +1 -2
  198. package/lib/managers/keyboard-manager.cjs +79 -22
  199. package/lib/managers/keyboard-manager.cjs.map +1 -1
  200. package/lib/managers/{keyboard-manager.d.ts → keyboard-manager.d.cts} +2 -1
  201. package/lib/managers/keyboard-renderer.cjs +80 -38
  202. package/lib/managers/keyboard-renderer.cjs.map +1 -1
  203. package/lib/managers/{keyboard-renderer.d.ts → keyboard-renderer.d.cts} +3 -2
  204. package/lib/managers/position-manager.cjs +42 -21
  205. package/lib/managers/position-manager.cjs.map +1 -1
  206. package/lib/managers/{position-manager.d.ts → position-manager.d.cts} +4 -3
  207. package/lib/themes/index.cjs +2 -1
  208. package/lib/themes/index.cjs.map +1 -1
  209. package/lib/themes/{index.d.ts → index.d.cts} +1 -2
  210. package/lib/themes/presets.cjs +1 -1
  211. package/lib/themes/presets.cjs.map +1 -1
  212. package/lib/themes/{presets.d.ts → presets.d.cts} +0 -1
  213. package/lib/themes/types.cjs +1 -1
  214. package/{esm/themes/types.d.ts → lib/themes/types.d.cts} +1 -1
  215. package/lib/types/index.cjs +1 -1
  216. package/{esm/types/index.d.ts → lib/types/index.d.cts} +0 -1
  217. package/lib/types/keyboard.cjs +1 -1
  218. package/{esm/types/keyboard.d.ts → lib/types/keyboard.d.cts} +0 -1
  219. package/lib/types/position.cjs +1 -1
  220. package/lib/types/{position.d.ts → position.d.cts} +0 -1
  221. package/lib/utils/device.cjs +11 -7
  222. package/lib/utils/device.cjs.map +1 -1
  223. package/{esm/utils/device.d.ts → lib/utils/device.d.cts} +0 -1
  224. package/lib/utils/dom.cjs +25 -6
  225. package/lib/utils/dom.cjs.map +1 -1
  226. package/{esm/utils/dom.d.ts → lib/utils/dom.d.cts} +4 -1
  227. package/lib/utils/event-emitter.cjs +2 -1
  228. package/lib/utils/event-emitter.cjs.map +1 -1
  229. package/{esm/utils/event-emitter.d.ts → lib/utils/event-emitter.d.cts} +0 -1
  230. package/lib/utils/formatters.cjs +4 -4
  231. package/lib/utils/formatters.cjs.map +1 -1
  232. package/{esm/utils/formatters.d.ts → lib/utils/formatters.d.cts} +0 -1
  233. package/lib/utils/index.cjs +4 -3
  234. package/{esm/utils/index.d.ts → lib/utils/index.d.cts} +2 -3
  235. package/lib/utils/random.cjs +2 -2
  236. package/lib/utils/random.cjs.map +1 -1
  237. package/{esm/utils/random.d.ts → lib/utils/random.d.cts} +4 -1
  238. package/package.json +28 -14
  239. package/es/icons.d.ts.map +0 -1
  240. package/es/index.d.ts.map +0 -1
  241. package/es/layouts/amount.d.ts.map +0 -1
  242. package/es/layouts/bankcard.d.ts.map +0 -1
  243. package/es/layouts/email.d.ts.map +0 -1
  244. package/es/layouts/idcard.d.ts.map +0 -1
  245. package/es/layouts/index.d.ts.map +0 -1
  246. package/es/layouts/license-plate.d.ts.map +0 -1
  247. package/es/layouts/number.d.ts.map +0 -1
  248. package/es/layouts/phone.d.ts.map +0 -1
  249. package/es/layouts/punct.d.ts.map +0 -1
  250. package/es/layouts/qwerty.d.ts.map +0 -1
  251. package/es/layouts/search.d.ts.map +0 -1
  252. package/es/layouts/symbol.d.ts.map +0 -1
  253. package/es/layouts/url.d.ts.map +0 -1
  254. package/es/layouts/verifycode.d.ts.map +0 -1
  255. package/es/managers/index.d.ts.map +0 -1
  256. package/es/managers/keyboard-manager.d.ts.map +0 -1
  257. package/es/managers/keyboard-renderer.d.ts.map +0 -1
  258. package/es/managers/position-manager.d.ts.map +0 -1
  259. package/es/themes/index.d.ts.map +0 -1
  260. package/es/themes/presets.d.ts.map +0 -1
  261. package/es/themes/types.d.ts.map +0 -1
  262. package/es/types/index.d.ts.map +0 -1
  263. package/es/types/keyboard.d.ts.map +0 -1
  264. package/es/types/position.d.ts.map +0 -1
  265. package/es/utils/device.d.ts.map +0 -1
  266. package/es/utils/dom.d.ts.map +0 -1
  267. package/es/utils/event-emitter.d.ts.map +0 -1
  268. package/es/utils/formatters.d.ts.map +0 -1
  269. package/es/utils/index.d.ts.map +0 -1
  270. package/es/utils/random.d.ts.map +0 -1
  271. package/esm/icons.d.ts.map +0 -1
  272. package/esm/index.d.ts.map +0 -1
  273. package/esm/layouts/amount.d.ts.map +0 -1
  274. package/esm/layouts/bankcard.d.ts.map +0 -1
  275. package/esm/layouts/email.d.ts +0 -11
  276. package/esm/layouts/email.d.ts.map +0 -1
  277. package/esm/layouts/idcard.d.ts.map +0 -1
  278. package/esm/layouts/index.d.ts.map +0 -1
  279. package/esm/layouts/license-plate.d.ts.map +0 -1
  280. package/esm/layouts/number.d.ts.map +0 -1
  281. package/esm/layouts/phone.d.ts +0 -15
  282. package/esm/layouts/phone.d.ts.map +0 -1
  283. package/esm/layouts/punct.d.ts +0 -7
  284. package/esm/layouts/punct.d.ts.map +0 -1
  285. package/esm/layouts/qwerty.d.ts.map +0 -1
  286. package/esm/layouts/search.d.ts.map +0 -1
  287. package/esm/layouts/symbol.d.ts.map +0 -1
  288. package/esm/layouts/url.d.ts.map +0 -1
  289. package/esm/layouts/verifycode.d.ts +0 -15
  290. package/esm/layouts/verifycode.d.ts.map +0 -1
  291. package/esm/managers/index.d.ts +0 -8
  292. package/esm/managers/index.d.ts.map +0 -1
  293. package/esm/managers/keyboard-manager.d.ts +0 -130
  294. package/esm/managers/keyboard-manager.d.ts.map +0 -1
  295. package/esm/managers/keyboard-renderer.d.ts +0 -115
  296. package/esm/managers/keyboard-renderer.d.ts.map +0 -1
  297. package/esm/managers/position-manager.d.ts +0 -72
  298. package/esm/managers/position-manager.d.ts.map +0 -1
  299. package/esm/themes/index.d.ts +0 -70
  300. package/esm/themes/index.d.ts.map +0 -1
  301. package/esm/themes/presets.d.ts +0 -39
  302. package/esm/themes/presets.d.ts.map +0 -1
  303. package/esm/themes/types.d.ts.map +0 -1
  304. package/esm/themes/types.js +0 -10
  305. package/esm/types/index.d.ts.map +0 -1
  306. package/esm/types/index.js +0 -10
  307. package/esm/types/keyboard.d.ts.map +0 -1
  308. package/esm/types/keyboard.js +0 -10
  309. package/esm/types/position.d.ts +0 -139
  310. package/esm/types/position.d.ts.map +0 -1
  311. package/esm/types/position.js +0 -10
  312. package/esm/utils/device.d.ts.map +0 -1
  313. package/esm/utils/dom.d.ts.map +0 -1
  314. package/esm/utils/event-emitter.d.ts.map +0 -1
  315. package/esm/utils/formatters.d.ts.map +0 -1
  316. package/esm/utils/index.d.ts.map +0 -1
  317. package/esm/utils/index.js +0 -16
  318. package/esm/utils/random.d.ts.map +0 -1
  319. package/lib/icons.d.ts +0 -58
  320. package/lib/index.d.ts +0 -12
  321. package/lib/layouts/amount.d.ts +0 -14
  322. package/lib/layouts/bankcard.d.ts +0 -15
  323. package/lib/layouts/idcard.d.ts +0 -16
  324. package/lib/layouts/index.d.ts +0 -54
  325. package/lib/layouts/license-plate.d.ts +0 -35
  326. package/lib/layouts/number.d.ts +0 -14
  327. package/lib/layouts/qwerty.d.ts +0 -10
  328. package/lib/layouts/search.d.ts +0 -7
  329. package/lib/layouts/symbol.d.ts +0 -14
  330. package/lib/layouts/url.d.ts +0 -7
  331. package/lib/themes/types.d.ts +0 -118
  332. package/lib/types/index.d.ts +0 -7
  333. package/lib/types/keyboard.d.ts +0 -253
  334. package/lib/utils/device.d.ts +0 -45
  335. package/lib/utils/dom.d.ts +0 -69
  336. package/lib/utils/event-emitter.d.ts +0 -52
  337. package/lib/utils/formatters.d.ts +0 -51
  338. package/lib/utils/index.d.ts +0 -10
  339. package/lib/utils/random.d.ts +0 -71
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.min.js","names":["deletedChar","newValue","document"],"sources":["../src/icons.ts","../src/layouts/amount.ts","../src/layouts/bankcard.ts","../src/layouts/email.ts","../src/layouts/idcard.ts","../src/layouts/license-plate.ts","../src/layouts/number.ts","../src/layouts/phone.ts","../src/layouts/punct.ts","../src/layouts/qwerty.ts","../src/layouts/search.ts","../src/layouts/symbol.ts","../src/layouts/url.ts","../src/layouts/verifycode.ts","../src/layouts/index.ts","../src/utils/device.ts","../src/utils/dom.ts","../src/utils/event-emitter.ts","../src/managers/keyboard-manager.ts","../src/themes/presets.ts","../src/themes/index.ts","../src/managers/position-manager.ts","../src/managers/keyboard-renderer.ts","../src/utils/formatters.ts","../src/utils/random.ts"],"sourcesContent":["/**\r\n * 键盘图标 SVG\r\n * 使用 Lucide 图标的 SVG 路径\r\n * @module icons\r\n */\r\n\r\n/**\r\n * 删除图标 (Delete/Backspace)\r\n */\r\nexport const ICON_DELETE = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10 5a2 2 0 0 0-1.344.519l-6.328 5.74a1 1 0 0 0 0 1.481l6.328 5.741A2 2 0 0 0 10 19h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2z\"/><path d=\"m12 9 6 6\"/><path d=\"m18 9-6 6\"/></svg>`\r\n\r\n/**\r\n * 清空图标 (X Circle)\r\n */\r\nexport const ICON_CLEAR = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m15 9-6 6\"/><path d=\"m9 9 6 6\"/></svg>`\r\n\r\n/**\r\n * 关闭图标 (X)\r\n */\r\nexport const ICON_CLOSE = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>`\r\n\r\n/**\r\n * 确认图标 (Check)\r\n */\r\nexport const ICON_CHECK = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"/></svg>`\r\n\r\n/**\r\n * 换行图标 (Corner Down Left)\r\n */\r\nexport const ICON_ENTER = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 10 4 15 9 20\"/><path d=\"M20 4v7a4 4 0 0 1-4 4H4\"/></svg>`\r\n\r\n/**\r\n * Shift 图标 (Arrow Big Up)\r\n */\r\nexport const ICON_SHIFT = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18v-6H5l7-7 7 7h-4v6H9z\"/></svg>`\r\n\r\n/**\r\n * 空格图标 (Space)\r\n */\r\nexport const ICON_SPACE = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M22 17v1c0 .5-.5 1-1 1H3c-.5 0-1-.5-1-1v-1\"/></svg>`\r\n\r\n/**\r\n * 键盘图标 (Keyboard)\r\n */\r\nexport const ICON_KEYBOARD = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\"/><path d=\"M6 8h.001\"/><path d=\"M10 8h.001\"/><path d=\"M14 8h.001\"/><path d=\"M18 8h.001\"/><path d=\"M8 12h.001\"/><path d=\"M12 12h.001\"/><path d=\"M16 12h.001\"/><path d=\"M7 16h10\"/></svg>`\r\n\r\n/**\r\n * 语音图标 (Mic)\r\n */\r\nexport const ICON_VOICE = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\"/><path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"/><line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\"/></svg>`\r\n\r\n/**\r\n * 所有图标映射\r\n */\r\nexport const ICONS = {\r\n delete: ICON_DELETE,\r\n clear: ICON_CLEAR,\r\n close: ICON_CLOSE,\r\n check: ICON_CHECK,\r\n enter: ICON_ENTER,\r\n shift: ICON_SHIFT,\r\n space: ICON_SPACE,\r\n keyboard: ICON_KEYBOARD,\r\n voice: ICON_VOICE,\r\n} as const\r\n\r\n/** IconName - 图标名称类型 */\r\nexport type IconName = keyof typeof ICONS\r\n","/**\r\n * 金额键盘布局\r\n * @module layouts/amount\r\n */\r\n\r\nimport type { KeyboardConfig, KeyDefinition } from '../types'\r\nimport { ICON_CLEAR, ICON_DELETE } from '../icons'\r\n\r\n/**\r\n * 创建数字按键\r\n */\r\nfunction createNumberKey(num: string): KeyDefinition {\r\n return {\r\n id: `amount-${num}`,\r\n type: 'char',\r\n label: num,\r\n value: num,\r\n className: 'key-num',\r\n }\r\n}\r\n\r\n/**\r\n * 金额键盘配置 - 紧凑4x4布局\r\n */\r\nexport const amountLayout: KeyboardConfig = {\r\n type: 'amount',\r\n name: '金额键盘',\r\n supportShift: false,\r\n rows: [\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('1'),\r\n createNumberKey('2'),\r\n createNumberKey('3'),\r\n {\r\n id: 'backspace',\r\n type: 'backspace',\r\n icon: ICON_DELETE,\r\n label: '',\r\n className: 'key-numpad-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('4'),\r\n createNumberKey('5'),\r\n createNumberKey('6'),\r\n {\r\n id: 'clear',\r\n type: 'clear',\r\n icon: ICON_CLEAR,\r\n label: '',\r\n className: 'key-numpad-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('7'),\r\n createNumberKey('8'),\r\n createNumberKey('9'),\r\n {\r\n id: 'double-zero',\r\n type: 'char',\r\n label: '00',\r\n value: '00',\r\n className: 'key-num',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n {\r\n id: 'decimal',\r\n type: 'char',\r\n label: '.',\r\n value: '.',\r\n className: 'key-num',\r\n },\r\n createNumberKey('0'),\r\n {\r\n id: 'done',\r\n type: 'done',\r\n label: '确定',\r\n width: 2,\r\n className: 'key-numpad-done',\r\n },\r\n ],\r\n },\r\n ],\r\n data: {\r\n inputType: 'amount',\r\n decimalPlaces: 2,\r\n },\r\n}\r\n\r\n/**\r\n * 简洁金额键盘 - 紧凑4x4布局\r\n */\r\nexport const amountSimpleLayout: KeyboardConfig = {\r\n type: 'amount-simple',\r\n name: '金额键盘',\r\n supportShift: false,\r\n rows: [\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('1'),\r\n createNumberKey('2'),\r\n createNumberKey('3'),\r\n {\r\n id: 'backspace',\r\n type: 'backspace',\r\n icon: ICON_DELETE,\r\n label: '',\r\n className: 'key-numpad-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('4'),\r\n createNumberKey('5'),\r\n createNumberKey('6'),\r\n {\r\n id: 'clear',\r\n type: 'clear',\r\n icon: ICON_CLEAR,\r\n label: '',\r\n className: 'key-numpad-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('7'),\r\n createNumberKey('8'),\r\n createNumberKey('9'),\r\n {\r\n id: 'close',\r\n type: 'close',\r\n label: '关闭',\r\n className: 'key-numpad-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n {\r\n id: 'decimal',\r\n type: 'char',\r\n label: '.',\r\n value: '.',\r\n className: 'key-num',\r\n },\r\n createNumberKey('0'),\r\n {\r\n id: 'done',\r\n type: 'done',\r\n label: '确定',\r\n width: 2,\r\n className: 'key-numpad-done',\r\n },\r\n ],\r\n },\r\n ],\r\n data: {\r\n inputType: 'amount',\r\n decimalPlaces: 2,\r\n },\r\n}\r\n","/**\r\n * 银行卡键盘布局\r\n * @module layouts/bankcard\r\n */\r\n\r\n// 从类型定义文件中导入 KeyboardConfig(键盘配置)和 KeyDefinition(按键定义)类型\r\nimport type { KeyboardConfig, KeyDefinition } from '../types'\r\n// 从图标模块中导入删除键图标和清除键图标\r\nimport { ICON_CLEAR, ICON_DELETE } from '../icons'\r\n\r\n/**\r\n * 创建数字按键\r\n * @param num - 数字字符串(如 '0'-'9')\r\n * @returns 返回一个按键定义对象\r\n */\r\nfunction createNumberKey(num: string): KeyDefinition {\r\n return {\r\n id: `bankcard-${num}`, // 按键唯一标识符,格式为 bankcard-数字\r\n type: 'char', // 按键类型为字符键\r\n label: num, // 按键上显示的文本\r\n value: num, // 按键按下后输出的值\r\n className: 'key-num', // 按键的 CSS 类名,用于样式定制\r\n }\r\n}\r\n\r\n/**\r\n * 银行卡键盘配置 - 紧凑4x4布局\r\n * 布局结构:\r\n * 第1行: 1 2 3 [退格]\r\n * 第2行: 4 5 6 [清除]\r\n * 第3行: 7 8 9 [关闭]\r\n * 第4行: [ABC] 0 [确定(占2格)]\r\n */\r\nexport const bankcardLayout: KeyboardConfig = {\r\n type: 'bankcard', // 键盘类型标识\r\n name: '银行卡键盘', // 键盘的显示名称\r\n supportShift: false, // 不支持 Shift 切换(纯数字键盘无需切换)\r\n rows: [\r\n // 键盘的行数组\r\n // ---- 第1行 ----\r\n {\r\n className: 'numpad-row', // 行的 CSS 类名\r\n keys: [\r\n // 该行包含的按键数组\r\n createNumberKey('1'), // 数字键 1\r\n createNumberKey('2'), // 数字键 2\r\n createNumberKey('3'), // 数字键 3\r\n {\r\n id: 'backspace', // 退格键的唯一标识\r\n type: 'backspace', // 按键类型为退格,删除最后一个字符\r\n icon: ICON_DELETE, // 使用删除图标作为显示内容\r\n label: '', // 无文本标签(由图标替代)\r\n className: 'key-numpad-fn', // 功能键的 CSS 类名\r\n },\r\n ],\r\n },\r\n // ---- 第2行 ----\r\n {\r\n className: 'numpad-row', // 行的 CSS 类名\r\n keys: [\r\n createNumberKey('4'), // 数字键 4\r\n createNumberKey('5'), // 数字键 5\r\n createNumberKey('6'), // 数字键 6\r\n {\r\n id: 'clear', // 清除键的唯一标识\r\n type: 'clear', // 按键类型为清除,清空所有输入\r\n icon: ICON_CLEAR, // 使用清除图标作为显示内容\r\n label: '', // 无文本标签\r\n className: 'key-numpad-fn', // 功能键的 CSS 类名\r\n },\r\n ],\r\n },\r\n // ---- 第3行 ----\r\n {\r\n className: 'numpad-row', // 行的 CSS 类名\r\n keys: [\r\n createNumberKey('7'), // 数字键 7\r\n createNumberKey('8'), // 数字键 8\r\n createNumberKey('9'), // 数字键 9\r\n {\r\n id: 'close', // 关闭键的唯一标识\r\n type: 'close', // 按键类型为关闭,收起键盘\r\n label: '关闭', // 按钮上显示的文本\r\n className: 'key-numpad-fn', // 功能键的 CSS 类名\r\n },\r\n ],\r\n },\r\n // ---- 第4行 ----\r\n {\r\n className: 'numpad-row', // 行的 CSS 类名\r\n keys: [\r\n {\r\n id: 'switch-qwerty', // 切换到全键盘的按键唯一标识\r\n type: 'tab', // 按键类型为标签页切换\r\n label: 'ABC', // 按钮上显示的文本,提示可切换到字母键盘\r\n className: 'key-numpad-fn', // 功能键的 CSS 类名\r\n data: { targetType: 'qwerty' }, // 附加数据,指定切换目标为 QWERTY 全键盘\r\n },\r\n createNumberKey('0'), // 数字键 0\r\n {\r\n id: 'done', // 确定键的唯一标识\r\n type: 'done', // 按键类型为确定,完成输入\r\n label: '确定', // 按钮上显示的文本\r\n width: 2, // 占据 2 个键的宽度\r\n className: 'key-numpad-done', // 确定键的 CSS 类名\r\n },\r\n ],\r\n },\r\n ],\r\n data: {\r\n // 键盘的附加数据\r\n maxLength: 19, // 银行卡号最大输入长度为 19 位\r\n inputType: 'bankcard', // 输入类型标识,用于外部判断\r\n },\r\n}\r\n","/**\r\n * 邮箱键盘布局\r\n * @module layouts/email\r\n */\r\n\r\nimport type { KeyboardConfig, KeyDefinition } from '../types'\r\nimport { ICON_DELETE, ICON_SHIFT } from '../icons'\r\n\r\n/**\r\n * 创建字符按键(支持大小写)\r\n */\r\nfunction createCharKey(char: string): KeyDefinition {\r\n return {\r\n id: `email-char-${char.toLowerCase()}`,\r\n type: 'char',\r\n label: { lower: char.toLowerCase(), upper: char.toUpperCase() },\r\n value: { lower: char.toLowerCase(), upper: char.toUpperCase() },\r\n }\r\n}\r\n\r\n/**\r\n * 创建快捷片段按键\r\n */\r\nfunction snippet(label: string, id?: string): KeyDefinition {\r\n return {\r\n id: id || `email-snippet-${label.replace(/[^a-z0-9]/gi, '')}`,\r\n type: 'char',\r\n label,\r\n value: label,\r\n className: 'key-snippet',\r\n }\r\n}\r\n\r\n/**\r\n * 常见邮箱后缀列表\r\n */\r\nexport const EMAIL_SUFFIXES = [\r\n '@qq.com',\r\n '@163.com',\r\n '@126.com',\r\n '@gmail.com',\r\n '@outlook.com',\r\n '@hotmail.com',\r\n '@sina.com',\r\n '@sohu.com',\r\n '@icloud.com',\r\n '@foxmail.com',\r\n '@yeah.net',\r\n '@139.com',\r\n]\r\n\r\nexport const emailLayout: KeyboardConfig = {\r\n type: 'email',\r\n name: '邮箱键盘',\r\n supportShift: true,\r\n defaultUpperCase: false,\r\n switchable: ['symbol', 'number'],\r\n rows: [\r\n // QWERTY 第一行\r\n {\r\n keys: 'qwertyuiop'.split('').map(createCharKey),\r\n },\r\n // QWERTY 第二行\r\n {\r\n keys: 'asdfghjkl'.split('').map(createCharKey),\r\n },\r\n // QWERTY 第三行 + Shift + 退格\r\n {\r\n keys: [\r\n {\r\n id: 'shift',\r\n type: 'shift',\r\n icon: ICON_SHIFT,\r\n label: '',\r\n width: 1.5,\r\n className: 'key-shift',\r\n },\r\n ...'zxcvbnm'.split('').map(createCharKey),\r\n {\r\n id: 'backspace',\r\n type: 'backspace',\r\n icon: ICON_DELETE,\r\n label: '',\r\n width: 1.5,\r\n className: 'key-backspace',\r\n },\r\n ],\r\n },\r\n // 底部行:切换 + @ + 常用邮箱 + 符号 + 空格 + 完成\r\n {\r\n keys: [\r\n {\r\n id: 'switch-number',\r\n type: 'tab',\r\n label: '123',\r\n width: 1.25,\r\n className: 'key-switch',\r\n data: { targetType: 'number' },\r\n },\r\n {\r\n id: 'email-at',\r\n type: 'char',\r\n label: '@',\r\n value: '@',\r\n className: 'key-at',\r\n },\r\n {\r\n id: 'email-suffix',\r\n type: 'char',\r\n label: '.com',\r\n value: '',\r\n width: 1.5,\r\n className: 'key-suffix',\r\n options: EMAIL_SUFFIXES,\r\n },\r\n snippet('.', 'email-dot'),\r\n snippet('-', 'email-dash'),\r\n snippet('_', 'email-underscore'),\r\n {\r\n id: 'space',\r\n type: 'space',\r\n label: '',\r\n value: ' ',\r\n width: 2,\r\n className: 'key-space',\r\n },\r\n {\r\n id: 'email-done',\r\n type: 'done',\r\n label: '确定',\r\n width: 1.5,\r\n className: 'key-done',\r\n },\r\n ],\r\n },\r\n ],\r\n}\r\n","/**\r\n * 身份证号键盘布局\r\n * @module layouts/idcard\r\n */\r\n\r\n// 从类型定义文件中导入 KeyboardConfig(键盘配置)和 KeyDefinition(按键定义)类型\r\nimport type { KeyboardConfig, KeyDefinition } from '../types'\r\n// 从图标模块中导入删除键图标和清除键图标\r\nimport { ICON_CLEAR, ICON_DELETE } from '../icons'\r\n\r\n/**\r\n * 创建数字按键\r\n * @param num - 数字字符串(如 '0'-'9')\r\n * @returns 返回一个按键定义对象\r\n */\r\nfunction createNumberKey(num: string): KeyDefinition {\r\n return {\r\n id: `idcard-${num}`, // 按键唯一标识符,格式为 idcard-数字\r\n type: 'char', // 按键类型为字符键\r\n label: num, // 按键上显示的文本\r\n value: num, // 按键按下后输出的值\r\n className: 'key-num', // 按键的 CSS 类名,用于样式定制\r\n }\r\n}\r\n\r\n/**\r\n * 身份证号键盘配置\r\n * 紧凑3x4布局,无空白位置\r\n * 布局结构:\r\n * 第1行: 1 2 3 [退格]\r\n * 第2行: 4 5 6 [清除]\r\n * 第3行: 7 8 9 X\r\n * 第4行: [关闭] 0 [确定(占2格)]\r\n */\r\nexport const idcardLayout: KeyboardConfig = {\r\n type: 'idcard', // 键盘类型标识\r\n name: '身份证键盘', // 键盘的显示名称\r\n supportShift: false, // 不支持 Shift 切换(纯数字+X键盘无需切换)\r\n rows: [\r\n // 键盘的行数组\r\n // ---- 第1行 ----\r\n {\r\n className: 'numpad-row', // 行的 CSS 类名\r\n keys: [\r\n // 该行包含的按键数组\r\n createNumberKey('1'), // 数字键 1\r\n createNumberKey('2'), // 数字键 2\r\n createNumberKey('3'), // 数字键 3\r\n {\r\n id: 'backspace', // 退格键的唯一标识\r\n type: 'backspace', // 按键类型为退格,删除最后一个字符\r\n icon: ICON_DELETE, // 使用删除图标作为显示内容\r\n label: '', // 无文本标签(由图标替代)\r\n className: 'key-numpad-fn', // 功能键的 CSS 类名\r\n },\r\n ],\r\n },\r\n // ---- 第2行 ----\r\n {\r\n className: 'numpad-row', // 行的 CSS 类名\r\n keys: [\r\n createNumberKey('4'), // 数字键 4\r\n createNumberKey('5'), // 数字键 5\r\n createNumberKey('6'), // 数字键 6\r\n {\r\n id: 'clear', // 清除键的唯一标识\r\n type: 'clear', // 按键类型为清除,清空所有输入\r\n icon: ICON_CLEAR, // 使用清除图标作为显示内容\r\n label: '', // 无文本标签\r\n className: 'key-numpad-fn', // 功能键的 CSS 类名\r\n },\r\n ],\r\n },\r\n // ---- 第3行 ----\r\n {\r\n className: 'numpad-row', // 行的 CSS 类名\r\n keys: [\r\n createNumberKey('7'), // 数字键 7\r\n createNumberKey('8'), // 数字键 8\r\n createNumberKey('9'), // 数字键 9\r\n {\r\n id: 'idcard-x', // X 键的唯一标识\r\n type: 'char', // 按键类型为字符\r\n label: 'X', // 按钮上显示的文本(身份证尾号可能是X)\r\n value: 'X', // 按下后输出的值\r\n className: 'key-num', // 使用数字键的 CSS 类名,保持外观一致\r\n },\r\n ],\r\n },\r\n // ---- 第4行 ----\r\n {\r\n className: 'numpad-row', // 行的 CSS 类名\r\n keys: [\r\n {\r\n id: 'close', // 关闭键的唯一标识\r\n type: 'close', // 按键类型为关闭,收起键盘\r\n label: '关闭', // 按钮上显示的文本\r\n className: 'key-numpad-fn', // 功能键的 CSS 类名\r\n },\r\n createNumberKey('0'), // 数字键 0\r\n {\r\n id: 'done', // 确定键的唯一标识\r\n type: 'done', // 按键类型为确定,完成输入\r\n label: '确定', // 按钮上显示的文本\r\n width: 2, // 占据 2 个键的宽度\r\n className: 'key-numpad-done', // 确定键的 CSS 类名\r\n },\r\n ],\r\n },\r\n ],\r\n data: {\r\n // 键盘的附加数据\r\n maxLength: 18, // 身份证号最大输入长度为 18 位\r\n inputType: 'idcard', // 输入类型标识,用于外部判断\r\n },\r\n}\r\n","/**\r\n * 车牌号键盘布局\r\n * @module layouts/license-plate\r\n * 省份键盘类似26键布局,点击省份后自动切换到字母数字键盘\r\n */\r\n\r\nimport type { KeyboardConfig, KeyDefinition } from '../types'\r\nimport { ICON_DELETE } from '../icons'\r\n\r\n/**\r\n * 省份简称列表(按地理区域排列,10列布局)\r\n */\r\nexport const PROVINCES = [\r\n '京',\r\n '津',\r\n '沪',\r\n '渝',\r\n '冀',\r\n '豫',\r\n '云',\r\n '辽',\r\n '黑',\r\n '湘',\r\n '皖',\r\n '鲁',\r\n '新',\r\n '苏',\r\n '浙',\r\n '赣',\r\n '鄂',\r\n '桂',\r\n '甘',\r\n '晋',\r\n '蒙',\r\n '陕',\r\n '吉',\r\n '闽',\r\n '贵',\r\n '粤',\r\n '青',\r\n '藏',\r\n '川',\r\n '宁',\r\n '琼',\r\n '港',\r\n '澳',\r\n]\r\n\r\n/**\r\n * 车牌字母(排除 I 和 O,避免与数字混淆)\r\n */\r\nexport const PLATE_LETTERS = [\r\n 'A',\r\n 'B',\r\n 'C',\r\n 'D',\r\n 'E',\r\n 'F',\r\n 'G',\r\n 'H',\r\n 'J',\r\n 'K',\r\n 'L',\r\n 'M',\r\n 'N',\r\n 'P',\r\n 'Q',\r\n 'R',\r\n 'S',\r\n 'T',\r\n 'U',\r\n 'V',\r\n 'W',\r\n 'X',\r\n 'Y',\r\n 'Z',\r\n]\r\n\r\n/**\r\n * 创建省份按键(点击后自动切换到字母数字键盘)\r\n */\r\nfunction createProvinceKey(province: string): KeyDefinition {\r\n return {\r\n id: `province-${province}`,\r\n type: 'char',\r\n label: province,\r\n value: province,\r\n className: 'key-plate-province',\r\n data: { switchAfterInput: 'license-plate-alphanumeric' },\r\n }\r\n}\r\n\r\n/**\r\n * 创建字母按键\r\n */\r\nfunction createLetterKey(letter: string): KeyDefinition {\r\n return {\r\n id: `letter-${letter}`,\r\n type: 'char',\r\n label: letter,\r\n value: letter,\r\n className: 'key-plate-letter',\r\n }\r\n}\r\n\r\n/**\r\n * 创建数字按键\r\n */\r\nfunction createNumberKey(num: string): KeyDefinition {\r\n return {\r\n id: `num-${num}`,\r\n type: 'char',\r\n label: num,\r\n value: num,\r\n className: 'key-plate-number',\r\n }\r\n}\r\n\r\n/**\r\n * 省份键盘配置 - 类似26键布局\r\n * 10列布局,更紧凑美观\r\n */\r\nexport const licensePlateProvinceLayout: KeyboardConfig = {\r\n type: 'license-plate-province',\r\n name: '省份简称',\r\n supportShift: false,\r\n rows: [\r\n {\r\n className: 'plate-keyboard-row',\r\n keys: PROVINCES.slice(0, 10).map(createProvinceKey),\r\n },\r\n {\r\n className: 'plate-keyboard-row',\r\n keys: PROVINCES.slice(10, 20).map(createProvinceKey),\r\n },\r\n {\r\n className: 'plate-keyboard-row',\r\n keys: PROVINCES.slice(20, 30).map(createProvinceKey),\r\n },\r\n {\r\n className: 'plate-keyboard-row',\r\n keys: [\r\n ...PROVINCES.slice(30, 33).map(createProvinceKey),\r\n {\r\n id: 'plate-xue',\r\n type: 'char',\r\n label: '学',\r\n value: '学',\r\n className: 'key-plate-special',\r\n data: { switchAfterInput: 'license-plate-alphanumeric' },\r\n },\r\n {\r\n id: 'plate-jing',\r\n type: 'char',\r\n label: '警',\r\n value: '警',\r\n className: 'key-plate-special',\r\n data: { switchAfterInput: 'license-plate-alphanumeric' },\r\n },\r\n {\r\n id: 'backspace',\r\n type: 'backspace',\r\n icon: ICON_DELETE,\r\n label: '',\r\n width: 1.5,\r\n className: 'key-plate-fn',\r\n },\r\n {\r\n id: 'done',\r\n type: 'done',\r\n label: '确定',\r\n width: 2.5,\r\n className: 'key-plate-done',\r\n },\r\n ],\r\n },\r\n ],\r\n data: {\r\n maxLength: 8,\r\n inputType: 'license-plate',\r\n },\r\n}\r\n\r\n/**\r\n * 字母数字键盘配置(车牌第2-8位)\r\n * 10列布局\r\n */\r\nexport const licensePlateAlphanumericLayout: KeyboardConfig = {\r\n type: 'license-plate-alphanumeric',\r\n name: '字母数字',\r\n supportShift: false,\r\n rows: [\r\n {\r\n className: 'plate-keyboard-row',\r\n keys: '1234567890'.split('').map(createNumberKey),\r\n },\r\n {\r\n className: 'plate-keyboard-row',\r\n keys: PLATE_LETTERS.slice(0, 10).map(createLetterKey),\r\n },\r\n {\r\n className: 'plate-keyboard-row',\r\n keys: [\r\n ...PLATE_LETTERS.slice(10, 19).map(createLetterKey),\r\n {\r\n id: 'backspace',\r\n type: 'backspace',\r\n icon: ICON_DELETE,\r\n label: '',\r\n className: 'key-plate-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'plate-keyboard-row',\r\n keys: [\r\n {\r\n id: 'switch-province',\r\n type: 'tab',\r\n label: '省份',\r\n width: 1.5,\r\n className: 'key-plate-switch',\r\n data: { targetType: 'license-plate-province' },\r\n },\r\n ...PLATE_LETTERS.slice(19, 24).map(createLetterKey),\r\n {\r\n id: 'plate-xue',\r\n type: 'char',\r\n label: '学',\r\n value: '学',\r\n className: 'key-plate-special',\r\n },\r\n {\r\n id: 'plate-jing',\r\n type: 'char',\r\n label: '警',\r\n value: '警',\r\n className: 'key-plate-special',\r\n },\r\n {\r\n id: 'done',\r\n type: 'done',\r\n label: '确定',\r\n width: 1.5,\r\n className: 'key-plate-done',\r\n },\r\n ],\r\n },\r\n ],\r\n data: {\r\n maxLength: 8,\r\n inputType: 'license-plate',\r\n },\r\n}\r\n\r\n/**\r\n * 纯字母键盘配置(车牌第2位,只能输入字母)\r\n * 6列布局,排除 I 和 O\r\n */\r\nexport const licensePlateLetterLayout: KeyboardConfig = {\r\n type: 'license-plate-letter',\r\n name: '字母',\r\n supportShift: false,\r\n rows: [\r\n {\r\n className: 'plate-keyboard-row',\r\n keys: PLATE_LETTERS.slice(0, 8).map(createLetterKey),\r\n },\r\n {\r\n className: 'plate-keyboard-row',\r\n keys: PLATE_LETTERS.slice(8, 16).map(createLetterKey),\r\n },\r\n {\r\n className: 'plate-keyboard-row',\r\n keys: [...PLATE_LETTERS.slice(16, 24).map(createLetterKey)],\r\n },\r\n {\r\n className: 'plate-keyboard-row',\r\n keys: [\r\n {\r\n id: 'switch-province',\r\n type: 'tab',\r\n label: '省份',\r\n width: 2,\r\n className: 'key-plate-switch',\r\n data: { targetType: 'license-plate-province' },\r\n },\r\n {\r\n id: 'backspace',\r\n type: 'backspace',\r\n icon: ICON_DELETE,\r\n label: '',\r\n width: 2,\r\n className: 'key-plate-fn',\r\n },\r\n {\r\n id: 'done',\r\n type: 'done',\r\n label: '确定',\r\n width: 2,\r\n className: 'key-plate-done',\r\n },\r\n ],\r\n },\r\n ],\r\n data: {\r\n maxLength: 8,\r\n inputType: 'license-plate',\r\n },\r\n}\r\n\r\n/**\r\n * 完整车牌号键盘(自动切换模式)\r\n * 默认显示省份键盘,点击省份后自动切换到字母数字键盘\r\n */\r\nexport const licensePlateLayout: KeyboardConfig = {\r\n type: 'license-plate',\r\n name: '车牌号键盘',\r\n supportShift: false,\r\n data: {\r\n autoSwitch: true,\r\n maxLength: 8,\r\n inputType: 'license-plate',\r\n },\r\n rows: licensePlateProvinceLayout.rows,\r\n}\r\n","/**\r\n * 数字键盘布局\r\n * @module layouts/number\r\n */\r\n\r\nimport type { KeyboardConfig, KeyDefinition } from '../types'\r\nimport { ICON_CLEAR, ICON_DELETE } from '../icons'\r\n\r\n/**\r\n * 创建数字按键\r\n */\r\nfunction createNumberKey(num: string): KeyDefinition {\r\n return {\r\n id: `num-${num}`,\r\n type: 'char',\r\n label: num,\r\n value: num,\r\n className: 'key-num',\r\n }\r\n}\r\n\r\n/**\r\n * 数字键盘配置 - 紧凑4x4布局\r\n */\r\nexport const numberLayout: KeyboardConfig = {\r\n type: 'number',\r\n name: '数字键盘',\r\n supportShift: false,\r\n switchable: ['qwerty', 'symbol'],\r\n rows: [\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('1'),\r\n createNumberKey('2'),\r\n createNumberKey('3'),\r\n {\r\n id: 'backspace',\r\n type: 'backspace',\r\n icon: ICON_DELETE,\r\n label: '',\r\n className: 'key-numpad-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('4'),\r\n createNumberKey('5'),\r\n createNumberKey('6'),\r\n {\r\n id: 'clear',\r\n type: 'clear',\r\n icon: ICON_CLEAR,\r\n label: '',\r\n className: 'key-numpad-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('7'),\r\n createNumberKey('8'),\r\n createNumberKey('9'),\r\n {\r\n id: 'close',\r\n type: 'close',\r\n label: '关闭',\r\n className: 'key-numpad-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n {\r\n id: 'decimal',\r\n type: 'char',\r\n label: '.',\r\n value: '.',\r\n className: 'key-num',\r\n },\r\n createNumberKey('0'),\r\n {\r\n id: 'done',\r\n type: 'done',\r\n label: '确定',\r\n width: 2,\r\n className: 'key-numpad-done',\r\n },\r\n ],\r\n },\r\n ],\r\n}\r\n\r\n/**\r\n * 纯整数键盘 - 紧凑4x4布局\r\n */\r\nexport const integerLayout: KeyboardConfig = {\r\n type: 'integer',\r\n name: '整数键盘',\r\n supportShift: false,\r\n switchable: ['qwerty'],\r\n rows: [\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('1'),\r\n createNumberKey('2'),\r\n createNumberKey('3'),\r\n {\r\n id: 'backspace',\r\n type: 'backspace',\r\n icon: ICON_DELETE,\r\n label: '',\r\n className: 'key-numpad-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('4'),\r\n createNumberKey('5'),\r\n createNumberKey('6'),\r\n {\r\n id: 'clear',\r\n type: 'clear',\r\n icon: ICON_CLEAR,\r\n label: '',\r\n className: 'key-numpad-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('7'),\r\n createNumberKey('8'),\r\n createNumberKey('9'),\r\n {\r\n id: 'close',\r\n type: 'close',\r\n label: '关闭',\r\n className: 'key-numpad-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n {\r\n id: 'switch-qwerty',\r\n type: 'tab',\r\n label: 'ABC',\r\n className: 'key-numpad-fn',\r\n data: { targetType: 'qwerty' },\r\n },\r\n createNumberKey('0'),\r\n {\r\n id: 'done',\r\n type: 'done',\r\n label: '确定',\r\n width: 2,\r\n className: 'key-numpad-done',\r\n },\r\n ],\r\n },\r\n ],\r\n}\r\n","/**\r\n * 手机号键盘布局\r\n * @module layouts/phone\r\n */\r\n\r\nimport type { KeyboardConfig, KeyDefinition } from '../types'\r\nimport { ICON_CLEAR, ICON_DELETE } from '../icons'\r\n\r\n/**\r\n * 创建数字按键\r\n */\r\nfunction createNumberKey(num: string): KeyDefinition {\r\n return {\r\n id: `phone-${num}`,\r\n type: 'char',\r\n label: num,\r\n value: num,\r\n className: 'key-num',\r\n }\r\n}\r\n\r\n/**\r\n * 手机号键盘配置\r\n * 紧凑4x4布局\r\n */\r\nexport const phoneLayout: KeyboardConfig = {\r\n type: 'phone',\r\n name: '手机号键盘',\r\n supportShift: false,\r\n rows: [\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('1'),\r\n createNumberKey('2'),\r\n createNumberKey('3'),\r\n {\r\n id: 'backspace',\r\n type: 'backspace',\r\n icon: ICON_DELETE,\r\n label: '',\r\n className: 'key-numpad-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('4'),\r\n createNumberKey('5'),\r\n createNumberKey('6'),\r\n {\r\n id: 'clear',\r\n type: 'clear',\r\n icon: ICON_CLEAR,\r\n label: '',\r\n className: 'key-numpad-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('7'),\r\n createNumberKey('8'),\r\n createNumberKey('9'),\r\n {\r\n id: 'close',\r\n type: 'close',\r\n label: '关闭',\r\n className: 'key-numpad-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n {\r\n id: 'phone-plus',\r\n type: 'char',\r\n label: '+',\r\n value: '+',\r\n className: 'key-num',\r\n },\r\n createNumberKey('0'),\r\n {\r\n id: 'done',\r\n type: 'done',\r\n label: '确定',\r\n width: 2,\r\n className: 'key-numpad-done',\r\n },\r\n ],\r\n },\r\n ],\r\n data: {\r\n maxLength: 11,\r\n inputType: 'phone',\r\n },\r\n}\r\n\r\n/**\r\n * 简洁版拨号键盘(带 * #)\r\n */\r\nexport const phoneSimpleLayout: KeyboardConfig = {\r\n type: 'phone-simple',\r\n name: '拨号键盘',\r\n supportShift: false,\r\n rows: [\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('1'),\r\n createNumberKey('2'),\r\n createNumberKey('3'),\r\n {\r\n id: 'backspace',\r\n type: 'backspace',\r\n icon: ICON_DELETE,\r\n label: '',\r\n className: 'key-numpad-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('4'),\r\n createNumberKey('5'),\r\n createNumberKey('6'),\r\n {\r\n id: 'clear',\r\n type: 'clear',\r\n icon: ICON_CLEAR,\r\n label: '',\r\n className: 'key-numpad-fn',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n createNumberKey('7'),\r\n createNumberKey('8'),\r\n createNumberKey('9'),\r\n {\r\n id: 'phone-hash',\r\n type: 'char',\r\n label: '#',\r\n value: '#',\r\n className: 'key-num',\r\n },\r\n ],\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: [\r\n {\r\n id: 'phone-star',\r\n type: 'char',\r\n label: '*',\r\n value: '*',\r\n className: 'key-num',\r\n },\r\n createNumberKey('0'),\r\n {\r\n id: 'done',\r\n type: 'done',\r\n label: '拨打',\r\n width: 2,\r\n className: 'key-numpad-done',\r\n },\r\n ],\r\n },\r\n ],\r\n data: {\r\n maxLength: 13,\r\n inputType: 'phone',\r\n },\r\n}\r\n","/**\r\n * 标点符号键盘布局 (中文)\r\n * @module layouts/punct\r\n */\r\n\r\n// 导入键盘配置和按键定义的类型\r\nimport type { KeyboardConfig, KeyDefinition } from '../types'\r\n// 导入删除和确认图标资源\r\nimport { ICON_CHECK, ICON_DELETE } from '../icons'\r\n\r\n/**\r\n * 创建标点符号按键的快捷函数\r\n * @param label - 按键显示文本(同时也是默认输出值)\r\n * @param value - 可选,按键输出值,不传则与label相同\r\n * @returns 返回一个标点按键定义对象\r\n */\r\nfunction p(label: string, value?: string): KeyDefinition {\r\n return {\r\n id: `punct-${label}`,\r\n type: 'char',\r\n label,\r\n value: value ?? label,\r\n className: 'key-num',\r\n }\r\n}\r\n\r\n// 导出中文标点键盘布局配置\r\nexport const punctLayout: KeyboardConfig = {\r\n type: 'punct', // 布局类型标识为 punct\r\n name: '中文标点', // 布局显示名称\r\n supportShift: false, // 不支持Shift切换(标点键盘无需大小写)\r\n switchable: ['qwerty', 'punct-en'], // 可切换到QWERTY键盘和英文标点键盘\r\n rows: [\r\n // 第一行:常用中文标点符号\r\n {\r\n className: 'virtual-keyboard__row', // 行的CSS类名\r\n keys: [',', '。', '?', '!', ':', ';', '\"', '\"'].map(s => p(s)), // 逗号、句号、问号、感叹号、冒号、分号、左右双引号\r\n },\r\n // 第二行:括号类标点符号\r\n {\r\n className: 'virtual-keyboard__row', // 行的CSS类名\r\n keys: ['(', ')', '【', '】', '《', '》', '……', '——'].map(s => p(s)), // 小括号、中括号、书名号、省略号、破折号\r\n },\r\n // 第三行:其他标点 + 退格键\r\n {\r\n className: 'virtual-keyboard__row', // 行的CSS类名\r\n keys: [\r\n p('·'), // 间隔号(中间点)\r\n p('、'), // 顿号\r\n p('「'), // 左单书名号\r\n p('」'), // 右单书名号\r\n p('『'), // 左双书名号\r\n p('』'), // 右双书名号\r\n p('~'), // 波浪号\r\n {\r\n id: 'backspace',\r\n type: 'backspace',\r\n icon: ICON_DELETE,\r\n label: '',\r\n className: 'key-numpad-fn',\r\n }, // 退格键\r\n ],\r\n },\r\n // 底部行:切换键盘 + 空格 + 确认\r\n {\r\n className: 'virtual-keyboard__row', // 行的CSS类名\r\n keys: [\r\n {\r\n id: 'switch-punct-en',\r\n type: 'tab',\r\n label: '英',\r\n data: { targetType: 'punct-en' },\r\n className: 'key-numpad-fn',\r\n }, // 切换到英文标点键盘\r\n {\r\n id: 'switch-qwerty',\r\n type: 'tab',\r\n label: 'ABC',\r\n data: { targetType: 'qwerty' },\r\n className: 'key-numpad-fn',\r\n }, // 切换到QWERTY字母键盘\r\n {\r\n id: 'space',\r\n type: 'space',\r\n label: '空格',\r\n value: ' ',\r\n width: 4,\r\n className: 'key-num',\r\n }, // 空格键,宽度4倍\r\n {\r\n id: 'done',\r\n type: 'done',\r\n icon: ICON_CHECK,\r\n label: '',\r\n width: 2,\r\n className: 'key-numpad-done',\r\n }, // 确认/完成按钮,宽度2倍\r\n ],\r\n },\r\n ],\r\n}\r\n","/**\r\n * QWERTY 标准字母键盘布局\r\n * @module layouts/qwerty\r\n */\r\n\r\nimport type { KeyboardConfig, KeyDefinition } from '../types'\r\n\r\n/**\r\n * 创建字符按键\r\n */\r\nfunction createCharKey(char: string): KeyDefinition {\r\n return {\r\n id: `char-${char.toLowerCase()}`,\r\n type: 'char',\r\n label: { lower: char.toLowerCase(), upper: char.toUpperCase() },\r\n value: { lower: char.toLowerCase(), upper: char.toUpperCase() },\r\n }\r\n}\r\n\r\n/**\r\n * QWERTY 键盘配置\r\n */\r\nexport const qwertyLayout: KeyboardConfig = {\r\n type: 'qwerty',\r\n name: '字母键盘',\r\n supportShift: true,\r\n defaultUpperCase: false,\r\n switchable: ['number', 'symbol'],\r\n rows: [\r\n {\r\n keys: [\r\n createCharKey('Q'),\r\n createCharKey('W'),\r\n createCharKey('E'),\r\n createCharKey('R'),\r\n createCharKey('T'),\r\n createCharKey('Y'),\r\n createCharKey('U'),\r\n createCharKey('I'),\r\n createCharKey('O'),\r\n createCharKey('P'),\r\n ],\r\n },\r\n {\r\n keys: [\r\n createCharKey('A'),\r\n createCharKey('S'),\r\n createCharKey('D'),\r\n createCharKey('F'),\r\n createCharKey('G'),\r\n createCharKey('H'),\r\n createCharKey('J'),\r\n createCharKey('K'),\r\n createCharKey('L'),\r\n ],\r\n },\r\n {\r\n keys: [\r\n {\r\n id: 'shift',\r\n type: 'shift',\r\n label: '⇧',\r\n width: 1.5,\r\n className: 'key-shift',\r\n },\r\n createCharKey('Z'),\r\n createCharKey('X'),\r\n createCharKey('C'),\r\n createCharKey('V'),\r\n createCharKey('B'),\r\n createCharKey('N'),\r\n createCharKey('M'),\r\n {\r\n id: 'backspace',\r\n type: 'backspace',\r\n label: '⌫',\r\n width: 1.5,\r\n className: 'key-backspace',\r\n },\r\n ],\r\n },\r\n {\r\n keys: [\r\n {\r\n id: 'switch-number',\r\n type: 'tab',\r\n label: '123',\r\n width: 1.5,\r\n className: 'key-switch',\r\n data: { targetType: 'number' },\r\n },\r\n {\r\n id: 'switch-symbol',\r\n type: 'tab',\r\n label: '#+=',\r\n width: 1.25,\r\n className: 'key-switch',\r\n data: { targetType: 'symbol' },\r\n },\r\n {\r\n id: 'space',\r\n type: 'space',\r\n label: '空格',\r\n value: ' ',\r\n width: 4,\r\n className: 'key-space',\r\n },\r\n {\r\n id: 'done',\r\n type: 'done',\r\n label: '完成',\r\n width: 2,\r\n className: 'key-done',\r\n },\r\n ],\r\n },\r\n ],\r\n}\r\n","/**\r\n * 搜索键盘布局\r\n * @module layouts/search\r\n */\r\n\r\n// 导入键盘配置和按键定义的类型\r\nimport type { KeyboardConfig, KeyDefinition } from '../types'\r\n// 导入删除、Shift和语音图标资源\r\nimport { ICON_DELETE, ICON_SHIFT, ICON_VOICE } from '../icons'\r\n\r\n/**\r\n * 创建字符按键(支持大小写)\r\n * @param char - 字符,用于生成大小写标签和值\r\n * @returns 返回一个按键定义对象\r\n */\r\nfunction createCharKey(char: string): KeyDefinition {\r\n return {\r\n id: `search-char-${char.toLowerCase()}`, // 按键唯一标识,格式为 search-char-x\r\n type: 'char', // 按键类型为字符键\r\n label: { lower: char.toLowerCase(), upper: char.toUpperCase() }, // 显示标签:小写/大写\r\n value: { lower: char.toLowerCase(), upper: char.toUpperCase() }, // 输出值:小写/大写\r\n }\r\n}\r\n\r\n// 导出搜索键盘布局配置\r\nexport const searchLayout: KeyboardConfig = {\r\n type: 'search', // 布局类型标识为 search\r\n name: '搜索键盘', // 布局显示名称\r\n supportShift: true, // 支持Shift切换大小写\r\n defaultUpperCase: false, // 默认为小写状态\r\n switchable: ['symbol', 'number'], // 可切换到符号键盘和数字键盘\r\n rows: [\r\n // QWERTY 第一行:q w e r t y u i o p\r\n {\r\n keys: 'qwertyuiop'.split('').map(createCharKey), // 将字符串拆分为字符数组,逐个创建按键\r\n },\r\n // QWERTY 第二行:a s d f g h j k l\r\n {\r\n keys: 'asdfghjkl'.split('').map(createCharKey), // 将字符串拆分为字符数组,逐个创建按键\r\n },\r\n // QWERTY 第三行 + Shift + 退格\r\n {\r\n keys: [\r\n {\r\n id: 'shift', // Shift键标识\r\n type: 'shift', // 按键类型为Shift\r\n icon: ICON_SHIFT, // 使用Shift图标\r\n label: '', // 无文字标签,仅显示图标\r\n width: 1.5, // 宽度为1.5倍\r\n className: 'key-shift', // CSS类名\r\n },\r\n ...'zxcvbnm'.split('').map(createCharKey), // 展开第三行字母 z x c v b n m 的按键定义\r\n {\r\n id: 'backspace', // 退格键标识\r\n type: 'backspace', // 按键类型为退格\r\n icon: ICON_DELETE, // 使用删除图标\r\n label: '', // 无文字标签,仅显示图标\r\n width: 1.5, // 宽度为1.5倍\r\n className: 'key-backspace', // CSS类名\r\n },\r\n ],\r\n },\r\n // 底部行:切换 + 空格 + 语音 + 搜索\r\n {\r\n keys: [\r\n {\r\n id: 'switch-number',\r\n type: 'tab',\r\n label: '123',\r\n width: 1.25,\r\n className: 'key-switch',\r\n data: { targetType: 'number' },\r\n }, // 切换到数字键盘,宽度1.25倍\r\n {\r\n id: 'switch-symbol',\r\n type: 'tab',\r\n label: '#+=',\r\n width: 1.25,\r\n className: 'key-switch',\r\n data: { targetType: 'symbol' },\r\n }, // 切换到符号键盘,宽度1.25倍\r\n {\r\n id: 'space',\r\n type: 'space',\r\n label: '',\r\n value: ' ',\r\n width: 4,\r\n className: 'key-space',\r\n }, // 空格键,宽度4倍\r\n {\r\n id: 'voice',\r\n type: 'custom',\r\n icon: ICON_VOICE,\r\n label: '',\r\n width: 1,\r\n className: 'key-voice',\r\n data: { action: 'voice' },\r\n }, // 语音输入按钮,宽度1倍\r\n {\r\n id: 'search-done',\r\n type: 'done',\r\n label: '搜索',\r\n width: 2,\r\n className: 'key-done',\r\n }, // 搜索/完成按钮,宽度2倍\r\n ],\r\n },\r\n ],\r\n}\r\n","/**\r\n * 符号键盘布局\r\n * @module layouts/symbol\r\n */\r\n\r\nimport type { KeyboardConfig, KeyDefinition } from '../types'\r\n\r\n/**\r\n * 创建符号按键\r\n */\r\nfunction createSymbolKey(symbol: string, id?: string): KeyDefinition {\r\n return {\r\n id: id || `symbol-${symbol.charCodeAt(0)}`,\r\n type: 'char',\r\n label: symbol,\r\n value: symbol,\r\n }\r\n}\r\n\r\n/**\r\n * 符号键盘配置\r\n */\r\nexport const symbolLayout: KeyboardConfig = {\r\n type: 'symbol',\r\n name: '符号键盘',\r\n supportShift: false,\r\n switchable: ['qwerty', 'number'],\r\n rows: [\r\n {\r\n keys: [\r\n createSymbolKey('1'),\r\n createSymbolKey('2'),\r\n createSymbolKey('3'),\r\n createSymbolKey('4'),\r\n createSymbolKey('5'),\r\n createSymbolKey('6'),\r\n createSymbolKey('7'),\r\n createSymbolKey('8'),\r\n createSymbolKey('9'),\r\n createSymbolKey('0'),\r\n ],\r\n },\r\n {\r\n keys: [\r\n createSymbolKey('-'),\r\n createSymbolKey('/'),\r\n createSymbolKey(':'),\r\n createSymbolKey(';'),\r\n createSymbolKey('('),\r\n createSymbolKey(')'),\r\n createSymbolKey('¥', 'yen'),\r\n createSymbolKey('@'),\r\n createSymbolKey('\"', 'quote'),\r\n ],\r\n },\r\n {\r\n keys: [\r\n {\r\n id: 'switch-symbol-2',\r\n type: 'tab',\r\n label: '#+= ',\r\n width: 1.5,\r\n className: 'key-switch',\r\n data: { targetType: 'symbol-2' },\r\n },\r\n createSymbolKey('.'),\r\n createSymbolKey(','),\r\n createSymbolKey('?'),\r\n createSymbolKey('!'),\r\n createSymbolKey(\"'\", 'apostrophe'),\r\n {\r\n id: 'backspace',\r\n type: 'backspace',\r\n label: '⌫',\r\n width: 1.5,\r\n className: 'key-backspace',\r\n },\r\n ],\r\n },\r\n {\r\n keys: [\r\n {\r\n id: 'switch-qwerty',\r\n type: 'tab',\r\n label: 'ABC',\r\n width: 1.5,\r\n className: 'key-switch',\r\n data: { targetType: 'qwerty' },\r\n },\r\n {\r\n id: 'switch-number',\r\n type: 'tab',\r\n label: '123',\r\n width: 1.25,\r\n className: 'key-switch',\r\n data: { targetType: 'number' },\r\n },\r\n {\r\n id: 'space',\r\n type: 'space',\r\n label: '空格',\r\n value: ' ',\r\n width: 4,\r\n className: 'key-space',\r\n },\r\n {\r\n id: 'done',\r\n type: 'done',\r\n label: '完成',\r\n width: 2,\r\n className: 'key-done',\r\n },\r\n ],\r\n },\r\n ],\r\n}\r\n\r\n/**\r\n * 符号键盘第二页\r\n */\r\nexport const symbolLayout2: KeyboardConfig = {\r\n type: 'symbol',\r\n name: '符号键盘2',\r\n supportShift: false,\r\n switchable: ['qwerty', 'number'],\r\n rows: [\r\n {\r\n keys: [\r\n createSymbolKey('['),\r\n createSymbolKey(']'),\r\n createSymbolKey('{'),\r\n createSymbolKey('}'),\r\n createSymbolKey('#'),\r\n createSymbolKey('%'),\r\n createSymbolKey('^'),\r\n createSymbolKey('*'),\r\n createSymbolKey('+'),\r\n createSymbolKey('='),\r\n ],\r\n },\r\n {\r\n keys: [\r\n createSymbolKey('_'),\r\n createSymbolKey('\\\\'),\r\n createSymbolKey('|'),\r\n createSymbolKey('~'),\r\n createSymbolKey('<'),\r\n createSymbolKey('>'),\r\n createSymbolKey('€', 'euro'),\r\n createSymbolKey('$'),\r\n createSymbolKey('&'),\r\n ],\r\n },\r\n {\r\n keys: [\r\n {\r\n id: 'switch-symbol-1',\r\n type: 'tab',\r\n label: '123',\r\n width: 1.5,\r\n className: 'key-switch',\r\n data: { targetType: 'symbol' },\r\n },\r\n createSymbolKey('`', 'backtick'),\r\n createSymbolKey('·', 'middle-dot'),\r\n createSymbolKey('…', 'ellipsis'),\r\n createSymbolKey('°', 'degree'),\r\n createSymbolKey('•', 'bullet'),\r\n {\r\n id: 'backspace',\r\n type: 'backspace',\r\n label: '⌫',\r\n width: 1.5,\r\n className: 'key-backspace',\r\n },\r\n ],\r\n },\r\n {\r\n keys: [\r\n {\r\n id: 'switch-qwerty',\r\n type: 'tab',\r\n label: 'ABC',\r\n width: 1.5,\r\n className: 'key-switch',\r\n data: { targetType: 'qwerty' },\r\n },\r\n {\r\n id: 'switch-number',\r\n type: 'tab',\r\n label: '123',\r\n width: 1.25,\r\n className: 'key-switch',\r\n data: { targetType: 'number' },\r\n },\r\n {\r\n id: 'space',\r\n type: 'space',\r\n label: '空格',\r\n value: ' ',\r\n width: 4,\r\n className: 'key-space',\r\n },\r\n {\r\n id: 'done',\r\n type: 'done',\r\n label: '完成',\r\n width: 2,\r\n className: 'key-done',\r\n },\r\n ],\r\n },\r\n ],\r\n}\r\n","/**\r\n * URL/链接键盘布局\r\n * @module layouts/url\r\n */\r\n\r\n// 导入键盘配置和按键定义的类型\r\nimport type { KeyboardConfig, KeyDefinition } from '../types'\r\n// 导入删除和Shift图标资源\r\nimport { ICON_DELETE, ICON_SHIFT } from '../icons'\r\n\r\n/**\r\n * 创建字符按键(支持大小写)\r\n * @param char - 字符,用于生成大小写标签和值\r\n * @returns 返回一个按键定义对象\r\n */\r\nfunction createCharKey(char: string): KeyDefinition {\r\n return {\r\n id: `url-char-${char.toLowerCase()}`, // 按键唯一标识,格式为 url-char-x\r\n type: 'char', // 按键类型为字符键\r\n label: { lower: char.toLowerCase(), upper: char.toUpperCase() }, // 显示标签:小写/大写\r\n value: { lower: char.toLowerCase(), upper: char.toUpperCase() }, // 输出值:小写/大写\r\n }\r\n}\r\n\r\n/**\r\n * 创建快捷片段按键\r\n * 用于URL键盘中常用的符号和域名后缀\r\n * @param label - 按键显示文本\r\n * @param width - 可选,按键宽度倍数\r\n * @returns 返回一个片段按键定义对象\r\n */\r\nfunction snippet(label: string, width?: number): KeyDefinition {\r\n // 生成唯一 ID:用 label 的字符编码(去除非法字符后拼接)\r\n const idSuffix =\r\n label.replace(/[^a-z0-9]/gi, '') ||\r\n label\r\n .split('')\r\n .map(c => c.charCodeAt(0))\r\n .join('')\r\n return {\r\n id: `url-snippet-${idSuffix}`, // 按键唯一标识,格式为 url-snippet-xxx\r\n type: 'char', // 按键类型为字符键\r\n label, // 显示文本\r\n value: label, // 输出值与显示文本相同\r\n width, // 按键宽度倍数\r\n className: 'key-snippet', // 自定义CSS类名,用于样式控制\r\n }\r\n}\r\n\r\n// 导出URL键盘布局配置\r\nexport const urlLayout: KeyboardConfig = {\r\n type: 'url', // 布局类型标识为 url\r\n name: '网址键盘', // 布局显示名称\r\n supportShift: true, // 支持Shift切换大小写\r\n defaultUpperCase: false, // 默认为小写状态\r\n switchable: ['symbol', 'number'], // 可切换到符号键盘和数字键盘\r\n rows: [\r\n // QWERTY 第一行:q w e r t y u i o p\r\n {\r\n keys: 'qwertyuiop'.split('').map(createCharKey), // 将字符串拆分为字符数组,逐个创建按键\r\n },\r\n // QWERTY 第二行:a s d f g h j k l\r\n {\r\n keys: 'asdfghjkl'.split('').map(createCharKey), // 将字符串拆分为字符数组,逐个创建按键\r\n },\r\n // QWERTY 第三行 + Shift + 退格\r\n {\r\n keys: [\r\n {\r\n id: 'shift', // Shift键标识\r\n type: 'shift', // 按键类型为Shift\r\n icon: ICON_SHIFT, // 使用Shift图标\r\n label: '', // 无文字标签,仅显示图标\r\n width: 1.5, // 宽度为1.5倍\r\n className: 'key-shift', // CSS类名\r\n },\r\n ...'zxcvbnm'.split('').map(createCharKey), // 展开第三行字母 z x c v b n m 的按键定义\r\n {\r\n id: 'backspace', // 退格键标识\r\n type: 'backspace', // 按键类型为退格\r\n icon: ICON_DELETE, // 使用删除图标\r\n label: '', // 无文字标签,仅显示图标\r\n width: 1.5, // 宽度为1.5倍\r\n className: 'key-backspace', // CSS类名\r\n },\r\n ],\r\n },\r\n // 底部行:切换 + 符号 + 域名后缀 + 前往\r\n {\r\n keys: [\r\n {\r\n id: 'switch-number',\r\n type: 'tab',\r\n label: '123',\r\n width: 1.2,\r\n className: 'key-switch',\r\n data: { targetType: 'number' },\r\n }, // 切换到数字键盘\r\n snippet('/', 0.8), // 斜杠快捷键,宽度0.8倍\r\n snippet('.', 0.8), // 点号快捷键,宽度0.8倍\r\n snippet('-', 0.8), // 横杠快捷键,宽度0.8倍\r\n snippet('.com', 1.5), // .com域名后缀快捷键,宽度1.5倍\r\n snippet('.cn', 1.2), // .cn域名后缀快捷键,宽度1.2倍\r\n {\r\n id: 'space',\r\n type: 'space',\r\n label: '',\r\n value: ' ',\r\n width: 1.5,\r\n className: 'key-space',\r\n }, // 空格键,宽度1.5倍\r\n {\r\n id: 'url-go',\r\n type: 'done',\r\n label: '前往',\r\n width: 1.5,\r\n className: 'key-done',\r\n }, // 前往/完成按钮,宽度1.5倍\r\n ],\r\n },\r\n ],\r\n}\r\n","/**\r\n * 验证码键盘布局\r\n * @module layouts/verifycode\r\n */\r\n\r\n// 从类型定义文件中导入 KeyboardConfig(键盘配置)和 KeyDefinition(按键定义)类型\r\nimport type { KeyboardConfig, KeyDefinition } from '../types'\r\n// 从图标模块中导入删除键图标和清除键图标\r\nimport { ICON_CLEAR, ICON_DELETE } from '../icons'\r\n\r\n/**\r\n * 创建数字按键\r\n * @param num - 数字字符串(如 '0'-'9')\r\n * @returns 返回一个按键定义对象\r\n */\r\nfunction createNumberKey(num: string): KeyDefinition {\r\n return {\r\n id: `verify-${num}`, // 按键唯一标识符,格式为 verify-数字\r\n type: 'char', // 按键类型为字符键\r\n label: num, // 按键上显示的文本\r\n value: num, // 按键按下后输出的值\r\n className: 'key-num', // 按键的 CSS 类名,用于样式定制\r\n }\r\n}\r\n\r\n/**\r\n * 验证码键盘配置 - 4x4布局(与其他数字键盘一致)\r\n * 布局结构:\r\n * 第1行: 1 2 3 [退格]\r\n * 第2行: 4 5 6 [清除]\r\n * 第3行: 7 8 9 [关闭]\r\n * 第4行: [空] 0 [确定(占2格)]\r\n */\r\nexport const verifycodeLayout: KeyboardConfig = {\r\n type: 'verifycode', // 键盘类型标识\r\n name: '验证码键盘', // 键盘的显示名称\r\n supportShift: false, // 不支持 Shift 切换(纯数字键盘无需切换)\r\n rows: [\r\n // 键盘的行数组\r\n // ---- 第1行 ----\r\n {\r\n className: 'numpad-row', // 行的 CSS 类名\r\n keys: [\r\n // 该行包含的按键数组\r\n createNumberKey('1'), // 数字键 1\r\n createNumberKey('2'), // 数字键 2\r\n createNumberKey('3'), // 数字键 3\r\n {\r\n id: 'backspace', // 退格键的唯一标识\r\n type: 'backspace', // 按键类型为退格,删除最后一个字符\r\n icon: ICON_DELETE, // 使用删除图标作为显示内容\r\n label: '', // 无文本标签(由图标替代)\r\n className: 'key-numpad-fn', // 功能键的 CSS 类名\r\n },\r\n ],\r\n },\r\n // ---- 第2行 ----\r\n {\r\n className: 'numpad-row', // 行的 CSS 类名\r\n keys: [\r\n createNumberKey('4'), // 数字键 4\r\n createNumberKey('5'), // 数字键 5\r\n createNumberKey('6'), // 数字键 6\r\n {\r\n id: 'clear', // 清除键的唯一标识\r\n type: 'clear', // 按键类型为清除,清空所有输入\r\n icon: ICON_CLEAR, // 使用清除图标作为显示内容\r\n label: '', // 无文本标签\r\n className: 'key-numpad-fn', // 功能键的 CSS 类名\r\n },\r\n ],\r\n },\r\n // ---- 第3行 ----\r\n {\r\n className: 'numpad-row', // 行的 CSS 类名\r\n keys: [\r\n createNumberKey('7'), // 数字键 7\r\n createNumberKey('8'), // 数字键 8\r\n createNumberKey('9'), // 数字键 9\r\n {\r\n id: 'close', // 关闭键的唯一标识\r\n type: 'close', // 按键类型为关闭,收起键盘\r\n label: '关闭', // 按钮上显示的文本\r\n className: 'key-numpad-fn', // 功能键的 CSS 类名\r\n },\r\n ],\r\n },\r\n // ---- 第4行 ----\r\n {\r\n className: 'numpad-row', // 行的 CSS 类名\r\n keys: [\r\n {\r\n id: 'empty', // 占位空键的唯一标识\r\n type: 'char', // 类型为字符键(但被禁用)\r\n label: '', // 无显示文本\r\n value: '', // 无输出值\r\n disabled: true, // 禁用状态,不可点击\r\n className: 'key-numpad-empty', // 空占位键的 CSS 类名\r\n },\r\n createNumberKey('0'), // 数字键 0\r\n {\r\n id: 'done', // 确定键的唯一标识\r\n type: 'done', // 按键类型为确定,完成输入\r\n label: '确定', // 按钮上显示的文本\r\n width: 2, // 占据 2 个键的宽度\r\n className: 'key-numpad-done', // 确定键的 CSS 类名\r\n },\r\n ],\r\n },\r\n ],\r\n data: {\r\n // 键盘的附加数据\r\n maxLength: 6, // 验证码最大输入长度为 6 位\r\n inputType: 'verifycode', // 输入类型标识,用于外部判断\r\n },\r\n}\r\n","/**\r\n * 键盘布局管理\r\n * @module layouts\r\n */\r\n\r\nimport type { KeyboardConfig, KeyboardType } from '../types'\r\nimport { amountLayout, amountSimpleLayout } from './amount'\r\nimport { bankcardLayout } from './bankcard'\r\nimport { EMAIL_SUFFIXES, emailLayout } from './email'\r\nimport { idcardLayout } from './idcard'\r\nimport {\r\n licensePlateAlphanumericLayout,\r\n licensePlateLayout,\r\n licensePlateLetterLayout,\r\n licensePlateProvinceLayout,\r\n PLATE_LETTERS,\r\n PROVINCES,\r\n} from './license-plate'\r\nimport { integerLayout, numberLayout } from './number'\r\nimport { phoneLayout, phoneSimpleLayout } from './phone'\r\nimport { punctLayout } from './punct'\r\nimport { qwertyLayout } from './qwerty'\r\nimport { searchLayout } from './search'\r\nimport { symbolLayout, symbolLayout2 } from './symbol'\r\nimport { urlLayout } from './url'\r\nimport { verifycodeLayout } from './verifycode'\r\n\r\n// 导出所有布局\r\nexport {\r\n amountLayout,\r\n amountSimpleLayout,\r\n bankcardLayout,\r\n EMAIL_SUFFIXES,\r\n // 输入场景键盘\r\n emailLayout,\r\n // 场景化键盘\r\n idcardLayout,\r\n integerLayout,\r\n licensePlateAlphanumericLayout,\r\n licensePlateLayout,\r\n licensePlateLetterLayout,\r\n licensePlateProvinceLayout,\r\n numberLayout,\r\n phoneLayout,\r\n phoneSimpleLayout,\r\n PLATE_LETTERS,\r\n PROVINCES,\r\n // 标点键盘\r\n punctLayout,\r\n qwertyLayout,\r\n searchLayout,\r\n symbolLayout,\r\n symbolLayout2,\r\n urlLayout,\r\n verifycodeLayout,\r\n}\r\n\r\n/**\r\n * 内置布局映射\r\n */\r\nconst builtinLayouts: Record<string, KeyboardConfig> = {\r\n qwerty: qwertyLayout,\r\n number: numberLayout,\r\n integer: integerLayout,\r\n symbol: symbolLayout,\r\n 'symbol-2': symbolLayout2,\r\n 'license-plate': licensePlateLayout,\r\n 'license-plate-province': licensePlateProvinceLayout,\r\n 'license-plate-letter': licensePlateLetterLayout,\r\n 'license-plate-alphanumeric': licensePlateAlphanumericLayout,\r\n // 场景化键盘\r\n idcard: idcardLayout,\r\n phone: phoneLayout,\r\n 'phone-simple': phoneSimpleLayout,\r\n amount: amountLayout,\r\n 'amount-simple': amountSimpleLayout,\r\n bankcard: bankcardLayout,\r\n verifycode: verifycodeLayout,\r\n // 输入场景键盘\r\n email: emailLayout,\r\n url: urlLayout,\r\n search: searchLayout,\r\n // 标点键盘\r\n punct: punctLayout,\r\n}\r\n\r\n/**\r\n * 自定义布局存储\r\n */\r\nconst customLayouts: Record<string, KeyboardConfig> = {}\r\n\r\n/**\r\n * 注册自定义布局\r\n * @param name - 布局名称\r\n * @param layout - 布局配置\r\n */\r\nexport function registerLayout(name: string, layout: KeyboardConfig): void {\r\n if (builtinLayouts[name]) {\r\n console.warn(`[Keyboard] Cannot override builtin layout \"${name}\"`)\r\n return\r\n }\r\n customLayouts[name] = layout\r\n}\r\n\r\n/**\r\n * 获取布局配置\r\n * @param type - 键盘类型或布局名称\r\n * @returns 布局配置,如果不存在则返回 undefined\r\n */\r\nexport function getLayout(\r\n type: KeyboardType | string\r\n): KeyboardConfig | undefined {\r\n return customLayouts[type] || builtinLayouts[type]\r\n}\r\n\r\n/**\r\n * 获取所有可用布局名称\r\n * @returns 布局名称数组\r\n */\r\nexport function getAvailableLayouts(): string[] {\r\n return [...Object.keys(builtinLayouts), ...Object.keys(customLayouts)]\r\n}\r\n\r\n/**\r\n * 检查布局是否存在\r\n * @param name - 布局名称\r\n * @returns 是否存在\r\n */\r\nexport function hasLayout(name: string): boolean {\r\n return name in builtinLayouts || name in customLayouts\r\n}\r\n\r\n/**\r\n * 移除自定义布局\r\n * @param name - 布局名称\r\n * @returns 是否成功移除\r\n */\r\nexport function unregisterLayout(name: string): boolean {\r\n if (name in customLayouts) {\r\n delete customLayouts[name]\r\n return true\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * 批量注册布局\r\n * @param layouts - 布局映射对象\r\n */\r\nexport function registerLayouts(layouts: Record<string, KeyboardConfig>): void {\r\n Object.entries(layouts).forEach(([name, layout]) => {\r\n registerLayout(name, layout)\r\n })\r\n}\r\n","/**\r\n * 设备检测工具\r\n * @module utils/device\r\n */\r\n\r\nimport type { DeviceType, ViewportInfo } from '../types'\r\n\r\n/**\r\n * 移动设备 UA 正则\r\n */\r\nconst MOBILE_UA_REGEX =\r\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i\r\n\r\n/**\r\n * 触摸设备检测缓存\r\n */\r\nlet cachedIsTouchDevice: boolean | null = null\r\n\r\n/**\r\n * 检测是否为触摸设备\r\n */\r\nexport function isTouchDevice(): boolean {\r\n if (cachedIsTouchDevice !== null) {\r\n return cachedIsTouchDevice\r\n }\r\n\r\n if (typeof window === 'undefined') {\r\n return false\r\n }\r\n\r\n cachedIsTouchDevice =\r\n 'ontouchstart' in window ||\r\n navigator.maxTouchPoints > 0 ||\r\n // @ts-expect-error - msMaxTouchPoints is IE specific\r\n navigator.msMaxTouchPoints > 0\r\n\r\n return cachedIsTouchDevice\r\n}\r\n\r\n/**\r\n * 检测是否为移动设备(基于 UA)\r\n */\r\nexport function isMobileUA(): boolean {\r\n if (typeof navigator === 'undefined') {\r\n return false\r\n }\r\n return MOBILE_UA_REGEX.test(navigator.userAgent)\r\n}\r\n\r\n/**\r\n * 检测是否为移动设备(综合判断)\r\n */\r\nexport function isMobile(): boolean {\r\n if (typeof window === 'undefined') {\r\n return false\r\n }\r\n\r\n // 优先使用 UA 判断\r\n if (isMobileUA()) {\r\n return true\r\n }\r\n\r\n // 其次使用屏幕宽度判断\r\n const screenWidth = window.innerWidth || document.documentElement.clientWidth\r\n if (screenWidth <= 768) {\r\n return true\r\n }\r\n\r\n // 最后使用触摸检测\r\n return isTouchDevice()\r\n}\r\n\r\n/**\r\n * 获取设备类型\r\n */\r\nexport function getDeviceType(): DeviceType {\r\n return isMobile() ? 'mobile' : 'desktop'\r\n}\r\n\r\n/**\r\n * 获取视口信息\r\n */\r\nexport function getViewportInfo(): ViewportInfo {\r\n if (typeof window === 'undefined') {\r\n return {\r\n width: 0,\r\n height: 0,\r\n scrollX: 0,\r\n scrollY: 0,\r\n isMobile: false,\r\n }\r\n }\r\n\r\n const width = window.innerWidth || document.documentElement.clientWidth\r\n const height = window.innerHeight || document.documentElement.clientHeight\r\n\r\n // 获取安全区域(iOS 刘海屏等)\r\n const safeArea = getSafeAreaInsets()\r\n\r\n return {\r\n width,\r\n height,\r\n scrollX: window.scrollX || window.pageXOffset,\r\n scrollY: window.scrollY || window.pageYOffset,\r\n isMobile: isMobile(),\r\n safeArea,\r\n }\r\n}\r\n\r\n/**\r\n * 获取安全区域边距\r\n */\r\nexport function getSafeAreaInsets(): ViewportInfo['safeArea'] {\r\n if (\r\n typeof window === 'undefined' ||\r\n typeof CSS === 'undefined' ||\r\n !CSS.supports\r\n ) {\r\n return { top: 0, right: 0, bottom: 0, left: 0 }\r\n }\r\n\r\n // 检查是否支持 env() 函数\r\n if (!CSS.supports('padding-top', 'env(safe-area-inset-top)')) {\r\n return { top: 0, right: 0, bottom: 0, left: 0 }\r\n }\r\n\r\n // 创建临时元素获取安全区域值\r\n const div = document.createElement('div')\r\n div.style.cssText = `\r\n position: fixed;\r\n top: env(safe-area-inset-top);\r\n right: env(safe-area-inset-right);\r\n bottom: env(safe-area-inset-bottom);\r\n left: env(safe-area-inset-left);\r\n pointer-events: none;\r\n visibility: hidden;\r\n `\r\n const body = document.body\r\n if (!body) return { top: 0, right: 0, bottom: 0, left: 0 }\r\n body.appendChild(div)\r\n\r\n const computed = getComputedStyle(div)\r\n const safeArea = {\r\n top: Number.parseFloat(computed.top) || 0,\r\n right: Number.parseFloat(computed.right) || 0,\r\n bottom: Number.parseFloat(computed.bottom) || 0,\r\n left: Number.parseFloat(computed.left) || 0,\r\n }\r\n\r\n body.removeChild(div)\r\n return safeArea\r\n}\r\n\r\n/**\r\n * 检测是否支持震动 API\r\n */\r\nexport function supportsVibrate(): boolean {\r\n return typeof navigator !== 'undefined' && 'vibrate' in navigator\r\n}\r\n\r\n/**\r\n * 触发震动反馈\r\n * @param pattern - 震动模式(毫秒)\r\n */\r\nexport function vibrate(pattern: number | number[] = 10): boolean {\r\n if (supportsVibrate()) {\r\n return navigator.vibrate(pattern)\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * 监听视口变化\r\n * @param callback - 回调函数\r\n * @returns 取消监听函数\r\n */\r\nexport function onViewportChange(\r\n callback: (info: ViewportInfo) => void\r\n): () => void {\r\n if (typeof window === 'undefined') {\r\n return () => {}\r\n }\r\n\r\n const handler = () => {\r\n callback(getViewportInfo())\r\n }\r\n\r\n window.addEventListener('resize', handler)\r\n window.addEventListener('orientationchange', handler)\r\n\r\n return () => {\r\n window.removeEventListener('resize', handler)\r\n window.removeEventListener('orientationchange', handler)\r\n }\r\n}\r\n","/**\r\n * DOM 操作工具\r\n * @module utils/dom\r\n */\r\n\r\nimport type { BoundingRect, Position } from '../types'\r\n\r\n/**\r\n * 获取元素的边界矩形\r\n */\r\nexport function getBoundingRect(element: HTMLElement): BoundingRect {\r\n const rect = element.getBoundingClientRect()\r\n return {\r\n x: rect.left,\r\n y: rect.top,\r\n width: rect.width,\r\n height: rect.height,\r\n }\r\n}\r\n\r\n/**\r\n * 获取元素相对于文档的位置\r\n */\r\nexport function getElementOffset(element: HTMLElement): Position {\r\n const rect = element.getBoundingClientRect()\r\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft\r\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop\r\n\r\n return {\r\n x: rect.left + scrollLeft,\r\n y: rect.top + scrollTop,\r\n }\r\n}\r\n\r\n/**\r\n * 检查元素是否在视口内\r\n */\r\nexport function isElementInViewport(element: HTMLElement): boolean {\r\n const rect = element.getBoundingClientRect()\r\n return (\r\n rect.top >= 0 &&\r\n rect.left >= 0 &&\r\n rect.bottom <=\r\n (window.innerHeight || document.documentElement.clientHeight) &&\r\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\r\n )\r\n}\r\n\r\n/**\r\n * 检查点击是否在元素外部\r\n */\r\nexport function isClickOutside(\r\n event: MouseEvent | TouchEvent,\r\n element: HTMLElement\r\n): boolean {\r\n const target = event.target as Node\r\n return !element.contains(target)\r\n}\r\n\r\n/**\r\n * 阻止元素默认事件(用于防止输入框获取焦点)\r\n */\r\nexport function preventDefaultAndStopPropagation(event: Event): void {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n}\r\n\r\n/**\r\n * 添加点击外部监听\r\n */\r\nexport function onClickOutside(\r\n element: HTMLElement,\r\n callback: (event: MouseEvent | TouchEvent) => void\r\n): () => void {\r\n const handler = (event: MouseEvent | TouchEvent) => {\r\n if (isClickOutside(event, element)) {\r\n callback(event)\r\n }\r\n }\r\n\r\n document.addEventListener('mousedown', handler)\r\n document.addEventListener('touchstart', handler)\r\n\r\n return () => {\r\n document.removeEventListener('mousedown', handler)\r\n document.removeEventListener('touchstart', handler)\r\n }\r\n}\r\n\r\n/**\r\n * 滚动元素到可视区域\r\n */\r\nexport function scrollIntoViewIfNeeded(\r\n element: HTMLElement,\r\n container?: HTMLElement\r\n): void {\r\n if (!container) {\r\n element.scrollIntoView({ behavior: 'smooth', block: 'nearest' })\r\n return\r\n }\r\n\r\n const elementRect = element.getBoundingClientRect()\r\n const containerRect = container.getBoundingClientRect()\r\n\r\n if (elementRect.bottom > containerRect.bottom) {\r\n container.scrollTop += elementRect.bottom - containerRect.bottom\r\n } else if (elementRect.top < containerRect.top) {\r\n container.scrollTop -= containerRect.top - elementRect.top\r\n }\r\n}\r\n\r\n/**\r\n * 获取输入框的光标位置\r\n */\r\nexport function getInputCursorPosition(\r\n input: HTMLInputElement | HTMLTextAreaElement\r\n): number {\r\n return input.selectionStart ?? input.value.length\r\n}\r\n\r\n/**\r\n * 设置输入框的光标位置\r\n */\r\nexport function setInputCursorPosition(\r\n input: HTMLInputElement | HTMLTextAreaElement,\r\n position: number\r\n): void {\r\n input.setSelectionRange(position, position)\r\n}\r\n\r\n/**\r\n * 在输入框当前光标位置插入文本\r\n */\r\nexport function insertTextAtCursor(\r\n input: HTMLInputElement | HTMLTextAreaElement,\r\n text: string,\r\n maxLength?: number\r\n): { value: string; cursorPosition: number } {\r\n const start = input.selectionStart ?? input.value.length\r\n const end = input.selectionEnd ?? input.value.length\r\n const currentValue = input.value\r\n\r\n const normalizedMaxLength =\r\n maxLength === undefined || !Number.isFinite(maxLength)\r\n ? undefined\r\n : Math.max(0, Math.floor(maxLength))\r\n let insertedText = text\r\n let newValue =\r\n currentValue.substring(0, start) +\r\n insertedText +\r\n currentValue.substring(end)\r\n\r\n // 检查最大长度\r\n if (\r\n normalizedMaxLength !== undefined &&\r\n newValue.length > normalizedMaxLength\r\n ) {\r\n const allowedLength =\r\n normalizedMaxLength - (currentValue.length - (end - start))\r\n if (allowedLength <= 0) {\r\n return { value: currentValue, cursorPosition: start }\r\n }\r\n insertedText = text.substring(0, allowedLength)\r\n newValue =\r\n currentValue.substring(0, start) +\r\n insertedText +\r\n currentValue.substring(end)\r\n }\r\n\r\n const newCursorPosition = start + insertedText.length\r\n\r\n return {\r\n value: newValue,\r\n cursorPosition: Math.min(newCursorPosition, newValue.length),\r\n }\r\n}\r\n\r\n/**\r\n * 删除输入框光标前的字符\r\n */\r\nexport function deleteCharBeforeCursor(\r\n input: HTMLInputElement | HTMLTextAreaElement\r\n): { value: string; deletedChar: string; cursorPosition: number } {\r\n const start = input.selectionStart ?? input.value.length\r\n const end = input.selectionEnd ?? input.value.length\r\n const currentValue = input.value\r\n\r\n // 如果有选中内容,删除选中内容\r\n if (start !== end) {\r\n const deletedChar = currentValue.substring(start, end)\r\n const newValue =\r\n currentValue.substring(0, start) + currentValue.substring(end)\r\n return {\r\n value: newValue,\r\n deletedChar,\r\n cursorPosition: start,\r\n }\r\n }\r\n\r\n // 没有选中内容,删除光标前一个字符\r\n if (start === 0) {\r\n return {\r\n value: currentValue,\r\n deletedChar: '',\r\n cursorPosition: 0,\r\n }\r\n }\r\n\r\n const deletedChar = currentValue.charAt(start - 1)\r\n const newValue =\r\n currentValue.substring(0, start - 1) + currentValue.substring(start)\r\n\r\n return {\r\n value: newValue,\r\n deletedChar,\r\n cursorPosition: start - 1,\r\n }\r\n}\r\n\r\n/**\r\n * 创建 DOM 元素\r\n */\r\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\r\n tag: K,\r\n attrs?: Record<string, string>,\r\n children?: (HTMLElement | string)[]\r\n): HTMLElementTagNameMap[K] {\r\n const element = document.createElement(tag)\r\n\r\n if (attrs) {\r\n Object.entries(attrs).forEach(([key, value]) => {\r\n element.setAttribute(key, value)\r\n })\r\n }\r\n\r\n if (children) {\r\n children.forEach(child => {\r\n if (typeof child === 'string') {\r\n element.appendChild(document.createTextNode(child))\r\n } else {\r\n element.appendChild(child)\r\n }\r\n })\r\n }\r\n\r\n return element\r\n}\r\n\r\n/**\r\n * Sanitize a caller-provided SVG icon before inserting it into the DOM.\r\n */\r\nexport function sanitizeSvgIcon(icon: string): string {\r\n if (typeof DOMParser === 'undefined' || typeof XMLSerializer === 'undefined')\r\n return ''\r\n\r\n const document = new DOMParser().parseFromString(icon, 'image/svg+xml')\r\n const svg = document.documentElement\r\n if (\r\n svg.tagName.toLowerCase() !== 'svg' ||\r\n document.querySelector('parsererror')\r\n )\r\n return ''\r\n\r\n svg\r\n .querySelectorAll('script, style, foreignObject')\r\n .forEach(node => node.remove())\r\n svg.querySelectorAll('*').forEach(element => {\r\n Array.from(element.attributes).forEach(attribute => {\r\n const name = attribute.name.toLowerCase()\r\n const value = attribute.value.trim()\r\n if (\r\n name.startsWith('on') ||\r\n ((name === 'href' || name === 'xlink:href') && !value.startsWith('#'))\r\n ) {\r\n element.removeAttribute(attribute.name)\r\n }\r\n })\r\n })\r\n\r\n return new XMLSerializer().serializeToString(svg)\r\n}\r\n\r\n/**\r\n * 添加/移除 CSS 类\r\n */\r\nexport function toggleClass(\r\n element: HTMLElement,\r\n className: string,\r\n force?: boolean\r\n): void {\r\n element.classList.toggle(className, force)\r\n}\r\n\r\n/**\r\n * 设置 CSS 样式\r\n */\r\nexport function setStyles(\r\n element: HTMLElement,\r\n styles: Partial<CSSStyleDeclaration>\r\n): void {\r\n Object.assign(element.style, styles)\r\n}\r\n","/**\r\n * 事件发射器\r\n * @module utils/event-emitter\r\n */\r\n\r\n/**\r\n * 事件处理函数类型\r\n */\r\nexport type EventHandler<T = unknown> = (data: T) => void\r\n\r\n/**\r\n * 事件处理器配置\r\n */\r\nexport interface EventHandlerOptions {\r\n /**\r\n * 是否只触发一次\r\n */\r\n once?: boolean\r\n\r\n /**\r\n * 优先级(数字越大优先级越高)\r\n */\r\n priority?: number\r\n}\r\n\r\n/**\r\n * 内部事件处理器包装\r\n */\r\ninterface EventHandlerWrapper<T> {\r\n handler: EventHandler<T>\r\n options: EventHandlerOptions\r\n}\r\n\r\n/**\r\n * 事件发射器类\r\n */\r\nexport class EventEmitter<EventMap extends Record<string, unknown>> {\r\n private handlers = new Map<\r\n keyof EventMap,\r\n Set<EventHandlerWrapper<unknown>>\r\n >()\r\n\r\n /**\r\n * 订阅事件\r\n */\r\n on<K extends keyof EventMap>(\r\n event: K,\r\n handler: EventHandler<EventMap[K]>,\r\n options: EventHandlerOptions = {}\r\n ): () => void {\r\n if (!this.handlers.has(event)) {\r\n this.handlers.set(event, new Set())\r\n }\r\n\r\n const handlers = this.handlers.get(event)\r\n if (!handlers) {\r\n return () => undefined\r\n }\r\n const wrapper: EventHandlerWrapper<EventMap[K]> = {\r\n handler: handler as EventHandler<unknown>,\r\n options,\r\n }\r\n\r\n handlers.add(wrapper as EventHandlerWrapper<unknown>)\r\n\r\n return () => {\r\n handlers.delete(wrapper as EventHandlerWrapper<unknown>)\r\n if (handlers.size === 0) {\r\n this.handlers.delete(event)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 订阅事件(仅触发一次)\r\n */\r\n once<K extends keyof EventMap>(\r\n event: K,\r\n handler: EventHandler<EventMap[K]>,\r\n options: EventHandlerOptions = {}\r\n ): () => void {\r\n return this.on(event, handler, { ...options, once: true })\r\n }\r\n\r\n /**\r\n * 取消订阅事件\r\n */\r\n off<K extends keyof EventMap>(\r\n event: K,\r\n handler?: EventHandler<EventMap[K]>\r\n ): void {\r\n if (!handler) {\r\n this.handlers.delete(event)\r\n return\r\n }\r\n\r\n const handlers = this.handlers.get(event)\r\n if (handlers) {\r\n handlers.forEach(wrapper => {\r\n if (wrapper.handler === handler) {\r\n handlers.delete(wrapper)\r\n }\r\n })\r\n if (handlers.size === 0) {\r\n this.handlers.delete(event)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 发布事件\r\n */\r\n emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void {\r\n const handlers = this.handlers.get(event)\r\n if (!handlers || handlers.size === 0) {\r\n return\r\n }\r\n\r\n // 按优先级排序\r\n const sortedHandlers = Array.from(handlers).sort((a, b) => {\r\n const priorityA = a.options.priority ?? 0\r\n const priorityB = b.options.priority ?? 0\r\n return priorityB - priorityA\r\n })\r\n\r\n const toRemove: EventHandlerWrapper<unknown>[] = []\r\n\r\n sortedHandlers.forEach(wrapper => {\r\n try {\r\n wrapper.handler(data)\r\n if (wrapper.options.once) {\r\n toRemove.push(wrapper)\r\n }\r\n } catch (error) {\r\n console.error(\r\n `[KeyboardEventEmitter] Error in event handler for \"${String(event)}\":`,\r\n error\r\n )\r\n }\r\n })\r\n\r\n // 移除 once 处理器\r\n toRemove.forEach(wrapper => handlers.delete(wrapper))\r\n if (handlers.size === 0) {\r\n this.handlers.delete(event)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有事件订阅\r\n */\r\n clear(): void {\r\n this.handlers.clear()\r\n }\r\n\r\n /**\r\n * 获取事件订阅数量\r\n */\r\n listenerCount(event?: keyof EventMap): number {\r\n if (event !== undefined) {\r\n return this.handlers.get(event)?.size ?? 0\r\n }\r\n\r\n let count = 0\r\n this.handlers.forEach(handlers => {\r\n count += handlers.size\r\n })\r\n return count\r\n }\r\n}\r\n","/**\r\n * 键盘管理器\r\n * @module managers/keyboard-manager\r\n */\r\n\r\nimport type {\r\n KeyboardConfig,\r\n KeyboardEventMap,\r\n KeyboardOptions,\r\n KeyboardState,\r\n KeyboardType,\r\n KeyDefinition,\r\n} from '../types'\r\nimport { getLayout } from '../layouts'\r\nimport { isMobile, vibrate } from '../utils/device'\r\nimport {\r\n deleteCharBeforeCursor,\r\n getInputCursorPosition,\r\n insertTextAtCursor,\r\n setInputCursorPosition,\r\n} from '../utils/dom'\r\nimport { EventEmitter } from '../utils/event-emitter'\r\n\r\n/**\r\n * 默认键盘选项\r\n */\r\nconst DEFAULT_OPTIONS: Required<KeyboardOptions> = {\r\n type: 'qwerty',\r\n value: '',\r\n maxLength: undefined as unknown as number,\r\n defaultUpperCase: false,\r\n closeOnClickOutside: true,\r\n enableSound: false,\r\n enableVibrate: true,\r\n customLayouts: {},\r\n}\r\n\r\nfunction normalizeMaxLength(value: number | undefined): number | undefined {\r\n if (value === undefined || !Number.isFinite(value)) return undefined\r\n return Math.max(0, Math.floor(value))\r\n}\r\n\r\nfunction clampValue(value: string, maxLength: number | undefined): string {\r\n return maxLength === undefined ? value : value.slice(0, maxLength)\r\n}\r\n\r\n/**\r\n * 键盘管理器类\r\n * 处理键盘状态管理、输入处理等核心逻辑\r\n */\r\nexport class KeyboardManager extends EventEmitter<KeyboardEventMap> {\r\n /** 配置选项 */\r\n private options: Required<KeyboardOptions>\r\n\r\n /** 当前状态 */\r\n private state: KeyboardState\r\n\r\n /** 当前布局配置 */\r\n private currentLayout: KeyboardConfig | null = null\r\n\r\n private destroyed = false\r\n\r\n constructor(options: KeyboardOptions = {}) {\r\n super()\r\n const maxLength = normalizeMaxLength(options.maxLength)\r\n this.options = {\r\n ...DEFAULT_OPTIONS,\r\n ...options,\r\n maxLength,\r\n customLayouts: {\r\n ...DEFAULT_OPTIONS.customLayouts,\r\n ...(options.customLayouts ?? {}),\r\n },\r\n }\r\n\r\n // 注册自定义布局\r\n if (options.customLayouts) {\r\n Object.entries(options.customLayouts).forEach(([name, layout]) => {\r\n // 这里不用 registerLayout 以避免覆盖内置布局的警告\r\n this.options.customLayouts[name] = layout\r\n })\r\n }\r\n\r\n // 初始化状态\r\n this.state = {\r\n visible: false,\r\n type: this.options.type,\r\n isUpperCase: this.options.defaultUpperCase,\r\n value: clampValue(this.options.value, this.options.maxLength),\r\n cursorPosition: clampValue(this.options.value, this.options.maxLength)\r\n .length,\r\n maxLength: this.options.maxLength,\r\n inputElement: null,\r\n }\r\n\r\n // 加载初始布局\r\n this.loadLayout(this.options.type)\r\n }\r\n\r\n /**\r\n * 获取当前状态\r\n */\r\n getState(): Readonly<KeyboardState> {\r\n return { ...this.state }\r\n }\r\n\r\n /**\r\n * 获取当前布局配置\r\n */\r\n getLayout(): KeyboardConfig | null {\r\n return this.currentLayout\r\n }\r\n\r\n /**\r\n * 获取配置选项\r\n */\r\n getOptions(): Readonly<Required<KeyboardOptions>> {\r\n return { ...this.options, customLayouts: { ...this.options.customLayouts } }\r\n }\r\n\r\n /**\r\n * 加载键盘布局\r\n */\r\n private loadLayout(type: KeyboardType | string): boolean {\r\n // 先从自定义布局查找\r\n let layout = this.options.customLayouts[type]\r\n\r\n // 再从内置布局查找\r\n if (!layout) {\r\n layout = getLayout(type) as KeyboardConfig\r\n }\r\n\r\n if (!layout) {\r\n console.error(`[KeyboardManager] Layout \"${type}\" not found`)\r\n return false\r\n }\r\n\r\n this.currentLayout = layout\r\n\r\n // 更新大小写状态\r\n if (layout.supportShift) {\r\n this.state.isUpperCase =\r\n layout.defaultUpperCase ?? this.options.defaultUpperCase\r\n }\r\n\r\n return true\r\n }\r\n\r\n /**\r\n * 显示键盘\r\n */\r\n show(inputElement?: HTMLInputElement | HTMLTextAreaElement): void {\r\n if (this.destroyed) return\r\n if (this.state.visible) {\r\n if (inputElement && this.state.inputElement !== inputElement) {\r\n this.bindInput(inputElement)\r\n }\r\n return\r\n }\r\n\r\n this.state.visible = true\r\n this.state.inputElement = inputElement ?? null\r\n\r\n // 同步输入框的值\r\n if (inputElement) {\r\n this.state.value = inputElement.value\r\n this.state.cursorPosition = getInputCursorPosition(inputElement)\r\n }\r\n\r\n this.emitStateChange()\r\n this.emit('show', { type: this.state.type })\r\n }\r\n\r\n /**\r\n * 隐藏键盘\r\n */\r\n hide(): void {\r\n if (this.destroyed) return\r\n if (!this.state.visible) return\r\n\r\n const prevType = this.state.type\r\n this.state.visible = false\r\n this.state.inputElement = null\r\n\r\n this.emitStateChange()\r\n this.emit('hide', { type: prevType })\r\n }\r\n\r\n /**\r\n * 切换键盘显示/隐藏\r\n */\r\n toggle(inputElement?: HTMLInputElement | HTMLTextAreaElement): void {\r\n if (this.destroyed) return\r\n if (this.state.visible) {\r\n this.hide()\r\n } else {\r\n this.show(inputElement)\r\n }\r\n }\r\n\r\n /**\r\n * 切换键盘类型\r\n */\r\n switchType(type: KeyboardType | string): void {\r\n if (this.destroyed) return\r\n if (this.state.type === type) return\r\n\r\n const fromType = this.state.type\r\n if (!this.loadLayout(type)) return\r\n\r\n this.state.type = type as KeyboardType\r\n\r\n this.emitStateChange()\r\n this.emit('switch', { from: fromType, to: type as KeyboardType })\r\n }\r\n\r\n /**\r\n * 切换大小写\r\n */\r\n toggleShift(): void {\r\n if (this.destroyed) return\r\n if (!this.currentLayout?.supportShift) return\r\n\r\n this.state.isUpperCase = !this.state.isUpperCase\r\n this.emitStateChange()\r\n this.emit('shift', { isUpperCase: this.state.isUpperCase })\r\n }\r\n\r\n /**\r\n * 设置大小写状态\r\n */\r\n setShift(isUpperCase: boolean): void {\r\n if (this.destroyed) return\r\n if (!this.currentLayout?.supportShift) return\r\n if (this.state.isUpperCase === isUpperCase) return\r\n\r\n this.state.isUpperCase = isUpperCase\r\n this.emitStateChange()\r\n this.emit('shift', { isUpperCase })\r\n }\r\n\r\n /**\r\n * 处理按键\r\n */\r\n handleKey(key: KeyDefinition): void {\r\n if (this.destroyed) return\r\n // 触发震动反馈\r\n if (this.options.enableVibrate && isMobile()) {\r\n vibrate(10)\r\n }\r\n\r\n this.emit('keypress', { key, value: this.state.value })\r\n\r\n switch (key.type) {\r\n case 'char':\r\n case 'space':\r\n this.handleCharKey(key)\r\n break\r\n case 'backspace':\r\n this.handleBackspace()\r\n break\r\n case 'shift':\r\n this.toggleShift()\r\n break\r\n case 'clear':\r\n this.handleClear()\r\n break\r\n case 'enter':\r\n case 'done':\r\n this.handleConfirm()\r\n break\r\n case 'close':\r\n this.hide()\r\n break\r\n case 'tab':\r\n this.handleTab(key)\r\n break\r\n case 'custom':\r\n // 自定义按键,只触发事件\r\n break\r\n }\r\n }\r\n\r\n /**\r\n * 处理字符输入\r\n */\r\n private handleCharKey(key: KeyDefinition): void {\r\n const keyValue = this.getKeyValue(key)\r\n if (!keyValue) return\r\n\r\n const input = this.state.inputElement\r\n\r\n if (input) {\r\n // 如果有绑定输入框,直接操作输入框\r\n const result = insertTextAtCursor(input, keyValue, this.state.maxLength)\r\n input.value = result.value\r\n setInputCursorPosition(input, result.cursorPosition)\r\n this.state.value = result.value\r\n this.state.cursorPosition = result.cursorPosition\r\n\r\n // 触发原生 input 事件\r\n this.dispatchInputEvent(input)\r\n } else {\r\n // 没有输入框,直接修改内部值\r\n if (\r\n this.state.maxLength !== undefined &&\r\n this.state.value.length >= this.state.maxLength\r\n ) {\r\n return\r\n }\r\n const availableLength =\r\n this.state.maxLength === undefined\r\n ? keyValue.length\r\n : this.state.maxLength - this.state.value.length\r\n const valueToInsert = keyValue.slice(0, Math.max(0, availableLength))\r\n if (!valueToInsert) return\r\n const newValue =\r\n this.state.value.slice(0, this.state.cursorPosition) +\r\n valueToInsert +\r\n this.state.value.slice(this.state.cursorPosition)\r\n this.state.value = newValue\r\n this.state.cursorPosition += valueToInsert.length\r\n }\r\n\r\n this.emitStateChange()\r\n this.emit('input', { value: this.state.value, key })\r\n\r\n // 车牌号智能切换\r\n this.autoSwitchLicensePlate()\r\n }\r\n\r\n /**\r\n * 处理退格\r\n */\r\n private handleBackspace(): void {\r\n const input = this.state.inputElement\r\n\r\n if (input) {\r\n const result = deleteCharBeforeCursor(input)\r\n input.value = result.value\r\n setInputCursorPosition(input, result.cursorPosition)\r\n this.state.value = result.value\r\n this.state.cursorPosition = result.cursorPosition\r\n\r\n // 触发原生 input 事件\r\n this.dispatchInputEvent(input)\r\n\r\n this.emitStateChange()\r\n this.emit('backspace', {\r\n deletedChar: result.deletedChar,\r\n value: this.state.value,\r\n })\r\n } else {\r\n if (this.state.cursorPosition === 0) return\r\n\r\n const deletedChar = this.state.value.charAt(this.state.cursorPosition - 1)\r\n this.state.value =\r\n this.state.value.slice(0, this.state.cursorPosition - 1) +\r\n this.state.value.slice(this.state.cursorPosition)\r\n this.state.cursorPosition--\r\n\r\n this.emitStateChange()\r\n this.emit('backspace', { deletedChar, value: this.state.value })\r\n }\r\n\r\n // 车牌号智能切换\r\n this.autoSwitchLicensePlate()\r\n }\r\n\r\n /**\r\n * 车牌号智能切换逻辑\r\n * 根据当前值长度自动切换键盘布局\r\n * 只有 2 种布局:省份键盘(第1位)和 字母+数字混合键盘(第2-8位)\r\n */\r\n private autoSwitchLicensePlate(): void {\r\n // 只在车牌键盘类型时生效\r\n if (!this.state.type.startsWith('license-plate')) return\r\n\r\n const len = this.state.value.length\r\n let targetType: string | null = null\r\n\r\n if (len === 0) {\r\n // 第1位:省份简称\r\n targetType = 'license-plate-province'\r\n } else {\r\n // 第2-8位:字母+数字混合键盘\r\n // (第2位虽然只能输入字母,但显示混合键盘,用户自己知道不能输入数字)\r\n targetType = 'license-plate-alphanumeric'\r\n }\r\n\r\n // 如果需要切换\r\n if (targetType && this.state.type !== targetType) {\r\n this.switchType(targetType)\r\n }\r\n }\r\n\r\n /**\r\n * 处理清空\r\n */\r\n private handleClear(): void {\r\n const previousValue = this.state.value\r\n\r\n if (this.state.inputElement) {\r\n this.state.inputElement.value = ''\r\n this.dispatchInputEvent(this.state.inputElement)\r\n }\r\n\r\n this.state.value = ''\r\n this.state.cursorPosition = 0\r\n\r\n this.emitStateChange()\r\n this.emit('clear', { previousValue })\r\n\r\n // 车牌号智能切换\r\n this.autoSwitchLicensePlate()\r\n }\r\n\r\n /**\r\n * 处理确认\r\n */\r\n private handleConfirm(): void {\r\n this.emit('confirm', { value: this.state.value })\r\n this.hide()\r\n }\r\n\r\n /**\r\n * 处理切换键盘\r\n */\r\n private handleTab(key: KeyDefinition): void {\r\n const targetType = key.data?.targetType as KeyboardType | string | undefined\r\n if (targetType) {\r\n this.switchType(targetType)\r\n }\r\n }\r\n\r\n /**\r\n * 获取按键的实际输出值\r\n */\r\n private getKeyValue(key: KeyDefinition): string {\r\n const value = key.value ?? key.label\r\n\r\n if (typeof value === 'string') {\r\n return value\r\n }\r\n\r\n return this.state.isUpperCase ? value.upper : value.lower\r\n }\r\n\r\n /**\r\n * 获取按键的显示文本\r\n */\r\n getKeyLabel(key: KeyDefinition): string {\r\n const label = key.label\r\n\r\n if (typeof label === 'string') {\r\n return label\r\n }\r\n\r\n return this.state.isUpperCase ? label.upper : label.lower\r\n }\r\n\r\n /**\r\n * 设置值\r\n */\r\n setValue(value: string): void {\r\n if (this.destroyed) return\r\n const nextValue = clampValue(value, this.state.maxLength)\r\n this.state.value = nextValue\r\n this.state.cursorPosition = nextValue.length\r\n\r\n if (this.state.inputElement) {\r\n this.state.inputElement.value = nextValue\r\n setInputCursorPosition(this.state.inputElement, nextValue.length)\r\n this.dispatchInputEvent(this.state.inputElement)\r\n }\r\n\r\n this.emitStateChange()\r\n\r\n // 车牌号智能切换\r\n this.autoSwitchLicensePlate()\r\n }\r\n\r\n /**\r\n * 追加值(在光标位置插入文本)\r\n */\r\n appendValue(text: string): void {\r\n if (this.destroyed) return\r\n if (!text) return\r\n\r\n const input = this.state.inputElement\r\n\r\n if (input) {\r\n const result = insertTextAtCursor(input, text, this.state.maxLength)\r\n input.value = result.value\r\n setInputCursorPosition(input, result.cursorPosition)\r\n this.state.value = result.value\r\n this.state.cursorPosition = result.cursorPosition\r\n\r\n // 触发原生 input 事件\r\n this.dispatchInputEvent(input)\r\n } else {\r\n if (this.state.maxLength !== undefined) {\r\n text = text.slice(\r\n 0,\r\n Math.max(0, this.state.maxLength - this.state.value.length)\r\n )\r\n }\r\n if (!text) return\r\n const newValue =\r\n this.state.value.slice(0, this.state.cursorPosition) +\r\n text +\r\n this.state.value.slice(this.state.cursorPosition)\r\n this.state.value = newValue\r\n this.state.cursorPosition += text.length\r\n }\r\n\r\n this.emitStateChange()\r\n }\r\n\r\n /**\r\n * 设置最大长度\r\n */\r\n setMaxLength(maxLength?: number): void {\r\n if (this.destroyed) return\r\n const normalizedMaxLength = normalizeMaxLength(maxLength)\r\n this.state.maxLength = normalizedMaxLength\r\n const nextValue = clampValue(this.state.value, normalizedMaxLength)\r\n const changed = nextValue !== this.state.value\r\n this.state.value = nextValue\r\n this.state.cursorPosition = Math.min(\r\n this.state.cursorPosition,\r\n nextValue.length\r\n )\r\n if (\r\n this.state.inputElement &&\r\n this.state.inputElement.value !== nextValue\r\n ) {\r\n this.state.inputElement.value = nextValue\r\n setInputCursorPosition(this.state.inputElement, this.state.cursorPosition)\r\n this.dispatchInputEvent(this.state.inputElement)\r\n }\r\n this.emitStateChange()\r\n if (changed) this.autoSwitchLicensePlate()\r\n }\r\n\r\n /**\r\n * 绑定输入框\r\n */\r\n bindInput(input: HTMLInputElement | HTMLTextAreaElement): void {\r\n if (this.destroyed) return\r\n this.state.inputElement = input\r\n const nextValue = clampValue(input.value, this.state.maxLength)\r\n if (input.value !== nextValue) input.value = nextValue\r\n this.state.value = nextValue\r\n this.state.cursorPosition = Math.min(\r\n getInputCursorPosition(input),\r\n nextValue.length\r\n )\r\n this.emitStateChange()\r\n }\r\n\r\n /**\r\n * 解绑输入框\r\n */\r\n unbindInput(): void {\r\n if (this.destroyed) return\r\n this.state.inputElement = null\r\n this.emitStateChange()\r\n }\r\n\r\n /**\r\n * 发送状态变化事件\r\n */\r\n private emitStateChange(): void {\r\n this.emit('stateChange', { ...this.state })\r\n }\r\n\r\n private dispatchInputEvent(\r\n input: HTMLInputElement | HTMLTextAreaElement\r\n ): void {\r\n const EventConstructor = input.ownerDocument.defaultView?.Event ?? Event\r\n input.dispatchEvent(new EventConstructor('input', { bubbles: true }))\r\n }\r\n\r\n /**\r\n * 销毁\r\n */\r\n destroy(): void {\r\n if (this.destroyed) return\r\n this.hide()\r\n this.clear()\r\n this.state.inputElement = null\r\n this.destroyed = true\r\n }\r\n}\r\n\r\n/**\r\n * 创建键盘管理器实例\r\n */\r\nexport function createKeyboardManager(\r\n options?: KeyboardOptions\r\n): KeyboardManager {\r\n return new KeyboardManager(options)\r\n}\r\n","/**\r\n * 预设主题配置\r\n * @module themes/presets\r\n */\r\n\r\nimport type { ThemeConfig } from './types'\r\n\r\n/**\r\n * MIUI 小米风格主题(默认)\r\n * 特点:纯净、扁平、简洁、无多余装饰\r\n */\r\nexport const miuiTheme: ThemeConfig = {\r\n name: 'miui',\r\n displayName: 'MIUI',\r\n description: '小米风格 - 纯净简洁',\r\n isDark: false,\r\n colors: {\r\n background: '#f5f5f5',\r\n keyBackground: '#ffffff',\r\n keyColor: '#1a1a1a',\r\n keyActiveBackground: '#e8e8e8',\r\n fnKeyBackground: '#e0e0e0',\r\n fnKeyColor: '#666666',\r\n fnKeyActiveBackground: '#d0d0d0',\r\n primaryBackground: '#ff6700', // 小米橙\r\n primaryActiveBackground: '#e55d00',\r\n primaryColor: '#ffffff',\r\n borderColor: 'transparent',\r\n dividerColor: '#eeeeee',\r\n },\r\n sizes: {\r\n keyHeight: 46,\r\n keyRadius: 8,\r\n keyGap: 6,\r\n fontSize: 18,\r\n fnFontSize: 14,\r\n padding: 8,\r\n },\r\n effects: {\r\n keyShadow: 'none',\r\n keyActiveShadow: 'none',\r\n keyActiveScale: 0.96,\r\n transitionDuration: 100,\r\n enableBlur: false,\r\n blurAmount: 0,\r\n enableRipple: false,\r\n },\r\n}\r\n\r\n/**\r\n * iOS 风格主题\r\n * 特点:毛玻璃、圆润阴影、精致\r\n */\r\nexport const iosTheme: ThemeConfig = {\r\n name: 'ios',\r\n displayName: 'iOS',\r\n description: 'Apple 风格 - 精致优雅',\r\n isDark: false,\r\n colors: {\r\n background: '#d1d3d9',\r\n keyBackground: '#ffffff',\r\n keyColor: '#000000',\r\n keyActiveBackground: '#b8bac2',\r\n fnKeyBackground: '#a8aab4',\r\n fnKeyColor: '#000000',\r\n fnKeyActiveBackground: '#9699a3',\r\n primaryBackground: '#007aff',\r\n primaryActiveBackground: '#0062cc',\r\n primaryColor: '#ffffff',\r\n borderColor: 'transparent',\r\n dividerColor: '#c8cad0',\r\n },\r\n sizes: {\r\n keyHeight: 43,\r\n keyRadius: 5,\r\n keyGap: 6,\r\n fontSize: 22,\r\n fnFontSize: 15,\r\n padding: 4,\r\n },\r\n effects: {\r\n keyShadow: '0 1px 0 rgba(0,0,0,0.35)',\r\n keyActiveShadow: '0 0 0 rgba(0,0,0,0)',\r\n keyActiveScale: 1,\r\n transitionDuration: 80,\r\n enableBlur: true,\r\n blurAmount: 20,\r\n enableRipple: false,\r\n },\r\n}\r\n\r\n/**\r\n * Material Design 主题\r\n * 特点:深色、涟漪动效、层次感\r\n */\r\nexport const materialTheme: ThemeConfig = {\r\n name: 'material',\r\n displayName: 'Material',\r\n description: 'Google 风格 - 深邃现代',\r\n isDark: true,\r\n colors: {\r\n background: '#263238',\r\n keyBackground: '#37474f',\r\n keyColor: '#ffffff',\r\n keyActiveBackground: '#455a64',\r\n fnKeyBackground: '#455a64',\r\n fnKeyColor: '#b0bec5',\r\n fnKeyActiveBackground: '#546e7a',\r\n primaryBackground: '#4caf50', // Material Green\r\n primaryActiveBackground: '#43a047',\r\n primaryColor: '#ffffff',\r\n borderColor: 'transparent',\r\n dividerColor: '#37474f',\r\n },\r\n sizes: {\r\n keyHeight: 48,\r\n keyRadius: 4,\r\n keyGap: 4,\r\n fontSize: 20,\r\n fnFontSize: 14,\r\n padding: 6,\r\n },\r\n effects: {\r\n keyShadow: '0 1px 3px rgba(0,0,0,0.2)',\r\n keyActiveShadow: '0 2px 6px rgba(0,0,0,0.3)',\r\n keyActiveScale: 1,\r\n transitionDuration: 150,\r\n enableBlur: false,\r\n blurAmount: 0,\r\n enableRipple: true,\r\n },\r\n}\r\n\r\n/**\r\n * 极简主题\r\n * 特点:无边框、超简洁、透明感\r\n */\r\nexport const minimalTheme: ThemeConfig = {\r\n name: 'minimal',\r\n displayName: 'Minimal',\r\n description: '极简风格 - 轻盈透明',\r\n isDark: false,\r\n colors: {\r\n background: 'rgba(250, 250, 250, 0.95)',\r\n keyBackground: 'transparent',\r\n keyColor: '#333333',\r\n keyActiveBackground: 'rgba(0, 0, 0, 0.08)',\r\n fnKeyBackground: 'transparent',\r\n fnKeyColor: '#888888',\r\n fnKeyActiveBackground: 'rgba(0, 0, 0, 0.08)',\r\n primaryBackground: '#333333',\r\n primaryActiveBackground: '#000000',\r\n primaryColor: '#ffffff',\r\n borderColor: '#eeeeee',\r\n dividerColor: '#eeeeee',\r\n },\r\n sizes: {\r\n keyHeight: 44,\r\n keyRadius: 12,\r\n keyGap: 8,\r\n fontSize: 17,\r\n fnFontSize: 13,\r\n padding: 12,\r\n },\r\n effects: {\r\n keyShadow: 'none',\r\n keyActiveShadow: 'none',\r\n keyActiveScale: 0.92,\r\n transitionDuration: 120,\r\n enableBlur: true,\r\n blurAmount: 30,\r\n enableRipple: false,\r\n },\r\n}\r\n\r\n/**\r\n * 深色主题\r\n * 特点:护眼、现代、高对比\r\n */\r\nexport const darkTheme: ThemeConfig = {\r\n name: 'dark',\r\n displayName: 'Dark',\r\n description: '深色模式 - 护眼舒适',\r\n isDark: true,\r\n colors: {\r\n background: '#1c1c1e',\r\n keyBackground: '#3a3a3c',\r\n keyColor: '#ffffff',\r\n keyActiveBackground: '#4a4a4c',\r\n fnKeyBackground: '#2c2c2e',\r\n fnKeyColor: '#ebebf5',\r\n fnKeyActiveBackground: '#3c3c3e',\r\n primaryBackground: '#0a84ff',\r\n primaryActiveBackground: '#0070e0',\r\n primaryColor: '#ffffff',\r\n borderColor: '#3a3a3c',\r\n dividerColor: '#3a3a3c',\r\n },\r\n sizes: {\r\n keyHeight: 45,\r\n keyRadius: 8,\r\n keyGap: 6,\r\n fontSize: 18,\r\n fnFontSize: 14,\r\n padding: 8,\r\n },\r\n effects: {\r\n keyShadow: '0 1px 2px rgba(0,0,0,0.4)',\r\n keyActiveShadow: '0 0 8px rgba(10,132,255,0.3)',\r\n keyActiveScale: 0.97,\r\n transitionDuration: 100,\r\n enableBlur: true,\r\n blurAmount: 20,\r\n enableRipple: false,\r\n },\r\n}\r\n\r\n/**\r\n * 所有预设主题\r\n */\r\nexport const presetThemes: Record<string, ThemeConfig> = {\r\n miui: miuiTheme,\r\n ios: iosTheme,\r\n material: materialTheme,\r\n minimal: minimalTheme,\r\n dark: darkTheme,\r\n}\r\n\r\n/**\r\n * 默认主题\r\n */\r\nexport const defaultTheme = miuiTheme\r\n","/**\r\n * 主题管理模块\r\n * @module themes\r\n */\r\n\r\nimport type { ThemeConfig, ThemeCSSVariables, ThemeName } from './types'\r\nimport { defaultTheme, presetThemes } from './presets'\r\n\r\nexport * from './presets'\r\nexport * from './types'\r\n\r\n/**\r\n * 自定义主题存储\r\n */\r\nconst customThemes: Map<string, ThemeConfig> = new Map()\r\n\r\n/**\r\n * 当前激活的主题\r\n */\r\nlet currentTheme: ThemeConfig = defaultTheme\r\n\r\n/**\r\n * 获取主题配置\r\n * @param name - 主题名称\r\n * @returns 主题配置,如果不存在则返回默认主题\r\n */\r\nexport function getTheme(name: ThemeName | string): ThemeConfig {\r\n return customThemes.get(name) || presetThemes[name] || defaultTheme\r\n}\r\n\r\n/**\r\n * 注册自定义主题\r\n * @param theme - 主题配置\r\n */\r\nexport function registerTheme(theme: ThemeConfig): void {\r\n customThemes.set(theme.name, theme)\r\n}\r\n\r\n/**\r\n * 获取所有可用主题\r\n * @returns 主题名称列表\r\n */\r\nexport function getAvailableThemes(): string[] {\r\n return [...Object.keys(presetThemes), ...customThemes.keys()]\r\n}\r\n\r\n/**\r\n * 获取所有主题配置\r\n * @returns 主题配置列表\r\n */\r\nexport function getAllThemes(): ThemeConfig[] {\r\n return [...Object.values(presetThemes), ...customThemes.values()]\r\n}\r\n\r\n/**\r\n * 设置当前主题\r\n * @param name - 主题名称\r\n */\r\nexport function setCurrentTheme(name: ThemeName | string): ThemeConfig {\r\n currentTheme = getTheme(name)\r\n return currentTheme\r\n}\r\n\r\n/**\r\n * 获取当前主题\r\n */\r\nexport function getCurrentTheme(): ThemeConfig {\r\n return currentTheme\r\n}\r\n\r\n/**\r\n * 将主题配置转换为 CSS 变量\r\n * @param theme - 主题配置\r\n * @returns CSS 变量对象\r\n */\r\nexport function themeToCSS(theme: ThemeConfig): ThemeCSSVariables {\r\n return {\r\n '--keyboard-bg': theme.colors.background,\r\n '--keyboard-key-bg': theme.colors.keyBackground,\r\n '--keyboard-key-color': theme.colors.keyColor,\r\n '--keyboard-key-active-bg': theme.colors.keyActiveBackground,\r\n '--keyboard-fn-key-bg': theme.colors.fnKeyBackground,\r\n '--keyboard-fn-key-color': theme.colors.fnKeyColor,\r\n '--keyboard-fn-key-active-bg': theme.colors.fnKeyActiveBackground,\r\n '--keyboard-primary-bg': theme.colors.primaryBackground,\r\n '--keyboard-primary-active-bg': theme.colors.primaryActiveBackground,\r\n '--keyboard-primary-color': theme.colors.primaryColor,\r\n '--keyboard-key-height': `${theme.sizes.keyHeight}px`,\r\n '--keyboard-key-radius': `${theme.sizes.keyRadius}px`,\r\n '--keyboard-key-gap': `${theme.sizes.keyGap}px`,\r\n '--keyboard-font-size': `${theme.sizes.fontSize}px`,\r\n '--keyboard-fn-font-size': `${theme.sizes.fnFontSize}px`,\r\n '--keyboard-padding': `${theme.sizes.padding}px`,\r\n '--keyboard-key-shadow': theme.effects.keyShadow,\r\n '--keyboard-mask-bg':\r\n 'color-mix(in srgb, var(--ld-black) 40%, var(--ld-transparent))',\r\n '--keyboard-transition-duration': `${theme.effects.transitionDuration}ms`,\r\n '--keyboard-border-color': theme.colors.borderColor,\r\n '--keyboard-divider-color': theme.colors.dividerColor,\r\n }\r\n}\r\n\r\n/**\r\n * 将 CSS 变量应用到元素\r\n * @param element - 目标元素\r\n * @param theme - 主题配置\r\n */\r\nexport function applyTheme(element: HTMLElement, theme: ThemeConfig): void {\r\n const cssVars = themeToCSS(theme)\r\n Object.entries(cssVars).forEach(([key, value]) => {\r\n if (value) {\r\n element.style.setProperty(key, value)\r\n }\r\n })\r\n\r\n // 添加主题类名\r\n element.classList.remove('keyboard-theme-light', 'keyboard-theme-dark')\r\n element.classList.add(\r\n theme.isDark ? 'keyboard-theme-dark' : 'keyboard-theme-light'\r\n )\r\n element.dataset.theme = theme.name\r\n}\r\n\r\n/**\r\n * 生成主题的内联样式字符串\r\n * @param theme - 主题配置\r\n * @returns 内联样式字符串\r\n */\r\nexport function generateThemeStyle(theme: ThemeConfig): string {\r\n const cssVars = themeToCSS(theme)\r\n return Object.entries(cssVars)\r\n .filter(([, value]) => value)\r\n .map(([key, value]) => `${key}: ${value}`)\r\n .join('; ')\r\n}\r\n\r\n/**\r\n * 合并主题配置\r\n * @param base - 基础主题\r\n * @param overrides - 覆盖配置\r\n * @returns 合并后的主题\r\n */\r\nexport function mergeTheme(\r\n base: ThemeConfig,\r\n overrides: Partial<ThemeConfig>\r\n): ThemeConfig {\r\n return {\r\n ...base,\r\n ...overrides,\r\n colors: { ...base.colors, ...overrides.colors },\r\n sizes: { ...base.sizes, ...overrides.sizes },\r\n effects: { ...base.effects, ...overrides.effects },\r\n }\r\n}\r\n\r\n/**\r\n * 创建自定义主题\r\n * @param name - 主题名称\r\n * @param baseTheme - 基础主题名称\r\n * @param customization - 自定义配置\r\n */\r\nexport function createTheme(\r\n name: string,\r\n baseTheme: ThemeName | string,\r\n customization: Partial<Omit<ThemeConfig, 'name'>>\r\n): ThemeConfig {\r\n const base = getTheme(baseTheme)\r\n const theme = mergeTheme(base, {\r\n ...customization,\r\n name,\r\n })\r\n registerTheme(theme)\r\n return theme\r\n}\r\n","/**\r\n * 弹出位置管理器\r\n * @module managers/position-manager\r\n */\r\n\r\nimport type {\r\n BoundingRect,\r\n PopupPlacement,\r\n PopupPositionConfig,\r\n PopupPositionResult,\r\n Position,\r\n} from '../types'\r\nimport { getViewportInfo, isMobile } from '../utils/device'\r\nimport { getBoundingRect } from '../utils/dom'\r\n\r\n/**\r\n * 默认位置配置\r\n */\r\nconst DEFAULT_CONFIG: Required<PopupPositionConfig> = {\r\n offset: { x: 0, y: 8 },\r\n autoAdjust: true,\r\n viewportPadding: 8,\r\n desktopPlacement: 'bottom',\r\n mobilePlacement: 'bottom-sheet',\r\n showMask: true,\r\n maskClosable: true,\r\n animationDuration: 300,\r\n}\r\n\r\nfunction mergeConfig(\r\n config: PopupPositionConfig = {}\r\n): Required<PopupPositionConfig> {\r\n return {\r\n ...DEFAULT_CONFIG,\r\n ...config,\r\n offset: {\r\n ...DEFAULT_CONFIG.offset,\r\n ...config.offset,\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * 位置管理器类\r\n * 计算键盘弹出层的位置,支持 PC 和移动端自适应\r\n */\r\nexport class PositionManager {\r\n private config: Required<PopupPositionConfig>\r\n\r\n constructor(config: PopupPositionConfig = {}) {\r\n this.config = mergeConfig(config)\r\n }\r\n\r\n /**\r\n * 更新配置\r\n */\r\n updateConfig(config: Partial<PopupPositionConfig>): void {\r\n this.config = mergeConfig({\r\n ...this.config,\r\n ...config,\r\n offset: { ...this.config.offset, ...config.offset },\r\n })\r\n }\r\n\r\n /**\r\n * 获取配置\r\n */\r\n getConfig(): Readonly<Required<PopupPositionConfig>> {\r\n return { ...this.config, offset: { ...this.config.offset } }\r\n }\r\n\r\n /**\r\n * 计算弹出位置\r\n * @param targetElement - 目标元素(如 input)\r\n * @param popupSize - 弹出层尺寸\r\n * @param popupSize.width - Popup width\r\n * @param popupSize.height - Popup height\r\n * @returns 位置计算结果\r\n */\r\n calculate(\r\n targetElement: HTMLElement | null,\r\n popupSize: { width: number; height: number }\r\n ): PopupPositionResult {\r\n const viewport = getViewportInfo()\r\n const isMobileDevice = isMobile()\r\n\r\n // 移动端使用 bottom-sheet\r\n if (isMobileDevice && this.config.mobilePlacement === 'bottom-sheet') {\r\n return this.calculateBottomSheet(viewport, popupSize)\r\n }\r\n\r\n // PC 端或移动端非 bottom-sheet\r\n if (!targetElement) {\r\n // 无目标元素,居中显示\r\n return this.calculateCentered(viewport, popupSize)\r\n }\r\n\r\n const targetRect = getBoundingRect(targetElement)\r\n const placement = isMobileDevice\r\n ? this.config.mobilePlacement\r\n : this.config.desktopPlacement\r\n\r\n // bottom-sheet 已经在前面处理,这里只会是 'bottom' 或 'top'\r\n const relativePlace = placement === 'bottom-sheet' ? 'bottom' : placement\r\n return this.calculateRelativeToTarget(\r\n targetRect,\r\n popupSize,\r\n viewport,\r\n relativePlace\r\n )\r\n }\r\n\r\n /**\r\n * 计算 bottom-sheet 位置(移动端从底部滑出)\r\n */\r\n private calculateBottomSheet(\r\n viewport: {\r\n width: number\r\n height: number\r\n scrollY: number\r\n safeArea?: { bottom: number }\r\n },\r\n popupSize: { width: number; height: number }\r\n ): PopupPositionResult {\r\n const safeAreaBottom = viewport.safeArea?.bottom ?? 0\r\n const maxHeight = Math.max(0, viewport.height * 0.6 - safeAreaBottom)\r\n const visibleHeight = Math.min(Math.max(0, popupSize.height), maxHeight)\r\n\r\n return {\r\n position: {\r\n x: 0,\r\n y: Math.max(0, viewport.height - visibleHeight - safeAreaBottom),\r\n },\r\n placement: 'bottom-sheet',\r\n flipped: false,\r\n maxHeight,\r\n maxWidth: Math.max(0, viewport.width),\r\n transform: 'translateY(0)',\r\n }\r\n }\r\n\r\n /**\r\n * 计算居中位置\r\n */\r\n private calculateCentered(\r\n viewport: { width: number; height: number },\r\n popupSize: { width: number; height: number }\r\n ): PopupPositionResult {\r\n return {\r\n position: {\r\n x: Math.max(0, (viewport.width - popupSize.width) / 2),\r\n y: Math.max(0, (viewport.height - popupSize.height) / 2),\r\n },\r\n placement: 'bottom',\r\n flipped: false,\r\n }\r\n }\r\n\r\n /**\r\n * 计算相对于目标元素的位置\r\n */\r\n private calculateRelativeToTarget(\r\n targetRect: BoundingRect,\r\n popupSize: { width: number; height: number },\r\n viewport: {\r\n width: number\r\n height: number\r\n scrollX: number\r\n scrollY: number\r\n },\r\n preferredPlacement: Exclude<PopupPlacement, 'bottom-sheet'>\r\n ): PopupPositionResult {\r\n const { offset, viewportPadding, autoAdjust } = this.config\r\n\r\n let position: Position\r\n let placement = preferredPlacement\r\n let flipped = false\r\n\r\n // 计算 bottom 位置(左对齐)\r\n const bottomPosition: Position = {\r\n x: targetRect.x + (offset.x ?? 0),\r\n y: targetRect.y + targetRect.height + (offset.y ?? 8),\r\n }\r\n\r\n // 计算 top 位置(左对齐)\r\n const topPosition: Position = {\r\n x: targetRect.x + (offset.x ?? 0),\r\n y: targetRect.y - popupSize.height - (offset.y ?? 8),\r\n }\r\n\r\n if (preferredPlacement === 'bottom') {\r\n position = bottomPosition\r\n\r\n // 检查是否需要翻转到顶部\r\n if (\r\n autoAdjust &&\r\n position.y + popupSize.height > viewport.height - viewportPadding\r\n ) {\r\n // 检查顶部是否有足够空间\r\n if (topPosition.y >= viewportPadding) {\r\n position = topPosition\r\n placement = 'top'\r\n flipped = true\r\n }\r\n }\r\n } else {\r\n position = topPosition\r\n\r\n // 检查是否需要翻转到底部\r\n if (autoAdjust && position.y < viewportPadding) {\r\n // 检查底部是否有足够空间\r\n if (\r\n bottomPosition.y + popupSize.height <=\r\n viewport.height - viewportPadding\r\n ) {\r\n position = bottomPosition\r\n placement = 'bottom'\r\n flipped = true\r\n }\r\n }\r\n }\r\n\r\n // 水平方向调整,确保不超出视口\r\n if (autoAdjust) {\r\n const maxX = Math.max(\r\n viewportPadding,\r\n viewport.width - popupSize.width - viewportPadding\r\n )\r\n position.x = Math.min(Math.max(position.x, viewportPadding), maxX)\r\n }\r\n\r\n // 计算最大可用高度\r\n const maxHeight =\r\n placement === 'bottom'\r\n ? viewport.height - position.y - viewportPadding\r\n : targetRect.y - viewportPadding\r\n\r\n return {\r\n position,\r\n placement,\r\n flipped,\r\n maxHeight: Math.max(0, maxHeight),\r\n maxWidth: Math.max(0, viewport.width - viewportPadding * 2),\r\n }\r\n }\r\n\r\n /**\r\n * 获取弹出层初始样式(用于动画)\r\n */\r\n getInitialStyles(placement: PopupPlacement): Partial<CSSStyleDeclaration> {\r\n switch (placement) {\r\n case 'bottom-sheet':\r\n return {\r\n transform: 'translateY(100%)',\r\n opacity: '1',\r\n }\r\n case 'bottom':\r\n return {\r\n transform: 'translateY(calc(-1 * var(--ld-px-10)))',\r\n opacity: '0',\r\n }\r\n case 'top':\r\n return {\r\n transform: 'translateY(var(--ld-px-10))',\r\n opacity: '0',\r\n }\r\n default:\r\n return {\r\n opacity: '0',\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 获取弹出层最终样式(动画结束)\r\n */\r\n getFinalStyles(_placement: PopupPlacement): Partial<CSSStyleDeclaration> {\r\n return {\r\n transform: 'translateY(0)',\r\n opacity: '1',\r\n }\r\n }\r\n\r\n /**\r\n * 获取弹出层退出样式\r\n */\r\n getExitStyles(_placement: PopupPlacement): Partial<CSSStyleDeclaration> {\r\n return this.getInitialStyles(_placement)\r\n }\r\n\r\n /**\r\n * 获取动画时长\r\n */\r\n getAnimationDuration(): number {\r\n return this.config.animationDuration\r\n }\r\n\r\n /**\r\n * 检查是否显示遮罩\r\n */\r\n shouldShowMask(): boolean {\r\n return isMobile() && this.config.showMask\r\n }\r\n\r\n /**\r\n * 检查遮罩是否可点击关闭\r\n */\r\n isMaskClosable(): boolean {\r\n return this.config.maskClosable\r\n }\r\n}\r\n\r\n/**\r\n * 创建位置管理器实例\r\n */\r\nexport function createPositionManager(\r\n config?: PopupPositionConfig\r\n): PositionManager {\r\n return new PositionManager(config)\r\n}\r\n","/**\r\n * 键盘 DOM 渲染器\r\n * 框架无关的键盘渲染器,用于原生 JS 项目\r\n * @module managers/keyboard-renderer\r\n */\r\n\r\nimport type { ThemeConfig } from '../themes/types'\r\nimport type {\r\n KeyboardConfig,\r\n KeyboardOptions,\r\n KeyboardType,\r\n KeyDefinition,\r\n PopupPositionConfig,\r\n} from '../types'\r\nimport { defaultTheme, getTheme, themeToCSS } from '../themes'\r\nimport { isMobile } from '../utils/device'\r\nimport { onClickOutside, sanitizeSvgIcon } from '../utils/dom'\r\nimport { KeyboardManager } from './keyboard-manager'\r\nimport { PositionManager } from './position-manager'\r\n\r\n/**\r\n * 渲染器配置\r\n */\r\nexport interface KeyboardRendererOptions extends KeyboardOptions {\r\n /** 挂载容器(默认 document.body) */\r\n container?: HTMLElement\r\n /** 主题名称或主题配置 */\r\n theme?: string | ThemeConfig\r\n /** 弹出层配置 */\r\n position?: PopupPositionConfig\r\n /** 点击外部关闭 */\r\n closeOnClickOutside?: boolean\r\n /** 确认回调 */\r\n onConfirm?: (value: string) => void\r\n /** 输入变化回调 */\r\n onInput?: (value: string) => void\r\n /** 关闭回调 */\r\n onClose?: () => void\r\n}\r\n\r\ninterface RendererStyleEntry {\r\n element: HTMLStyleElement\r\n users: number\r\n}\r\n\r\nconst rendererStyles = new WeakMap<Document, RendererStyleEntry>()\r\n\r\n/**\r\n * 键盘 DOM 渲染器\r\n * 提供完整的键盘 DOM 创建、事件绑定、位置管理\r\n */\r\nexport class KeyboardRenderer {\r\n /** 键盘管理器 */\r\n readonly manager: KeyboardManager\r\n\r\n /** 位置管理器 */\r\n private positionManager: PositionManager\r\n\r\n /** 配置 */\r\n private options: KeyboardRendererOptions\r\n\r\n /** DOM 元素 */\r\n private rootEl: HTMLElement | null = null\r\n private maskEl: HTMLElement | null = null\r\n private keyboardEl: HTMLElement | null = null\r\n\r\n /** 挂载容器 */\r\n private container: HTMLElement\r\n\r\n /** 主题配置 */\r\n private theme: ThemeConfig\r\n\r\n /** 当前目标元素 */\r\n private targetEl: HTMLInputElement | HTMLTextAreaElement | null = null\r\n\r\n /** 清理函数 */\r\n private cleanupFns: Array<() => void> = []\r\n private inputCleanupFns = new Set<() => void>()\r\n private styleDocument: Document | null = null\r\n\r\n /** 是否已销毁 */\r\n private destroyed = false\r\n\r\n constructor(options: KeyboardRendererOptions = {}) {\r\n this.options = options\r\n const container =\r\n options.container ??\r\n (typeof document !== 'undefined' ? document.body : null)\r\n if (!container) {\r\n throw new Error(\r\n '[KeyboardRenderer] A DOM container is required in non-browser environments'\r\n )\r\n }\r\n this.container = container\r\n this.manager = new KeyboardManager(options)\r\n this.positionManager = new PositionManager(options.position)\r\n\r\n // 解析主题\r\n if (typeof options.theme === 'string') {\r\n this.theme = getTheme(options.theme)\r\n } else if (options.theme) {\r\n this.theme = options.theme\r\n } else {\r\n this.theme = defaultTheme\r\n }\r\n\r\n // 绑定事件\r\n this.setupEvents()\r\n }\r\n\r\n /**\r\n * 设置事件监听\r\n */\r\n private setupEvents(): void {\r\n this.manager.on('stateChange', state => {\r\n if (state.visible) {\r\n this.render()\r\n } else {\r\n this.unmount()\r\n }\r\n })\r\n\r\n this.manager.on('input', ({ value }) => {\r\n this.options.onInput?.(value)\r\n })\r\n\r\n this.manager.on('confirm', ({ value }) => {\r\n this.options.onConfirm?.(value)\r\n })\r\n }\r\n\r\n /**\r\n * 打开键盘\r\n */\r\n open(target?: HTMLInputElement | HTMLTextAreaElement): void {\r\n if (this.destroyed) return\r\n this.targetEl = target ?? null\r\n this.manager.show(target)\r\n }\r\n\r\n /**\r\n * 关闭键盘\r\n */\r\n close(): void {\r\n if (this.destroyed) return\r\n const wasVisible = this.manager.getState().visible\r\n this.manager.hide()\r\n if (wasVisible) this.options.onClose?.()\r\n }\r\n\r\n /**\r\n * 切换键盘类型\r\n */\r\n switchType(type: KeyboardType | string): void {\r\n if (this.destroyed) return\r\n this.manager.switchType(type)\r\n }\r\n\r\n /**\r\n * 设置主题\r\n */\r\n setTheme(theme: string | ThemeConfig): void {\r\n if (this.destroyed) return\r\n if (typeof theme === 'string') {\r\n this.theme = getTheme(theme)\r\n } else {\r\n this.theme = theme\r\n }\r\n if (this.manager.getState().visible) {\r\n this.render()\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前值\r\n */\r\n getValue(): string {\r\n return this.manager.getState().value\r\n }\r\n\r\n /**\r\n * 设置值\r\n */\r\n setValue(value: string): void {\r\n if (this.destroyed) return\r\n this.manager.setValue(value)\r\n }\r\n\r\n /**\r\n * 渲染键盘 DOM\r\n */\r\n private render(): void {\r\n if (this.destroyed) return\r\n const layout = this.manager.getLayout()\r\n if (!layout) return\r\n\r\n // 清理旧的 DOM\r\n this.unmount()\r\n\r\n // 创建根元素\r\n this.rootEl = document.createElement('div')\r\n this.rootEl.className = 'lk-renderer-root'\r\n\r\n const isMobileDevice = isMobile()\r\n\r\n // 移动端创建遮罩\r\n if (isMobileDevice) {\r\n this.maskEl = document.createElement('div')\r\n this.maskEl.className = 'lk-mask'\r\n this.maskEl.addEventListener('click', () => {\r\n if (this.positionManager.isMaskClosable()) this.close()\r\n })\r\n this.rootEl.appendChild(this.maskEl)\r\n }\r\n\r\n // 创建键盘容器\r\n this.keyboardEl = document.createElement('div')\r\n this.keyboardEl.className = `lk-popup lk-popup--${isMobileDevice ? 'mobile' : 'desktop'}`\r\n\r\n // 应用主题 CSS 变量\r\n const cssVars = themeToCSS(this.theme)\r\n const keyboardElement = this.keyboardEl\r\n if (!keyboardElement) return\r\n Object.entries(cssVars).forEach(([key, value]) => {\r\n if (value) {\r\n keyboardElement.style.setProperty(key, value)\r\n }\r\n })\r\n\r\n // 渲染键盘内容\r\n const contentEl = this.renderKeyboard(layout)\r\n this.keyboardEl.appendChild(contentEl)\r\n\r\n this.rootEl.appendChild(this.keyboardEl)\r\n this.container.appendChild(this.rootEl)\r\n\r\n // 计算位置\r\n if (!isMobileDevice && this.targetEl) {\r\n const rect = this.keyboardEl.getBoundingClientRect()\r\n const result = this.positionManager.calculate(this.targetEl, {\r\n width: rect.width,\r\n height: rect.height,\r\n })\r\n this.keyboardEl.style.position = 'fixed'\r\n this.keyboardEl.style.left = `${result.position.x}px`\r\n this.keyboardEl.style.top = `${result.position.y}px`\r\n this.keyboardEl.style.zIndex = '10000'\r\n } else if (isMobileDevice) {\r\n this.keyboardEl.style.position = 'fixed'\r\n this.keyboardEl.style.left = '0'\r\n this.keyboardEl.style.right = '0'\r\n this.keyboardEl.style.bottom = '0'\r\n this.keyboardEl.style.zIndex = '10000'\r\n }\r\n\r\n // 添加动画类\r\n requestAnimationFrame(() => {\r\n this.keyboardEl?.classList.add('lk-popup--visible')\r\n this.maskEl?.classList.add('lk-mask--visible')\r\n })\r\n\r\n // 点击外部关闭\r\n if (this.options.closeOnClickOutside !== false && this.keyboardEl) {\r\n const cleanup = onClickOutside(this.keyboardEl, event => {\r\n if (\r\n this.targetEl &&\r\n event.target instanceof Node &&\r\n this.targetEl.contains(event.target)\r\n )\r\n return\r\n this.close()\r\n })\r\n this.cleanupFns.push(cleanup)\r\n }\r\n\r\n // 注入样式\r\n this.injectStyles()\r\n }\r\n\r\n /**\r\n * 渲染键盘内容\r\n */\r\n private renderKeyboard(layout: KeyboardConfig): HTMLElement {\r\n const el = document.createElement('div')\r\n el.className = 'lk-keyboard'\r\n\r\n const state = this.manager.getState()\r\n\r\n layout.rows.forEach(row => {\r\n const rowEl = document.createElement('div')\r\n rowEl.className = `lk-row ${row.className || ''}`\r\n\r\n const isNumpad = row.className === 'numpad-row'\r\n\r\n row.keys.forEach(key => {\r\n const wrapperEl = document.createElement('div')\r\n wrapperEl.className = 'lk-key-wrapper'\r\n\r\n if (isNumpad) {\r\n wrapperEl.style.flex = String(key.width ?? 1)\r\n } else if (key.width) {\r\n const baseW = 36\r\n const gap = this.theme.sizes?.keyGap ?? 6\r\n const w = baseW * key.width + (key.width - 1) * gap\r\n wrapperEl.style.width = `${w}px`\r\n }\r\n\r\n const btnEl = document.createElement('button')\r\n btnEl.type = 'button'\r\n btnEl.className = this.getKeyClass(key, state.isUpperCase)\r\n\r\n if (key.disabled) {\r\n btnEl.disabled = true\r\n }\r\n\r\n // 内容\r\n if (key.icon) {\r\n const safeIcon = sanitizeSvgIcon(key.icon)\r\n if (safeIcon) btnEl.innerHTML = safeIcon\r\n else btnEl.textContent = key.icon\r\n } else {\r\n const label =\r\n typeof key.label === 'string'\r\n ? key.label\r\n : state.isUpperCase\r\n ? key.label.upper\r\n : key.label.lower\r\n btnEl.textContent = label\r\n }\r\n\r\n // 事件\r\n const handler = (e: Event) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n if (!key.disabled) {\r\n this.manager.handleKey(key)\r\n }\r\n }\r\n\r\n btnEl.addEventListener('mousedown', handler)\r\n btnEl.addEventListener('touchstart', handler, { passive: false })\r\n\r\n wrapperEl.appendChild(btnEl)\r\n rowEl.appendChild(wrapperEl)\r\n })\r\n\r\n el.appendChild(rowEl)\r\n })\r\n\r\n return el\r\n }\r\n\r\n /**\r\n * 获取按键 CSS 类名\r\n */\r\n private getKeyClass(key: KeyDefinition, isUpperCase: boolean): string {\r\n const classes = ['lk-key', `lk-key--${key.type}`]\r\n if (key.className) classes.push(key.className)\r\n if (key.disabled) classes.push('lk-key--disabled')\r\n if (key.type === 'shift' && isUpperCase) classes.push('lk-key--active')\r\n return classes.join(' ')\r\n }\r\n\r\n /**\r\n * 卸载 DOM\r\n */\r\n private unmount(): void {\r\n this.cleanupFns.forEach(fn => fn())\r\n this.cleanupFns = []\r\n\r\n if (this.rootEl && this.rootEl.parentNode) {\r\n this.rootEl.parentNode.removeChild(this.rootEl)\r\n }\r\n this.rootEl = null\r\n this.maskEl = null\r\n this.keyboardEl = null\r\n }\r\n\r\n /**\r\n * 注入样式(单例)\r\n */\r\n private injectStyles(): void {\r\n const styleDocument = this.container.ownerDocument\r\n if (this.styleDocument === styleDocument) return\r\n const existing = rendererStyles.get(styleDocument)\r\n if (existing) {\r\n existing.users += 1\r\n this.styleDocument = styleDocument\r\n return\r\n }\r\n\r\n const style = styleDocument.createElement('style')\r\n style.textContent = `\r\n .lk-renderer-root { font-family: var(--ld-font-family); }\r\n .lk-mask { position: fixed; inset: 0; z-index: 9999; background: var(--keyboard-mask-bg); opacity: 0; transition: opacity var(--ld-duration-fast); }\r\n .lk-mask--visible { opacity: 1; }\r\n .lk-popup { overflow: hidden; background: var(--keyboard-bg); box-shadow: var(--ld-shadow-md, none); transform: translateY(var(--ld-px-20)); opacity: 0; transition: transform var(--ld-duration-fast), opacity var(--ld-duration-fast); }\r\n .lk-popup--visible { transform: translateY(0); opacity: 1; }\r\n .lk-popup--desktop { min-width: var(--ld-px-280); border-radius: var(--ld-radius-lg); box-shadow: var(--ld-shadow-lg, none); }\r\n .lk-popup--mobile { border-top-left-radius: var(--ld-radius-lg); border-top-right-radius: var(--ld-radius-lg); padding-bottom: env(safe-area-inset-bottom, var(--ld-px-0)); }\r\n .lk-keyboard { display: flex; flex-direction: column; gap: var(--keyboard-key-gap); padding: var(--keyboard-padding); user-select: none; -webkit-user-select: none; font-family: var(--ld-font-family); }\r\n .lk-row { display: flex; justify-content: center; gap: var(--keyboard-key-gap); padding: 0 var(--ld-px-2); }\r\n .lk-row.numpad-row { justify-content: stretch; }\r\n .lk-row.numpad-row .lk-key-wrapper { flex: 1; }\r\n .lk-key-wrapper { position: relative; display: inline-flex; }\r\n .lk-key { display: inline-flex; align-items: center; justify-content: center; width: 100%; min-width: var(--ld-px-32); height: var(--keyboard-key-height); padding: 0 var(--ld-spacing-xs); border: 0; border-radius: var(--keyboard-key-radius); background: var(--keyboard-key-bg); color: var(--keyboard-key-color); font-size: var(--keyboard-font-size); font-weight: 500; cursor: pointer; touch-action: manipulation; box-shadow: var(--keyboard-key-shadow); transition: background-color var(--ld-duration-fast), transform var(--ld-duration-fast); }\r\n .lk-key:active { background: var(--keyboard-key-active-bg); transform: scale(0.95); }\r\n .lk-key--disabled { opacity: 0.4; cursor: not-allowed; }\r\n .lk-key--disabled:active { transform: none; background: var(--keyboard-key-bg); }\r\n .lk-key--backspace, .lk-key--shift, .lk-key--tab, .lk-key--clear, .lk-key--close { background: var(--keyboard-fn-key-bg); color: var(--keyboard-fn-key-color); font-size: var(--keyboard-fn-font-size); }\r\n .lk-key--backspace:active, .lk-key--shift:active, .lk-key--tab:active, .lk-key--clear:active, .lk-key--close:active { background: var(--keyboard-fn-key-active-bg); }\r\n .lk-key--active { background: var(--keyboard-key-active-bg) !important; color: var(--ld-text-inverse) !important; }\r\n .lk-key--done, .lk-key--enter { background: var(--keyboard-primary-bg); color: var(--keyboard-primary-color); font-size: var(--keyboard-fn-font-size); }\r\n .lk-key--done:active, .lk-key--enter:active { background: var(--keyboard-primary-active-bg); }\r\n .lk-key--space { background: var(--keyboard-key-bg); }\r\n .lk-key svg { pointer-events: none; }\r\n `\r\n style.id = 'lk-renderer-styles'\r\n styleDocument.head?.appendChild(style)\r\n rendererStyles.set(styleDocument, { element: style, users: 1 })\r\n this.styleDocument = styleDocument\r\n }\r\n\r\n /**\r\n * 绑定到输入框(聚焦时自动打开键盘)\r\n */\r\n bindInput(input: HTMLInputElement | HTMLTextAreaElement): () => void {\r\n if (this.destroyed) return () => undefined\r\n const handleFocus = () => this.open(input)\r\n input.addEventListener('focus', handleFocus)\r\n\r\n // 阻止移动端原生键盘\r\n input.setAttribute('readonly', 'readonly')\r\n input.style.caretColor = 'transparent'\r\n\r\n let cleaned = false\r\n const cleanup = () => {\r\n if (cleaned) return\r\n cleaned = true\r\n input.removeEventListener('focus', handleFocus)\r\n input.removeAttribute('readonly')\r\n input.style.caretColor = ''\r\n }\r\n this.inputCleanupFns.add(cleanup)\r\n return cleanup\r\n }\r\n\r\n /**\r\n * 销毁渲染器\r\n */\r\n destroy(): void {\r\n if (this.destroyed) return\r\n this.destroyed = true\r\n this.unmount()\r\n this.inputCleanupFns.forEach(cleanup => cleanup())\r\n this.inputCleanupFns.clear()\r\n this.manager.destroy()\r\n\r\n // 移除样式\r\n if (this.styleDocument) {\r\n const entry = rendererStyles.get(this.styleDocument)\r\n if (entry) {\r\n entry.users -= 1\r\n if (entry.users <= 0) {\r\n entry.element.remove()\r\n rendererStyles.delete(this.styleDocument)\r\n }\r\n }\r\n this.styleDocument = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 创建键盘渲染器\r\n */\r\nexport function createKeyboardRenderer(\r\n options?: KeyboardRendererOptions\r\n): KeyboardRenderer {\r\n return new KeyboardRenderer(options)\r\n}\r\n","/**\r\n * 输入格式化工具\r\n * @module utils/formatters\r\n */\r\n\r\n/**\r\n * 格式化手机号 (3-4-4)\r\n * @example formatPhone('13812345678') => '138 1234 5678'\r\n */\r\nexport function formatPhone(value: string): string {\r\n const digits = value.replace(/\\D/g, '').slice(0, 11)\r\n if (digits.length <= 3) return digits\r\n if (digits.length <= 7) return `${digits.slice(0, 3)} ${digits.slice(3)}`\r\n return `${digits.slice(0, 3)} ${digits.slice(3, 7)} ${digits.slice(7)}`\r\n}\r\n\r\n/**\r\n * 格式化银行卡号 (4-4-4-4-3)\r\n * @example formatBankCard('6222021234567890123') => '6222 0212 3456 7890 123'\r\n */\r\nexport function formatBankCard(value: string): string {\r\n const digits = value.replace(/\\D/g, '').slice(0, 19)\r\n return digits.replace(/(\\d{4})(?=\\d)/g, '$1 ')\r\n}\r\n\r\n/**\r\n * 格式化金额(限制小数位数)\r\n * @param value - 输入值\r\n * @param decimalPlaces - 小数位数,默认 2\r\n */\r\nexport function formatAmount(value: string, decimalPlaces: number = 2): string {\r\n // 移除非数字和小数点\r\n let result = value.replace(/[^\\d.]/g, '')\r\n\r\n // 只保留第一个小数点\r\n const parts = result.split('.')\r\n if (parts.length > 2) {\r\n result = `${parts[0]}.${parts.slice(1).join('')}`\r\n }\r\n\r\n // 限制小数位数\r\n if (parts.length === 2 && parts[1].length > decimalPlaces) {\r\n result = `${parts[0]}.${parts[1].slice(0, decimalPlaces)}`\r\n }\r\n\r\n // 移除前导零(保留 0.xx 格式)\r\n if (result.length > 1 && result.startsWith('0') && result[1] !== '.') {\r\n result = result.replace(/^0+/, '') || '0'\r\n }\r\n\r\n return result\r\n}\r\n\r\n/**\r\n * 格式化身份证号(自动大写 X)\r\n */\r\nexport function formatIdCard(value: string): string {\r\n return value\r\n .replace(/[^\\dX]/gi, '')\r\n .slice(0, 18)\r\n .toUpperCase()\r\n}\r\n\r\n/**\r\n * 格式化车牌号\r\n */\r\nexport function formatLicensePlate(value: string): string {\r\n return value.toUpperCase().slice(0, 8)\r\n}\r\n\r\n/**\r\n * 格式化验证码(纯数字)\r\n * @param value - 输入值\r\n * @param length - 验证码长度,默认 6\r\n */\r\nexport function formatVerifyCode(value: string, length: number = 6): string {\r\n return value.replace(/\\D/g, '').slice(0, length)\r\n}\r\n\r\n/**\r\n * 通用格式化器注册表\r\n */\r\nexport type FormatterFunction = (value: string) => string\r\n\r\nconst formatters: Map<string, FormatterFunction> = new Map([\r\n ['phone', formatPhone],\r\n ['bankcard', formatBankCard],\r\n ['idcard', formatIdCard],\r\n ['license-plate', formatLicensePlate],\r\n ['verifycode', formatVerifyCode],\r\n])\r\n\r\n/**\r\n * 注册自定义格式化器\r\n */\r\nexport function registerFormatter(\r\n name: string,\r\n formatter: FormatterFunction\r\n): void {\r\n formatters.set(name, formatter)\r\n}\r\n\r\n/**\r\n * 获取格式化器\r\n */\r\nexport function getFormatter(name: string): FormatterFunction | undefined {\r\n return formatters.get(name)\r\n}\r\n\r\n/**\r\n * 应用格式化\r\n */\r\nexport function applyFormatter(name: string, value: string): string {\r\n const formatter = formatters.get(name)\r\n return formatter ? formatter(value) : value\r\n}\r\n","/**\r\n * 随机工具函数\r\n * @module utils/random\r\n */\r\n\r\nimport type { KeyboardConfig, KeyboardRow, KeyDefinition } from '../types'\r\n\r\n/**\r\n * Fisher-Yates 洗牌算法\r\n * @param array - 要洗牌的数组\r\n * @returns 洗牌后的新数组\r\n */\r\nexport function shuffleArray<T>(array: T[]): T[] {\r\n const result = [...array]\r\n for (let i = result.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1))\r\n ;[result[i], result[j]] = [result[j], result[i]]\r\n }\r\n return result\r\n}\r\n\r\n/**\r\n * 生成随机数字数组 (0-9)\r\n */\r\nexport function getRandomNumbers(): string[] {\r\n return shuffleArray(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])\r\n}\r\n\r\n/**\r\n * 生成随机字母数组 (A-Z)\r\n */\r\nexport function getRandomLetters(): string[] {\r\n const letters = Array.from({ length: 26 }, (_, i) =>\r\n String.fromCharCode(65 + i)\r\n )\r\n return shuffleArray(letters)\r\n}\r\n\r\n/**\r\n * 生成随机数字+字母数组\r\n */\r\nexport function getRandomAlphanumeric(): string[] {\r\n const numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']\r\n const letters = Array.from({ length: 26 }, (_, i) =>\r\n String.fromCharCode(65 + i)\r\n )\r\n return shuffleArray([...numbers, ...letters])\r\n}\r\n\r\n/**\r\n * 创建字符按键\r\n */\r\nfunction createCharKey(char: string, index: number): KeyDefinition {\r\n return {\r\n id: `random-${char}-${index}`,\r\n type: 'char',\r\n label: char,\r\n value: char,\r\n className: 'key-random',\r\n }\r\n}\r\n\r\n/**\r\n * 将字符数组分成行\r\n */\r\nfunction chunkArray<T>(array: T[], chunkSize: number): T[][] {\r\n const chunks: T[][] = []\r\n for (let i = 0; i < array.length; i += chunkSize) {\r\n chunks.push(array.slice(i, i + chunkSize))\r\n }\r\n return chunks\r\n}\r\n\r\n/**\r\n * 生成随机数字键盘布局\r\n * @param options - 配置选项\r\n * @param options.keysPerRow - Number of keys per row\r\n * @param options.includeBackspace - Whether to include backspace\r\n * @param options.includeDone - Whether to include done\r\n * @param options.includeClear - Whether to include clear\r\n */\r\nexport function createRandomNumberLayout(options?: {\r\n /** 每行按键数 */\r\n keysPerRow?: number\r\n /** 是否包含退格键 */\r\n includeBackspace?: boolean\r\n /** 是否包含完成键 */\r\n includeDone?: boolean\r\n /** 是否包含清空键 */\r\n includeClear?: boolean\r\n}): KeyboardConfig {\r\n const {\r\n keysPerRow = 3,\r\n includeBackspace = true,\r\n includeDone = true,\r\n includeClear = false,\r\n } = options || {}\r\n\r\n const randomNumbers = getRandomNumbers()\r\n const numberKeys = randomNumbers.map((n, i) => createCharKey(n, i))\r\n const chunks = chunkArray(numberKeys, keysPerRow)\r\n\r\n const rows: KeyboardRow[] = chunks.map(keys => ({\r\n className: 'numpad-row',\r\n keys,\r\n }))\r\n\r\n // 添加功能键行\r\n const fnKeys: KeyDefinition[] = []\r\n\r\n if (includeClear) {\r\n fnKeys.push({\r\n id: 'clear',\r\n type: 'clear',\r\n label: '清空',\r\n className: 'key-clear key-fn',\r\n })\r\n }\r\n\r\n if (includeBackspace) {\r\n fnKeys.push({\r\n id: 'backspace',\r\n type: 'backspace',\r\n label: '⌫',\r\n className: 'key-backspace key-fn',\r\n })\r\n }\r\n\r\n if (includeDone) {\r\n fnKeys.push({\r\n id: 'done',\r\n type: 'done',\r\n label: '确定',\r\n className: 'key-done key-fn',\r\n })\r\n }\r\n\r\n if (fnKeys.length > 0) {\r\n rows.push({\r\n className: 'numpad-row',\r\n keys: fnKeys,\r\n })\r\n }\r\n\r\n return {\r\n type: 'custom',\r\n name: '随机数字键盘',\r\n supportShift: false,\r\n rows,\r\n data: {\r\n isRandom: true,\r\n randomType: 'number',\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * 生成4x3随机数字键盘(密码输入常用)\r\n */\r\nexport function createRandomPinLayout(options?: {\r\n /** 是否包含退格键 */\r\n includeBackspace?: boolean\r\n /** 是否包含完成键 */\r\n includeDone?: boolean\r\n}): KeyboardConfig {\r\n const { includeBackspace = true, includeDone = true } = options || {}\r\n\r\n const randomNumbers = getRandomNumbers()\r\n\r\n // 前9个数字 (3x3)\r\n const rows: KeyboardRow[] = [\r\n {\r\n className: 'numpad-row',\r\n keys: randomNumbers.slice(0, 3).map((n, i) => createCharKey(n, i)),\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: randomNumbers.slice(3, 6).map((n, i) => createCharKey(n, i + 3)),\r\n },\r\n {\r\n className: 'numpad-row',\r\n keys: randomNumbers.slice(6, 9).map((n, i) => createCharKey(n, i + 6)),\r\n },\r\n ]\r\n\r\n // 最后一行:功能键 + 0 + 功能键\r\n const lastRow: KeyDefinition[] = []\r\n\r\n if (includeBackspace) {\r\n lastRow.push({\r\n id: 'backspace',\r\n type: 'backspace',\r\n label: '⌫',\r\n className: 'key-backspace key-fn',\r\n })\r\n } else {\r\n lastRow.push({\r\n id: 'empty-1',\r\n type: 'char',\r\n label: '',\r\n value: '',\r\n disabled: true,\r\n className: 'key-placeholder',\r\n })\r\n }\r\n\r\n lastRow.push(createCharKey(randomNumbers[9], 9))\r\n\r\n if (includeDone) {\r\n lastRow.push({\r\n id: 'done',\r\n type: 'done',\r\n label: '确定',\r\n className: 'key-done key-fn',\r\n })\r\n } else {\r\n lastRow.push({\r\n id: 'empty-2',\r\n type: 'char',\r\n label: '',\r\n value: '',\r\n disabled: true,\r\n className: 'key-placeholder',\r\n })\r\n }\r\n\r\n rows.push({\r\n className: 'numpad-row',\r\n keys: lastRow,\r\n })\r\n\r\n return {\r\n type: 'custom',\r\n name: '随机PIN键盘',\r\n supportShift: false,\r\n rows,\r\n data: {\r\n isRandom: true,\r\n randomType: 'pin',\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * 生成随机字母键盘布局\r\n * 默认使用 QWERTY 风格行分布 (10/9/7),看起来像真实键盘\r\n */\r\nexport function createRandomLetterLayout(options?: {\r\n /** 是否大写 */\r\n uppercase?: boolean\r\n /** 行分布,默认 [10, 9, 7] 模拟 QWERTY 布局 */\r\n rowDistribution?: number[]\r\n}): KeyboardConfig {\r\n const { uppercase = true, rowDistribution = [10, 9, 7] } = options || {}\r\n\r\n let randomLetters = getRandomLetters()\r\n if (!uppercase) {\r\n randomLetters = randomLetters.map(l => l.toLowerCase())\r\n }\r\n\r\n const letterKeys = randomLetters.map((l, i) => createCharKey(l, i))\r\n\r\n // 按行分布切割\r\n const rows: KeyboardRow[] = []\r\n let offset = 0\r\n for (const count of rowDistribution) {\r\n rows.push({\r\n className: 'numpad-row',\r\n keys: letterKeys.slice(offset, offset + count),\r\n })\r\n offset += count\r\n }\r\n // 剩余字母放最后一行\r\n if (offset < letterKeys.length) {\r\n rows.push({\r\n className: 'numpad-row',\r\n keys: letterKeys.slice(offset),\r\n })\r\n }\r\n\r\n // 功能键行\r\n rows.push({\r\n className: 'numpad-row',\r\n keys: [\r\n {\r\n id: 'clear',\r\n type: 'clear',\r\n label: '清空',\r\n className: 'key-clear key-fn',\r\n },\r\n {\r\n id: 'backspace',\r\n type: 'backspace',\r\n label: '⌫',\r\n className: 'key-backspace key-fn',\r\n },\r\n {\r\n id: 'done',\r\n type: 'done',\r\n label: '确定',\r\n className: 'key-done key-fn',\r\n },\r\n ],\r\n })\r\n\r\n return {\r\n type: 'custom',\r\n name: '随机字母键盘',\r\n supportShift: false,\r\n rows,\r\n data: {\r\n isRandom: true,\r\n randomType: 'letter',\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * 生成混合随机键盘(数字+字母)\r\n * 默认使用 QWERTY 风格行分布 (10/10/9/7),看起来像真实键盘\r\n */\r\nexport function createRandomMixedLayout(options?: {\r\n /** 行分布,默认 [10, 10, 9, 7] */\r\n rowDistribution?: number[]\r\n}): KeyboardConfig {\r\n const { rowDistribution = [10, 10, 9, 7] } = options || {}\r\n\r\n const randomChars = getRandomAlphanumeric()\r\n const charKeys = randomChars.map((c, i) => createCharKey(c, i))\r\n\r\n // 按行分布切割\r\n const rows: KeyboardRow[] = []\r\n let offset = 0\r\n for (const count of rowDistribution) {\r\n if (offset >= charKeys.length) break\r\n rows.push({\r\n className: 'numpad-row',\r\n keys: charKeys.slice(offset, offset + count),\r\n })\r\n offset += count\r\n }\r\n // 剩余字符放最后一行\r\n if (offset < charKeys.length) {\r\n rows.push({\r\n className: 'numpad-row',\r\n keys: charKeys.slice(offset),\r\n })\r\n }\r\n\r\n // 功能键行\r\n rows.push({\r\n className: 'numpad-row',\r\n keys: [\r\n {\r\n id: 'clear',\r\n type: 'clear',\r\n label: '清空',\r\n className: 'key-clear key-fn',\r\n },\r\n {\r\n id: 'backspace',\r\n type: 'backspace',\r\n label: '⌫',\r\n className: 'key-backspace key-fn',\r\n },\r\n {\r\n id: 'done',\r\n type: 'done',\r\n label: '确定',\r\n className: 'key-done key-fn',\r\n },\r\n ],\r\n })\r\n\r\n return {\r\n type: 'custom',\r\n name: '随机混合键盘',\r\n supportShift: false,\r\n rows,\r\n data: {\r\n isRandom: true,\r\n randomType: 'mixed',\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * 刷新随机键盘布局\r\n * @param layout - 现有布局\r\n * @returns 新的随机布局\r\n */\r\nexport function refreshRandomLayout(layout: KeyboardConfig): KeyboardConfig {\r\n const randomType = layout.data?.randomType as string | undefined\r\n\r\n switch (randomType) {\r\n case 'number':\r\n return createRandomNumberLayout()\r\n case 'pin':\r\n return createRandomPinLayout()\r\n case 'letter':\r\n return createRandomLetterLayout()\r\n case 'mixed':\r\n return createRandomMixedLayout()\r\n default:\r\n return layout\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;CASO,MAAM,IAAc,kYAKd,IAAa,oSAKb,IAAa,iQAKb,IAAa,8OAKb,IAAa,2RAKb,IAAa,yPAKb,IAAa,yQAKb,IAAgB,2cAKhB,IAAa,0WAKb,IAAQ;EACnB,QAAQ;EACR,OAAO;EACP,OAAO;EACP,OAAO;EACP,OAAO;EACP,OAAO;EACP,OAAO;EACP,UAAU;EACV,OAAO;CAAA;CCpDT,SAAS,EAAgB,GAAA;EACvB,OAAO;GACL,IAAI,UAAU;GACd,MAAM;GACN,OAAO;GACP,OAAO;GACP,WAAW;EAAA;CAEf;CAKO,MAAM,IAA+B;EAC1C,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,MAAM;GACJ;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;KAEb,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;EAAA;EAKnB,MAAM;GACJ,WAAW;GACX,eAAe;EAAA;CAAA,GAON,IAAqC;EAChD,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,MAAM;GACJ;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;KAEb,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;EAAA;EAKnB,MAAM;GACJ,WAAW;GACX,eAAe;EAAA;CAAA;CCjKnB,SAAS,EAAgB,GAAA;EACvB,OAAO;GACL,IAAI,YAAY;GAChB,MAAM;GACN,OAAO;GACP,OAAO;GACP,WAAW;EAAA;CAEf;CAUO,MAAM,IAAiC;EAC5C,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,MAAM;GAGJ;IACE,WAAW;IACX,MAAM;KAEJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAKjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAKjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAKjB;IACE,WAAW;IACX,MAAM;KACJ;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,WAAW;MACX,MAAM,EAAE,YAAY,SAAA;KAAA;KAEtB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;EAAA;EAKnB,MAAM;GAEJ,WAAW;GACX,WAAW;EAAA;CAAA;CCrGf,SAAS,EAAc,GAAA;EACrB,OAAO;GACL,IAAI,cAAc,EAAK,YAAA;GACvB,MAAM;GACN,OAAO;IAAE,OAAO,EAAK,YAAA;IAAe,OAAO,EAAK,YAAA;GAAA;GAChD,OAAO;IAAE,OAAO,EAAK,YAAA;IAAe,OAAO,EAAK,YAAA;GAAA;EAAA;CAEpD;CAKA,SAAS,EAAQ,GAAe,GAAA;EAC9B,OAAO;GACL,IAAI,KAAM,iBAAiB,EAAM,QAAQ,eAAe,EAAA;GACxD,MAAM;GACN,OAAA;GACA,OAAO;GACP,WAAW;EAAA;CAEf;CAKO,MAAM,IAAiB;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAA,GAGW,IAA8B;EACzC,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,kBAAA,CAAkB;EAClB,YAAY,CAAC,UAAU,QAAA;EACvB,MAAM;GAEJ,EACE,MAAM,aAAa,MAAM,EAAA,CAAA,CAAI,IAAI,CAAA,EAAA;GAGnC,EACE,MAAM,YAAY,MAAM,EAAA,CAAA,CAAI,IAAI,CAAA,EAAA;GAGlC,EACE,MAAM;IACJ;KACE,IAAI;KACJ,MAAM;KACN,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;IAAA,GAEV,UAAU,MAAM,EAAA,CAAA,CAAI,IAAI,CAAA;IAC3B;KACE,IAAI;KACJ,MAAM;KACN,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;GAAA,EAAA;GAKjB,EACE,MAAM;IACJ;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;KACX,MAAM,EAAE,YAAY,SAAA;IAAA;IAEtB;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;IAEb;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,OAAO;KACP,WAAW;KACX,SAAS;IAAA;IAEX,EAAQ,KAAK,WAAA;IACb,EAAQ,KAAK,YAAA;IACb,EAAQ,KAAK,kBAAA;IACb;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,OAAO;KACP,WAAW;IAAA;IAEb;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;GAAA,EAAA;EAAA;CAAA;CCpHrB,SAAS,EAAgB,GAAA;EACvB,OAAO;GACL,IAAI,UAAU;GACd,MAAM;GACN,OAAO;GACP,OAAO;GACP,WAAW;EAAA;CAEf;CAWO,MAAM,IAA+B;EAC1C,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,MAAM;GAGJ;IACE,WAAW;IACX,MAAM;KAEJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAKjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAKjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAKjB;IACE,WAAW;IACX,MAAM;KACJ;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,WAAW;KAAA;KAEb,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;EAAA;EAKnB,MAAM;GAEJ,WAAW;GACX,WAAW;EAAA;CAAA,GCrGF,IAAY;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAA,GAMW,IAAgB;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAA;CAMF,SAAS,EAAkB,GAAA;EACzB,OAAO;GACL,IAAI,YAAY;GAChB,MAAM;GACN,OAAO;GACP,OAAO;GACP,WAAW;GACX,MAAM,EAAE,kBAAkB,6BAAA;EAAA;CAE9B;CAKA,SAAS,EAAgB,GAAA;EACvB,OAAO;GACL,IAAI,UAAU;GACd,MAAM;GACN,OAAO;GACP,OAAO;GACP,WAAW;EAAA;CAEf;CAmBO,MAAM,IAA6C;EACxD,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,MAAM;GACJ;IACE,WAAW;IACX,MAAM,EAAU,MAAM,GAAG,EAAA,CAAA,CAAI,IAAI,CAAA;GAAA;GAEnC;IACE,WAAW;IACX,MAAM,EAAU,MAAM,IAAI,EAAA,CAAA,CAAI,IAAI,CAAA;GAAA;GAEpC;IACE,WAAW;IACX,MAAM,EAAU,MAAM,IAAI,EAAA,CAAA,CAAI,IAAI,CAAA;GAAA;GAEpC;IACE,WAAW;IACX,MAAM;KAAA,GACD,EAAU,MAAM,IAAI,EAAA,CAAA,CAAI,IAAI,CAAA;KAC/B;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;MACX,MAAM,EAAE,kBAAkB,6BAAA;KAAA;KAE5B;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;MACX,MAAM,EAAE,kBAAkB,6BAAA;KAAA;KAE5B;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;KAEb;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;EAAA;EAKnB,MAAM;GACJ,WAAW;GACX,WAAW;EAAA;CAAA,GAQF,IAAiD;EAC5D,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,MAAM;GACJ;IACE,WAAW;IACX,MAAM,aAAa,MAAM,EAAA,CAAA,CAAI,IAtFnC,SAAyB,GAAA;KACvB,OAAO;MACL,IAAI,OAAO;MACX,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAEf,CAAA;GAAA;GAgFI;IACE,WAAW;IACX,MAAM,EAAc,MAAM,GAAG,EAAA,CAAA,CAAI,IAAI,CAAA;GAAA;GAEvC;IACE,WAAW;IACX,MAAM,CAAA,GACD,EAAc,MAAM,IAAI,EAAA,CAAA,CAAI,IAAI,CAAA,GACnC;KACE,IAAI;KACJ,MAAM;KACN,MAAM;KACN,OAAO;KACP,WAAW;IAAA,CAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;MACX,MAAM,EAAE,YAAY,yBAAA;KAAA;KAAA,GAEnB,EAAc,MAAM,IAAI,EAAA,CAAA,CAAI,IAAI,CAAA;KACnC;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;KAEb;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;KAEb;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;EAAA;EAKnB,MAAM;GACJ,WAAW;GACX,WAAW;EAAA;CAAA,GAQF,IAA2C;EACtD,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,MAAM;GACJ;IACE,WAAW;IACX,MAAM,EAAc,MAAM,GAAG,CAAA,CAAA,CAAG,IAAI,CAAA;GAAA;GAEtC;IACE,WAAW;IACX,MAAM,EAAc,MAAM,GAAG,EAAA,CAAA,CAAI,IAAI,CAAA;GAAA;GAEvC;IACE,WAAW;IACX,MAAM,CAAA,GAAI,EAAc,MAAM,IAAI,EAAA,CAAA,CAAI,IAAI,CAAA,CAAA;GAAA;GAE5C;IACE,WAAW;IACX,MAAM;KACJ;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;MACX,MAAM,EAAE,YAAY,yBAAA;KAAA;KAEtB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;KAEb;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;EAAA;EAKnB,MAAM;GACJ,WAAW;GACX,WAAW;EAAA;CAAA,GAQF,IAAqC;EAChD,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,MAAM;GACJ,YAAA,CAAY;GACZ,WAAW;GACX,WAAW;EAAA;EAEb,MAAM,EAA2B;CAAA;CCzTnC,SAAS,EAAgB,GAAA;EACvB,OAAO;GACL,IAAI,OAAO;GACX,MAAM;GACN,OAAO;GACP,OAAO;GACP,WAAW;EAAA;CAEf;CAKO,MAAM,IAA+B;EAC1C,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,YAAY,CAAC,UAAU,QAAA;EACvB,MAAM;GACJ;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;KAEb,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;EAAA;CAAA,GAUR,IAAgC;EAC3C,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,YAAY,CAAC,QAAA;EACb,MAAM;GACJ;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,WAAW;MACX,MAAM,EAAE,YAAY,SAAA;KAAA;KAEtB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;EAAA;CAAA;CC3JrB,SAAS,EAAgB,GAAA;EACvB,OAAO;GACL,IAAI,SAAS;GACb,MAAM;GACN,OAAO;GACP,OAAO;GACP,WAAW;EAAA;CAEf;CAMO,MAAM,IAA8B;EACzC,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,MAAM;GACJ;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;KAEb,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;EAAA;EAKnB,MAAM;GACJ,WAAW;GACX,WAAW;EAAA;CAAA,GAOF,IAAoC;EAC/C,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,MAAM;GACJ;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAIjB;IACE,WAAW;IACX,MAAM;KACJ;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;KAEb,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;EAAA;EAKnB,MAAM;GACJ,WAAW;GACX,WAAW;EAAA;CAAA;CCjKf,SAAS,EAAE,GAAe,GAAA;EACxB,OAAO;GACL,IAAI,SAAS;GACb,MAAM;GACN,OAAA;GACA,OAAO,KAAS;GAChB,WAAW;EAAA;CAEf;CAGO,MAAM,IAA8B;EACzC,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,YAAY,CAAC,UAAU,UAAA;EACvB,MAAM;GAEJ;IACE,WAAW;IACX,MAAM;KAAC;KAAK;KAAK;KAAK;KAAK;KAAK;KAAK;KAAK;IAAA,CAAA,CAAK,KAAI,MAAK,EAAE,CAAA,CAAA;GAAA;GAG5D;IACE,WAAW;IACX,MAAM;KAAC;KAAK;KAAK;KAAK;KAAK;KAAK;KAAK;KAAM;IAAA,CAAA,CAAM,KAAI,MAAK,EAAE,CAAA,CAAA;GAAA;GAG9D;IACE,WAAW;IACX,MAAM;KACJ,EAAE,GAAA;KACF,EAAE,GAAA;KACF,EAAE,GAAA;KACF,EAAE,GAAA;KACF,EAAE,GAAA;KACF,EAAE,GAAA;KACF,EAAE,GAAA;KACF;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAKjB;IACE,WAAW;IACX,MAAM;KACJ;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,MAAM,EAAE,YAAY,WAAA;MACpB,WAAW;KAAA;KAEb;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,MAAM,EAAE,YAAY,SAAA;MACpB,WAAW;KAAA;KAEb;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,OAAO;MACP,WAAW;KAAA;KAEb;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;EAAA;CAAA;CCrFrB,SAAS,EAAc,GAAA;EACrB,OAAO;GACL,IAAI,QAAQ,EAAK,YAAA;GACjB,MAAM;GACN,OAAO;IAAE,OAAO,EAAK,YAAA;IAAe,OAAO,EAAK,YAAA;GAAA;GAChD,OAAO;IAAE,OAAO,EAAK,YAAA;IAAe,OAAO,EAAK,YAAA;GAAA;EAAA;CAEpD;CAKO,MAAM,IAA+B;EAC1C,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,kBAAA,CAAkB;EAClB,YAAY,CAAC,UAAU,QAAA;EACvB,MAAM;GACJ,EACE,MAAM;IACJ,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;GAAA,EAAA;GAGlB,EACE,MAAM;IACJ,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;GAAA,EAAA;GAGlB,EACE,MAAM;IACJ;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;IAEb,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd,EAAc,GAAA;IACd;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;GAAA,EAAA;GAIjB,EACE,MAAM;IACJ;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;KACX,MAAM,EAAE,YAAY,SAAA;IAAA;IAEtB;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;KACX,MAAM,EAAE,YAAY,SAAA;IAAA;IAEtB;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,OAAO;KACP,WAAW;IAAA;IAEb;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;GAAA,EAAA;EAAA;CAAA;CCjGrB,SAAS,EAAc,GAAA;EACrB,OAAO;GACL,IAAI,eAAe,EAAK,YAAA;GACxB,MAAM;GACN,OAAO;IAAE,OAAO,EAAK,YAAA;IAAe,OAAO,EAAK,YAAA;GAAA;GAChD,OAAO;IAAE,OAAO,EAAK,YAAA;IAAe,OAAO,EAAK,YAAA;GAAA;EAAA;CAEpD;CAGO,MAAM,IAA+B;EAC1C,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,kBAAA,CAAkB;EAClB,YAAY,CAAC,UAAU,QAAA;EACvB,MAAM;GAEJ,EACE,MAAM,aAAa,MAAM,EAAA,CAAA,CAAI,IAAI,CAAA,EAAA;GAGnC,EACE,MAAM,YAAY,MAAM,EAAA,CAAA,CAAI,IAAI,CAAA,EAAA;GAGlC,EACE,MAAM;IACJ;KACE,IAAI;KACJ,MAAM;KACN,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;IAAA,GAEV,UAAU,MAAM,EAAA,CAAA,CAAI,IAAI,CAAA;IAC3B;KACE,IAAI;KACJ,MAAM;KACN,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;GAAA,EAAA;GAKjB,EACE,MAAM;IACJ;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;KACX,MAAM,EAAE,YAAY,SAAA;IAAA;IAEtB;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;KACX,MAAM,EAAE,YAAY,SAAA;IAAA;IAEtB;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,OAAO;KACP,WAAW;IAAA;IAEb;KACE,IAAI;KACJ,MAAM;KACN,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;KACX,MAAM,EAAE,QAAQ,QAAA;IAAA;IAElB;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;GAAA,EAAA;EAAA;CAAA;CC7FrB,SAAS,EAAgB,GAAgB,GAAA;EACvC,OAAO;GACL,IAAI,KAAM,UAAU,EAAO,WAAW,CAAA;GACtC,MAAM;GACN,OAAO;GACP,OAAO;EAAA;CAEX;CAKO,MAAM,IAA+B;EAC1C,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,YAAY,CAAC,UAAU,QAAA;EACvB,MAAM;GACJ,EACE,MAAM;IACJ,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;GAAA,EAAA;GAGpB,EACE,MAAM;IACJ,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,KAAK,KAAA;IACrB,EAAgB,GAAA;IAChB,EAAgB,MAAK,OAAA;GAAA,EAAA;GAGzB,EACE,MAAM;IACJ;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;KACX,MAAM,EAAE,YAAY,WAAA;IAAA;IAEtB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,KAAK,YAAA;IACrB;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;GAAA,EAAA;GAIjB,EACE,MAAM;IACJ;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;KACX,MAAM,EAAE,YAAY,SAAA;IAAA;IAEtB;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;KACX,MAAM,EAAE,YAAY,SAAA;IAAA;IAEtB;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,OAAO;KACP,WAAW;IAAA;IAEb;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;GAAA,EAAA;EAAA;CAAA,GAUR,IAAgC;EAC3C,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,YAAY,CAAC,UAAU,QAAA;EACvB,MAAM;GACJ,EACE,MAAM;IACJ,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;GAAA,EAAA;GAGpB,EACE,MAAM;IACJ,EAAgB,GAAA;IAChB,EAAgB,IAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,GAAA;IAChB,EAAgB,KAAK,MAAA;IACrB,EAAgB,GAAA;IAChB,EAAgB,GAAA;GAAA,EAAA;GAGpB,EACE,MAAM;IACJ;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;KACX,MAAM,EAAE,YAAY,SAAA;IAAA;IAEtB,EAAgB,KAAK,UAAA;IACrB,EAAgB,KAAK,YAAA;IACrB,EAAgB,KAAK,UAAA;IACrB,EAAgB,KAAK,QAAA;IACrB,EAAgB,KAAK,QAAA;IACrB;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;GAAA,EAAA;GAIjB,EACE,MAAM;IACJ;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;KACX,MAAM,EAAE,YAAY,SAAA;IAAA;IAEtB;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;KACX,MAAM,EAAE,YAAY,SAAA;IAAA;IAEtB;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,OAAO;KACP,WAAW;IAAA;IAEb;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;GAAA,EAAA;EAAA;CAAA;CCjMrB,SAAS,EAAc,GAAA;EACrB,OAAO;GACL,IAAI,YAAY,EAAK,YAAA;GACrB,MAAM;GACN,OAAO;IAAE,OAAO,EAAK,YAAA;IAAe,OAAO,EAAK,YAAA;GAAA;GAChD,OAAO;IAAE,OAAO,EAAK,YAAA;IAAe,OAAO,EAAK,YAAA;GAAA;EAAA;CAEpD;CASA,SAAS,EAAQ,GAAe,GAAA;EAQ9B,OAAO;GACL,IAAI,eANJ,EAAM,QAAQ,eAAe,EAAA,KAC7B,EACG,MAAM,EAAA,CAAA,CACN,KAAI,MAAK,EAAE,WAAW,CAAA,CAAA,CAAA,CACtB,KAAK,EAAA;GAGR,MAAM;GACN,OAAA;GACA,OAAO;GACP,OAAA;GACA,WAAW;EAAA;CAEf;CAGO,MAAM,IAA4B;EACvC,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,kBAAA,CAAkB;EAClB,YAAY,CAAC,UAAU,QAAA;EACvB,MAAM;GAEJ,EACE,MAAM,aAAa,MAAM,EAAA,CAAA,CAAI,IAAI,CAAA,EAAA;GAGnC,EACE,MAAM,YAAY,MAAM,EAAA,CAAA,CAAI,IAAI,CAAA,EAAA;GAGlC,EACE,MAAM;IACJ;KACE,IAAI;KACJ,MAAM;KACN,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;IAAA,GAEV,UAAU,MAAM,EAAA,CAAA,CAAI,IAAI,CAAA;IAC3B;KACE,IAAI;KACJ,MAAM;KACN,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;GAAA,EAAA;GAKjB,EACE,MAAM;IACJ;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;KACX,MAAM,EAAE,YAAY,SAAA;IAAA;IAEtB,EAAQ,KAAK,EAAA;IACb,EAAQ,KAAK,EAAA;IACb,EAAQ,KAAK,EAAA;IACb,EAAQ,QAAQ,GAAA;IAChB,EAAQ,OAAO,GAAA;IACf;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,OAAO;KACP,WAAW;IAAA;IAEb;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,OAAO;KACP,WAAW;IAAA;GAAA,EAAA;EAAA;CAAA;CCrGrB,SAAS,EAAgB,GAAA;EACvB,OAAO;GACL,IAAI,UAAU;GACd,MAAM;GACN,OAAO;GACP,OAAO;GACP,WAAW;EAAA;CAEf;CAUO,MAAM,IAAmC;EAC9C,MAAM;EACN,MAAM;EACN,cAAA,CAAc;EACd,MAAM;GAGJ;IACE,WAAW;IACX,MAAM;KAEJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAKjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAKjB;IACE,WAAW;IACX,MAAM;KACJ,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;GAKjB;IACE,WAAW;IACX,MAAM;KACJ;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,UAAA,CAAU;MACV,WAAW;KAAA;KAEb,EAAgB,GAAA;KAChB;MACE,IAAI;MACJ,MAAM;MACN,OAAO;MACP,OAAO;MACP,WAAW;KAAA;IAAA;GAAA;EAAA;EAKnB,MAAM;GAEJ,WAAW;GACX,WAAW;EAAA;CAAA,GCrDT,IAAiD;EACrD,QAAQ;EACR,QAAQ;EACR,SAAS;EACT,QAAQ;EACR,YAAY;EACZ,iBAAiB;EACjB,0BAA0B;EAC1B,wBAAwB;EACxB,8BAA8B;EAE9B,QAAQ;EACR,OAAO;EACP,gBAAgB;EAChB,QAAQ;EACR,iBAAiB;EACjB,UAAU;EACV,YAAY;EAEZ,OAAO;EACP,KAAK;EACL,QAAQ;EAER,OAAO;CAAA,GAMH,IAAgD,CAAC;CAOhD,SAAS,EAAe,GAAc,GAAA;EACvC,EAAe,KACjB,QAAQ,KAAK,8CAA8C,EAAA,EAAA,IAG7D,EAAc,KAAQ;CACxB;CAOO,SAAS,EACd,GAAA;EAEA,OAAO,EAAc,MAAS,EAAe;CAC/C;CCvGA,MAAM,IACJ;CAKF,IAAI,KAAsC;CAKnC,SAAS,KAAA;EACd,OAA4B,SAAxB,KACK,KAGa,eAAA,OAAX,WAIX,KACE,kBAAkB,UAClB,UAAU,iBAAiB,KAE3B,UAAU,mBAAmB,GAExB;CACT;CAKO,SAAS,KAAA;EACd,OAAyB,eAAA,OAAd,aAGJ,EAAgB,KAAK,UAAU,SAAA;CACxC;CAKO,SAAS,KAAA;EACd,OAAsB,eAAA,OAAX,WAAA,CAAA,CAKP,GAAA,MAKgB,OAAO,cAAc,SAAS,gBAAgB,gBAC/C,OAKZ,GAAA;CACT;CAYO,SAAS,KAAA;EACd,IAAsB,eAAA,OAAX,QACT,OAAO;GACL,OAAO;GACP,QAAQ;GACR,SAAS;GACT,SAAS;GACT,UAAA,CAAU;EAAA;EAId,MAAM,IAAQ,OAAO,cAAc,SAAS,gBAAgB,aACtD,IAAS,OAAO,eAAe,SAAS,gBAAgB,cAGxD,IAAW,GAAA;EAEjB,OAAO;GACL,OAAA;GACA,QAAA;GACA,SAAS,OAAO,WAAW,OAAO;GAClC,SAAS,OAAO,WAAW,OAAO;GAClC,UAAU,GAAA;GACV,UAAA;EAAA;CAEJ;CAKO,SAAS,KAAA;EACd,IACoB,eAAA,OAAX,UACQ,eAAA,OAAR,OAAA,CACN,IAAI,UAEL,OAAO;GAAE,KAAK;GAAG,OAAO;GAAG,QAAQ;GAAG,MAAM;EAAA;EAI9C,IAAA,CAAK,IAAI,SAAS,eAAe,0BAAA,GAC/B,OAAO;GAAE,KAAK;GAAG,OAAO;GAAG,QAAQ;GAAG,MAAM;EAAA;EAI9C,MAAM,IAAM,SAAS,cAAc,KAAA;EACnC,EAAI,MAAM,UAAU;EASpB,MAAM,IAAO,SAAS;EACtB,IAAA,CAAK,GAAM,OAAO;GAAE,KAAK;GAAG,OAAO;GAAG,QAAQ;GAAG,MAAM;EAAA;EACvD,EAAK,YAAY,CAAA;EAEjB,MAAM,IAAW,iBAAiB,CAAA,GAC5B,IAAW;GACf,KAAK,OAAO,WAAW,EAAS,GAAA,KAAQ;GACxC,OAAO,OAAO,WAAW,EAAS,KAAA,KAAU;GAC5C,QAAQ,OAAO,WAAW,EAAS,MAAA,KAAW;GAC9C,MAAM,OAAO,WAAW,EAAS,IAAA,KAAS;EAAA;EAI5C,OADA,EAAK,YAAY,CAAA,GACV;CACT;CAKO,SAAS,KAAA;EACd,OAA4B,eAAA,OAAd,aAA6B,aAAa;CAC1D;CAMO,SAAS,GAAQ,IAA6B,IAAA;EACnD,OAAA,CAAA,CAAI,GAAA,KACK,UAAU,QAAQ,CAAA;CAG7B;CC/JO,SAAS,GAAgB,GAAA;EAC9B,MAAM,IAAO,EAAQ,sBAAA;EACrB,OAAO;GACL,GAAG,EAAK;GACR,GAAG,EAAK;GACR,OAAO,EAAK;GACZ,QAAQ,EAAK;EAAA;CAEjB;CAiCO,SAAS,GACd,GACA,GAAA;EAEA,MAAM,IAAS,EAAM;EACrB,OAAA,CAAQ,EAAQ,SAAS,CAAA;CAC3B;CAaO,SAAS,GACd,GACA,GAAA;EAEA,MAAM,KAAW,MAAA;GACX,GAAe,GAAO,CAAA,KACxB,EAAS,CAAA;EAAA;EAOb,OAHA,SAAS,iBAAiB,aAAa,CAAA,GACvC,SAAS,iBAAiB,cAAc,CAAA,SAExC;GACE,SAAS,oBAAoB,aAAa,CAAA,GAC1C,SAAS,oBAAoB,cAAc,CAAA;EAAA;CAE/C;CA2BO,SAAS,GACd,GAAA;EAEA,OAAO,EAAM,kBAAkB,EAAM,MAAM;CAC7C;CAKO,SAAS,GACd,GACA,GAAA;EAEA,EAAM,kBAAkB,GAAU,CAAA;CACpC;CAKO,SAAS,GACd,GACA,GACA,GAAA;EAEA,MAAM,IAAQ,EAAM,kBAAkB,EAAM,MAAM,QAC5C,IAAM,EAAM,gBAAgB,EAAM,MAAM,QACxC,IAAe,EAAM,OAErB,IAAA,KACU,MAAd,KAA4B,OAAO,SAAS,CAAA,IAExC,KAAK,IAAI,GAAG,KAAK,MAAM,CAAA,CAAA,IAAA,KADvB;EAEN,IAAI,IAAe,GACf,IACF,EAAa,UAAU,GAAG,CAAA,IAC1B,IACA,EAAa,UAAU,CAAA;EAGzB,IAAA,KAC0B,MAAxB,KACA,EAAS,SAAS,GAClB;GACA,MAAM,IACJ,KAAuB,EAAa,UAAU,IAAM;GACtD,IAAI,KAAiB,GACnB,OAAO;IAAE,OAAO;IAAc,gBAAgB;GAAA;GAEhD,IAAe,EAAK,UAAU,GAAG,CAAA,GACjC,IACE,EAAa,UAAU,GAAG,CAAA,IAC1B,IACA,EAAa,UAAU,CAAA;EAC3B;EAEA,MAAM,IAAoB,IAAQ,EAAa;EAE/C,OAAO;GACL,OAAO;GACP,gBAAgB,KAAK,IAAI,GAAmB,EAAS,MAAA;EAAA;CAEzD;CAKO,SAAS,GACd,GAAA;EAEA,MAAM,IAAQ,EAAM,kBAAkB,EAAM,MAAM,QAC5C,IAAM,EAAM,gBAAgB,EAAM,MAAM,QACxC,IAAe,EAAM;EAG3B,IAAI,MAAU,GAAK;GACjB,MAAMA,IAAc,EAAa,UAAU,GAAO,CAAA;GAGlD,OAAO;IACL,OAFA,EAAa,UAAU,GAAG,CAAA,IAAS,EAAa,UAAU,CAAA;IAG1D,aAAAA;IACA,gBAAgB;GAAA;EAEpB;EAGA,IAAc,MAAV,GACF,OAAO;GACL,OAAO;GACP,aAAa;GACb,gBAAgB;EAAA;EAIpB,MAAM,IAAc,EAAa,OAAO,IAAQ,CAAA;EAIhD,OAAO;GACL,OAHA,EAAa,UAAU,GAAG,IAAQ,CAAA,IAAK,EAAa,UAAU,CAAA;GAI9D,aAAA;GACA,gBAAgB,IAAQ;EAAA;CAE5B;CAkCO,SAAS,GAAgB,GAAA;EAC9B,IAAyB,eAAA,OAAd,aAAsD,eAAA,OAAlB,eAC7C,OAAO;EAET,MAAME,IAAW,IAAI,UAAA,CAAA,CAAY,gBAAgB,GAAM,eAAA,GACjD,IAAMA,EAAS;EACrB,OACgC,UAA9B,EAAI,QAAQ,YAAA,KACZA,EAAS,cAAc,aAAA,IAEhB,MAET,EACG,iBAAiB,8BAAA,CAAA,CACjB,SAAQ,MAAQ,EAAK,OAAA,CAAA,GACxB,EAAI,iBAAiB,GAAA,CAAA,CAAK,SAAQ,MAAA;GAChC,MAAM,KAAK,EAAQ,UAAA,CAAA,CAAY,SAAQ,MAAA;IACrC,MAAM,IAAO,EAAU,KAAK,YAAA,GACtB,IAAQ,EAAU,MAAM,KAAA;IAAA,CAE5B,EAAK,WAAW,IAAA,MACL,WAAT,KAA4B,iBAAT,KAA2B,EAAM,WAAW,GAAA,MAEjE,EAAQ,gBAAgB,EAAU,IAAA;GAAA,CAAA;EAAA,CAAA,GAKjC,IAAI,cAAA,CAAA,CAAgB,kBAAkB,CAAA;CAC/C;CCpPO,IAAM,KAAN,MAAA;EAAA,cAAA;GACL,KAAQ,2BAAW,IAAI,IAAA;EAGrB;EAKF,GACE,GACA,GACA,IAA+B,CAAC,GAAA;GAE3B,KAAK,SAAS,IAAI,CAAA,KACrB,KAAK,SAAS,IAAI,mBAAO,IAAI,IAAA,CAAA;GAG/B,MAAM,IAAW,KAAK,SAAS,IAAI,CAAA;GACnC,IAAA,CAAK,GACH,aAAA,CAAA;GAEF,MAAM,IAA4C;IAChD,SAAA;IACA,SAAA;GAAA;GAKF,OAFA,EAAS,IAAI,CAAA,SAEb;IACE,EAAS,OAAO,CAAA,GACM,MAAlB,EAAS,QACX,KAAK,SAAS,OAAO,CAAA;GAAA;EAG3B;EAKA,KACE,GACA,GACA,IAA+B,CAAC,GAAA;GAEhC,OAAO,KAAK,GAAG,GAAO,GAAS;IAAA,GAAK;IAAS,MAAA,CAAM;GAAA,CAAA;EACrD;EAKA,IACE,GACA,GAAA;GAEA,IAAA,CAAK,GAEH,OAAA,KADA,KAAK,SAAS,OAAO,CAAA;GAIvB,MAAM,IAAW,KAAK,SAAS,IAAI,CAAA;GAC/B,MACF,EAAS,SAAQ,MAAA;IACX,EAAQ,YAAY,KACtB,EAAS,OAAO,CAAA;GAAA,CAAA,GAGE,MAAlB,EAAS,QACX,KAAK,SAAS,OAAO,CAAA;EAG3B;EAKA,KAA+B,GAAU,GAAA;GACvC,MAAM,IAAW,KAAK,SAAS,IAAI,CAAA;GACnC,IAAA,CAAK,KAA8B,MAAlB,EAAS,MACxB;GAIF,MAAM,IAAiB,MAAM,KAAK,CAAA,CAAA,CAAU,MAAM,GAAG,MAAA;IACnD,MAAM,IAAY,EAAE,QAAQ,YAAY;IAExC,QADkB,EAAE,QAAQ,YAAY,KACrB;GAAA,CAAA,GAGf,IAA2C,CAAA;GAEjD,EAAe,SAAQ,MAAA;IACrB,IAAA;KACE,EAAQ,QAAQ,CAAA,GACZ,EAAQ,QAAQ,QAClB,EAAS,KAAK,CAAA;IAElB,SAAS,GAAA;KACP,QAAQ,MACN,sDAAsD,OAAO,CAAA,EAAA,KAC7D,CAAA;IAEJ;GAAA,CAAA,GAIF,EAAS,SAAQ,MAAW,EAAS,OAAO,CAAA,CAAA,GACtB,MAAlB,EAAS,QACX,KAAK,SAAS,OAAO,CAAA;EAEzB;EAKA,QAAA;GACE,KAAK,SAAS,MAAA;EAChB;EAKA,cAAc,GAAA;GACZ,IAAA,KAAc,MAAV,GACF,OAAO,KAAK,SAAS,IAAI,CAAA,CAAA,EAAQ,QAAQ;GAG3C,IAAI,IAAQ;GAIZ,OAHA,KAAK,SAAS,SAAQ,MAAA;IACpB,KAAS,EAAS;GAAA,CAAA,GAEb;EACT;CAAA;CC9IF,MAAM,KAA6C;EACjD,MAAM;EACN,OAAO;EACP,WAAA,KAAW;EACX,kBAAA,CAAkB;EAClB,qBAAA,CAAqB;EACrB,aAAA,CAAa;EACb,eAAA,CAAe;EACf,eAAe,CAAC;CAAA;CAGlB,SAAS,GAAmB,GAAA;EAC1B,IAAA,KAAc,MAAV,KAAwB,OAAO,SAAS,CAAA,GAC5C,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,CAAA,CAAA;CAChC;CAEA,SAAS,GAAW,GAAe,GAAA;EACjC,OAAA,KAAqB,MAAd,IAA0B,IAAQ,EAAM,MAAM,GAAG,CAAA;CAC1D;CAMO,IAAM,KAAN,cAA8B,GAAA;EAYnC,YAAY,IAA2B,CAAC,GAAA;GACtC,MAAA,GALF,KAAQ,gBAAuC,MAE/C,KAAQ,YAAA,CAAY;GAIlB,MAAM,IAAY,GAAmB,EAAQ,SAAA;GAC7C,KAAK,UAAU;IAAA,GACV;IAAA,GACA;IACH,WAAA;IACA,eAAe;KAAA,GACV,GAAgB;KAAA,GACf,EAAQ,iBAAiB,CAAC;IAAA;GAAA,GAK9B,EAAQ,iBACV,OAAO,QAAQ,EAAQ,aAAA,CAAA,CAAe,SAAA,CAAU,GAAM,OAAA;IAEpD,KAAK,QAAQ,cAAc,KAAQ;GAAA,CAAA,GAKvC,KAAK,QAAQ;IACX,SAAA,CAAS;IACT,MAAM,KAAK,QAAQ;IACnB,aAAa,KAAK,QAAQ;IAC1B,OAAO,GAAW,KAAK,QAAQ,OAAO,KAAK,QAAQ,SAAA;IACnD,gBAAgB,GAAW,KAAK,QAAQ,OAAO,KAAK,QAAQ,SAAA,CAAA,CACzD;IACH,WAAW,KAAK,QAAQ;IACxB,cAAc;GAAA,GAIhB,KAAK,WAAW,KAAK,QAAQ,IAAA;EAC/B;EAKA,WAAA;GACE,OAAO,EAAA,GAAK,KAAK,MAAA;EACnB;EAKA,YAAA;GACE,OAAO,KAAK;EACd;EAKA,aAAA;GACE,OAAO;IAAA,GAAK,KAAK;IAAS,eAAe,EAAA,GAAK,KAAK,QAAQ,cAAA;GAAA;EAC7D;EAKQ,WAAW,GAAA;GAEjB,IAAI,IAAS,KAAK,QAAQ,cAAc;GAOxC,OAJK,MACH,IAAS,EAAU,CAAA,IAGhB,KAKL,KAAK,gBAAgB,GAGjB,EAAO,iBACT,KAAK,MAAM,cACT,EAAO,oBAAoB,KAAK,QAAQ,mBAAA,CAGrC,MAZL,QAAQ,MAAM,6BAA6B,EAAA,YAAA,GAAA,CACpC;EAYX;EAKA,KAAK,GAAA;GACC,KAAK,cACL,KAAK,MAAM,UACT,KAAgB,KAAK,MAAM,iBAAiB,KAC9C,KAAK,UAAU,CAAA,KAKnB,KAAK,MAAM,UAAA,CAAU,GACrB,KAAK,MAAM,eAAe,KAAgB,MAGtC,MACF,KAAK,MAAM,QAAQ,EAAa,OAChC,KAAK,MAAM,iBAAiB,GAAuB,CAAA,IAGrD,KAAK,gBAAA,GACL,KAAK,KAAK,QAAQ,EAAE,MAAM,KAAK,MAAM,KAAA,CAAA;EACvC;EAKA,OAAA;GACE,IAAI,KAAK,WAAW;GACpB,IAAA,CAAK,KAAK,MAAM,SAAS;GAEzB,MAAM,IAAW,KAAK,MAAM;GAC5B,KAAK,MAAM,UAAA,CAAU,GACrB,KAAK,MAAM,eAAe,MAE1B,KAAK,gBAAA,GACL,KAAK,KAAK,QAAQ,EAAE,MAAM,EAAA,CAAA;EAC5B;EAKA,OAAO,GAAA;GACD,KAAK,cACL,KAAK,MAAM,UACb,KAAK,KAAA,IAEL,KAAK,KAAK,CAAA;EAEd;EAKA,WAAW,GAAA;GACT,IAAI,KAAK,WAAW;GACpB,IAAI,KAAK,MAAM,SAAS,GAAM;GAE9B,MAAM,IAAW,KAAK,MAAM;GACvB,KAAK,WAAW,CAAA,MAErB,KAAK,MAAM,OAAO,GAElB,KAAK,gBAAA,GACL,KAAK,KAAK,UAAU;IAAE,MAAM;IAAU,IAAI;GAAA,CAAA;EAC5C;EAKA,cAAA;GACM,KAAK,aACJ,KAAK,eAAe,iBAEzB,KAAK,MAAM,cAAA,CAAe,KAAK,MAAM,aACrC,KAAK,gBAAA,GACL,KAAK,KAAK,SAAS,EAAE,aAAa,KAAK,MAAM,YAAA,CAAA;EAC/C;EAKA,SAAS,GAAA;GACH,KAAK,aACJ,KAAK,eAAe,gBACrB,KAAK,MAAM,gBAAgB,MAE/B,KAAK,MAAM,cAAc,GACzB,KAAK,gBAAA,GACL,KAAK,KAAK,SAAS,EAAE,aAAA,EAAA,CAAA;EACvB;EAKA,UAAU,GAAA;GACR,IAAA,CAAI,KAAK,WAQT,QANI,KAAK,QAAQ,iBAAiB,GAAA,KAChC,GAAQ,EAAA,GAGV,KAAK,KAAK,YAAY;IAAE,KAAA;IAAK,OAAO,KAAK,MAAM;GAAA,CAAA,GAEvC,EAAI,MAAZ;IACE,KAAK;IACL,KAAK;KACH,KAAK,cAAc,CAAA;KACnB;IACF,KAAK;KACH,KAAK,gBAAA;KACL;IACF,KAAK;KACH,KAAK,YAAA;KACL;IACF,KAAK;KACH,KAAK,YAAA;KACL;IACF,KAAK;IACL,KAAK;KACH,KAAK,cAAA;KACL;IACF,KAAK;KACH,KAAK,KAAA;KACL;IACF,KAAK,OACH,KAAK,UAAU,CAAA;GAAA;EAMrB;EAKQ,cAAc,GAAA;GACpB,MAAM,IAAW,KAAK,YAAY,CAAA;GAClC,IAAA,CAAK,GAAU;GAEf,MAAM,IAAQ,KAAK,MAAM;GAEzB,IAAI,GAAO;IAET,MAAM,IAAS,GAAmB,GAAO,GAAU,KAAK,MAAM,SAAA;IAC9D,EAAM,QAAQ,EAAO,OACrB,GAAuB,GAAO,EAAO,cAAA,GACrC,KAAK,MAAM,QAAQ,EAAO,OAC1B,KAAK,MAAM,iBAAiB,EAAO,gBAGnC,KAAK,mBAAmB,CAAA;GAC1B,OAAO;IAEL,IAAA,KAC2B,MAAzB,KAAK,MAAM,aACX,KAAK,MAAM,MAAM,UAAU,KAAK,MAAM,WAEtC;IAEF,MAAM,IAAA,KACqB,MAAzB,KAAK,MAAM,YACP,EAAS,SACT,KAAK,MAAM,YAAY,KAAK,MAAM,MAAM,QACxC,IAAgB,EAAS,MAAM,GAAG,KAAK,IAAI,GAAG,CAAA,CAAA;IACpD,IAAA,CAAK,GAAe;IACpB,MAAM,IACJ,KAAK,MAAM,MAAM,MAAM,GAAG,KAAK,MAAM,cAAA,IACrC,IACA,KAAK,MAAM,MAAM,MAAM,KAAK,MAAM,cAAA;IACpC,KAAK,MAAM,QAAQ,GACnB,KAAK,MAAM,kBAAkB,EAAc;GAC7C;GAEA,KAAK,gBAAA,GACL,KAAK,KAAK,SAAS;IAAE,OAAO,KAAK,MAAM;IAAO,KAAA;GAAA,CAAA,GAG9C,KAAK,uBAAA;EACP;EAKQ,kBAAA;GACN,MAAM,IAAQ,KAAK,MAAM;GAEzB,IAAI,GAAO;IACT,MAAM,IAAS,GAAuB,CAAA;IACtC,EAAM,QAAQ,EAAO,OACrB,GAAuB,GAAO,EAAO,cAAA,GACrC,KAAK,MAAM,QAAQ,EAAO,OAC1B,KAAK,MAAM,iBAAiB,EAAO,gBAGnC,KAAK,mBAAmB,CAAA,GAExB,KAAK,gBAAA,GACL,KAAK,KAAK,aAAa;KACrB,aAAa,EAAO;KACpB,OAAO,KAAK,MAAM;IAAA,CAAA;GAEtB,OAAO;IACL,IAAkC,MAA9B,KAAK,MAAM,gBAAsB;IAErC,MAAM,IAAc,KAAK,MAAM,MAAM,OAAO,KAAK,MAAM,iBAAiB,CAAA;IACxE,KAAK,MAAM,QACT,KAAK,MAAM,MAAM,MAAM,GAAG,KAAK,MAAM,iBAAiB,CAAA,IACtD,KAAK,MAAM,MAAM,MAAM,KAAK,MAAM,cAAA,GACpC,KAAK,MAAM,kBAEX,KAAK,gBAAA,GACL,KAAK,KAAK,aAAa;KAAE,aAAA;KAAa,OAAO,KAAK,MAAM;IAAA,CAAA;GAC1D;GAGA,KAAK,uBAAA;EACP;EAOQ,yBAAA;GAEN,IAAA,CAAK,KAAK,MAAM,KAAK,WAAW,eAAA,GAAkB;GAGlD,IAAI,IAA4B;GAI9B,IAFU,MAHA,KAAK,MAAM,MAAM,SAKd,2BAIA,8BAIX,KAAc,KAAK,MAAM,SAAS,KACpC,KAAK,WAAW,CAAA;EAEpB;EAKQ,cAAA;GACN,MAAM,IAAgB,KAAK,MAAM;GAE7B,KAAK,MAAM,iBACb,KAAK,MAAM,aAAa,QAAQ,IAChC,KAAK,mBAAmB,KAAK,MAAM,YAAA,IAGrC,KAAK,MAAM,QAAQ,IACnB,KAAK,MAAM,iBAAiB,GAE5B,KAAK,gBAAA,GACL,KAAK,KAAK,SAAS,EAAE,eAAA,EAAA,CAAA,GAGrB,KAAK,uBAAA;EACP;EAKQ,gBAAA;GACN,KAAK,KAAK,WAAW,EAAE,OAAO,KAAK,MAAM,MAAA,CAAA,GACzC,KAAK,KAAA;EACP;EAKQ,UAAU,GAAA;GAChB,MAAM,IAAa,EAAI,MAAM;GACzB,KACF,KAAK,WAAW,CAAA;EAEpB;EAKQ,YAAY,GAAA;GAClB,MAAM,IAAQ,EAAI,SAAS,EAAI;GAE/B,OAAqB,YAAA,OAAV,IACF,IAGF,KAAK,MAAM,cAAc,EAAM,QAAQ,EAAM;EACtD;EAKA,YAAY,GAAA;GACV,MAAM,IAAQ,EAAI;GAElB,OAAqB,YAAA,OAAV,IACF,IAGF,KAAK,MAAM,cAAc,EAAM,QAAQ,EAAM;EACtD;EAKA,SAAS,GAAA;GACP,IAAI,KAAK,WAAW;GACpB,MAAM,IAAY,GAAW,GAAO,KAAK,MAAM,SAAA;GAC/C,KAAK,MAAM,QAAQ,GACnB,KAAK,MAAM,iBAAiB,EAAU,QAElC,KAAK,MAAM,iBACb,KAAK,MAAM,aAAa,QAAQ,GAChC,GAAuB,KAAK,MAAM,cAAc,EAAU,MAAA,GAC1D,KAAK,mBAAmB,KAAK,MAAM,YAAA,IAGrC,KAAK,gBAAA,GAGL,KAAK,uBAAA;EACP;EAKA,YAAY,GAAA;GACV,IAAI,KAAK,WAAW;GACpB,IAAA,CAAK,GAAM;GAEX,MAAM,IAAQ,KAAK,MAAM;GAEzB,IAAI,GAAO;IACT,MAAM,IAAS,GAAmB,GAAO,GAAM,KAAK,MAAM,SAAA;IAC1D,EAAM,QAAQ,EAAO,OACrB,GAAuB,GAAO,EAAO,cAAA,GACrC,KAAK,MAAM,QAAQ,EAAO,OAC1B,KAAK,MAAM,iBAAiB,EAAO,gBAGnC,KAAK,mBAAmB,CAAA;GAC1B,OAAO;IAOL,IAAA,KAN6B,MAAzB,KAAK,MAAM,cACb,IAAO,EAAK,MACV,GACA,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,KAAK,MAAM,MAAM,MAAA,CAAA,IAAA,CAGnD,GAAM;IACX,MAAM,IACJ,KAAK,MAAM,MAAM,MAAM,GAAG,KAAK,MAAM,cAAA,IACrC,IACA,KAAK,MAAM,MAAM,MAAM,KAAK,MAAM,cAAA;IACpC,KAAK,MAAM,QAAQ,GACnB,KAAK,MAAM,kBAAkB,EAAK;GACpC;GAEA,KAAK,gBAAA;EACP;EAKA,aAAa,GAAA;GACX,IAAI,KAAK,WAAW;GACpB,MAAM,IAAsB,GAAmB,CAAA;GAC/C,KAAK,MAAM,YAAY;GACvB,MAAM,IAAY,GAAW,KAAK,MAAM,OAAO,CAAA,GACzC,IAAU,MAAc,KAAK,MAAM;GACzC,KAAK,MAAM,QAAQ,GACnB,KAAK,MAAM,iBAAiB,KAAK,IAC/B,KAAK,MAAM,gBACX,EAAU,MAAA,GAGV,KAAK,MAAM,gBACX,KAAK,MAAM,aAAa,UAAU,MAElC,KAAK,MAAM,aAAa,QAAQ,GAChC,GAAuB,KAAK,MAAM,cAAc,KAAK,MAAM,cAAA,GAC3D,KAAK,mBAAmB,KAAK,MAAM,YAAA,IAErC,KAAK,gBAAA,GACD,KAAS,KAAK,uBAAA;EACpB;EAKA,UAAU,GAAA;GACR,IAAI,KAAK,WAAW;GACpB,KAAK,MAAM,eAAe;GAC1B,MAAM,IAAY,GAAW,EAAM,OAAO,KAAK,MAAM,SAAA;GACjD,EAAM,UAAU,MAAW,EAAM,QAAQ,IAC7C,KAAK,MAAM,QAAQ,GACnB,KAAK,MAAM,iBAAiB,KAAK,IAC/B,GAAuB,CAAA,GACvB,EAAU,MAAA,GAEZ,KAAK,gBAAA;EACP;EAKA,cAAA;GACM,KAAK,cACT,KAAK,MAAM,eAAe,MAC1B,KAAK,gBAAA;EACP;EAKQ,kBAAA;GACN,KAAK,KAAK,eAAe,EAAA,GAAK,KAAK,MAAA,CAAA;EACrC;EAEQ,mBACN,GAAA;GAEA,MAAM,IAAmB,EAAM,cAAc,aAAa,SAAS;GACnE,EAAM,cAAc,IAAI,EAAiB,SAAS,EAAE,SAAA,CAAS,EAAA,CAAA,CAAA;EAC/D;EAKA,UAAA;GACM,KAAK,cACT,KAAK,KAAA,GACL,KAAK,MAAA,GACL,KAAK,MAAM,eAAe,MAC1B,KAAK,YAAA,CAAY;EACnB;CAAA;CCtkBK,MAAM,KAAyB;EACpC,MAAM;EACN,aAAa;EACb,aAAa;EACb,QAAA,CAAQ;EACR,QAAQ;GACN,YAAY;GACZ,eAAe;GACf,UAAU;GACV,qBAAqB;GACrB,iBAAiB;GACjB,YAAY;GACZ,uBAAuB;GACvB,mBAAmB;GACnB,yBAAyB;GACzB,cAAc;GACd,aAAa;GACb,cAAc;EAAA;EAEhB,OAAO;GACL,WAAW;GACX,WAAW;GACX,QAAQ;GACR,UAAU;GACV,YAAY;GACZ,SAAS;EAAA;EAEX,SAAS;GACP,WAAW;GACX,iBAAiB;GACjB,gBAAgB;GAChB,oBAAoB;GACpB,YAAA,CAAY;GACZ,YAAY;GACZ,cAAA,CAAc;EAAA;CAAA,GAQL,KAAwB;EACnC,MAAM;EACN,aAAa;EACb,aAAa;EACb,QAAA,CAAQ;EACR,QAAQ;GACN,YAAY;GACZ,eAAe;GACf,UAAU;GACV,qBAAqB;GACrB,iBAAiB;GACjB,YAAY;GACZ,uBAAuB;GACvB,mBAAmB;GACnB,yBAAyB;GACzB,cAAc;GACd,aAAa;GACb,cAAc;EAAA;EAEhB,OAAO;GACL,WAAW;GACX,WAAW;GACX,QAAQ;GACR,UAAU;GACV,YAAY;GACZ,SAAS;EAAA;EAEX,SAAS;GACP,WAAW;GACX,iBAAiB;GACjB,gBAAgB;GAChB,oBAAoB;GACpB,YAAA,CAAY;GACZ,YAAY;GACZ,cAAA,CAAc;EAAA;CAAA,GAQL,KAA6B;EACxC,MAAM;EACN,aAAa;EACb,aAAa;EACb,QAAA,CAAQ;EACR,QAAQ;GACN,YAAY;GACZ,eAAe;GACf,UAAU;GACV,qBAAqB;GACrB,iBAAiB;GACjB,YAAY;GACZ,uBAAuB;GACvB,mBAAmB;GACnB,yBAAyB;GACzB,cAAc;GACd,aAAa;GACb,cAAc;EAAA;EAEhB,OAAO;GACL,WAAW;GACX,WAAW;GACX,QAAQ;GACR,UAAU;GACV,YAAY;GACZ,SAAS;EAAA;EAEX,SAAS;GACP,WAAW;GACX,iBAAiB;GACjB,gBAAgB;GAChB,oBAAoB;GACpB,YAAA,CAAY;GACZ,YAAY;GACZ,cAAA,CAAc;EAAA;CAAA,GAQL,KAA4B;EACvC,MAAM;EACN,aAAa;EACb,aAAa;EACb,QAAA,CAAQ;EACR,QAAQ;GACN,YAAY;GACZ,eAAe;GACf,UAAU;GACV,qBAAqB;GACrB,iBAAiB;GACjB,YAAY;GACZ,uBAAuB;GACvB,mBAAmB;GACnB,yBAAyB;GACzB,cAAc;GACd,aAAa;GACb,cAAc;EAAA;EAEhB,OAAO;GACL,WAAW;GACX,WAAW;GACX,QAAQ;GACR,UAAU;GACV,YAAY;GACZ,SAAS;EAAA;EAEX,SAAS;GACP,WAAW;GACX,iBAAiB;GACjB,gBAAgB;GAChB,oBAAoB;GACpB,YAAA,CAAY;GACZ,YAAY;GACZ,cAAA,CAAc;EAAA;CAAA,GAQL,KAAyB;EACpC,MAAM;EACN,aAAa;EACb,aAAa;EACb,QAAA,CAAQ;EACR,QAAQ;GACN,YAAY;GACZ,eAAe;GACf,UAAU;GACV,qBAAqB;GACrB,iBAAiB;GACjB,YAAY;GACZ,uBAAuB;GACvB,mBAAmB;GACnB,yBAAyB;GACzB,cAAc;GACd,aAAa;GACb,cAAc;EAAA;EAEhB,OAAO;GACL,WAAW;GACX,WAAW;GACX,QAAQ;GACR,UAAU;GACV,YAAY;GACZ,SAAS;EAAA;EAEX,SAAS;GACP,WAAW;GACX,iBAAiB;GACjB,gBAAgB;GAChB,oBAAoB;GACpB,YAAA,CAAY;GACZ,YAAY;GACZ,cAAA,CAAc;EAAA;CAAA,GAOL,KAA4C;EACvD,MAAM;EACN,KAAK;EACL,UAAU;EACV,SAAS;EACT,MAAM;CAAA,GAMK,KAAe,ICzNtB,qBAAyC,IAAI,IAAA;CAKnD,IAAI,KAA4B;CAOzB,SAAS,GAAS,GAAA;EACvB,OAAO,GAAa,IAAI,CAAA,KAAS,GAAa,MAAS;CACzD;CAMO,SAAS,GAAc,GAAA;EAC5B,GAAa,IAAI,EAAM,MAAM,CAAA;CAC/B;CAuCO,SAAS,GAAW,GAAA;EACzB,OAAO;GACL,iBAAiB,EAAM,OAAO;GAC9B,qBAAqB,EAAM,OAAO;GAClC,wBAAwB,EAAM,OAAO;GACrC,4BAA4B,EAAM,OAAO;GACzC,wBAAwB,EAAM,OAAO;GACrC,2BAA2B,EAAM,OAAO;GACxC,+BAA+B,EAAM,OAAO;GAC5C,yBAAyB,EAAM,OAAO;GACtC,gCAAgC,EAAM,OAAO;GAC7C,4BAA4B,EAAM,OAAO;GACzC,yBAAyB,GAAG,EAAM,MAAM,UAAA;GACxC,yBAAyB,GAAG,EAAM,MAAM,UAAA;GACxC,sBAAsB,GAAG,EAAM,MAAM,OAAA;GACrC,wBAAwB,GAAG,EAAM,MAAM,SAAA;GACvC,2BAA2B,GAAG,EAAM,MAAM,WAAA;GAC1C,sBAAsB,GAAG,EAAM,MAAM,QAAA;GACrC,yBAAyB,EAAM,QAAQ;GACvC,sBACE;GACF,kCAAkC,GAAG,EAAM,QAAQ,mBAAA;GACnD,2BAA2B,EAAM,OAAO;GACxC,4BAA4B,EAAM,OAAO;EAAA;CAE7C;CA0CO,SAAS,GACd,GACA,GAAA;EAEA,OAAO;GAAA,GACF;GAAA,GACA;GACH,QAAQ;IAAA,GAAK,EAAK;IAAA,GAAW,EAAU;GAAA;GACvC,OAAO;IAAA,GAAK,EAAK;IAAA,GAAU,EAAU;GAAA;GACrC,SAAS;IAAA,GAAK,EAAK;IAAA,GAAY,EAAU;GAAA;EAAA;CAE7C;CCvIA,MAAM,KAAgD;EACpD,QAAQ;GAAE,GAAG;GAAG,GAAG;EAAA;EACnB,YAAA,CAAY;EACZ,iBAAiB;EACjB,kBAAkB;EAClB,iBAAiB;EACjB,UAAA,CAAU;EACV,cAAA,CAAc;EACd,mBAAmB;CAAA;CAGrB,SAAS,GACP,IAA8B,CAAC,GAAA;EAE/B,OAAO;GAAA,GACF;GAAA,GACA;GACH,QAAQ;IAAA,GACH,GAAe;IAAA,GACf,EAAO;GAAA;EAAA;CAGhB;CAMO,IAAM,KAAN,MAAA;EAGL,YAAY,IAA8B,CAAC,GAAA;GACzC,KAAK,SAAS,GAAY,CAAA;EAC5B;EAKA,aAAa,GAAA;GACX,KAAK,SAAS,GAAY;IAAA,GACrB,KAAK;IAAA,GACL;IACH,QAAQ;KAAA,GAAK,KAAK,OAAO;KAAA,GAAW,EAAO;IAAA;GAAA,CAAA;EAE/C;EAKA,YAAA;GACE,OAAO;IAAA,GAAK,KAAK;IAAQ,QAAQ,EAAA,GAAK,KAAK,OAAO,OAAA;GAAA;EACpD;EAUA,UACE,GACA,GAAA;GAEA,MAAM,IAAW,GAAA,GACX,IAAiB,GAAA;GAGvB,IAAI,KAAkD,mBAAhC,KAAK,OAAO,iBAChC,OAAO,KAAK,qBAAqB,GAAU,CAAA;GAI7C,IAAA,CAAK,GAEH,OAAO,KAAK,kBAAkB,GAAU,CAAA;GAG1C,MAAM,IAAa,GAAgB,CAAA,GAC7B,IAAY,IACd,KAAK,OAAO,kBACZ,KAAK,OAAO,kBAGV,IAA8B,mBAAd,IAA+B,WAAW;GAChE,OAAO,KAAK,0BACV,GACA,GACA,GACA,CAAA;EAEJ;EAKQ,qBACN,GAMA,GAAA;GAEA,MAAM,IAAiB,EAAS,UAAU,UAAU,GAC9C,IAAY,KAAK,IAAI,GAAqB,KAAlB,EAAS,SAAe,CAAA,GAChD,IAAgB,KAAK,IAAI,KAAK,IAAI,GAAG,EAAU,MAAA,GAAS,CAAA;GAE9D,OAAO;IACL,UAAU;KACR,GAAG;KACH,GAAG,KAAK,IAAI,GAAG,EAAS,SAAS,IAAgB,CAAA;IAAA;IAEnD,WAAW;IACX,SAAA,CAAS;IACT,WAAA;IACA,UAAU,KAAK,IAAI,GAAG,EAAS,KAAA;IAC/B,WAAW;GAAA;EAEf;EAKQ,kBACN,GACA,GAAA;GAEA,OAAO;IACL,UAAU;KACR,GAAG,KAAK,IAAI,IAAI,EAAS,QAAQ,EAAU,SAAS,CAAA;KACpD,GAAG,KAAK,IAAI,IAAI,EAAS,SAAS,EAAU,UAAU,CAAA;IAAA;IAExD,WAAW;IACX,SAAA,CAAS;GAAA;EAEb;EAKQ,0BACN,GACA,GACA,GAMA,GAAA;GAEA,MAAA,EAAM,QAAE,GAAA,iBAAQ,GAAA,YAAiB,MAAe,KAAK;GAErD,IAAI,GACA,IAAY,GACZ,IAAA,CAAU;GAGd,MAAM,IAA2B;IAC/B,GAAG,EAAW,KAAK,EAAO,KAAK;IAC/B,GAAG,EAAW,IAAI,EAAW,UAAU,EAAO,KAAK;GAAA,GAI/C,IAAwB;IAC5B,GAAG,EAAW,KAAK,EAAO,KAAK;IAC/B,GAAG,EAAW,IAAI,EAAU,UAAU,EAAO,KAAK;GAAA;GAoCpD,IAjC2B,aAAvB,KACF,IAAW,GAIT,KACA,EAAS,IAAI,EAAU,SAAS,EAAS,SAAS,KAG9C,EAAY,KAAK,MACnB,IAAW,GACX,IAAY,OACZ,IAAA,CAAU,OAId,IAAW,GAGP,KAAc,EAAS,IAAI,KAG3B,EAAe,IAAI,EAAU,UAC7B,EAAS,SAAS,MAElB,IAAW,GACX,IAAY,UACZ,IAAA,CAAU,KAMZ,GAAY;IACd,MAAM,IAAO,KAAK,IAChB,GACA,EAAS,QAAQ,EAAU,QAAQ,CAAA;IAErC,EAAS,IAAI,KAAK,IAAI,KAAK,IAAI,EAAS,GAAG,CAAA,GAAkB,CAAA;GAC/D;GAGA,MAAM,IACU,aAAd,IACI,EAAS,SAAS,EAAS,IAAI,IAC/B,EAAW,IAAI;GAErB,OAAO;IACL,UAAA;IACA,WAAA;IACA,SAAA;IACA,WAAW,KAAK,IAAI,GAAG,CAAA;IACvB,UAAU,KAAK,IAAI,GAAG,EAAS,QAA0B,IAAlB,CAAA;GAAA;EAE3C;EAKA,iBAAiB,GAAA;GACf,QAAQ,GAAR;IACE,KAAK,gBACH,OAAO;KACL,WAAW;KACX,SAAS;IAAA;IAEb,KAAK,UACH,OAAO;KACL,WAAW;KACX,SAAS;IAAA;IAEb,KAAK,OACH,OAAO;KACL,WAAW;KACX,SAAS;IAAA;IAEb,SACE,OAAO,EACL,SAAS,IAAA;GAAA;EAGjB;EAKA,eAAe,GAAA;GACb,OAAO;IACL,WAAW;IACX,SAAS;GAAA;EAEb;EAKA,cAAc,GAAA;GACZ,OAAO,KAAK,iBAAiB,CAAA;EAC/B;EAKA,uBAAA;GACE,OAAO,KAAK,OAAO;EACrB;EAKA,iBAAA;GACE,OAAO,GAAA,KAAc,KAAK,OAAO;EACnC;EAKA,iBAAA;GACE,OAAO,KAAK,OAAO;EACrB;CAAA;CCxQF,MAAM,qBAAiB,IAAI,QAAA;CAMpB,IAAM,KAAN,MAAA;EAgCL,YAAY,IAAmC,CAAC,GAAA;GArBhD,KAAQ,SAA6B,MACrC,KAAQ,SAA6B,MACrC,KAAQ,aAAiC,MASzC,KAAQ,WAA0D,MAGlE,KAAQ,aAAgC,CAAA,GACxC,KAAQ,kCAAkB,IAAI,IAAA,GAC9B,KAAQ,gBAAiC,MAGzC,KAAQ,YAAA,CAAY,GAGlB,KAAK,UAAU;GACf,MAAM,IACJ,EAAQ,cACa,eAAA,OAAb,WAA2B,SAAS,OAAO;GACrD,IAAA,CAAK,GACH,MAAM,IAAI,MACR,4EAAA;GAGJ,KAAK,YAAY,GACjB,KAAK,UAAU,IAAI,GAAgB,CAAA,GACnC,KAAK,kBAAkB,IAAI,GAAgB,EAAQ,QAAA,GAGtB,YAAA,OAAlB,EAAQ,QACjB,KAAK,QAAQ,GAAS,EAAQ,KAAA,IACrB,EAAQ,QACjB,KAAK,QAAQ,EAAQ,QAErB,KAAK,QAAQ,IAIf,KAAK,YAAA;EACP;EAKQ,cAAA;GACN,KAAK,QAAQ,GAAG,gBAAe,MAAA;IACzB,EAAM,UACR,KAAK,OAAA,IAEL,KAAK,QAAA;GAAA,CAAA,GAIT,KAAK,QAAQ,GAAG,UAAA,EAAY,OAAA,QAAA;IAC1B,KAAK,QAAQ,UAAU,CAAA;GAAA,CAAA,GAGzB,KAAK,QAAQ,GAAG,YAAA,EAAc,OAAA,QAAA;IAC5B,KAAK,QAAQ,YAAY,CAAA;GAAA,CAAA;EAE7B;EAKA,KAAK,GAAA;GACC,KAAK,cACT,KAAK,WAAW,KAAU,MAC1B,KAAK,QAAQ,KAAK,CAAA;EACpB;EAKA,QAAA;GACE,IAAI,KAAK,WAAW;GACpB,MAAM,IAAa,KAAK,QAAQ,SAAA,CAAA,CAAW;GAC3C,KAAK,QAAQ,KAAA,GACT,KAAY,KAAK,QAAQ,UAAA;EAC/B;EAKA,WAAW,GAAA;GACL,KAAK,aACT,KAAK,QAAQ,WAAW,CAAA;EAC1B;EAKA,SAAS,GAAA;GACH,KAAK,cAEP,KAAK,QADc,YAAA,OAAV,IACI,GAAS,CAAA,IAET,GAEX,KAAK,QAAQ,SAAA,CAAA,CAAW,WAC1B,KAAK,OAAA;EAET;EAKA,WAAA;GACE,OAAO,KAAK,QAAQ,SAAA,CAAA,CAAW;EACjC;EAKA,SAAS,GAAA;GACH,KAAK,aACT,KAAK,QAAQ,SAAS,CAAA;EACxB;EAKQ,SAAA;GACN,IAAI,KAAK,WAAW;GACpB,MAAM,IAAS,KAAK,QAAQ,UAAA;GAC5B,IAAA,CAAK,GAAQ;GAGb,KAAK,QAAA,GAGL,KAAK,SAAS,SAAS,cAAc,KAAA,GACrC,KAAK,OAAO,YAAY;GAExB,MAAM,IAAiB,GAAA;GAGnB,MACF,KAAK,SAAS,SAAS,cAAc,KAAA,GACrC,KAAK,OAAO,YAAY,WACxB,KAAK,OAAO,iBAAiB,eAAA;IACvB,KAAK,gBAAgB,eAAA,KAAkB,KAAK,MAAA;GAAA,CAAA,GAElD,KAAK,OAAO,YAAY,KAAK,MAAA,IAI/B,KAAK,aAAa,SAAS,cAAc,KAAA,GACzC,KAAK,WAAW,YAAY,yBAAsB,IAAiB,WAAW;GAG9E,MAAM,IAAU,GAAW,KAAK,KAAA,GAC1B,IAAkB,KAAK;GAC7B,IAAA,CAAK,GAAiB;GACtB,OAAO,QAAQ,CAAA,CAAA,CAAS,SAAA,CAAU,GAAK,OAAA;IACjC,KACF,EAAgB,MAAM,YAAY,GAAK,CAAA;GAAA,CAAA;GAK3C,MAAM,IAAY,KAAK,eAAe,CAAA;GAOtC,IANA,KAAK,WAAW,YAAY,CAAA,GAE5B,KAAK,OAAO,YAAY,KAAK,UAAA,GAC7B,KAAK,UAAU,YAAY,KAAK,MAAA,GAAA,CAG3B,KAAkB,KAAK,UAAU;IACpC,MAAM,IAAO,KAAK,WAAW,sBAAA,GACvB,IAAS,KAAK,gBAAgB,UAAU,KAAK,UAAU;KAC3D,OAAO,EAAK;KACZ,QAAQ,EAAK;IAAA,CAAA;IAEf,KAAK,WAAW,MAAM,WAAW,SACjC,KAAK,WAAW,MAAM,OAAO,GAAG,EAAO,SAAS,EAAA,KAChD,KAAK,WAAW,MAAM,MAAM,GAAG,EAAO,SAAS,EAAA,KAC/C,KAAK,WAAW,MAAM,SAAS;GACjC,OAAW,MACT,KAAK,WAAW,MAAM,WAAW,SACjC,KAAK,WAAW,MAAM,OAAO,KAC7B,KAAK,WAAW,MAAM,QAAQ,KAC9B,KAAK,WAAW,MAAM,SAAS,KAC/B,KAAK,WAAW,MAAM,SAAS;GAUjC,IANA,4BAAA;IACE,KAAK,YAAY,UAAU,IAAI,mBAAA,GAC/B,KAAK,QAAQ,UAAU,IAAI,kBAAA;GAAA,CAAA,GAAA,CAIY,MAArC,KAAK,QAAQ,uBAAiC,KAAK,YAAY;IACjE,MAAM,IAAU,GAAe,KAAK,aAAY,MAAA;KAE5C,KAAK,YACL,EAAM,kBAAkB,QACxB,KAAK,SAAS,SAAS,EAAM,MAAA,KAG/B,KAAK,MAAA;IAAA,CAAA;IAEP,KAAK,WAAW,KAAK,CAAA;GACvB;GAGA,KAAK,aAAA;EACP;EAKQ,eAAe,GAAA;GACrB,MAAM,IAAK,SAAS,cAAc,KAAA;GAClC,EAAG,YAAY;GAEf,MAAM,IAAQ,KAAK,QAAQ,SAAA;GA+D3B,OA7DA,EAAO,KAAK,SAAQ,MAAA;IAClB,MAAM,IAAQ,SAAS,cAAc,KAAA;IACrC,EAAM,YAAY,UAAU,EAAI,aAAa;IAE7C,MAAM,IAA6B,iBAAlB,EAAI;IAErB,EAAI,KAAK,SAAQ,MAAA;KACf,MAAM,IAAY,SAAS,cAAc,KAAA;KAGzC,IAFA,EAAU,YAAY,kBAElB,GACF,EAAU,MAAM,OAAO,OAAO,EAAI,SAAS,CAAA;UAC7C,IAAW,EAAI,OAAO;MACpB,MAAM,IAAQ,IACR,IAAM,KAAK,MAAM,OAAO,UAAU,GAClC,IAAI,IAAQ,EAAI,SAAS,EAAI,QAAQ,KAAK;MAChD,EAAU,MAAM,QAAQ,GAAG,EAAA;KAC7B;KAEA,MAAM,IAAQ,SAAS,cAAc,QAAA;KASrC,IARA,EAAM,OAAO,UACb,EAAM,YAAY,KAAK,YAAY,GAAK,EAAM,WAAA,GAE1C,EAAI,aACN,EAAM,WAAA,CAAW,IAIf,EAAI,MAAM;MACZ,MAAM,IAAW,GAAgB,EAAI,IAAA;MACjC,IAAU,EAAM,YAAY,IAC3B,EAAM,cAAc,EAAI;KAC/B,OAOE,EAAM,cALiB,YAAA,OAAd,EAAI,QACP,EAAI,QACJ,EAAM,cACJ,EAAI,MAAM,QACV,EAAI,MAAM;KAKpB,MAAM,KAAW,MAAA;MACf,EAAE,eAAA,GACF,EAAE,gBAAA,GACG,EAAI,YACP,KAAK,QAAQ,UAAU,CAAA;KAAA;KAI3B,EAAM,iBAAiB,aAAa,CAAA,GACpC,EAAM,iBAAiB,cAAc,GAAS,EAAE,SAAA,CAAS,EAAA,CAAA,GAEzD,EAAU,YAAY,CAAA,GACtB,EAAM,YAAY,CAAA;IAAA,CAAA,GAGpB,EAAG,YAAY,CAAA;GAAA,CAAA,GAGV;EACT;EAKQ,YAAY,GAAoB,GAAA;GACtC,MAAM,IAAU,CAAC,UAAU,WAAW,EAAI,MAAA;GAI1C,OAHI,EAAI,aAAW,EAAQ,KAAK,EAAI,SAAA,GAChC,EAAI,YAAU,EAAQ,KAAK,kBAAA,GACd,YAAb,EAAI,QAAoB,KAAa,EAAQ,KAAK,gBAAA,GAC/C,EAAQ,KAAK,GAAA;EACtB;EAKQ,UAAA;GACN,KAAK,WAAW,SAAQ,MAAM,EAAA,CAAA,GAC9B,KAAK,aAAa,CAAA,GAEd,KAAK,UAAU,KAAK,OAAO,cAC7B,KAAK,OAAO,WAAW,YAAY,KAAK,MAAA,GAE1C,KAAK,SAAS,MACd,KAAK,SAAS,MACd,KAAK,aAAa;EACpB;EAKQ,eAAA;GACN,MAAM,IAAgB,KAAK,UAAU;GACrC,IAAI,KAAK,kBAAkB,GAAe;GAC1C,MAAM,IAAW,GAAe,IAAI,CAAA;GACpC,IAAI,GAGF,OAFA,EAAS,SAAS,GAAA,MAClB,KAAK,gBAAgB;GAIvB,MAAM,IAAQ,EAAc,cAAc,OAAA;GAC1C,EAAM,cAAc,igGAyBpB,EAAM,KAAK,sBACX,EAAc,MAAM,YAAY,CAAA,GAChC,GAAe,IAAI,GAAe;IAAE,SAAS;IAAO,OAAO;GAAA,CAAA,GAC3D,KAAK,gBAAgB;EACvB;EAKA,UAAU,GAAA;GACR,IAAI,KAAK,WAAW,aAAA,CAAA;GACpB,MAAM,UAAoB,KAAK,KAAK,CAAA;GACpC,EAAM,iBAAiB,SAAS,CAAA,GAGhC,EAAM,aAAa,YAAY,UAAA,GAC/B,EAAM,MAAM,aAAa;GAEzB,IAAI,IAAA,CAAU;GACd,MAAM,UAAA;IACA,MACJ,IAAA,CAAU,GACV,EAAM,oBAAoB,SAAS,CAAA,GACnC,EAAM,gBAAgB,UAAA,GACtB,EAAM,MAAM,aAAa;GAAA;GAG3B,OADA,KAAK,gBAAgB,IAAI,CAAA,GAClB;EACT;EAKA,UAAA;GACE,IAAA,CAAI,KAAK,cACT,KAAK,YAAA,CAAY,GACjB,KAAK,QAAA,GACL,KAAK,gBAAgB,SAAQ,MAAW,EAAA,CAAA,GACxC,KAAK,gBAAgB,MAAA,GACrB,KAAK,QAAQ,QAAA,GAGT,KAAK,gBAAe;IACtB,MAAM,IAAQ,GAAe,IAAI,KAAK,aAAA;IAClC,MACF,EAAM,SAAS,GACX,EAAM,SAAS,MACjB,EAAM,QAAQ,OAAA,GACd,GAAe,OAAO,KAAK,aAAA,KAG/B,KAAK,gBAAgB;GACvB;EACF;CAAA;CC7cK,SAAS,GAAY,GAAA;EAC1B,MAAM,IAAS,EAAM,QAAQ,OAAO,EAAA,CAAA,CAAI,MAAM,GAAG,EAAA;EACjD,OAAI,EAAO,UAAU,IAAU,IAC3B,EAAO,UAAU,IAAU,GAAG,EAAO,MAAM,GAAG,CAAA,EAAA,GAAM,EAAO,MAAM,CAAA,MAC9D,GAAG,EAAO,MAAM,GAAG,CAAA,EAAA,GAAM,EAAO,MAAM,GAAG,CAAA,EAAA,GAAM,EAAO,MAAM,CAAA;CACrE;CAMO,SAAS,GAAe,GAAA;EAE7B,OADe,EAAM,QAAQ,OAAO,EAAA,CAAA,CAAI,MAAM,GAAG,EAAA,CAAA,CACnC,QAAQ,kBAAkB,KAAA;CAC1C;CAiCO,SAAS,GAAa,GAAA;EAC3B,OAAO,EACJ,QAAQ,YAAY,EAAA,CAAA,CACpB,MAAM,GAAG,EAAA,CAAA,CACT,YAAA;CACL;CAKO,SAAS,GAAmB,GAAA;EACjC,OAAO,EAAM,YAAA,CAAA,CAAc,MAAM,GAAG,CAAA;CACtC;CAOO,SAAS,GAAiB,GAAe,IAAiB,GAAA;EAC/D,OAAO,EAAM,QAAQ,OAAO,EAAA,CAAA,CAAI,MAAM,GAAG,CAAA;CAC3C;CAOA,MAAM,qBAA6C,IAAI,IAAI;EACzD,CAAC,SAAS,EAAA;EACV,CAAC,YAAY,EAAA;EACb,CAAC,UAAU,EAAA;EACX,CAAC,iBAAiB,EAAA;EAClB,CAAC,cAAc,EAAA;CAAA,CAAA;CC7EV,SAAS,GAAgB,GAAA;EAC9B,MAAM,IAAS,CAAA,GAAI,CAAA;EACnB,KAAA,IAAS,IAAI,EAAO,SAAS,GAAG,IAAI,GAAG,KAAK;GAC1C,MAAM,IAAI,KAAK,MAAM,KAAK,OAAA,KAAY,IAAI,EAAA;GAAA,CACxC,EAAO,IAAI,EAAO,MAAM,CAAC,EAAO,IAAI,EAAO,EAAA;EAC/C;EACA,OAAO;CACT;CAKO,SAAS,KAAA;EACd,OAAO,GAAa;GAAC;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;EAAA,CAAA;CACpE;CAKO,SAAS,KAAA;EAId,OAAO,GAHS,MAAM,KAAK,EAAE,QAAQ,GAAA,IAAO,GAAG,MAC7C,OAAO,aAAa,KAAK,CAAA,CAAA,CAAA;CAG7B;CAKO,SAAS,KAAA;EAKd,OAAO,GAAa;GAJH;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAK;GAAA,GAC9C,MAAM,KAAK,EAAE,QAAQ,GAAA,IAAO,GAAG,MAC7C,OAAO,aAAa,KAAK,CAAA,CAAA;EAAA,CAAA;CAG7B;CAKA,SAAS,GAAc,GAAc,GAAA;EACnC,OAAO;GACL,IAAI,UAAU,EAAA,GAAQ;GACtB,MAAM;GACN,OAAO;GACP,OAAO;GACP,WAAW;EAAA;CAEf;CAqBO,SAAS,GAAyB,GAAA;EAUvC,MAAA,EAAM,YACJ,IAAa,GAAA,kBACb,IAAA,CAAmB,GAAA,aACnB,IAAA,CAAc,GAAA,cACd,IAAA,CAAe,MACb,KAAW,CAAC,GAMV,IArCR,SAAuB,GAAY,GAAA;GACjC,MAAM,IAAgB,CAAA;GACtB,KAAA,IAAS,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK,GACrC,EAAO,KAAK,EAAM,MAAM,GAAG,IAAI,CAAA,CAAA;GAEjC,OAAO;EACT,EA2BwB,GAAA,CAAA,CACW,KAAK,GAAG,MAAM,GAAc,GAAG,CAAA,CAAA,GAC1B,CAAA,CAAA,CAEH,KAAI,OAAA;GACrC,WAAW;GACX,MAAA;EAAA,EAAA,GAII,IAA0B,CAAA;EAoChC,OAlCI,KACF,EAAO,KAAK;GACV,IAAI;GACJ,MAAM;GACN,OAAO;GACP,WAAW;EAAA,CAAA,GAIX,KACF,EAAO,KAAK;GACV,IAAI;GACJ,MAAM;GACN,OAAO;GACP,WAAW;EAAA,CAAA,GAIX,KACF,EAAO,KAAK;GACV,IAAI;GACJ,MAAM;GACN,OAAO;GACP,WAAW;EAAA,CAAA,GAIX,EAAO,SAAS,KAClB,EAAK,KAAK;GACR,WAAW;GACX,MAAM;EAAA,CAAA,GAIH;GACL,MAAM;GACN,MAAM;GACN,cAAA,CAAc;GACd,MAAA;GACA,MAAM;IACJ,UAAA,CAAU;IACV,YAAY;GAAA;EAAA;CAGlB;CAKO,SAAS,GAAsB,GAAA;EAMpC,MAAA,EAAM,kBAAE,IAAA,CAAmB,GAAA,aAAM,IAAA,CAAc,MAAS,KAAW,CAAC,GAE9D,IAAgB,GAAA,GAGhB,IAAsB;GAC1B;IACE,WAAW;IACX,MAAM,EAAc,MAAM,GAAG,CAAA,CAAA,CAAG,KAAK,GAAG,MAAM,GAAc,GAAG,CAAA,CAAA;GAAA;GAEjE;IACE,WAAW;IACX,MAAM,EAAc,MAAM,GAAG,CAAA,CAAA,CAAG,KAAK,GAAG,MAAM,GAAc,GAAG,IAAI,CAAA,CAAA;GAAA;GAErE;IACE,WAAW;IACX,MAAM,EAAc,MAAM,GAAG,CAAA,CAAA,CAAG,KAAK,GAAG,MAAM,GAAc,GAAG,IAAI,CAAA,CAAA;GAAA;EAAA,GAKjE,IAA2B,CAAA;EA6CjC,OA3CI,IACF,EAAQ,KAAK;GACX,IAAI;GACJ,MAAM;GACN,OAAO;GACP,WAAW;EAAA,CAAA,IAGb,EAAQ,KAAK;GACX,IAAI;GACJ,MAAM;GACN,OAAO;GACP,OAAO;GACP,UAAA,CAAU;GACV,WAAW;EAAA,CAAA,GAIf,EAAQ,KAAK,GAAc,EAAc,IAAI,CAAA,CAAA,GAEzC,IACF,EAAQ,KAAK;GACX,IAAI;GACJ,MAAM;GACN,OAAO;GACP,WAAW;EAAA,CAAA,IAGb,EAAQ,KAAK;GACX,IAAI;GACJ,MAAM;GACN,OAAO;GACP,OAAO;GACP,UAAA,CAAU;GACV,WAAW;EAAA,CAAA,GAIf,EAAK,KAAK;GACR,WAAW;GACX,MAAM;EAAA,CAAA,GAGD;GACL,MAAM;GACN,MAAM;GACN,cAAA,CAAc;GACd,MAAA;GACA,MAAM;IACJ,UAAA,CAAU;IACV,YAAY;GAAA;EAAA;CAGlB;CAMO,SAAS,GAAyB,GAAA;EAMvC,MAAA,EAAM,WAAE,IAAA,CAAY,GAAA,iBAAM,IAAkB;GAAC;GAAI;GAAG;EAAA,MAAO,KAAW,CAAC;EAEvE,IAAI,IAAgB,GAAA;EACf,MACH,IAAgB,EAAc,KAAI,MAAK,EAAE,YAAA,CAAA;EAG3C,MAAM,IAAa,EAAc,KAAK,GAAG,MAAM,GAAc,GAAG,CAAA,CAAA,GAG1D,IAAsB,CAAA;EAC5B,IAAI,IAAS;EACb,KAAA,MAAW,KAAS,GAClB,EAAK,KAAK;GACR,WAAW;GACX,MAAM,EAAW,MAAM,GAAQ,IAAS,CAAA;EAAA,CAAA,GAE1C,KAAU;EAmCZ,OAhCI,IAAS,EAAW,UACtB,EAAK,KAAK;GACR,WAAW;GACX,MAAM,EAAW,MAAM,CAAA;EAAA,CAAA,GAK3B,EAAK,KAAK;GACR,WAAW;GACX,MAAM;IACJ;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,WAAW;IAAA;IAEb;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,WAAW;IAAA;IAEb;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,WAAW;IAAA;GAAA;EAAA,CAAA,GAKV;GACL,MAAM;GACN,MAAM;GACN,cAAA,CAAc;GACd,MAAA;GACA,MAAM;IACJ,UAAA,CAAU;IACV,YAAY;GAAA;EAAA;CAGlB;CAMO,SAAS,GAAwB,GAAA;EAItC,MAAA,EAAM,iBAAE,IAAkB;GAAC;GAAI;GAAI;GAAG;EAAA,MAAO,KAAW,CAAC,GAGnD,IADc,GAAA,CAAA,CACS,KAAK,GAAG,MAAM,GAAc,GAAG,CAAA,CAAA,GAGtD,IAAsB,CAAA;EAC5B,IAAI,IAAS;EACb,KAAA,MAAW,KAAS,GAAiB;GACnC,IAAI,KAAU,EAAS,QAAQ;GAC/B,EAAK,KAAK;IACR,WAAW;IACX,MAAM,EAAS,MAAM,GAAQ,IAAS,CAAA;GAAA,CAAA,GAExC,KAAU;EACZ;EAkCA,OAhCI,IAAS,EAAS,UACpB,EAAK,KAAK;GACR,WAAW;GACX,MAAM,EAAS,MAAM,CAAA;EAAA,CAAA,GAKzB,EAAK,KAAK;GACR,WAAW;GACX,MAAM;IACJ;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,WAAW;IAAA;IAEb;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,WAAW;IAAA;IAEb;KACE,IAAI;KACJ,MAAM;KACN,OAAO;KACP,WAAW;IAAA;GAAA;EAAA,CAAA,GAKV;GACL,MAAM;GACN,MAAM;GACN,cAAA,CAAc;GACd,MAAA;GACA,MAAM;IACJ,UAAA,CAAU;IACV,YAAY;GAAA;EAAA;CAGlB;CAAA,QAAA,iBAAA,GAAA,QAAA,eAAA,IAAA,QAAA,QAAA,GAAA,QAAA,aAAA,GAAA,QAAA,aAAA,GAAA,QAAA,aAAA,GAAA,QAAA,cAAA,GAAA,QAAA,aAAA,GAAA,QAAA,gBAAA,GAAA,QAAA,aAAA,GAAA,QAAA,aAAA,GAAA,QAAA,aAAA,GAAA,QAAA,kBAAA,IAAA,QAAA,mBAAA,IAAA,QAAA,gBAAA,GAAA,QAAA,YAAA,GAAA,QAAA,kBAAA,IAAA,QAAA,eAAA,GAAA,QAAA,qBAAA,GAAA,QAAA,iBDhRO,SAAwB,GAAc,GAAA;EAC3C,MAAM,IAAY,GAAW,IAAI,CAAA;EACjC,OAAO,IAAY,EAAU,CAAA,IAAS;CACxC,GAAA,QAAA,aHRO,SAAoB,GAAsB,GAAA;EAC/C,MAAM,IAAU,GAAW,CAAA;EAC3B,OAAO,QAAQ,CAAA,CAAA,CAAS,SAAA,CAAU,GAAK,OAAA;GACjC,KACF,EAAQ,MAAM,YAAY,GAAK,CAAA;EAAA,CAAA,GAKnC,EAAQ,UAAU,OAAO,wBAAwB,qBAAA,GACjD,EAAQ,UAAU,IAChB,EAAM,SAAS,wBAAwB,sBAAA,GAEzC,EAAQ,QAAQ,QAAQ,EAAM;CAChC,GAAA,QAAA,iBAAA,GAAA,QAAA,gBJqGO,SACL,GACA,GACA,GAAA;EAEA,MAAM,IAAU,SAAS,cAAc,CAAA;EAkBvC,OAhBI,KACF,OAAO,QAAQ,CAAA,CAAA,CAAO,SAAA,CAAU,GAAK,OAAA;GACnC,EAAQ,aAAa,GAAK,CAAA;EAAA,CAAA,GAI1B,KACF,EAAS,SAAQ,MAAA;GACM,YAAA,OAAV,IACT,EAAQ,YAAY,SAAS,eAAe,CAAA,CAAA,IAE5C,EAAQ,YAAY,CAAA;EAAA,CAAA,GAKnB;CACT,GAAA,QAAA,wBEiWO,SACL,GAAA;EAEA,OAAO,IAAI,GAAgB,CAAA;CAC7B,GAAA,QAAA,yBI/HO,SACL,GAAA;EAEA,OAAO,IAAI,GAAiB,CAAA;CAC9B,GAAA,QAAA,wBDrKO,SACL,GAAA;EAEA,OAAO,IAAI,GAAgB,CAAA;CAC7B,GAAA,QAAA,2BAAA,IAAA,QAAA,0BAAA,IAAA,QAAA,2BAAA,IAAA,QAAA,wBAAA,IAAA,QAAA,cD9JO,SACL,GACA,GACA,GAAA;EAGA,MAAM,IAAQ,GADD,GAAS,CAAA,GACS;GAAA,GAC1B;GACH,MAAA;EAAA,CAAA;EAGF,OADA,GAAc,CAAA,GACP;CACT,GAAA,QAAA,YAAA,IAAA,QAAA,eAAA,IAAA,QAAA,yBAAA,IAAA,QAAA,cAAA,GAAA,QAAA,eG/IO,SAAsB,GAAe,IAAwB,GAAA;EAElE,IAAI,IAAS,EAAM,QAAQ,WAAW,EAAA;EAGtC,MAAM,IAAQ,EAAO,MAAM,GAAA;EAe3B,OAdI,EAAM,SAAS,MACjB,IAAS,GAAG,EAAM,GAAA,GAAM,EAAM,MAAM,CAAA,CAAA,CAAG,KAAK,EAAA,MAIzB,MAAjB,EAAM,UAAgB,EAAM,EAAA,CAAG,SAAS,MAC1C,IAAS,GAAG,EAAM,GAAA,GAAM,EAAM,EAAA,CAAG,MAAM,GAAG,CAAA,MAIxC,EAAO,SAAS,KAAK,EAAO,WAAW,GAAA,KAAsB,QAAd,EAAO,OACxD,IAAS,EAAO,QAAQ,OAAO,EAAA,KAAO,MAGjC;CACT,GAAA,QAAA,iBAAA,IAAA,QAAA,eAAA,IAAA,QAAA,qBAAA,IAAA,QAAA,cAAA,IAAA,QAAA,mBAAA,IAAA,QAAA,qBH6EO,SAA4B,GAAA;EACjC,MAAM,IAAU,GAAW,CAAA;EAC3B,OAAO,OAAO,QAAQ,CAAA,CAAA,CACnB,QAAA,GAAW,OAAW,CAAA,CAAA,CACtB,KAAA,CAAM,GAAK,OAAW,GAAG,EAAA,IAAQ,GAAA,CAAA,CACjC,KAAK,IAAA;CACV,GAAA,QAAA,eApFO,WAAA;EACL,OAAO,CAAA,GAAI,OAAO,OAAO,EAAA,GAAA,GAAkB,GAAa,OAAA,CAAA;CAC1D,GAAA,QAAA,sBNmEO,WAAA;EACL,OAAO,CAAA,GAAI,OAAO,KAAK,CAAA,GAAA,GAAoB,OAAO,KAAK,CAAA,CAAA;CACzD,GAAA,QAAA,qBM/EO,WAAA;EACL,OAAO,CAAA,GAAI,OAAO,KAAK,EAAA,GAAA,GAAkB,GAAa,KAAA,CAAA;CACxD,GAAA,QAAA,kBAAA,IAAA,QAAA,kBAsBO,WAAA;EACL,OAAO;CACT,GAAA,QAAA,gBLOO,WAAA;EACL,OAAO,GAAA,IAAa,WAAW;CACjC,GAAA,QAAA,mBCtDO,SAA0B,GAAA;EAC/B,MAAM,IAAO,EAAQ,sBAAA,GACf,IAAa,OAAO,eAAe,SAAS,gBAAgB,YAC5D,IAAY,OAAO,eAAe,SAAS,gBAAgB;EAEjE,OAAO;GACL,GAAG,EAAK,OAAO;GACf,GAAG,EAAK,MAAM;EAAA;CAElB,GAAA,QAAA,eOyEO,SAAsB,GAAA;EAC3B,OAAO,GAAW,IAAI,CAAA;CACxB,GAAA,QAAA,yBAAA,IAAA,QAAA,YAAA,GAAA,QAAA,wBAAA,IAAA,QAAA,mBAAA,IAAA,QAAA,mBAAA,IAAA,QAAA,oBAAA,IAAA,QAAA,WAAA,IAAA,QAAA,kBAAA,IAAA,QAAA,YTqBO,SAAmB,GAAA;EACxB,OAAO,KAAQ,KAAkB,KAAQ;CAC3C,GAAA,QAAA,eAAA,GAAA,QAAA,qBAAA,IAAA,QAAA,gBAAA,GAAA,QAAA,WAAA,IAAA,QAAA,iBAAA,IAAA,QAAA,sBE7FO,SAA6B,GAAA;EAClC,MAAM,IAAO,EAAQ,sBAAA;EACrB,OACE,EAAK,OAAO,KACZ,EAAK,QAAQ,KACb,EAAK,WACF,OAAO,eAAe,SAAS,gBAAgB,iBAClD,EAAK,UAAU,OAAO,cAAc,SAAS,gBAAgB;CAEjE,GAAA,QAAA,WAAA,IAAA,QAAA,aAAA,IAAA,QAAA,gBAAA,IAAA,QAAA,iCAAA,GAAA,QAAA,qBAAA,GAAA,QAAA,2BAAA,GAAA,QAAA,6BAAA,GAAA,QAAA,gBAAA,IAAA,QAAA,aAAA,IAAA,QAAA,eAAA,IAAA,QAAA,YAAA,IAAA,QAAA,eAAA,GAAA,QAAA,iBAAA,IAAA,QAAA,mBDkIO,SACL,GAAA;EAEA,IAAsB,eAAA,OAAX,QACT,aAAA,CAAA;EAGF,MAAM,UAAA;GACJ,EAAS,GAAA,CAAA;EAAA;EAMX,OAHA,OAAO,iBAAiB,UAAU,CAAA,GAClC,OAAO,iBAAiB,qBAAqB,CAAA,SAE7C;GACE,OAAO,oBAAoB,UAAU,CAAA,GACrC,OAAO,oBAAoB,qBAAqB,CAAA;EAAA;CAEpD,GAAA,QAAA,cAAA,GAAA,QAAA,oBAAA,GAAA,QAAA,eAAA,IAAA,QAAA,mCCpIO,SAA0C,GAAA;EAC/C,EAAM,eAAA,GACN,EAAM,gBAAA;CACR,GAAA,QAAA,cAAA,GAAA,QAAA,eAAA,GAAA,QAAA,sBQsUO,SAA6B,GAAA;EAGlC,QAFmB,EAAO,MAAM,YAEhC;GACE,KAAK,UACH,OAAO,GAAA;GACT,KAAK,OACH,OAAO,GAAA;GACT,KAAK,UACH,OAAO,GAAA;GACT,KAAK,SACH,OAAO,GAAA;GACT,SACE,OAAO;EAAA;CAEb,GAAA,QAAA,oBDvTO,SACL,GACA,GAAA;EAEA,GAAW,IAAI,GAAM,CAAA;CACvB,GAAA,QAAA,iBAAA,GAAA,QAAA,kBTiDO,SAAyB,GAAA;EAC9B,OAAO,QAAQ,CAAA,CAAA,CAAS,SAAA,CAAU,GAAM,OAAA;GACtC,EAAe,GAAM,CAAA;EAAA,CAAA;CAEzB,GAAA,QAAA,gBAAA,IAAA,QAAA,kBAAA,IAAA,QAAA,yBE7DO,SACL,GACA,GAAA;EAEA,IAAA,CAAK,GAEH,OAAA,KADA,EAAQ,eAAe;GAAE,UAAU;GAAU,OAAO;EAAA,CAAA;EAItD,MAAM,IAAc,EAAQ,sBAAA,GACtB,IAAgB,EAAU,sBAAA;EAE5B,EAAY,SAAS,EAAc,SACrC,EAAU,aAAa,EAAY,SAAS,EAAc,SACjD,EAAY,MAAM,EAAc,QACzC,EAAU,aAAa,EAAc,MAAM,EAAY;CAE3D,GAAA,QAAA,eAAA,GAAA,QAAA,kBInDO,SAAyB,GAAA;EAE9B,OADA,KAAe,GAAS,CAAA,GACjB;CACT,GAAA,QAAA,yBAAA,IAAA,QAAA,YJ2OO,SACL,GACA,GAAA;EAEA,OAAO,OAAO,EAAQ,OAAO,CAAA;CAC/B,GAAA,QAAA,eAAA,IAAA,QAAA,kBAAA,IAAA,QAAA,eAAA,GAAA,QAAA,gBAAA,GAAA,QAAA,aAAA,IAAA,QAAA,cAhBO,SACL,GACA,GACA,GAAA;EAEA,EAAQ,UAAU,OAAO,GAAW,CAAA;CACtC,GAAA,QAAA,mBF1JO,SAA0B,GAAA;EAC/B,OAAI,KAAQ,MAAA,OACH,EAAc,IAAA,CACd;CAGX,GAAA,QAAA,YAAA,GAAA,QAAA,mBAAA,GAAA,QAAA,UAAA;AAAA,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":1,"configuration":"01303d5b42e680d15930924ce86ce67e413cbbe2e243ea398335a5dbd82160cf","sources":{"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\icons.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\icons.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\types\\keyboard.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\types\\keyboard.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\types\\position.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\types\\position.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\types\\index.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\types\\index.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\layouts\\amount.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\layouts\\amount.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\layouts\\bankcard.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\layouts\\bankcard.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\layouts\\email.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\layouts\\email.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\layouts\\idcard.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\layouts\\idcard.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\layouts\\license-plate.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\layouts\\license-plate.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\layouts\\number.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\layouts\\number.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\layouts\\phone.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\layouts\\phone.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\layouts\\punct.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\layouts\\punct.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\layouts\\qwerty.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\layouts\\qwerty.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\layouts\\search.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\layouts\\search.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\layouts\\symbol.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\layouts\\symbol.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\layouts\\url.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\layouts\\url.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\layouts\\verifycode.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\layouts\\verifycode.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\layouts\\index.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\layouts\\index.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\utils\\device.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\utils\\device.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\utils\\dom.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\utils\\dom.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\utils\\event-emitter.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\utils\\event-emitter.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\managers\\keyboard-manager.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\managers\\keyboard-manager.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\themes\\types.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\themes\\types.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\themes\\presets.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\themes\\presets.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\themes\\index.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\themes\\index.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\managers\\position-manager.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\managers\\position-manager.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\managers\\keyboard-renderer.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\managers\\keyboard-renderer.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\managers\\index.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\managers\\index.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\utils\\formatters.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\utils\\formatters.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\utils\\random.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\utils\\random.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\utils\\index.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\utils\\index.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\src\\index.ts":["D:\\WorkBench\\ldesign\\libraries\\keyboard\\packages\\core\\es\\index.d.ts"]}}
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.full.d.ts","../src/icons.ts","../src/types/keyboard.ts","../src/types/position.ts","../src/types/index.ts","../src/layouts/amount.ts","../src/layouts/bankcard.ts","../src/layouts/email.ts","../src/layouts/idcard.ts","../src/layouts/license-plate.ts","../src/layouts/number.ts","../src/layouts/phone.ts","../src/layouts/punct.ts","../src/layouts/qwerty.ts","../src/layouts/search.ts","../src/layouts/symbol.ts","../src/layouts/url.ts","../src/layouts/verifycode.ts","../src/layouts/index.ts","../src/utils/device.ts","../src/utils/dom.ts","../src/utils/event-emitter.ts","../src/managers/keyboard-manager.ts","../src/themes/types.ts","../src/themes/presets.ts","../src/themes/index.ts","../src/managers/position-manager.ts","../src/managers/keyboard-renderer.ts","../src/managers/index.ts","../src/utils/formatters.ts","../src/utils/random.ts","../src/utils/index.ts","../src/index.ts"],"fileIdsList":[[52,55,69,76,79,82],[52,55],[55,56,57,58,59,60,61,62,63,64,65,66,67,68],[55],[73,77,78],[55,69,70,71,72],[55,70,71,73,74,76,77],[55,70,71],[74,75],[74],[53,54],[70,71,72,80,81]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"530fb35c1d7cdd7e5d65e139d0f85b33d45c1d875b8d1a7504d4d1d97c8815f0","signature":"588b96bb7a2012fd1150ade1e499778a933e3120554d77f2507aabeffccb453f"},{"version":"b05ed42872e9f4840b8a8d5ad3f00b7d81801019c26d8a60b85a475caa317e75","signature":"b5a22b122ce1f4323a35e05e20c3335883ee762d009abe53fe679c6c92b54fbe"},{"version":"f31746bd7b4d8bc09ca3f24b09adf22d80b1149fe68fc18f31d947675ac2acf6","signature":"3d748b2471ff18b39df8a913f72257d9e40e75ad33b5ba0b5f5437e8fe8f3165"},{"version":"b59d5b2c4221a39cd62f0748fcb53c4d518e6434dbefbd52f50a0aa003b2d954","signature":"e60c6e4f109d585246301369008d956a671d12a5e2b236a40e969aa0863e0197"},{"version":"76de441fe3aa2c80491175a894b432f92172cdc03526eebb4c3a5cab15684f5d","signature":"77dd2ea6eeb0d52ca5a5cd5986d5a0c2ce98a4cf2214e5f0c99ba27017b0e0e0"},{"version":"adb532da6530da9e7e46a7d97857c4d99c53f6aaaf2b76c6d6a3794c869472f1","signature":"fb7977d3f627ad72d32c1f94c33c67fc068280b8c8d66dfa0746bc214c0c8524"},{"version":"df02d0ec4fad78778da0ec16ee0e7dfa52b1d12e911a8646da669117eabd0567","signature":"01b99b06134ff91b390912d67b76dc23014a28680d2b6d8585c4696fbef8c4c2"},{"version":"b06da4b3f684fcafc49806fd632b5036fe3a854f2eec5e62deeea19bda134421","signature":"d02ffd8b2d7103c1dda34427ecc6454b0a49901ff7ebb5b7c3238c98afbb4a7c"},{"version":"0183ce81635b82409a1f7c23cd757220b3d4dcc590651a4c3682959390975713","signature":"22bc463c0e3e63c41db20cc38ec718b4f78ef4ccd8b8548c5d76a3e0fe2d65e1"},{"version":"be46c8c1b3e5ac6108a8d83351f338cb53c597cee48a487351efab4891a2f430","signature":"7f536197488c68004b6299d2c311185259bfc8b1f29b5eb134d75c0121b78540"},{"version":"ea22dbe47d0deb7aa77ab2e66cb398454a26d7b6934bc6b1a99c753cc119c4c5","signature":"21c3067f5a62ef9bb1826f141714cf28ecea04bd210d0ccdb976df1625c5ac9b"},{"version":"7328313175450ce80a0938d531ec04cc36cdfa5393b89da564c01ff9c8072047","signature":"265996147c5015b970024a31a0251028351f6b9d021043319c7cbcf12aac74d5"},{"version":"a718549d1d59bb11a66fbb39f04425365560b722dc2424bfe809ce103bd88ac2","signature":"6c9d7968c6b19f5b6d49e34e5f15971a66de07c5ab496ff23c336da193c576ee"},{"version":"c9e2dab209ed71b2d44260b2a3a2e0623d5ae0f2b0e9c013608d636b30999e24","signature":"9965d23fb84703d808ef27becb0ec91f720aad02d8232f3f9e29c503e5896170"},{"version":"d4f1a586dd1a11aea87f4b036b2acaa255c29a337a1c9361cd3f7be233e952a4","signature":"38cf8ae1a0e3dbc9ffca7614a6bbe0029d4189f92d09500135131d258931d546"},{"version":"d32d795f77d206c2d67d02d8d4d632973a4717638e6a0ce3fc90fbe2c92eef61","signature":"f908362c8d02fbf4f026c582db18cdaf5879e9788639652ff21cf3fe88bf2c4d"},{"version":"59dbd7f6c212dd5e65e46fce3e44004b56ca11a379558e4054a1fde5bca0e824","signature":"332140dfb9d3fc2b8d90364f7efa32ceb4edc2b50da81e12b1e258fe6e292643"},{"version":"5b50dc70a516afa64a0de0f23ed566d12df71edea73d40041e3c61f6738c0024","signature":"d518d6a746db7c7e0ec79dd73d4014e08961ce0dd71c2c2629f4cea7ac9bcb2a"},{"version":"85388063d43aae49cdccf3f921ceb5c1f13a3fbf6afb9208102f824d148a6551","signature":"6c8a1eca5c0445be16bb7f36f40332a53e456508e834835a513e88f222ae634f"},{"version":"e0dc293b319914dac1ff3ad914dc1e8c435727a614f11e2a54c01127a0509bcb","signature":"f264605586f5263b7b1b38daad1adf1730ef40d48e0decd18e8083e5dbeb9f9a"},{"version":"d7367419d70a0b590039150f3ab47a07910888dbb8cba1d98e4ba06ed4454bd0","signature":"4a0a686fb27bc87a3638178080d637a028d52bb2e961fb838fb46d2fd4db8e2c"},{"version":"c9d2accec26950663ae8758978bf6b43f1fa294ea0c7b3baae50b9336af18bf8","signature":"190f522687c72fd809fb64431b2a1f8577d9f886d71f7b23dbb62452ed3605c3"},{"version":"34daba12e37ede669b28544983b35d4810c4975b1ad746cb989ae0f54a0ac128","signature":"27ef7ba291e955e48c3c605219c36aafe3b168d3e0a2bc474912628e01863d85"},{"version":"ce4aa044f4b1a8460695dcbcabc5b5b973dac1b868a721d290a9181e72462eef","signature":"c2d3e09273eb9cb52a28f8b637f0ad64dcb1838c5692e83e72ab3d59df0ae8c4"},{"version":"c512d216cf06396aa72cc829c4bacc8ac8cd9de1723d3ee10be5841907a85ffd","signature":"0396d6032cd7c5e5f86d85cd438a721be4567a5752998d19d6f6ab6823f9b72e"},{"version":"da1fd9e4de3f7fc8411570015d5af222e2b732b79cbcd849fe1fdb57084b3a55","signature":"394dac482847846dbc7e74ac7276e85554e69c9d14f9496a56e64daa5480ac23"},{"version":"25543205d35490d66f1f69270a0e47197ce8e2daffea3019971aeaf68571353a","signature":"912ad54c3ba86a07f05f10a9a7d15cb4448005da1f7fbcf0701864f2c51bc853"},{"version":"97ce682ea0bb41ac2ce4da5dd23a3435aa857aaad9a6cff5fa19a9331ac88c0c","signature":"77dc066b5e7ab8cb01781935e62007bd4461174ccbbc28a88f1061c9755c4107"},{"version":"edcb543e5cc33b6fd1d6cacad96bfffe306ef1d6210a5bca33db92778b769c3c","signature":"e7320cb0235eabe75ba057f24f07aef72c8fcbb9fe7912055f323828a37f6d1c"},{"version":"784b303657e2422cfdf574fdb680209cec8628de4efd6ea1cf8690cc6fcab3e2","signature":"872d3d511dcff7453537f8fe9a3bc510d9dd2e12ccb88c1c6335f9f71799d391"},{"version":"960b5c3ef5787dafc430fe52f797f511410c5c3d94f0d9f7ab50c1ab8832e0d0","signature":"20a00309ad7040461e33f98efd33a8bb61c0f8c9d87166a3db6dcd641aa51f85"},{"version":"061480c72e2b67a43f5cba5811f6f63cea3b83f3bc1a1e3cb9977176045a67c6","signature":"93625a7fcf3cff2f43017ae77e89b916faa9e5192410746a83396a1dcd5ea941"}],"root":[[52,83]],"options":{"allowJs":false,"declaration":true,"declarationDir":"./","declarationMap":false,"emitDeclarationOnly":true,"esModuleInterop":true,"module":99,"noImplicitAny":false,"outDir":"./","rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strict":false,"target":7,"tsBuildInfoFile":"./.dts.tsbuildinfo"},"referencedMap":[[83,1],[56,2],[57,2],[58,2],[59,2],[69,3],[60,2],[61,2],[62,2],[63,2],[64,4],[65,2],[66,4],[67,2],[68,2],[79,5],[73,6],[78,7],[77,8],[76,9],[75,10],[55,11],[70,4],[71,4],[82,12],[81,4]],"semanticDiagnosticsPerFile":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83],"version":"5.9.3"}