@falcon-ui/falcon-ui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +182 -0
  3. package/cjs/JsBarcode-BlUjuVmB.cjs +3519 -0
  4. package/cjs/JsBarcode-BlUjuVmB.cjs.map +1 -0
  5. package/cjs/chunk-D4y6LrGi.cjs +40 -0
  6. package/cjs/components/JsBarcode-BOXEZn4Q.cjs +3519 -0
  7. package/cjs/components/JsBarcode-BOXEZn4Q.cjs.map +1 -0
  8. package/cjs/components/barcode/JsBarcode-BOXEZn4Q.cjs +3519 -0
  9. package/cjs/components/barcode/JsBarcode-BOXEZn4Q.cjs.map +1 -0
  10. package/cjs/components/barcode/chunk-D4y6LrGi.cjs +40 -0
  11. package/cjs/components/barcode/index.cjs +211 -0
  12. package/cjs/components/barcode/index.cjs.map +1 -0
  13. package/cjs/components/barcode/src/JsBarcode-BOXEZn4Q.cjs +3519 -0
  14. package/cjs/components/barcode/src/JsBarcode-BOXEZn4Q.cjs.map +1 -0
  15. package/cjs/components/barcode/src/barcode.cjs +102 -0
  16. package/cjs/components/barcode/src/barcode.cjs.map +1 -0
  17. package/cjs/components/barcode/src/barcode.vue.cjs +200 -0
  18. package/cjs/components/barcode/src/barcode.vue.cjs.map +1 -0
  19. package/cjs/components/barcode/src/chunk-D4y6LrGi.cjs +40 -0
  20. package/cjs/components/button/index.cjs +135 -0
  21. package/cjs/components/button/index.cjs.map +1 -0
  22. package/cjs/components/button/src/button.cjs +16 -0
  23. package/cjs/components/button/src/button.cjs.map +1 -0
  24. package/cjs/components/button/src/button.vue.cjs +124 -0
  25. package/cjs/components/button/src/button.vue.cjs.map +1 -0
  26. package/cjs/components/chunk-D4y6LrGi.cjs +40 -0
  27. package/cjs/components/date-picker/index.cjs +164 -0
  28. package/cjs/components/date-picker/index.cjs.map +1 -0
  29. package/cjs/components/date-picker/src/date-picker.cjs +25 -0
  30. package/cjs/components/date-picker/src/date-picker.cjs.map +1 -0
  31. package/cjs/components/date-picker/src/date-picker.vue.cjs +153 -0
  32. package/cjs/components/date-picker/src/date-picker.vue.cjs.map +1 -0
  33. package/cjs/components/dialog/index.cjs +346 -0
  34. package/cjs/components/dialog/index.cjs.map +1 -0
  35. package/cjs/components/dialog/src/dialog.cjs +40 -0
  36. package/cjs/components/dialog/src/dialog.cjs.map +1 -0
  37. package/cjs/components/dialog/src/dialog.vue.cjs +343 -0
  38. package/cjs/components/dialog/src/dialog.vue.cjs.map +1 -0
  39. package/cjs/components/index.cjs +9450 -0
  40. package/cjs/components/index.cjs.map +1 -0
  41. package/cjs/components/input/index.cjs +175 -0
  42. package/cjs/components/input/index.cjs.map +1 -0
  43. package/cjs/components/input/src/input.cjs +27 -0
  44. package/cjs/components/input/src/input.cjs.map +1 -0
  45. package/cjs/components/input/src/input.vue.cjs +164 -0
  46. package/cjs/components/input/src/input.vue.cjs.map +1 -0
  47. package/cjs/components/input-number/index.cjs +374 -0
  48. package/cjs/components/input-number/index.cjs.map +1 -0
  49. package/cjs/components/input-number/src/input-number.cjs +48 -0
  50. package/cjs/components/input-number/src/input-number.cjs.map +1 -0
  51. package/cjs/components/input-number/src/input-number.vue.cjs +363 -0
  52. package/cjs/components/input-number/src/input-number.vue.cjs.map +1 -0
  53. package/cjs/components/input-search/index.cjs +286 -0
  54. package/cjs/components/input-search/index.cjs.map +1 -0
  55. package/cjs/components/input-search/src/input-search.cjs +55 -0
  56. package/cjs/components/input-search/src/input-search.cjs.map +1 -0
  57. package/cjs/components/input-search/src/input-search.vue.cjs +275 -0
  58. package/cjs/components/input-search/src/input-search.vue.cjs.map +1 -0
  59. package/cjs/components/qr-code/index.cjs +1975 -0
  60. package/cjs/components/qr-code/index.cjs.map +1 -0
  61. package/cjs/components/qr-code/src/qr-code.cjs +63 -0
  62. package/cjs/components/qr-code/src/qr-code.cjs.map +1 -0
  63. package/cjs/components/qr-code/src/qr-code.vue.cjs +1964 -0
  64. package/cjs/components/qr-code/src/qr-code.vue.cjs.map +1 -0
  65. package/cjs/components/radial-menu/index.cjs +983 -0
  66. package/cjs/components/radial-menu/index.cjs.map +1 -0
  67. package/cjs/components/radial-menu/src/radial-menu.cjs +96 -0
  68. package/cjs/components/radial-menu/src/radial-menu.cjs.map +1 -0
  69. package/cjs/components/radial-menu/src/radial-menu.vue.cjs +921 -0
  70. package/cjs/components/radial-menu/src/radial-menu.vue.cjs.map +1 -0
  71. package/cjs/components/select/index.cjs +163 -0
  72. package/cjs/components/select/index.cjs.map +1 -0
  73. package/cjs/components/select/src/select.cjs +16 -0
  74. package/cjs/components/select/src/select.cjs.map +1 -0
  75. package/cjs/components/select/src/select.vue.cjs +152 -0
  76. package/cjs/components/select/src/select.vue.cjs.map +1 -0
  77. package/cjs/components/table/index.cjs +3351 -0
  78. package/cjs/components/table/index.cjs.map +1 -0
  79. package/cjs/components/table/src/table.cjs +62 -0
  80. package/cjs/components/table/src/table.cjs.map +1 -0
  81. package/cjs/components/table/src/table.vue.cjs +3085 -0
  82. package/cjs/components/table/src/table.vue.cjs.map +1 -0
  83. package/cjs/dialog-CJU00aEV.cjs +614 -0
  84. package/cjs/dialog-CJU00aEV.cjs.map +1 -0
  85. package/cjs/dialog-DcH26KbE.cjs +2 -0
  86. package/cjs/hooks/dialog-DpYPBcKV.cjs +266 -0
  87. package/cjs/hooks/dialog-DpYPBcKV.cjs.map +1 -0
  88. package/cjs/hooks/hooks-D2Jaq5kO.cjs +328 -0
  89. package/cjs/hooks/hooks-D2Jaq5kO.cjs.map +1 -0
  90. package/cjs/hooks/index.cjs +8 -0
  91. package/cjs/icons/index.cjs +86 -0
  92. package/cjs/icons/index.cjs.map +1 -0
  93. package/cjs/index.cjs +9141 -0
  94. package/cjs/index.cjs.map +1 -0
  95. package/cjs/utils/index.cjs +69 -0
  96. package/cjs/utils/index.cjs.map +1 -0
  97. package/esm/JsBarcode-kVJER62m.js +3514 -0
  98. package/esm/JsBarcode-kVJER62m.js.map +1 -0
  99. package/esm/chunk-BuRq7rDw.js +23 -0
  100. package/esm/components/JsBarcode-CzzxrEd_.js +3514 -0
  101. package/esm/components/JsBarcode-CzzxrEd_.js.map +1 -0
  102. package/esm/components/barcode/JsBarcode-C5ux6wsb.js +3514 -0
  103. package/esm/components/barcode/JsBarcode-C5ux6wsb.js.map +1 -0
  104. package/esm/components/barcode/chunk--em_ddB3.js +23 -0
  105. package/esm/components/barcode/index.mjs +204 -0
  106. package/esm/components/barcode/index.mjs.map +1 -0
  107. package/esm/components/barcode/src/JsBarcode-C5ux6wsb.js +3514 -0
  108. package/esm/components/barcode/src/JsBarcode-C5ux6wsb.js.map +1 -0
  109. package/esm/components/barcode/src/barcode.mjs +98 -0
  110. package/esm/components/barcode/src/barcode.mjs.map +1 -0
  111. package/esm/components/barcode/src/barcode.vue.mjs +194 -0
  112. package/esm/components/barcode/src/barcode.vue.mjs.map +1 -0
  113. package/esm/components/barcode/src/chunk--em_ddB3.js +23 -0
  114. package/esm/components/button/index.mjs +126 -0
  115. package/esm/components/button/index.mjs.map +1 -0
  116. package/esm/components/button/src/button.mjs +14 -0
  117. package/esm/components/button/src/button.mjs.map +1 -0
  118. package/esm/components/button/src/button.vue.mjs +117 -0
  119. package/esm/components/button/src/button.vue.mjs.map +1 -0
  120. package/esm/components/chunk-BuRq7rDw.js +23 -0
  121. package/esm/components/date-picker/index.mjs +155 -0
  122. package/esm/components/date-picker/index.mjs.map +1 -0
  123. package/esm/components/date-picker/src/date-picker.mjs +23 -0
  124. package/esm/components/date-picker/src/date-picker.mjs.map +1 -0
  125. package/esm/components/date-picker/src/date-picker.vue.mjs +146 -0
  126. package/esm/components/date-picker/src/date-picker.vue.mjs.map +1 -0
  127. package/esm/components/dialog/index.mjs +335 -0
  128. package/esm/components/dialog/index.mjs.map +1 -0
  129. package/esm/components/dialog/src/dialog.mjs +38 -0
  130. package/esm/components/dialog/src/dialog.mjs.map +1 -0
  131. package/esm/components/dialog/src/dialog.vue.mjs +334 -0
  132. package/esm/components/dialog/src/dialog.vue.mjs.map +1 -0
  133. package/esm/components/index.mjs +9386 -0
  134. package/esm/components/index.mjs.map +1 -0
  135. package/esm/components/input/index.mjs +166 -0
  136. package/esm/components/input/index.mjs.map +1 -0
  137. package/esm/components/input/src/input.mjs +25 -0
  138. package/esm/components/input/src/input.mjs.map +1 -0
  139. package/esm/components/input/src/input.vue.mjs +157 -0
  140. package/esm/components/input/src/input.vue.mjs.map +1 -0
  141. package/esm/components/input-number/index.mjs +365 -0
  142. package/esm/components/input-number/index.mjs.map +1 -0
  143. package/esm/components/input-number/src/input-number.mjs +45 -0
  144. package/esm/components/input-number/src/input-number.mjs.map +1 -0
  145. package/esm/components/input-number/src/input-number.vue.mjs +356 -0
  146. package/esm/components/input-number/src/input-number.vue.mjs.map +1 -0
  147. package/esm/components/input-search/index.mjs +277 -0
  148. package/esm/components/input-search/index.mjs.map +1 -0
  149. package/esm/components/input-search/src/input-search.mjs +53 -0
  150. package/esm/components/input-search/src/input-search.mjs.map +1 -0
  151. package/esm/components/input-search/src/input-search.vue.mjs +268 -0
  152. package/esm/components/input-search/src/input-search.vue.mjs.map +1 -0
  153. package/esm/components/qr-code/index.mjs +1967 -0
  154. package/esm/components/qr-code/index.mjs.map +1 -0
  155. package/esm/components/qr-code/src/qr-code.mjs +59 -0
  156. package/esm/components/qr-code/src/qr-code.mjs.map +1 -0
  157. package/esm/components/qr-code/src/qr-code.vue.mjs +1958 -0
  158. package/esm/components/qr-code/src/qr-code.vue.mjs.map +1 -0
  159. package/esm/components/radial-menu/index.mjs +974 -0
  160. package/esm/components/radial-menu/index.mjs.map +1 -0
  161. package/esm/components/radial-menu/src/radial-menu.mjs +94 -0
  162. package/esm/components/radial-menu/src/radial-menu.mjs.map +1 -0
  163. package/esm/components/radial-menu/src/radial-menu.vue.mjs +916 -0
  164. package/esm/components/radial-menu/src/radial-menu.vue.mjs.map +1 -0
  165. package/esm/components/select/index.mjs +154 -0
  166. package/esm/components/select/index.mjs.map +1 -0
  167. package/esm/components/select/src/select.mjs +14 -0
  168. package/esm/components/select/src/select.mjs.map +1 -0
  169. package/esm/components/select/src/select.vue.mjs +145 -0
  170. package/esm/components/select/src/select.vue.mjs.map +1 -0
  171. package/esm/components/table/index.mjs +3342 -0
  172. package/esm/components/table/index.mjs.map +1 -0
  173. package/esm/components/table/src/table.mjs +60 -0
  174. package/esm/components/table/src/table.mjs.map +1 -0
  175. package/esm/components/table/src/table.vue.mjs +3080 -0
  176. package/esm/components/table/src/table.vue.mjs.map +1 -0
  177. package/esm/dialog-Cm3Px-Bu.js +537 -0
  178. package/esm/dialog-Cm3Px-Bu.js.map +1 -0
  179. package/esm/dialog-CzZm50XM.js +2 -0
  180. package/esm/hooks/dialog-d4SMZWbw.js +261 -0
  181. package/esm/hooks/dialog-d4SMZWbw.js.map +1 -0
  182. package/esm/hooks/hooks-DdjieG2I.js +281 -0
  183. package/esm/hooks/hooks-DdjieG2I.js.map +1 -0
  184. package/esm/hooks/index.mjs +2 -0
  185. package/esm/icons/index.mjs +79 -0
  186. package/esm/icons/index.mjs.map +1 -0
  187. package/esm/index.mjs +9065 -0
  188. package/esm/index.mjs.map +1 -0
  189. package/esm/utils/index.mjs +65 -0
  190. package/esm/utils/index.mjs.map +1 -0
  191. package/global.d.ts +39 -0
  192. package/package.json +131 -0
  193. package/theme/index.css +1 -0
  194. package/theme/index.scss +16 -0
  195. package/theme/src/barcode.scss +14 -0
  196. package/theme/src/button.scss +65 -0
  197. package/theme/src/date-picker.scss +87 -0
  198. package/theme/src/dialog.scss +146 -0
  199. package/theme/src/ep-vars.scss +11 -0
  200. package/theme/src/input-number.scss +66 -0
  201. package/theme/src/input-search.scss +78 -0
  202. package/theme/src/input.scss +66 -0
  203. package/theme/src/mixins/bem.scss +35 -0
  204. package/theme/src/mixins/color.scss +8 -0
  205. package/theme/src/qr-code.scss +23 -0
  206. package/theme/src/radial-menu.scss +346 -0
  207. package/theme/src/select.scss +44 -0
  208. package/theme/src/table.scss +143 -0
  209. package/theme/src/tokens.scss +26 -0
  210. package/theme/src/tree-select.scss +45 -0
  211. package/theme/src/tree.scss +369 -0
  212. package/types/components/barcode/index.d.ts +183 -0
  213. package/types/components/barcode/src/barcode.d.ts +147 -0
  214. package/types/components/barcode/src/barcode.vue.d.ts +184 -0
  215. package/types/components/button/index.d.ts +135 -0
  216. package/types/components/button/src/button.d.ts +33 -0
  217. package/types/components/button/src/button.vue.d.ts +138 -0
  218. package/types/components/date-picker/index.d.ts +508 -0
  219. package/types/components/date-picker/src/date-picker.d.ts +35 -0
  220. package/types/components/date-picker/src/date-picker.vue.d.ts +509 -0
  221. package/types/components/dialog/index.d.ts +630 -0
  222. package/types/components/dialog/src/dialog.d.ts +70 -0
  223. package/types/components/dialog/src/dialog.vue.d.ts +257 -0
  224. package/types/components/index.d.ts +27 -0
  225. package/types/components/input/index.d.ts +233 -0
  226. package/types/components/input/src/input.d.ts +65 -0
  227. package/types/components/input/src/input.vue.d.ts +239 -0
  228. package/types/components/input-number/index.d.ts +713 -0
  229. package/types/components/input-number/src/input-number.d.ts +101 -0
  230. package/types/components/input-number/src/input-number.vue.d.ts +283 -0
  231. package/types/components/input-search/index.d.ts +113 -0
  232. package/types/components/input-search/src/input-search.d.ts +128 -0
  233. package/types/components/input-search/src/input-search.vue.d.ts +114 -0
  234. package/types/components/qr-code/index.d.ts +109 -0
  235. package/types/components/qr-code/src/qr-code.d.ts +93 -0
  236. package/types/components/qr-code/src/qr-code.vue.d.ts +109 -0
  237. package/types/components/radial-menu/index.d.ts +499 -0
  238. package/types/components/radial-menu/src/radial-menu-item.d.ts +40 -0
  239. package/types/components/radial-menu/src/radial-menu-item.vue.d.ts +95 -0
  240. package/types/components/radial-menu/src/radial-menu.d.ts +92 -0
  241. package/types/components/radial-menu/src/radial-menu.vue.d.ts +200 -0
  242. package/types/components/radial-menu/src/types.d.ts +48 -0
  243. package/types/components/radial-menu/src/use-radial-menu-items.d.ts +19 -0
  244. package/types/components/radial-menu/src/use-radial-menu-keyboard.d.ts +17 -0
  245. package/types/components/radial-menu/src/use-radial-menu-position.d.ts +45 -0
  246. package/types/components/radial-menu/src/use-radial-menu-shortcut.d.ts +8 -0
  247. package/types/components/radial-menu/src/use-radial-menu-state.d.ts +15 -0
  248. package/types/components/select/index.d.ts +5 -0
  249. package/types/components/select/src/select.d.ts +30 -0
  250. package/types/components/select/src/select.vue.d.ts +25 -0
  251. package/types/components/table/index.d.ts +8 -0
  252. package/types/components/table/src/editor-registry.d.ts +24 -0
  253. package/types/components/table/src/proxy-data.d.ts +10 -0
  254. package/types/components/table/src/table-editor.d.ts +18 -0
  255. package/types/components/table/src/table-editor.vue.d.ts +43 -0
  256. package/types/components/table/src/table.d.ts +179 -0
  257. package/types/components/table/src/table.vue.d.ts +121 -0
  258. package/types/components/tree/index.d.ts +5 -0
  259. package/types/components/tree/src/tree-node.vue.d.ts +88 -0
  260. package/types/components/tree/src/tree-types.d.ts +90 -0
  261. package/types/components/tree/src/tree.d.ts +448 -0
  262. package/types/components/tree/src/tree.vue.d.ts +301 -0
  263. package/types/components/tree/src/use-tree-check-conduct.d.ts +43 -0
  264. package/types/components/tree/src/use-tree-checked-state.d.ts +34 -0
  265. package/types/components/tree/src/use-tree-drag.d.ts +45 -0
  266. package/types/components/tree/src/use-tree-expanded-state.d.ts +41 -0
  267. package/types/components/tree/src/use-tree-keyboard.d.ts +21 -0
  268. package/types/components/tree/src/use-tree-load.d.ts +25 -0
  269. package/types/components/tree/src/use-tree-scroll.d.ts +17 -0
  270. package/types/components/tree/src/use-tree-selected-state.d.ts +29 -0
  271. package/types/components/tree-select/index.d.ts +5 -0
  272. package/types/components/tree-select/src/tree-select.d.ts +26 -0
  273. package/types/components/tree-select/src/tree-select.vue.d.ts +25 -0
  274. package/types/falcon-ui/index.d.ts +8 -0
  275. package/types/hooks/index.d.ts +3 -0
  276. package/types/hooks/src/use-clearable-state.d.ts +10 -0
  277. package/types/hooks/src/use-component.d.ts +15 -0
  278. package/types/hooks/src/use-dialog.d.ts +49 -0
  279. package/types/icons/index.d.ts +1 -0
  280. package/types/icons/src/components/holder-outlined.vue.d.ts +3 -0
  281. package/types/icons/src/components/index.d.ts +3 -0
  282. package/types/icons/src/components/minus-square-outlined.vue.d.ts +3 -0
  283. package/types/icons/src/components/plus-square-outlined.vue.d.ts +3 -0
  284. package/types/utils/index.d.ts +3 -0
  285. package/types/utils/src/bem.d.ts +11 -0
  286. package/types/utils/src/component.d.ts +6 -0
  287. package/types/utils/src/install.d.ts +5 -0
  288. package/umd/falcon-ui.umd.js +13297 -0
  289. package/umd/falcon-ui.umd.js.map +1 -0
