@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":"radial-menu.vue.cjs","names":["radialMenuSizes: FlRadialMenuSize[]","radialMenuItemTypes: FlRadialMenuItemType[]","normalizedItems: FlRadialMenuResolvedItem[]"],"sources":["../../../../../../packages/utils/src/bem.ts","../../../../../../packages/components/radial-menu/src/radial-menu.ts","../../../../../../packages/components/radial-menu/src/use-radial-menu-items.ts","../../../../../../packages/components/radial-menu/src/use-radial-menu-keyboard.ts","../../../../../../packages/components/radial-menu/src/use-radial-menu-position.ts","../../../../../../packages/components/radial-menu/src/use-radial-menu-shortcut.ts","../../../../../../packages/components/radial-menu/src/use-radial-menu-state.ts","../../../../../../packages/components/radial-menu/src/radial-menu.vue","../../../../../../packages/components/radial-menu/src/radial-menu.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","import type { ExtractPublicPropTypes, PropType } from 'vue'\r\nimport type {\r\n FlRadialMenuCloseReason,\r\n FlRadialMenuDropdownPlacement,\r\n FlRadialMenuItemData,\r\n FlRadialMenuItemType,\r\n FlRadialMenuMode,\r\n FlRadialMenuMoreMode,\r\n FlRadialMenuOpenReason,\r\n FlRadialMenuResolvedItem,\r\n FlRadialMenuSelectContext,\r\n FlRadialMenuSize,\r\n FlRadialMenuTrigger\r\n} from './types'\r\n\r\nconst radialMenuSizes: FlRadialMenuSize[] = ['large', 'medium', 'small']\r\nconst radialMenuItemTypes: FlRadialMenuItemType[] = ['square', 'circle']\r\n\r\nexport const flRadialMenuProps = {\r\n items: {\r\n type: Array as PropType<FlRadialMenuItemData[]>,\r\n default: () => []\r\n },\r\n mode: {\r\n type: String as PropType<FlRadialMenuMode>,\r\n default: 'inline'\r\n },\r\n trigger: {\r\n type: String as PropType<FlRadialMenuTrigger>,\r\n default: 'click'\r\n },\r\n modelValue: {\r\n type: Boolean,\r\n default: undefined\r\n },\r\n shortcut: {\r\n type: String,\r\n default: ''\r\n },\r\n shortcutEnabled: {\r\n type: Boolean,\r\n default: true\r\n },\r\n centerIcon: {\r\n type: [Object, String] as PropType<FlRadialMenuItemData['icon']>,\r\n default: undefined\r\n },\r\n centerLabel: {\r\n type: String,\r\n default: ''\r\n },\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n maxRingItems: {\r\n type: Number,\r\n default: 6\r\n },\r\n closeOnSelect: {\r\n type: Boolean,\r\n default: true\r\n },\r\n moreText: {\r\n type: String,\r\n default: 'More'\r\n },\r\n moreMode: {\r\n type: String as PropType<FlRadialMenuMoreMode>,\r\n default: 'text-ellipsis'\r\n },\r\n moreDropdownPlacement: {\r\n type: String as PropType<FlRadialMenuDropdownPlacement>,\r\n default: 'bottom'\r\n },\r\n size: {\r\n type: String as PropType<FlRadialMenuSize>,\r\n default: undefined,\r\n validator: (value: string) => radialMenuSizes.includes(value as FlRadialMenuSize)\r\n },\r\n itemType: {\r\n type: String as PropType<FlRadialMenuItemType>,\r\n default: 'square',\r\n validator: (value: string) => radialMenuItemTypes.includes(value as FlRadialMenuItemType)\r\n },\r\n teleport: {\r\n type: [Boolean, String] as unknown as PropType<boolean | string>,\r\n default: true\r\n },\r\n zIndex: {\r\n type: Number,\r\n default: 2000\r\n }\r\n} as const\r\n\r\nexport const flRadialMenuEmits = {\r\n 'update:modelValue': (opened: boolean) => typeof opened === 'boolean',\r\n open: (reason: FlRadialMenuOpenReason) => typeof reason === 'string',\r\n close: (reason: FlRadialMenuCloseReason) => typeof reason === 'string',\r\n select: (\r\n index: string,\r\n indexPath: string[],\r\n item: FlRadialMenuResolvedItem,\r\n context: FlRadialMenuSelectContext\r\n ) =>\r\n typeof index === 'string' &&\r\n Array.isArray(indexPath) &&\r\n indexPath.every((path) => typeof path === 'string') &&\r\n item !== undefined &&\r\n context !== undefined,\r\n 'active-change': (item: FlRadialMenuResolvedItem | null) => item === null || item !== undefined,\r\n 'more-open': () => true,\r\n 'more-close': () => true\r\n} as const\r\n\r\nexport type FlRadialMenuProps = ExtractPublicPropTypes<typeof flRadialMenuProps>\r\nexport type FlRadialMenuEmits = typeof flRadialMenuEmits\r\nexport type RadialMenuProps = FlRadialMenuProps\r\nexport type RadialMenuEmits = FlRadialMenuEmits\r\n\r\nexport type {\r\n FlRadialMenuCloseReason,\r\n FlRadialMenuDropdownPlacement,\r\n FlRadialMenuExpose,\r\n FlRadialMenuItemData,\r\n FlRadialMenuItemType,\r\n FlRadialMenuMode,\r\n FlRadialMenuMoreMode,\r\n FlRadialMenuOpenOptions,\r\n FlRadialMenuOpenReason,\r\n FlRadialMenuResolvableItem,\r\n FlRadialMenuResolvedItem,\r\n FlRadialMenuSelectContext,\r\n FlRadialMenuSize,\r\n FlRadialMenuTrigger\r\n} from './types'\r\n","import type {\r\n FlRadialMenuItemData,\r\n FlRadialMenuResolvableItem,\r\n FlRadialMenuResolvedItem\r\n} from './types'\r\n\r\ninterface RadialMenuItemVisibility {\r\n hidden?: boolean\r\n}\r\n\r\nexport interface RadialMenuSplitItems<\r\n T extends RadialMenuItemVisibility = FlRadialMenuResolvedItem\r\n> {\r\n visibleItems: T[]\r\n ringItems: T[]\r\n moreItems: T[]\r\n ringLimit: number\r\n}\r\n\r\nexport interface NormalizeRadialMenuItemsOptions {\r\n warn?: (message: string) => void\r\n}\r\n\r\nexport const clampRingItemCount = (maxRingItems: number) => {\r\n if (!Number.isFinite(maxRingItems)) {\r\n return 6\r\n }\r\n\r\n return Math.min(Math.max(Math.trunc(maxRingItems), 1), 6)\r\n}\r\n\r\nexport const resolveRadialMenuItemIndex = (item: FlRadialMenuItemData) => {\r\n const rawIndex = item.index ?? item.key\r\n\r\n if (rawIndex === undefined || rawIndex === null || rawIndex === '') {\r\n return ''\r\n }\r\n\r\n return String(rawIndex)\r\n}\r\n\r\nexport const normalizeRadialMenuItems = (\r\n items: FlRadialMenuResolvableItem[],\r\n options: NormalizeRadialMenuItemsOptions = {}\r\n): FlRadialMenuResolvedItem[] => {\r\n const seenIndexes = new Set<string>()\r\n const normalizedItems: FlRadialMenuResolvedItem[] = []\r\n\r\n for (const item of items) {\r\n const index = resolveRadialMenuItemIndex(item)\r\n\r\n if (!index) {\r\n options.warn?.('Missing required prop: \"index\"')\r\n continue\r\n }\r\n\r\n if (seenIndexes.has(index)) {\r\n options.warn?.(`Duplicate item index detected: ${index}`)\r\n continue\r\n }\r\n\r\n seenIndexes.add(index)\r\n normalizedItems.push({\r\n ...item,\r\n index\r\n })\r\n }\r\n\r\n return normalizedItems\r\n}\r\n\r\nexport const splitRadialMenuItems = <T extends RadialMenuItemVisibility>(\r\n items: T[],\r\n maxRingItems: number\r\n): RadialMenuSplitItems<T> => {\r\n const ringLimit = clampRingItemCount(maxRingItems)\r\n const visibleItems = items.filter((item) => !item.hidden)\r\n\r\n return {\r\n visibleItems,\r\n ringItems: visibleItems.slice(0, ringLimit),\r\n moreItems: visibleItems.slice(ringLimit),\r\n ringLimit\r\n }\r\n}\r\n\r\nexport const isRadialMenuItemDisabled = (item: FlRadialMenuResolvedItem | undefined) =>\r\n item?.disabled === true\r\n","import type { Ref } from 'vue'\r\nimport type { FlRadialMenuResolvedItem } from './types'\r\n\r\nexport interface UseRadialMenuKeyboardOptions {\r\n ringItems: Ref<FlRadialMenuResolvedItem[]>\r\n moreItems: Ref<FlRadialMenuResolvedItem[]>\r\n ringRefs: Ref<HTMLButtonElement[]>\r\n moreRefs: Ref<HTMLButtonElement[]>\r\n closeMenu: () => void\r\n closeMore: () => void\r\n activateFocused: (event: KeyboardEvent) => void\r\n}\r\n\r\nconst findNextEnabledIndex = (\r\n items: FlRadialMenuResolvedItem[],\r\n currentIndex: number,\r\n direction: 1 | -1\r\n) => {\r\n if (items.length === 0) {\r\n return -1\r\n }\r\n\r\n for (let step = 1; step <= items.length; step += 1) {\r\n const nextIndex = (currentIndex + step * direction + items.length) % items.length\r\n if (!items[nextIndex]?.disabled) {\r\n return nextIndex\r\n }\r\n }\r\n\r\n return -1\r\n}\r\n\r\nexport const useRadialMenuKeyboard = ({\r\n ringItems,\r\n moreItems,\r\n ringRefs,\r\n moreRefs,\r\n closeMenu,\r\n closeMore,\r\n activateFocused\r\n}: UseRadialMenuKeyboardOptions) => {\r\n const focusRingItem = (index: number) => {\r\n ringRefs.value[index]?.focus()\r\n }\r\n\r\n const focusFirstAvailableRingItem = () => {\r\n const index = findNextEnabledIndex(ringItems.value, -1, 1)\r\n if (index >= 0) {\r\n focusRingItem(index)\r\n }\r\n }\r\n\r\n const handleRingKeydown = (event: KeyboardEvent, index: number) => {\r\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\r\n event.preventDefault()\r\n const nextIndex = findNextEnabledIndex(ringItems.value, index, 1)\r\n if (nextIndex >= 0) {\r\n focusRingItem(nextIndex)\r\n }\r\n return\r\n }\r\n\r\n if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\r\n event.preventDefault()\r\n const nextIndex = findNextEnabledIndex(ringItems.value, index, -1)\r\n if (nextIndex >= 0) {\r\n focusRingItem(nextIndex)\r\n }\r\n return\r\n }\r\n\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault()\r\n activateFocused(event)\r\n }\r\n }\r\n\r\n const handleMoreKeydown = (event: KeyboardEvent, index: number) => {\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault()\r\n const nextIndex = findNextEnabledIndex(moreItems.value, index, 1)\r\n moreRefs.value[nextIndex]?.focus()\r\n return\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault()\r\n const nextIndex = findNextEnabledIndex(moreItems.value, index, -1)\r\n moreRefs.value[nextIndex]?.focus()\r\n return\r\n }\r\n\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault()\r\n activateFocused(event)\r\n }\r\n }\r\n\r\n const handleMenuKeydown = (event: KeyboardEvent) => {\r\n if (event.key === 'Escape') {\r\n event.preventDefault()\r\n closeMore()\r\n closeMenu()\r\n }\r\n }\r\n\r\n return {\r\n focusFirstAvailableRingItem,\r\n handleMenuKeydown,\r\n handleRingKeydown,\r\n handleMoreKeydown\r\n }\r\n}\r\n","export interface RadialMenuItemLayoutOptions {\r\n count: number\r\n index: number\r\n radius: number\r\n startAngle?: number\r\n}\r\n\r\nexport interface RadialMenuItemLayout {\r\n angle: number\r\n x: number\r\n y: number\r\n}\r\n\r\nexport interface RadialMenuSectorPathOptions {\r\n activeIndex: number\r\n count: number\r\n innerRadius: number\r\n outerRadius: number\r\n startAngle?: number\r\n}\r\n\r\nexport interface RadialMenuTrackArcPathOptions {\r\n activeIndex: number\r\n count: number\r\n radius: number\r\n innerRadius?: number\r\n startAngle?: number\r\n}\r\n\r\nexport interface RadialMenuClockwiseArcPointsOptions {\r\n radius: number\r\n targetAngle: number\r\n startAngle?: number\r\n steps?: number\r\n}\r\n\r\nexport interface RadialMenuClockwiseEntryOrderOptions {\r\n startAngle?: number\r\n}\r\n\r\nexport type RadialMenuTipPlacement = 'left' | 'right' | 'top' | 'bottom'\r\n\r\nconst toRadians = (degree: number) => (degree * Math.PI) / 180\r\nconst normalizeCircleCoordinate = (value: number) => (Math.abs(value) < 0.001 ? 0 : value)\r\n\r\nexport const normalizeRadialMenuAngle = (angle: number) => {\r\n const normalized = angle % 360\r\n\r\n return normalized < 0 ? normalized + 360 : normalized\r\n}\r\n\r\nconst pointOnCircle = (radius: number, angle: number) => {\r\n const radians = toRadians(angle)\r\n\r\n return {\r\n x: normalizeCircleCoordinate(Math.cos(radians) * radius),\r\n y: normalizeCircleCoordinate(Math.sin(radians) * radius)\r\n }\r\n}\r\n\r\nexport const getRadialMenuClockwiseArcPoints = ({\r\n radius,\r\n targetAngle,\r\n startAngle = 0,\r\n steps = 7\r\n}: RadialMenuClockwiseArcPointsOptions) => {\r\n const safeSteps = Math.max(Math.floor(steps), 2)\r\n const normalizedStartAngle = normalizeRadialMenuAngle(startAngle)\r\n const clockwiseSweep = normalizeRadialMenuAngle(targetAngle - normalizedStartAngle)\r\n\r\n return Array.from({ length: safeSteps }, (_, index) => {\r\n const progress = index / (safeSteps - 1)\r\n\r\n return pointOnCircle(radius, normalizedStartAngle + clockwiseSweep * progress)\r\n })\r\n}\r\n\r\nexport const getRadialMenuClockwiseEntryOrder = (\r\n layouts: Array<Pick<RadialMenuItemLayout, 'angle'>>,\r\n { startAngle = 0 }: RadialMenuClockwiseEntryOrderOptions = {}\r\n) => {\r\n const normalizedStartAngle = normalizeRadialMenuAngle(startAngle)\r\n\r\n return layouts\r\n .map((layout, index) => ({\r\n index,\r\n distance: normalizeRadialMenuAngle(layout.angle - normalizedStartAngle)\r\n }))\r\n .sort((current, next) => next.distance - current.distance || current.index - next.index)\r\n .map(({ index }) => index)\r\n}\r\n\r\nconst getRadialMenuActiveAngles = ({\r\n activeIndex,\r\n count,\r\n startAngle = -90\r\n}: Pick<RadialMenuSectorPathOptions, 'activeIndex' | 'count' | 'startAngle'>) => {\r\n const safeCount = Math.max(count, 1)\r\n const sectorAngle = 360 / safeCount\r\n const gap = Math.min(6, sectorAngle / 4)\r\n const centerAngle = startAngle + sectorAngle * activeIndex\r\n const start = centerAngle - sectorAngle / 2 + gap\r\n const end = centerAngle + sectorAngle / 2 - gap\r\n\r\n return {\r\n start,\r\n end,\r\n largeArcFlag: end - start > 180 ? 1 : 0\r\n }\r\n}\r\n\r\nexport const getRadialMenuItemLayout = ({\r\n count,\r\n index,\r\n radius,\r\n startAngle = -90\r\n}: RadialMenuItemLayoutOptions): RadialMenuItemLayout => {\r\n const safeCount = Math.max(count, 1)\r\n const angle = startAngle + (360 / safeCount) * index\r\n const point = pointOnCircle(radius, angle)\r\n\r\n return {\r\n angle,\r\n x: point.x,\r\n y: point.y\r\n }\r\n}\r\n\r\nexport const getRadialMenuSectorPath = ({\r\n activeIndex,\r\n count,\r\n innerRadius,\r\n outerRadius,\r\n startAngle = -90\r\n}: RadialMenuSectorPathOptions) => {\r\n if (outerRadius <= innerRadius) {\r\n return ''\r\n }\r\n\r\n const { start, end, largeArcFlag } = getRadialMenuActiveAngles({\r\n activeIndex,\r\n count,\r\n startAngle\r\n })\r\n const outerStart = pointOnCircle(outerRadius, start)\r\n const outerEnd = pointOnCircle(outerRadius, end)\r\n const innerEnd = pointOnCircle(innerRadius, end)\r\n const innerStart = pointOnCircle(innerRadius, start)\r\n\r\n return [\r\n `M ${outerStart.x.toFixed(3)} ${outerStart.y.toFixed(3)}`,\r\n `A ${outerRadius} ${outerRadius} 0 ${largeArcFlag} 1 ${outerEnd.x.toFixed(3)} ${outerEnd.y.toFixed(3)}`,\r\n `L ${innerEnd.x.toFixed(3)} ${innerEnd.y.toFixed(3)}`,\r\n `A ${innerRadius} ${innerRadius} 0 ${largeArcFlag} 0 ${innerStart.x.toFixed(3)} ${innerStart.y.toFixed(3)}`,\r\n 'Z'\r\n ].join(' ')\r\n}\r\n\r\nexport const getRadialMenuTrackArcPath = ({\r\n activeIndex,\r\n count,\r\n radius,\r\n innerRadius = 0,\r\n startAngle = -90\r\n}: RadialMenuTrackArcPathOptions) => {\r\n if (radius <= innerRadius) {\r\n return ''\r\n }\r\n\r\n const { start, end, largeArcFlag } = getRadialMenuActiveAngles({\r\n activeIndex,\r\n count,\r\n startAngle\r\n })\r\n const arcStart = pointOnCircle(radius, start)\r\n const arcEnd = pointOnCircle(radius, end)\r\n\r\n return [\r\n `M ${arcStart.x.toFixed(3)} ${arcStart.y.toFixed(3)}`,\r\n `A ${radius} ${radius} 0 ${largeArcFlag} 1 ${arcEnd.x.toFixed(3)} ${arcEnd.y.toFixed(3)}`\r\n ].join(' ')\r\n}\r\n\r\nexport const getRadialMenuTipPlacement = ({\r\n x,\r\n y\r\n}: Pick<RadialMenuItemLayout, 'x' | 'y'>): RadialMenuTipPlacement => {\r\n if (Math.abs(x) > Math.abs(y)) {\r\n return x < 0 ? 'left' : 'right'\r\n }\r\n\r\n return y < 0 ? 'top' : 'bottom'\r\n}\r\n","import { onMounted, onUnmounted, type Ref } from 'vue'\r\nimport type { FlRadialMenuOpenOptions } from './types'\r\n\r\nexport interface UseRadialMenuShortcutOptions {\r\n shortcut: Ref<string>\r\n enabled: Ref<boolean>\r\n open: (options: FlRadialMenuOpenOptions) => void\r\n}\r\n\r\nconst modifierKeys = new Set(['alt', 'ctrl', 'control', 'meta', 'shift'])\r\n\r\nconst isEditableTarget = (target: EventTarget | null) => {\r\n if (!(target instanceof HTMLElement)) {\r\n return false\r\n }\r\n\r\n const tagName = target.tagName.toLowerCase()\r\n return (\r\n tagName === 'input' ||\r\n tagName === 'textarea' ||\r\n tagName === 'select' ||\r\n target.isContentEditable\r\n )\r\n}\r\n\r\nconst normalizeShortcut = (value: string) =>\r\n value\r\n .split('+')\r\n .map((part) => part.trim().toLowerCase())\r\n .filter(Boolean)\r\n\r\nconst matchesShortcut = (event: KeyboardEvent, shortcut: string) => {\r\n const parts = normalizeShortcut(shortcut)\r\n if (parts.length === 0) {\r\n return false\r\n }\r\n\r\n const key = parts.find((part) => !modifierKeys.has(part))\r\n const expectsAlt = parts.includes('alt')\r\n const expectsCtrl = parts.includes('ctrl') || parts.includes('control')\r\n const expectsMeta = parts.includes('meta')\r\n const expectsShift = parts.includes('shift')\r\n\r\n return (\r\n event.altKey === expectsAlt &&\r\n event.ctrlKey === expectsCtrl &&\r\n event.metaKey === expectsMeta &&\r\n event.shiftKey === expectsShift &&\r\n event.key.toLowerCase() === key\r\n )\r\n}\r\n\r\nconst getViewportCenter = () => ({\r\n x: typeof window === 'undefined' ? 0 : window.innerWidth / 2,\r\n y: typeof window === 'undefined' ? 0 : window.innerHeight / 2\r\n})\r\n\r\nexport const useRadialMenuShortcut = ({\r\n shortcut,\r\n enabled,\r\n open\r\n}: UseRadialMenuShortcutOptions) => {\r\n const center = getViewportCenter()\r\n let lastMouseX = center.x\r\n let lastMouseY = center.y\r\n\r\n const handleMouseMove = (event: MouseEvent) => {\r\n lastMouseX = event.clientX\r\n lastMouseY = event.clientY\r\n }\r\n\r\n const handleKeydown = (event: KeyboardEvent) => {\r\n if (\r\n !enabled.value ||\r\n !matchesShortcut(event, shortcut.value) ||\r\n isEditableTarget(event.target)\r\n ) {\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n open({\r\n x: lastMouseX,\r\n y: lastMouseY,\r\n reason: 'shortcut'\r\n })\r\n }\r\n\r\n onMounted(() => {\r\n window.addEventListener('mousemove', handleMouseMove)\r\n window.addEventListener('keydown', handleKeydown)\r\n })\r\n\r\n onUnmounted(() => {\r\n window.removeEventListener('mousemove', handleMouseMove)\r\n window.removeEventListener('keydown', handleKeydown)\r\n })\r\n}\r\n","import { computed, ref, type Ref } from 'vue'\r\nimport type { FlRadialMenuCloseReason, FlRadialMenuOpenOptions } from './types'\r\n\r\nexport interface UseRadialMenuStateOptions {\r\n modelValue: Ref<boolean | undefined>\r\n disabled: Ref<boolean>\r\n emitUpdate: (opened: boolean) => void\r\n}\r\n\r\nexport const useRadialMenuState = ({\r\n modelValue,\r\n disabled,\r\n emitUpdate\r\n}: UseRadialMenuStateOptions) => {\r\n const uncontrolledOpened = ref(false)\r\n const floatingX = ref<number | undefined>()\r\n const floatingY = ref<number | undefined>()\r\n const isControlled = computed(() => modelValue.value !== undefined)\r\n const opened = computed(() =>\r\n isControlled.value ? modelValue.value === true : uncontrolledOpened.value\r\n )\r\n\r\n const setOpened = (nextOpened: boolean) => {\r\n if (disabled.value && nextOpened) {\r\n return\r\n }\r\n\r\n if (!isControlled.value) {\r\n uncontrolledOpened.value = nextOpened\r\n }\r\n\r\n emitUpdate(nextOpened)\r\n }\r\n\r\n const open = (options: FlRadialMenuOpenOptions = {}) => {\r\n if (options.x !== undefined) {\r\n floatingX.value = options.x\r\n }\r\n\r\n if (options.y !== undefined) {\r\n floatingY.value = options.y\r\n }\r\n\r\n setOpened(true)\r\n }\r\n\r\n const close = (_reason: FlRadialMenuCloseReason = 'manual') => {\r\n setOpened(false)\r\n }\r\n\r\n const toggle = (options: FlRadialMenuOpenOptions = {}) => {\r\n if (opened.value) {\r\n close('manual')\r\n } else {\r\n open(options)\r\n }\r\n }\r\n\r\n return {\r\n opened,\r\n floatingX,\r\n floatingY,\r\n open,\r\n close,\r\n toggle\r\n }\r\n}\r\n","<template>\r\n <div\r\n ref=\"rootRef\"\r\n :class=\"rootClass\"\r\n :style=\"rootStyle\"\r\n @mouseenter=\"handleMouseEnter\"\r\n @mouseleave=\"handleMouseLeave\">\r\n <button\r\n ref=\"centerRef\"\r\n type=\"button\"\r\n :class=\"ns.e('center')\"\r\n :disabled=\"props.disabled\"\r\n :aria-expanded=\"opened\"\r\n aria-haspopup=\"menu\"\r\n @click=\"handleCenterClick\">\r\n <slot name=\"center\">\r\n <component\r\n :is=\"props.centerIcon\"\r\n v-if=\"props.centerIcon && typeof props.centerIcon !== 'string'\" />\r\n <span v-else-if=\"props.centerIcon\" :class=\"ns.e('center-icon')\">\r\n {{ props.centerIcon }}\r\n </span>\r\n <span v-if=\"props.centerLabel\" :class=\"ns.e('center-label')\">{{ props.centerLabel }}</span>\r\n </slot>\r\n </button>\r\n\r\n <div v-if=\"opened\" :class=\"ns.e('panel')\" role=\"menu\" @keydown=\"handleMenuKeydown\">\r\n <svg :class=\"ns.e('sector')\" viewBox=\"-140 -140 280 280\" aria-hidden=\"true\">\r\n <circle :class=\"ns.e('track')\" cx=\"0\" cy=\"0\" :r=\"resolvedRadius\" />\r\n <path v-if=\"sectorPath\" :class=\"ns.e('sector-path')\" :d=\"sectorPath\" />\r\n <path v-if=\"activeTrackPath\" :class=\"ns.e('track-active')\" :d=\"activeTrackPath\" />\r\n </svg>\r\n\r\n <button\r\n v-for=\"(item, index) in ringItems\"\r\n :key=\"item.index\"\r\n :ref=\"(element) => setRingButtonRef(element, index)\"\r\n type=\"button\"\r\n role=\"menuitem\"\r\n :class=\"[\r\n ns.e('item'),\r\n ns.is('active', activeRingIndex === index),\r\n ns.is('disabled', item.disabled === true)\r\n ]\"\r\n :style=\"getItemStyle(index)\"\r\n :disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n :aria-disabled=\"item.disabled === true\"\r\n :aria-label=\"item.label\"\r\n :data-radial-menu-index=\"item.index\"\r\n @mouseenter=\"setActiveRingIndex(index)\"\r\n @focus=\"setActiveRingIndex(index)\"\r\n @mouseleave=\"setActiveRingIndex(null)\"\r\n @click=\"activateItem(item, 'ring', index, $event)\"\r\n @keydown=\"handleRingKeydown($event, index)\">\r\n <component\r\n :is=\"getItemIcon(item)\"\r\n v-if=\"getItemIcon(item) && typeof getItemIcon(item) !== 'string'\" />\r\n <span v-else-if=\"getItemIcon(item)\" :class=\"ns.e('item-icon')\">\r\n {{ getItemIcon(item) }}\r\n </span>\r\n <span :class=\"getItemLabelClass(index)\">\r\n <RadialMenuItemLabel :item=\"item\" />\r\n </span>\r\n </button>\r\n\r\n <button\r\n v-if=\"moreItems.length > 0\"\r\n type=\"button\"\r\n :class=\"ns.e('more')\"\r\n aria-haspopup=\"menu\"\r\n :aria-expanded=\"moreOpened\"\r\n @click=\"setMoreOpened(!moreOpened)\">\r\n {{ moreLabel }}\r\n </button>\r\n\r\n <div\r\n v-if=\"moreOpened\"\r\n :class=\"[ns.e('more-dropdown'), ns.m(`more-${props.moreDropdownPlacement}`)]\"\r\n role=\"menu\">\r\n <button\r\n v-for=\"(item, index) in moreItems\"\r\n :key=\"item.index\"\r\n :ref=\"(element) => setMoreButtonRef(element, index)\"\r\n type=\"button\"\r\n role=\"menuitem\"\r\n :class=\"[ns.e('more-item'), ns.is('disabled', item.disabled === true)]\"\r\n :disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n :aria-disabled=\"item.disabled === true\"\r\n :aria-label=\"item.label\"\r\n :data-radial-menu-more-index=\"item.index\"\r\n @click=\"activateItem(item, 'more', index, $event)\"\r\n @keydown=\"handleMoreKeydown($event, index)\">\r\n <span :class=\"ns.e('more-content')\">\r\n <component\r\n :is=\"getItemIcon(item)\"\r\n v-if=\"getItemIcon(item) && typeof getItemIcon(item) !== 'string'\"\r\n :class=\"ns.e('more-icon')\" />\r\n <span v-else-if=\"getItemIcon(item)\" :class=\"ns.e('more-icon')\">\r\n {{ getItemIcon(item) }}\r\n </span>\r\n <span :class=\"ns.e('more-label')\">\r\n <RadialMenuItemLabel :item=\"item\" />\r\n </span>\r\n </span>\r\n <span v-if=\"item.shortcut\" :class=\"ns.e('shortcut')\">{{ item.shortcut }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport {\r\n Fragment,\r\n computed,\r\n isVNode,\r\n nextTick,\r\n onBeforeUnmount,\r\n ref,\r\n toRef,\r\n useSlots,\r\n useTemplateRef,\r\n watch,\r\n type Component,\r\n type ComponentPublicInstance,\r\n type Slot,\r\n type VNode,\r\n type VNodeArrayChildren\r\n} from 'vue'\r\nimport { useGlobalSize } from 'element-plus'\r\nimport { useNamespace } from '@falcon-ui/utils'\r\nimport { flRadialMenuEmits, flRadialMenuProps } from './radial-menu'\r\nimport { normalizeRadialMenuItems, splitRadialMenuItems } from './use-radial-menu-items'\r\nimport { useRadialMenuKeyboard } from './use-radial-menu-keyboard'\r\nimport {\r\n getRadialMenuClockwiseArcPoints,\r\n getRadialMenuClockwiseEntryOrder,\r\n getRadialMenuItemLayout,\r\n getRadialMenuSectorPath,\r\n getRadialMenuTrackArcPath,\r\n getRadialMenuTipPlacement,\r\n normalizeRadialMenuAngle\r\n} from './use-radial-menu-position'\r\nimport { useRadialMenuShortcut } from './use-radial-menu-shortcut'\r\nimport { useRadialMenuState } from './use-radial-menu-state'\r\nimport type {\r\n FlRadialMenuExpose,\r\n FlRadialMenuOpenOptions,\r\n FlRadialMenuResolvableItem,\r\n FlRadialMenuResolvedItem,\r\n FlRadialMenuSize\r\n} from './types'\r\n\r\ntype RadialMenuEntryKeyframe = {\r\n offset: number\r\n opacity: number\r\n transform: string\r\n}\r\n\r\ndefineOptions({\r\n name: 'FlRadialMenu'\r\n})\r\n\r\nconst props = defineProps(flRadialMenuProps)\r\nconst emit = defineEmits(flRadialMenuEmits)\r\ndefineSlots<{\r\n default?: () => unknown\r\n center?: () => unknown\r\n}>()\r\nconst ns = useNamespace('radial-menu')\r\nconst slots = useSlots()\r\nconst rootRef = useTemplateRef<HTMLDivElement>('rootRef')\r\nconst centerRef = useTemplateRef<HTMLButtonElement>('centerRef')\r\nconst activeRingIndex = ref<number | null>(null)\r\nconst moreOpened = ref(false)\r\nconst isEntryAnimating = ref(false)\r\nconst ringButtonRefs = ref<HTMLButtonElement[]>([])\r\nconst moreButtonRefs = ref<HTMLButtonElement[]>([])\r\nconst warnedMessages = new Set<string>()\r\nconst globalSize = useGlobalSize()\r\nconst radialMenuEntryTrackDelay = 120\r\nconst radialMenuEntryItemMinDuration = 440\r\nconst radialMenuEntryItemMaxDuration = 600\r\nconst radialMenuEntryItemStagger = 90\r\nconst radialMenuEntryArcSteps = 9\r\nconst radialMenuEntryStartAngle = 180\r\nconst radialMenuEntryEasing = 'cubic-bezier(0.2, 0, 0, 1)'\r\nconst radialMenuGeometryBySize = {\r\n large: {\r\n radius: 96,\r\n centerSize: 56\r\n },\r\n medium: {\r\n radius: 80,\r\n centerSize: 48\r\n },\r\n small: {\r\n radius: 64,\r\n centerSize: 40\r\n }\r\n} satisfies Record<FlRadialMenuSize, { radius: number; centerSize: number }>\r\n\r\nconst mapGlobalSize = (size: '' | 'default' | 'large' | 'small'): FlRadialMenuSize => {\r\n if (size === 'large' || size === 'small') {\r\n return size\r\n }\r\n\r\n if (size === 'default') {\r\n return 'medium'\r\n }\r\n\r\n return 'large'\r\n}\r\n\r\nconst warnRadialMenu = (message: string) => {\r\n if (warnedMessages.has(message)) {\r\n return\r\n }\r\n\r\n warnedMessages.add(message)\r\n console.warn(`[FlRadialMenu] ${message}`)\r\n}\r\n\r\nconst flattenSlotVNodes = (children: VNodeArrayChildren): VNode[] => {\r\n const vnodes: VNode[] = []\r\n\r\n for (const child of children) {\r\n if (Array.isArray(child)) {\r\n vnodes.push(...flattenSlotVNodes(child as VNodeArrayChildren))\r\n continue\r\n }\r\n\r\n if (!isVNode(child)) {\r\n continue\r\n }\r\n\r\n if (child.type === Fragment && Array.isArray(child.children)) {\r\n vnodes.push(...flattenSlotVNodes(child.children as VNodeArrayChildren))\r\n continue\r\n }\r\n\r\n vnodes.push(child)\r\n }\r\n\r\n return vnodes\r\n}\r\n\r\nconst isRadialMenuItemVNode = (vnode: VNode) =>\r\n typeof vnode.type === 'object' && 'name' in vnode.type && vnode.type.name === 'FlRadialMenuItem'\r\n\r\nconst readBooleanSlotProp = (value: unknown) => value === true || value === ''\r\n\r\nconst readOptionalBooleanSlotProp = (value: unknown) =>\r\n value === undefined ? undefined : readBooleanSlotProp(value)\r\n\r\nconst readSlotItemSlots = (children: VNode['children']) => {\r\n if (!children || Array.isArray(children) || typeof children !== 'object') {\r\n return undefined\r\n }\r\n\r\n return children as Partial<Record<string, Slot>>\r\n}\r\n\r\nconst readSlotItemProps = (vnode: VNode): FlRadialMenuResolvableItem => {\r\n const vnodeProps = (vnode.props ?? {}) as Record<string, unknown>\r\n const vnodeSlots = readSlotItemSlots(vnode.children)\r\n\r\n return {\r\n index: typeof vnodeProps.index === 'string' ? vnodeProps.index : undefined,\r\n label: typeof vnodeProps.label === 'string' ? vnodeProps.label : '',\r\n icon: vnodeProps.icon as Component | undefined,\r\n shortcut: typeof vnodeProps.shortcut === 'string' ? vnodeProps.shortcut : undefined,\r\n disabled: readBooleanSlotProp(vnodeProps.disabled),\r\n hidden: readBooleanSlotProp(vnodeProps.hidden),\r\n divided: readBooleanSlotProp(vnodeProps.divided),\r\n closeOnSelect: readOptionalBooleanSlotProp(vnodeProps.closeOnSelect),\r\n meta:\r\n vnodeProps.meta && typeof vnodeProps.meta === 'object'\r\n ? (vnodeProps.meta as Record<string, unknown>)\r\n : undefined,\r\n iconSlot: vnodeSlots?.icon,\r\n labelSlot: vnodeSlots?.label\r\n }\r\n}\r\n\r\nconst slotItems = computed(() =>\r\n flattenSlotVNodes(slots.default?.() ?? [])\r\n .filter(isRadialMenuItemVNode)\r\n .map(readSlotItemProps)\r\n)\r\nconst resolvedItems = computed(() =>\r\n normalizeRadialMenuItems(slotItems.value.length > 0 ? slotItems.value : props.items, {\r\n warn: warnRadialMenu\r\n })\r\n)\r\nconst splitItems = computed(() => splitRadialMenuItems(resolvedItems.value, props.maxRingItems))\r\nconst ringItems = computed(() => splitItems.value.ringItems)\r\nconst moreItems = computed(() => splitItems.value.moreItems)\r\nconst resolvedSize = computed(() => props.size ?? mapGlobalSize(globalSize.value))\r\nconst sizeGeometry = computed(() => radialMenuGeometryBySize[resolvedSize.value])\r\nconst resolvedRadius = computed(() => sizeGeometry.value.radius)\r\nconst resolvedCenterSize = computed(() => sizeGeometry.value.centerSize)\r\nconst activeItem = computed(() =>\r\n activeRingIndex.value === null ? null : (ringItems.value[activeRingIndex.value] ?? null)\r\n)\r\nconst sectorInnerRadius = computed(() => resolvedCenterSize.value / 2 + 8)\r\nconst sectorPath = computed(() => {\r\n if (activeRingIndex.value === null || ringItems.value.length === 0) {\r\n return ''\r\n }\r\n\r\n return getRadialMenuSectorPath({\r\n activeIndex: activeRingIndex.value,\r\n count: ringItems.value.length,\r\n innerRadius: sectorInnerRadius.value,\r\n outerRadius: resolvedRadius.value\r\n })\r\n})\r\nconst activeTrackPath = computed(() => {\r\n if (activeRingIndex.value === null || ringItems.value.length === 0) {\r\n return ''\r\n }\r\n\r\n return getRadialMenuTrackArcPath({\r\n activeIndex: activeRingIndex.value,\r\n count: ringItems.value.length,\r\n radius: resolvedRadius.value,\r\n innerRadius: sectorInnerRadius.value\r\n })\r\n})\r\n\r\nconst { opened, floatingX, floatingY, open, close, toggle } = useRadialMenuState({\r\n modelValue: toRef(props, 'modelValue'),\r\n disabled: toRef(props, 'disabled'),\r\n emitUpdate: (nextOpened) => emit('update:modelValue', nextOpened)\r\n})\r\n\r\nuseRadialMenuShortcut({\r\n shortcut: toRef(props, 'shortcut'),\r\n enabled: computed(() => props.shortcutEnabled && Boolean(props.shortcut)),\r\n open\r\n})\r\n\r\nconst rootClass = computed(() => [\r\n ns.b(),\r\n ns.m(props.mode),\r\n ns.m(resolvedSize.value),\r\n ns.m(`item-${props.itemType}`),\r\n ns.is('opened', opened.value),\r\n ns.is('entering', isEntryAnimating.value),\r\n ns.is('disabled', props.disabled)\r\n])\r\n\r\nconst rootStyle = computed(() => ({\r\n '--fl-radial-menu-floating-x': `${floatingX.value ?? (typeof window === 'undefined' ? 0 : window.innerWidth / 2)}px`,\r\n '--fl-radial-menu-floating-y': `${floatingY.value ?? (typeof window === 'undefined' ? 0 : window.innerHeight / 2)}px`,\r\n '--fl-radial-menu-z-index': String(props.zIndex),\r\n '--fl-radial-menu-more-enter-delay': `${radialMenuEntryTrackDelay + Math.max(ringItems.value.length - 1, 0) * radialMenuEntryItemStagger}ms`\r\n}))\r\n\r\nconst getItemIcon = (item: FlRadialMenuResolvedItem) => item.iconSlot ?? item.icon\r\nconst RadialMenuItemLabel = ({ item }: { item: FlRadialMenuResolvedItem }) =>\r\n item.labelSlot?.() ?? item.label\r\n\r\nconst getItemLayout = (index: number) =>\r\n getRadialMenuItemLayout({\r\n count: ringItems.value.length,\r\n index,\r\n radius: resolvedRadius.value\r\n })\r\n\r\nconst formatEntryCoordinate = (value: number) => {\r\n const rounded = Math.abs(value) < 0.001 ? 0 : Number(value.toFixed(3))\r\n\r\n return `${rounded}px`\r\n}\r\n\r\nconst getEntryTransform = (x: number, y: number, scale = 1) =>\r\n `translate(calc(-50% + ${formatEntryCoordinate(x)}), calc(-50% + ${formatEntryCoordinate(y)})) scale(${scale})`\r\n\r\nconst prefersReducedMotion = () =>\r\n typeof window !== 'undefined' &&\r\n typeof window.matchMedia === 'function' &&\r\n window.matchMedia('(prefers-reduced-motion: reduce)').matches\r\n\r\nconst canUseWebAnimations = () =>\r\n typeof HTMLElement !== 'undefined' && typeof HTMLElement.prototype.animate === 'function'\r\n\r\nconst canAnimateElement = (element: HTMLElement) => typeof element.animate === 'function'\r\n\r\nconst getItemStyle = (index: number) => {\r\n const layout = getItemLayout(index)\r\n\r\n return {\r\n '--fl-radial-menu-item-x': `${layout.x}px`,\r\n '--fl-radial-menu-item-y': `${layout.y}px`,\r\n '--fl-radial-menu-item-index': String(index)\r\n }\r\n}\r\n\r\nconst getItemLabelClass = (index: number) => {\r\n const placement = getRadialMenuTipPlacement(getItemLayout(index))\r\n\r\n return [\r\n ns.e('item-label'),\r\n ns.em('item-label', `tip-${placement}`),\r\n moreItems.value.length > 0 && placement === 'bottom'\r\n ? ns.em('item-label', 'hidden-by-more')\r\n : ''\r\n ]\r\n}\r\n\r\nconst moreLabel = computed(() => {\r\n if (props.moreMode === 'ellipsis') {\r\n return '...'\r\n }\r\n\r\n if (props.moreMode === 'text') {\r\n return props.moreText\r\n }\r\n\r\n return `${props.moreText} ...`\r\n})\r\n\r\nconst setActiveRingIndex = (index: number | null) => {\r\n activeRingIndex.value = index\r\n emit('active-change', activeItem.value)\r\n}\r\n\r\nconst setRingButtonRef = (element: Element | ComponentPublicInstance | null, index: number) => {\r\n if (element instanceof HTMLButtonElement) {\r\n ringButtonRefs.value[index] = element\r\n } else {\r\n delete ringButtonRefs.value[index]\r\n }\r\n}\r\n\r\nconst setMoreButtonRef = (element: Element | ComponentPublicInstance | null, index: number) => {\r\n if (element instanceof HTMLButtonElement) {\r\n moreButtonRefs.value[index] = element\r\n } else {\r\n delete moreButtonRefs.value[index]\r\n }\r\n}\r\n\r\nconst setMoreOpened = (nextOpened: boolean) => {\r\n moreOpened.value = nextOpened\r\n if (nextOpened) {\r\n emit('more-open')\r\n } else {\r\n emit('more-close')\r\n }\r\n}\r\n\r\nlet isDocumentPointerdownBound = false\r\n\r\nconst removeDocumentPointerdown = () => {\r\n if (!isDocumentPointerdownBound || typeof document === 'undefined') {\r\n return\r\n }\r\n\r\n document.removeEventListener('pointerdown', handleDocumentPointerdown)\r\n isDocumentPointerdownBound = false\r\n}\r\n\r\nconst addDocumentPointerdown = () => {\r\n if (isDocumentPointerdownBound || typeof document === 'undefined') {\r\n return\r\n }\r\n\r\n document.addEventListener('pointerdown', handleDocumentPointerdown)\r\n isDocumentPointerdownBound = true\r\n}\r\n\r\nconst handleDocumentPointerdown = (event: PointerEvent) => {\r\n const { target } = event\r\n\r\n if (!(target instanceof Node)) {\r\n return\r\n }\r\n\r\n if (rootRef.value?.contains(target)) {\r\n return\r\n }\r\n\r\n moreOpened.value = false\r\n close('click-outside')\r\n}\r\n\r\nconst activateItem = (\r\n item: FlRadialMenuResolvedItem,\r\n source: 'ring' | 'more',\r\n index: number,\r\n event: MouseEvent | KeyboardEvent\r\n) => {\r\n if (item.disabled) {\r\n return\r\n }\r\n\r\n emit('select', item.index, [item.index], item, { source, index, event })\r\n\r\n const shouldClose = item.closeOnSelect ?? props.closeOnSelect\r\n if (shouldClose) {\r\n moreOpened.value = false\r\n close('select')\r\n }\r\n}\r\n\r\nconst activateKeyboardItem = (event: KeyboardEvent) => {\r\n const target = event.currentTarget\r\n if (!(target instanceof HTMLElement)) {\r\n return\r\n }\r\n\r\n target.click()\r\n}\r\n\r\nconst { focusFirstAvailableRingItem, handleMenuKeydown, handleRingKeydown, handleMoreKeydown } =\r\n useRadialMenuKeyboard({\r\n ringItems,\r\n moreItems,\r\n ringRefs: ringButtonRefs,\r\n moreRefs: moreButtonRefs,\r\n closeMenu: () => close('escape'),\r\n closeMore: () => {\r\n moreOpened.value = false\r\n },\r\n activateFocused: activateKeyboardItem\r\n })\r\n\r\nlet entryAnimations: Animation[] = []\r\nlet entryAnimationToken = 0\r\nlet entryFinishTimer: ReturnType<typeof setTimeout> | undefined\r\n\r\nconst clearEntryFinishTimer = () => {\r\n if (entryFinishTimer === undefined) {\r\n return\r\n }\r\n\r\n clearTimeout(entryFinishTimer)\r\n entryFinishTimer = undefined\r\n}\r\n\r\nconst cancelEntryAnimations = () => {\r\n entryAnimationToken += 1\r\n clearEntryFinishTimer()\r\n\r\n for (const animation of entryAnimations) {\r\n animation.cancel()\r\n }\r\n\r\n entryAnimations = []\r\n isEntryAnimating.value = false\r\n}\r\n\r\nconst finishEntryAnimations = (token: number) => {\r\n if (token !== entryAnimationToken) {\r\n return\r\n }\r\n\r\n clearEntryFinishTimer()\r\n\r\n for (const animation of entryAnimations) {\r\n animation.cancel()\r\n }\r\n\r\n entryAnimations = []\r\n isEntryAnimating.value = false\r\n}\r\n\r\nconst getEntryOrderByIndex = () => {\r\n const layouts = ringItems.value.map((_, index) => getItemLayout(index))\r\n const entryOrder = getRadialMenuClockwiseEntryOrder(layouts, {\r\n startAngle: radialMenuEntryStartAngle\r\n })\r\n\r\n return new Map(entryOrder.map((itemIndex, orderIndex) => [itemIndex, orderIndex]))\r\n}\r\n\r\nconst getRingItemEntryDistance = (index: number) =>\r\n normalizeRadialMenuAngle(getItemLayout(index).angle - radialMenuEntryStartAngle)\r\n\r\nconst getRingItemEntryDuration = (index: number) => {\r\n const distanceRatio = Math.min(getRingItemEntryDistance(index), 360) / 360\r\n\r\n return (\r\n radialMenuEntryItemMinDuration +\r\n (radialMenuEntryItemMaxDuration - radialMenuEntryItemMinDuration) * distanceRatio\r\n )\r\n}\r\n\r\nconst getRingItemEntryKeyframes = (index: number): RadialMenuEntryKeyframe[] => {\r\n const layout = getItemLayout(index)\r\n const finalOpacity = ringItems.value[index]?.disabled ? 0.5 : 1\r\n const points = getRadialMenuClockwiseArcPoints({\r\n radius: resolvedRadius.value,\r\n startAngle: radialMenuEntryStartAngle,\r\n targetAngle: layout.angle,\r\n steps: radialMenuEntryArcSteps\r\n })\r\n\r\n return points.map((point, pointIndex) => ({\r\n offset: pointIndex / (points.length - 1),\r\n opacity: pointIndex === 0 ? 0 : finalOpacity,\r\n transform: getEntryTransform(point.x, point.y, pointIndex === 0 ? 0.86 : 1)\r\n }))\r\n}\r\n\r\nconst playEntryAnimations = () => {\r\n if (prefersReducedMotion() || ringItems.value.length === 0) {\r\n isEntryAnimating.value = false\r\n return\r\n }\r\n\r\n const ringButtons = ringButtonRefs.value.slice(0, ringItems.value.length)\r\n const entryOrderByIndex = getEntryOrderByIndex()\r\n const animations: Animation[] = []\r\n let maxEntryEndTime = 0\r\n\r\n ringButtons.forEach((button, index) => {\r\n if (!button || !canAnimateElement(button)) {\r\n return\r\n }\r\n\r\n const orderIndex = entryOrderByIndex.get(index) ?? index\r\n const delay = radialMenuEntryTrackDelay + orderIndex * radialMenuEntryItemStagger\r\n const duration = getRingItemEntryDuration(index)\r\n const animation = button.animate(getRingItemEntryKeyframes(index), {\r\n delay,\r\n duration,\r\n easing: radialMenuEntryEasing,\r\n fill: 'both'\r\n })\r\n\r\n maxEntryEndTime = Math.max(maxEntryEndTime, delay + duration)\r\n animations.push(animation)\r\n })\r\n\r\n if (animations.length === 0) {\r\n isEntryAnimating.value = false\r\n return\r\n }\r\n\r\n entryAnimationToken += 1\r\n const token = entryAnimationToken\r\n\r\n entryAnimations = animations\r\n isEntryAnimating.value = true\r\n entryFinishTimer = setTimeout(() => finishEntryAnimations(token), Math.ceil(maxEntryEndTime) + 40)\r\n}\r\n\r\nwatch(opened, async (nextOpened) => {\r\n cancelEntryAnimations()\r\n\r\n if (!nextOpened) {\r\n return\r\n }\r\n\r\n isEntryAnimating.value =\r\n canUseWebAnimations() && !prefersReducedMotion() && ringItems.value.length > 0\r\n\r\n await nextTick()\r\n if (!opened.value) {\r\n return\r\n }\r\n\r\n playEntryAnimations()\r\n focusFirstAvailableRingItem()\r\n})\r\n\r\nwatch(\r\n opened,\r\n (nextOpened) => {\r\n if (nextOpened) {\r\n addDocumentPointerdown()\r\n } else {\r\n removeDocumentPointerdown()\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\nonBeforeUnmount(() => {\r\n removeDocumentPointerdown()\r\n cancelEntryAnimations()\r\n})\r\n\r\nconst handleCenterClick = () => {\r\n if (props.disabled || props.trigger !== 'click') {\r\n return\r\n }\r\n\r\n toggle({ reason: 'click' })\r\n}\r\n\r\nconst handleMouseEnter = () => {\r\n if (props.disabled || props.trigger !== 'hover') {\r\n return\r\n }\r\n\r\n open({ reason: 'hover' })\r\n}\r\n\r\nconst handleMouseLeave = () => {\r\n if (props.trigger !== 'hover') {\r\n return\r\n }\r\n\r\n close('hover-leave')\r\n}\r\n\r\nconst focus = () => {\r\n centerRef.value?.focus()\r\n}\r\n\r\ndefineExpose<FlRadialMenuExpose>({\r\n open: (options?: FlRadialMenuOpenOptions) => open(options),\r\n close,\r\n toggle,\r\n focus\r\n})\r\n</script>\r\n","<template>\r\n <div\r\n ref=\"rootRef\"\r\n :class=\"rootClass\"\r\n :style=\"rootStyle\"\r\n @mouseenter=\"handleMouseEnter\"\r\n @mouseleave=\"handleMouseLeave\">\r\n <button\r\n ref=\"centerRef\"\r\n type=\"button\"\r\n :class=\"ns.e('center')\"\r\n :disabled=\"props.disabled\"\r\n :aria-expanded=\"opened\"\r\n aria-haspopup=\"menu\"\r\n @click=\"handleCenterClick\">\r\n <slot name=\"center\">\r\n <component\r\n :is=\"props.centerIcon\"\r\n v-if=\"props.centerIcon && typeof props.centerIcon !== 'string'\" />\r\n <span v-else-if=\"props.centerIcon\" :class=\"ns.e('center-icon')\">\r\n {{ props.centerIcon }}\r\n </span>\r\n <span v-if=\"props.centerLabel\" :class=\"ns.e('center-label')\">{{ props.centerLabel }}</span>\r\n </slot>\r\n </button>\r\n\r\n <div v-if=\"opened\" :class=\"ns.e('panel')\" role=\"menu\" @keydown=\"handleMenuKeydown\">\r\n <svg :class=\"ns.e('sector')\" viewBox=\"-140 -140 280 280\" aria-hidden=\"true\">\r\n <circle :class=\"ns.e('track')\" cx=\"0\" cy=\"0\" :r=\"resolvedRadius\" />\r\n <path v-if=\"sectorPath\" :class=\"ns.e('sector-path')\" :d=\"sectorPath\" />\r\n <path v-if=\"activeTrackPath\" :class=\"ns.e('track-active')\" :d=\"activeTrackPath\" />\r\n </svg>\r\n\r\n <button\r\n v-for=\"(item, index) in ringItems\"\r\n :key=\"item.index\"\r\n :ref=\"(element) => setRingButtonRef(element, index)\"\r\n type=\"button\"\r\n role=\"menuitem\"\r\n :class=\"[\r\n ns.e('item'),\r\n ns.is('active', activeRingIndex === index),\r\n ns.is('disabled', item.disabled === true)\r\n ]\"\r\n :style=\"getItemStyle(index)\"\r\n :disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n :aria-disabled=\"item.disabled === true\"\r\n :aria-label=\"item.label\"\r\n :data-radial-menu-index=\"item.index\"\r\n @mouseenter=\"setActiveRingIndex(index)\"\r\n @focus=\"setActiveRingIndex(index)\"\r\n @mouseleave=\"setActiveRingIndex(null)\"\r\n @click=\"activateItem(item, 'ring', index, $event)\"\r\n @keydown=\"handleRingKeydown($event, index)\">\r\n <component\r\n :is=\"getItemIcon(item)\"\r\n v-if=\"getItemIcon(item) && typeof getItemIcon(item) !== 'string'\" />\r\n <span v-else-if=\"getItemIcon(item)\" :class=\"ns.e('item-icon')\">\r\n {{ getItemIcon(item) }}\r\n </span>\r\n <span :class=\"getItemLabelClass(index)\">\r\n <RadialMenuItemLabel :item=\"item\" />\r\n </span>\r\n </button>\r\n\r\n <button\r\n v-if=\"moreItems.length > 0\"\r\n type=\"button\"\r\n :class=\"ns.e('more')\"\r\n aria-haspopup=\"menu\"\r\n :aria-expanded=\"moreOpened\"\r\n @click=\"setMoreOpened(!moreOpened)\">\r\n {{ moreLabel }}\r\n </button>\r\n\r\n <div\r\n v-if=\"moreOpened\"\r\n :class=\"[ns.e('more-dropdown'), ns.m(`more-${props.moreDropdownPlacement}`)]\"\r\n role=\"menu\">\r\n <button\r\n v-for=\"(item, index) in moreItems\"\r\n :key=\"item.index\"\r\n :ref=\"(element) => setMoreButtonRef(element, index)\"\r\n type=\"button\"\r\n role=\"menuitem\"\r\n :class=\"[ns.e('more-item'), ns.is('disabled', item.disabled === true)]\"\r\n :disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n :aria-disabled=\"item.disabled === true\"\r\n :aria-label=\"item.label\"\r\n :data-radial-menu-more-index=\"item.index\"\r\n @click=\"activateItem(item, 'more', index, $event)\"\r\n @keydown=\"handleMoreKeydown($event, index)\">\r\n <span :class=\"ns.e('more-content')\">\r\n <component\r\n :is=\"getItemIcon(item)\"\r\n v-if=\"getItemIcon(item) && typeof getItemIcon(item) !== 'string'\"\r\n :class=\"ns.e('more-icon')\" />\r\n <span v-else-if=\"getItemIcon(item)\" :class=\"ns.e('more-icon')\">\r\n {{ getItemIcon(item) }}\r\n </span>\r\n <span :class=\"ns.e('more-label')\">\r\n <RadialMenuItemLabel :item=\"item\" />\r\n </span>\r\n </span>\r\n <span v-if=\"item.shortcut\" :class=\"ns.e('shortcut')\">{{ item.shortcut }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport {\r\n Fragment,\r\n computed,\r\n isVNode,\r\n nextTick,\r\n onBeforeUnmount,\r\n ref,\r\n toRef,\r\n useSlots,\r\n useTemplateRef,\r\n watch,\r\n type Component,\r\n type ComponentPublicInstance,\r\n type Slot,\r\n type VNode,\r\n type VNodeArrayChildren\r\n} from 'vue'\r\nimport { useGlobalSize } from 'element-plus'\r\nimport { useNamespace } from '@falcon-ui/utils'\r\nimport { flRadialMenuEmits, flRadialMenuProps } from './radial-menu'\r\nimport { normalizeRadialMenuItems, splitRadialMenuItems } from './use-radial-menu-items'\r\nimport { useRadialMenuKeyboard } from './use-radial-menu-keyboard'\r\nimport {\r\n getRadialMenuClockwiseArcPoints,\r\n getRadialMenuClockwiseEntryOrder,\r\n getRadialMenuItemLayout,\r\n getRadialMenuSectorPath,\r\n getRadialMenuTrackArcPath,\r\n getRadialMenuTipPlacement,\r\n normalizeRadialMenuAngle\r\n} from './use-radial-menu-position'\r\nimport { useRadialMenuShortcut } from './use-radial-menu-shortcut'\r\nimport { useRadialMenuState } from './use-radial-menu-state'\r\nimport type {\r\n FlRadialMenuExpose,\r\n FlRadialMenuOpenOptions,\r\n FlRadialMenuResolvableItem,\r\n FlRadialMenuResolvedItem,\r\n FlRadialMenuSize\r\n} from './types'\r\n\r\ntype RadialMenuEntryKeyframe = {\r\n offset: number\r\n opacity: number\r\n transform: string\r\n}\r\n\r\ndefineOptions({\r\n name: 'FlRadialMenu'\r\n})\r\n\r\nconst props = defineProps(flRadialMenuProps)\r\nconst emit = defineEmits(flRadialMenuEmits)\r\ndefineSlots<{\r\n default?: () => unknown\r\n center?: () => unknown\r\n}>()\r\nconst ns = useNamespace('radial-menu')\r\nconst slots = useSlots()\r\nconst rootRef = useTemplateRef<HTMLDivElement>('rootRef')\r\nconst centerRef = useTemplateRef<HTMLButtonElement>('centerRef')\r\nconst activeRingIndex = ref<number | null>(null)\r\nconst moreOpened = ref(false)\r\nconst isEntryAnimating = ref(false)\r\nconst ringButtonRefs = ref<HTMLButtonElement[]>([])\r\nconst moreButtonRefs = ref<HTMLButtonElement[]>([])\r\nconst warnedMessages = new Set<string>()\r\nconst globalSize = useGlobalSize()\r\nconst radialMenuEntryTrackDelay = 120\r\nconst radialMenuEntryItemMinDuration = 440\r\nconst radialMenuEntryItemMaxDuration = 600\r\nconst radialMenuEntryItemStagger = 90\r\nconst radialMenuEntryArcSteps = 9\r\nconst radialMenuEntryStartAngle = 180\r\nconst radialMenuEntryEasing = 'cubic-bezier(0.2, 0, 0, 1)'\r\nconst radialMenuGeometryBySize = {\r\n large: {\r\n radius: 96,\r\n centerSize: 56\r\n },\r\n medium: {\r\n radius: 80,\r\n centerSize: 48\r\n },\r\n small: {\r\n radius: 64,\r\n centerSize: 40\r\n }\r\n} satisfies Record<FlRadialMenuSize, { radius: number; centerSize: number }>\r\n\r\nconst mapGlobalSize = (size: '' | 'default' | 'large' | 'small'): FlRadialMenuSize => {\r\n if (size === 'large' || size === 'small') {\r\n return size\r\n }\r\n\r\n if (size === 'default') {\r\n return 'medium'\r\n }\r\n\r\n return 'large'\r\n}\r\n\r\nconst warnRadialMenu = (message: string) => {\r\n if (warnedMessages.has(message)) {\r\n return\r\n }\r\n\r\n warnedMessages.add(message)\r\n console.warn(`[FlRadialMenu] ${message}`)\r\n}\r\n\r\nconst flattenSlotVNodes = (children: VNodeArrayChildren): VNode[] => {\r\n const vnodes: VNode[] = []\r\n\r\n for (const child of children) {\r\n if (Array.isArray(child)) {\r\n vnodes.push(...flattenSlotVNodes(child as VNodeArrayChildren))\r\n continue\r\n }\r\n\r\n if (!isVNode(child)) {\r\n continue\r\n }\r\n\r\n if (child.type === Fragment && Array.isArray(child.children)) {\r\n vnodes.push(...flattenSlotVNodes(child.children as VNodeArrayChildren))\r\n continue\r\n }\r\n\r\n vnodes.push(child)\r\n }\r\n\r\n return vnodes\r\n}\r\n\r\nconst isRadialMenuItemVNode = (vnode: VNode) =>\r\n typeof vnode.type === 'object' && 'name' in vnode.type && vnode.type.name === 'FlRadialMenuItem'\r\n\r\nconst readBooleanSlotProp = (value: unknown) => value === true || value === ''\r\n\r\nconst readOptionalBooleanSlotProp = (value: unknown) =>\r\n value === undefined ? undefined : readBooleanSlotProp(value)\r\n\r\nconst readSlotItemSlots = (children: VNode['children']) => {\r\n if (!children || Array.isArray(children) || typeof children !== 'object') {\r\n return undefined\r\n }\r\n\r\n return children as Partial<Record<string, Slot>>\r\n}\r\n\r\nconst readSlotItemProps = (vnode: VNode): FlRadialMenuResolvableItem => {\r\n const vnodeProps = (vnode.props ?? {}) as Record<string, unknown>\r\n const vnodeSlots = readSlotItemSlots(vnode.children)\r\n\r\n return {\r\n index: typeof vnodeProps.index === 'string' ? vnodeProps.index : undefined,\r\n label: typeof vnodeProps.label === 'string' ? vnodeProps.label : '',\r\n icon: vnodeProps.icon as Component | undefined,\r\n shortcut: typeof vnodeProps.shortcut === 'string' ? vnodeProps.shortcut : undefined,\r\n disabled: readBooleanSlotProp(vnodeProps.disabled),\r\n hidden: readBooleanSlotProp(vnodeProps.hidden),\r\n divided: readBooleanSlotProp(vnodeProps.divided),\r\n closeOnSelect: readOptionalBooleanSlotProp(vnodeProps.closeOnSelect),\r\n meta:\r\n vnodeProps.meta && typeof vnodeProps.meta === 'object'\r\n ? (vnodeProps.meta as Record<string, unknown>)\r\n : undefined,\r\n iconSlot: vnodeSlots?.icon,\r\n labelSlot: vnodeSlots?.label\r\n }\r\n}\r\n\r\nconst slotItems = computed(() =>\r\n flattenSlotVNodes(slots.default?.() ?? [])\r\n .filter(isRadialMenuItemVNode)\r\n .map(readSlotItemProps)\r\n)\r\nconst resolvedItems = computed(() =>\r\n normalizeRadialMenuItems(slotItems.value.length > 0 ? slotItems.value : props.items, {\r\n warn: warnRadialMenu\r\n })\r\n)\r\nconst splitItems = computed(() => splitRadialMenuItems(resolvedItems.value, props.maxRingItems))\r\nconst ringItems = computed(() => splitItems.value.ringItems)\r\nconst moreItems = computed(() => splitItems.value.moreItems)\r\nconst resolvedSize = computed(() => props.size ?? mapGlobalSize(globalSize.value))\r\nconst sizeGeometry = computed(() => radialMenuGeometryBySize[resolvedSize.value])\r\nconst resolvedRadius = computed(() => sizeGeometry.value.radius)\r\nconst resolvedCenterSize = computed(() => sizeGeometry.value.centerSize)\r\nconst activeItem = computed(() =>\r\n activeRingIndex.value === null ? null : (ringItems.value[activeRingIndex.value] ?? null)\r\n)\r\nconst sectorInnerRadius = computed(() => resolvedCenterSize.value / 2 + 8)\r\nconst sectorPath = computed(() => {\r\n if (activeRingIndex.value === null || ringItems.value.length === 0) {\r\n return ''\r\n }\r\n\r\n return getRadialMenuSectorPath({\r\n activeIndex: activeRingIndex.value,\r\n count: ringItems.value.length,\r\n innerRadius: sectorInnerRadius.value,\r\n outerRadius: resolvedRadius.value\r\n })\r\n})\r\nconst activeTrackPath = computed(() => {\r\n if (activeRingIndex.value === null || ringItems.value.length === 0) {\r\n return ''\r\n }\r\n\r\n return getRadialMenuTrackArcPath({\r\n activeIndex: activeRingIndex.value,\r\n count: ringItems.value.length,\r\n radius: resolvedRadius.value,\r\n innerRadius: sectorInnerRadius.value\r\n })\r\n})\r\n\r\nconst { opened, floatingX, floatingY, open, close, toggle } = useRadialMenuState({\r\n modelValue: toRef(props, 'modelValue'),\r\n disabled: toRef(props, 'disabled'),\r\n emitUpdate: (nextOpened) => emit('update:modelValue', nextOpened)\r\n})\r\n\r\nuseRadialMenuShortcut({\r\n shortcut: toRef(props, 'shortcut'),\r\n enabled: computed(() => props.shortcutEnabled && Boolean(props.shortcut)),\r\n open\r\n})\r\n\r\nconst rootClass = computed(() => [\r\n ns.b(),\r\n ns.m(props.mode),\r\n ns.m(resolvedSize.value),\r\n ns.m(`item-${props.itemType}`),\r\n ns.is('opened', opened.value),\r\n ns.is('entering', isEntryAnimating.value),\r\n ns.is('disabled', props.disabled)\r\n])\r\n\r\nconst rootStyle = computed(() => ({\r\n '--fl-radial-menu-floating-x': `${floatingX.value ?? (typeof window === 'undefined' ? 0 : window.innerWidth / 2)}px`,\r\n '--fl-radial-menu-floating-y': `${floatingY.value ?? (typeof window === 'undefined' ? 0 : window.innerHeight / 2)}px`,\r\n '--fl-radial-menu-z-index': String(props.zIndex),\r\n '--fl-radial-menu-more-enter-delay': `${radialMenuEntryTrackDelay + Math.max(ringItems.value.length - 1, 0) * radialMenuEntryItemStagger}ms`\r\n}))\r\n\r\nconst getItemIcon = (item: FlRadialMenuResolvedItem) => item.iconSlot ?? item.icon\r\nconst RadialMenuItemLabel = ({ item }: { item: FlRadialMenuResolvedItem }) =>\r\n item.labelSlot?.() ?? item.label\r\n\r\nconst getItemLayout = (index: number) =>\r\n getRadialMenuItemLayout({\r\n count: ringItems.value.length,\r\n index,\r\n radius: resolvedRadius.value\r\n })\r\n\r\nconst formatEntryCoordinate = (value: number) => {\r\n const rounded = Math.abs(value) < 0.001 ? 0 : Number(value.toFixed(3))\r\n\r\n return `${rounded}px`\r\n}\r\n\r\nconst getEntryTransform = (x: number, y: number, scale = 1) =>\r\n `translate(calc(-50% + ${formatEntryCoordinate(x)}), calc(-50% + ${formatEntryCoordinate(y)})) scale(${scale})`\r\n\r\nconst prefersReducedMotion = () =>\r\n typeof window !== 'undefined' &&\r\n typeof window.matchMedia === 'function' &&\r\n window.matchMedia('(prefers-reduced-motion: reduce)').matches\r\n\r\nconst canUseWebAnimations = () =>\r\n typeof HTMLElement !== 'undefined' && typeof HTMLElement.prototype.animate === 'function'\r\n\r\nconst canAnimateElement = (element: HTMLElement) => typeof element.animate === 'function'\r\n\r\nconst getItemStyle = (index: number) => {\r\n const layout = getItemLayout(index)\r\n\r\n return {\r\n '--fl-radial-menu-item-x': `${layout.x}px`,\r\n '--fl-radial-menu-item-y': `${layout.y}px`,\r\n '--fl-radial-menu-item-index': String(index)\r\n }\r\n}\r\n\r\nconst getItemLabelClass = (index: number) => {\r\n const placement = getRadialMenuTipPlacement(getItemLayout(index))\r\n\r\n return [\r\n ns.e('item-label'),\r\n ns.em('item-label', `tip-${placement}`),\r\n moreItems.value.length > 0 && placement === 'bottom'\r\n ? ns.em('item-label', 'hidden-by-more')\r\n : ''\r\n ]\r\n}\r\n\r\nconst moreLabel = computed(() => {\r\n if (props.moreMode === 'ellipsis') {\r\n return '...'\r\n }\r\n\r\n if (props.moreMode === 'text') {\r\n return props.moreText\r\n }\r\n\r\n return `${props.moreText} ...`\r\n})\r\n\r\nconst setActiveRingIndex = (index: number | null) => {\r\n activeRingIndex.value = index\r\n emit('active-change', activeItem.value)\r\n}\r\n\r\nconst setRingButtonRef = (element: Element | ComponentPublicInstance | null, index: number) => {\r\n if (element instanceof HTMLButtonElement) {\r\n ringButtonRefs.value[index] = element\r\n } else {\r\n delete ringButtonRefs.value[index]\r\n }\r\n}\r\n\r\nconst setMoreButtonRef = (element: Element | ComponentPublicInstance | null, index: number) => {\r\n if (element instanceof HTMLButtonElement) {\r\n moreButtonRefs.value[index] = element\r\n } else {\r\n delete moreButtonRefs.value[index]\r\n }\r\n}\r\n\r\nconst setMoreOpened = (nextOpened: boolean) => {\r\n moreOpened.value = nextOpened\r\n if (nextOpened) {\r\n emit('more-open')\r\n } else {\r\n emit('more-close')\r\n }\r\n}\r\n\r\nlet isDocumentPointerdownBound = false\r\n\r\nconst removeDocumentPointerdown = () => {\r\n if (!isDocumentPointerdownBound || typeof document === 'undefined') {\r\n return\r\n }\r\n\r\n document.removeEventListener('pointerdown', handleDocumentPointerdown)\r\n isDocumentPointerdownBound = false\r\n}\r\n\r\nconst addDocumentPointerdown = () => {\r\n if (isDocumentPointerdownBound || typeof document === 'undefined') {\r\n return\r\n }\r\n\r\n document.addEventListener('pointerdown', handleDocumentPointerdown)\r\n isDocumentPointerdownBound = true\r\n}\r\n\r\nconst handleDocumentPointerdown = (event: PointerEvent) => {\r\n const { target } = event\r\n\r\n if (!(target instanceof Node)) {\r\n return\r\n }\r\n\r\n if (rootRef.value?.contains(target)) {\r\n return\r\n }\r\n\r\n moreOpened.value = false\r\n close('click-outside')\r\n}\r\n\r\nconst activateItem = (\r\n item: FlRadialMenuResolvedItem,\r\n source: 'ring' | 'more',\r\n index: number,\r\n event: MouseEvent | KeyboardEvent\r\n) => {\r\n if (item.disabled) {\r\n return\r\n }\r\n\r\n emit('select', item.index, [item.index], item, { source, index, event })\r\n\r\n const shouldClose = item.closeOnSelect ?? props.closeOnSelect\r\n if (shouldClose) {\r\n moreOpened.value = false\r\n close('select')\r\n }\r\n}\r\n\r\nconst activateKeyboardItem = (event: KeyboardEvent) => {\r\n const target = event.currentTarget\r\n if (!(target instanceof HTMLElement)) {\r\n return\r\n }\r\n\r\n target.click()\r\n}\r\n\r\nconst { focusFirstAvailableRingItem, handleMenuKeydown, handleRingKeydown, handleMoreKeydown } =\r\n useRadialMenuKeyboard({\r\n ringItems,\r\n moreItems,\r\n ringRefs: ringButtonRefs,\r\n moreRefs: moreButtonRefs,\r\n closeMenu: () => close('escape'),\r\n closeMore: () => {\r\n moreOpened.value = false\r\n },\r\n activateFocused: activateKeyboardItem\r\n })\r\n\r\nlet entryAnimations: Animation[] = []\r\nlet entryAnimationToken = 0\r\nlet entryFinishTimer: ReturnType<typeof setTimeout> | undefined\r\n\r\nconst clearEntryFinishTimer = () => {\r\n if (entryFinishTimer === undefined) {\r\n return\r\n }\r\n\r\n clearTimeout(entryFinishTimer)\r\n entryFinishTimer = undefined\r\n}\r\n\r\nconst cancelEntryAnimations = () => {\r\n entryAnimationToken += 1\r\n clearEntryFinishTimer()\r\n\r\n for (const animation of entryAnimations) {\r\n animation.cancel()\r\n }\r\n\r\n entryAnimations = []\r\n isEntryAnimating.value = false\r\n}\r\n\r\nconst finishEntryAnimations = (token: number) => {\r\n if (token !== entryAnimationToken) {\r\n return\r\n }\r\n\r\n clearEntryFinishTimer()\r\n\r\n for (const animation of entryAnimations) {\r\n animation.cancel()\r\n }\r\n\r\n entryAnimations = []\r\n isEntryAnimating.value = false\r\n}\r\n\r\nconst getEntryOrderByIndex = () => {\r\n const layouts = ringItems.value.map((_, index) => getItemLayout(index))\r\n const entryOrder = getRadialMenuClockwiseEntryOrder(layouts, {\r\n startAngle: radialMenuEntryStartAngle\r\n })\r\n\r\n return new Map(entryOrder.map((itemIndex, orderIndex) => [itemIndex, orderIndex]))\r\n}\r\n\r\nconst getRingItemEntryDistance = (index: number) =>\r\n normalizeRadialMenuAngle(getItemLayout(index).angle - radialMenuEntryStartAngle)\r\n\r\nconst getRingItemEntryDuration = (index: number) => {\r\n const distanceRatio = Math.min(getRingItemEntryDistance(index), 360) / 360\r\n\r\n return (\r\n radialMenuEntryItemMinDuration +\r\n (radialMenuEntryItemMaxDuration - radialMenuEntryItemMinDuration) * distanceRatio\r\n )\r\n}\r\n\r\nconst getRingItemEntryKeyframes = (index: number): RadialMenuEntryKeyframe[] => {\r\n const layout = getItemLayout(index)\r\n const finalOpacity = ringItems.value[index]?.disabled ? 0.5 : 1\r\n const points = getRadialMenuClockwiseArcPoints({\r\n radius: resolvedRadius.value,\r\n startAngle: radialMenuEntryStartAngle,\r\n targetAngle: layout.angle,\r\n steps: radialMenuEntryArcSteps\r\n })\r\n\r\n return points.map((point, pointIndex) => ({\r\n offset: pointIndex / (points.length - 1),\r\n opacity: pointIndex === 0 ? 0 : finalOpacity,\r\n transform: getEntryTransform(point.x, point.y, pointIndex === 0 ? 0.86 : 1)\r\n }))\r\n}\r\n\r\nconst playEntryAnimations = () => {\r\n if (prefersReducedMotion() || ringItems.value.length === 0) {\r\n isEntryAnimating.value = false\r\n return\r\n }\r\n\r\n const ringButtons = ringButtonRefs.value.slice(0, ringItems.value.length)\r\n const entryOrderByIndex = getEntryOrderByIndex()\r\n const animations: Animation[] = []\r\n let maxEntryEndTime = 0\r\n\r\n ringButtons.forEach((button, index) => {\r\n if (!button || !canAnimateElement(button)) {\r\n return\r\n }\r\n\r\n const orderIndex = entryOrderByIndex.get(index) ?? index\r\n const delay = radialMenuEntryTrackDelay + orderIndex * radialMenuEntryItemStagger\r\n const duration = getRingItemEntryDuration(index)\r\n const animation = button.animate(getRingItemEntryKeyframes(index), {\r\n delay,\r\n duration,\r\n easing: radialMenuEntryEasing,\r\n fill: 'both'\r\n })\r\n\r\n maxEntryEndTime = Math.max(maxEntryEndTime, delay + duration)\r\n animations.push(animation)\r\n })\r\n\r\n if (animations.length === 0) {\r\n isEntryAnimating.value = false\r\n return\r\n }\r\n\r\n entryAnimationToken += 1\r\n const token = entryAnimationToken\r\n\r\n entryAnimations = animations\r\n isEntryAnimating.value = true\r\n entryFinishTimer = setTimeout(() => finishEntryAnimations(token), Math.ceil(maxEntryEndTime) + 40)\r\n}\r\n\r\nwatch(opened, async (nextOpened) => {\r\n cancelEntryAnimations()\r\n\r\n if (!nextOpened) {\r\n return\r\n }\r\n\r\n isEntryAnimating.value =\r\n canUseWebAnimations() && !prefersReducedMotion() && ringItems.value.length > 0\r\n\r\n await nextTick()\r\n if (!opened.value) {\r\n return\r\n }\r\n\r\n playEntryAnimations()\r\n focusFirstAvailableRingItem()\r\n})\r\n\r\nwatch(\r\n opened,\r\n (nextOpened) => {\r\n if (nextOpened) {\r\n addDocumentPointerdown()\r\n } else {\r\n removeDocumentPointerdown()\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\nonBeforeUnmount(() => {\r\n removeDocumentPointerdown()\r\n cancelEntryAnimations()\r\n})\r\n\r\nconst handleCenterClick = () => {\r\n if (props.disabled || props.trigger !== 'click') {\r\n return\r\n }\r\n\r\n toggle({ reason: 'click' })\r\n}\r\n\r\nconst handleMouseEnter = () => {\r\n if (props.disabled || props.trigger !== 'hover') {\r\n return\r\n }\r\n\r\n open({ reason: 'hover' })\r\n}\r\n\r\nconst handleMouseLeave = () => {\r\n if (props.trigger !== 'hover') {\r\n return\r\n }\r\n\r\n close('hover-leave')\r\n}\r\n\r\nconst focus = () => {\r\n centerRef.value?.focus()\r\n}\r\n\r\ndefineExpose<FlRadialMenuExpose>({\r\n open: (options?: FlRadialMenuOpenOptions) => open(options),\r\n close,\r\n toggle,\r\n focus\r\n})\r\n</script>\r\n"],"mappings":"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"}
@@ -0,0 +1,163 @@
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 withInstall = (component) => {
62
+ const installable = component;
63
+ installable.install = (app) => {
64
+ if (!component.name) return;
65
+ app.component(component.name, component);
66
+ };
67
+ return installable;
68
+ };
69
+ const useMergedAttrs = ({ attrs, block, listenerName, onListener }) => {
70
+ const className = useNamespace(block).b();
71
+ return { mergedAttrs: (0, vue.computed)(() => {
72
+ const next = { ...attrs };
73
+ const originalListener = next[listenerName];
74
+ next.class = [className, next.class];
75
+ next[listenerName] = (...args) => {
76
+ onListener?.(...args);
77
+ invokeListener(originalListener, ...args);
78
+ };
79
+ return next;
80
+ }) };
81
+ };
82
+ const useMergedExpose = (extras) => {
83
+ const vm = (0, vue.getCurrentInstance)();
84
+ const changeRef = (exposed) => {
85
+ mergeComponentExpose(vm, exposed, extras);
86
+ };
87
+ return { changeRef };
88
+ };
89
+ const useClearableState = ({ attrs, isError, resolveClearValue = () => void 0 }) => {
90
+ const resolveClearable = () => {
91
+ const candidate = attrs.clearable;
92
+ if (typeof candidate === "boolean") return candidate;
93
+ return true;
94
+ };
95
+ const clearModelValue = () => {
96
+ invokeListener(attrs["onUpdate:modelValue"], resolveClearValue());
97
+ };
98
+ (0, vue.watch)(isError, (active, previousActive) => {
99
+ if (active && previousActive !== true) clearModelValue();
100
+ }, { immediate: true });
101
+ return {
102
+ clearModelValue,
103
+ resolveClearable
104
+ };
105
+ };
106
+ const flSelectProps = {
107
+ isError: {
108
+ type: Boolean,
109
+ default: false
110
+ },
111
+ isTable: {
112
+ type: Boolean,
113
+ default: false
114
+ }
115
+ };
116
+ const flSelectEmits = {};
117
+ var select_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ (0, vue.defineComponent)({
118
+ name: "FlSelect",
119
+ inheritAttrs: false,
120
+ __name: "select",
121
+ props: flSelectProps,
122
+ emits: flSelectEmits,
123
+ setup(__props, { expose: __expose }) {
124
+ const props = __props;
125
+ const attrs = (0, vue.useAttrs)();
126
+ const slots = (0, vue.useSlots)();
127
+ const rawAttrs = attrs;
128
+ const { changeRef } = useMergedExpose({});
129
+ const { mergedAttrs } = useMergedAttrs({
130
+ attrs: rawAttrs,
131
+ block: "select",
132
+ listenerName: "onChange"
133
+ });
134
+ const isMultipleMode = () => rawAttrs.multiple === true || rawAttrs.multiple === "";
135
+ const { resolveClearable } = useClearableState({
136
+ attrs: rawAttrs,
137
+ isError: () => props.isError,
138
+ resolveClearValue: () => isMultipleMode() ? [] : void 0
139
+ });
140
+ const mergedSelectAttrs = (0, vue.computed)(() => ({
141
+ ...mergedAttrs.value,
142
+ clearable: resolveClearable(),
143
+ class: [mergedAttrs.value.class, {
144
+ "is-error": props.isError,
145
+ "is-table": props.isTable
146
+ }]
147
+ }));
148
+ __expose({});
149
+ return (_ctx, _cache) => {
150
+ return (0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)((0, vue.h)((0, vue.unref)(element_plus.ElSelect), {
151
+ ...mergedSelectAttrs.value,
152
+ ref: (0, vue.unref)(changeRef)
153
+ }, (0, vue.unref)(slots))));
154
+ };
155
+ }
156
+ });
157
+ var select_default$1 = select_vue_vue_type_script_setup_true_lang_default;
158
+ const FlSelect = withInstall(select_default$1);
159
+ var select_default = FlSelect;
160
+ exports.FlSelect = FlSelect;
161
+ exports.default = select_default;
162
+
163
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["FlSelect: SFCWithInstall<typeof Select>"],"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/components/select/src/select.ts","../../../../../packages/components/select/src/select.vue","../../../../../packages/components/select/src/select.vue","../../../../../packages/components/select/index.ts"],"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","import type { ExtractPublicPropTypes } from 'vue'\r\n\r\nexport const flSelectProps = {\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 isTable: {\r\n type: Boolean,\r\n default: false\r\n }\r\n} as const\r\n\r\nexport const flSelectEmits = {} as const\r\n\r\nexport type FlSelectProps = ExtractPublicPropTypes<typeof flSelectProps>\r\nexport type FlSelectEmits = typeof flSelectEmits\r\nexport interface FlSelectExpose {\r\n focus: () => void\r\n blur: () => void\r\n selectedLabel?: string | string[]\r\n toggleMenu?: (event?: Event) => void\r\n handleClearClick?: (event: Event) => void\r\n}\r\n\r\nexport type SelectProps = FlSelectProps\r\nexport type SelectEmits = FlSelectEmits\r\nexport type SelectExpose = FlSelectExpose\r\n","<template>\r\n <component :is=\"h(ElSelect, { ...mergedSelectAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ElSelect } from 'element-plus'\r\nimport { computed, h, useAttrs, useSlots } from 'vue'\r\nimport { useClearableState, useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport type { FlSelectExpose } from './select'\r\nimport { flSelectEmits, flSelectProps } from './select'\r\n\r\ndefineOptions({\r\n name: 'FlSelect',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flSelectProps)\r\ndefineEmits(flSelectEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst { changeRef } = useMergedExpose({})\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: rawAttrs,\r\n block: 'select',\r\n listenerName: 'onChange'\r\n})\r\n\r\nconst isMultipleMode = () => rawAttrs.multiple === true || rawAttrs.multiple === ''\r\n\r\nconst { resolveClearable } = useClearableState({\r\n attrs: rawAttrs,\r\n isError: () => props.isError,\r\n resolveClearValue: () => (isMultipleMode() ? [] : undefined)\r\n})\r\n\r\nconst mergedSelectAttrs = computed(() => ({\r\n ...mergedAttrs.value,\r\n clearable: resolveClearable(),\r\n class: [mergedAttrs.value.class, { 'is-error': props.isError, 'is-table': props.isTable }]\r\n}))\r\n\r\ndefineExpose({} as FlSelectExpose)\r\n</script>\r\n","<template>\r\n <component :is=\"h(ElSelect, { ...mergedSelectAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ElSelect } from 'element-plus'\r\nimport { computed, h, useAttrs, useSlots } from 'vue'\r\nimport { useClearableState, useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport type { FlSelectExpose } from './select'\r\nimport { flSelectEmits, flSelectProps } from './select'\r\n\r\ndefineOptions({\r\n name: 'FlSelect',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flSelectProps)\r\ndefineEmits(flSelectEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst { changeRef } = useMergedExpose({})\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: rawAttrs,\r\n block: 'select',\r\n listenerName: 'onChange'\r\n})\r\n\r\nconst isMultipleMode = () => rawAttrs.multiple === true || rawAttrs.multiple === ''\r\n\r\nconst { resolveClearable } = useClearableState({\r\n attrs: rawAttrs,\r\n isError: () => props.isError,\r\n resolveClearValue: () => (isMultipleMode() ? [] : undefined)\r\n})\r\n\r\nconst mergedSelectAttrs = computed(() => ({\r\n ...mergedAttrs.value,\r\n clearable: resolveClearable(),\r\n class: [mergedAttrs.value.class, { 'is-error': props.isError, 'is-table': props.isTable }]\r\n}))\r\n\r\ndefineExpose({} as FlSelectExpose)\r\n</script>\r\n","import Select from './src/select.vue'\r\nimport { withInstall } from '@falcon-ui/utils'\r\nimport type { SFCWithInstall } from '@falcon-ui/utils'\r\n\r\nexport const FlSelect: SFCWithInstall<typeof Select> = withInstall(Select)\r\n\r\nexport default FlSelect\r\n\r\nexport type {\r\n FlSelectEmits,\r\n FlSelectExpose,\r\n FlSelectProps,\r\n SelectEmits,\r\n SelectExpose,\r\n SelectProps\r\n} from './src/select'\r\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const flSelectProps = {
3
+ isError: {
4
+ type: Boolean,
5
+ default: false
6
+ },
7
+ isTable: {
8
+ type: Boolean,
9
+ default: false
10
+ }
11
+ };
12
+ const flSelectEmits = {};
13
+ exports.flSelectEmits = flSelectEmits;
14
+ exports.flSelectProps = flSelectProps;
15
+
16
+ //# sourceMappingURL=select.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.cjs","names":[],"sources":["../../../../../../packages/components/select/src/select.ts"],"sourcesContent":["import type { ExtractPublicPropTypes } from 'vue'\r\n\r\nexport const flSelectProps = {\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 isTable: {\r\n type: Boolean,\r\n default: false\r\n }\r\n} as const\r\n\r\nexport const flSelectEmits = {} as const\r\n\r\nexport type FlSelectProps = ExtractPublicPropTypes<typeof flSelectProps>\r\nexport type FlSelectEmits = typeof flSelectEmits\r\nexport interface FlSelectExpose {\r\n focus: () => void\r\n blur: () => void\r\n selectedLabel?: string | string[]\r\n toggleMenu?: (event?: Event) => void\r\n handleClearClick?: (event: Event) => void\r\n}\r\n\r\nexport type SelectProps = FlSelectProps\r\nexport type SelectEmits = FlSelectEmits\r\nexport type SelectExpose = FlSelectExpose\r\n"],"mappings":";AAEA,MAAa,gBAAgB;CAI3B,SAAS;EACP,MAAM;EACN,SAAS;EACV;CAID,SAAS;EACP,MAAM;EACN,SAAS;EACV;CACF;AAED,MAAa,gBAAgB,EAAE"}
@@ -0,0 +1,152 @@
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 useMergedAttrs = ({ attrs, block, listenerName, onListener }) => {
62
+ const className = useNamespace(block).b();
63
+ return { mergedAttrs: (0, vue.computed)(() => {
64
+ const next = { ...attrs };
65
+ const originalListener = next[listenerName];
66
+ next.class = [className, next.class];
67
+ next[listenerName] = (...args) => {
68
+ onListener?.(...args);
69
+ invokeListener(originalListener, ...args);
70
+ };
71
+ return next;
72
+ }) };
73
+ };
74
+ const useMergedExpose = (extras) => {
75
+ const vm = (0, vue.getCurrentInstance)();
76
+ const changeRef = (exposed) => {
77
+ mergeComponentExpose(vm, exposed, extras);
78
+ };
79
+ return { changeRef };
80
+ };
81
+ const useClearableState = ({ attrs, isError, resolveClearValue = () => void 0 }) => {
82
+ const resolveClearable = () => {
83
+ const candidate = attrs.clearable;
84
+ if (typeof candidate === "boolean") return candidate;
85
+ return true;
86
+ };
87
+ const clearModelValue = () => {
88
+ invokeListener(attrs["onUpdate:modelValue"], resolveClearValue());
89
+ };
90
+ (0, vue.watch)(isError, (active, previousActive) => {
91
+ if (active && previousActive !== true) clearModelValue();
92
+ }, { immediate: true });
93
+ return {
94
+ clearModelValue,
95
+ resolveClearable
96
+ };
97
+ };
98
+ const flSelectProps = {
99
+ isError: {
100
+ type: Boolean,
101
+ default: false
102
+ },
103
+ isTable: {
104
+ type: Boolean,
105
+ default: false
106
+ }
107
+ };
108
+ const flSelectEmits = {};
109
+ var select_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ (0, vue.defineComponent)({
110
+ name: "FlSelect",
111
+ inheritAttrs: false,
112
+ __name: "select",
113
+ props: flSelectProps,
114
+ emits: flSelectEmits,
115
+ setup(__props, { expose: __expose }) {
116
+ const props = __props;
117
+ const attrs = (0, vue.useAttrs)();
118
+ const slots = (0, vue.useSlots)();
119
+ const rawAttrs = attrs;
120
+ const { changeRef } = useMergedExpose({});
121
+ const { mergedAttrs } = useMergedAttrs({
122
+ attrs: rawAttrs,
123
+ block: "select",
124
+ listenerName: "onChange"
125
+ });
126
+ const isMultipleMode = () => rawAttrs.multiple === true || rawAttrs.multiple === "";
127
+ const { resolveClearable } = useClearableState({
128
+ attrs: rawAttrs,
129
+ isError: () => props.isError,
130
+ resolveClearValue: () => isMultipleMode() ? [] : void 0
131
+ });
132
+ const mergedSelectAttrs = (0, vue.computed)(() => ({
133
+ ...mergedAttrs.value,
134
+ clearable: resolveClearable(),
135
+ class: [mergedAttrs.value.class, {
136
+ "is-error": props.isError,
137
+ "is-table": props.isTable
138
+ }]
139
+ }));
140
+ __expose({});
141
+ return (_ctx, _cache) => {
142
+ return (0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)((0, vue.h)((0, vue.unref)(element_plus.ElSelect), {
143
+ ...mergedSelectAttrs.value,
144
+ ref: (0, vue.unref)(changeRef)
145
+ }, (0, vue.unref)(slots))));
146
+ };
147
+ }
148
+ });
149
+ var select_default = select_vue_vue_type_script_setup_true_lang_default;
150
+ exports.default = select_default;
151
+
152
+ //# sourceMappingURL=select.vue.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.vue.cjs","names":[],"sources":["../../../../../../packages/utils/src/bem.ts","../../../../../../packages/utils/src/component.ts","../../../../../../packages/hooks/src/use-component.ts","../../../../../../packages/hooks/src/use-clearable-state.ts","../../../../../../packages/components/select/src/select.ts","../../../../../../packages/components/select/src/select.vue","../../../../../../packages/components/select/src/select.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 { 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","import type { ExtractPublicPropTypes } from 'vue'\r\n\r\nexport const flSelectProps = {\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 isTable: {\r\n type: Boolean,\r\n default: false\r\n }\r\n} as const\r\n\r\nexport const flSelectEmits = {} as const\r\n\r\nexport type FlSelectProps = ExtractPublicPropTypes<typeof flSelectProps>\r\nexport type FlSelectEmits = typeof flSelectEmits\r\nexport interface FlSelectExpose {\r\n focus: () => void\r\n blur: () => void\r\n selectedLabel?: string | string[]\r\n toggleMenu?: (event?: Event) => void\r\n handleClearClick?: (event: Event) => void\r\n}\r\n\r\nexport type SelectProps = FlSelectProps\r\nexport type SelectEmits = FlSelectEmits\r\nexport type SelectExpose = FlSelectExpose\r\n","<template>\r\n <component :is=\"h(ElSelect, { ...mergedSelectAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ElSelect } from 'element-plus'\r\nimport { computed, h, useAttrs, useSlots } from 'vue'\r\nimport { useClearableState, useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport type { FlSelectExpose } from './select'\r\nimport { flSelectEmits, flSelectProps } from './select'\r\n\r\ndefineOptions({\r\n name: 'FlSelect',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flSelectProps)\r\ndefineEmits(flSelectEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst { changeRef } = useMergedExpose({})\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: rawAttrs,\r\n block: 'select',\r\n listenerName: 'onChange'\r\n})\r\n\r\nconst isMultipleMode = () => rawAttrs.multiple === true || rawAttrs.multiple === ''\r\n\r\nconst { resolveClearable } = useClearableState({\r\n attrs: rawAttrs,\r\n isError: () => props.isError,\r\n resolveClearValue: () => (isMultipleMode() ? [] : undefined)\r\n})\r\n\r\nconst mergedSelectAttrs = computed(() => ({\r\n ...mergedAttrs.value,\r\n clearable: resolveClearable(),\r\n class: [mergedAttrs.value.class, { 'is-error': props.isError, 'is-table': props.isTable }]\r\n}))\r\n\r\ndefineExpose({} as FlSelectExpose)\r\n</script>\r\n","<template>\r\n <component :is=\"h(ElSelect, { ...mergedSelectAttrs, ref: changeRef }, slots)\" />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ElSelect } from 'element-plus'\r\nimport { computed, h, useAttrs, useSlots } from 'vue'\r\nimport { useClearableState, useMergedAttrs, useMergedExpose } from '@falcon-ui/hooks'\r\nimport type { FlSelectExpose } from './select'\r\nimport { flSelectEmits, flSelectProps } from './select'\r\n\r\ndefineOptions({\r\n name: 'FlSelect',\r\n inheritAttrs: false\r\n})\r\n\r\nconst props = defineProps(flSelectProps)\r\ndefineEmits(flSelectEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst { changeRef } = useMergedExpose({})\r\nconst { mergedAttrs } = useMergedAttrs({\r\n attrs: rawAttrs,\r\n block: 'select',\r\n listenerName: 'onChange'\r\n})\r\n\r\nconst isMultipleMode = () => rawAttrs.multiple === true || rawAttrs.multiple === ''\r\n\r\nconst { resolveClearable } = useClearableState({\r\n attrs: rawAttrs,\r\n isError: () => props.isError,\r\n resolveClearValue: () => (isMultipleMode() ? [] : undefined)\r\n})\r\n\r\nconst mergedSelectAttrs = computed(() => ({\r\n ...mergedAttrs.value,\r\n clearable: resolveClearable(),\r\n class: [mergedAttrs.value.class, { 'is-error': props.isError, 'is-table': props.isTable }]\r\n}))\r\n\r\ndefineExpose({} as FlSelectExpose)\r\n</script>\r\n"],"mappings":"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"}