vome-core 0.1.77 → 0.1.79

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 (203) hide show
  1. package/dist/admin/api/client.js +2 -3
  2. package/dist/admin/components/layout/vm-app-header.vue +341 -0
  3. package/dist/admin/components/layout/vm-app-sidebar.vue +187 -0
  4. package/dist/admin/components/layout/vm-sidebar-flyout.vue +268 -0
  5. package/dist/admin/components/layout/vm-sidebar-nav-item.vue +490 -0
  6. package/dist/admin/components/layout/vm-sidebar-nav.vue +104 -0
  7. package/dist/admin/components/layout/vm-tags-view.vue +233 -0
  8. package/dist/admin/components/ui/avatar/Avatar.vue +18 -0
  9. package/dist/admin/components/ui/avatar/AvatarFallback.vue +21 -0
  10. package/dist/admin/components/ui/avatar/AvatarImage.vue +16 -0
  11. package/dist/admin/components/ui/avatar/index.d.ts +3 -0
  12. package/dist/admin/components/ui/avatar/index.js +1 -0
  13. package/dist/admin/components/ui/badge/Badge.vue +26 -0
  14. package/dist/admin/components/ui/badge/index.d.ts +6 -0
  15. package/dist/admin/components/ui/badge/index.js +1 -0
  16. package/dist/admin/components/ui/button/Button.vue +31 -0
  17. package/dist/admin/components/ui/button/index.d.ts +7 -0
  18. package/dist/admin/components/ui/button/index.js +1 -0
  19. package/dist/admin/components/ui/checkbox/Checkbox.vue +35 -0
  20. package/dist/admin/components/ui/checkbox/index.d.ts +1 -0
  21. package/dist/admin/components/ui/checkbox/index.js +1 -0
  22. package/dist/admin/components/ui/dialog/Dialog.vue +19 -0
  23. package/dist/admin/components/ui/dialog/DialogClose.vue +15 -0
  24. package/dist/admin/components/ui/dialog/DialogContent.vue +135 -0
  25. package/dist/admin/components/ui/dialog/DialogDescription.vue +23 -0
  26. package/dist/admin/components/ui/dialog/DialogFooter.vue +27 -0
  27. package/dist/admin/components/ui/dialog/DialogHeader.vue +17 -0
  28. package/dist/admin/components/ui/dialog/DialogOverlay.vue +21 -0
  29. package/dist/admin/components/ui/dialog/DialogScrollContent.vue +60 -0
  30. package/dist/admin/components/ui/dialog/DialogTitle.vue +23 -0
  31. package/dist/admin/components/ui/dialog/DialogTrigger.vue +15 -0
  32. package/dist/admin/components/ui/dialog/index.d.ts +10 -0
  33. package/dist/admin/components/ui/dialog/index.js +1 -0
  34. package/dist/admin/components/ui/dropdown-menu/DropdownMenu.vue +19 -0
  35. package/dist/admin/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +39 -0
  36. package/dist/admin/components/ui/dropdown-menu/DropdownMenuContent.vue +39 -0
  37. package/dist/admin/components/ui/dropdown-menu/DropdownMenuGroup.vue +15 -0
  38. package/dist/admin/components/ui/dropdown-menu/DropdownMenuItem.vue +31 -0
  39. package/dist/admin/components/ui/dropdown-menu/DropdownMenuLabel.vue +23 -0
  40. package/dist/admin/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +21 -0
  41. package/dist/admin/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +40 -0
  42. package/dist/admin/components/ui/dropdown-menu/DropdownMenuSeparator.vue +23 -0
  43. package/dist/admin/components/ui/dropdown-menu/DropdownMenuShortcut.vue +17 -0
  44. package/dist/admin/components/ui/dropdown-menu/DropdownMenuSub.vue +18 -0
  45. package/dist/admin/components/ui/dropdown-menu/DropdownMenuSubContent.vue +27 -0
  46. package/dist/admin/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +31 -0
  47. package/dist/admin/components/ui/dropdown-menu/DropdownMenuTrigger.vue +17 -0
  48. package/dist/admin/components/ui/dropdown-menu/index.d.ts +15 -0
  49. package/dist/admin/components/ui/dropdown-menu/index.js +1 -0
  50. package/dist/admin/components/ui/input/Input.vue +34 -0
  51. package/dist/admin/components/ui/input/index.d.ts +1 -0
  52. package/dist/admin/components/ui/input/index.js +1 -0
  53. package/dist/admin/components/ui/label/Label.vue +26 -0
  54. package/dist/admin/components/ui/label/index.d.ts +1 -0
  55. package/dist/admin/components/ui/label/index.js +1 -0
  56. package/dist/admin/components/ui/scroll-area/ScrollArea.vue +33 -0
  57. package/dist/admin/components/ui/scroll-area/ScrollBar.vue +32 -0
  58. package/dist/admin/components/ui/scroll-area/index.d.ts +2 -0
  59. package/dist/admin/components/ui/scroll-area/index.js +1 -0
  60. package/dist/admin/components/ui/select/Select.vue +19 -0
  61. package/dist/admin/components/ui/select/SelectContent.vue +51 -0
  62. package/dist/admin/components/ui/select/SelectGroup.vue +15 -0
  63. package/dist/admin/components/ui/select/SelectItem.vue +44 -0
  64. package/dist/admin/components/ui/select/SelectItemText.vue +15 -0
  65. package/dist/admin/components/ui/select/SelectLabel.vue +17 -0
  66. package/dist/admin/components/ui/select/SelectScrollDownButton.vue +26 -0
  67. package/dist/admin/components/ui/select/SelectScrollUpButton.vue +26 -0
  68. package/dist/admin/components/ui/select/SelectSeparator.vue +19 -0
  69. package/dist/admin/components/ui/select/SelectTrigger.vue +33 -0
  70. package/dist/admin/components/ui/select/SelectValue.vue +15 -0
  71. package/dist/admin/components/ui/select/index.d.ts +11 -0
  72. package/dist/admin/components/ui/select/index.js +1 -0
  73. package/dist/admin/components/ui/separator/Separator.vue +29 -0
  74. package/dist/admin/components/ui/separator/index.d.ts +1 -0
  75. package/dist/admin/components/ui/separator/index.js +1 -0
  76. package/dist/admin/components/ui/sheet/Sheet.vue +19 -0
  77. package/dist/admin/components/ui/sheet/SheetClose.vue +15 -0
  78. package/dist/admin/components/ui/sheet/SheetContent.vue +63 -0
  79. package/dist/admin/components/ui/sheet/SheetDescription.vue +21 -0
  80. package/dist/admin/components/ui/sheet/SheetFooter.vue +16 -0
  81. package/dist/admin/components/ui/sheet/SheetHeader.vue +15 -0
  82. package/dist/admin/components/ui/sheet/SheetOverlay.vue +21 -0
  83. package/dist/admin/components/ui/sheet/SheetTitle.vue +21 -0
  84. package/dist/admin/components/ui/sheet/SheetTrigger.vue +15 -0
  85. package/dist/admin/components/ui/sheet/index.d.ts +8 -0
  86. package/dist/admin/components/ui/sheet/index.js +1 -0
  87. package/dist/admin/components/ui/sonner/Toaster.vue +117 -0
  88. package/dist/admin/components/ui/sonner/index.d.ts +1 -0
  89. package/dist/admin/components/ui/sonner/index.js +1 -0
  90. package/dist/admin/components/ui/table/Table.vue +16 -0
  91. package/dist/admin/components/ui/table/TableBody.vue +17 -0
  92. package/dist/admin/components/ui/table/TableCaption.vue +17 -0
  93. package/dist/admin/components/ui/table/TableCell.vue +22 -0
  94. package/dist/admin/components/ui/table/TableEmpty.vue +34 -0
  95. package/dist/admin/components/ui/table/TableFooter.vue +17 -0
  96. package/dist/admin/components/ui/table/TableHead.vue +17 -0
  97. package/dist/admin/components/ui/table/TableHeader.vue +17 -0
  98. package/dist/admin/components/ui/table/TableRow.vue +17 -0
  99. package/dist/admin/components/ui/table/index.d.ts +9 -0
  100. package/dist/admin/components/ui/table/index.js +1 -0
  101. package/dist/admin/components/ui/tabs/Tabs.vue +24 -0
  102. package/dist/admin/components/ui/tabs/TabsContent.vue +21 -0
  103. package/dist/admin/components/ui/tabs/TabsList.vue +24 -0
  104. package/dist/admin/components/ui/tabs/TabsTrigger.vue +26 -0
  105. package/dist/admin/components/ui/tabs/index.d.ts +4 -0
  106. package/dist/admin/components/ui/tabs/index.js +1 -0
  107. package/dist/admin/components/ui/tooltip/Tooltip.vue +19 -0
  108. package/dist/admin/components/ui/tooltip/TooltipContent.vue +34 -0
  109. package/dist/admin/components/ui/tooltip/TooltipProvider.vue +14 -0
  110. package/dist/admin/components/ui/tooltip/TooltipTrigger.vue +15 -0
  111. package/dist/admin/components/ui/tooltip/index.d.ts +4 -0
  112. package/dist/admin/components/ui/tooltip/index.js +1 -0
  113. package/dist/admin/crud/components/vm-color-picker.vue +0 -3
  114. package/dist/admin/crud/components/vm-richtext-extensions.js +1 -1
  115. package/dist/admin/crud/config.js +1 -1
  116. package/dist/admin/crud/confirm.d.ts +8 -0
  117. package/dist/admin/crud/confirm.js +1 -1
  118. package/dist/admin/crud/crud-page-request.js +1 -1
  119. package/dist/admin/crud/dict.js +1 -1
  120. package/dist/admin/crud/export-fetch.js +1 -1
  121. package/dist/admin/crud/key.js +1 -1
  122. package/dist/admin/crud/plugins.js +1 -1
  123. package/dist/admin/crud/span.js +1 -1
  124. package/dist/admin/crud/style.d.ts +4 -0
  125. package/dist/admin/crud/style.js +1 -1
  126. package/dist/admin/crud/validate.js +1 -1
  127. package/dist/admin/directives/perm.js +1 -1
  128. package/dist/admin/env.d.ts +0 -4
  129. package/dist/admin/hooks/useUpload.js +1 -1
  130. package/dist/admin/index.d.ts +11 -9
  131. package/dist/admin/index.js +16 -27
  132. package/dist/admin/lib/browser.js +1 -1
  133. package/dist/admin/lib/cn.js +1 -1
  134. package/dist/admin/lib/dialog-float.js +1 -1
  135. package/dist/admin/lib/document-title.d.ts +6 -0
  136. package/dist/admin/lib/document-title.js +1 -0
  137. package/dist/admin/lib/export-excel.js +1 -1
  138. package/dist/admin/lib/import-excel.js +1 -1
  139. package/dist/admin/lib/json.js +1 -1
  140. package/dist/admin/lib/menu.js +1 -1
  141. package/dist/admin/lib/micro-locale.d.ts +5 -0
  142. package/dist/admin/lib/micro-locale.js +1 -0
  143. package/dist/admin/lib/micro-theme.d.ts +14 -0
  144. package/dist/admin/lib/micro-theme.js +1 -0
  145. package/dist/admin/lib/setup-crud-defaults.d.ts +2 -0
  146. package/dist/admin/lib/setup-crud-defaults.js +1 -0
  147. package/dist/admin/lib/shell.d.ts +13 -0
  148. package/dist/admin/lib/shell.js +1 -0
  149. package/dist/admin/lib/theme-color-options.js +1 -1
  150. package/dist/admin/lib/tree.js +1 -1
  151. package/dist/admin/lib/upload.js +1 -1
  152. package/dist/admin/lib/video-frame.js +1 -1
  153. package/dist/admin/router/create.d.ts +16 -0
  154. package/dist/admin/router/create.js +1 -0
  155. package/dist/admin/router/guards.d.ts +6 -0
  156. package/dist/admin/router/guards.js +1 -0
  157. package/dist/admin/router/index.d.ts +5 -3
  158. package/dist/admin/router/index.js +5 -80
  159. package/dist/admin/router/menu-routes.d.ts +7 -2
  160. package/dist/admin/router/menu-routes.js +10 -12
  161. package/dist/admin/service/index.js +0 -3
  162. package/dist/admin/stores/dict.d.ts +13 -0
  163. package/dist/admin/stores/dict.js +1 -0
  164. package/dist/admin/stores/locale.d.ts +3 -0
  165. package/dist/admin/stores/locale.js +1 -0
  166. package/dist/admin/stores/theme.d.ts +1 -0
  167. package/dist/admin/stores/theme.js +1 -0
  168. package/dist/admin/themes/dark.d.ts +2 -0
  169. package/dist/admin/themes/dark.js +1 -0
  170. package/dist/admin/themes/index.d.ts +9 -0
  171. package/dist/admin/themes/index.js +1 -0
  172. package/dist/admin/themes/light.d.ts +2 -0
  173. package/dist/admin/themes/light.js +1 -0
  174. package/dist/client/configure.d.ts +3 -0
  175. package/dist/client/configure.js +8 -1
  176. package/dist/client/vite-admin.js +2 -4
  177. package/dist/client/vite-auto-import.js +4 -4
  178. package/dist/client/vite-resolve.d.ts +3 -3
  179. package/dist/client/vite-resolve.js +10 -15
  180. package/dist/ext/plugin-market-urls.d.ts +8 -0
  181. package/dist/index.js +1 -1
  182. package/dist/server/index.js +1 -1
  183. package/dist/shared/datetime-picker.js +1 -1
  184. package/dist/shared/excel.js +1 -1
  185. package/dist/shared/index.js +1 -1
  186. package/dist/shared/locale-json.js +1 -1
  187. package/dist/shared/tree.js +1 -1
  188. package/package.json +13 -4
  189. package/typings/admin/theme.ts +10 -0
  190. package/dist/admin/config/plugin-dev.d.ts +0 -52
  191. package/dist/admin/config/plugin-dev.js +0 -1
  192. package/dist/comm/chinese-segments.test.d.ts +0 -1
  193. package/dist/comm/path.test.d.ts +0 -1
  194. package/typings/admin/base/auth.d.ts +0 -21
  195. package/typings/admin/base/permission.d.ts +0 -19
  196. package/typings/admin/comm/crud.d.ts +0 -343
  197. package/typings/admin/comm/eps.d.ts +0 -66
  198. package/typings/admin/comm/request.d.ts +0 -13
  199. package/typings/admin/comm/service.d.ts +0 -48
  200. package/typings/admin/comm/upload.d.ts +0 -26
  201. package/typings/admin/host.d.ts +0 -66
  202. package/typings/admin/vome/browser.d.ts +0 -10
  203. package/typings/admin/vome/module.d.ts +0 -13