@@ -0,0 +1,363 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ let vue = require("vue");
6
+ let element_plus = require("element-plus");
7
+ var defaultNamespace = "fl";
8
+ var statePrefix = "is-";
9
+ var buildBemName = (namespace, block, blockSuffix = "", element = "", modifier = "") => {
10
+ let className = `${namespace}-${block}`;
11
+ if (blockSuffix) className += `-${blockSuffix}`;
12
+ if (element) className += `__${element}`;
13
+ if (modifier) className += `--${modifier}`;
14
+ return className;
15
+ };
16
+ const useNamespace = (block, namespace = defaultNamespace) => {
17
+ const b = (blockSuffix = "") => buildBemName(namespace, block, blockSuffix);
18
+ const e = (element) => element ? buildBemName(namespace, block, "", element) : "";
19
+ const m = (modifier) => modifier ? buildBemName(namespace, block, "", "", modifier) : "";
20
+ const be = (blockSuffix, element) => {
21
+ if (!blockSuffix || !element) return "";
22
+ return buildBemName(namespace, block, blockSuffix, element);
23
+ };
24
+ const em = (element, modifier) => {
25
+ if (!element || !modifier) return "";
26
+ return buildBemName(namespace, block, "", element, modifier);
27
+ };
28
+ const bm = (blockSuffix, modifier) => {
29
+ if (!blockSuffix || !modifier) return "";
30
+ return buildBemName(namespace, block, blockSuffix, "", modifier);
31
+ };
32
+ const bem = (blockSuffix, element, modifier) => {
33
+ if (!blockSuffix && !element && !modifier) return b();
34
+ return buildBemName(namespace, block, blockSuffix, element, modifier);
35
+ };
36
+ const is = (name, state = true) => state ? `${statePrefix}${name}` : "";
37
+ return {
38
+ namespace,
39
+ b,
40
+ e,
41
+ m,
42
+ be,
43
+ em,
44
+ bm,
45
+ bem,
46
+ is
47
+ };
48
+ };
49
+ const mergeComponentExpose = (vm, exposed, extras = {}) => {
50
+ if (!vm?.exposed || !exposed || typeof exposed !== "object" && typeof exposed !== "function") return;
51
+ Object.assign(vm.exposed, extras, exposed);
52
+ };
53
+ const invokeListener = (listener, ...args) => {
54
+ if (typeof listener === "function") {
55
+ listener(...args);
56
+ return;
57
+ }
58
+ if (!Array.isArray(listener)) return;
59
+ for (const item of listener) if (typeof item === "function") item(...args);
60
+ };
61
+ const useMergedExpose = (extras) => {
62
+ const vm = (0, vue.getCurrentInstance)();
63
+ const changeRef = (exposed) => {
64
+ mergeComponentExpose(vm, exposed, extras);
65
+ };
66
+ return { changeRef };
67
+ };
68
+ const flInputNumberPrecisionModes = [
69
+ "ROUND",
70
+ "FIXED",
71
+ "STRICT"
72
+ ];
73
+ const flInputNumberProps = {
74
+ modelValue: {
75
+ type: [Number, String],
76
+ default: null
77
+ },
78
+ isTable: {
79
+ type: Boolean,
80
+ default: false
81
+ },
82
+ isError: {
83
+ type: Boolean,
84
+ default: false
85
+ },
86
+ precision: {
87
+ type: Number,
88
+ default: 2
89
+ },
90
+ precisionMode: {
91
+ type: String,
92
+ default: "ROUND",
93
+ validator: (value) => flInputNumberPrecisionModes.includes(value)
94
+ },
95
+ isFormat: {
96
+ type: Boolean,
97
+ default: false
98
+ },
99
+ strictErrorPlaceholder: {
100
+ type: String,
101
+ default: "精度不对"
102
+ }
103
+ };
104
+ const flInputNumberEmits = {
105
+ "update:modelValue": (value) => value === null || typeof value === "number",
106
+ "update:isError": (value) => typeof value === "boolean",
107
+ "custom-input": (payload) => typeof payload.rawValue === "string" && (payload.value === null || typeof payload.value === "number"),
108
+ "strict-error": (payload) => typeof payload.rawValue === "string" && typeof payload.precision === "number" && typeof payload.actualPrecision === "number"
109
+ };
110
+ var input_number_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ (0, vue.defineComponent)({
111
+ name: "FlInputNumber",
112
+ inheritAttrs: false,
113
+ __name: "input-number",
114
+ props: flInputNumberProps,
115
+ emits: flInputNumberEmits,
116
+ setup(__props, { expose: __expose, emit: __emit }) {
117
+ const props = __props;
118
+ const emit = __emit;
119
+ const attrs = (0, vue.useAttrs)();
120
+ const slots = (0, vue.useSlots)();
121
+ const ns = useNamespace("input-number");
122
+ const rawAttrs = attrs;
123
+ const displayValue = (0, vue.ref)("");
124
+ const strictErrorActive = (0, vue.ref)(false);
125
+ const isFocused = (0, vue.ref)(false);
126
+ const precisionValue = (0, vue.computed)(() => {
127
+ if (!Number.isFinite(props.precision) || props.precision < 0) return 0;
128
+ return Math.trunc(props.precision);
129
+ });
130
+ const resolvedPlaceholder = (0, vue.computed)(() => {
131
+ if (strictErrorActive.value) return props.strictErrorPlaceholder;
132
+ const candidate = rawAttrs.placeholder;
133
+ return typeof candidate === "string" ? candidate : void 0;
134
+ });
135
+ const mergedIsError = (0, vue.computed)(() => props.isError || strictErrorActive.value);
136
+ const validInputModes = new Set([
137
+ "text",
138
+ "search",
139
+ "email",
140
+ "tel",
141
+ "url",
142
+ "none",
143
+ "numeric",
144
+ "decimal"
145
+ ]);
146
+ const defaultNumberFormatter = new Intl.NumberFormat("en-US", {
147
+ useGrouping: true,
148
+ maximumFractionDigits: 20
149
+ });
150
+ const toNumeric = (value) => {
151
+ if (value === null || value === void 0 || value === "") return null;
152
+ if (typeof value === "number") return Number.isFinite(value) ? value : null;
153
+ if (typeof value !== "string") return null;
154
+ const trimmed = value.trim();
155
+ if (!trimmed) return null;
156
+ if (!/^-?(?:\d+\.?\d*|\.\d+)$/.test(trimmed)) return null;
157
+ const next = Number(trimmed);
158
+ return Number.isFinite(next) ? next : null;
159
+ };
160
+ const toRawString = (value) => {
161
+ if (Object.is(value, -0)) return "0";
162
+ return `${value}`;
163
+ };
164
+ const defaultElInputFormatter = (value) => {
165
+ const numericValue = toNumeric(value);
166
+ if (numericValue === null) return value;
167
+ return defaultNumberFormatter.format(numericValue);
168
+ };
169
+ const defaultElInputParser = (value) => value.replace(/,/g, "").trim();
170
+ const sanitizeNumericInput = (value) => {
171
+ if (!value) return "";
172
+ let filtered = value.replace(/[^\d.-]/g, "");
173
+ const isNegative = filtered.startsWith("-");
174
+ filtered = filtered.replace(/-/g, "");
175
+ const dotIndex = filtered.indexOf(".");
176
+ if (dotIndex !== -1) filtered = `${filtered.slice(0, dotIndex)}.${filtered.slice(dotIndex + 1).replace(/\./g, "")}`;
177
+ return `${isNegative ? "-" : ""}${filtered}`;
178
+ };
179
+ const isPartialNumber = (value) => value === "-" || value === "." || value === "-.";
180
+ const countFractionLength = (value) => {
181
+ const dotIndex = value.indexOf(".");
182
+ if (dotIndex < 0) return 0;
183
+ return value.slice(dotIndex + 1).length;
184
+ };
185
+ const applyPrecision = (value, mode, precision) => {
186
+ if (precision < 0) return value;
187
+ if (mode === "ROUND") return Number(value.toFixed(precision));
188
+ if (mode === "FIXED") {
189
+ const factor = 10 ** precision;
190
+ return Math.trunc(value * factor) / factor;
191
+ }
192
+ return value;
193
+ };
194
+ const emitModelValue = (value) => {
195
+ emit("update:modelValue", value);
196
+ };
197
+ const emitStrictErrorState = (active) => {
198
+ if (strictErrorActive.value === active) return;
199
+ strictErrorActive.value = active;
200
+ emit("update:isError", active);
201
+ };
202
+ const clearModelValue = () => {
203
+ emitModelValue(null);
204
+ displayValue.value = "";
205
+ };
206
+ const syncDisplayFromModel = (value) => {
207
+ if (value === null) {
208
+ displayValue.value = "";
209
+ return;
210
+ }
211
+ displayValue.value = toRawString(value);
212
+ };
213
+ const handleCustomPayload = (rawValue, value) => {
214
+ emit("custom-input", {
215
+ rawValue,
216
+ value
217
+ });
218
+ };
219
+ const handleInput = (value) => {
220
+ const sanitized = sanitizeNumericInput(typeof value === "string" ? value : "");
221
+ displayValue.value = sanitized;
222
+ if (strictErrorActive.value) emitStrictErrorState(false);
223
+ if (!sanitized || isPartialNumber(sanitized)) {
224
+ emitModelValue(null);
225
+ handleCustomPayload(sanitized, null);
226
+ return;
227
+ }
228
+ const numericValue = toNumeric(sanitized);
229
+ if (numericValue === null) {
230
+ clearModelValue();
231
+ handleCustomPayload("", null);
232
+ return;
233
+ }
234
+ emitModelValue(numericValue);
235
+ handleCustomPayload(sanitized, numericValue);
236
+ };
237
+ const handleStrictError = (rawValue, actualPrecision) => {
238
+ emit("strict-error", {
239
+ rawValue,
240
+ precision: precisionValue.value,
241
+ actualPrecision
242
+ });
243
+ emitStrictErrorState(true);
244
+ clearModelValue();
245
+ };
246
+ const handleChange = (value) => {
247
+ const input = typeof value === "string" ? sanitizeNumericInput(value) : "";
248
+ if (!input || isPartialNumber(input)) {
249
+ clearModelValue();
250
+ return;
251
+ }
252
+ const numericValue = toNumeric(input);
253
+ if (numericValue === null) {
254
+ clearModelValue();
255
+ return;
256
+ }
257
+ const actualPrecision = countFractionLength(input);
258
+ if (actualPrecision > precisionValue.value && props.precisionMode === "STRICT") {
259
+ handleStrictError(input, actualPrecision);
260
+ return;
261
+ }
262
+ const nextValue = applyPrecision(numericValue, props.precisionMode, precisionValue.value);
263
+ emitModelValue(nextValue);
264
+ emitStrictErrorState(false);
265
+ syncDisplayFromModel(nextValue);
266
+ };
267
+ const handleFocus = (evt) => {
268
+ isFocused.value = true;
269
+ const current = toNumeric(props.modelValue);
270
+ if (current !== null) displayValue.value = toRawString(current);
271
+ invokeListener(rawAttrs.onFocus, evt);
272
+ };
273
+ const handleBlur = (evt) => {
274
+ isFocused.value = false;
275
+ syncDisplayFromModel(toNumeric(props.modelValue));
276
+ invokeListener(rawAttrs.onBlur, evt);
277
+ };
278
+ const resolveInputMode = () => {
279
+ const candidate = rawAttrs.inputmode;
280
+ if (typeof candidate === "string" && validInputModes.has(candidate)) return candidate;
281
+ return "decimal";
282
+ };
283
+ const resolveFormatter = () => {
284
+ if (!props.isFormat || isFocused.value) return;
285
+ const formatter = rawAttrs.formatter;
286
+ if (typeof formatter === "function") return formatter;
287
+ return defaultElInputFormatter;
288
+ };
289
+ const resolveParser = () => {
290
+ if (!props.isFormat || isFocused.value) return;
291
+ const parser = rawAttrs.parser;
292
+ if (typeof parser === "function") return parser;
293
+ if (typeof rawAttrs.formatter === "function") return;
294
+ return defaultElInputParser;
295
+ };
296
+ const mergedInputAttrs = (0, vue.computed)(() => {
297
+ const originalInputListener = rawAttrs.onInput;
298
+ const originalChangeListener = rawAttrs.onChange;
299
+ return {
300
+ ...rawAttrs,
301
+ class: [
302
+ ns.b(),
303
+ rawAttrs.class,
304
+ {
305
+ "is-error": mergedIsError.value,
306
+ "is-table": props.isTable
307
+ }
308
+ ],
309
+ modelValue: displayValue.value,
310
+ placeholder: resolvedPlaceholder.value,
311
+ inputmode: resolveInputMode(),
312
+ formatter: resolveFormatter(),
313
+ parser: resolveParser(),
314
+ "onUpdate:modelValue": void 0,
315
+ onInput: (value) => {
316
+ handleInput(value);
317
+ invokeListener(originalInputListener, value);
318
+ },
319
+ onChange: (value) => {
320
+ handleChange(value);
321
+ invokeListener(originalChangeListener, value);
322
+ },
323
+ onFocus: handleFocus,
324
+ onBlur: handleBlur
325
+ };
326
+ });
327
+ (0, vue.watch)(() => props.modelValue, (value) => {
328
+ const numericValue = toNumeric(value);
329
+ if (numericValue === null) {
330
+ displayValue.value = "";
331
+ if (value !== null && value !== void 0 && value !== "") emitModelValue(null);
332
+ return;
333
+ }
334
+ if (typeof value === "string") emitModelValue(numericValue);
335
+ syncDisplayFromModel(numericValue);
336
+ }, { immediate: true });
337
+ (0, vue.watch)(() => props.isError, (isError, previousIsError) => {
338
+ if (isError && previousIsError !== true) clearModelValue();
339
+ }, { immediate: true });
340
+ (0, vue.watch)(() => props.isFormat, () => {
341
+ syncDisplayFromModel(toNumeric(props.modelValue));
342
+ });
343
+ const { changeRef } = useMergedExpose({
344
+ myMethod() {
345
+ console.log("my method!");
346
+ },
347
+ myValue: 123
348
+ });
349
+ __expose({});
350
+ return (_ctx, _cache) => {
351
+ return (0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)((0, vue.unref)(element_plus.ElInput)), (0, vue.mergeProps)(mergedInputAttrs.value, { ref: (0, vue.unref)(changeRef) }), (0, vue.createSlots)({ _: 2 }, [(0, vue.renderList)((0, vue.unref)(slots), (_, slotName) => {
352
+ return {
353
+ name: slotName,
354
+ fn: (0, vue.withCtx)((slotScope) => [(0, vue.renderSlot)(_ctx.$slots, slotName, (0, vue.normalizeProps)((0, vue.guardReactiveProps)(slotScope || {})))])
355
+ };
356
+ })]), 1040);
357
+ };
358
+ }
359
+ });
360
+ var input_number_default = input_number_vue_vue_type_script_setup_true_lang_default;
361
+ exports.default = input_number_default;
362
+
363
+ //# sourceMappingURL=input-number.vue.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-number.vue.cjs","names":[],"sources":["../../../../../../packages/utils/src/bem.ts","../../../../../../packages/utils/src/component.ts","../../../../../../packages/hooks/src/use-component.ts","../../../../../../packages/components/input-number/src/input-number.ts","../../../../../../packages/components/input-number/src/input-number.vue","../../../../../../packages/components/input-number/src/input-number.vue"],"sourcesContent":["const defaultNamespace = 'fl'\r\nconst statePrefix = 'is-'\r\n\r\nconst buildBemName = (\r\n namespace: string,\r\n block: string,\r\n blockSuffix = '',\r\n element = '',\r\n modifier = ''\r\n) => {\r\n let className = `${namespace}-${block}`\r\n\r\n if (blockSuffix) {\r\n className += `-${blockSuffix}`\r\n }\r\n\r\n if (element) {\r\n className += `__${element}`\r\n }\r\n\r\n if (modifier) {\r\n className += `--${modifier}`\r\n }\r\n\r\n return className\r\n}\r\n\r\nexport const useNamespace = (block: string, namespace = defaultNamespace) => {\r\n const b = (blockSuffix = '') => buildBemName(namespace, block, blockSuffix)\r\n\r\n const e = (element?: string) => (element ? buildBemName(namespace, block, '', element) : '')\r\n\r\n const m = (modifier?: string) =>\r\n modifier ? buildBemName(namespace, block, '', '', modifier) : ''\r\n\r\n const be = (blockSuffix?: string, element?: string) => {\r\n if (!blockSuffix || !element) {\r\n return ''\r\n }\r\n\r\n return buildBemName(namespace, block, blockSuffix, element)\r\n }\r\n\r\n const em = (element?: string, modifier?: string) => {\r\n if (!element || !modifier) {\r\n return ''\r\n }\r\n\r\n return buildBemName(namespace, block, '', element, modifier)\r\n }\r\n\r\n const bm = (blockSuffix?: string, modifier?: string) => {\r\n if (!blockSuffix || !modifier) {\r\n return ''\r\n }\r\n\r\n return buildBemName(namespace, block, blockSuffix, '', modifier)\r\n }\r\n\r\n const bem = (blockSuffix?: string, element?: string, modifier?: string) => {\r\n if (!blockSuffix && !element && !modifier) {\r\n return b()\r\n }\r\n\r\n return buildBemName(namespace, block, blockSuffix, element, modifier)\r\n }\r\n\r\n const is = (name: string, state = true) => (state ? `${statePrefix}${name}` : '')\r\n\r\n return {\r\n namespace,\r\n b,\r\n e,\r\n m,\r\n be,\r\n em,\r\n bm,\r\n bem,\r\n is\r\n }\r\n}\r\n","type ExposedTarget = {\r\n exposed?: Record<string, unknown> | null\r\n} | null\r\n\r\nexport const mergeComponentExpose = (\r\n vm: ExposedTarget,\r\n exposed: unknown,\r\n extras: Record<string, unknown> = {}\r\n) => {\r\n if (!vm?.exposed || !exposed || (typeof exposed !== 'object' && typeof exposed !== 'function')) {\r\n return\r\n }\r\n\r\n Object.assign(vm.exposed, extras, exposed)\r\n}\r\n\r\nexport const invokeListener = (listener: unknown, ...args: unknown[]) => {\r\n if (typeof listener === 'function') {\r\n listener(...args)\r\n return\r\n }\r\n\r\n if (!Array.isArray(listener)) {\r\n return\r\n }\r\n\r\n for (const item of listener) {\r\n if (typeof item === 'function') {\r\n item(...args)\r\n }\r\n }\r\n}\r\n","import { computed, getCurrentInstance } from 'vue'\r\nimport { invokeListener, mergeComponentExpose, useNamespace } from '@falcon-ui/utils'\r\n\r\ntype UseMergedAttrsOptions = {\r\n attrs: Record<string, unknown>\r\n block: string\r\n listenerName: string\r\n onListener?: (...args: unknown[]) => void\r\n}\r\n\r\nexport const useMergedAttrs = ({\r\n attrs,\r\n block,\r\n listenerName,\r\n onListener\r\n}: UseMergedAttrsOptions) => {\r\n const ns = useNamespace(block)\r\n const className = ns.b()\r\n\r\n const mergedAttrs = computed(() => {\r\n const next = { ...attrs }\r\n const originalListener = next[listenerName]\r\n next.class = [className, next.class]\r\n\r\n next[listenerName] = (...args: unknown[]) => {\r\n onListener?.(...args)\r\n invokeListener(originalListener, ...args)\r\n }\r\n\r\n return next\r\n })\r\n\r\n return {\r\n mergedAttrs\r\n }\r\n}\r\n\r\nexport const useMergedExpose = <TExpose extends Record<string, unknown>>(extras: TExpose) => {\r\n const vm = getCurrentInstance()\r\n\r\n const changeRef = (exposed: unknown) => {\r\n mergeComponentExpose(vm, exposed, extras)\r\n }\r\n\r\n return {\r\n changeRef\r\n }\r\n}\r\n","import type { ExtractPublicPropTypes, PropType } from 'vue'\r\n\r\nexport const flInputNumberPrecisionModes = ['ROUND', 'FIXED', 'STRICT'] as const\r\n\r\nexport type FlInputNumberPrecisionMode = (typeof flInputNumberPrecisionModes)[number]\r\n\r\nexport const flInputNumberProps = {\r\n /**\r\n * 绑定值,仅输出 number 或 null。\r\n */\r\n modelValue: {\r\n type: [Number, String] as PropType<number | string | null>,\r\n default: null\r\n },\r\n /**\r\n * 是否用于表格单元格内输入场景。\r\n */\r\n isTable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否进入错误态。开启后会触发错误样式并清空输入值。\r\n */\r\n isError: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 小数精度位数。\r\n */\r\n precision: {\r\n type: Number,\r\n default: 2\r\n },\r\n /**\r\n * 精度处理模式:ROUND(四舍五入) / FIXED(截断) / STRICT(严格)。\r\n */\r\n precisionMode: {\r\n type: String as PropType<FlInputNumberPrecisionMode>,\r\n default: 'ROUND',\r\n validator: (value: string) =>\r\n flInputNumberPrecisionModes.includes(value as FlInputNumberPrecisionMode)\r\n },\r\n /**\r\n * 是否开启格式化显示。\r\n */\r\n isFormat: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 严格模式下精度不匹配时的 placeholder 提示。\r\n */\r\n strictErrorPlaceholder: {\r\n type: String,\r\n default: '精度不对'\r\n }\r\n} as const\r\n\r\nexport interface FlInputNumberCustomPayload {\r\n /**\r\n * 输入框当前原始字符串值(经字符过滤后)。\r\n */\r\n rawValue: string\r\n /**\r\n * 归一化后的数值,无法解析时为 null。\r\n */\r\n value: number | null\r\n}\r\n\r\nexport interface FlInputNumberStrictErrorPayload {\r\n /**\r\n * 严格模式校验失败时的原始输入值。\r\n */\r\n rawValue: string\r\n /**\r\n * 允许精度。\r\n */\r\n precision: number\r\n /**\r\n * 实际小数位长度。\r\n */\r\n actualPrecision: number\r\n}\r\n\r\nexport const flInputNumberEmits = {\r\n /**\r\n * modelValue 更新,仅输出 number 或 null。\r\n */\r\n 'update:modelValue': (value: number | null) => value === null || typeof value === 'number',\r\n /**\r\n * 严格模式触发错误时同步错误态。\r\n */\r\n 'update:isError': (value: boolean) => typeof value === 'boolean',\r\n /**\r\n * 每次输入后触发,携带归一化结果。\r\n */\r\n 'custom-input': (payload: FlInputNumberCustomPayload) =>\r\n typeof payload.rawValue === 'string' &&\r\n (payload.value === null || typeof payload.value === 'number'),\r\n /**\r\n * 严格模式下精度超限时触发。\r\n */\r\n 'strict-error': (payload: FlInputNumberStrictErrorPayload) =>\r\n typeof payload.rawValue === 'string' &&\r\n typeof payload.precision === 'number' &&\r\n typeof payload.actualPrecision === 'number'\r\n} as const\r\n\r\nexport type FlInputNumberProps = ExtractPublicPropTypes<typeof flInputNumberProps>\r\nexport type FlInputNumberEmits = typeof flInputNumberEmits\r\n\r\nexport type InputNumberProps = FlInputNumberProps\r\nexport type InputNumberEmits = FlInputNumberEmits\r\n","<template>\r\n <component :is=\"ElInput\" v-bind=\"mergedInputAttrs\" :ref=\"changeRef\">\r\n <template v-for=\"(_, slotName) in slots\" :key=\"String(slotName)\" #[slotName]=\"slotScope\">\r\n <slot :name=\"slotName\" v-bind=\"slotScope || {}\" />\r\n </template>\r\n </component>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ElInput } from 'element-plus'\r\nimport type { ComponentInstance } from 'vue'\r\nimport { computed, ref, useAttrs, useSlots, watch } from 'vue'\r\nimport { useMergedExpose } from '@falcon-ui/hooks'\r\nimport { invokeListener, useNamespace } from '@falcon-ui/utils'\r\nimport type { FlInputNumberPrecisionMode } from './input-number'\r\nimport { flInputNumberEmits, flInputNumberProps } from './input-number'\r\n\r\ndefineOptions({\r\n name: 'FlInputNumber',\r\n inheritAttrs: false\r\n})\r\n\r\ntype NumberLike = number | string | null | undefined\r\ntype InputMode = 'text' | 'search' | 'email' | 'tel' | 'url' | 'none' | 'numeric' | 'decimal'\r\ntype FormatterFn = (value: string) => string\r\ntype ParserFn = (value: string) => string\r\n\r\nconst props = defineProps(flInputNumberProps)\r\nconst emit = defineEmits(flInputNumberEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst ns = useNamespace('input-number')\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst displayValue = ref('')\r\nconst strictErrorActive = ref(false)\r\nconst isFocused = ref(false)\r\n\r\nconst precisionValue = computed(() => {\r\n if (!Number.isFinite(props.precision) || props.precision < 0) {\r\n return 0\r\n }\r\n\r\n return Math.trunc(props.precision)\r\n})\r\n\r\nconst resolvedPlaceholder = computed(() => {\r\n if (strictErrorActive.value) {\r\n return props.strictErrorPlaceholder\r\n }\r\n\r\n const candidate = rawAttrs.placeholder\r\n return typeof candidate === 'string' ? candidate : undefined\r\n})\r\n\r\nconst mergedIsError = computed(() => props.isError || strictErrorActive.value)\r\n\r\nconst validInputModes = new Set<InputMode>([\r\n 'text',\r\n 'search',\r\n 'email',\r\n 'tel',\r\n 'url',\r\n 'none',\r\n 'numeric',\r\n 'decimal'\r\n])\r\n\r\nconst defaultNumberFormatter = new Intl.NumberFormat('en-US', {\r\n useGrouping: true,\r\n maximumFractionDigits: 20\r\n})\r\n\r\nconst toNumeric = (value: NumberLike): number | null => {\r\n if (value === null || value === undefined || value === '') {\r\n return null\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return Number.isFinite(value) ? value : null\r\n }\r\n\r\n if (typeof value !== 'string') {\r\n return null\r\n }\r\n\r\n const trimmed = value.trim()\r\n if (!trimmed) {\r\n return null\r\n }\r\n\r\n if (!/^-?(?:\\d+\\.?\\d*|\\.\\d+)$/.test(trimmed)) {\r\n return null\r\n }\r\n\r\n const next = Number(trimmed)\r\n return Number.isFinite(next) ? next : null\r\n}\r\n\r\nconst toRawString = (value: number): string => {\r\n if (Object.is(value, -0)) {\r\n return '0'\r\n }\r\n\r\n return `${value}`\r\n}\r\n\r\nconst defaultElInputFormatter: FormatterFn = (value) => {\r\n const numericValue = toNumeric(value)\r\n if (numericValue === null) {\r\n return value\r\n }\r\n\r\n return defaultNumberFormatter.format(numericValue)\r\n}\r\n\r\nconst defaultElInputParser: ParserFn = (value) => value.replace(/,/g, '').trim()\r\n\r\nconst sanitizeNumericInput = (value: string): string => {\r\n if (!value) {\r\n return ''\r\n }\r\n\r\n let filtered = value.replace(/[^\\d.-]/g, '')\r\n const isNegative = filtered.startsWith('-')\r\n filtered = filtered.replace(/-/g, '')\r\n\r\n const dotIndex = filtered.indexOf('.')\r\n if (dotIndex !== -1) {\r\n const integerPart = filtered.slice(0, dotIndex)\r\n const decimalPart = filtered.slice(dotIndex + 1).replace(/\\./g, '')\r\n filtered = `${integerPart}.${decimalPart}`\r\n }\r\n\r\n return `${isNegative ? '-' : ''}${filtered}`\r\n}\r\n\r\nconst isPartialNumber = (value: string): boolean => value === '-' || value === '.' || value === '-.'\r\n\r\nconst countFractionLength = (value: string): number => {\r\n const dotIndex = value.indexOf('.')\r\n if (dotIndex < 0) {\r\n return 0\r\n }\r\n\r\n return value.slice(dotIndex + 1).length\r\n}\r\n\r\nconst applyPrecision = (\r\n value: number,\r\n mode: FlInputNumberPrecisionMode,\r\n precision: number\r\n): number => {\r\n if (precision < 0) {\r\n return value\r\n }\r\n\r\n if (mode === 'ROUND') {\r\n return Number(value.toFixed(precision))\r\n }\r\n\r\n if (mode === 'FIXED') {\r\n const factor = 10 ** precision\r\n return Math.trunc(value * factor) / factor\r\n }\r\n\r\n return value\r\n}\r\n\r\nconst emitModelValue = (value: number | null) => {\r\n emit('update:modelValue', value)\r\n}\r\n\r\nconst emitStrictErrorState = (active: boolean) => {\r\n if (strictErrorActive.value === active) {\r\n return\r\n }\r\n\r\n strictErrorActive.value = active\r\n emit('update:isError', active)\r\n}\r\n\r\nconst clearModelValue = () => {\r\n emitModelValue(null)\r\n displayValue.value = ''\r\n}\r\n\r\nconst syncDisplayFromModel = (value: number | null) => {\r\n if (value === null) {\r\n displayValue.value = ''\r\n return\r\n }\r\n\r\n displayValue.value = toRawString(value)\r\n}\r\n\r\nconst handleCustomPayload = (rawValue: string, value: number | null) => {\r\n emit('custom-input', { rawValue, value })\r\n}\r\n\r\nconst handleInput = (value: unknown) => {\r\n const input = typeof value === 'string' ? value : ''\r\n const sanitized = sanitizeNumericInput(input)\r\n displayValue.value = sanitized\r\n\r\n if (strictErrorActive.value) {\r\n emitStrictErrorState(false)\r\n }\r\n\r\n if (!sanitized || isPartialNumber(sanitized)) {\r\n emitModelValue(null)\r\n handleCustomPayload(sanitized, null)\r\n return\r\n }\r\n\r\n const numericValue = toNumeric(sanitized)\r\n if (numericValue === null) {\r\n clearModelValue()\r\n handleCustomPayload('', null)\r\n return\r\n }\r\n\r\n emitModelValue(numericValue)\r\n handleCustomPayload(sanitized, numericValue)\r\n}\r\n\r\nconst handleStrictError = (rawValue: string, actualPrecision: number) => {\r\n emit('strict-error', {\r\n rawValue,\r\n precision: precisionValue.value,\r\n actualPrecision\r\n })\r\n emitStrictErrorState(true)\r\n clearModelValue()\r\n}\r\n\r\nconst handleChange = (value: unknown) => {\r\n const input = typeof value === 'string' ? sanitizeNumericInput(value) : ''\r\n\r\n if (!input || isPartialNumber(input)) {\r\n clearModelValue()\r\n return\r\n }\r\n\r\n const numericValue = toNumeric(input)\r\n if (numericValue === null) {\r\n clearModelValue()\r\n return\r\n }\r\n\r\n const actualPrecision = countFractionLength(input)\r\n if (actualPrecision > precisionValue.value && props.precisionMode === 'STRICT') {\r\n handleStrictError(input, actualPrecision)\r\n return\r\n }\r\n\r\n const nextValue = applyPrecision(numericValue, props.precisionMode, precisionValue.value)\r\n emitModelValue(nextValue)\r\n emitStrictErrorState(false)\r\n syncDisplayFromModel(nextValue)\r\n}\r\n\r\nconst handleFocus = (evt: FocusEvent) => {\r\n isFocused.value = true\r\n\r\n const current = toNumeric(props.modelValue)\r\n if (current !== null) {\r\n displayValue.value = toRawString(current)\r\n }\r\n\r\n invokeListener(rawAttrs.onFocus, evt)\r\n}\r\n\r\nconst handleBlur = (evt: FocusEvent) => {\r\n isFocused.value = false\r\n\r\n const current = toNumeric(props.modelValue)\r\n syncDisplayFromModel(current)\r\n invokeListener(rawAttrs.onBlur, evt)\r\n}\r\n\r\nconst resolveInputMode = (): InputMode => {\r\n const candidate = rawAttrs.inputmode\r\n if (typeof candidate === 'string' && validInputModes.has(candidate as InputMode)) {\r\n return candidate as InputMode\r\n }\r\n\r\n return 'decimal'\r\n}\r\n\r\nconst resolveFormatter = (): FormatterFn | undefined => {\r\n if (!props.isFormat || isFocused.value) {\r\n return undefined\r\n }\r\n\r\n const formatter = rawAttrs.formatter\r\n if (typeof formatter === 'function') {\r\n return formatter as FormatterFn\r\n }\r\n\r\n return defaultElInputFormatter\r\n}\r\n\r\nconst resolveParser = (): ParserFn | undefined => {\r\n if (!props.isFormat || isFocused.value) {\r\n return undefined\r\n }\r\n\r\n const parser = rawAttrs.parser\r\n if (typeof parser === 'function') {\r\n return parser as ParserFn\r\n }\r\n\r\n if (typeof rawAttrs.formatter === 'function') {\r\n return undefined\r\n }\r\n\r\n return defaultElInputParser\r\n}\r\n\r\nconst mergedInputAttrs = computed(() => {\r\n const originalInputListener = rawAttrs.onInput\r\n const originalChangeListener = rawAttrs.onChange\r\n\r\n return {\r\n ...rawAttrs,\r\n class: [\r\n ns.b(),\r\n rawAttrs.class,\r\n {\r\n 'is-error': mergedIsError.value,\r\n 'is-table': props.isTable\r\n }\r\n ],\r\n modelValue: displayValue.value,\r\n placeholder: resolvedPlaceholder.value,\r\n inputmode: resolveInputMode(),\r\n formatter: resolveFormatter(),\r\n parser: resolveParser(),\r\n 'onUpdate:modelValue': undefined,\r\n onInput: (value: string) => {\r\n handleInput(value)\r\n invokeListener(originalInputListener, value)\r\n },\r\n onChange: (value: string) => {\r\n handleChange(value)\r\n invokeListener(originalChangeListener, value)\r\n },\r\n onFocus: handleFocus,\r\n onBlur: handleBlur\r\n }\r\n})\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (value) => {\r\n const numericValue = toNumeric(value)\r\n\r\n if (numericValue === null) {\r\n displayValue.value = ''\r\n if (value !== null && value !== undefined && value !== '') {\r\n emitModelValue(null)\r\n }\r\n return\r\n }\r\n\r\n if (typeof value === 'string') {\r\n emitModelValue(numericValue)\r\n }\r\n\r\n syncDisplayFromModel(numericValue)\r\n },\r\n { immediate: true }\r\n)\r\n\r\nwatch(\r\n () => props.isError,\r\n (isError, previousIsError) => {\r\n if (isError && previousIsError !== true) {\r\n clearModelValue()\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\nwatch(\r\n () => props.isFormat,\r\n () => {\r\n const numericValue = toNumeric(props.modelValue)\r\n syncDisplayFromModel(numericValue)\r\n }\r\n)\r\n\r\nconst _myExpose = {\r\n /**\r\n * FlInputNumber 额外暴露的方法,用于联调验证。\r\n */\r\n myMethod() {\r\n console.log('my method!')\r\n },\r\n /**\r\n * FlInputNumber 额外暴露的示例数值。\r\n */\r\n myValue: 123\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElInput> & typeof _myExpose)\r\n</script>\r\n","<template>\r\n <component :is=\"ElInput\" v-bind=\"mergedInputAttrs\" :ref=\"changeRef\">\r\n <template v-for=\"(_, slotName) in slots\" :key=\"String(slotName)\" #[slotName]=\"slotScope\">\r\n <slot :name=\"slotName\" v-bind=\"slotScope || {}\" />\r\n </template>\r\n </component>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ElInput } from 'element-plus'\r\nimport type { ComponentInstance } from 'vue'\r\nimport { computed, ref, useAttrs, useSlots, watch } from 'vue'\r\nimport { useMergedExpose } from '@falcon-ui/hooks'\r\nimport { invokeListener, useNamespace } from '@falcon-ui/utils'\r\nimport type { FlInputNumberPrecisionMode } from './input-number'\r\nimport { flInputNumberEmits, flInputNumberProps } from './input-number'\r\n\r\ndefineOptions({\r\n name: 'FlInputNumber',\r\n inheritAttrs: false\r\n})\r\n\r\ntype NumberLike = number | string | null | undefined\r\ntype InputMode = 'text' | 'search' | 'email' | 'tel' | 'url' | 'none' | 'numeric' | 'decimal'\r\ntype FormatterFn = (value: string) => string\r\ntype ParserFn = (value: string) => string\r\n\r\nconst props = defineProps(flInputNumberProps)\r\nconst emit = defineEmits(flInputNumberEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst ns = useNamespace('input-number')\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst displayValue = ref('')\r\nconst strictErrorActive = ref(false)\r\nconst isFocused = ref(false)\r\n\r\nconst precisionValue = computed(() => {\r\n if (!Number.isFinite(props.precision) || props.precision < 0) {\r\n return 0\r\n }\r\n\r\n return Math.trunc(props.precision)\r\n})\r\n\r\nconst resolvedPlaceholder = computed(() => {\r\n if (strictErrorActive.value) {\r\n return props.strictErrorPlaceholder\r\n }\r\n\r\n const candidate = rawAttrs.placeholder\r\n return typeof candidate === 'string' ? candidate : undefined\r\n})\r\n\r\nconst mergedIsError = computed(() => props.isError || strictErrorActive.value)\r\n\r\nconst validInputModes = new Set<InputMode>([\r\n 'text',\r\n 'search',\r\n 'email',\r\n 'tel',\r\n 'url',\r\n 'none',\r\n 'numeric',\r\n 'decimal'\r\n])\r\n\r\nconst defaultNumberFormatter = new Intl.NumberFormat('en-US', {\r\n useGrouping: true,\r\n maximumFractionDigits: 20\r\n})\r\n\r\nconst toNumeric = (value: NumberLike): number | null => {\r\n if (value === null || value === undefined || value === '') {\r\n return null\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return Number.isFinite(value) ? value : null\r\n }\r\n\r\n if (typeof value !== 'string') {\r\n return null\r\n }\r\n\r\n const trimmed = value.trim()\r\n if (!trimmed) {\r\n return null\r\n }\r\n\r\n if (!/^-?(?:\\d+\\.?\\d*|\\.\\d+)$/.test(trimmed)) {\r\n return null\r\n }\r\n\r\n const next = Number(trimmed)\r\n return Number.isFinite(next) ? next : null\r\n}\r\n\r\nconst toRawString = (value: number): string => {\r\n if (Object.is(value, -0)) {\r\n return '0'\r\n }\r\n\r\n return `${value}`\r\n}\r\n\r\nconst defaultElInputFormatter: FormatterFn = (value) => {\r\n const numericValue = toNumeric(value)\r\n if (numericValue === null) {\r\n return value\r\n }\r\n\r\n return defaultNumberFormatter.format(numericValue)\r\n}\r\n\r\nconst defaultElInputParser: ParserFn = (value) => value.replace(/,/g, '').trim()\r\n\r\nconst sanitizeNumericInput = (value: string): string => {\r\n if (!value) {\r\n return ''\r\n }\r\n\r\n let filtered = value.replace(/[^\\d.-]/g, '')\r\n const isNegative = filtered.startsWith('-')\r\n filtered = filtered.replace(/-/g, '')\r\n\r\n const dotIndex = filtered.indexOf('.')\r\n if (dotIndex !== -1) {\r\n const integerPart = filtered.slice(0, dotIndex)\r\n const decimalPart = filtered.slice(dotIndex + 1).replace(/\\./g, '')\r\n filtered = `${integerPart}.${decimalPart}`\r\n }\r\n\r\n return `${isNegative ? '-' : ''}${filtered}`\r\n}\r\n\r\nconst isPartialNumber = (value: string): boolean => value === '-' || value === '.' || value === '-.'\r\n\r\nconst countFractionLength = (value: string): number => {\r\n const dotIndex = value.indexOf('.')\r\n if (dotIndex < 0) {\r\n return 0\r\n }\r\n\r\n return value.slice(dotIndex + 1).length\r\n}\r\n\r\nconst applyPrecision = (\r\n value: number,\r\n mode: FlInputNumberPrecisionMode,\r\n precision: number\r\n): number => {\r\n if (precision < 0) {\r\n return value\r\n }\r\n\r\n if (mode === 'ROUND') {\r\n return Number(value.toFixed(precision))\r\n }\r\n\r\n if (mode === 'FIXED') {\r\n const factor = 10 ** precision\r\n return Math.trunc(value * factor) / factor\r\n }\r\n\r\n return value\r\n}\r\n\r\nconst emitModelValue = (value: number | null) => {\r\n emit('update:modelValue', value)\r\n}\r\n\r\nconst emitStrictErrorState = (active: boolean) => {\r\n if (strictErrorActive.value === active) {\r\n return\r\n }\r\n\r\n strictErrorActive.value = active\r\n emit('update:isError', active)\r\n}\r\n\r\nconst clearModelValue = () => {\r\n emitModelValue(null)\r\n displayValue.value = ''\r\n}\r\n\r\nconst syncDisplayFromModel = (value: number | null) => {\r\n if (value === null) {\r\n displayValue.value = ''\r\n return\r\n }\r\n\r\n displayValue.value = toRawString(value)\r\n}\r\n\r\nconst handleCustomPayload = (rawValue: string, value: number | null) => {\r\n emit('custom-input', { rawValue, value })\r\n}\r\n\r\nconst handleInput = (value: unknown) => {\r\n const input = typeof value === 'string' ? value : ''\r\n const sanitized = sanitizeNumericInput(input)\r\n displayValue.value = sanitized\r\n\r\n if (strictErrorActive.value) {\r\n emitStrictErrorState(false)\r\n }\r\n\r\n if (!sanitized || isPartialNumber(sanitized)) {\r\n emitModelValue(null)\r\n handleCustomPayload(sanitized, null)\r\n return\r\n }\r\n\r\n const numericValue = toNumeric(sanitized)\r\n if (numericValue === null) {\r\n clearModelValue()\r\n handleCustomPayload('', null)\r\n return\r\n }\r\n\r\n emitModelValue(numericValue)\r\n handleCustomPayload(sanitized, numericValue)\r\n}\r\n\r\nconst handleStrictError = (rawValue: string, actualPrecision: number) => {\r\n emit('strict-error', {\r\n rawValue,\r\n precision: precisionValue.value,\r\n actualPrecision\r\n })\r\n emitStrictErrorState(true)\r\n clearModelValue()\r\n}\r\n\r\nconst handleChange = (value: unknown) => {\r\n const input = typeof value === 'string' ? sanitizeNumericInput(value) : ''\r\n\r\n if (!input || isPartialNumber(input)) {\r\n clearModelValue()\r\n return\r\n }\r\n\r\n const numericValue = toNumeric(input)\r\n if (numericValue === null) {\r\n clearModelValue()\r\n return\r\n }\r\n\r\n const actualPrecision = countFractionLength(input)\r\n if (actualPrecision > precisionValue.value && props.precisionMode === 'STRICT') {\r\n handleStrictError(input, actualPrecision)\r\n return\r\n }\r\n\r\n const nextValue = applyPrecision(numericValue, props.precisionMode, precisionValue.value)\r\n emitModelValue(nextValue)\r\n emitStrictErrorState(false)\r\n syncDisplayFromModel(nextValue)\r\n}\r\n\r\nconst handleFocus = (evt: FocusEvent) => {\r\n isFocused.value = true\r\n\r\n const current = toNumeric(props.modelValue)\r\n if (current !== null) {\r\n displayValue.value = toRawString(current)\r\n }\r\n\r\n invokeListener(rawAttrs.onFocus, evt)\r\n}\r\n\r\nconst handleBlur = (evt: FocusEvent) => {\r\n isFocused.value = false\r\n\r\n const current = toNumeric(props.modelValue)\r\n syncDisplayFromModel(current)\r\n invokeListener(rawAttrs.onBlur, evt)\r\n}\r\n\r\nconst resolveInputMode = (): InputMode => {\r\n const candidate = rawAttrs.inputmode\r\n if (typeof candidate === 'string' && validInputModes.has(candidate as InputMode)) {\r\n return candidate as InputMode\r\n }\r\n\r\n return 'decimal'\r\n}\r\n\r\nconst resolveFormatter = (): FormatterFn | undefined => {\r\n if (!props.isFormat || isFocused.value) {\r\n return undefined\r\n }\r\n\r\n const formatter = rawAttrs.formatter\r\n if (typeof formatter === 'function') {\r\n return formatter as FormatterFn\r\n }\r\n\r\n return defaultElInputFormatter\r\n}\r\n\r\nconst resolveParser = (): ParserFn | undefined => {\r\n if (!props.isFormat || isFocused.value) {\r\n return undefined\r\n }\r\n\r\n const parser = rawAttrs.parser\r\n if (typeof parser === 'function') {\r\n return parser as ParserFn\r\n }\r\n\r\n if (typeof rawAttrs.formatter === 'function') {\r\n return undefined\r\n }\r\n\r\n return defaultElInputParser\r\n}\r\n\r\nconst mergedInputAttrs = computed(() => {\r\n const originalInputListener = rawAttrs.onInput\r\n const originalChangeListener = rawAttrs.onChange\r\n\r\n return {\r\n ...rawAttrs,\r\n class: [\r\n ns.b(),\r\n rawAttrs.class,\r\n {\r\n 'is-error': mergedIsError.value,\r\n 'is-table': props.isTable\r\n }\r\n ],\r\n modelValue: displayValue.value,\r\n placeholder: resolvedPlaceholder.value,\r\n inputmode: resolveInputMode(),\r\n formatter: resolveFormatter(),\r\n parser: resolveParser(),\r\n 'onUpdate:modelValue': undefined,\r\n onInput: (value: string) => {\r\n handleInput(value)\r\n invokeListener(originalInputListener, value)\r\n },\r\n onChange: (value: string) => {\r\n handleChange(value)\r\n invokeListener(originalChangeListener, value)\r\n },\r\n onFocus: handleFocus,\r\n onBlur: handleBlur\r\n }\r\n})\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (value) => {\r\n const numericValue = toNumeric(value)\r\n\r\n if (numericValue === null) {\r\n displayValue.value = ''\r\n if (value !== null && value !== undefined && value !== '') {\r\n emitModelValue(null)\r\n }\r\n return\r\n }\r\n\r\n if (typeof value === 'string') {\r\n emitModelValue(numericValue)\r\n }\r\n\r\n syncDisplayFromModel(numericValue)\r\n },\r\n { immediate: true }\r\n)\r\n\r\nwatch(\r\n () => props.isError,\r\n (isError, previousIsError) => {\r\n if (isError && previousIsError !== true) {\r\n clearModelValue()\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\nwatch(\r\n () => props.isFormat,\r\n () => {\r\n const numericValue = toNumeric(props.modelValue)\r\n syncDisplayFromModel(numericValue)\r\n }\r\n)\r\n\r\nconst _myExpose = {\r\n /**\r\n * FlInputNumber 额外暴露的方法,用于联调验证。\r\n */\r\n myMethod() {\r\n console.log('my method!')\r\n },\r\n /**\r\n * FlInputNumber 额外暴露的示例数值。\r\n */\r\n myValue: 123\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElInput> & typeof _myExpose)\r\n</script>\r\n"],"mappings":"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"}