@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 @@
1
+ {"version":3,"file":"dialog-CJU00aEV.cjs","names":["activeDialogInstance: ActiveDialogInstance | null","dialogComponentLoader: Promise<DialogComponent> | null","nextProps: Record<string, unknown>","pendingModelUpdateAction: DialogAction | null","closeAll: UseDialogService['closeAll']"],"sources":["../../../packages/utils/src/bem.ts","../../../packages/utils/src/component.ts","../../../packages/utils/src/install.ts","../../../packages/hooks/src/use-component.ts","../../../packages/hooks/src/use-clearable-state.ts","../../../packages/hooks/src/use-dialog.ts","../../../packages/components/button/src/button.ts","../../../packages/components/button/src/button.vue","../../../packages/components/button/src/button.vue","../../../packages/components/button/index.ts","../../../packages/components/dialog/src/dialog.ts","../../../packages/components/dialog/src/dialog.vue","../../../packages/components/dialog/src/dialog.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 type { App, Plugin } from 'vue'\r\n\r\nexport type SFCWithInstall<T> = T & Plugin\r\n\r\nexport const withInstall = <T extends { name?: string }>(component: T): SFCWithInstall<T> => {\r\n const installable = component as SFCWithInstall<T>\r\n\r\n installable.install = (app: App) => {\r\n if (!component.name) {\r\n return\r\n }\r\n\r\n app.component(component.name, component as unknown as object)\r\n }\r\n\r\n return installable\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 { watch } from 'vue'\r\nimport { invokeListener } from '@falcon-ui/utils'\r\n\r\nexport type ClearValueResolver = () => unknown\r\n\r\nexport interface UseClearableStateOptions {\r\n attrs: Record<string, unknown>\r\n isError: () => boolean\r\n resolveClearValue?: ClearValueResolver\r\n}\r\n\r\nexport const useClearableState = ({\r\n attrs,\r\n isError,\r\n resolveClearValue = () => undefined\r\n}: UseClearableStateOptions) => {\r\n const resolveClearable = (): boolean => {\r\n const candidate = attrs.clearable\r\n if (typeof candidate === 'boolean') {\r\n return candidate\r\n }\r\n\r\n return true\r\n }\r\n\r\n const clearModelValue = () => {\r\n invokeListener(attrs['onUpdate:modelValue'], resolveClearValue())\r\n }\r\n\r\n watch(\r\n isError,\r\n (active, previousActive) => {\r\n if (active && previousActive !== true) {\r\n clearModelValue()\r\n }\r\n },\r\n { immediate: true }\r\n )\r\n\r\n return {\r\n clearModelValue,\r\n resolveClearable\r\n }\r\n}\r\n","// 复用 FlDialog 的公开 props 类型,保证调用式服务与组件 props 契约一致。\r\nimport type { FlDialogProps } from '../../components/dialog/src/dialog'\r\n// 支持通过字符串、VNode 或渲染函数提供弹窗内容。\r\nimport type { Ref, VNode } from 'vue'\r\n// 调用式弹窗通过运行时动态创建 VNode 并手动渲染/销毁。\r\nimport { cloneVNode, createVNode, defineComponent, h, isVNode, ref, render } from 'vue'\r\n\r\n// useDialog 支持的所有动作类型。\r\nexport type DialogAction = 'confirm' | 'cancel' | 'close' | 'mask' | 'esc' | 'closeAll'\r\n// closeAll 的原因类型与动作类型保持一致。\r\nexport type DialogCloseReason = DialogAction\r\n\r\n// Promise resolve 分支的载荷,仅 confirm 会进入 resolve。\r\nexport type DialogResolvePayload<TPayload = void> = TPayload extends void\r\n ? { action: 'confirm' }\r\n : { action: 'confirm'; data: TPayload }\r\n\r\n// Promise reject 分支动作(排除 confirm)。\r\nexport type DialogRejectAction = Exclude<DialogAction, 'confirm'>\r\n\r\n// Promise reject 分支的载荷结构。\r\nexport interface DialogRejectPayload {\r\n action: DialogRejectAction\r\n}\r\n\r\n// 关闭前拦截钩子:返回 false 则阻止关闭。\r\nexport type DialogBeforeClose = (action: DialogAction) => boolean | Promise<boolean>\r\n// 确认动作的数据解析器。\r\nexport type DialogPayloadResolver<TPayload> = () => TPayload | Promise<TPayload>\r\n// 确认动作通过组件实例方法读取数据的方法名。\r\nexport type DialogPayloadMethod = string\r\n// 弹窗正文支持的消息类型。\r\nexport type DialogMessage = string | VNode | (() => VNode)\r\n\r\n// open 方法参数。\r\nexport interface DialogOpenOptions<TPayload = void> {\r\n // 标题。\r\n title?: string\r\n // 正文内容。\r\n message?: DialogMessage\r\n // 挂载目标,非法时回退到 document.body。\r\n appendTo?: string | HTMLElement\r\n // 是否显示右上角关闭按钮。\r\n showClose?: boolean\r\n // 是否允许点击遮罩关闭。\r\n closeOnClickModal?: boolean\r\n // 是否允许按 ESC 关闭。\r\n closeOnPressEscape?: boolean\r\n // 关闭前拦截。\r\n beforeClose?: DialogBeforeClose\r\n // 透传给 FlDialog 的额外参数(内部托管字段会被过滤)。\r\n dialogProps?: Partial<FlDialogProps> & Record<string, unknown>\r\n // 确认时读取业务数据并返回到 then 回调。\r\n payloadResolver?: DialogPayloadResolver<TPayload>\r\n // 确认时自动从 message 对应组件实例调用的方法名。\r\n payloadMethod?: DialogPayloadMethod\r\n // 调用 payloadMethod 时透传的参数列表。\r\n payloadMethodArgs?: unknown[]\r\n // 弹窗最终关闭时的动作回调。\r\n onAction?: (action: DialogAction) => void\r\n}\r\n\r\n// useDialog 对外暴露的服务接口。\r\nexport interface UseDialogService {\r\n // 打开弹窗,confirm resolve,其余动作 reject。\r\n open: <TPayload = void>(\r\n options?: DialogOpenOptions<TPayload>\r\n ) => Promise<DialogResolvePayload<TPayload>>\r\n // 关闭当前活动实例。\r\n closeAll: (reason?: DialogCloseReason) => void\r\n}\r\n\r\n// 动态导入 .vue 组件后的类型。\r\ntype DialogComponent = ReturnType<typeof defineComponent>\r\n\r\n// 当前活动实例元信息,用于单例控制与关闭。\r\ntype ActiveDialogInstance = {\r\n // 主动关闭当前实例。\r\n close: (reason?: DialogCloseReason) => void\r\n // 实例唯一 id,用于避免旧实例清理误伤新实例。\r\n id: number\r\n}\r\n\r\n// 支持从组件 VNode 自动注入 ref 的 shapeFlag(有状态/函数式组件)。\r\nconst componentVNodeShapeFlag = 4 | 2\r\n\r\n// 这些字段由服务层统一管理,禁止调用方在 dialogProps 里覆盖。\r\nconst managedDialogPropKeys = new Set([\r\n 'modelValue',\r\n 'title',\r\n 'showClose',\r\n 'closeOnClickModal',\r\n 'closeOnPressEscape',\r\n 'onCancel',\r\n 'onConfirm',\r\n 'onUpdate:modelValue',\r\n 'onUpdateModelValue'\r\n])\r\n\r\n// 当前活动实例引用(单例)。\r\nlet activeDialogInstance: ActiveDialogInstance | null = null\r\n// 自增实例 id 种子。\r\nlet dialogSeed = 0\r\n// 懒加载缓存,避免重复动态导入对话框组件。\r\nlet dialogComponentLoader: Promise<DialogComponent> | null = null\r\n\r\n/**\r\n * [04] 懒加载 FlDialog 组件并进行缓存。\r\n */\r\nconst loadDialogComponent = async (): Promise<DialogComponent> => {\r\n if (!dialogComponentLoader) {\r\n // 仅首次调用时执行动态导入。\r\n dialogComponentLoader = import('../../components/dialog/src/dialog.vue').then(\r\n (module) => module.default as DialogComponent\r\n )\r\n }\r\n\r\n return dialogComponentLoader\r\n}\r\n\r\n/**\r\n * 将任意动作映射到 reject 分支动作。\r\n * 理论上 confirm 不会走 reject,这里兜底转换为 close。\r\n */\r\nconst toDialogRejectAction = (action: DialogAction): DialogRejectAction =>\r\n action === 'confirm' ? 'close' : action\r\n\r\n/**\r\n * [03] 解析挂载容器,优先使用 appendTo,失败回退到 document.body。\r\n */\r\nconst resolveAppendTarget = (appendTo?: string | HTMLElement): HTMLElement => {\r\n // 首版仅支持浏览器运行时。\r\n if (typeof document === 'undefined') {\r\n throw new Error('[useDialog] document is not available in current runtime.')\r\n }\r\n\r\n // 直接传入 DOM 节点时直接使用。\r\n if (appendTo instanceof HTMLElement) {\r\n return appendTo\r\n }\r\n\r\n // 传入选择器时尝试查询目标节点。\r\n if (typeof appendTo === 'string') {\r\n const node = document.querySelector(appendTo)\r\n if (node instanceof HTMLElement) {\r\n return node\r\n }\r\n }\r\n\r\n return document.body\r\n}\r\n\r\n/**\r\n * 过滤 dialogProps,移除由服务层托管的字段。\r\n */\r\nconst sanitizeDialogProps = (\r\n dialogProps?: Partial<FlDialogProps> & Record<string, unknown>\r\n): Record<string, unknown> => {\r\n if (!dialogProps) {\r\n return {}\r\n }\r\n\r\n const nextProps: Record<string, unknown> = {}\r\n\r\n // 仅保留允许透传的字段。\r\n for (const [key, value] of Object.entries(dialogProps)) {\r\n if (!managedDialogPropKeys.has(key)) {\r\n nextProps[key] = value\r\n }\r\n }\r\n\r\n return nextProps\r\n}\r\n\r\n/**\r\n * 解析 message:若为函数则执行得到 VNode/字符串。\r\n */\r\nconst resolveMessageContent = (message?: DialogMessage) => {\r\n if (typeof message === 'function') {\r\n return message()\r\n }\r\n\r\n return message\r\n}\r\n\r\n/**\r\n * 判断当前 VNode 是否为组件。\r\n */\r\nconst isComponentVNode = (value: unknown): value is VNode => {\r\n if (!isVNode(value)) {\r\n return false\r\n }\r\n\r\n return (value.shapeFlag & componentVNodeShapeFlag) !== 0\r\n}\r\n\r\n/**\r\n * 若 message 是组件 VNode,则自动注入内部 payloadTargetRef。\r\n */\r\nconst injectPayloadTargetRef = (\r\n messageContent: unknown,\r\n payloadTargetRef: Ref<Record<string, unknown> | null>\r\n) => {\r\n if (!isComponentVNode(messageContent)) {\r\n return messageContent\r\n }\r\n\r\n // mergeRef=true:保留调用方已有 ref,同时附加内部 payloadTargetRef。\r\n return cloneVNode(\r\n messageContent,\r\n {\r\n ref: payloadTargetRef\r\n },\r\n true\r\n )\r\n}\r\n\r\n/**\r\n * 通过 payloadMethod 从 message 组件实例读取确认数据。\r\n */\r\nconst resolvePayloadByMethod = async <TPayload>(\r\n options: DialogOpenOptions<TPayload>,\r\n payloadTargetRef: Ref<Record<string, unknown> | null>\r\n) => {\r\n const payloadMethod = options.payloadMethod\r\n if (!payloadMethod) {\r\n return undefined as TPayload\r\n }\r\n\r\n const targetInstance = payloadTargetRef.value\r\n if (!targetInstance) {\r\n throw new Error(`[useDialog] payload target is not available for method \"${payloadMethod}\".`)\r\n }\r\n\r\n const method = targetInstance[payloadMethod]\r\n if (typeof method !== 'function') {\r\n throw new Error(`[useDialog] payload method \"${payloadMethod}\" is not a function.`)\r\n }\r\n\r\n return (await method(...(options.payloadMethodArgs ?? []))) as TPayload\r\n}\r\n\r\n/**\r\n * 执行 confirm 数据解析,作为 then 分支的 data。\r\n * 优先级:payloadResolver > payloadMethod。\r\n */\r\nconst resolveConfirmPayload = async <TPayload>(\r\n options: DialogOpenOptions<TPayload>,\r\n payloadTargetRef: Ref<Record<string, unknown> | null>\r\n) => {\r\n if (options.payloadResolver) {\r\n return await options.payloadResolver()\r\n }\r\n\r\n if (options.payloadMethod) {\r\n return await resolvePayloadByMethod(options, payloadTargetRef)\r\n }\r\n\r\n return undefined as TPayload\r\n}\r\n\r\n/**\r\n * [05] 执行 beforeClose 拦截逻辑。\r\n * - 未提供 beforeClose:允许关闭\r\n * - 返回 false:阻止关闭\r\n * - beforeClose 抛错:按阻止关闭处理,避免异常导致状态错乱\r\n */\r\nconst resolveBeforeClose = async (\r\n beforeClose: DialogBeforeClose | undefined,\r\n action: DialogAction\r\n) => {\r\n if (!beforeClose) {\r\n return true\r\n }\r\n\r\n try {\r\n const result = await beforeClose(action)\r\n return result !== false\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * [02] 打开调用式弹窗。\r\n */\r\nconst open = <TPayload = void>(\r\n options: DialogOpenOptions<TPayload> = {}\r\n): Promise<DialogResolvePayload<TPayload>> => {\r\n // 单例覆盖策略:打开新实例前先关闭旧实例。\r\n activeDialogInstance?.close('closeAll')\r\n\r\n // 创建挂载容器并插入目标节点。\r\n const appendTarget = resolveAppendTarget(options.appendTo)\r\n const container = document.createElement('div')\r\n appendTarget.appendChild(container)\r\n\r\n // 生成当前实例唯一 id。\r\n const instanceId = ++dialogSeed\r\n\r\n return new Promise<DialogResolvePayload<TPayload>>((resolve, reject) => {\r\n // 防止 Promise 重复 settle。\r\n let isSettled = false\r\n // 防止异步结算期间重复进入 settle。\r\n let isSettling = false\r\n // beforeClose 拦截 cancel/confirm 后,忽略其后跟随的一次 modelValue=false。\r\n let skipNextModelUpdate = false\r\n // 记录 footer 行为,以便在 update:modelValue 时还原为正确 action。\r\n let pendingModelUpdateAction: DialogAction | null = null\r\n // message 组件实例引用(用于 payloadMethod 自动调用)。\r\n const payloadTargetRef = ref<Record<string, unknown> | null>(null)\r\n\r\n /**\r\n * 卸载 VNode、移除容器并清理活动实例引用。\r\n */\r\n const cleanup = () => {\r\n render(null, container)\r\n container.remove()\r\n\r\n // 仅当当前实例仍是活动实例时才清空引用,防止误清理新实例。\r\n if (activeDialogInstance?.id === instanceId) {\r\n activeDialogInstance = null\r\n }\r\n }\r\n\r\n /**\r\n * 最终结算 Promise 并执行资源清理。\r\n */\r\n const settle = async (action: DialogAction) => {\r\n if (isSettled || isSettling) {\r\n return\r\n }\r\n\r\n isSettling = true\r\n\r\n try {\r\n // confirm 进入 resolve,其他动作进入 reject。\r\n if (action === 'confirm') {\r\n const payload = await resolveConfirmPayload(options, payloadTargetRef)\r\n if (isSettled) {\r\n return\r\n }\r\n\r\n isSettled = true\r\n // 通知调用方最终动作。\r\n options.onAction?.(action)\r\n\r\n if (payload === undefined) {\r\n resolve({ action: 'confirm' } as DialogResolvePayload<TPayload>)\r\n } else {\r\n resolve({ action: 'confirm', data: payload } as DialogResolvePayload<TPayload>)\r\n }\r\n } else {\r\n isSettled = true\r\n // 通知调用方最终动作。\r\n options.onAction?.(action)\r\n reject({ action: toDialogRejectAction(action) })\r\n }\r\n\r\n cleanup()\r\n } catch (error) {\r\n // payloadResolver 异常走 reject(error),便于业务定位错误原因。\r\n isSettled = true\r\n cleanup()\r\n reject(error)\r\n } finally {\r\n isSettling = false\r\n }\r\n }\r\n\r\n /**\r\n * 尝试关闭弹窗。\r\n * force=true 时跳过 beforeClose(用于 closeAll 强制关闭)。\r\n */\r\n const requestClose = async (action: DialogAction, force = false) => {\r\n if (isSettled) {\r\n return\r\n }\r\n\r\n if (!force) {\r\n const canClose = await resolveBeforeClose(options.beforeClose, action)\r\n if (!canClose) {\r\n // cancel/confirm 来自 footer 点击,FlDialog 仍会触发 modelValue=false。\r\n // 为避免在拦截后被 onUpdate:modelValue 二次关闭,这里标记跳过一次。\r\n skipNextModelUpdate = action === 'cancel' || action === 'confirm'\r\n return\r\n }\r\n }\r\n\r\n void settle(action)\r\n }\r\n\r\n // 内置取消按钮事件。\r\n const handleCancel = () => {\r\n pendingModelUpdateAction = 'cancel'\r\n void requestClose('cancel')\r\n }\r\n\r\n // 内置确认按钮事件。\r\n const handleConfirm = () => {\r\n pendingModelUpdateAction = 'confirm'\r\n void requestClose('confirm')\r\n }\r\n\r\n // 监听 FlDialog 的 modelValue 变化,用于识别 close/mask/esc 等关闭动作。\r\n const handleModelValueUpdate = (value: boolean) => {\r\n // 仅关心关闭场景(false)。\r\n if (value || isSettled) {\r\n return\r\n }\r\n\r\n // 跳过一次由拦截后的 footer 自动触发的 update。\r\n if (skipNextModelUpdate) {\r\n skipNextModelUpdate = false\r\n pendingModelUpdateAction = null\r\n return\r\n }\r\n\r\n // 优先使用 footer 记录的动作;否则按通用 close 处理。\r\n const action = pendingModelUpdateAction ?? 'close'\r\n pendingModelUpdateAction = null\r\n void requestClose(action)\r\n }\r\n\r\n // 注册当前活动实例,供后续 closeAll / open 覆盖调用。\r\n activeDialogInstance = {\r\n id: instanceId,\r\n close: (reason = 'closeAll') => {\r\n // 主动关闭时强制执行,不经过 beforeClose。\r\n void requestClose(reason, true)\r\n }\r\n }\r\n\r\n // 异步加载组件后渲染弹窗。\r\n void loadDialogComponent()\r\n .then((DialogComponent) => {\r\n // 若在组件加载完成前已 settle,则不再渲染。\r\n if (isSettled) {\r\n return\r\n }\r\n\r\n // 轻量 wrapper:仅负责桥接 service 状态到 FlDialog。\r\n const Wrapper = defineComponent({\r\n name: 'FlDialogServiceWrapper',\r\n setup() {\r\n // 过滤冲突 props。\r\n const safeDialogProps = sanitizeDialogProps(options.dialogProps)\r\n\r\n return () => {\r\n // 在 render 阶段解析 message,确保 VNode ref 拥有正确 owner context。\r\n const messageContent = resolveMessageContent(options.message)\r\n const injectedMessageContent = injectPayloadTargetRef(\r\n messageContent,\r\n payloadTargetRef\r\n )\r\n\r\n return h(\r\n DialogComponent,\r\n {\r\n ...safeDialogProps,\r\n modelValue: true,\r\n title: options.title,\r\n showClose: options.showClose ?? true,\r\n closeOnClickModal: options.closeOnClickModal ?? true,\r\n closeOnPressEscape: options.closeOnPressEscape ?? true,\r\n // service 场景默认不使用 teleport,便于可控挂载到 appendTo 容器。\r\n teleported: safeDialogProps.teleported ?? false,\r\n onCancel: handleCancel,\r\n onConfirm: handleConfirm,\r\n 'onUpdate:modelValue': handleModelValueUpdate\r\n },\r\n injectedMessageContent === undefined\r\n ? undefined\r\n : { default: () => [injectedMessageContent] }\r\n )\r\n }\r\n }\r\n })\r\n\r\n // 将 wrapper 渲染到动态容器。\r\n render(createVNode(Wrapper), container)\r\n })\r\n .catch((error) => {\r\n // 异步加载失败时走 reject,并清理资源。\r\n if (isSettled) {\r\n return\r\n }\r\n\r\n isSettled = true\r\n cleanup()\r\n reject(error)\r\n })\r\n })\r\n}\r\n\r\n/**\r\n * [06] 关闭当前活动实例(无实例时无副作用)。\r\n */\r\nconst closeAll: UseDialogService['closeAll'] = (reason = 'closeAll') => {\r\n activeDialogInstance?.close(reason)\r\n}\r\n\r\n/**\r\n * [01] useDialog 入口:返回调用式弹窗服务。\r\n */\r\nconst useDialog = (): UseDialogService => ({\r\n open,\r\n closeAll\r\n})\r\n\r\n// 同时导出函数与组合式入口,方便按需使用。\r\nexport { closeAll, open, useDialog }\r\n","import type { ExtractPublicPropTypes } from 'vue'\r\n\r\nexport const flButtonProps = {\r\n /**\r\n * 调试事件标签,在开启调试模式后会随 `debug-click` 一起抛出。\r\n */\r\n debugLabel: {\r\n type: String,\r\n default: ''\r\n },\r\n /**\r\n * 是否开启调试点击事件,开启后每次点击都会触发 `debug-click`。\r\n */\r\n debugMode: {\r\n type: Boolean,\r\n default: false\r\n }\r\n} as const\r\n\r\nexport interface FlButtonDebugPayload {\r\n /**\r\n * 用于标识当前按钮实例的业务标签。\r\n */\r\n label: string\r\n}\r\n\r\nexport const flButtonEmits = {\r\n /**\r\n * 开启调试模式后,在按钮点击时触发。\r\n */\r\n 'debug-click': (payload: FlButtonDebugPayload) => typeof payload.label === 'string'\r\n} as const\r\n\r\nexport type FlButtonProps = ExtractPublicPropTypes<typeof flButtonProps>\r\nexport type FlButtonEmits = typeof flButtonEmits\r\n\r\nexport type ButtonProps = FlButtonProps\r\nexport type ButtonEmits = FlButtonEmits\r\n","<template>\r\n <component :is=\"h(ElButton, { ...mergedAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ElButton } from 'element-plus'\r\nimport type { ComponentInstance } from 'vue'\r\nimport { h, useAttrs, useSlots } from 'vue'\r\nimport { useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport { flButtonEmits, flButtonProps } from './button'\r\n\r\ndefineOptions({\r\n name: 'FlButton',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flButtonProps)\r\nconst emit = defineEmits(flButtonEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\n\r\nconst _myExpose = {\r\n /**\r\n * 标记该暴露值来源于 FlButton,便于调试识别。\r\n */\r\n debugKind: 'button'\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: attrs as Record<string, unknown>,\r\n block: 'button',\r\n listenerName: 'onClick',\r\n onListener: () => {\r\n if (props.debugMode) {\r\n emit('debug-click', {\r\n label: props.debugLabel\r\n })\r\n }\r\n }\r\n})\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElButton> & typeof _myExpose)\r\n</script>\r\n","<template>\r\n <component :is=\"h(ElButton, { ...mergedAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ElButton } from 'element-plus'\r\nimport type { ComponentInstance } from 'vue'\r\nimport { h, useAttrs, useSlots } from 'vue'\r\nimport { useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport { flButtonEmits, flButtonProps } from './button'\r\n\r\ndefineOptions({\r\n name: 'FlButton',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flButtonProps)\r\nconst emit = defineEmits(flButtonEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\n\r\nconst _myExpose = {\r\n /**\r\n * 标记该暴露值来源于 FlButton,便于调试识别。\r\n */\r\n debugKind: 'button'\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: attrs as Record<string, unknown>,\r\n block: 'button',\r\n listenerName: 'onClick',\r\n onListener: () => {\r\n if (props.debugMode) {\r\n emit('debug-click', {\r\n label: props.debugLabel\r\n })\r\n }\r\n }\r\n})\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElButton> & typeof _myExpose)\r\n</script>\r\n","import Button from './src/button.vue'\r\nimport { withInstall } from '@falcon-ui/utils'\r\n\r\nexport const FlButton = withInstall(Button)\r\n\r\nexport default FlButton\r\n\r\nexport type { ButtonEmits, ButtonProps, FlButtonEmits, FlButtonProps } from './src/button'\r\n","import type { ExtractPublicPropTypes } from 'vue'\r\n\r\nexport const flDialogProps = {\r\n /**\r\n * 对话框主体区域固定高度,传入数字时按像素处理。\r\n */\r\n bodyHeight: {\r\n type: [Number, String] as [NumberConstructor, StringConstructor],\r\n default: undefined\r\n },\r\n /**\r\n * 是否禁用默认页脚中的取消按钮。\r\n */\r\n cancelDisabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 默认页脚取消按钮文案。\r\n */\r\n cancelText: {\r\n type: String,\r\n default: '取消'\r\n },\r\n /**\r\n * 是否禁用默认页脚中的确认按钮。\r\n */\r\n confirmDisabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 默认页脚确认按钮文案。\r\n */\r\n confirmText: {\r\n type: String,\r\n default: '确认'\r\n },\r\n /**\r\n * 通过 v-model 控制对话框显示状态。\r\n */\r\n modelValue: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否渲染默认页脚操作区。\r\n */\r\n showFooter: {\r\n type: Boolean,\r\n default: true\r\n }\r\n} as const\r\n\r\nexport const flDialogEmits = {\r\n /**\r\n * 点击默认取消动作时触发。\r\n */\r\n cancel: () => true,\r\n /**\r\n * 点击默认确认动作时触发。\r\n */\r\n confirm: () => true,\r\n /**\r\n * 对话框显示状态变更时触发。\r\n */\r\n 'update:modelValue': (value: boolean) => typeof value === 'boolean'\r\n} as const\r\n\r\nexport type FlDialogProps = ExtractPublicPropTypes<typeof flDialogProps>\r\nexport type FlDialogEmits = typeof flDialogEmits\r\n\r\nexport type DialogProps = FlDialogProps\r\nexport type DialogEmits = FlDialogEmits\r\n","<template>\r\n <component :is=\"ElDialog\" v-bind=\"mergedAttrs\" :ref=\"changeRef\">\r\n <template #header>\r\n <div :class=\"headerContentClass\">\r\n <div :class=\"headerTitleClass\">\r\n <slot v-if=\"slots.header\" name=\"header\" />\r\n <slot v-else-if=\"slots.title\" name=\"title\" />\r\n <template v-else>{{ resolvedTitle }}</template>\r\n </div>\r\n <div :class=\"headerActionsClass\">\r\n <span\r\n :class=\"headerActionIconClass\"\r\n aria-label=\"FullScreen\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n title=\"FullScreen\"\r\n @click=\"toggleFullscreen\"\r\n @keydown.enter.prevent=\"toggleFullscreen\"\r\n @keydown.space.prevent=\"toggleFullscreen\">\r\n <ElIcon>\r\n <FullScreen />\r\n </ElIcon>\r\n </span>\r\n <FlButton\r\n :icon=\"Close\"\r\n :class=\"headerActionIconClass\"\r\n aria-label=\"Close\"\r\n link\r\n title=\"Close\"\r\n type=\"primary\"\r\n @click=\"closeDialog\" />\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <div :class=\"bodyInnerClass\" :style=\"bodyStyle\">\r\n <slot />\r\n </div>\r\n\r\n <template v-if=\"slots.footer || props.showFooter\" #footer>\r\n <slot v-if=\"slots.footer\" name=\"footer\" />\r\n <div v-else :class=\"footerActionsClass\">\r\n <fl-button :disabled=\"props.cancelDisabled\" @click=\"handleCancel\">\r\n {{ props.cancelText }}\r\n </fl-button>\r\n <fl-button :disabled=\"props.confirmDisabled\" type=\"primary\" @click=\"handleConfirm\">\r\n {{ props.confirmText }}\r\n </fl-button>\r\n </div>\r\n </template>\r\n </component>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { Close, FullScreen } from '@element-plus/icons-vue'\r\nimport { ElDialog, ElIcon } from 'element-plus'\r\nimport type { ComponentInstance, CSSProperties } from 'vue'\r\nimport { computed, ref, useAttrs, useSlots } from 'vue'\r\nimport { useMergedExpose } from '@falcon-ui/hooks'\r\nimport { invokeListener, useNamespace } from '@falcon-ui/utils'\r\nimport { FlButton } from '../../button'\r\nimport { flDialogEmits, flDialogProps } from './dialog'\r\n\r\ndefineOptions({\r\n name: 'FlDialog',\r\n inheritAttrs: false\r\n})\r\n\r\ntype ClassValue = string | Record<string, boolean> | ClassValue[] | null | undefined\r\n\r\nconst omitAttrKeys = new Set([\r\n 'align-center',\r\n 'alignCenter',\r\n 'body-class',\r\n 'bodyClass',\r\n 'class',\r\n 'destroy-on-close',\r\n 'destroyOnClose',\r\n 'draggable',\r\n 'footer-class',\r\n 'footerClass',\r\n 'fullscreen',\r\n 'header-class',\r\n 'headerClass',\r\n 'show-close',\r\n 'showClose',\r\n 'transition'\r\n])\r\n\r\nconst props = defineProps(flDialogProps)\r\nconst emit = defineEmits(flDialogEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst ns = useNamespace('dialog')\r\nconst isFullscreen = ref(false)\r\n\r\nconst normalizeClassName = (value: ClassValue): string => {\r\n if (!value) {\r\n return ''\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return value\r\n .split(' ')\r\n .map((item) => item.trim())\r\n .filter(Boolean)\r\n .join(' ')\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value\r\n .map((item) => normalizeClassName(item))\r\n .filter(Boolean)\r\n .join(' ')\r\n .trim()\r\n }\r\n\r\n return Object.entries(value)\r\n .filter(([, enabled]) => enabled)\r\n .map(([className]) => className)\r\n .join(' ')\r\n}\r\n\r\nconst mergeClassName = (...values: ClassValue[]): string =>\r\n values\r\n .map((item) => normalizeClassName(item))\r\n .filter(Boolean)\r\n .join(' ')\r\n .trim()\r\n\r\nconst getAttrValue = (kebabCaseName: string, camelCaseName = kebabCaseName): unknown =>\r\n attrs[kebabCaseName] ?? attrs[camelCaseName]\r\n\r\nconst resolveBooleanAttr = (value: unknown, fallback: boolean): boolean => {\r\n if (value === undefined) {\r\n return fallback\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (!value) {\r\n return true\r\n }\r\n\r\n return value !== 'false'\r\n }\r\n\r\n return Boolean(value)\r\n}\r\n\r\n/**\r\n * 通过同步 `modelValue=false` 关闭当前对话框。\r\n */\r\nconst closeDialog = () => {\r\n emit('update:modelValue', false)\r\n}\r\n\r\n/**\r\n * 切换当前对话框的全屏状态。\r\n */\r\nconst toggleFullscreen = () => {\r\n isFullscreen.value = !isFullscreen.value\r\n}\r\n\r\nconst handleCancel = () => {\r\n emit('cancel')\r\n closeDialog()\r\n}\r\n\r\nconst handleConfirm = () => {\r\n emit('confirm')\r\n closeDialog()\r\n}\r\n\r\nconst handleModelValueUpdate = (value: boolean) => {\r\n emit('update:modelValue', value)\r\n invokeListener(attrs['onUpdate:modelValue'], value)\r\n}\r\n\r\nconst mergedClass = computed(() => mergeClassName(ns.b(), attrs.class as ClassValue))\r\nconst mergedHeaderClass = computed(() =>\r\n mergeClassName(ns.e('header'), getAttrValue('header-class', 'headerClass') as ClassValue)\r\n)\r\nconst mergedBodyClass = computed(() =>\r\n mergeClassName(ns.e('body'), getAttrValue('body-class', 'bodyClass') as ClassValue)\r\n)\r\nconst mergedFooterClass = computed(() =>\r\n mergeClassName(ns.e('footer'), getAttrValue('footer-class', 'footerClass') as ClassValue)\r\n)\r\n\r\nconst bodyStyle = computed<CSSProperties | undefined>(() => {\r\n if (isFullscreen.value) {\r\n return undefined\r\n }\r\n\r\n if (props.bodyHeight === undefined || props.bodyHeight === null || props.bodyHeight === '') {\r\n return undefined\r\n }\r\n\r\n const height = typeof props.bodyHeight === 'number' ? `${props.bodyHeight}px` : props.bodyHeight\r\n return {\r\n height,\r\n overflowY: 'auto'\r\n }\r\n})\r\n\r\nconst resolvedTitle = computed(() => {\r\n const title = attrs.title\r\n return typeof title === 'string' ? title : ''\r\n})\r\n\r\nconst resolvedAlignCenter = computed(() =>\r\n resolveBooleanAttr(getAttrValue('align-center', 'alignCenter'), true)\r\n)\r\nconst resolvedDestroyOnClose = computed(() =>\r\n resolveBooleanAttr(getAttrValue('destroy-on-close', 'destroyOnClose'), true)\r\n)\r\nconst resolvedDraggable = computed(() => resolveBooleanAttr(getAttrValue('draggable'), true))\r\nconst resolvedShowClose = computed(() =>\r\n resolveBooleanAttr(getAttrValue('show-close', 'showClose'), false)\r\n)\r\nconst resolvedTransition = computed(() => {\r\n const transition = getAttrValue('transition')\r\n return typeof transition === 'string' && transition ? transition : 'fl-dialog-bounce'\r\n})\r\n\r\nconst forwardedAttrs = computed(() => {\r\n const next: Record<string, unknown> = {}\r\n\r\n for (const [key, value] of Object.entries(attrs)) {\r\n if (!omitAttrKeys.has(key)) {\r\n next[key] = value\r\n }\r\n }\r\n\r\n return next\r\n})\r\n\r\nconst mergedAttrs = computed(() => ({\r\n ...forwardedAttrs.value,\r\n alignCenter: resolvedAlignCenter.value,\r\n bodyClass: mergedBodyClass.value,\r\n class: mergedClass.value,\r\n destroyOnClose: resolvedDestroyOnClose.value,\r\n draggable: resolvedDraggable.value,\r\n footerClass: mergedFooterClass.value,\r\n fullscreen: isFullscreen.value,\r\n headerClass: mergedHeaderClass.value,\r\n modelValue: props.modelValue,\r\n showClose: resolvedShowClose.value,\r\n transition: resolvedTransition.value,\r\n 'onUpdate:modelValue': handleModelValueUpdate\r\n}))\r\n\r\nconst headerContentClass = ns.e('header-content')\r\nconst headerTitleClass = ns.e('header-title')\r\nconst headerActionsClass = ns.e('header-actions')\r\nconst headerActionIconClass = ns.e('header-action-icon')\r\nconst bodyInnerClass = ns.e('body-inner')\r\nconst footerActionsClass = ns.e('footer-actions')\r\n\r\nconst _myExpose = {\r\n /**\r\n * 以编程方式关闭当前对话框。\r\n */\r\n closeDialog,\r\n /**\r\n * 以编程方式切换对话框全屏模式。\r\n */\r\n toggleFullscreen\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElDialog> & typeof _myExpose)\r\n</script>\r\n","<template>\r\n <component :is=\"ElDialog\" v-bind=\"mergedAttrs\" :ref=\"changeRef\">\r\n <template #header>\r\n <div :class=\"headerContentClass\">\r\n <div :class=\"headerTitleClass\">\r\n <slot v-if=\"slots.header\" name=\"header\" />\r\n <slot v-else-if=\"slots.title\" name=\"title\" />\r\n <template v-else>{{ resolvedTitle }}</template>\r\n </div>\r\n <div :class=\"headerActionsClass\">\r\n <span\r\n :class=\"headerActionIconClass\"\r\n aria-label=\"FullScreen\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n title=\"FullScreen\"\r\n @click=\"toggleFullscreen\"\r\n @keydown.enter.prevent=\"toggleFullscreen\"\r\n @keydown.space.prevent=\"toggleFullscreen\">\r\n <ElIcon>\r\n <FullScreen />\r\n </ElIcon>\r\n </span>\r\n <FlButton\r\n :icon=\"Close\"\r\n :class=\"headerActionIconClass\"\r\n aria-label=\"Close\"\r\n link\r\n title=\"Close\"\r\n type=\"primary\"\r\n @click=\"closeDialog\" />\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <div :class=\"bodyInnerClass\" :style=\"bodyStyle\">\r\n <slot />\r\n </div>\r\n\r\n <template v-if=\"slots.footer || props.showFooter\" #footer>\r\n <slot v-if=\"slots.footer\" name=\"footer\" />\r\n <div v-else :class=\"footerActionsClass\">\r\n <fl-button :disabled=\"props.cancelDisabled\" @click=\"handleCancel\">\r\n {{ props.cancelText }}\r\n </fl-button>\r\n <fl-button :disabled=\"props.confirmDisabled\" type=\"primary\" @click=\"handleConfirm\">\r\n {{ props.confirmText }}\r\n </fl-button>\r\n </div>\r\n </template>\r\n </component>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { Close, FullScreen } from '@element-plus/icons-vue'\r\nimport { ElDialog, ElIcon } from 'element-plus'\r\nimport type { ComponentInstance, CSSProperties } from 'vue'\r\nimport { computed, ref, useAttrs, useSlots } from 'vue'\r\nimport { useMergedExpose } from '@falcon-ui/hooks'\r\nimport { invokeListener, useNamespace } from '@falcon-ui/utils'\r\nimport { FlButton } from '../../button'\r\nimport { flDialogEmits, flDialogProps } from './dialog'\r\n\r\ndefineOptions({\r\n name: 'FlDialog',\r\n inheritAttrs: false\r\n})\r\n\r\ntype ClassValue = string | Record<string, boolean> | ClassValue[] | null | undefined\r\n\r\nconst omitAttrKeys = new Set([\r\n 'align-center',\r\n 'alignCenter',\r\n 'body-class',\r\n 'bodyClass',\r\n 'class',\r\n 'destroy-on-close',\r\n 'destroyOnClose',\r\n 'draggable',\r\n 'footer-class',\r\n 'footerClass',\r\n 'fullscreen',\r\n 'header-class',\r\n 'headerClass',\r\n 'show-close',\r\n 'showClose',\r\n 'transition'\r\n])\r\n\r\nconst props = defineProps(flDialogProps)\r\nconst emit = defineEmits(flDialogEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst ns = useNamespace('dialog')\r\nconst isFullscreen = ref(false)\r\n\r\nconst normalizeClassName = (value: ClassValue): string => {\r\n if (!value) {\r\n return ''\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return value\r\n .split(' ')\r\n .map((item) => item.trim())\r\n .filter(Boolean)\r\n .join(' ')\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value\r\n .map((item) => normalizeClassName(item))\r\n .filter(Boolean)\r\n .join(' ')\r\n .trim()\r\n }\r\n\r\n return Object.entries(value)\r\n .filter(([, enabled]) => enabled)\r\n .map(([className]) => className)\r\n .join(' ')\r\n}\r\n\r\nconst mergeClassName = (...values: ClassValue[]): string =>\r\n values\r\n .map((item) => normalizeClassName(item))\r\n .filter(Boolean)\r\n .join(' ')\r\n .trim()\r\n\r\nconst getAttrValue = (kebabCaseName: string, camelCaseName = kebabCaseName): unknown =>\r\n attrs[kebabCaseName] ?? attrs[camelCaseName]\r\n\r\nconst resolveBooleanAttr = (value: unknown, fallback: boolean): boolean => {\r\n if (value === undefined) {\r\n return fallback\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (!value) {\r\n return true\r\n }\r\n\r\n return value !== 'false'\r\n }\r\n\r\n return Boolean(value)\r\n}\r\n\r\n/**\r\n * 通过同步 `modelValue=false` 关闭当前对话框。\r\n */\r\nconst closeDialog = () => {\r\n emit('update:modelValue', false)\r\n}\r\n\r\n/**\r\n * 切换当前对话框的全屏状态。\r\n */\r\nconst toggleFullscreen = () => {\r\n isFullscreen.value = !isFullscreen.value\r\n}\r\n\r\nconst handleCancel = () => {\r\n emit('cancel')\r\n closeDialog()\r\n}\r\n\r\nconst handleConfirm = () => {\r\n emit('confirm')\r\n closeDialog()\r\n}\r\n\r\nconst handleModelValueUpdate = (value: boolean) => {\r\n emit('update:modelValue', value)\r\n invokeListener(attrs['onUpdate:modelValue'], value)\r\n}\r\n\r\nconst mergedClass = computed(() => mergeClassName(ns.b(), attrs.class as ClassValue))\r\nconst mergedHeaderClass = computed(() =>\r\n mergeClassName(ns.e('header'), getAttrValue('header-class', 'headerClass') as ClassValue)\r\n)\r\nconst mergedBodyClass = computed(() =>\r\n mergeClassName(ns.e('body'), getAttrValue('body-class', 'bodyClass') as ClassValue)\r\n)\r\nconst mergedFooterClass = computed(() =>\r\n mergeClassName(ns.e('footer'), getAttrValue('footer-class', 'footerClass') as ClassValue)\r\n)\r\n\r\nconst bodyStyle = computed<CSSProperties | undefined>(() => {\r\n if (isFullscreen.value) {\r\n return undefined\r\n }\r\n\r\n if (props.bodyHeight === undefined || props.bodyHeight === null || props.bodyHeight === '') {\r\n return undefined\r\n }\r\n\r\n const height = typeof props.bodyHeight === 'number' ? `${props.bodyHeight}px` : props.bodyHeight\r\n return {\r\n height,\r\n overflowY: 'auto'\r\n }\r\n})\r\n\r\nconst resolvedTitle = computed(() => {\r\n const title = attrs.title\r\n return typeof title === 'string' ? title : ''\r\n})\r\n\r\nconst resolvedAlignCenter = computed(() =>\r\n resolveBooleanAttr(getAttrValue('align-center', 'alignCenter'), true)\r\n)\r\nconst resolvedDestroyOnClose = computed(() =>\r\n resolveBooleanAttr(getAttrValue('destroy-on-close', 'destroyOnClose'), true)\r\n)\r\nconst resolvedDraggable = computed(() => resolveBooleanAttr(getAttrValue('draggable'), true))\r\nconst resolvedShowClose = computed(() =>\r\n resolveBooleanAttr(getAttrValue('show-close', 'showClose'), false)\r\n)\r\nconst resolvedTransition = computed(() => {\r\n const transition = getAttrValue('transition')\r\n return typeof transition === 'string' && transition ? transition : 'fl-dialog-bounce'\r\n})\r\n\r\nconst forwardedAttrs = computed(() => {\r\n const next: Record<string, unknown> = {}\r\n\r\n for (const [key, value] of Object.entries(attrs)) {\r\n if (!omitAttrKeys.has(key)) {\r\n next[key] = value\r\n }\r\n }\r\n\r\n return next\r\n})\r\n\r\nconst mergedAttrs = computed(() => ({\r\n ...forwardedAttrs.value,\r\n alignCenter: resolvedAlignCenter.value,\r\n bodyClass: mergedBodyClass.value,\r\n class: mergedClass.value,\r\n destroyOnClose: resolvedDestroyOnClose.value,\r\n draggable: resolvedDraggable.value,\r\n footerClass: mergedFooterClass.value,\r\n fullscreen: isFullscreen.value,\r\n headerClass: mergedHeaderClass.value,\r\n modelValue: props.modelValue,\r\n showClose: resolvedShowClose.value,\r\n transition: resolvedTransition.value,\r\n 'onUpdate:modelValue': handleModelValueUpdate\r\n}))\r\n\r\nconst headerContentClass = ns.e('header-content')\r\nconst headerTitleClass = ns.e('header-title')\r\nconst headerActionsClass = ns.e('header-actions')\r\nconst headerActionIconClass = ns.e('header-action-icon')\r\nconst bodyInnerClass = ns.e('body-inner')\r\nconst footerActionsClass = ns.e('footer-actions')\r\n\r\nconst _myExpose = {\r\n /**\r\n * 以编程方式关闭当前对话框。\r\n */\r\n closeDialog,\r\n /**\r\n * 以编程方式切换对话框全屏模式。\r\n */\r\n toggleFullscreen\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElDialog> & typeof _myExpose)\r\n</script>\r\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const require_dialog = require("./dialog-CJU00aEV.cjs");
2
+ exports.default = require_dialog.dialog_default;
@@ -0,0 +1,266 @@
1
+ const require_hooks = require("./hooks-D2Jaq5kO.cjs");
2
+ let vue = require("vue");
3
+ let __element_plus_icons_vue = require("@element-plus/icons-vue");
4
+ let element_plus = require("element-plus");
5
+ const withInstall = (component) => {
6
+ const installable = component;
7
+ installable.install = (app) => {
8
+ if (!component.name) return;
9
+ app.component(component.name, component);
10
+ };
11
+ return installable;
12
+ };
13
+ const flButtonProps = {
14
+ debugLabel: {
15
+ type: String,
16
+ default: ""
17
+ },
18
+ debugMode: {
19
+ type: Boolean,
20
+ default: false
21
+ }
22
+ };
23
+ const flButtonEmits = { "debug-click": (payload) => typeof payload.label === "string" };
24
+ var button_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ (0, vue.defineComponent)({
25
+ name: "FlButton",
26
+ inheritAttrs: false,
27
+ __name: "button",
28
+ props: flButtonProps,
29
+ emits: flButtonEmits,
30
+ setup(__props, { expose: __expose, emit: __emit }) {
31
+ const props = __props;
32
+ const emit = __emit;
33
+ const attrs = (0, vue.useAttrs)();
34
+ const slots = (0, vue.useSlots)();
35
+ const { changeRef } = require_hooks.useMergedExpose({ debugKind: "button" });
36
+ const { mergedAttrs } = require_hooks.useMergedAttrs({
37
+ attrs,
38
+ block: "button",
39
+ listenerName: "onClick",
40
+ onListener: () => {
41
+ if (props.debugMode) emit("debug-click", { label: props.debugLabel });
42
+ }
43
+ });
44
+ __expose({});
45
+ return (_ctx, _cache) => {
46
+ return (0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)((0, vue.h)((0, vue.unref)(element_plus.ElButton), {
47
+ ...(0, vue.unref)(mergedAttrs),
48
+ ref: (0, vue.unref)(changeRef)
49
+ }, (0, vue.unref)(slots))));
50
+ };
51
+ }
52
+ });
53
+ var button_default = button_vue_vue_type_script_setup_true_lang_default;
54
+ const FlButton = withInstall(button_default);
55
+ const flDialogProps = {
56
+ bodyHeight: {
57
+ type: [Number, String],
58
+ default: void 0
59
+ },
60
+ cancelDisabled: {
61
+ type: Boolean,
62
+ default: false
63
+ },
64
+ cancelText: {
65
+ type: String,
66
+ default: "取消"
67
+ },
68
+ confirmDisabled: {
69
+ type: Boolean,
70
+ default: false
71
+ },
72
+ confirmText: {
73
+ type: String,
74
+ default: "确认"
75
+ },
76
+ modelValue: {
77
+ type: Boolean,
78
+ default: false
79
+ },
80
+ showFooter: {
81
+ type: Boolean,
82
+ default: true
83
+ }
84
+ };
85
+ const flDialogEmits = {
86
+ cancel: () => true,
87
+ confirm: () => true,
88
+ "update:modelValue": (value) => typeof value === "boolean"
89
+ };
90
+ var _hoisted_1 = ["onKeydown"];
91
+ var dialog_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ (0, vue.defineComponent)({
92
+ name: "FlDialog",
93
+ inheritAttrs: false,
94
+ __name: "dialog",
95
+ props: flDialogProps,
96
+ emits: flDialogEmits,
97
+ setup(__props, { expose: __expose, emit: __emit }) {
98
+ const omitAttrKeys = new Set([
99
+ "align-center",
100
+ "alignCenter",
101
+ "body-class",
102
+ "bodyClass",
103
+ "class",
104
+ "destroy-on-close",
105
+ "destroyOnClose",
106
+ "draggable",
107
+ "footer-class",
108
+ "footerClass",
109
+ "fullscreen",
110
+ "header-class",
111
+ "headerClass",
112
+ "show-close",
113
+ "showClose",
114
+ "transition"
115
+ ]);
116
+ const props = __props;
117
+ const emit = __emit;
118
+ const attrs = (0, vue.useAttrs)();
119
+ const slots = (0, vue.useSlots)();
120
+ const ns = require_hooks.useNamespace("dialog");
121
+ const isFullscreen = (0, vue.ref)(false);
122
+ const normalizeClassName = (value) => {
123
+ if (!value) return "";
124
+ if (typeof value === "string") return value.split(" ").map((item) => item.trim()).filter(Boolean).join(" ");
125
+ if (Array.isArray(value)) return value.map((item) => normalizeClassName(item)).filter(Boolean).join(" ").trim();
126
+ return Object.entries(value).filter(([, enabled]) => enabled).map(([className]) => className).join(" ");
127
+ };
128
+ const mergeClassName = (...values) => values.map((item) => normalizeClassName(item)).filter(Boolean).join(" ").trim();
129
+ const getAttrValue = (kebabCaseName, camelCaseName = kebabCaseName) => attrs[kebabCaseName] ?? attrs[camelCaseName];
130
+ const resolveBooleanAttr = (value, fallback) => {
131
+ if (value === void 0) return fallback;
132
+ if (typeof value === "boolean") return value;
133
+ if (typeof value === "string") {
134
+ if (!value) return true;
135
+ return value !== "false";
136
+ }
137
+ return Boolean(value);
138
+ };
139
+ const closeDialog = () => {
140
+ emit("update:modelValue", false);
141
+ };
142
+ const toggleFullscreen = () => {
143
+ isFullscreen.value = !isFullscreen.value;
144
+ };
145
+ const handleCancel = () => {
146
+ emit("cancel");
147
+ closeDialog();
148
+ };
149
+ const handleConfirm = () => {
150
+ emit("confirm");
151
+ closeDialog();
152
+ };
153
+ const handleModelValueUpdate = (value) => {
154
+ emit("update:modelValue", value);
155
+ require_hooks.invokeListener(attrs["onUpdate:modelValue"], value);
156
+ };
157
+ const mergedClass = (0, vue.computed)(() => mergeClassName(ns.b(), attrs.class));
158
+ const mergedHeaderClass = (0, vue.computed)(() => mergeClassName(ns.e("header"), getAttrValue("header-class", "headerClass")));
159
+ const mergedBodyClass = (0, vue.computed)(() => mergeClassName(ns.e("body"), getAttrValue("body-class", "bodyClass")));
160
+ const mergedFooterClass = (0, vue.computed)(() => mergeClassName(ns.e("footer"), getAttrValue("footer-class", "footerClass")));
161
+ const bodyStyle = (0, vue.computed)(() => {
162
+ if (isFullscreen.value) return;
163
+ if (props.bodyHeight === void 0 || props.bodyHeight === null || props.bodyHeight === "") return;
164
+ return {
165
+ height: typeof props.bodyHeight === "number" ? `${props.bodyHeight}px` : props.bodyHeight,
166
+ overflowY: "auto"
167
+ };
168
+ });
169
+ const resolvedTitle = (0, vue.computed)(() => {
170
+ const title = attrs.title;
171
+ return typeof title === "string" ? title : "";
172
+ });
173
+ const resolvedAlignCenter = (0, vue.computed)(() => resolveBooleanAttr(getAttrValue("align-center", "alignCenter"), true));
174
+ const resolvedDestroyOnClose = (0, vue.computed)(() => resolveBooleanAttr(getAttrValue("destroy-on-close", "destroyOnClose"), true));
175
+ const resolvedDraggable = (0, vue.computed)(() => resolveBooleanAttr(getAttrValue("draggable"), true));
176
+ const resolvedShowClose = (0, vue.computed)(() => resolveBooleanAttr(getAttrValue("show-close", "showClose"), false));
177
+ const resolvedTransition = (0, vue.computed)(() => {
178
+ const transition = getAttrValue("transition");
179
+ return typeof transition === "string" && transition ? transition : "fl-dialog-bounce";
180
+ });
181
+ const forwardedAttrs = (0, vue.computed)(() => {
182
+ const next = {};
183
+ for (const [key, value] of Object.entries(attrs)) if (!omitAttrKeys.has(key)) next[key] = value;
184
+ return next;
185
+ });
186
+ const mergedAttrs = (0, vue.computed)(() => ({
187
+ ...forwardedAttrs.value,
188
+ alignCenter: resolvedAlignCenter.value,
189
+ bodyClass: mergedBodyClass.value,
190
+ class: mergedClass.value,
191
+ destroyOnClose: resolvedDestroyOnClose.value,
192
+ draggable: resolvedDraggable.value,
193
+ footerClass: mergedFooterClass.value,
194
+ fullscreen: isFullscreen.value,
195
+ headerClass: mergedHeaderClass.value,
196
+ modelValue: props.modelValue,
197
+ showClose: resolvedShowClose.value,
198
+ transition: resolvedTransition.value,
199
+ "onUpdate:modelValue": handleModelValueUpdate
200
+ }));
201
+ const headerContentClass = ns.e("header-content");
202
+ const headerTitleClass = ns.e("header-title");
203
+ const headerActionsClass = ns.e("header-actions");
204
+ const headerActionIconClass = ns.e("header-action-icon");
205
+ const bodyInnerClass = ns.e("body-inner");
206
+ const footerActionsClass = ns.e("footer-actions");
207
+ const { changeRef } = require_hooks.useMergedExpose({
208
+ closeDialog,
209
+ toggleFullscreen
210
+ });
211
+ __expose({});
212
+ return (_ctx, _cache) => {
213
+ return (0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)((0, vue.unref)(element_plus.ElDialog)), (0, vue.mergeProps)(mergedAttrs.value, { ref: (0, vue.unref)(changeRef) }), (0, vue.createSlots)({
214
+ header: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("div", { class: (0, vue.normalizeClass)((0, vue.unref)(headerContentClass)) }, [(0, vue.createElementVNode)("div", { class: (0, vue.normalizeClass)((0, vue.unref)(headerTitleClass)) }, [(0, vue.unref)(slots).header ? (0, vue.renderSlot)(_ctx.$slots, "header", { key: 0 }) : (0, vue.unref)(slots).title ? (0, vue.renderSlot)(_ctx.$slots, "title", { key: 1 }) : ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 2 }, [(0, vue.createTextVNode)((0, vue.toDisplayString)(resolvedTitle.value), 1)], 64))], 2), (0, vue.createElementVNode)("div", { class: (0, vue.normalizeClass)((0, vue.unref)(headerActionsClass)) }, [(0, vue.createElementVNode)("span", {
215
+ class: (0, vue.normalizeClass)((0, vue.unref)(headerActionIconClass)),
216
+ "aria-label": "FullScreen",
217
+ role: "button",
218
+ tabindex: "0",
219
+ title: "FullScreen",
220
+ onClick: toggleFullscreen,
221
+ onKeydown: [(0, vue.withKeys)((0, vue.withModifiers)(toggleFullscreen, ["prevent"]), ["enter"]), (0, vue.withKeys)((0, vue.withModifiers)(toggleFullscreen, ["prevent"]), ["space"])]
222
+ }, [(0, vue.createVNode)((0, vue.unref)(element_plus.ElIcon), null, {
223
+ default: (0, vue.withCtx)(() => [(0, vue.createVNode)((0, vue.unref)(__element_plus_icons_vue.FullScreen))]),
224
+ _: 1
225
+ })], 42, _hoisted_1), (0, vue.createVNode)((0, vue.unref)(FlButton), {
226
+ icon: (0, vue.unref)(__element_plus_icons_vue.Close),
227
+ class: (0, vue.normalizeClass)((0, vue.unref)(headerActionIconClass)),
228
+ "aria-label": "Close",
229
+ link: "",
230
+ title: "Close",
231
+ type: "primary",
232
+ onClick: closeDialog
233
+ }, null, 8, ["icon", "class"])], 2)], 2)]),
234
+ default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("div", {
235
+ class: (0, vue.normalizeClass)((0, vue.unref)(bodyInnerClass)),
236
+ style: (0, vue.normalizeStyle)(bodyStyle.value)
237
+ }, [(0, vue.renderSlot)(_ctx.$slots, "default")], 6)]),
238
+ _: 2
239
+ }, [(0, vue.unref)(slots).footer || props.showFooter ? {
240
+ name: "footer",
241
+ fn: (0, vue.withCtx)(() => [(0, vue.unref)(slots).footer ? (0, vue.renderSlot)(_ctx.$slots, "footer", { key: 0 }) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
242
+ key: 1,
243
+ class: (0, vue.normalizeClass)((0, vue.unref)(footerActionsClass))
244
+ }, [(0, vue.createVNode)((0, vue.unref)(FlButton), {
245
+ disabled: props.cancelDisabled,
246
+ onClick: handleCancel
247
+ }, {
248
+ default: (0, vue.withCtx)(() => [(0, vue.createTextVNode)((0, vue.toDisplayString)(props.cancelText), 1)]),
249
+ _: 1
250
+ }, 8, ["disabled"]), (0, vue.createVNode)((0, vue.unref)(FlButton), {
251
+ disabled: props.confirmDisabled,
252
+ type: "primary",
253
+ onClick: handleConfirm
254
+ }, {
255
+ default: (0, vue.withCtx)(() => [(0, vue.createTextVNode)((0, vue.toDisplayString)(props.confirmText), 1)]),
256
+ _: 1
257
+ }, 8, ["disabled"])], 2))]),
258
+ key: "0"
259
+ } : void 0]), 1040);
260
+ };
261
+ }
262
+ });
263
+ var dialog_default = dialog_vue_vue_type_script_setup_true_lang_default;
264
+ exports.default = dialog_default;
265
+
266
+ //# sourceMappingURL=dialog-DpYPBcKV.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog-DpYPBcKV.cjs","names":[],"sources":["../../../../packages/utils/src/install.ts","../../../../packages/components/button/src/button.ts","../../../../packages/components/button/src/button.vue","../../../../packages/components/button/src/button.vue","../../../../packages/components/button/index.ts","../../../../packages/components/dialog/src/dialog.ts","../../../../packages/components/dialog/src/dialog.vue","../../../../packages/components/dialog/src/dialog.vue"],"sourcesContent":["import type { App, Plugin } from 'vue'\r\n\r\nexport type SFCWithInstall<T> = T & Plugin\r\n\r\nexport const withInstall = <T extends { name?: string }>(component: T): SFCWithInstall<T> => {\r\n const installable = component as SFCWithInstall<T>\r\n\r\n installable.install = (app: App) => {\r\n if (!component.name) {\r\n return\r\n }\r\n\r\n app.component(component.name, component as unknown as object)\r\n }\r\n\r\n return installable\r\n}\r\n","import type { ExtractPublicPropTypes } from 'vue'\r\n\r\nexport const flButtonProps = {\r\n /**\r\n * 调试事件标签,在开启调试模式后会随 `debug-click` 一起抛出。\r\n */\r\n debugLabel: {\r\n type: String,\r\n default: ''\r\n },\r\n /**\r\n * 是否开启调试点击事件,开启后每次点击都会触发 `debug-click`。\r\n */\r\n debugMode: {\r\n type: Boolean,\r\n default: false\r\n }\r\n} as const\r\n\r\nexport interface FlButtonDebugPayload {\r\n /**\r\n * 用于标识当前按钮实例的业务标签。\r\n */\r\n label: string\r\n}\r\n\r\nexport const flButtonEmits = {\r\n /**\r\n * 开启调试模式后,在按钮点击时触发。\r\n */\r\n 'debug-click': (payload: FlButtonDebugPayload) => typeof payload.label === 'string'\r\n} as const\r\n\r\nexport type FlButtonProps = ExtractPublicPropTypes<typeof flButtonProps>\r\nexport type FlButtonEmits = typeof flButtonEmits\r\n\r\nexport type ButtonProps = FlButtonProps\r\nexport type ButtonEmits = FlButtonEmits\r\n","<template>\r\n <component :is=\"h(ElButton, { ...mergedAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ElButton } from 'element-plus'\r\nimport type { ComponentInstance } from 'vue'\r\nimport { h, useAttrs, useSlots } from 'vue'\r\nimport { useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport { flButtonEmits, flButtonProps } from './button'\r\n\r\ndefineOptions({\r\n name: 'FlButton',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flButtonProps)\r\nconst emit = defineEmits(flButtonEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\n\r\nconst _myExpose = {\r\n /**\r\n * 标记该暴露值来源于 FlButton,便于调试识别。\r\n */\r\n debugKind: 'button'\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: attrs as Record<string, unknown>,\r\n block: 'button',\r\n listenerName: 'onClick',\r\n onListener: () => {\r\n if (props.debugMode) {\r\n emit('debug-click', {\r\n label: props.debugLabel\r\n })\r\n }\r\n }\r\n})\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElButton> & typeof _myExpose)\r\n</script>\r\n","<template>\r\n <component :is=\"h(ElButton, { ...mergedAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ElButton } from 'element-plus'\r\nimport type { ComponentInstance } from 'vue'\r\nimport { h, useAttrs, useSlots } from 'vue'\r\nimport { useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport { flButtonEmits, flButtonProps } from './button'\r\n\r\ndefineOptions({\r\n name: 'FlButton',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flButtonProps)\r\nconst emit = defineEmits(flButtonEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\n\r\nconst _myExpose = {\r\n /**\r\n * 标记该暴露值来源于 FlButton,便于调试识别。\r\n */\r\n debugKind: 'button'\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: attrs as Record<string, unknown>,\r\n block: 'button',\r\n listenerName: 'onClick',\r\n onListener: () => {\r\n if (props.debugMode) {\r\n emit('debug-click', {\r\n label: props.debugLabel\r\n })\r\n }\r\n }\r\n})\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElButton> & typeof _myExpose)\r\n</script>\r\n","import Button from './src/button.vue'\r\nimport { withInstall } from '@falcon-ui/utils'\r\n\r\nexport const FlButton = withInstall(Button)\r\n\r\nexport default FlButton\r\n\r\nexport type { ButtonEmits, ButtonProps, FlButtonEmits, FlButtonProps } from './src/button'\r\n","import type { ExtractPublicPropTypes } from 'vue'\r\n\r\nexport const flDialogProps = {\r\n /**\r\n * 对话框主体区域固定高度,传入数字时按像素处理。\r\n */\r\n bodyHeight: {\r\n type: [Number, String] as [NumberConstructor, StringConstructor],\r\n default: undefined\r\n },\r\n /**\r\n * 是否禁用默认页脚中的取消按钮。\r\n */\r\n cancelDisabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 默认页脚取消按钮文案。\r\n */\r\n cancelText: {\r\n type: String,\r\n default: '取消'\r\n },\r\n /**\r\n * 是否禁用默认页脚中的确认按钮。\r\n */\r\n confirmDisabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 默认页脚确认按钮文案。\r\n */\r\n confirmText: {\r\n type: String,\r\n default: '确认'\r\n },\r\n /**\r\n * 通过 v-model 控制对话框显示状态。\r\n */\r\n modelValue: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否渲染默认页脚操作区。\r\n */\r\n showFooter: {\r\n type: Boolean,\r\n default: true\r\n }\r\n} as const\r\n\r\nexport const flDialogEmits = {\r\n /**\r\n * 点击默认取消动作时触发。\r\n */\r\n cancel: () => true,\r\n /**\r\n * 点击默认确认动作时触发。\r\n */\r\n confirm: () => true,\r\n /**\r\n * 对话框显示状态变更时触发。\r\n */\r\n 'update:modelValue': (value: boolean) => typeof value === 'boolean'\r\n} as const\r\n\r\nexport type FlDialogProps = ExtractPublicPropTypes<typeof flDialogProps>\r\nexport type FlDialogEmits = typeof flDialogEmits\r\n\r\nexport type DialogProps = FlDialogProps\r\nexport type DialogEmits = FlDialogEmits\r\n","<template>\r\n <component :is=\"ElDialog\" v-bind=\"mergedAttrs\" :ref=\"changeRef\">\r\n <template #header>\r\n <div :class=\"headerContentClass\">\r\n <div :class=\"headerTitleClass\">\r\n <slot v-if=\"slots.header\" name=\"header\" />\r\n <slot v-else-if=\"slots.title\" name=\"title\" />\r\n <template v-else>{{ resolvedTitle }}</template>\r\n </div>\r\n <div :class=\"headerActionsClass\">\r\n <span\r\n :class=\"headerActionIconClass\"\r\n aria-label=\"FullScreen\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n title=\"FullScreen\"\r\n @click=\"toggleFullscreen\"\r\n @keydown.enter.prevent=\"toggleFullscreen\"\r\n @keydown.space.prevent=\"toggleFullscreen\">\r\n <ElIcon>\r\n <FullScreen />\r\n </ElIcon>\r\n </span>\r\n <FlButton\r\n :icon=\"Close\"\r\n :class=\"headerActionIconClass\"\r\n aria-label=\"Close\"\r\n link\r\n title=\"Close\"\r\n type=\"primary\"\r\n @click=\"closeDialog\" />\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <div :class=\"bodyInnerClass\" :style=\"bodyStyle\">\r\n <slot />\r\n </div>\r\n\r\n <template v-if=\"slots.footer || props.showFooter\" #footer>\r\n <slot v-if=\"slots.footer\" name=\"footer\" />\r\n <div v-else :class=\"footerActionsClass\">\r\n <fl-button :disabled=\"props.cancelDisabled\" @click=\"handleCancel\">\r\n {{ props.cancelText }}\r\n </fl-button>\r\n <fl-button :disabled=\"props.confirmDisabled\" type=\"primary\" @click=\"handleConfirm\">\r\n {{ props.confirmText }}\r\n </fl-button>\r\n </div>\r\n </template>\r\n </component>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { Close, FullScreen } from '@element-plus/icons-vue'\r\nimport { ElDialog, ElIcon } from 'element-plus'\r\nimport type { ComponentInstance, CSSProperties } from 'vue'\r\nimport { computed, ref, useAttrs, useSlots } from 'vue'\r\nimport { useMergedExpose } from '@falcon-ui/hooks'\r\nimport { invokeListener, useNamespace } from '@falcon-ui/utils'\r\nimport { FlButton } from '../../button'\r\nimport { flDialogEmits, flDialogProps } from './dialog'\r\n\r\ndefineOptions({\r\n name: 'FlDialog',\r\n inheritAttrs: false\r\n})\r\n\r\ntype ClassValue = string | Record<string, boolean> | ClassValue[] | null | undefined\r\n\r\nconst omitAttrKeys = new Set([\r\n 'align-center',\r\n 'alignCenter',\r\n 'body-class',\r\n 'bodyClass',\r\n 'class',\r\n 'destroy-on-close',\r\n 'destroyOnClose',\r\n 'draggable',\r\n 'footer-class',\r\n 'footerClass',\r\n 'fullscreen',\r\n 'header-class',\r\n 'headerClass',\r\n 'show-close',\r\n 'showClose',\r\n 'transition'\r\n])\r\n\r\nconst props = defineProps(flDialogProps)\r\nconst emit = defineEmits(flDialogEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst ns = useNamespace('dialog')\r\nconst isFullscreen = ref(false)\r\n\r\nconst normalizeClassName = (value: ClassValue): string => {\r\n if (!value) {\r\n return ''\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return value\r\n .split(' ')\r\n .map((item) => item.trim())\r\n .filter(Boolean)\r\n .join(' ')\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value\r\n .map((item) => normalizeClassName(item))\r\n .filter(Boolean)\r\n .join(' ')\r\n .trim()\r\n }\r\n\r\n return Object.entries(value)\r\n .filter(([, enabled]) => enabled)\r\n .map(([className]) => className)\r\n .join(' ')\r\n}\r\n\r\nconst mergeClassName = (...values: ClassValue[]): string =>\r\n values\r\n .map((item) => normalizeClassName(item))\r\n .filter(Boolean)\r\n .join(' ')\r\n .trim()\r\n\r\nconst getAttrValue = (kebabCaseName: string, camelCaseName = kebabCaseName): unknown =>\r\n attrs[kebabCaseName] ?? attrs[camelCaseName]\r\n\r\nconst resolveBooleanAttr = (value: unknown, fallback: boolean): boolean => {\r\n if (value === undefined) {\r\n return fallback\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (!value) {\r\n return true\r\n }\r\n\r\n return value !== 'false'\r\n }\r\n\r\n return Boolean(value)\r\n}\r\n\r\n/**\r\n * 通过同步 `modelValue=false` 关闭当前对话框。\r\n */\r\nconst closeDialog = () => {\r\n emit('update:modelValue', false)\r\n}\r\n\r\n/**\r\n * 切换当前对话框的全屏状态。\r\n */\r\nconst toggleFullscreen = () => {\r\n isFullscreen.value = !isFullscreen.value\r\n}\r\n\r\nconst handleCancel = () => {\r\n emit('cancel')\r\n closeDialog()\r\n}\r\n\r\nconst handleConfirm = () => {\r\n emit('confirm')\r\n closeDialog()\r\n}\r\n\r\nconst handleModelValueUpdate = (value: boolean) => {\r\n emit('update:modelValue', value)\r\n invokeListener(attrs['onUpdate:modelValue'], value)\r\n}\r\n\r\nconst mergedClass = computed(() => mergeClassName(ns.b(), attrs.class as ClassValue))\r\nconst mergedHeaderClass = computed(() =>\r\n mergeClassName(ns.e('header'), getAttrValue('header-class', 'headerClass') as ClassValue)\r\n)\r\nconst mergedBodyClass = computed(() =>\r\n mergeClassName(ns.e('body'), getAttrValue('body-class', 'bodyClass') as ClassValue)\r\n)\r\nconst mergedFooterClass = computed(() =>\r\n mergeClassName(ns.e('footer'), getAttrValue('footer-class', 'footerClass') as ClassValue)\r\n)\r\n\r\nconst bodyStyle = computed<CSSProperties | undefined>(() => {\r\n if (isFullscreen.value) {\r\n return undefined\r\n }\r\n\r\n if (props.bodyHeight === undefined || props.bodyHeight === null || props.bodyHeight === '') {\r\n return undefined\r\n }\r\n\r\n const height = typeof props.bodyHeight === 'number' ? `${props.bodyHeight}px` : props.bodyHeight\r\n return {\r\n height,\r\n overflowY: 'auto'\r\n }\r\n})\r\n\r\nconst resolvedTitle = computed(() => {\r\n const title = attrs.title\r\n return typeof title === 'string' ? title : ''\r\n})\r\n\r\nconst resolvedAlignCenter = computed(() =>\r\n resolveBooleanAttr(getAttrValue('align-center', 'alignCenter'), true)\r\n)\r\nconst resolvedDestroyOnClose = computed(() =>\r\n resolveBooleanAttr(getAttrValue('destroy-on-close', 'destroyOnClose'), true)\r\n)\r\nconst resolvedDraggable = computed(() => resolveBooleanAttr(getAttrValue('draggable'), true))\r\nconst resolvedShowClose = computed(() =>\r\n resolveBooleanAttr(getAttrValue('show-close', 'showClose'), false)\r\n)\r\nconst resolvedTransition = computed(() => {\r\n const transition = getAttrValue('transition')\r\n return typeof transition === 'string' && transition ? transition : 'fl-dialog-bounce'\r\n})\r\n\r\nconst forwardedAttrs = computed(() => {\r\n const next: Record<string, unknown> = {}\r\n\r\n for (const [key, value] of Object.entries(attrs)) {\r\n if (!omitAttrKeys.has(key)) {\r\n next[key] = value\r\n }\r\n }\r\n\r\n return next\r\n})\r\n\r\nconst mergedAttrs = computed(() => ({\r\n ...forwardedAttrs.value,\r\n alignCenter: resolvedAlignCenter.value,\r\n bodyClass: mergedBodyClass.value,\r\n class: mergedClass.value,\r\n destroyOnClose: resolvedDestroyOnClose.value,\r\n draggable: resolvedDraggable.value,\r\n footerClass: mergedFooterClass.value,\r\n fullscreen: isFullscreen.value,\r\n headerClass: mergedHeaderClass.value,\r\n modelValue: props.modelValue,\r\n showClose: resolvedShowClose.value,\r\n transition: resolvedTransition.value,\r\n 'onUpdate:modelValue': handleModelValueUpdate\r\n}))\r\n\r\nconst headerContentClass = ns.e('header-content')\r\nconst headerTitleClass = ns.e('header-title')\r\nconst headerActionsClass = ns.e('header-actions')\r\nconst headerActionIconClass = ns.e('header-action-icon')\r\nconst bodyInnerClass = ns.e('body-inner')\r\nconst footerActionsClass = ns.e('footer-actions')\r\n\r\nconst _myExpose = {\r\n /**\r\n * 以编程方式关闭当前对话框。\r\n */\r\n closeDialog,\r\n /**\r\n * 以编程方式切换对话框全屏模式。\r\n */\r\n toggleFullscreen\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElDialog> & typeof _myExpose)\r\n</script>\r\n","<template>\r\n <component :is=\"ElDialog\" v-bind=\"mergedAttrs\" :ref=\"changeRef\">\r\n <template #header>\r\n <div :class=\"headerContentClass\">\r\n <div :class=\"headerTitleClass\">\r\n <slot v-if=\"slots.header\" name=\"header\" />\r\n <slot v-else-if=\"slots.title\" name=\"title\" />\r\n <template v-else>{{ resolvedTitle }}</template>\r\n </div>\r\n <div :class=\"headerActionsClass\">\r\n <span\r\n :class=\"headerActionIconClass\"\r\n aria-label=\"FullScreen\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n title=\"FullScreen\"\r\n @click=\"toggleFullscreen\"\r\n @keydown.enter.prevent=\"toggleFullscreen\"\r\n @keydown.space.prevent=\"toggleFullscreen\">\r\n <ElIcon>\r\n <FullScreen />\r\n </ElIcon>\r\n </span>\r\n <FlButton\r\n :icon=\"Close\"\r\n :class=\"headerActionIconClass\"\r\n aria-label=\"Close\"\r\n link\r\n title=\"Close\"\r\n type=\"primary\"\r\n @click=\"closeDialog\" />\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <div :class=\"bodyInnerClass\" :style=\"bodyStyle\">\r\n <slot />\r\n </div>\r\n\r\n <template v-if=\"slots.footer || props.showFooter\" #footer>\r\n <slot v-if=\"slots.footer\" name=\"footer\" />\r\n <div v-else :class=\"footerActionsClass\">\r\n <fl-button :disabled=\"props.cancelDisabled\" @click=\"handleCancel\">\r\n {{ props.cancelText }}\r\n </fl-button>\r\n <fl-button :disabled=\"props.confirmDisabled\" type=\"primary\" @click=\"handleConfirm\">\r\n {{ props.confirmText }}\r\n </fl-button>\r\n </div>\r\n </template>\r\n </component>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { Close, FullScreen } from '@element-plus/icons-vue'\r\nimport { ElDialog, ElIcon } from 'element-plus'\r\nimport type { ComponentInstance, CSSProperties } from 'vue'\r\nimport { computed, ref, useAttrs, useSlots } from 'vue'\r\nimport { useMergedExpose } from '@falcon-ui/hooks'\r\nimport { invokeListener, useNamespace } from '@falcon-ui/utils'\r\nimport { FlButton } from '../../button'\r\nimport { flDialogEmits, flDialogProps } from './dialog'\r\n\r\ndefineOptions({\r\n name: 'FlDialog',\r\n inheritAttrs: false\r\n})\r\n\r\ntype ClassValue = string | Record<string, boolean> | ClassValue[] | null | undefined\r\n\r\nconst omitAttrKeys = new Set([\r\n 'align-center',\r\n 'alignCenter',\r\n 'body-class',\r\n 'bodyClass',\r\n 'class',\r\n 'destroy-on-close',\r\n 'destroyOnClose',\r\n 'draggable',\r\n 'footer-class',\r\n 'footerClass',\r\n 'fullscreen',\r\n 'header-class',\r\n 'headerClass',\r\n 'show-close',\r\n 'showClose',\r\n 'transition'\r\n])\r\n\r\nconst props = defineProps(flDialogProps)\r\nconst emit = defineEmits(flDialogEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst ns = useNamespace('dialog')\r\nconst isFullscreen = ref(false)\r\n\r\nconst normalizeClassName = (value: ClassValue): string => {\r\n if (!value) {\r\n return ''\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return value\r\n .split(' ')\r\n .map((item) => item.trim())\r\n .filter(Boolean)\r\n .join(' ')\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value\r\n .map((item) => normalizeClassName(item))\r\n .filter(Boolean)\r\n .join(' ')\r\n .trim()\r\n }\r\n\r\n return Object.entries(value)\r\n .filter(([, enabled]) => enabled)\r\n .map(([className]) => className)\r\n .join(' ')\r\n}\r\n\r\nconst mergeClassName = (...values: ClassValue[]): string =>\r\n values\r\n .map((item) => normalizeClassName(item))\r\n .filter(Boolean)\r\n .join(' ')\r\n .trim()\r\n\r\nconst getAttrValue = (kebabCaseName: string, camelCaseName = kebabCaseName): unknown =>\r\n attrs[kebabCaseName] ?? attrs[camelCaseName]\r\n\r\nconst resolveBooleanAttr = (value: unknown, fallback: boolean): boolean => {\r\n if (value === undefined) {\r\n return fallback\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value\r\n }\r\n\r\n if (typeof value === 'string') {\r\n if (!value) {\r\n return true\r\n }\r\n\r\n return value !== 'false'\r\n }\r\n\r\n return Boolean(value)\r\n}\r\n\r\n/**\r\n * 通过同步 `modelValue=false` 关闭当前对话框。\r\n */\r\nconst closeDialog = () => {\r\n emit('update:modelValue', false)\r\n}\r\n\r\n/**\r\n * 切换当前对话框的全屏状态。\r\n */\r\nconst toggleFullscreen = () => {\r\n isFullscreen.value = !isFullscreen.value\r\n}\r\n\r\nconst handleCancel = () => {\r\n emit('cancel')\r\n closeDialog()\r\n}\r\n\r\nconst handleConfirm = () => {\r\n emit('confirm')\r\n closeDialog()\r\n}\r\n\r\nconst handleModelValueUpdate = (value: boolean) => {\r\n emit('update:modelValue', value)\r\n invokeListener(attrs['onUpdate:modelValue'], value)\r\n}\r\n\r\nconst mergedClass = computed(() => mergeClassName(ns.b(), attrs.class as ClassValue))\r\nconst mergedHeaderClass = computed(() =>\r\n mergeClassName(ns.e('header'), getAttrValue('header-class', 'headerClass') as ClassValue)\r\n)\r\nconst mergedBodyClass = computed(() =>\r\n mergeClassName(ns.e('body'), getAttrValue('body-class', 'bodyClass') as ClassValue)\r\n)\r\nconst mergedFooterClass = computed(() =>\r\n mergeClassName(ns.e('footer'), getAttrValue('footer-class', 'footerClass') as ClassValue)\r\n)\r\n\r\nconst bodyStyle = computed<CSSProperties | undefined>(() => {\r\n if (isFullscreen.value) {\r\n return undefined\r\n }\r\n\r\n if (props.bodyHeight === undefined || props.bodyHeight === null || props.bodyHeight === '') {\r\n return undefined\r\n }\r\n\r\n const height = typeof props.bodyHeight === 'number' ? `${props.bodyHeight}px` : props.bodyHeight\r\n return {\r\n height,\r\n overflowY: 'auto'\r\n }\r\n})\r\n\r\nconst resolvedTitle = computed(() => {\r\n const title = attrs.title\r\n return typeof title === 'string' ? title : ''\r\n})\r\n\r\nconst resolvedAlignCenter = computed(() =>\r\n resolveBooleanAttr(getAttrValue('align-center', 'alignCenter'), true)\r\n)\r\nconst resolvedDestroyOnClose = computed(() =>\r\n resolveBooleanAttr(getAttrValue('destroy-on-close', 'destroyOnClose'), true)\r\n)\r\nconst resolvedDraggable = computed(() => resolveBooleanAttr(getAttrValue('draggable'), true))\r\nconst resolvedShowClose = computed(() =>\r\n resolveBooleanAttr(getAttrValue('show-close', 'showClose'), false)\r\n)\r\nconst resolvedTransition = computed(() => {\r\n const transition = getAttrValue('transition')\r\n return typeof transition === 'string' && transition ? transition : 'fl-dialog-bounce'\r\n})\r\n\r\nconst forwardedAttrs = computed(() => {\r\n const next: Record<string, unknown> = {}\r\n\r\n for (const [key, value] of Object.entries(attrs)) {\r\n if (!omitAttrKeys.has(key)) {\r\n next[key] = value\r\n }\r\n }\r\n\r\n return next\r\n})\r\n\r\nconst mergedAttrs = computed(() => ({\r\n ...forwardedAttrs.value,\r\n alignCenter: resolvedAlignCenter.value,\r\n bodyClass: mergedBodyClass.value,\r\n class: mergedClass.value,\r\n destroyOnClose: resolvedDestroyOnClose.value,\r\n draggable: resolvedDraggable.value,\r\n footerClass: mergedFooterClass.value,\r\n fullscreen: isFullscreen.value,\r\n headerClass: mergedHeaderClass.value,\r\n modelValue: props.modelValue,\r\n showClose: resolvedShowClose.value,\r\n transition: resolvedTransition.value,\r\n 'onUpdate:modelValue': handleModelValueUpdate\r\n}))\r\n\r\nconst headerContentClass = ns.e('header-content')\r\nconst headerTitleClass = ns.e('header-title')\r\nconst headerActionsClass = ns.e('header-actions')\r\nconst headerActionIconClass = ns.e('header-action-icon')\r\nconst bodyInnerClass = ns.e('body-inner')\r\nconst footerActionsClass = ns.e('footer-actions')\r\n\r\nconst _myExpose = {\r\n /**\r\n * 以编程方式关闭当前对话框。\r\n */\r\n closeDialog,\r\n /**\r\n * 以编程方式切换对话框全屏模式。\r\n */\r\n toggleFullscreen\r\n}\r\n\r\nconst { changeRef } = useMergedExpose(_myExpose)\r\n\r\ndefineExpose({} as ComponentInstance<typeof ElDialog> & typeof _myExpose)\r\n</script>\r\n"],"mappings":"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"}