npmapps 1.1.6 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/package.json +1 -1
  2. package/app/wujie-wk/dev.log +0 -1979
  3. package/app/wujie-wk/wujie-react-child/README.md +0 -126
  4. package/app/wujie-wk/wujie-react-child/eslint.config.js +0 -28
  5. package/app/wujie-wk/wujie-react-child/index.html +0 -13
  6. package/app/wujie-wk/wujie-react-child/package-lock.json +0 -4344
  7. package/app/wujie-wk/wujie-react-child/package.json +0 -32
  8. package/app/wujie-wk/wujie-react-child/public/vite.svg +0 -1
  9. package/app/wujie-wk/wujie-react-child/src/App.css +0 -0
  10. package/app/wujie-wk/wujie-react-child/src/App.tsx +0 -72
  11. package/app/wujie-wk/wujie-react-child/src/assets/react.svg +0 -1
  12. package/app/wujie-wk/wujie-react-child/src/components/FeatureCards.css +0 -63
  13. package/app/wujie-wk/wujie-react-child/src/components/FeatureCards.tsx +0 -112
  14. package/app/wujie-wk/wujie-react-child/src/components/LightCard/index.tsx +0 -36
  15. package/app/wujie-wk/wujie-react-child/src/components/LightCard/style.css +0 -20
  16. package/app/wujie-wk/wujie-react-child/src/hooks/use3DCard.ts +0 -53
  17. package/app/wujie-wk/wujie-react-child/src/hooks/useLightCard.ts +0 -141
  18. package/app/wujie-wk/wujie-react-child/src/index.css +0 -0
  19. package/app/wujie-wk/wujie-react-child/src/main.tsx +0 -8
  20. package/app/wujie-wk/wujie-react-child/src/pages/ChildToParent/index.css +0 -55
  21. package/app/wujie-wk/wujie-react-child/src/pages/ChildToParent/index.tsx +0 -88
  22. package/app/wujie-wk/wujie-react-child/src/pages/Css.tsx +0 -28
  23. package/app/wujie-wk/wujie-react-child/src/pages/Home.tsx +0 -72
  24. package/app/wujie-wk/wujie-react-child/src/pages/ParentToChild.css +0 -85
  25. package/app/wujie-wk/wujie-react-child/src/pages/ParentToChild.tsx +0 -119
  26. package/app/wujie-wk/wujie-react-child/src/pages/RouterJump/index.css +0 -61
  27. package/app/wujie-wk/wujie-react-child/src/pages/RouterJump/index.tsx +0 -87
  28. package/app/wujie-wk/wujie-react-child/src/router/index.tsx +0 -63
  29. package/app/wujie-wk/wujie-react-child/src/types/wujie.d.ts +0 -26
  30. package/app/wujie-wk/wujie-react-child/src/vite-env.d.ts +0 -1
  31. package/app/wujie-wk/wujie-react-child/tsconfig.app.json +0 -26
  32. package/app/wujie-wk/wujie-react-child/tsconfig.json +0 -7
  33. package/app/wujie-wk/wujie-react-child/tsconfig.node.json +0 -24
  34. package/app/wujie-wk/wujie-react-child/vite.config.ts +0 -10
  35. package/app/wujie-wk/wujie-vue3-child/.claude/settings.local.json +0 -8
  36. package/app/wujie-wk/wujie-vue3-child/.vscode/extensions.json +0 -3
  37. package/app/wujie-wk/wujie-vue3-child/PROJECT_MEMORY.md +0 -427
  38. package/app/wujie-wk/wujie-vue3-child/README.md +0 -5
  39. package/app/wujie-wk/wujie-vue3-child/index.html +0 -13
  40. package/app/wujie-wk/wujie-vue3-child/package-lock.json +0 -5744
  41. package/app/wujie-wk/wujie-vue3-child/package.json +0 -28
  42. package/app/wujie-wk/wujie-vue3-child/public/vite.svg +0 -1
  43. package/app/wujie-wk/wujie-vue3-child/src/App.vue +0 -130
  44. package/app/wujie-wk/wujie-vue3-child/src/assets/vue.svg +0 -1
  45. package/app/wujie-wk/wujie-vue3-child/src/components/HelloWorld.vue +0 -43
  46. package/app/wujie-wk/wujie-vue3-child/src/components/SmartAnchorTabs/index.jsx +0 -224
  47. package/app/wujie-wk/wujie-vue3-child/src/components/SmartAnchorTabs/style.css +0 -154
  48. package/app/wujie-wk/wujie-vue3-child/src/components/tags-view.vue +0 -193
  49. package/app/wujie-wk/wujie-vue3-child/src/components/tags-view1.vue +0 -131
  50. package/app/wujie-wk/wujie-vue3-child/src/directives/aiLoading.js +0 -182
  51. package/app/wujie-wk/wujie-vue3-child/src/hooks/useClickOutside.js +0 -11
  52. package/app/wujie-wk/wujie-vue3-child/src/hooks/useTableDragSort.js +0 -28
  53. package/app/wujie-wk/wujie-vue3-child/src/main.js +0 -18
  54. package/app/wujie-wk/wujie-vue3-child/src/router/index.js +0 -104
  55. package/app/wujie-wk/wujie-vue3-child/src/store/tagsViewStroe.js +0 -34
  56. package/app/wujie-wk/wujie-vue3-child/src/style.css +0 -171
  57. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/collapseExpand/index.jsx +0 -108
  58. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/collapseExpand/index.module.scss +0 -97
  59. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/README.md +0 -836
  60. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/REFLEX_EXAMPLES.md +0 -728
  61. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentPersonnelSelector.jsx +0 -687
  62. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentPersonnelSelector.module.scss +0 -560
  63. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelector.jsx +0 -570
  64. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelector.module.scss +0 -330
  65. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelectorV2.jsx +0 -378
  66. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelectorV2.module.scss +0 -228
  67. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/OptionsSelector.jsx +0 -399
  68. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/OptionsSelector.module.scss +0 -252
  69. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PersonnelSelector.jsx +0 -585
  70. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PersonnelSelector.module.scss +0 -331
  71. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PopoverSelector.jsx +0 -392
  72. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PopoverSelector.module.scss +0 -39
  73. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/README.md +0 -248
  74. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/SelectorTrigger.jsx +0 -194
  75. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/index.jsx +0 -1459
  76. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/mockData.js +0 -301
  77. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/dialogueSegment/index.jsx +0 -182
  78. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/dialogueSegment/index.module.scss +0 -28
  79. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/index.jsx +0 -375
  80. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ChartsPanel/index.jsx +0 -121
  81. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ChartsPanel/index.module.scss +0 -76
  82. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/DonutChart/index.jsx +0 -104
  83. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/PracticeTable/index.jsx +0 -75
  84. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/PracticeTable/index.module.scss +0 -12
  85. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankBarChart/index.jsx +0 -62
  86. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankBarChart/index.module.scss +0 -43
  87. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingGroup/index.jsx +0 -29
  88. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingGroup/index.module.scss +0 -5
  89. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingList/index.jsx +0 -58
  90. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingList/index.module.scss +0 -85
  91. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ScriptStatsPanel/index.jsx +0 -92
  92. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ScriptStatsPanel/index.module.scss +0 -56
  93. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/StatCardsRow/index.jsx +0 -40
  94. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/StatCardsRow/index.module.scss +0 -53
  95. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/echarts/EchartsDonut.jsx +0 -106
  96. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/echarts/EchartsRankBar.jsx +0 -132
  97. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/index.jsx +0 -176
  98. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/practiceStatus/index.module.scss +0 -96
  99. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/CoachReport/index.jsx +0 -162
  100. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/CoachReport/index.module.scss +0 -16
  101. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ComprehensiveEvaluation/index.jsx +0 -29
  102. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ComprehensiveEvaluation/index.module.scss +0 -25
  103. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.jsx +0 -106
  104. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.module.scss +0 -164
  105. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueRecord/index.jsx +0 -182
  106. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueRecord/index.module.scss +0 -203
  107. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionDetail/index.jsx +0 -145
  108. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionDetail/index.module.scss +0 -126
  109. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionScores/index.jsx +0 -67
  110. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionScores/index.module.scss +0 -105
  111. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ReportHeader/index.jsx +0 -81
  112. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ReportHeader/index.module.scss +0 -47
  113. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/RoleInfo/index.jsx +0 -64
  114. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/RoleInfo/index.module.scss +0 -85
  115. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ScoreBadge/index.jsx +0 -39
  116. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ScoreBadge/index.module.scss +0 -44
  117. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/SubDimensionItem/index.jsx +0 -83
  118. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/components/SubDimensionItem/index.module.scss +0 -101
  119. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/index.jsx +0 -50
  120. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/reportDetail/index.module.scss +0 -25
  121. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/scriptTable/index.jsx +0 -196
  122. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/scriptTable/index.module.scss +0 -41
  123. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/scriptTable/inputColumn/index.jsx +0 -183
  124. package/app/wujie-wk/wujie-vue3-child/src/views/aiCoach/scriptTable/inputColumn/index.module.scss +0 -115
  125. package/app/wujie-wk/wujie-vue3-child/src/views/child-to-parent.vue +0 -117
  126. package/app/wujie-wk/wujie-vue3-child/src/views/home.vue +0 -53
  127. package/app/wujie-wk/wujie-vue3-child/src/views/jsx/btnSelect/btnSelect.vue +0 -169
  128. package/app/wujie-wk/wujie-vue3-child/src/views/jsx/btnSelect/index.vue +0 -69
  129. package/app/wujie-wk/wujie-vue3-child/src/views/jsx/com.vue +0 -44
  130. package/app/wujie-wk/wujie-vue3-child/src/views/jsx/dialog.jsx +0 -66
  131. package/app/wujie-wk/wujie-vue3-child/src/views/jsx/index.vue +0 -72
  132. package/app/wujie-wk/wujie-vue3-child/src/views/jsx/props.vue +0 -33
  133. package/app/wujie-wk/wujie-vue3-child/src/views/parent-to-child.vue +0 -225
  134. package/app/wujie-wk/wujie-vue3-child/src/views/phone-code.vue +0 -318
  135. package/app/wujie-wk/wujie-vue3-child/src/views/router-jump.vue +0 -123
  136. package/app/wujie-wk/wujie-vue3-child/src/views/test.vue +0 -192
  137. package/app/wujie-wk/wujie-vue3-child/vite.config.js +0 -15
  138. package/app/wujie-wk/wujie-vue3-child copy/.vscode/extensions.json +0 -3
  139. package/app/wujie-wk/wujie-vue3-child copy/README.md +0 -5
  140. package/app/wujie-wk/wujie-vue3-child copy/index.html +0 -13
  141. package/app/wujie-wk/wujie-vue3-child copy/package-lock.json +0 -4617
  142. package/app/wujie-wk/wujie-vue3-child copy/package.json +0 -22
  143. package/app/wujie-wk/wujie-vue3-child copy/public/vite.svg +0 -1
  144. package/app/wujie-wk/wujie-vue3-child copy/src/App.vue +0 -124
  145. package/app/wujie-wk/wujie-vue3-child copy/src/assets/vue.svg +0 -1
  146. package/app/wujie-wk/wujie-vue3-child copy/src/components/HelloWorld.vue +0 -43
  147. package/app/wujie-wk/wujie-vue3-child copy/src/main.js +0 -12
  148. package/app/wujie-wk/wujie-vue3-child copy/src/router/index.js +0 -84
  149. package/app/wujie-wk/wujie-vue3-child copy/src/style.css +0 -4
  150. package/app/wujie-wk/wujie-vue3-child copy/src/views/child-to-parent.vue +0 -117
  151. package/app/wujie-wk/wujie-vue3-child copy/src/views/home.vue +0 -53
  152. package/app/wujie-wk/wujie-vue3-child copy/src/views/parent-to-child.vue +0 -225
  153. package/app/wujie-wk/wujie-vue3-child copy/src/views/phone-code.vue +0 -318
  154. package/app/wujie-wk/wujie-vue3-child copy/src/views/router-jump.vue +0 -115
  155. package/app/wujie-wk/wujie-vue3-child copy/src/views/test.vue +0 -192
  156. package/app/wujie-wk/wujie-vue3-child copy/vite.config.js +0 -10
  157. package/app/wujie-wk/wujie-vue3-main/.vscode/extensions.json +0 -3
  158. package/app/wujie-wk/wujie-vue3-main/README.md +0 -154
  159. package/app/wujie-wk/wujie-vue3-main/index.html +0 -13
  160. package/app/wujie-wk/wujie-vue3-main/package-lock.json +0 -4736
  161. package/app/wujie-wk/wujie-vue3-main/package.json +0 -25
  162. package/app/wujie-wk/wujie-vue3-main/public/vite.svg +0 -1
  163. package/app/wujie-wk/wujie-vue3-main/src/App.vue +0 -879
  164. package/app/wujie-wk/wujie-vue3-main/src/assets/vue.svg +0 -1
  165. package/app/wujie-wk/wujie-vue3-main/src/components/HelloWorld.vue +0 -43
  166. package/app/wujie-wk/wujie-vue3-main/src/components/WujieReact/index.vue +0 -20
  167. package/app/wujie-wk/wujie-vue3-main/src/components/WujieVue2/index.vue +0 -8
  168. package/app/wujie-wk/wujie-vue3-main/src/components/WujieVue3/index.vue +0 -8
  169. package/app/wujie-wk/wujie-vue3-main/src/components/WujieVue3Copy/index.vue +0 -8
  170. package/app/wujie-wk/wujie-vue3-main/src/main.js +0 -23
  171. package/app/wujie-wk/wujie-vue3-main/src/router/index.js +0 -88
  172. package/app/wujie-wk/wujie-vue3-main/src/store/useMicroAppStore.js +0 -66
  173. package/app/wujie-wk/wujie-vue3-main/src/style.css +0 -3
  174. package/app/wujie-wk/wujie-vue3-main/src/views/home.vue +0 -103
  175. package/app/wujie-wk/wujie-vue3-main/src/views/router-jump.vue +0 -159
  176. package/app/wujie-wk/wujie-vue3-main/src/views/test.vue +0 -125
  177. package/app/wujie-wk/wujie-vue3-main/src/views/vue3-child-msg.vue +0 -108
  178. package/app/wujie-wk/wujie-vue3-main/vite.config.js +0 -12