@@ -0,0 +1,268 @@
1
+ <template>
2
+ <div
3
+ class="vm-flyout"
4
+ :class="{ 'is-nested': nested }"
5
+ :style="panelStyle"
6
+ @mouseenter="emit('enter')"
7
+ @mouseleave="emit('leave')"
8
+ >
9
+ <div
10
+ v-for="node in items"
11
+ :key="node.id"
12
+ class="vm-flyout__row"
13
+ :class="{
14
+ 'is-active': isActiveLeaf(node) || containsActive(node),
15
+ 'is-open': openId === node.id,
16
+ }"
17
+ @mouseenter="onRowEnter(node)"
18
+ @mouseleave="onRowLeave(node)"
19
+ >
20
+ <RouterLink
21
+ v-if="isLeaf(node) && node.router"
22
+ :to="node.router"
23
+ class="vm-flyout__link"
24
+ @click="onLeafClick(node)"
25
+ >
26
+ <vm-ri-icon v-if="hasIcon(node)" :name="iconOf(node)" class="vm-flyout__icon" />
27
+ <span class="vm-flyout__label">{{ menuLabelOf(node) }}</span>
28
+ </RouterLink>
29
+
30
+ <button v-else type="button" class="vm-flyout__link">
31
+ <vm-ri-icon v-if="hasIcon(node)" :name="iconOf(node)" class="vm-flyout__icon" />
32
+ <span class="vm-flyout__label">{{ menuLabelOf(node) }}</span>
33
+ <i class="ri-arrow-right-s-line vm-flyout__chevron" />
34
+ </button>
35
+
36
+ <vm-sidebar-flyout
37
+ v-if="isDir(node) && openId === node.id"
38
+ nested
39
+ :items="kids(node)"
40
+ :parent-id="node.id"
41
+ @enter="clearLeaveTimer"
42
+ @leave="scheduleCloseRow"
43
+ @navigate="emit('navigate')"
44
+ />
45
+ </div>
46
+ </div>
47
+ </template>
48
+
49
+ <script setup lang="ts">
50
+ import { useLocaleStore } from '../../stores/locale'
51
+
52
+ defineOptions({ name: 'vm-sidebar-flyout' })
53
+
54
+ const props = defineProps<{
55
+ items: MenuTreeNode[]
56
+ /** 浮窗相对视口定位(根级);嵌套级不传 */
57
+ anchor?: { top: number; left: number }
58
+ nested?: boolean
59
+ parentId?: number | null
60
+ }>()
61
+
62
+ const emit = defineEmits<{
63
+ enter: []
64
+ leave: []
65
+ navigate: []
66
+ }>()
67
+
68
+ const locale = useLocaleStore()
69
+ function menuLabelOf(node: MenuTreeNode) {
70
+ return locale.tMenu(node)
71
+ }
72
+
73
+ const route = useRoute()
74
+
75
+ const PENDING_KEY = 'sidebar-pending-leaf'
76
+ const DEEP_KEY = 'sidebar-deep-focus'
77
+ const pendingLeafId = inject<Ref<number | null>>(PENDING_KEY)!
78
+ const deepFocusId = inject<Ref<number | null>>(DEEP_KEY)!
79
+ if (!pendingLeafId || !deepFocusId) {
80
+ throw new Error('[vm-sidebar-flyout] 缺少 sidebar provide')
81
+ }
82
+
83
+ const openId = ref<number | null>(null)
84
+ let leaveTimer: ReturnType<typeof setTimeout> | null = null
85
+
86
+ const panelStyle = computed(() => {
87
+ if (props.nested || !props.anchor) return undefined
88
+ return {
89
+ top: `${props.anchor.top}px`,
90
+ left: `${props.anchor.left}px`,
91
+ } as Record<string, string>
92
+ })
93
+
94
+ function kids(item: MenuTreeNode) {
95
+ return (item.children ?? []).filter(
96
+ (c) => c.isShow !== false && Number(c.type) !== 2,
97
+ )
98
+ }
99
+
100
+ function isDir(item: MenuTreeNode) {
101
+ return Number(item.type) === 0 || kids(item).length > 0
102
+ }
103
+
104
+ function isLeaf(item: MenuTreeNode) {
105
+ return Number(item.type) === 1 && Boolean(item.router)
106
+ }
107
+
108
+ /** 仅配置了 icon 才展示,不占空白位 */
109
+ function hasIcon(item: MenuTreeNode) {
110
+ return Boolean(item.icon && String(item.icon).trim())
111
+ }
112
+
113
+ function iconOf(item: MenuTreeNode) {
114
+ const raw = String(item.icon || '').trim()
115
+ return raw.startsWith('ri-') ? raw : `ri-${raw}`
116
+ }
117
+
118
+ function isActiveLeaf(item: MenuTreeNode) {
119
+ if (!item.router) return false
120
+ return route.path === item.router || route.path.startsWith(`${item.router}/`)
121
+ }
122
+
123
+ function containsActive(item: MenuTreeNode): boolean {
124
+ if (isActiveLeaf(item)) return true
125
+ return kids(item).some((c) => containsActive(c))
126
+ }
127
+
128
+ function clearLeaveTimer() {
129
+ if (leaveTimer) {
130
+ clearTimeout(leaveTimer)
131
+ leaveTimer = null
132
+ }
133
+ }
134
+
135
+ function onRowEnter(node: MenuTreeNode) {
136
+ clearLeaveTimer()
137
+ if (isDir(node)) openId.value = node.id
138
+ else openId.value = null
139
+ }
140
+
141
+ function onRowLeave(node: MenuTreeNode) {
142
+ if (!isDir(node)) return
143
+ leaveTimer = setTimeout(() => {
144
+ if (openId.value === node.id) openId.value = null
145
+ }, 120)
146
+ }
147
+
148
+ function scheduleCloseRow() {
149
+ leaveTimer = setTimeout(() => {
150
+ openId.value = null
151
+ }, 120)
152
+ }
153
+
154
+ function onLeafClick(node: MenuTreeNode) {
155
+ pendingLeafId.value = node.id
156
+ deepFocusId.value = props.parentId ?? null
157
+ emit('navigate')
158
+ }
159
+
160
+ onBeforeUnmount(() => clearLeaveTimer())
161
+ </script>
162
+
163
+ <style lang="scss" scoped>
164
+ .vm-flyout {
165
+ position: fixed;
166
+ z-index: 80;
167
+ box-sizing: border-box;
168
+ min-width: 168px;
169
+ max-width: 240px;
170
+ padding: 6px;
171
+ border-radius: 12px;
172
+ background: #fff;
173
+ box-shadow: 0 10px 30px rgba(40, 50, 120, 0.14);
174
+
175
+ /* 嵌套级:相对当前行右侧展开,级间留缝 */
176
+ &.is-nested {
177
+ position: absolute;
178
+ top: -6px;
179
+ left: calc(100% + 10px);
180
+ margin: 0;
181
+
182
+ /* 透明桥:盖住级间空隙,鼠标移动不中断 */
183
+ &::before {
184
+ content: '';
185
+ position: absolute;
186
+ top: 0;
187
+ bottom: 0;
188
+ left: -10px;
189
+ width: 10px;
190
+ }
191
+ }
192
+ }
193
+
194
+ :global(.dark) .vm-flyout {
195
+ background: var(--card);
196
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4);
197
+ }
198
+
199
+ .vm-flyout__row {
200
+ position: relative;
201
+ }
202
+
203
+ .vm-flyout__link {
204
+ display: flex;
205
+ width: 100%;
206
+ height: 38px;
207
+ align-items: center;
208
+ gap: 8px;
209
+ box-sizing: border-box;
210
+ padding: 0 10px;
211
+ border: none;
212
+ border-radius: 10px;
213
+ background: transparent;
214
+ color: var(--foreground);
215
+ font-size: 13px;
216
+ font-weight: 600;
217
+ line-height: 1;
218
+ text-decoration: none;
219
+ cursor: pointer;
220
+ transition: background 0.12s ease;
221
+
222
+ &:hover,
223
+ .vm-flyout__row.is-open > & {
224
+ background: var(--muted);
225
+ }
226
+
227
+ .vm-flyout__row.is-active > & {
228
+ color: var(--brand);
229
+ background: var(--brand-soft);
230
+ }
231
+ }
232
+
233
+ .vm-flyout__icon {
234
+ display: inline-flex;
235
+ flex-shrink: 0;
236
+ width: 16px;
237
+ height: 16px;
238
+ align-items: center;
239
+ justify-content: center;
240
+ font-size: 16px;
241
+ line-height: 1;
242
+ }
243
+
244
+ .vm-flyout__label {
245
+ display: inline-flex;
246
+ flex: 1;
247
+ min-width: 0;
248
+ align-items: center;
249
+ overflow: hidden;
250
+ text-overflow: ellipsis;
251
+ white-space: nowrap;
252
+ line-height: 1;
253
+ text-align: left;
254
+ }
255
+
256
+ .vm-flyout__chevron {
257
+ display: inline-flex;
258
+ flex-shrink: 0;
259
+ width: 16px;
260
+ height: 16px;
261
+ align-items: center;
262
+ justify-content: center;
263
+ margin-left: 4px;
264
+ font-size: 16px;
265
+ line-height: 1;
266
+ opacity: 0.45;
267
+ }
268
+ </style>