foucui 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/README.md +43 -0
  2. package/components/QiuAffix/index.vue +186 -0
  3. package/components/QiuAlert/index.vue +208 -0
  4. package/components/QiuAnchor/context.ts +18 -0
  5. package/components/QiuAnchor/index.vue +180 -0
  6. package/components/QiuAnchorLink/index.vue +67 -0
  7. package/components/QiuApp/index.vue +9 -0
  8. package/components/QiuAutocomplete/index.vue +408 -0
  9. package/components/QiuAvatar/index.vue +140 -0
  10. package/components/QiuBacktop/index.vue +121 -0
  11. package/components/QiuBadge/api/index.ts +389 -0
  12. package/components/QiuBadge/components/BadgeImagePickerDialog.vue +243 -0
  13. package/components/QiuBadge/components/BadgeLibraryManagerDialog.vue +30 -0
  14. package/components/QiuBadge/components/BadgeLibraryPanel.vue +182 -0
  15. package/components/QiuBadge/composables/useTableHostHeight.ts +53 -0
  16. package/components/QiuBadge/index.ts +18 -0
  17. package/components/QiuBadge/shared/BadgeTemplateRenderer.vue +32 -0
  18. package/components/QiuBadge/shared/assetUrl.ts +26 -0
  19. package/components/QiuBadge/shared/badgeTemplate.ts +309 -0
  20. package/components/QiuBadge/utils/chinaAreaData.ts +44 -0
  21. package/components/QiuBadge/utils/hostRegion.ts +22 -0
  22. package/components/QiuBadge/utils/pca-code.json +1 -0
  23. package/components/QiuBadge/utils/pdfFromElement.ts +348 -0
  24. package/components/QiuBadge/views/BadgeLibraryView.vue +32 -0
  25. package/components/QiuBadge/views/BadgeManageView.vue +1364 -0
  26. package/components/QiuBadge/views/BadgeTemplateEditorView.vue +10 -0
  27. package/components/QiuBadge/views/BadgeTemplateListView.vue +229 -0
  28. package/components/QiuBadge/views/DeskLabelTemplateListView.vue +227 -0
  29. package/components/QiuBadge/views/DeskLabelView.vue +683 -0
  30. package/components/QiuBadgeDot/index.vue +87 -0
  31. package/components/QiuButton/index.vue +247 -0
  32. package/components/QiuButtonGroup/index.vue +63 -0
  33. package/components/QiuCanvasKit/QiuCanvasEditor.vue +5503 -0
  34. package/components/QiuCanvasKit/QiuCanvasRenderer.vue +348 -0
  35. package/components/QiuCanvasKit/assetUrl.ts +11 -0
  36. package/components/QiuCanvasKit/components/DataModulesPanel.vue +352 -0
  37. package/components/QiuCanvasKit/export/html.ts +132 -0
  38. package/components/QiuCanvasKit/export/pdf.ts +48 -0
  39. package/components/QiuCanvasKit/export/png.ts +50 -0
  40. package/components/QiuCanvasKit/index.ts +20 -0
  41. package/components/QiuCanvasKit/modules/badgeCompat.ts +84 -0
  42. package/components/QiuCanvasKit/modules/dataRegistry.ts +207 -0
  43. package/components/QiuCanvasKit/modules/merge.ts +71 -0
  44. package/components/QiuCanvasKit/presets/badge.ts +67 -0
  45. package/components/QiuCanvasKit/presets/banner.ts +79 -0
  46. package/components/QiuCanvasKit/types.ts +138 -0
  47. package/components/QiuCard/index.vue +104 -0
  48. package/components/QiuCarousel/context.ts +16 -0
  49. package/components/QiuCarousel/index.vue +343 -0
  50. package/components/QiuCarouselItem/index.vue +47 -0
  51. package/components/QiuCascader/index.vue +879 -0
  52. package/components/QiuCascader/types.ts +48 -0
  53. package/components/QiuCheckbox/QiuCheckboxGroup.vue +78 -0
  54. package/components/QiuCheckbox/index.vue +231 -0
  55. package/components/QiuCheckbox/types.ts +8 -0
  56. package/components/QiuCode/index.vue +64 -0
  57. package/components/QiuCol/col.scss +55 -0
  58. package/components/QiuCol/index.vue +64 -0
  59. package/components/QiuCollapse/context.ts +10 -0
  60. package/components/QiuCollapse/index.vue +70 -0
  61. package/components/QiuCollapseItem/index.vue +167 -0
  62. package/components/QiuColorField/index.vue +296 -0
  63. package/components/QiuColorPicker/README.md +118 -0
  64. package/components/QiuColorPicker/index.vue +60 -0
  65. package/components/QiuColorfulCard/index.vue +101 -0
  66. package/components/QiuCombobox/index.vue +277 -0
  67. package/components/QiuConfigProvider/index.vue +31 -0
  68. package/components/QiuContextMenu/index.vue +209 -0
  69. package/components/QiuDate/index.vue +1134 -0
  70. package/components/QiuDescriptions/context.ts +20 -0
  71. package/components/QiuDescriptions/index.vue +115 -0
  72. package/components/QiuDescriptionsItem/index.vue +103 -0
  73. package/components/QiuDialog/index.vue +828 -0
  74. package/components/QiuDigitalCard/index.vue +159 -0
  75. package/components/QiuDivider/index.vue +185 -0
  76. package/components/QiuDot/index.vue +83 -0
  77. package/components/QiuDrawer/index.vue +350 -0
  78. package/components/QiuDropdown/QiuDropdownItem.vue +74 -0
  79. package/components/QiuDropdown/QiuDropdownMenu.vue +22 -0
  80. package/components/QiuDropdown/context.ts +9 -0
  81. package/components/QiuDropdown/index.vue +189 -0
  82. package/components/QiuEmpty/index.vue +73 -0
  83. package/components/QiuForm/index.vue +172 -0
  84. package/components/QiuForm/types.ts +39 -0
  85. package/components/QiuFormItem/index.vue +276 -0
  86. package/components/QiuFullscreen/index.vue +11 -0
  87. package/components/QiuGrid/index.vue +408 -0
  88. package/components/QiuHoverCard/index.vue +192 -0
  89. package/components/QiuIcon/index.vue +117 -0
  90. package/components/QiuIconPicker/iconify.libraries.ts +182 -0
  91. package/components/QiuIconPicker/icons.catalog.ts +3072 -0
  92. package/components/QiuIconPicker/index.vue +488 -0
  93. package/components/QiuImage/index.vue +177 -0
  94. package/components/QiuInput/index.vue +328 -0
  95. package/components/QiuInputNumber/index.vue +295 -0
  96. package/components/QiuInputOtp/index.vue +190 -0
  97. package/components/QiuKbd/index.vue +57 -0
  98. package/components/QiuLayoutContainer/index.vue +50 -0
  99. package/components/QiuLinkPreview/index.vue +224 -0
  100. package/components/QiuLoading/index.ts +176 -0
  101. package/components/QiuLoading/spinner.vue +820 -0
  102. package/components/QiuLoading/types.ts +44 -0
  103. package/components/QiuMention/index.vue +299 -0
  104. package/components/QiuMenu/QiuMenuRoot.vue +241 -0
  105. package/components/QiuMenu/components/QiuMenuItem.vue +340 -0
  106. package/components/QiuMenu/components/QiuSubMenu.vue +504 -0
  107. package/components/QiuMenu/context.ts +21 -0
  108. package/components/QiuMenu/index.vue +43 -0
  109. package/components/QiuMenuNav/QiuMenuNavItem.vue +100 -0
  110. package/components/QiuMenuNav/QiuMenuNavSub.vue +120 -0
  111. package/components/QiuMenuNav/context.ts +14 -0
  112. package/components/QiuMenuNav/index.vue +148 -0
  113. package/components/QiuMsg/QiuMsgItem.vue +180 -0
  114. package/components/QiuMsg/index.ts +158 -0
  115. package/components/QiuMsg/types.ts +23 -0
  116. package/components/QiuMsgBox/index.ts +147 -0
  117. package/components/QiuNotification/QiuNotificationItem.vue +168 -0
  118. package/components/QiuNotification/index.ts +155 -0
  119. package/components/QiuNotification/types.ts +14 -0
  120. package/components/QiuPage/index.vue +12 -0
  121. package/components/QiuPageHeader/index.vue +115 -0
  122. package/components/QiuPageMain/index.vue +78 -0
  123. package/components/QiuPagination/index.vue +421 -0
  124. package/components/QiuPasswordStrength/index.vue +101 -0
  125. package/components/QiuPopconfirm/index.vue +196 -0
  126. package/components/QiuPopover/index.vue +277 -0
  127. package/components/QiuProgress/index.vue +235 -0
  128. package/components/QiuQrcode/index.vue +302 -0
  129. package/components/QiuQueryForm/components/QiuQueryFormBottomPanel.vue +13 -0
  130. package/components/QiuQueryForm/components/QiuQueryFormLeftPanel.vue +37 -0
  131. package/components/QiuQueryForm/components/QiuQueryFormRightPanel.vue +37 -0
  132. package/components/QiuQueryForm/components/QiuQueryFormTopPanel.vue +13 -0
  133. package/components/QiuQueryForm/index.vue +117 -0
  134. package/components/QiuRadio/QiuRadioGroup.vue +75 -0
  135. package/components/QiuRadio/index.vue +191 -0
  136. package/components/QiuRadio/types.ts +9 -0
  137. package/components/QiuRate/index.vue +184 -0
  138. package/components/QiuRefresh/index.vue +32 -0
  139. package/components/QiuResult/index.vue +103 -0
  140. package/components/QiuRow/index.vue +60 -0
  141. package/components/QiuRow/types.ts +5 -0
  142. package/components/QiuScrollbar/index.vue +107 -0
  143. package/components/QiuSearchBar/index.vue +154 -0
  144. package/components/QiuSegmented/index.vue +120 -0
  145. package/components/QiuSelect/QiuOption.vue +93 -0
  146. package/components/QiuSelect/index.vue +452 -0
  147. package/components/QiuSelect/types.ts +15 -0
  148. package/components/QiuSkeleton/index.vue +78 -0
  149. package/components/QiuSlider/index.vue +266 -0
  150. package/components/QiuSpace/index.vue +95 -0
  151. package/components/QiuSparkline/index.vue +92 -0
  152. package/components/QiuStatistic/index.vue +4 -0
  153. package/components/QiuStatistics/index.vue +123 -0
  154. package/components/QiuStep/index.vue +220 -0
  155. package/components/QiuSteps/context.ts +25 -0
  156. package/components/QiuSteps/index.vue +84 -0
  157. package/components/QiuSwitch/index.vue +145 -0
  158. package/components/QiuTabBar/index.vue +218 -0
  159. package/components/QiuTabBar/types.ts +19 -0
  160. package/components/QiuTabPane/index.vue +82 -0
  161. package/components/QiuTable/columns.ts +16 -0
  162. package/components/QiuTable/export.ts +102 -0
  163. package/components/QiuTable/index.ts +24 -0
  164. package/components/QiuTable/index.vue +3503 -0
  165. package/components/QiuTable/registry.ts +75 -0
  166. package/components/QiuTable/styles/table.scss +1230 -0
  167. package/components/QiuTable/types.ts +413 -0
  168. package/components/QiuTable/useArea.ts +202 -0
  169. package/components/QiuTable/useColumns.ts +325 -0
  170. package/components/QiuTable/useEdit.ts +136 -0
  171. package/components/QiuTable/useExtras.ts +115 -0
  172. package/components/QiuTable/useHistory.ts +77 -0
  173. package/components/QiuTable/useMerge.ts +105 -0
  174. package/components/QiuTable/useResize.ts +86 -0
  175. package/components/QiuTable/useScrollSync.ts +152 -0
  176. package/components/QiuTable/useVirtual.ts +97 -0
  177. package/components/QiuTable/utils.ts +165 -0
  178. package/components/QiuTableColumn/index.vue +101 -0
  179. package/components/QiuTag/index.vue +143 -0
  180. package/components/QiuText/index.vue +99 -0
  181. package/components/QiuTime/index.vue +548 -0
  182. package/components/QiuTimeAgo/index.vue +103 -0
  183. package/components/QiuTimeline/index.vue +54 -0
  184. package/components/QiuTimelineItem/index.vue +140 -0
  185. package/components/QiuTips/index.vue +323 -0
  186. package/components/QiuTooltip/index.vue +237 -0
  187. package/components/QiuTransfer/index.vue +277 -0
  188. package/components/QiuTree/QiuTreeNode.vue +146 -0
  189. package/components/QiuTree/index.vue +143 -0
  190. package/components/QiuTree/types.ts +30 -0
  191. package/components/QiuTreeSelect/index.vue +259 -0
  192. package/components/QiuTrend/index.vue +92 -0
  193. package/components/QiuUpload/index.vue +628 -0
  194. package/components/QiuUploadCrop/index.vue +1267 -0
  195. package/components/QiuWatermark/index.vue +121 -0
  196. package/components/useBodyScrollLock.ts +28 -0
  197. package/dist/components/QiuAnchor/context.d.ts +15 -0
  198. package/dist/components/QiuAnchorLink/index.vue.d.ts +23 -0
  199. package/dist/components/QiuBadge/api/index.d.ts +110 -0
  200. package/dist/components/QiuBadge/components/BadgeImagePickerDialog.vue.d.ts +16 -0
  201. package/dist/components/QiuBadge/components/BadgeLibraryManagerDialog.vue.d.ts +9 -0
  202. package/dist/components/QiuBadge/components/BadgeLibraryPanel.vue.d.ts +5 -0
  203. package/dist/components/QiuBadge/composables/useTableHostHeight.d.ts +7 -0
  204. package/dist/components/QiuBadge/index.d.ts +18 -0
  205. package/dist/components/QiuBadge/shared/BadgeTemplateRenderer.vue.d.ts +14 -0
  206. package/dist/components/QiuBadge/shared/assetUrl.d.ts +1 -0
  207. package/dist/components/QiuBadge/shared/badgeTemplate.d.ts +132 -0
  208. package/dist/components/QiuBadge/utils/chinaAreaData.d.ts +9 -0
  209. package/dist/components/QiuBadge/utils/hostRegion.d.ts +3 -0
  210. package/dist/components/QiuBadge/utils/pca-code.json.d.ts +3 -0
  211. package/dist/components/QiuBadge/utils/pdfFromElement.d.ts +14 -0
  212. package/dist/components/QiuBadge/views/BadgeLibraryView.vue.d.ts +2 -0
  213. package/dist/components/QiuBadge/views/BadgeManageView.vue.d.ts +7 -0
  214. package/dist/components/QiuBadge/views/BadgeTemplateListView.vue.d.ts +4 -0
  215. package/dist/components/QiuBadge/views/DeskLabelTemplateListView.vue.d.ts +4 -0
  216. package/dist/components/QiuBadge/views/DeskLabelView.vue.d.ts +4 -0
  217. package/dist/components/QiuButton/index.vue.d.ts +52 -0
  218. package/dist/components/QiuCanvasKit/QiuCanvasEditor.vue.d.ts +24 -0
  219. package/dist/components/QiuCanvasKit/QiuCanvasRenderer.vue.d.ts +13 -0
  220. package/dist/components/QiuCanvasKit/assetUrl.d.ts +7 -0
  221. package/dist/components/QiuCanvasKit/components/DataModulesPanel.vue.d.ts +23 -0
  222. package/dist/components/QiuCanvasKit/export/html.d.ts +12 -0
  223. package/dist/components/QiuCanvasKit/export/pdf.d.ts +9 -0
  224. package/dist/components/QiuCanvasKit/export/png.d.ts +8 -0
  225. package/dist/components/QiuCanvasKit/index.d.ts +19 -0
  226. package/dist/components/QiuCanvasKit/modules/badgeCompat.d.ts +8 -0
  227. package/dist/components/QiuCanvasKit/modules/dataRegistry.d.ts +23 -0
  228. package/dist/components/QiuCanvasKit/modules/merge.d.ts +12 -0
  229. package/dist/components/QiuCanvasKit/presets/badge.d.ts +12 -0
  230. package/dist/components/QiuCanvasKit/presets/banner.d.ts +4 -0
  231. package/dist/components/QiuCanvasKit/types.d.ts +119 -0
  232. package/dist/components/QiuCarousel/context.d.ts +13 -0
  233. package/dist/components/QiuCarouselItem/index.vue.d.ts +20 -0
  234. package/dist/components/QiuCascader/types.d.ts +25 -0
  235. package/dist/components/QiuCheckbox/QiuCheckboxGroup.vue.d.ts +33 -0
  236. package/dist/components/QiuCheckbox/index.vue.d.ts +38 -0
  237. package/dist/components/QiuCheckbox/types.d.ts +7 -0
  238. package/dist/components/QiuCode/index.vue.d.ts +15 -0
  239. package/dist/components/QiuCollapse/context.d.ts +8 -0
  240. package/dist/components/QiuCollapseItem/index.vue.d.ts +30 -0
  241. package/dist/components/QiuColorField/index.vue.d.ts +23 -0
  242. package/dist/components/QiuColorPicker/index.vue.d.ts +21 -0
  243. package/dist/components/QiuCombobox/index.vue.d.ts +54 -0
  244. package/dist/components/QiuContextMenu/index.vue.d.ts +46 -0
  245. package/dist/components/QiuDescriptions/context.d.ts +16 -0
  246. package/dist/components/QiuDescriptionsItem/index.vue.d.ts +25 -0
  247. package/dist/components/QiuDigitalCard/index.vue.d.ts +45 -0
  248. package/dist/components/QiuDropdown/QiuDropdownItem.vue.d.ts +30 -0
  249. package/dist/components/QiuDropdown/QiuDropdownMenu.vue.d.ts +17 -0
  250. package/dist/components/QiuDropdown/context.d.ts +7 -0
  251. package/dist/components/QiuDropdown/index.vue.d.ts +46 -0
  252. package/dist/components/QiuForm/types.d.ts +31 -0
  253. package/dist/components/QiuHoverCard/index.vue.d.ts +44 -0
  254. package/dist/components/QiuIcon/index.vue.d.ts +18 -0
  255. package/dist/components/QiuIconPicker/iconify.libraries.d.ts +18 -0
  256. package/dist/components/QiuIconPicker/icons.catalog.d.ts +12 -0
  257. package/dist/components/QiuInput/index.vue.d.ts +71 -0
  258. package/dist/components/QiuInputNumber/index.vue.d.ts +38 -0
  259. package/dist/components/QiuInputOtp/index.vue.d.ts +28 -0
  260. package/dist/components/QiuKbd/index.vue.d.ts +22 -0
  261. package/dist/components/QiuLayoutContainer/index.vue.d.ts +29 -0
  262. package/dist/components/QiuLinkPreview/index.vue.d.ts +43 -0
  263. package/dist/components/QiuLoading/index.d.ts +26 -0
  264. package/dist/components/QiuLoading/spinner.vue.d.ts +14 -0
  265. package/dist/components/QiuLoading/types.d.ts +2 -0
  266. package/dist/components/QiuMention/index.vue.d.ts +35 -0
  267. package/dist/components/QiuMenu/QiuMenuRoot.vue.d.ts +36 -0
  268. package/dist/components/QiuMenu/context.d.ts +19 -0
  269. package/dist/components/QiuMenuNav/QiuMenuNavItem.vue.d.ts +26 -0
  270. package/dist/components/QiuMenuNav/QiuMenuNavSub.vue.d.ts +25 -0
  271. package/dist/components/QiuMenuNav/context.d.ts +12 -0
  272. package/dist/components/QiuMenuNav/index.vue.d.ts +35 -0
  273. package/dist/components/QiuMsg/QiuMsgItem.vue.d.ts +15 -0
  274. package/dist/components/QiuMsg/index.d.ts +30 -0
  275. package/dist/components/QiuMsg/types.d.ts +12 -0
  276. package/dist/components/QiuMsgBox/index.d.ts +14 -0
  277. package/dist/components/QiuNotification/QiuNotificationItem.vue.d.ts +16 -0
  278. package/dist/components/QiuNotification/index.d.ts +30 -0
  279. package/dist/components/QiuNotification/types.d.ts +12 -0
  280. package/dist/components/QiuPageMain/index.vue.d.ts +27 -0
  281. package/dist/components/QiuPagination/index.vue.d.ts +44 -0
  282. package/dist/components/QiuPasswordStrength/index.vue.d.ts +9 -0
  283. package/dist/components/QiuQrcode/index.vue.d.ts +20 -0
  284. package/dist/components/QiuRadio/QiuRadioGroup.vue.d.ts +33 -0
  285. package/dist/components/QiuRadio/types.d.ts +8 -0
  286. package/dist/components/QiuRow/types.d.ts +4 -0
  287. package/dist/components/QiuSearchBar/index.vue.d.ts +38 -0
  288. package/dist/components/QiuSelect/QiuOption.vue.d.ts +24 -0
  289. package/dist/components/QiuSelect/index.vue.d.ts +52 -0
  290. package/dist/components/QiuSelect/types.d.ts +13 -0
  291. package/dist/components/QiuSparkline/index.vue.d.ts +18 -0
  292. package/dist/components/QiuStep/index.vue.d.ts +31 -0
  293. package/dist/components/QiuSteps/context.d.ts +21 -0
  294. package/dist/components/QiuSwitch/index.vue.d.ts +25 -0
  295. package/dist/components/QiuTabBar/index.vue.d.ts +32 -0
  296. package/dist/components/QiuTabBar/types.d.ts +16 -0
  297. package/dist/components/QiuTabPane/index.vue.d.ts +25 -0
  298. package/dist/components/QiuTable/columns.d.ts +1 -0
  299. package/dist/components/QiuTable/export.d.ts +18 -0
  300. package/dist/components/QiuTable/index.d.ts +3 -0
  301. package/dist/components/QiuTable/index.vue.d.ts +322 -0
  302. package/dist/components/QiuTable/registry.d.ts +39 -0
  303. package/dist/components/QiuTable/types.d.ts +353 -0
  304. package/dist/components/QiuTable/useArea.d.ts +51 -0
  305. package/dist/components/QiuTable/useColumns.d.ts +67 -0
  306. package/dist/components/QiuTable/useEdit.d.ts +36 -0
  307. package/dist/components/QiuTable/useExtras.d.ts +38 -0
  308. package/dist/components/QiuTable/useHistory.d.ts +44 -0
  309. package/dist/components/QiuTable/useMerge.d.ts +28 -0
  310. package/dist/components/QiuTable/useResize.d.ts +19 -0
  311. package/dist/components/QiuTable/useScrollSync.d.ts +25 -0
  312. package/dist/components/QiuTable/useVirtual.d.ts +30 -0
  313. package/dist/components/QiuTable/utils.d.ts +54 -0
  314. package/dist/components/QiuTime/index.vue.d.ts +43 -0
  315. package/dist/components/QiuTimeAgo/index.vue.d.ts +35 -0
  316. package/dist/components/QiuTimelineItem/index.vue.d.ts +35 -0
  317. package/dist/components/QiuTooltip/index.vue.d.ts +38 -0
  318. package/dist/components/QiuTree/types.d.ts +13 -0
  319. package/dist/components/QiuTrend/index.vue.d.ts +34 -0
  320. package/dist/components/QiuUpload/index.vue.d.ts +86 -0
  321. package/dist/components/QiuUploadCrop/index.vue.d.ts +136 -0
  322. package/dist/components/useBodyScrollLock.d.ts +4 -0
  323. package/dist/foucui.css +1 -0
  324. package/dist/foucui.js +26509 -0
  325. package/dist/foucui.umd.cjs +125 -0
  326. package/dist/index.d.ts +46 -0
  327. package/dist/src/bridge/@/api/media.d.ts +7 -0
  328. package/dist/src/bridge/@/api/notice.d.ts +5 -0
  329. package/dist/src/bridge/@/config/index.d.ts +29 -0
  330. package/dist/src/bridge/@/config/media.config.d.ts +15 -0
  331. package/dist/src/bridge/@/config/security.config.d.ts +7 -0
  332. package/dist/src/bridge/@/i18n/index.d.ts +7 -0
  333. package/dist/src/bridge/@/store/modules/bing.d.ts +3 -0
  334. package/dist/src/bridge/@/store/modules/errorLog.d.ts +3 -0
  335. package/dist/src/bridge/@/store/modules/media.d.ts +4 -0
  336. package/dist/src/bridge/@/store/modules/routes.d.ts +3 -0
  337. package/dist/src/bridge/@/store/modules/settings.d.ts +3 -0
  338. package/dist/src/bridge/@/store/modules/tabs.d.ts +3 -0
  339. package/dist/src/bridge/@/store/modules/user.d.ts +3 -0
  340. package/dist/src/bridge/@/utils/convertToCamelCase.d.ts +2 -0
  341. package/dist/src/bridge/@/utils/index.d.ts +5 -0
  342. package/dist/src/bridge/@/utils/pageTitle.d.ts +1 -0
  343. package/dist/src/bridge/@/utils/routes.d.ts +11 -0
  344. package/dist/src/bridge/@/utils/validate.d.ts +13 -0
  345. package/dist/src/bridge/@qiu/plugins/shortcuts.d.ts +2 -0
  346. package/dist/src/i18n.d.ts +2 -0
  347. package/package.json +83 -0
  348. package/plugins/qiu.ts +83 -0
  349. package/plugins/shortcuts.ts +69 -0
  350. package/src/bridge/@/api/media.ts +8 -0
  351. package/src/bridge/@/api/notice.ts +5 -0
  352. package/src/bridge/@/config/index.ts +38 -0
  353. package/src/bridge/@/config/media.config.ts +37 -0
  354. package/src/bridge/@/config/security.config.ts +8 -0
  355. package/src/bridge/@/i18n/index.ts +6 -0
  356. package/src/bridge/@/store/modules/bing.ts +9 -0
  357. package/src/bridge/@/store/modules/errorLog.ts +9 -0
  358. package/src/bridge/@/store/modules/media.ts +10 -0
  359. package/src/bridge/@/store/modules/routes.ts +10 -0
  360. package/src/bridge/@/store/modules/settings.ts +9 -0
  361. package/src/bridge/@/store/modules/tabs.ts +9 -0
  362. package/src/bridge/@/store/modules/user.ts +9 -0
  363. package/src/bridge/@/utils/convertToCamelCase.ts +11 -0
  364. package/src/bridge/@/utils/index.ts +9 -0
  365. package/src/bridge/@/utils/pageTitle.ts +4 -0
  366. package/src/bridge/@/utils/routes.ts +14 -0
  367. package/src/bridge/@/utils/validate.ts +17 -0
  368. package/src/bridge/@qiu/plugins/shortcuts.ts +3 -0
  369. package/src/i18n.ts +8 -0
  370. package/src/icons/qiu-logo.svg +1 -0
  371. package/styles/dark.scss +194 -0
  372. package/styles/normalize.css +349 -0
  373. package/styles/plain.scss +423 -0
  374. package/styles/qiu-tokens.scss +40 -0
  375. package/styles/qiu.scss +1149 -0
  376. package/styles/technology.scss +452 -0
  377. package/styles/var.scss +382 -0
  378. package/styles/variables.scss +77 -0