@@ -1,331 +0,0 @@
1
- // 人员选择器样式
2
- .personnelSelector {
3
- position: relative;
4
- width: 100%;
5
- }
6
-
7
- // 自定义输入框
8
- .customInput {
9
- display: flex;
10
- align-items: center;
11
- width: 100%;
12
- min-height: 32px;
13
- padding: 1px 11px;
14
- background: #fff;
15
- border: 1px solid #dcdfe6;
16
- border-radius: 4px;
17
- cursor: pointer;
18
- transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
19
- outline: none;
20
- box-sizing: border-box;
21
-
22
- &:hover {
23
- border-color: #c0c4cc;
24
- }
25
-
26
- &.focused {
27
- border-color: #409eff;
28
- }
29
-
30
- &.disabled {
31
- background-color: #f5f7fa;
32
- border-color: #e4e7ed;
33
- color: #c0c4cc;
34
- cursor: not-allowed;
35
- }
36
- }
37
-
38
- // 输入框内容区域
39
- .inputContent {
40
- flex: 1;
41
- display: flex;
42
- align-items: center;
43
- min-width: 0;
44
- min-height: 30px;
45
- padding: 2px 0;
46
- }
47
-
48
- // 占位符
49
- .placeholder {
50
- color: #c0c4cc;
51
- font-size: 14px;
52
- }
53
-
54
- // 前置标签
55
- .label {
56
- color: #606266;
57
- font-size: 14px;
58
- margin-right: 4px;
59
- flex-shrink: 0;
60
- }
61
-
62
- // 单选文本
63
- .text {
64
- color: #606266;
65
- font-size: 14px;
66
- overflow: hidden;
67
- text-overflow: ellipsis;
68
- white-space: nowrap;
69
- }
70
-
71
- // 标签容器
72
- .tagsWrapper {
73
- display: flex;
74
- align-items: center;
75
- flex-wrap: wrap;
76
- gap: 4px;
77
- }
78
-
79
- // 标签
80
- .tag {
81
- margin: 0;
82
- max-width: 100%;
83
-
84
- :global(.el-tag__content) {
85
- overflow: hidden;
86
- text-overflow: ellipsis;
87
- white-space: nowrap;
88
- }
89
- }
90
-
91
- // 按钮模式包装器
92
- .buttonWrapper {
93
- // width: 100%;
94
- }
95
-
96
- // 按钮内部容器
97
- .buttonInner {
98
- display: flex;
99
- align-items: center;
100
- justify-content: space-between;
101
- width: 100%;
102
- gap: 8px;
103
- }
104
-
105
- // 按钮内容区域
106
- .buttonContent {
107
- flex: 1;
108
- display: flex;
109
- align-items: center;
110
- min-width: 0;
111
- text-align: left;
112
- overflow: hidden;
113
- }
114
-
115
- // 按钮文字包装器(用于显示文字+徽章)
116
- .buttonTextWrapper {
117
- display: flex;
118
- align-items: center;
119
- gap: 8px;
120
- }
121
-
122
- // 数量徽章(圆圈显示 +N)
123
- .countBadge {
124
- display: inline-flex;
125
- align-items: center;
126
- justify-content: center;
127
- min-width: 20px;
128
- height: 20px;
129
- padding: 0 4px;
130
- background-color: #ecf5ff;
131
- color: #409eff;
132
- font-size: 12px;
133
- font-weight: 500;
134
- border-radius: 10px;
135
- white-space: nowrap;
136
- flex-shrink: 0;
137
- }
138
-
139
- // 右侧图标区域
140
- .suffixIcons {
141
- display: flex;
142
- align-items: center;
143
- gap: 4px;
144
- margin-left: 8px;
145
- flex-shrink: 0;
146
- }
147
-
148
- // 清除图标
149
- .clearIcon {
150
- font-size: 14px;
151
- color: #c0c4cc;
152
- cursor: pointer;
153
- transition: color 0.2s;
154
-
155
- &:hover {
156
- color: #909399;
157
- }
158
- }
159
-
160
- // 下拉箭头图标
161
- .arrowIcon {
162
- font-size: 14px;
163
- color: #c0c4cc;
164
- transition: transform 0.3s;
165
-
166
- &.reverse {
167
- transform: rotate(180deg);
168
- }
169
- }
170
-
171
- .disabled {
172
- .clearIcon,
173
- .arrowIcon {
174
- cursor: not-allowed;
175
- }
176
- }
177
-
178
- // 下拉框容器
179
- .dropdown {
180
- position: fixed;
181
- background: #fff;
182
- border: 1px solid #e4e7ed;
183
- border-radius: 4px;
184
- box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
185
- z-index: 2000;
186
- display: flex;
187
- flex-direction: column;
188
- overflow: hidden;
189
- }
190
-
191
- // 悬浮窗内容
192
- .dropdownContent {
193
- display: flex;
194
- flex-direction: column;
195
- height: 100%;
196
- max-height: inherit; // 继承父容器的 maxHeight
197
- overflow: hidden; // 防止内容溢出到悬浮窗外
198
- }
199
-
200
- // 搜索框区域
201
- .searchBox {
202
- padding: 8px;
203
- border-bottom: 1px solid #e4e7ed;
204
- background: #fff;
205
- }
206
-
207
- // 列表容器
208
- .listWrapper {
209
- flex: 1;
210
- overflow-y: auto;
211
-
212
- // 自定义滚动条样式
213
- &::-webkit-scrollbar {
214
- width: 6px;
215
- }
216
-
217
- &::-webkit-scrollbar-track {
218
- background: #f1f1f1;
219
- border-radius: 3px;
220
- }
221
-
222
- &::-webkit-scrollbar-thumb {
223
- background: #c1c1c1;
224
- border-radius: 3px;
225
-
226
- &:hover {
227
- background: #a8a8a8;
228
- }
229
- }
230
- }
231
-
232
- // 人员列表
233
- .personnelList {
234
- padding: 4px 0;
235
- }
236
-
237
- // 人员列表项
238
- .personnelItem {
239
- display: flex;
240
- align-items: center;
241
- padding: 8px 12px;
242
- cursor: pointer;
243
- transition: background-color 0.2s;
244
-
245
- &:hover {
246
- background-color: #f5f7fa;
247
- }
248
-
249
- &.selected {
250
- background-color: #ecf5ff;
251
-
252
- .personName {
253
- color: #409eff;
254
- font-weight: 500;
255
- }
256
- }
257
- }
258
-
259
- // 复选框
260
- .checkbox {
261
- margin-right: 8px;
262
- pointer-events: none;
263
- }
264
-
265
- // 人员信息
266
- .personInfo {
267
- flex: 1;
268
- min-width: 0;
269
- }
270
-
271
- // 人员姓名
272
- .personName {
273
- font-size: 14px;
274
- color: #606266;
275
- margin-bottom: 4px;
276
- overflow: hidden;
277
- text-overflow: ellipsis;
278
- white-space: nowrap;
279
- }
280
-
281
- // 人员元数据
282
- .personMeta {
283
- display: flex;
284
- align-items: center;
285
- font-size: 12px;
286
- color: #909399;
287
- }
288
-
289
- // 职位
290
- .position {
291
- overflow: hidden;
292
- text-overflow: ellipsis;
293
- white-space: nowrap;
294
- }
295
-
296
- // 分隔符
297
- .divider {
298
- margin: 0 6px;
299
- color: #dcdfe6;
300
- }
301
-
302
- // 电话
303
- .phone {
304
- overflow: hidden;
305
- text-overflow: ellipsis;
306
- white-space: nowrap;
307
- }
308
-
309
- // 空状态
310
- .empty {
311
- padding: 40px 16px;
312
- text-align: center;
313
- color: #909399;
314
- font-size: 14px;
315
- }
316
-
317
- // 加载状态
318
- .loading {
319
- display: flex;
320
- flex-direction: column;
321
- align-items: center;
322
- justify-content: center;
323
- padding: 40px 16px;
324
- color: #909399;
325
- font-size: 14px;
326
-
327
- .el-icon {
328
- font-size: 24px;
329
- margin-bottom: 8px;
330
- }
331
- }
@@ -1,392 +0,0 @@
1
- import { defineComponent, ref, onMounted, onBeforeUnmount, nextTick } from 'vue'
2
- import styles from './PopoverSelector.module.scss'
3
-
4
- /**
5
- * 通用悬浮窗选择器组件
6
- * @component PopoverSelector
7
- * @description 提供触发器和悬浮窗两个插槽,实现解耦的选择器组件
8
- *
9
- * @example
10
- * <PopoverSelector width={400} maxHeight={500}>
11
- * {{
12
- * trigger: ({ open, visible }) => (
13
- * <el-button onClick={open}>选择部门</el-button>
14
- * ),
15
- * default: ({ close }) => (
16
- * <div>悬浮窗内容</div>
17
- * )
18
- * }}
19
- * </PopoverSelector>
20
- */
21
- export default defineComponent({
22
- name: 'PopoverSelector',
23
-
24
- props: {
25
- /**
26
- * 悬浮窗宽度
27
- * @type {number|string}
28
- */
29
- width: {
30
- type: [Number, String],
31
- default: 400,
32
- },
33
- /**
34
- * 悬浮窗高度(不设置则自适应)
35
- * @type {number|string}
36
- */
37
- height: {
38
- type: [Number, String],
39
- default: null,
40
- },
41
- /**
42
- * 悬浮窗最大高度
43
- * @type {number}
44
- */
45
- maxHeight: {
46
- type: Number,
47
- default: 400,
48
- },
49
- /**
50
- * 悬浮窗自定义 class
51
- * @type {string|Array|Object}
52
- */
53
- dropdownClass: {
54
- type: [String, Array, Object],
55
- default: '',
56
- },
57
- /**
58
- * 悬浮窗自定义 style
59
- * @type {Object}
60
- */
61
- dropdownStyle: {
62
- type: Object,
63
- default: () => ({}),
64
- },
65
- /**
66
- * 是否禁用
67
- * @type {boolean}
68
- */
69
- disabled: {
70
- type: Boolean,
71
- default: false,
72
- },
73
- /**
74
- * 悬浮窗位置:auto 自动 | top 上方 | bottom 下方
75
- * @type {string}
76
- */
77
- placement: {
78
- type: String,
79
- default: 'auto',
80
- validator: (value) => ['auto', 'top', 'bottom'].includes(value),
81
- },
82
- /**
83
- * 悬浮窗与触发器的间距
84
- * @type {number}
85
- */
86
- offset: {
87
- type: Number,
88
- default: 4,
89
- },
90
- /**
91
- * 是否显示动画
92
- * @type {boolean}
93
- */
94
- animated: {
95
- type: Boolean,
96
- default: true,
97
- },
98
- /**
99
- * 触发方式:click 点击 | hover 悬浮
100
- * @type {string}
101
- */
102
- triggerEvent: {
103
- type: String,
104
- default: 'click',
105
- validator: (value) => ['click', 'hover'].includes(value),
106
- },
107
- /**
108
- * hover 触发时的延迟(毫秒)
109
- * @type {number}
110
- */
111
- hoverDelay: {
112
- type: Number,
113
- default: 200,
114
- },
115
- },
116
-
117
- emits: ['open', 'close', 'update:visible'],
118
-
119
- setup(props, { emit, slots }) {
120
- // 是否显示悬浮窗
121
- const visible = ref(false)
122
-
123
- // 触发器 ref
124
- const triggerRef = ref(null)
125
-
126
- // 悬浮窗 ref
127
- const dropdownRef = ref(null)
128
-
129
- // 悬浮窗动态样式
130
- const computedDropdownStyle = ref({})
131
-
132
- // hover 延迟定时器
133
- let hoverTimer = null
134
-
135
- /**
136
- * 计算悬浮窗位置
137
- */
138
- const calculatePosition = () => {
139
- if (!triggerRef.value || !dropdownRef.value) return
140
-
141
- // 获取真正的 DOM 元素(处理 el-button 等组件实例)
142
- const triggerEl = triggerRef.value.$el || triggerRef.value
143
- const rect = triggerEl.getBoundingClientRect()
144
-
145
- // 悬浮窗尺寸
146
- const dropdownWidth = typeof props.width === 'number' ? props.width : parseInt(props.width)
147
- const dropdownHeight = props.height
148
- ? (typeof props.height === 'number' ? props.height : parseInt(props.height))
149
- : null
150
-
151
- // 计算可用空间
152
- const spaceBelow = window.innerHeight - rect.bottom
153
- const spaceAbove = rect.top
154
-
155
- // 判断显示位置
156
- let showAbove = false
157
- if (props.placement === 'top') {
158
- showAbove = true
159
- } else if (props.placement === 'bottom') {
160
- showAbove = false
161
- } else {
162
- // auto 模式:根据空间自动判断
163
- showAbove = spaceBelow < props.maxHeight && spaceAbove > spaceBelow
164
- }
165
-
166
- // 基础样式
167
- const baseStyle = {
168
- position: 'fixed',
169
- left: `${rect.left}px`,
170
- width: `${dropdownWidth}px`,
171
- }
172
-
173
- // 根据位置计算样式
174
- if (showAbove) {
175
- // 显示在上方
176
- const availableHeight = Math.min(props.maxHeight, spaceAbove - props.offset)
177
- computedDropdownStyle.value = {
178
- ...baseStyle,
179
- bottom: `${window.innerHeight - rect.top + props.offset}px`,
180
- maxHeight: dropdownHeight ? 'none' : `${availableHeight}px`,
181
- height: dropdownHeight ? `${Math.min(dropdownHeight, availableHeight)}px` : 'auto',
182
- }
183
- } else {
184
- // 显示在下方
185
- const availableHeight = Math.min(props.maxHeight, spaceBelow - props.offset)
186
- computedDropdownStyle.value = {
187
- ...baseStyle,
188
- top: `${rect.bottom + props.offset}px`,
189
- maxHeight: dropdownHeight ? 'none' : `${availableHeight}px`,
190
- height: dropdownHeight ? `${Math.min(dropdownHeight, availableHeight)}px` : 'auto',
191
- }
192
- }
193
-
194
- // 合并用户自定义样式
195
- computedDropdownStyle.value = {
196
- ...computedDropdownStyle.value,
197
- ...props.dropdownStyle,
198
- }
199
- }
200
-
201
- /**
202
- * 打开悬浮窗
203
- */
204
- const open = async () => {
205
- if (props.disabled) return
206
-
207
- visible.value = true
208
- emit('update:visible', true)
209
- emit('open')
210
-
211
- // 等待 DOM 更新后计算位置
212
- await nextTick()
213
- calculatePosition()
214
- }
215
-
216
- /**
217
- * 关闭悬浮窗
218
- */
219
- const close = () => {
220
- visible.value = false
221
- emit('update:visible', false)
222
- emit('close')
223
- }
224
-
225
- /**
226
- * 切换悬浮窗
227
- */
228
- const toggle = () => {
229
- if (visible.value) {
230
- close()
231
- } else {
232
- open()
233
- }
234
- }
235
-
236
- /**
237
- * 处理 hover 进入
238
- */
239
- const handleMouseEnter = () => {
240
- if (props.triggerEvent !== 'hover' || props.disabled) return
241
-
242
- // 清除之前的定时器
243
- if (hoverTimer) {
244
- clearTimeout(hoverTimer)
245
- }
246
-
247
- // 延迟打开
248
- hoverTimer = setTimeout(() => {
249
- open()
250
- }, props.hoverDelay)
251
- }
252
-
253
- /**
254
- * 处理 hover 离开
255
- */
256
- const handleMouseLeave = () => {
257
- if (props.triggerEvent !== 'hover') return
258
-
259
- // 清除定时器
260
- if (hoverTimer) {
261
- clearTimeout(hoverTimer)
262
- }
263
-
264
- // 延迟关闭
265
- hoverTimer = setTimeout(() => {
266
- close()
267
- }, props.hoverDelay)
268
- }
269
-
270
- /**
271
- * 取消关闭(鼠标进入悬浮窗时)
272
- */
273
- const cancelClose = () => {
274
- if (hoverTimer) {
275
- clearTimeout(hoverTimer)
276
- }
277
- }
278
-
279
- /**
280
- * 点击外部关闭
281
- */
282
- const handleClickOutside = (e) => {
283
- if (!visible.value) return
284
-
285
- const triggerEl = triggerRef.value?.$el || triggerRef.value
286
- const dropdownEl = dropdownRef.value
287
-
288
- if (
289
- triggerEl &&
290
- dropdownEl &&
291
- !triggerEl.contains(e.target) &&
292
- !dropdownEl.contains(e.target)
293
- ) {
294
- close()
295
- }
296
- }
297
-
298
- /**
299
- * 窗口大小改变时重新计算位置
300
- */
301
- const handleResize = () => {
302
- if (visible.value) {
303
- calculatePosition()
304
- }
305
- }
306
-
307
- // 生命周期
308
- onMounted(() => {
309
- document.addEventListener('click', handleClickOutside)
310
- window.addEventListener('resize', handleResize)
311
- window.addEventListener('scroll', handleResize, true)
312
- })
313
-
314
- onBeforeUnmount(() => {
315
- document.removeEventListener('click', handleClickOutside)
316
- window.removeEventListener('resize', handleResize)
317
- window.removeEventListener('scroll', handleResize, true)
318
-
319
- // 清除定时器
320
- if (hoverTimer) {
321
- clearTimeout(hoverTimer)
322
- }
323
- })
324
-
325
- return () => {
326
- // 检查是否提供了必需的插槽
327
- if (!slots.trigger) {
328
- console.warn('PopoverSelector: trigger 插槽是必需的')
329
- return null
330
- }
331
-
332
- // 构建触发器事件
333
- const triggerEvents = {}
334
- if (props.triggerEvent === 'hover') {
335
- triggerEvents.onMouseenter = handleMouseEnter
336
- triggerEvents.onMouseleave = handleMouseLeave
337
- }
338
-
339
- // 渲染触发器插槽
340
- const triggerSlot = slots.trigger?.({
341
- open,
342
- close,
343
- toggle,
344
- visible: visible.value,
345
- // 传递事件给插槽,让用户可以自定义
346
- events: triggerEvents,
347
- })
348
-
349
- // 渲染悬浮窗内容插槽
350
- const dropdownContent = slots.default?.({
351
- close,
352
- visible: visible.value,
353
- })
354
-
355
- // 悬浮窗的 hover 事件(用于 hover 模式)
356
- const dropdownEvents = {}
357
- if (props.triggerEvent === 'hover') {
358
- dropdownEvents.onMouseenter = cancelClose
359
- dropdownEvents.onMouseleave = handleMouseLeave
360
- }
361
-
362
- return (
363
- <div class={styles.popoverSelector}>
364
- {/* 触发器 */}
365
- <div
366
- ref={triggerRef}
367
- class={styles.trigger}
368
- {...triggerEvents}
369
- >
370
- {triggerSlot}
371
- </div>
372
-
373
- {/* 悬浮窗 */}
374
- {visible.value && (
375
- <div
376
- ref={dropdownRef}
377
- class={[
378
- styles.dropdown,
379
- props.animated && styles.animated,
380
- props.dropdownClass,
381
- ]}
382
- style={computedDropdownStyle.value}
383
- {...dropdownEvents}
384
- >
385
- {dropdownContent}
386
- </div>
387
- )}
388
- </div>
389
- )
390
- }
391
- },
392
- })