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,548 @@
1
+ <template>
2
+ <div
3
+ ref="rootRef"
4
+ class="qiu-time"
5
+ :class="[
6
+ `qiu-time--${resolvedSize}`,
7
+ attrs.class,
8
+ {
9
+ 'is-disabled': disabled,
10
+ 'is-focused': panelVisible,
11
+ 'is-fit': fit,
12
+ },
13
+ ]"
14
+ :style="attrs.style as any"
15
+ >
16
+ <div class="qiu-time__editor" tabindex="0" @click="togglePanel" @keydown.enter.prevent="togglePanel">
17
+ <span class="qiu-time__value" :class="{ 'is-placeholder': !displayText }">
18
+ {{ displayText || placeholder }}
19
+ </span>
20
+ <button
21
+ v-if="clearable && hasValue && !disabled"
22
+ type="button"
23
+ class="qiu-time__clear"
24
+ tabindex="-1"
25
+ @mousedown.prevent
26
+ @click.stop="clearValue"
27
+ >
28
+ ×
29
+ </button>
30
+ <qiu-icon icon="time-line" class="qiu-time__icon" />
31
+ </div>
32
+
33
+ <Teleport to="body">
34
+ <Transition name="qiu-time-fade">
35
+ <div
36
+ v-if="panelVisible"
37
+ ref="panelRef"
38
+ class="qiu-time-panel"
39
+ :style="panelStyle"
40
+ @mousedown.prevent
41
+ >
42
+ <div class="qiu-time-panel__body">
43
+ <div class="qiu-time-panel__spinner">
44
+ <ul ref="hourListRef" class="qiu-time-panel__list">
45
+ <li
46
+ v-for="h in hours"
47
+ :key="`h-${h}`"
48
+ class="qiu-time-panel__item"
49
+ :class="{ 'is-active': draft.hour === h }"
50
+ @click="setDraft('hour', h)"
51
+ >
52
+ {{ pad(h) }}
53
+ </li>
54
+ </ul>
55
+ </div>
56
+ <div class="qiu-time-panel__spinner">
57
+ <ul ref="minuteListRef" class="qiu-time-panel__list">
58
+ <li
59
+ v-for="m in minutes"
60
+ :key="`m-${m}`"
61
+ class="qiu-time-panel__item"
62
+ :class="{ 'is-active': draft.minute === m }"
63
+ @click="setDraft('minute', m)"
64
+ >
65
+ {{ pad(m) }}
66
+ </li>
67
+ </ul>
68
+ </div>
69
+ <div v-if="showSeconds" class="qiu-time-panel__spinner">
70
+ <ul ref="secondListRef" class="qiu-time-panel__list">
71
+ <li
72
+ v-for="s in seconds"
73
+ :key="`s-${s}`"
74
+ class="qiu-time-panel__item"
75
+ :class="{ 'is-active': draft.second === s }"
76
+ @click="setDraft('second', s)"
77
+ >
78
+ {{ pad(s) }}
79
+ </li>
80
+ </ul>
81
+ </div>
82
+ </div>
83
+ <div class="qiu-time-panel__footer">
84
+ <button type="button" class="qiu-time-panel__btn is-text" @click="pickNow">此刻</button>
85
+ <div class="qiu-time-panel__actions">
86
+ <button type="button" class="qiu-time-panel__btn" @click="cancelPanel">取消</button>
87
+ <button type="button" class="qiu-time-panel__btn is-primary" @click="confirmPanel">
88
+ 确定
89
+ </button>
90
+ </div>
91
+ </div>
92
+ </div>
93
+ </Transition>
94
+ </Teleport>
95
+ </div>
96
+ </template>
97
+
98
+ <script lang="ts" setup>
99
+ import type { CSSProperties } from 'vue'
100
+
101
+ defineOptions({
102
+ name: 'QiuTime',
103
+ inheritAttrs: false,
104
+ })
105
+
106
+ type TimeParts = { hour: number; minute: number; second: number }
107
+
108
+ const props = withDefaults(
109
+ defineProps<{
110
+ modelValue?: string | null
111
+ /** 展示/绑定格式:HH:mm:ss 或 HH:mm */
112
+ format?: 'HH:mm:ss' | 'HH:mm'
113
+ placeholder?: string
114
+ clearable?: boolean
115
+ disabled?: boolean
116
+ size?: 'large' | 'default' | 'small'
117
+ /** 按内容自适应宽度(表格单元格内推荐) */
118
+ fit?: boolean
119
+ hourStep?: number
120
+ minuteStep?: number
121
+ secondStep?: number
122
+ }>(),
123
+ {
124
+ modelValue: null,
125
+ format: 'HH:mm:ss',
126
+ placeholder: '选择时间',
127
+ clearable: true,
128
+ disabled: false,
129
+ size: 'default',
130
+ fit: false,
131
+ hourStep: 1,
132
+ minuteStep: 1,
133
+ secondStep: 1,
134
+ }
135
+ )
136
+
137
+ const emit = defineEmits<{
138
+ 'update:modelValue': [string | null]
139
+ change: [string | null]
140
+ clear: []
141
+ 'visible-change': [boolean]
142
+ }>()
143
+
144
+ const attrs = useAttrs()
145
+ const rootRef = ref<HTMLElement | null>(null)
146
+ const panelRef = ref<HTMLElement | null>(null)
147
+ const hourListRef = ref<HTMLElement | null>(null)
148
+ const minuteListRef = ref<HTMLElement | null>(null)
149
+ const secondListRef = ref<HTMLElement | null>(null)
150
+ const panelVisible = ref(false)
151
+ const panelStyle = ref<CSSProperties>({
152
+ position: 'fixed',
153
+ top: '-9999px',
154
+ left: '-9999px',
155
+ zIndex: 3100,
156
+ })
157
+
158
+ const draft = reactive<TimeParts>({ hour: 0, minute: 0, second: 0 })
159
+
160
+ const resolvedSize = computed(() => props.size || 'default')
161
+ const showSeconds = computed(() => props.format !== 'HH:mm')
162
+ const hasValue = computed(() => props.modelValue != null && props.modelValue !== '')
163
+
164
+ const pad = (n: number) => String(n).padStart(2, '0')
165
+
166
+ const rangeByStep = (max: number, step: number) => {
167
+ const s = Math.max(1, Math.floor(step || 1))
168
+ const list: number[] = []
169
+ for (let i = 0; i <= max; i += s) list.push(i)
170
+ if (list[list.length - 1] !== max && max % s === 0) {
171
+ /* already includes */
172
+ }
173
+ return list
174
+ }
175
+
176
+ const hours = computed(() => rangeByStep(23, props.hourStep))
177
+ const minutes = computed(() => rangeByStep(59, props.minuteStep))
178
+ const seconds = computed(() => rangeByStep(59, props.secondStep))
179
+
180
+ const parseTime = (val?: string | null): TimeParts | null => {
181
+ if (!val) return null
182
+ const m = String(val).trim().match(/^(\d{1,2}):(\d{1,2})(?::(\d{1,2}))?$/)
183
+ if (!m) return null
184
+ const hour = Math.min(23, Math.max(0, Number(m[1])))
185
+ const minute = Math.min(59, Math.max(0, Number(m[2])))
186
+ const second = Math.min(59, Math.max(0, Number(m[3] ?? 0)))
187
+ return { hour, minute, second }
188
+ }
189
+
190
+ const formatParts = (p: TimeParts) => {
191
+ if (showSeconds.value) return `${pad(p.hour)}:${pad(p.minute)}:${pad(p.second)}`
192
+ return `${pad(p.hour)}:${pad(p.minute)}`
193
+ }
194
+
195
+ const displayText = computed(() => {
196
+ const p = parseTime(props.modelValue)
197
+ return p ? formatParts(p) : ''
198
+ })
199
+
200
+ const syncDraftFromModel = () => {
201
+ const p = parseTime(props.modelValue) || { hour: 0, minute: 0, second: 0 }
202
+ draft.hour = p.hour
203
+ draft.minute = p.minute
204
+ draft.second = p.second
205
+ }
206
+
207
+ const scrollActiveIntoView = async () => {
208
+ await nextTick()
209
+ const scrollList = (el: HTMLElement | null, active: number) => {
210
+ if (!el) return
211
+ const item = el.querySelector('.qiu-time-panel__item.is-active') as HTMLElement | null
212
+ if (item) {
213
+ el.scrollTop = Math.max(0, item.offsetTop - el.clientHeight / 2 + item.clientHeight / 2)
214
+ return
215
+ }
216
+ const idx = Array.from(el.children).findIndex((n) => Number((n as HTMLElement).textContent) === active)
217
+ if (idx >= 0) {
218
+ const node = el.children[idx] as HTMLElement
219
+ el.scrollTop = Math.max(0, node.offsetTop - el.clientHeight / 2 + node.clientHeight / 2)
220
+ }
221
+ }
222
+ scrollList(hourListRef.value, draft.hour)
223
+ scrollList(minuteListRef.value, draft.minute)
224
+ if (showSeconds.value) scrollList(secondListRef.value, draft.second)
225
+ }
226
+
227
+ const updatePanelPosition = () => {
228
+ const trigger = rootRef.value
229
+ const panel = panelRef.value
230
+ if (!trigger || !panel) return
231
+ const rect = trigger.getBoundingClientRect()
232
+ const panelRect = panel.getBoundingClientRect()
233
+ const gap = 4
234
+ const vw = window.innerWidth
235
+ const vh = window.innerHeight
236
+ let top = rect.bottom + gap
237
+ let left = rect.left
238
+ if (top + panelRect.height > vh - 4) top = rect.top - panelRect.height - gap
239
+ if (top < 4) top = 4
240
+ if (left + panelRect.width > vw - 4) left = vw - panelRect.width - 4
241
+ if (left < 4) left = 4
242
+ panelStyle.value = {
243
+ position: 'fixed',
244
+ top: `${Math.round(top)}px`,
245
+ left: `${Math.round(left)}px`,
246
+ zIndex: 3100,
247
+ }
248
+ }
249
+
250
+ const openPanel = async () => {
251
+ if (props.disabled) return
252
+ syncDraftFromModel()
253
+ panelVisible.value = true
254
+ emit('visible-change', true)
255
+ await nextTick()
256
+ updatePanelPosition()
257
+ await scrollActiveIntoView()
258
+ requestAnimationFrame(() => updatePanelPosition())
259
+ }
260
+
261
+ const closePanel = () => {
262
+ if (!panelVisible.value) return
263
+ panelVisible.value = false
264
+ emit('visible-change', false)
265
+ }
266
+
267
+ const togglePanel = () => {
268
+ if (props.disabled) return
269
+ panelVisible.value ? closePanel() : openPanel()
270
+ }
271
+
272
+ const setDraft = (key: keyof TimeParts, value: number) => {
273
+ draft[key] = value
274
+ }
275
+
276
+ const emitValue = (val: string | null) => {
277
+ emit('update:modelValue', val)
278
+ emit('change', val)
279
+ }
280
+
281
+ const confirmPanel = () => {
282
+ emitValue(formatParts({ ...draft }))
283
+ closePanel()
284
+ }
285
+
286
+ const cancelPanel = () => {
287
+ closePanel()
288
+ }
289
+
290
+ const pickNow = () => {
291
+ const now = new Date()
292
+ draft.hour = now.getHours()
293
+ draft.minute = now.getMinutes()
294
+ draft.second = now.getSeconds()
295
+ emitValue(formatParts({ ...draft }))
296
+ closePanel()
297
+ }
298
+
299
+ const clearValue = () => {
300
+ emitValue(null)
301
+ emit('clear')
302
+ }
303
+
304
+ const onDocClick = (e: MouseEvent) => {
305
+ if (!panelVisible.value) return
306
+ const t = e.target as Node
307
+ if (rootRef.value?.contains(t) || panelRef.value?.contains(t)) return
308
+ closePanel()
309
+ }
310
+
311
+ const onScrollOrResize = () => {
312
+ if (panelVisible.value) updatePanelPosition()
313
+ }
314
+
315
+ watch(panelVisible, (v) => {
316
+ if (v) {
317
+ document.addEventListener('mousedown', onDocClick, true)
318
+ window.addEventListener('scroll', onScrollOrResize, true)
319
+ window.addEventListener('resize', onScrollOrResize)
320
+ } else {
321
+ document.removeEventListener('mousedown', onDocClick, true)
322
+ window.removeEventListener('scroll', onScrollOrResize, true)
323
+ window.removeEventListener('resize', onScrollOrResize)
324
+ }
325
+ })
326
+
327
+ onBeforeUnmount(() => {
328
+ document.removeEventListener('mousedown', onDocClick, true)
329
+ window.removeEventListener('scroll', onScrollOrResize, true)
330
+ window.removeEventListener('resize', onScrollOrResize)
331
+ })
332
+ </script>
333
+
334
+ <style lang="scss" scoped>
335
+ .qiu-time {
336
+ position: relative;
337
+ display: inline-flex;
338
+ box-sizing: border-box;
339
+ width: 100%;
340
+ max-width: 100%;
341
+ vertical-align: middle;
342
+
343
+ &.is-fit {
344
+ width: auto;
345
+ min-width: 120px;
346
+ }
347
+
348
+ &.is-disabled .qiu-time__editor {
349
+ cursor: not-allowed;
350
+ background: var(--qiu-fill-color-light, var(--qiu-fill-color-light, #f5f7fa));
351
+ color: var(--qiu-text-color-placeholder, var(--qiu-text-color-placeholder, #a8abb2));
352
+ }
353
+
354
+ &.is-focused .qiu-time__editor {
355
+ border-color: var(--qiu-color-primary, var(--qiu-color-primary));
356
+ box-shadow: 0 0 0 1px
357
+ color-mix(in srgb, var(--qiu-color-primary, var(--qiu-color-primary)) 25%, transparent);
358
+ }
359
+ }
360
+
361
+ .qiu-time__editor {
362
+ display: inline-flex;
363
+ align-items: center;
364
+ box-sizing: border-box;
365
+ width: 100%;
366
+ min-width: 0;
367
+ padding: 0 8px 0 12px;
368
+ cursor: pointer;
369
+ background: var(--qiu-bg-color, var(--qiu-bg-color, #fff));
370
+ border: 1px solid var(--qiu-border-color, var(--qiu-border-color, #dcdfe6));
371
+ border-radius: var(--qiu-border-radius-base, var(--qiu-border-radius-base, 4px));
372
+ outline: none;
373
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
374
+
375
+ &:hover {
376
+ border-color: var(--qiu-border-color-hover, var(--qiu-border-color-hover, #c0c4cc));
377
+ }
378
+ }
379
+
380
+ .qiu-time--large .qiu-time__editor {
381
+ height: 40px;
382
+ font-size: 16px;
383
+ }
384
+
385
+ .qiu-time--default .qiu-time__editor {
386
+ height: 32px;
387
+ font-size: 14px;
388
+ }
389
+
390
+ .qiu-time--small .qiu-time__editor {
391
+ height: 24px;
392
+ font-size: 12px;
393
+ }
394
+
395
+ .qiu-time__value {
396
+ flex: 1;
397
+ min-width: 0;
398
+ overflow: hidden;
399
+ text-overflow: ellipsis;
400
+ white-space: nowrap;
401
+ color: var(--qiu-text-color-primary, var(--qiu-text-color-primary, #303133));
402
+ line-height: 1;
403
+
404
+ &.is-placeholder {
405
+ color: var(--qiu-text-color-placeholder, var(--qiu-text-color-placeholder, #a8abb2));
406
+ }
407
+ }
408
+
409
+ .qiu-time__clear,
410
+ .qiu-time__icon {
411
+ flex-shrink: 0;
412
+ margin-left: 4px;
413
+ color: var(--qiu-text-color-placeholder, var(--qiu-text-color-placeholder, #a8abb2));
414
+ }
415
+
416
+ .qiu-time__clear {
417
+ display: inline-flex;
418
+ align-items: center;
419
+ justify-content: center;
420
+ width: 16px;
421
+ height: 16px;
422
+ padding: 0;
423
+ font-size: 14px;
424
+ line-height: 1;
425
+ cursor: pointer;
426
+ background: transparent;
427
+ border: 0;
428
+ border-radius: 50%;
429
+
430
+ &:hover {
431
+ color: var(--qiu-text-color-regular, var(--qiu-text-color-regular, #606266));
432
+ }
433
+ }
434
+
435
+ .qiu-time__icon {
436
+ font-size: 14px;
437
+ }
438
+
439
+ .qiu-time-panel {
440
+ box-sizing: border-box;
441
+ width: auto;
442
+ overflow: hidden;
443
+ background: var(--qiu-bg-color-overlay, var(--qiu-bg-color-overlay, #fff));
444
+ border: 1px solid var(--qiu-border-color-light, var(--qiu-border-color-light, #e4e7ed));
445
+ border-radius: var(--qiu-border-radius-base, var(--qiu-border-radius-base, 4px));
446
+ box-shadow: var(--qiu-box-shadow-light, var(--qiu-box-shadow-light, 0 4px 12px rgb(0 0 0 / 10%)));
447
+ }
448
+
449
+ .qiu-time-panel__body {
450
+ display: flex;
451
+ height: 204px;
452
+ border-bottom: 1px solid var(--qiu-border-color-lighter, var(--qiu-border-color-lighter, #ebeef5));
453
+ }
454
+
455
+ .qiu-time-panel__spinner {
456
+ flex: 1;
457
+ min-width: 56px;
458
+ overflow: hidden;
459
+ border-right: 1px solid var(--qiu-border-color-lighter, var(--qiu-border-color-lighter, #ebeef5));
460
+
461
+ &:last-child {
462
+ border-right: 0;
463
+ }
464
+ }
465
+
466
+ .qiu-time-panel__list {
467
+ height: 100%;
468
+ margin: 0;
469
+ padding: 0;
470
+ overflow-x: hidden;
471
+ overflow-y: auto;
472
+ list-style: none;
473
+ scrollbar-width: thin;
474
+ }
475
+
476
+ .qiu-time-panel__item {
477
+ height: 32px;
478
+ padding: 0 10px;
479
+ font-size: 13px;
480
+ line-height: 32px;
481
+ color: var(--qiu-text-color-regular, var(--qiu-text-color-regular, #606266));
482
+ text-align: center;
483
+ cursor: pointer;
484
+ user-select: none;
485
+
486
+ &:hover {
487
+ background: var(--qiu-fill-color-light, var(--qiu-fill-color-light, #f5f7fa));
488
+ }
489
+
490
+ &.is-active {
491
+ font-weight: 600;
492
+ color: var(--qiu-color-primary, var(--qiu-color-primary));
493
+ background: var(--qiu-color-primary-light-9, var(--qiu-color-primary-light-9, #ecf5ff));
494
+ }
495
+ }
496
+
497
+ .qiu-time-panel__footer {
498
+ display: flex;
499
+ gap: 8px;
500
+ align-items: center;
501
+ justify-content: space-between;
502
+ padding: 8px 10px;
503
+ }
504
+
505
+ .qiu-time-panel__actions {
506
+ display: inline-flex;
507
+ gap: 8px;
508
+ }
509
+
510
+ .qiu-time-panel__btn {
511
+ height: 28px;
512
+ padding: 0 12px;
513
+ font-size: 13px;
514
+ color: var(--qiu-text-color-regular, var(--qiu-text-color-regular, #606266));
515
+ cursor: pointer;
516
+ background: var(--qiu-fill-color-blank, #fff);
517
+ border: 1px solid var(--qiu-border-color, var(--qiu-border-color, #dcdfe6));
518
+ border-radius: 4px;
519
+
520
+ &.is-text {
521
+ padding: 0 4px;
522
+ color: var(--qiu-color-primary, var(--qiu-color-primary));
523
+ background: transparent;
524
+ border-color: transparent;
525
+ }
526
+
527
+ &.is-primary {
528
+ color: #fff;
529
+ background: var(--qiu-color-primary, var(--qiu-color-primary));
530
+ border-color: var(--qiu-color-primary, var(--qiu-color-primary));
531
+ }
532
+
533
+ &:hover {
534
+ opacity: 0.92;
535
+ }
536
+ }
537
+
538
+ .qiu-time-fade-enter-active,
539
+ .qiu-time-fade-leave-active {
540
+ transition: opacity 0.15s ease, transform 0.15s ease;
541
+ }
542
+
543
+ .qiu-time-fade-enter-from,
544
+ .qiu-time-fade-leave-to {
545
+ opacity: 0;
546
+ transform: translateY(-4px);
547
+ }
548
+ </style>
@@ -0,0 +1,103 @@
1
+ <template>
2
+ <span class="qiu-time-ago" :title="absoluteTitle">
3
+ <slot :value="text">{{ text }}</slot>
4
+ </span>
5
+ </template>
6
+
7
+ <script lang="ts" setup>
8
+ import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
9
+
10
+ defineOptions({ name: 'QiuTimeAgo' })
11
+
12
+ const props = withDefaults(
13
+ defineProps<{
14
+ /** 时间:Date / 时间戳(ms) / 时间字符串 */
15
+ value?: Date | number | string
16
+ /** 是否自动刷新 */
17
+ autoUpdate?: boolean
18
+ /** 刷新间隔(ms) */
19
+ interval?: number
20
+ }>(),
21
+ {
22
+ value: undefined,
23
+ autoUpdate: true,
24
+ interval: 30000,
25
+ }
26
+ )
27
+
28
+ const emit = defineEmits<{
29
+ update: [string]
30
+ }>()
31
+
32
+ const text = ref('')
33
+ const absoluteTitle = ref('')
34
+ let timer: ReturnType<typeof setInterval> | undefined
35
+
36
+ const toDate = (val?: Date | number | string): Date | null => {
37
+ if (!val) return null
38
+ if (val instanceof Date) return isNaN(val.getTime()) ? null : val
39
+ if (typeof val === 'number') return new Date(val)
40
+ const d = new Date(val)
41
+ return isNaN(d.getTime()) ? null : d
42
+ }
43
+
44
+ const diffText = (date: Date) => {
45
+ const now = Date.now()
46
+ const diff = now - date.getTime()
47
+ const abs = Math.abs(diff)
48
+ const future = diff < 0
49
+ const sec = Math.floor(abs / 1000)
50
+ const min = Math.floor(sec / 60)
51
+ const hr = Math.floor(min / 60)
52
+ const day = Math.floor(hr / 24)
53
+
54
+ let rel: string
55
+ if (sec < 10) rel = '刚刚'
56
+ else if (sec < 60) rel = `${sec} 秒${future ? '后' : '前'}`
57
+ else if (min < 60) rel = `${min} 分钟${future ? '后' : '前'}`
58
+ else if (hr < 24) rel = `${hr} 小时${future ? '后' : '前'}`
59
+ else if (day < 30) rel = `${day} 天${future ? '后' : '前'}`
60
+ else {
61
+ const y = date.getFullYear()
62
+ const m = String(date.getMonth() + 1).padStart(2, '0')
63
+ const d = String(date.getDate()).padStart(2, '0')
64
+ text.value = `${y}-${m}-${d}`
65
+ return
66
+ }
67
+ text.value = rel
68
+ }
69
+
70
+ const refresh = () => {
71
+ const d = toDate(props.value)
72
+ if (!d) {
73
+ text.value = '--'
74
+ absoluteTitle.value = ''
75
+ return
76
+ }
77
+ const pad = (n: number) => String(n).padStart(2, '0')
78
+ absoluteTitle.value = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`
79
+ diffText(d)
80
+ emit('update', text.value)
81
+ }
82
+
83
+ watch(() => props.value, refresh, { immediate: false })
84
+
85
+ onMounted(() => {
86
+ refresh()
87
+ if (props.autoUpdate && props.interval > 0) {
88
+ timer = setInterval(refresh, props.interval)
89
+ }
90
+ })
91
+
92
+ onBeforeUnmount(() => {
93
+ if (timer) clearInterval(timer)
94
+ })
95
+ </script>
96
+
97
+ <style lang="scss" scoped>
98
+ .qiu-time-ago {
99
+ display: inline;
100
+ font-size: inherit;
101
+ color: inherit;
102
+ }
103
+ </style>
@@ -0,0 +1,54 @@
1
+ <template>
2
+ <ul
3
+ class="qiu-timeline"
4
+ :class="{
5
+ 'qiu-timeline--center': center,
6
+ }"
7
+ >
8
+ <slot />
9
+ </ul>
10
+ </template>
11
+
12
+ <script lang="ts" setup>
13
+ defineOptions({ name: 'QiuTimeline' })
14
+
15
+ withDefaults(
16
+ defineProps<{
17
+ center?: boolean
18
+ }>(),
19
+ {
20
+ center: false,
21
+ }
22
+ )
23
+ </script>
24
+
25
+ <style lang="scss" scoped>
26
+ .qiu-timeline {
27
+ padding: 0;
28
+ margin: 0;
29
+ list-style: none;
30
+
31
+ &--center {
32
+ :deep(.qiu-timeline-item__wrapper) {
33
+ width: 50%;
34
+ }
35
+
36
+ :deep(.qiu-timeline-item:nth-child(odd) .qiu-timeline-item__wrapper) {
37
+ margin-left: 50%;
38
+ padding-left: 24px;
39
+ text-align: left;
40
+ }
41
+
42
+ :deep(.qiu-timeline-item:nth-child(even) .qiu-timeline-item__wrapper) {
43
+ margin-right: 50%;
44
+ padding-right: 24px;
45
+ text-align: right;
46
+ }
47
+
48
+ :deep(.qiu-timeline-item__dot) {
49
+ left: 50%;
50
+ transform: translateX(-50%);
51
+ }
52
+ }
53
+ }
54
+ </style>