foucui 1.0.1 → 1.0.2

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 (234) hide show
  1. package/dist/components/QiuCanvasKit/QiuCanvasEditor.vue.d.ts +3 -1
  2. package/dist/components/QiuCanvasKit/components/DataModulesPanel.vue.d.ts +1 -0
  3. package/dist/components/QiuTable/index.vue.d.ts +12 -12
  4. package/dist/foucui.css +1 -1
  5. package/dist/foucui.js +7476 -7373
  6. package/dist/foucui.umd.cjs +19 -19
  7. package/package.json +23 -13
  8. package/components/QiuAffix/index.vue +0 -186
  9. package/components/QiuAlert/index.vue +0 -208
  10. package/components/QiuAnchor/context.ts +0 -18
  11. package/components/QiuAnchor/index.vue +0 -180
  12. package/components/QiuAnchorLink/index.vue +0 -67
  13. package/components/QiuApp/index.vue +0 -9
  14. package/components/QiuAutocomplete/index.vue +0 -408
  15. package/components/QiuAvatar/index.vue +0 -140
  16. package/components/QiuBacktop/index.vue +0 -121
  17. package/components/QiuBadge/api/index.ts +0 -389
  18. package/components/QiuBadge/components/BadgeImagePickerDialog.vue +0 -243
  19. package/components/QiuBadge/components/BadgeLibraryManagerDialog.vue +0 -30
  20. package/components/QiuBadge/components/BadgeLibraryPanel.vue +0 -182
  21. package/components/QiuBadge/composables/useTableHostHeight.ts +0 -53
  22. package/components/QiuBadge/index.ts +0 -18
  23. package/components/QiuBadge/shared/BadgeTemplateRenderer.vue +0 -32
  24. package/components/QiuBadge/shared/assetUrl.ts +0 -26
  25. package/components/QiuBadge/shared/badgeTemplate.ts +0 -309
  26. package/components/QiuBadge/utils/chinaAreaData.ts +0 -44
  27. package/components/QiuBadge/utils/hostRegion.ts +0 -22
  28. package/components/QiuBadge/utils/pca-code.json +0 -1
  29. package/components/QiuBadge/utils/pdfFromElement.ts +0 -348
  30. package/components/QiuBadge/views/BadgeLibraryView.vue +0 -32
  31. package/components/QiuBadge/views/BadgeManageView.vue +0 -1364
  32. package/components/QiuBadge/views/BadgeTemplateEditorView.vue +0 -10
  33. package/components/QiuBadge/views/BadgeTemplateListView.vue +0 -229
  34. package/components/QiuBadge/views/DeskLabelTemplateListView.vue +0 -227
  35. package/components/QiuBadge/views/DeskLabelView.vue +0 -683
  36. package/components/QiuBadgeDot/index.vue +0 -87
  37. package/components/QiuButton/index.vue +0 -247
  38. package/components/QiuButtonGroup/index.vue +0 -63
  39. package/components/QiuCanvasKit/QiuCanvasEditor.vue +0 -5503
  40. package/components/QiuCanvasKit/QiuCanvasRenderer.vue +0 -348
  41. package/components/QiuCanvasKit/assetUrl.ts +0 -11
  42. package/components/QiuCanvasKit/components/DataModulesPanel.vue +0 -352
  43. package/components/QiuCanvasKit/export/html.ts +0 -132
  44. package/components/QiuCanvasKit/export/pdf.ts +0 -48
  45. package/components/QiuCanvasKit/export/png.ts +0 -50
  46. package/components/QiuCanvasKit/index.ts +0 -20
  47. package/components/QiuCanvasKit/modules/badgeCompat.ts +0 -84
  48. package/components/QiuCanvasKit/modules/dataRegistry.ts +0 -207
  49. package/components/QiuCanvasKit/modules/merge.ts +0 -71
  50. package/components/QiuCanvasKit/presets/badge.ts +0 -67
  51. package/components/QiuCanvasKit/presets/banner.ts +0 -79
  52. package/components/QiuCanvasKit/types.ts +0 -138
  53. package/components/QiuCard/index.vue +0 -104
  54. package/components/QiuCarousel/context.ts +0 -16
  55. package/components/QiuCarousel/index.vue +0 -343
  56. package/components/QiuCarouselItem/index.vue +0 -47
  57. package/components/QiuCascader/index.vue +0 -879
  58. package/components/QiuCascader/types.ts +0 -48
  59. package/components/QiuCheckbox/QiuCheckboxGroup.vue +0 -78
  60. package/components/QiuCheckbox/index.vue +0 -231
  61. package/components/QiuCheckbox/types.ts +0 -8
  62. package/components/QiuCode/index.vue +0 -64
  63. package/components/QiuCol/col.scss +0 -55
  64. package/components/QiuCol/index.vue +0 -64
  65. package/components/QiuCollapse/context.ts +0 -10
  66. package/components/QiuCollapse/index.vue +0 -70
  67. package/components/QiuCollapseItem/index.vue +0 -167
  68. package/components/QiuColorField/index.vue +0 -296
  69. package/components/QiuColorPicker/README.md +0 -118
  70. package/components/QiuColorPicker/index.vue +0 -60
  71. package/components/QiuColorfulCard/index.vue +0 -101
  72. package/components/QiuCombobox/index.vue +0 -277
  73. package/components/QiuConfigProvider/index.vue +0 -31
  74. package/components/QiuContextMenu/index.vue +0 -209
  75. package/components/QiuDate/index.vue +0 -1134
  76. package/components/QiuDescriptions/context.ts +0 -20
  77. package/components/QiuDescriptions/index.vue +0 -115
  78. package/components/QiuDescriptionsItem/index.vue +0 -103
  79. package/components/QiuDialog/index.vue +0 -828
  80. package/components/QiuDigitalCard/index.vue +0 -159
  81. package/components/QiuDivider/index.vue +0 -185
  82. package/components/QiuDot/index.vue +0 -83
  83. package/components/QiuDrawer/index.vue +0 -350
  84. package/components/QiuDropdown/QiuDropdownItem.vue +0 -74
  85. package/components/QiuDropdown/QiuDropdownMenu.vue +0 -22
  86. package/components/QiuDropdown/context.ts +0 -9
  87. package/components/QiuDropdown/index.vue +0 -189
  88. package/components/QiuEmpty/index.vue +0 -73
  89. package/components/QiuForm/index.vue +0 -172
  90. package/components/QiuForm/types.ts +0 -39
  91. package/components/QiuFormItem/index.vue +0 -276
  92. package/components/QiuFullscreen/index.vue +0 -11
  93. package/components/QiuGrid/index.vue +0 -408
  94. package/components/QiuHoverCard/index.vue +0 -192
  95. package/components/QiuIcon/index.vue +0 -117
  96. package/components/QiuIconPicker/iconify.libraries.ts +0 -182
  97. package/components/QiuIconPicker/icons.catalog.ts +0 -3072
  98. package/components/QiuIconPicker/index.vue +0 -488
  99. package/components/QiuImage/index.vue +0 -177
  100. package/components/QiuInput/index.vue +0 -328
  101. package/components/QiuInputNumber/index.vue +0 -295
  102. package/components/QiuInputOtp/index.vue +0 -190
  103. package/components/QiuKbd/index.vue +0 -57
  104. package/components/QiuLayoutContainer/index.vue +0 -50
  105. package/components/QiuLinkPreview/index.vue +0 -224
  106. package/components/QiuLoading/index.ts +0 -176
  107. package/components/QiuLoading/spinner.vue +0 -820
  108. package/components/QiuLoading/types.ts +0 -44
  109. package/components/QiuMention/index.vue +0 -299
  110. package/components/QiuMenu/QiuMenuRoot.vue +0 -241
  111. package/components/QiuMenu/components/QiuMenuItem.vue +0 -340
  112. package/components/QiuMenu/components/QiuSubMenu.vue +0 -504
  113. package/components/QiuMenu/context.ts +0 -21
  114. package/components/QiuMenu/index.vue +0 -43
  115. package/components/QiuMenuNav/QiuMenuNavItem.vue +0 -100
  116. package/components/QiuMenuNav/QiuMenuNavSub.vue +0 -120
  117. package/components/QiuMenuNav/context.ts +0 -14
  118. package/components/QiuMenuNav/index.vue +0 -148
  119. package/components/QiuMsg/QiuMsgItem.vue +0 -180
  120. package/components/QiuMsg/index.ts +0 -158
  121. package/components/QiuMsg/types.ts +0 -23
  122. package/components/QiuMsgBox/index.ts +0 -147
  123. package/components/QiuNotification/QiuNotificationItem.vue +0 -168
  124. package/components/QiuNotification/index.ts +0 -155
  125. package/components/QiuNotification/types.ts +0 -14
  126. package/components/QiuPage/index.vue +0 -12
  127. package/components/QiuPageHeader/index.vue +0 -115
  128. package/components/QiuPageMain/index.vue +0 -78
  129. package/components/QiuPagination/index.vue +0 -421
  130. package/components/QiuPasswordStrength/index.vue +0 -101
  131. package/components/QiuPopconfirm/index.vue +0 -196
  132. package/components/QiuPopover/index.vue +0 -277
  133. package/components/QiuProgress/index.vue +0 -235
  134. package/components/QiuQrcode/index.vue +0 -302
  135. package/components/QiuQueryForm/components/QiuQueryFormBottomPanel.vue +0 -13
  136. package/components/QiuQueryForm/components/QiuQueryFormLeftPanel.vue +0 -37
  137. package/components/QiuQueryForm/components/QiuQueryFormRightPanel.vue +0 -37
  138. package/components/QiuQueryForm/components/QiuQueryFormTopPanel.vue +0 -13
  139. package/components/QiuQueryForm/index.vue +0 -117
  140. package/components/QiuRadio/QiuRadioGroup.vue +0 -75
  141. package/components/QiuRadio/index.vue +0 -191
  142. package/components/QiuRadio/types.ts +0 -9
  143. package/components/QiuRate/index.vue +0 -184
  144. package/components/QiuRefresh/index.vue +0 -32
  145. package/components/QiuResult/index.vue +0 -103
  146. package/components/QiuRow/index.vue +0 -60
  147. package/components/QiuRow/types.ts +0 -5
  148. package/components/QiuScrollbar/index.vue +0 -107
  149. package/components/QiuSearchBar/index.vue +0 -154
  150. package/components/QiuSegmented/index.vue +0 -120
  151. package/components/QiuSelect/QiuOption.vue +0 -93
  152. package/components/QiuSelect/index.vue +0 -452
  153. package/components/QiuSelect/types.ts +0 -15
  154. package/components/QiuSkeleton/index.vue +0 -78
  155. package/components/QiuSlider/index.vue +0 -266
  156. package/components/QiuSpace/index.vue +0 -95
  157. package/components/QiuSparkline/index.vue +0 -92
  158. package/components/QiuStatistic/index.vue +0 -4
  159. package/components/QiuStatistics/index.vue +0 -123
  160. package/components/QiuStep/index.vue +0 -220
  161. package/components/QiuSteps/context.ts +0 -25
  162. package/components/QiuSteps/index.vue +0 -84
  163. package/components/QiuSwitch/index.vue +0 -145
  164. package/components/QiuTabBar/index.vue +0 -218
  165. package/components/QiuTabBar/types.ts +0 -19
  166. package/components/QiuTabPane/index.vue +0 -82
  167. package/components/QiuTable/columns.ts +0 -16
  168. package/components/QiuTable/export.ts +0 -102
  169. package/components/QiuTable/index.ts +0 -24
  170. package/components/QiuTable/index.vue +0 -3503
  171. package/components/QiuTable/registry.ts +0 -75
  172. package/components/QiuTable/styles/table.scss +0 -1230
  173. package/components/QiuTable/types.ts +0 -413
  174. package/components/QiuTable/useArea.ts +0 -202
  175. package/components/QiuTable/useColumns.ts +0 -325
  176. package/components/QiuTable/useEdit.ts +0 -136
  177. package/components/QiuTable/useExtras.ts +0 -115
  178. package/components/QiuTable/useHistory.ts +0 -77
  179. package/components/QiuTable/useMerge.ts +0 -105
  180. package/components/QiuTable/useResize.ts +0 -86
  181. package/components/QiuTable/useScrollSync.ts +0 -152
  182. package/components/QiuTable/useVirtual.ts +0 -97
  183. package/components/QiuTable/utils.ts +0 -165
  184. package/components/QiuTableColumn/index.vue +0 -101
  185. package/components/QiuTag/index.vue +0 -143
  186. package/components/QiuText/index.vue +0 -99
  187. package/components/QiuTime/index.vue +0 -548
  188. package/components/QiuTimeAgo/index.vue +0 -103
  189. package/components/QiuTimeline/index.vue +0 -54
  190. package/components/QiuTimelineItem/index.vue +0 -140
  191. package/components/QiuTips/index.vue +0 -323
  192. package/components/QiuTooltip/index.vue +0 -237
  193. package/components/QiuTransfer/index.vue +0 -277
  194. package/components/QiuTree/QiuTreeNode.vue +0 -146
  195. package/components/QiuTree/index.vue +0 -143
  196. package/components/QiuTree/types.ts +0 -30
  197. package/components/QiuTreeSelect/index.vue +0 -259
  198. package/components/QiuTrend/index.vue +0 -92
  199. package/components/QiuUpload/index.vue +0 -628
  200. package/components/QiuUploadCrop/index.vue +0 -1267
  201. package/components/QiuWatermark/index.vue +0 -121
  202. package/components/useBodyScrollLock.ts +0 -28
  203. package/dist/components/QiuBadge/utils/pca-code.json.d.ts +0 -3
  204. package/plugins/qiu.ts +0 -83
  205. package/plugins/shortcuts.ts +0 -69
  206. package/src/bridge/@/api/media.ts +0 -8
  207. package/src/bridge/@/api/notice.ts +0 -5
  208. package/src/bridge/@/config/index.ts +0 -38
  209. package/src/bridge/@/config/media.config.ts +0 -37
  210. package/src/bridge/@/config/security.config.ts +0 -8
  211. package/src/bridge/@/i18n/index.ts +0 -6
  212. package/src/bridge/@/store/modules/bing.ts +0 -9
  213. package/src/bridge/@/store/modules/errorLog.ts +0 -9
  214. package/src/bridge/@/store/modules/media.ts +0 -10
  215. package/src/bridge/@/store/modules/routes.ts +0 -10
  216. package/src/bridge/@/store/modules/settings.ts +0 -9
  217. package/src/bridge/@/store/modules/tabs.ts +0 -9
  218. package/src/bridge/@/store/modules/user.ts +0 -9
  219. package/src/bridge/@/utils/convertToCamelCase.ts +0 -11
  220. package/src/bridge/@/utils/index.ts +0 -9
  221. package/src/bridge/@/utils/pageTitle.ts +0 -4
  222. package/src/bridge/@/utils/routes.ts +0 -14
  223. package/src/bridge/@/utils/validate.ts +0 -17
  224. package/src/bridge/@qiu/plugins/shortcuts.ts +0 -3
  225. package/src/i18n.ts +0 -8
  226. package/src/icons/qiu-logo.svg +0 -1
  227. package/styles/dark.scss +0 -194
  228. package/styles/normalize.css +0 -349
  229. package/styles/plain.scss +0 -423
  230. package/styles/qiu-tokens.scss +0 -40
  231. package/styles/qiu.scss +0 -1149
  232. package/styles/technology.scss +0 -452
  233. package/styles/var.scss +0 -382
  234. package/styles/variables.scss +0 -77