@@ -0,0 +1,408 @@
1
+ <template>
2
+ <div class="qiu-grid" :class="{ 'qiu-grid--loading': proxyLoading }">
3
+ <div v-if="showForm && ($slots.form || formConfig)" class="qiu-grid__form">
4
+ <slot name="form" :query="proxyQuery" :form="formModel" :reload="reload">
5
+ <div v-if="formFields.length" class="qiu-grid__form-inner">
6
+ <label v-for="f in formFields" :key="f.field" class="qiu-grid__form-item">
7
+ <span>{{ f.title || f.field }}</span>
8
+ <input
9
+ v-model="formModel[f.field]"
10
+ class="qiu-grid__form-input"
11
+ :placeholder="f.title || f.field"
12
+ @keydown.enter="reload()"
13
+ />
14
+ </label>
15
+ <button type="button" class="qiu-grid__form-btn" @click="reload()">查询</button>
16
+ <button type="button" class="qiu-grid__form-btn is-plain" @click="resetForm">重置</button>
17
+ </div>
18
+ </slot>
19
+ </div>
20
+
21
+ <qiu-table
22
+ ref="tableRef"
23
+ v-bind="tableBind"
24
+ :data="tableData"
25
+ :loading="proxyLoading || loading"
26
+ :pager-config="mergedPager"
27
+ :show-toolbar="showToolbar"
28
+ :show-export="toolbarConfig?.export !== false"
29
+ @page-change="onPageChange"
30
+ @refresh="reload"
31
+ @sort-change="onSortChange"
32
+ @filter-change="onFilterChange"
33
+ >
34
+ <template v-if="$slots.toolbar" #toolbar>
35
+ <slot name="toolbar" :reload="reload" :proxy="proxyState" />
36
+ </template>
37
+ <template v-if="$slots['toolbar-left']" #toolbar-left>
38
+ <slot name="toolbar-left" :reload="reload" :proxy="proxyState" />
39
+ </template>
40
+ <template v-if="$slots['toolbar-center']" #toolbar-center>
41
+ <slot name="toolbar-center" :reload="reload" :proxy="proxyState" />
42
+ </template>
43
+ <template v-if="$slots['toolbar-right']" #toolbar-right>
44
+ <slot name="toolbar-right" :reload="reload" :proxy="proxyState" />
45
+ </template>
46
+ <template v-if="$slots['toolbar-tools']" #toolbar-tools>
47
+ <slot name="toolbar-tools" />
48
+ </template>
49
+ <slot />
50
+ </qiu-table>
51
+ </div>
52
+ </template>
53
+
54
+ <script lang="ts" setup>
55
+ /**
56
+ * QiuGrid — 配置式表格(对齐 vxe-grid 开源能力子集)
57
+ * columns + toolbar + pager + 轻量 form + proxyConfig
58
+ */
59
+ import type {
60
+ QiuTableColumnConfig,
61
+ QiuTablePagerConfig,
62
+ QiuTableToolbarConfig,
63
+ QiuTableToolbarTool,
64
+ } from '../QiuTable/types'
65
+
66
+ defineOptions({ name: 'QiuGrid' })
67
+
68
+ export interface QiuGridFormItem {
69
+ field: string
70
+ title?: string
71
+ itemRender?: any
72
+ }
73
+
74
+ export interface QiuGridProxyAjax {
75
+ query?: (params: {
76
+ page: { currentPage: number; pageSize: number }
77
+ form: Record<string, any>
78
+ sorts?: { prop: string; order: string | null }[]
79
+ filters?: Record<string, any[]>
80
+ }) => Promise<
81
+ | { result?: any[]; page?: { total?: number }; data?: any[]; total?: number }
82
+ | any[]
83
+ >
84
+ delete?: (params: { body: any[] }) => Promise<any>
85
+ }
86
+
87
+ export interface QiuGridProxyConfig {
88
+ enabled?: boolean
89
+ autoLoad?: boolean
90
+ ajax?: QiuGridProxyAjax
91
+ props?: {
92
+ result?: string
93
+ total?: string
94
+ }
95
+ }
96
+
97
+ export interface QiuGridToolbarConfig {
98
+ enabled?: boolean
99
+ refresh?: boolean
100
+ export?: boolean
101
+ import?: boolean
102
+ print?: boolean
103
+ custom?: boolean
104
+ zoom?: boolean
105
+ /** Excel 复制按钮 */
106
+ copy?: boolean
107
+ /** 内置工具按钮位置,默认 right */
108
+ toolsPlacement?: 'left' | 'center' | 'right'
109
+ /** 自定义工具插件 */
110
+ customTools?: QiuTableToolbarTool[]
111
+ }
112
+
113
+ const props = withDefaults(
114
+ defineProps<{
115
+ columns?: QiuTableColumnConfig[]
116
+ data?: any[]
117
+ loading?: boolean
118
+ height?: string | number
119
+ maxHeight?: string | number
120
+ border?: boolean | string
121
+ stripe?: boolean
122
+ round?: boolean
123
+ editable?: boolean
124
+ editTrigger?: string
125
+ editConfig?: Record<string, any>
126
+ rowKey?: string | ((row: any) => string)
127
+ showIndex?: boolean
128
+ showSelection?: boolean
129
+ showFooter?: boolean
130
+ tree?: boolean
131
+ pagerConfig?: QiuTablePagerConfig | boolean
132
+ toolbarConfig?: QiuGridToolbarConfig | boolean
133
+ formConfig?: { items?: QiuGridFormItem[]; enabled?: boolean } | boolean
134
+ proxyConfig?: QiuGridProxyConfig
135
+ sortConfig?: Record<string, any>
136
+ filterConfig?: Record<string, any>
137
+ columnConfig?: Record<string, any>
138
+ rowConfig?: Record<string, any>
139
+ customConfig?: Record<string, any>
140
+ menuConfig?: Record<string, any>
141
+ editRules?: Record<string, any>
142
+ virtualYConfig?: Record<string, any> | boolean
143
+ spanMethod?: Function
144
+ mergeCells?: any[]
145
+ }>(),
146
+ {
147
+ columns: () => [],
148
+ data: () => [],
149
+ loading: false,
150
+ border: true,
151
+ proxyConfig: undefined,
152
+ }
153
+ )
154
+
155
+ const emit = defineEmits<{
156
+ 'proxy-query': [payload: any]
157
+ 'proxy-delete': [payload: any]
158
+ }>()
159
+
160
+ const tableRef = ref<any>(null)
161
+ const proxyLoading = ref(false)
162
+ const remoteData = ref<any[] | null>(null)
163
+ const remoteTotal = ref<number | null>(null)
164
+ const innerPage = ref(1)
165
+ const innerPageSize = ref(10)
166
+ const lastSort = ref<{ prop: string; order: string | null } | null>(null)
167
+ const lastFilters = ref<Record<string, any[]>>({})
168
+ const formModel = reactive<Record<string, any>>({})
169
+
170
+ const toolbarConfig = computed(() => {
171
+ if (props.toolbarConfig === false) return { enabled: false }
172
+ if (props.toolbarConfig === true || props.toolbarConfig == null) {
173
+ return { enabled: true, refresh: true, export: true, zoom: true, custom: true }
174
+ }
175
+ return { enabled: true, ...props.toolbarConfig }
176
+ })
177
+
178
+ const showToolbar = computed(() => toolbarConfig.value.enabled !== false)
179
+
180
+ const tableToolbarConfig = computed((): QiuTableToolbarConfig => {
181
+ const cfg = toolbarConfig.value
182
+ return {
183
+ enabled: cfg.enabled,
184
+ refresh: cfg.refresh,
185
+ export: cfg.export,
186
+ import: cfg.import,
187
+ print: cfg.print,
188
+ custom: cfg.custom,
189
+ zoom: cfg.zoom,
190
+ copy: cfg.copy,
191
+ toolsPlacement: cfg.toolsPlacement,
192
+ customTools: cfg.customTools,
193
+ }
194
+ })
195
+
196
+ const slots = useSlots()
197
+
198
+ const showForm = computed(() => {
199
+ if (props.formConfig === false) return false
200
+ if (props.formConfig === true) return true
201
+ if (props.formConfig && typeof props.formConfig === 'object') {
202
+ return props.formConfig.enabled !== false
203
+ }
204
+ return !!slots.form
205
+ })
206
+
207
+ const formFields = computed(() => {
208
+ if (props.formConfig && typeof props.formConfig === 'object') {
209
+ return props.formConfig.items || []
210
+ }
211
+ return [] as QiuGridFormItem[]
212
+ })
213
+
214
+ watch(
215
+ formFields,
216
+ (items) => {
217
+ items.forEach((f) => {
218
+ if (!(f.field in formModel)) formModel[f.field] = ''
219
+ })
220
+ },
221
+ { immediate: true }
222
+ )
223
+
224
+ const proxyEnabled = computed(
225
+ () =>
226
+ props.proxyConfig?.enabled !== false &&
227
+ !!props.proxyConfig?.ajax?.query
228
+ )
229
+
230
+ const tableData = computed(() => {
231
+ if (proxyEnabled.value && remoteData.value) return remoteData.value
232
+ return props.data || []
233
+ })
234
+
235
+ const mergedPager = computed(() => {
236
+ const base =
237
+ props.pagerConfig === true
238
+ ? { enabled: true }
239
+ : props.pagerConfig && typeof props.pagerConfig === 'object'
240
+ ? { ...props.pagerConfig }
241
+ : proxyEnabled.value
242
+ ? { enabled: true }
243
+ : false
244
+ if (!base || base === false) return false
245
+ return {
246
+ ...base,
247
+ currentPage: innerPage.value,
248
+ pageSize: innerPageSize.value,
249
+ total: remoteTotal.value ?? base.total ?? tableData.value.length,
250
+ }
251
+ })
252
+
253
+ const tableBind = computed(() => {
254
+ const {
255
+ data: _d,
256
+ loading: _l,
257
+ pagerConfig: _p,
258
+ toolbarConfig: _t,
259
+ formConfig: _f,
260
+ proxyConfig: _px,
261
+ ...rest
262
+ } = props
263
+ return {
264
+ ...rest,
265
+ toolbarConfig: tableToolbarConfig.value,
266
+ showExport: toolbarConfig.value.export !== false,
267
+ customConfig:
268
+ props.customConfig ||
269
+ (toolbarConfig.value.custom !== false ? { enabled: true } : undefined),
270
+ showPrint: toolbarConfig.value.print === true,
271
+ showImport: toolbarConfig.value.import === true,
272
+ showCopy: toolbarConfig.value.copy === true,
273
+ }
274
+ })
275
+
276
+ const proxyState = computed(() => ({
277
+ loading: proxyLoading.value,
278
+ data: tableData.value,
279
+ total: remoteTotal.value,
280
+ form: formModel,
281
+ }))
282
+
283
+ const getByPath = (obj: any, path: string) => {
284
+ if (!path) return obj
285
+ return path.split('.').reduce((o, k) => (o == null ? o : o[k]), obj)
286
+ }
287
+
288
+ const reload = async () => {
289
+ if (!proxyEnabled.value || !props.proxyConfig?.ajax?.query) {
290
+ emit('proxy-query', { form: { ...formModel } })
291
+ return
292
+ }
293
+ proxyLoading.value = true
294
+ try {
295
+ const res = await props.proxyConfig.ajax.query({
296
+ page: { currentPage: innerPage.value, pageSize: innerPageSize.value },
297
+ form: { ...formModel },
298
+ sorts: lastSort.value ? [lastSort.value] : [],
299
+ filters: lastFilters.value,
300
+ })
301
+ const resultPath = props.proxyConfig.props?.result || 'result'
302
+ const totalPath = props.proxyConfig.props?.total || 'page.total'
303
+ if (Array.isArray(res)) {
304
+ remoteData.value = res
305
+ remoteTotal.value = res.length
306
+ } else {
307
+ const list = getByPath(res, resultPath) ?? (res as any).data ?? []
308
+ remoteData.value = Array.isArray(list) ? list : []
309
+ const total =
310
+ getByPath(res, totalPath) ??
311
+ (res as any).total ??
312
+ (res as any).page?.total ??
313
+ remoteData.value.length
314
+ remoteTotal.value = Number(total) || 0
315
+ }
316
+ emit('proxy-query', { form: { ...formModel }, result: remoteData.value })
317
+ } finally {
318
+ proxyLoading.value = false
319
+ }
320
+ }
321
+
322
+ const resetForm = () => {
323
+ Object.keys(formModel).forEach((k) => {
324
+ formModel[k] = ''
325
+ })
326
+ innerPage.value = 1
327
+ reload()
328
+ }
329
+
330
+ const proxyQuery = reload
331
+
332
+ const onPageChange = (p: { currentPage: number; pageSize: number }) => {
333
+ innerPage.value = p.currentPage
334
+ innerPageSize.value = p.pageSize
335
+ if (proxyEnabled.value) reload()
336
+ }
337
+
338
+ const onSortChange = (p: { prop: string; order: string | null }) => {
339
+ lastSort.value = p
340
+ if (props.sortConfig?.remote && proxyEnabled.value) reload()
341
+ }
342
+
343
+ const onFilterChange = (p: Record<string, any[]>) => {
344
+ lastFilters.value = p
345
+ if (props.filterConfig?.remote && proxyEnabled.value) reload()
346
+ }
347
+
348
+ onMounted(() => {
349
+ if (proxyEnabled.value && props.proxyConfig?.autoLoad !== false) reload()
350
+ })
351
+
352
+ defineExpose({
353
+ reload,
354
+ getTable: () => tableRef.value,
355
+ commitProxy: reload,
356
+ formModel,
357
+ })
358
+ </script>
359
+
360
+ <style lang="scss" scoped>
361
+ .qiu-grid {
362
+ display: flex;
363
+ flex-direction: column;
364
+ gap: 8px;
365
+ width: 100%;
366
+ min-height: 0;
367
+ }
368
+
369
+ .qiu-grid__form-inner {
370
+ display: flex;
371
+ flex-wrap: wrap;
372
+ gap: 8px 12px;
373
+ align-items: flex-end;
374
+ padding: 8px 0;
375
+ }
376
+
377
+ .qiu-grid__form-item {
378
+ display: flex;
379
+ flex-direction: column;
380
+ gap: 4px;
381
+ font-size: 12px;
382
+ color: #606266;
383
+ }
384
+
385
+ .qiu-grid__form-input {
386
+ min-width: 140px;
387
+ height: 28px;
388
+ padding: 0 8px;
389
+ border: 1px solid #dcdfe6;
390
+ border-radius: 4px;
391
+ }
392
+
393
+ .qiu-grid__form-btn {
394
+ height: 28px;
395
+ padding: 0 12px;
396
+ color: #fff;
397
+ border: 1px solid var(--qiu-color-primary, #0f766e);
398
+ border-radius: 4px;
399
+ background: var(--qiu-color-primary, #0f766e);
400
+ cursor: pointer;
401
+
402
+ &.is-plain {
403
+ color: #606266;
404
+ background: #fff;
405
+ border-color: #dcdfe6;
406
+ }
407
+ }
408
+ </style>
@@ -0,0 +1,192 @@
1
+ <template>
2
+ <span ref="triggerRef" class="qiu-hover-card" @mouseenter="onEnter" @mouseleave="onLeave">
3
+ <slot name="trigger" />
4
+ </span>
5
+
6
+ <Teleport to="body">
7
+ <Transition name="qiu-hover-card-fade">
8
+ <div
9
+ v-if="visible"
10
+ ref="cardRef"
11
+ class="qiu-hover-card__panel"
12
+ :class="[`qiu-hover-card--${placement}`]"
13
+ :style="panelStyle"
14
+ @mouseenter="onCardEnter"
15
+ @mouseleave="onCardLeave"
16
+ >
17
+ <div v-if="title || $slots.title" class="qiu-hover-card__title">
18
+ <slot name="title">{{ title }}</slot>
19
+ </div>
20
+ <div class="qiu-hover-card__body">
21
+ <slot />
22
+ </div>
23
+ </div>
24
+ </Transition>
25
+ </Teleport>
26
+ </template>
27
+
28
+ <script lang="ts" setup>
29
+ import { nextTick, ref } from 'vue'
30
+
31
+ defineOptions({ name: 'QiuHoverCard' })
32
+
33
+ type Placement = 'top' | 'bottom' | 'left' | 'right'
34
+
35
+ const props = withDefaults(
36
+ defineProps<{
37
+ title?: string
38
+ placement?: Placement
39
+ width?: number
40
+ /** 悬停延迟(ms) */
41
+ openDelay?: number
42
+ closeDelay?: number
43
+ }>(),
44
+ {
45
+ title: '',
46
+ placement: 'top',
47
+ width: 280,
48
+ openDelay: 80,
49
+ closeDelay: 120,
50
+ }
51
+ )
52
+
53
+ const emit = defineEmits<{ visibleChange: [boolean] }>()
54
+
55
+ const triggerRef = ref<HTMLElement | null>(null)
56
+ const cardRef = ref<HTMLElement | null>(null)
57
+ const visible = ref(false)
58
+ const panelStyle = ref<Record<string, string>>({})
59
+ let openTimer: ReturnType<typeof setTimeout> | undefined
60
+ let closeTimer: ReturnType<typeof setTimeout> | undefined
61
+ let inCard = false
62
+
63
+ const clearTimers = () => {
64
+ if (openTimer) clearTimeout(openTimer)
65
+ if (closeTimer) clearTimeout(closeTimer)
66
+ }
67
+
68
+ const open = async () => {
69
+ clearTimers()
70
+ openTimer = setTimeout(async () => {
71
+ visible.value = true
72
+ emit('visibleChange', true)
73
+ await nextTick()
74
+ updatePosition()
75
+ }, props.openDelay)
76
+ }
77
+
78
+ const scheduleClose = () => {
79
+ clearTimers()
80
+ closeTimer = setTimeout(() => {
81
+ if (!inCard) {
82
+ visible.value = false
83
+ emit('visibleChange', false)
84
+ }
85
+ }, props.closeDelay)
86
+ }
87
+
88
+ const onEnter = () => open()
89
+ const onLeave = () => scheduleClose()
90
+ const onCardEnter = () => {
91
+ inCard = true
92
+ clearTimers()
93
+ }
94
+ const onCardLeave = () => {
95
+ inCard = false
96
+ scheduleClose()
97
+ }
98
+
99
+ const updatePosition = () => {
100
+ const trigger = triggerRef.value
101
+ const card = cardRef.value
102
+ if (!trigger || !card) return
103
+ const rect = trigger.getBoundingClientRect()
104
+ const cardRect = card.getBoundingClientRect()
105
+ const gap = 10
106
+ let top = 0
107
+ let left = 0
108
+ switch (props.placement) {
109
+ case 'top':
110
+ top = rect.top - cardRect.height - gap
111
+ left = rect.left + rect.width / 2 - cardRect.width / 2
112
+ break
113
+ case 'left':
114
+ top = rect.top + rect.height / 2 - cardRect.height / 2
115
+ left = rect.left - cardRect.width - gap
116
+ break
117
+ case 'right':
118
+ top = rect.top + rect.height / 2 - cardRect.height / 2
119
+ left = rect.right + gap
120
+ break
121
+ default:
122
+ top = rect.bottom + gap
123
+ left = rect.left + rect.width / 2 - cardRect.width / 2
124
+ }
125
+ left = Math.min(Math.max(4, left), window.innerWidth - cardRect.width - 4)
126
+ top = Math.min(Math.max(4, top), window.innerHeight - cardRect.height - 4)
127
+ panelStyle.value = {
128
+ position: 'fixed',
129
+ top: `${top}px`,
130
+ left: `${left}px`,
131
+ width: `${props.width}px`,
132
+ zIndex: '2100',
133
+ }
134
+ }
135
+
136
+ const onScrollOrResize = () => visible.value && updatePosition()
137
+
138
+ watch(visible, (v) => {
139
+ if (v) {
140
+ window.addEventListener('scroll', onScrollOrResize, true)
141
+ window.addEventListener('resize', onScrollOrResize)
142
+ } else {
143
+ window.removeEventListener('scroll', onScrollOrResize, true)
144
+ window.removeEventListener('resize', onScrollOrResize)
145
+ }
146
+ })
147
+
148
+ onBeforeUnmount(() => {
149
+ clearTimers()
150
+ window.removeEventListener('scroll', onScrollOrResize, true)
151
+ window.removeEventListener('resize', onScrollOrResize)
152
+ })
153
+ </script>
154
+
155
+ <style lang="scss" scoped>
156
+ .qiu-hover-card {
157
+ display: inline-flex;
158
+ vertical-align: middle;
159
+ }
160
+
161
+ .qiu-hover-card__panel {
162
+ box-sizing: border-box;
163
+ background: var(--qiu-bg-color-overlay, #fff);
164
+ border: 1px solid var(--qiu-border-color-light, #e4e7ed);
165
+ border-radius: 8px;
166
+ box-shadow: var(--qiu-box-shadow-light, 0 6px 16px rgba(0, 0, 0, 0.12));
167
+ }
168
+
169
+ .qiu-hover-card__title {
170
+ padding: 12px 14px 4px;
171
+ font-size: 14px;
172
+ font-weight: 600;
173
+ color: var(--qiu-text-color-primary, #303133);
174
+ }
175
+
176
+ .qiu-hover-card__body {
177
+ padding: 8px 14px 14px;
178
+ font-size: 13px;
179
+ line-height: 1.6;
180
+ color: var(--qiu-text-color-regular, #606266);
181
+ }
182
+
183
+ .qiu-hover-card-fade-enter-active,
184
+ .qiu-hover-card-fade-leave-active {
185
+ transition: opacity 0.15s ease;
186
+ }
187
+
188
+ .qiu-hover-card-fade-enter-from,
189
+ .qiu-hover-card-fade-leave-to {
190
+ opacity: 0;
191
+ }
192
+ </style>
@@ -0,0 +1,117 @@
1
+ <template>
2
+ <span
3
+ v-if="isIconify"
4
+ aria-hidden="true"
5
+ class="qiu-icon qiu-icon--iconify"
6
+ @click="onClick"
7
+ >
8
+ <Icon :icon="iconifyName" width="1em" height="1em" />
9
+ </span>
10
+ <svg
11
+ v-else-if="isCustomSvg"
12
+ aria-hidden="true"
13
+ class="qiu-icon qiu-icon--svg"
14
+ :class="{ 'is-keep-color': keepColor }"
15
+ :viewBox="viewBox || undefined"
16
+ @click="onClick"
17
+ >
18
+ <use :href="symbolHref" :xlink:href="symbolHref" />
19
+ </svg>
20
+ <i
21
+ v-else
22
+ aria-hidden="true"
23
+ class="qiu-icon"
24
+ :class="riClass"
25
+ @click="onClick"
26
+ />
27
+ </template>
28
+
29
+ <script lang="ts" setup>
30
+ /**
31
+ * QiuIcon
32
+ * - Remix 本地字体:home-2-line / ri-home-2-line
33
+ * - Iconify:mdi:home / ant-design:home-outlined
34
+ * - 自定义 SVG:isCustomSvg + vite-plugin-svg-icons
35
+ */
36
+ import { Icon } from '@iconify/vue'
37
+
38
+ defineOptions({
39
+ name: 'QiuIcon',
40
+ })
41
+
42
+ const props = withDefaults(
43
+ defineProps<{
44
+ icon?: string
45
+ isCustomSvg?: boolean
46
+ /** 保留 SVG 原色(布局预览等多色图标) */
47
+ keepColor?: boolean
48
+ viewBox?: string
49
+ }>(),
50
+ {
51
+ icon: '',
52
+ isCustomSvg: false,
53
+ keepColor: false,
54
+ viewBox: '',
55
+ }
56
+ )
57
+
58
+ const emit = defineEmits<{ click: [MouseEvent] }>()
59
+
60
+ const iconName = computed(() => String(props.icon || '').trim())
61
+
62
+ const isIconify = computed(() => {
63
+ const name = iconName.value
64
+ return !!name && name.includes(':') && !name.startsWith('http') && !props.isCustomSvg
65
+ })
66
+
67
+ const iconifyName = computed(() => iconName.value)
68
+
69
+ const riClass = computed(() => {
70
+ const name = iconName.value
71
+ if (!name) return ''
72
+ return name.startsWith('ri-') ? name : `ri-${name}`
73
+ })
74
+
75
+ const symbolHref = computed(() => `#qiu-icon-${iconName.value}`)
76
+
77
+ const onClick = (e: MouseEvent) => emit('click', e)
78
+ </script>
79
+
80
+ <style scoped>
81
+ .qiu-icon {
82
+ display: inline-flex;
83
+ align-items: center;
84
+ justify-content: center;
85
+ width: 1em;
86
+ height: 1em;
87
+ font-family: remixicon !important;
88
+ font-size: inherit;
89
+ font-style: normal;
90
+ line-height: 1;
91
+ vertical-align: middle;
92
+ speak: never;
93
+ }
94
+
95
+ .qiu-icon--svg {
96
+ width: 1em;
97
+ height: 1em;
98
+ overflow: hidden;
99
+ /* 单色图标可用 currentColor;多色自定义 SVG 由使用方覆盖 fill */
100
+ fill: currentColor;
101
+ }
102
+
103
+ .qiu-icon--svg.is-keep-color,
104
+ .qiu-icon--svg[data-keep-color] {
105
+ fill: unset;
106
+ }
107
+
108
+ .qiu-icon--iconify {
109
+ font-family: inherit !important;
110
+
111
+ :deep(svg) {
112
+ display: block;
113
+ width: 1em;
114
+ height: 1em;
115
+ }
116
+ }
117
+ </style>