@@ -1,140 +0,0 @@
1
- <template>
2
- <li
3
- class="qiu-timeline-item"
4
- :class="[
5
- `qiu-timeline-item--${resolvedType}`,
6
- `qiu-timeline-item--placement-${placement}`,
7
- { 'is-hollow': hollow },
8
- ]"
9
- :style="itemStyle"
10
- >
11
- <div class="qiu-timeline-item__tail" />
12
- <div class="qiu-timeline-item__dot">
13
- <slot name="dot">
14
- <qiu-icon v-if="icon" :icon="icon" />
15
- </slot>
16
- </div>
17
- <div class="qiu-timeline-item__wrapper">
18
- <div
19
- v-if="timestamp && placement === 'top'"
20
- class="qiu-timeline-item__timestamp is-top"
21
- >
22
- {{ timestamp }}
23
- </div>
24
- <div class="qiu-timeline-item__content">
25
- <slot />
26
- </div>
27
- <div
28
- v-if="timestamp && placement === 'bottom'"
29
- class="qiu-timeline-item__timestamp is-bottom"
30
- >
31
- {{ timestamp }}
32
- </div>
33
- </div>
34
- </li>
35
- </template>
36
-
37
- <script lang="ts" setup>
38
- defineOptions({ name: 'QiuTimelineItem' })
39
-
40
- const props = withDefaults(
41
- defineProps<{
42
- timestamp?: string
43
- placement?: 'top' | 'bottom'
44
- type?: 'primary' | 'success' | 'warning' | 'danger' | 'info'
45
- color?: string
46
- hollow?: boolean
47
- icon?: string
48
- center?: boolean
49
- }>(),
50
- {
51
- timestamp: '',
52
- placement: 'bottom',
53
- type: 'primary',
54
- color: '',
55
- hollow: false,
56
- icon: '',
57
- center: false,
58
- }
59
- )
60
-
61
- const typeColorMap: Record<string, string> = {
62
- primary: 'var(--qiu-color-primary, var(--qiu-color-primary, #409eff))',
63
- success: 'var(--qiu-color-success, var(--qiu-color-success, #67c23a))',
64
- warning: 'var(--qiu-color-warning, var(--qiu-color-warning, #e6a23c))',
65
- danger: 'var(--qiu-color-danger, var(--qiu-color-danger, #f56c6c))',
66
- info: 'var(--qiu-color-info, var(--qiu-color-info, #909399))',
67
- }
68
-
69
- const resolvedType = computed(() => props.type || 'primary')
70
-
71
- const itemStyle = computed(() => ({
72
- '--qiu-timeline-dot-color': props.color || typeColorMap[resolvedType.value],
73
- }))
74
- </script>
75
-
76
- <style lang="scss" scoped>
77
- .qiu-timeline-item {
78
- position: relative;
79
- padding-bottom: 20px;
80
-
81
- &:last-child {
82
- .qiu-timeline-item__tail {
83
- display: none;
84
- }
85
- }
86
-
87
- &__tail {
88
- position: absolute;
89
- top: 8px;
90
- left: 4px;
91
- width: 2px;
92
- height: calc(100% - 8px);
93
- background: var(--qiu-border-color-light, var(--qiu-border-color-light, #e4e7ed));
94
- }
95
-
96
- &__dot {
97
- position: absolute;
98
- top: 2px;
99
- left: 0;
100
- z-index: 1;
101
- display: flex;
102
- align-items: center;
103
- justify-content: center;
104
- width: 10px;
105
- height: 10px;
106
- font-size: 10px;
107
- color: #fff;
108
- background: var(--qiu-timeline-dot-color);
109
- border: 2px solid var(--qiu-timeline-dot-color);
110
- border-radius: 50%;
111
- }
112
-
113
- &.is-hollow &__dot {
114
- background: var(--qiu-bg-color, var(--qiu-bg-color, #fff));
115
- color: var(--qiu-timeline-dot-color);
116
- }
117
-
118
- &__wrapper {
119
- position: relative;
120
- padding-left: 24px;
121
- }
122
-
123
- &__timestamp {
124
- margin-bottom: 6px;
125
- font-size: 12px;
126
- color: var(--qiu-text-color-secondary, var(--qiu-text-color-secondary, #909399));
127
-
128
- &.is-bottom {
129
- margin-top: 6px;
130
- margin-bottom: 0;
131
- }
132
- }
133
-
134
- &__content {
135
- font-size: 14px;
136
- line-height: 1.6;
137
- color: var(--qiu-text-color-primary, var(--qiu-text-color-primary, #303133));
138
- }
139
- }
140
- </style>
@@ -1,323 +0,0 @@
1
- <template>
2
- <span class="qiu-tips-host" v-bind="attrs">
3
- <span
4
- ref="triggerRef"
5
- class="qiu-tips__trigger"
6
- @mouseenter="onTriggerEnter"
7
- @mouseleave="onTriggerLeave"
8
- @click="onTriggerClick"
9
- >
10
- <slot />
11
- </span>
12
-
13
- <Teleport to="body">
14
- <Transition name="qiu-tips-fade">
15
- <div
16
- v-show="visible"
17
- ref="popperRef"
18
- class="qiu-tips"
19
- :class="[
20
- `qiu-tips--${placement}`,
21
- `qiu-tips--${type}`,
22
- `qiu-tips--${effect}`,
23
- ]"
24
- :style="popperStyle"
25
- role="tooltip"
26
- @mouseenter="onPopperEnter"
27
- @mouseleave="onTriggerLeave"
28
- >
29
- <div v-if="title || $slots.title" class="qiu-tips__title">
30
- <slot name="title">{{ title }}</slot>
31
- </div>
32
- <div class="qiu-tips__content">
33
- <slot name="content">{{ content }}</slot>
34
- </div>
35
- <i class="qiu-tips__arrow" aria-hidden="true" />
36
- </div>
37
- </Transition>
38
- </Teleport>
39
- </span>
40
- </template>
41
-
42
- <script lang="ts" setup>
43
- /**
44
- * QiuTips — 带三角、主题色的提示气泡(比 QiuTooltip 更完整)
45
- */
46
- defineOptions({ name: 'QiuTips', inheritAttrs: false })
47
-
48
- type Placement = 'top' | 'bottom' | 'left' | 'right'
49
- type TipsType = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'cyan' | 'orange' | 'pink' | 'teal'
50
-
51
- const attrs = useAttrs()
52
-
53
- const props = withDefaults(
54
- defineProps<{
55
- content?: string
56
- title?: string
57
- placement?: Placement
58
- type?: TipsType
59
- effect?: 'light' | 'dark'
60
- trigger?: 'hover' | 'click'
61
- showAfter?: number
62
- hideAfter?: number
63
- disabled?: boolean
64
- }>(),
65
- {
66
- content: '',
67
- title: '',
68
- placement: 'top',
69
- type: 'primary',
70
- effect: 'dark',
71
- trigger: 'hover',
72
- showAfter: 0,
73
- hideAfter: 120,
74
- disabled: false,
75
- }
76
- )
77
-
78
- const triggerRef = ref<HTMLElement | null>(null)
79
- const popperRef = ref<HTMLElement | null>(null)
80
- const visible = ref(false)
81
- const popperStyle = ref<Record<string, string>>({})
82
-
83
- let showTimer: ReturnType<typeof setTimeout> | undefined
84
- let hideTimer: ReturnType<typeof setTimeout> | undefined
85
- let inPopper = false
86
-
87
- const updatePosition = () => {
88
- const trigger = triggerRef.value
89
- const popper = popperRef.value
90
- if (!trigger || !popper) return
91
-
92
- const rect = trigger.getBoundingClientRect()
93
- const popRect = popper.getBoundingClientRect()
94
- const gap = 10
95
- let top = 0
96
- let left = 0
97
-
98
- switch (props.placement) {
99
- case 'bottom':
100
- top = rect.bottom + gap
101
- left = rect.left + rect.width / 2 - popRect.width / 2
102
- break
103
- case 'left':
104
- top = rect.top + rect.height / 2 - popRect.height / 2
105
- left = rect.left - popRect.width - gap
106
- break
107
- case 'right':
108
- top = rect.top + rect.height / 2 - popRect.height / 2
109
- left = rect.right + gap
110
- break
111
- default:
112
- top = rect.top - popRect.height - gap
113
- left = rect.left + rect.width / 2 - popRect.width / 2
114
- }
115
-
116
- left = Math.min(Math.max(4, left), window.innerWidth - popRect.width - 4)
117
- top = Math.min(Math.max(4, top), window.innerHeight - popRect.height - 4)
118
-
119
- popperStyle.value = {
120
- position: 'fixed',
121
- top: `${Math.round(top)}px`,
122
- left: `${Math.round(left)}px`,
123
- zIndex: '4100',
124
- }
125
- }
126
-
127
- const clearTimers = () => {
128
- if (showTimer) clearTimeout(showTimer)
129
- if (hideTimer) clearTimeout(hideTimer)
130
- showTimer = undefined
131
- hideTimer = undefined
132
- }
133
-
134
- const show = async () => {
135
- if (props.disabled) return
136
- clearTimers()
137
- showTimer = setTimeout(async () => {
138
- visible.value = true
139
- await nextTick()
140
- updatePosition()
141
- requestAnimationFrame(() => updatePosition())
142
- }, props.showAfter)
143
- }
144
-
145
- const hide = () => {
146
- clearTimers()
147
- hideTimer = setTimeout(() => {
148
- if (!inPopper || props.trigger === 'click') visible.value = false
149
- if (props.trigger === 'hover' && !inPopper) visible.value = false
150
- }, props.hideAfter)
151
- }
152
-
153
- const onTriggerEnter = () => {
154
- if (props.trigger !== 'hover') return
155
- inPopper = false
156
- show()
157
- }
158
-
159
- const onTriggerLeave = () => {
160
- if (props.trigger === 'hover') {
161
- inPopper = false
162
- hide()
163
- }
164
- }
165
-
166
- const onTriggerClick = () => {
167
- if (props.trigger !== 'click' || props.disabled) return
168
- if (visible.value) {
169
- visible.value = false
170
- } else {
171
- show()
172
- }
173
- }
174
-
175
- const onPopperEnter = () => {
176
- if (props.trigger !== 'hover') return
177
- inPopper = true
178
- clearTimers()
179
- }
180
-
181
- const onDocClick = (e: MouseEvent) => {
182
- if (props.trigger !== 'click' || !visible.value) return
183
- const t = e.target as Node
184
- if (triggerRef.value?.contains(t) || popperRef.value?.contains(t)) return
185
- visible.value = false
186
- }
187
-
188
- const onScrollOrResize = () => {
189
- if (visible.value) updatePosition()
190
- }
191
-
192
- watch(visible, (v) => {
193
- if (v) {
194
- window.addEventListener('scroll', onScrollOrResize, true)
195
- window.addEventListener('resize', onScrollOrResize)
196
- if (props.trigger === 'click') document.addEventListener('click', onDocClick, true)
197
- } else {
198
- window.removeEventListener('scroll', onScrollOrResize, true)
199
- window.removeEventListener('resize', onScrollOrResize)
200
- document.removeEventListener('click', onDocClick, true)
201
- }
202
- })
203
-
204
- onBeforeUnmount(() => {
205
- clearTimers()
206
- window.removeEventListener('scroll', onScrollOrResize, true)
207
- window.removeEventListener('resize', onScrollOrResize)
208
- document.removeEventListener('click', onDocClick, true)
209
- })
210
- </script>
211
-
212
- <style lang="scss" scoped>
213
- .qiu-tips-host {
214
- display: inline-flex;
215
- vertical-align: middle;
216
- }
217
-
218
- .qiu-tips__trigger {
219
- display: inline-flex;
220
- vertical-align: middle;
221
- cursor: default;
222
- }
223
-
224
- .qiu-tips {
225
- --qiu-tips-color: var(--qiu-color-primary, #0f766e);
226
- position: fixed;
227
- box-sizing: border-box;
228
- max-width: 320px;
229
- padding: 8px 12px;
230
- font-size: 13px;
231
- line-height: 1.5;
232
- word-break: break-word;
233
- pointer-events: auto;
234
- border: 1px solid transparent;
235
- border-radius: 6px;
236
- box-shadow: var(--qiu-box-shadow-light, 0 4px 12px rgba(0, 0, 0, 0.12));
237
- }
238
-
239
- .qiu-tips__title {
240
- margin-bottom: 4px;
241
- font-weight: 600;
242
- }
243
-
244
- .qiu-tips__content {
245
- position: relative;
246
- z-index: 1;
247
- }
248
-
249
- .qiu-tips__arrow {
250
- position: absolute;
251
- width: 10px;
252
- height: 10px;
253
- pointer-events: none;
254
- background: inherit;
255
- border: inherit;
256
- border-right: 0;
257
- border-bottom: 0;
258
- }
259
-
260
- .qiu-tips--top .qiu-tips__arrow {
261
- bottom: -6px;
262
- left: 50%;
263
- margin-left: -5px;
264
- transform: rotate(-135deg);
265
- }
266
-
267
- .qiu-tips--bottom .qiu-tips__arrow {
268
- top: -6px;
269
- left: 50%;
270
- margin-left: -5px;
271
- transform: rotate(45deg);
272
- }
273
-
274
- .qiu-tips--left .qiu-tips__arrow {
275
- top: 50%;
276
- right: -6px;
277
- margin-top: -5px;
278
- transform: rotate(135deg);
279
- }
280
-
281
- .qiu-tips--right .qiu-tips__arrow {
282
- top: 50%;
283
- left: -6px;
284
- margin-top: -5px;
285
- transform: rotate(-45deg);
286
- }
287
-
288
- .qiu-tips--primary { --qiu-tips-color: var(--qiu-color-primary, #0f766e); }
289
- .qiu-tips--success { --qiu-tips-color: var(--qiu-color-success, #67c23a); }
290
- .qiu-tips--warning { --qiu-tips-color: var(--qiu-color-warning, #e6a23c); }
291
- .qiu-tips--danger { --qiu-tips-color: var(--qiu-color-danger, #f56c6c); }
292
- .qiu-tips--info { --qiu-tips-color: var(--qiu-color-info, #909399); }
293
- .qiu-tips--cyan { --qiu-tips-color: #0ea5e9; }
294
- .qiu-tips--orange { --qiu-tips-color: #f97316; }
295
- .qiu-tips--pink { --qiu-tips-color: #ec4899; }
296
- .qiu-tips--teal { --qiu-tips-color: #14b8a6; }
297
-
298
- .qiu-tips--dark {
299
- color: #fff;
300
- background: var(--qiu-tips-color);
301
- border-color: var(--qiu-tips-color);
302
- }
303
-
304
- .qiu-tips--light {
305
- color: var(--qiu-tips-color);
306
- background: #fff;
307
- border-color: color-mix(in srgb, var(--qiu-tips-color) 45%, #fff);
308
-
309
- .qiu-tips__title {
310
- color: var(--qiu-tips-color);
311
- }
312
- }
313
-
314
- .qiu-tips-fade-enter-active,
315
- .qiu-tips-fade-leave-active {
316
- transition: opacity 0.15s ease;
317
- }
318
-
319
- .qiu-tips-fade-enter-from,
320
- .qiu-tips-fade-leave-to {
321
- opacity: 0;
322
- }
323
- </style>
@@ -1,237 +0,0 @@
1
- <template>
2
- <span class="qiu-tooltip-host" v-bind="attrs">
3
- <span
4
- ref="triggerRef"
5
- class="qiu-tooltip__trigger"
6
- @mouseenter="onEnter"
7
- @mouseleave="onLeave"
8
- >
9
- <slot />
10
- </span>
11
-
12
- <Teleport to="body">
13
- <Transition name="qiu-tooltip-fade">
14
- <div
15
- v-show="visible"
16
- ref="popperRef"
17
- class="qiu-tooltip"
18
- :class="[`qiu-tooltip--${placement}`]"
19
- :style="popperStyle"
20
- role="tooltip"
21
- @mouseenter="onPopperEnter"
22
- @mouseleave="onLeave"
23
- >
24
- <div class="qiu-tooltip__content">
25
- <slot name="content">{{ content }}</slot>
26
- </div>
27
- <span class="qiu-tooltip__arrow" />
28
- </div>
29
- </Transition>
30
- </Teleport>
31
- </span>
32
- </template>
33
-
34
- <script lang="ts" setup>
35
- defineOptions({ name: 'QiuTooltip', inheritAttrs: false })
36
-
37
- type Placement = 'top' | 'bottom' | 'left' | 'right'
38
-
39
- const attrs = useAttrs()
40
-
41
- const props = withDefaults(
42
- defineProps<{
43
- content?: string
44
- placement?: Placement
45
- /** hover 延迟显示(ms) */
46
- showAfter?: number
47
- /** hover 延迟隐藏(ms) */
48
- hideAfter?: number
49
- }>(),
50
- {
51
- content: '',
52
- placement: 'top',
53
- showAfter: 0,
54
- hideAfter: 100,
55
- }
56
- )
57
-
58
- const triggerRef = ref<HTMLElement | null>(null)
59
- const popperRef = ref<HTMLElement | null>(null)
60
- const visible = ref(false)
61
- const popperStyle = ref<Record<string, string>>({})
62
-
63
- let showTimer: ReturnType<typeof setTimeout> | undefined
64
- let hideTimer: ReturnType<typeof setTimeout> | undefined
65
- let inPopper = false
66
-
67
- const updatePosition = () => {
68
- const trigger = triggerRef.value
69
- const popper = popperRef.value
70
- if (!trigger || !popper) return
71
-
72
- const rect = trigger.getBoundingClientRect()
73
- const popRect = popper.getBoundingClientRect()
74
- const gap = 8
75
- let top = 0
76
- let left = 0
77
-
78
- switch (props.placement) {
79
- case 'bottom':
80
- top = rect.bottom + gap
81
- left = rect.left + rect.width / 2 - popRect.width / 2
82
- break
83
- case 'left':
84
- top = rect.top + rect.height / 2 - popRect.height / 2
85
- left = rect.left - popRect.width - gap
86
- break
87
- case 'right':
88
- top = rect.top + rect.height / 2 - popRect.height / 2
89
- left = rect.right + gap
90
- break
91
- default:
92
- top = rect.top - popRect.height - gap
93
- left = rect.left + rect.width / 2 - popRect.width / 2
94
- }
95
-
96
- const vw = window.innerWidth
97
- const vh = window.innerHeight
98
- left = Math.min(Math.max(4, left), vw - popRect.width - 4)
99
- top = Math.min(Math.max(4, top), vh - popRect.height - 4)
100
-
101
- popperStyle.value = {
102
- position: 'fixed',
103
- top: `${top}px`,
104
- left: `${left}px`,
105
- zIndex: '3000',
106
- }
107
- }
108
-
109
- const clearTimers = () => {
110
- if (showTimer) clearTimeout(showTimer)
111
- if (hideTimer) clearTimeout(hideTimer)
112
- showTimer = undefined
113
- hideTimer = undefined
114
- }
115
-
116
- const show = async () => {
117
- clearTimers()
118
- showTimer = setTimeout(async () => {
119
- visible.value = true
120
- await nextTick()
121
- updatePosition()
122
- }, props.showAfter)
123
- }
124
-
125
- const hide = () => {
126
- clearTimers()
127
- hideTimer = setTimeout(() => {
128
- if (!inPopper) visible.value = false
129
- }, props.hideAfter)
130
- }
131
-
132
- const onEnter = () => {
133
- inPopper = false
134
- show()
135
- }
136
-
137
- const onLeave = () => hide()
138
-
139
- const onPopperEnter = () => {
140
- inPopper = true
141
- clearTimers()
142
- }
143
-
144
- const onScrollOrResize = () => {
145
- if (visible.value) updatePosition()
146
- }
147
-
148
- watch(visible, (v) => {
149
- if (v) {
150
- window.addEventListener('scroll', onScrollOrResize, true)
151
- window.addEventListener('resize', onScrollOrResize)
152
- } else {
153
- window.removeEventListener('scroll', onScrollOrResize, true)
154
- window.removeEventListener('resize', onScrollOrResize)
155
- }
156
- })
157
-
158
- onBeforeUnmount(() => {
159
- clearTimers()
160
- window.removeEventListener('scroll', onScrollOrResize, true)
161
- window.removeEventListener('resize', onScrollOrResize)
162
- })
163
- </script>
164
-
165
- <style lang="scss" scoped>
166
- .qiu-tooltip-host {
167
- display: inline-flex;
168
- vertical-align: middle;
169
- }
170
-
171
- .qiu-tooltip__trigger {
172
- display: inline-flex;
173
- vertical-align: middle;
174
- }
175
-
176
- .qiu-tooltip {
177
- position: fixed;
178
- max-width: 320px;
179
- padding: 6px 10px;
180
- font-size: 12px;
181
- line-height: 1.5;
182
- color: #fff;
183
- word-break: break-word;
184
- background: var(--qiu-text-color-primary, var(--qiu-text-color-primary, #303133));
185
- border-radius: 4px;
186
- box-shadow: var(--qiu-box-shadow-light, 0 2px 8px rgba(0, 0, 0, 0.12));
187
- box-sizing: border-box;
188
- pointer-events: auto;
189
- }
190
-
191
- .qiu-tooltip__content {
192
- position: relative;
193
- z-index: 1;
194
- }
195
-
196
- .qiu-tooltip__arrow {
197
- position: absolute;
198
- width: 8px;
199
- height: 8px;
200
- background: inherit;
201
- transform: rotate(45deg);
202
- }
203
-
204
- .qiu-tooltip--top .qiu-tooltip__arrow {
205
- bottom: -4px;
206
- left: 50%;
207
- margin-left: -4px;
208
- }
209
-
210
- .qiu-tooltip--bottom .qiu-tooltip__arrow {
211
- top: -4px;
212
- left: 50%;
213
- margin-left: -4px;
214
- }
215
-
216
- .qiu-tooltip--left .qiu-tooltip__arrow {
217
- top: 50%;
218
- right: -4px;
219
- margin-top: -4px;
220
- }
221
-
222
- .qiu-tooltip--right .qiu-tooltip__arrow {
223
- top: 50%;
224
- left: -4px;
225
- margin-top: -4px;
226
- }
227
-
228
- .qiu-tooltip-fade-enter-active,
229
- .qiu-tooltip-fade-leave-active {
230
- transition: opacity 0.15s ease;
231
- }
232
-
233
- .qiu-tooltip-fade-enter-from,
234
- .qiu-tooltip-fade-leave-to {
235
- opacity: 0;
236
- }
237
- </style>