xto-fronted 0.4.93 → 0.4.95

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 (92) hide show
  1. package/dist/assets/404-C9Uh6Uu-.css +1 -0
  2. package/dist/assets/404-zjGLLssH.js +1 -0
  3. package/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js +1 -0
  4. package/dist/assets/index-B5xc4gQB.css +1 -0
  5. package/dist/assets/index-BDgOY6Rp.js +1 -0
  6. package/dist/assets/index-BIoRANs0.js +1 -0
  7. package/dist/assets/index-BRR97dc6.js +1 -0
  8. package/dist/assets/index-Bz0BgZQ1.js +1 -0
  9. package/dist/assets/index-CAdztNsv.css +1 -0
  10. package/dist/assets/index-CCXrcISf.css +1 -0
  11. package/dist/assets/index-CfpZmcpk.css +1 -0
  12. package/dist/assets/index-CwJSA85U.js +1 -0
  13. package/dist/assets/index-CwRA10ac.js +1 -0
  14. package/dist/assets/index-D8NDxq9d.js +1 -0
  15. package/dist/assets/index-DEB6-Iv_.js +2 -0
  16. package/dist/assets/index-DM4Ezclc.css +1 -0
  17. package/dist/assets/index-DYv7nImj.css +1 -0
  18. package/dist/assets/index-t-2Y0KhA.css +1 -0
  19. package/dist/assets/vendor-CUVPinTg.js +13 -0
  20. package/dist/assets/vue-vendor-DeJXJVbN.js +29 -0
  21. package/dist/assets/xto-base-CL2NKZJJ.css +1 -0
  22. package/dist/assets/xto-base-PwLGsxxb.js +1 -0
  23. package/dist/assets/xto-business--V1F5Gwb.css +1 -0
  24. package/dist/assets/xto-core-CtL4zKiV.js +1 -0
  25. package/dist/assets/xto-data-MxZsiJgi.css +1 -0
  26. package/dist/assets/xto-data-bCXQa7fT.js +1 -0
  27. package/dist/assets/xto-feedback-Bxx38c3P.css +1 -0
  28. package/dist/assets/xto-feedback-CPydp0kn.js +1 -0
  29. package/dist/assets/xto-form-Cu6q3VLG.css +1 -0
  30. package/dist/assets/xto-form-bywohdAf.js +1 -0
  31. package/dist/assets/xto-layout-BDD6sSlM.css +1 -0
  32. package/dist/assets/xto-navigation-Bbdpine9.js +1 -0
  33. package/dist/assets/xto-navigation-XfpyMpEo.css +1 -0
  34. package/dist/components/Layout/MixTopMenu.vue.d.ts +6 -1
  35. package/dist/components/Layout/Sidebar.vue.d.ts +2 -0
  36. package/dist/components/Layout/TopMenu.vue.d.ts +6 -1
  37. package/dist/components/Layout/index.vue.d.ts +6 -1
  38. package/dist/{index-D59X6HmM.js → index-3ekBp4iW.js} +2 -2
  39. package/dist/{index-Cp8kqjtv.js → index-58aI1w0v.js} +2 -2
  40. package/dist/{index-me_Uu2lk.js → index-A_B_Ap_A.js} +1560 -1590
  41. package/dist/{index-lJrh5CFc.js → index-B5DLfOYb.js} +23 -23
  42. package/dist/index-BAmYUT0G.js +189 -0
  43. package/dist/{index-B4U8Dy2W.js → index-BK4Mut6H.js} +2 -2
  44. package/dist/index-BRvi9qW-.js +515 -0
  45. package/dist/index-BVGW4DDQ.js +189 -0
  46. package/dist/index-BXg94yA2.js +515 -0
  47. package/dist/index-Bmf0YbVq.js +189 -0
  48. package/dist/index-C2-a5KSQ.js +4233 -0
  49. package/dist/index-CAHSv7LK.js +4285 -0
  50. package/dist/index-CeZ0CSSs.js +641 -0
  51. package/dist/index-Cf8E7FM1.js +4270 -0
  52. package/dist/index-CgyQqbdx.js +189 -0
  53. package/dist/index-ChowNrlU.js +641 -0
  54. package/dist/index-D25KzR0I.js +479 -0
  55. package/dist/index-DCBIjLHy.js +515 -0
  56. package/dist/index-DEYOivza.js +641 -0
  57. package/dist/index-DReodgBw.js +4233 -0
  58. package/dist/index-DjERNRXX.js +515 -0
  59. package/dist/index-LSdsO2Ox.js +479 -0
  60. package/dist/index-UJixTdep.js +479 -0
  61. package/dist/index-gBlRG4kk.js +479 -0
  62. package/dist/index-xWU3J3OH.js +641 -0
  63. package/dist/index.es.js +1 -1
  64. package/dist/index.html +28 -0
  65. package/dist/index.umd.js +8 -8
  66. package/dist/style.css +1 -1
  67. package/package.json +91 -91
  68. package/src/App.vue +48 -48
  69. package/src/assets/styles/_dark.scss +639 -639
  70. package/src/assets/styles/_root.scss +183 -183
  71. package/src/assets/styles/_variables.scss +69 -69
  72. package/src/assets/styles/index.scss +460 -460
  73. package/src/components/Layout/MixTopMenu.vue +8 -1
  74. package/src/components/Layout/Sidebar.vue +200 -198
  75. package/src/components/Layout/SidebarMenuItem.vue +158 -158
  76. package/src/components/Layout/TopMenu.vue +1177 -1170
  77. package/src/components/Layout/index.vue +199 -192
  78. package/src/composables/useI18n.ts +43 -43
  79. package/src/index.ts +100 -100
  80. package/src/router/layoutRoute.ts +59 -59
  81. package/src/stores/index.ts +15 -15
  82. package/src/stores/locale.ts +66 -66
  83. package/src/types/json-bigint.d.ts +18 -18
  84. package/src/types/xto.d.ts +172 -172
  85. package/src/utils/request.ts +184 -184
  86. package/src/views/dashboard/index.vue +545 -545
  87. package/src/views/error/403.vue +251 -251
  88. package/src/views/error/404.vue +253 -253
  89. package/src/views/login/index.vue +586 -586
  90. package/src/views/system/menu/index.vue +690 -690
  91. package/src/views/system/role/index.vue +583 -583
  92. package/src/views/system/user/index.vue +655 -655
@@ -1,158 +1,158 @@
1
- <script setup lang="ts">
2
- import { computed } from 'vue'
3
- import { MenuItem, SubMenu } from '@xto/navigation'
4
- import { Icon } from '@xto/base'
5
-
6
- // Props
7
- const props = defineProps<{
8
- menu: any
9
- }>()
10
-
11
- // 已知的图标名称列表
12
- const knownIcons = new Set([
13
- 'arrow-up', 'arrow-down', 'arrow-left', 'arrow-right',
14
- 'caret-down', 'caret-right', 'plus', 'minus', 'close', 'check',
15
- 'edit', 'delete', 'copy', 'download', 'upload', 'refresh', 'search',
16
- 'filter', 'more', 'setting', 'share', 'loading', 'info', 'success',
17
- 'warning', 'error', 'question', 'user', 'user-add', 'user-group',
18
- 'logout', 'login', 'file', 'folder', 'folder-open', 'document',
19
- 'image', 'video', 'music', 'camera', 'mail', 'phone', 'chat',
20
- 'bell', 'message', 'eye', 'eye-off', 'calendar', 'clock', 'history',
21
- 'timer', 'location', 'map', 'globe', 'star', 'heart', 'thumb-up',
22
- 'link', 'external-link', 'lock', 'unlock', 'key', 'home', 'menu',
23
- 'menu-fold', 'menu-unfold', 'sidebar-fold', 'sidebar-expand',
24
- 'sidebar-left', 'dashboard', 'chart', 'chart-pie', 'chart-line',
25
- 'report', 'analytics', 'system', 'permission', 'role', 'user-manage',
26
- 'log', 'notification', 'app', 'list', 'grid', 'fullscreen',
27
- 'fullscreen-exit', 'zoom-in', 'zoom-out', 'print', 'bookmark',
28
- 'tag', 'code', 'terminal', 'database', 'server', 'cloud', 'gift',
29
- 'moon', 'sun', 'theme', 'skin'
30
- ])
31
-
32
- // 获取菜单图标名称
33
- const getMenuIcon = (icon?: string): string => {
34
- if (!icon || icon === '') return ''
35
-
36
- if (icon.startsWith('tineco-icon-')) {
37
- const iconName = icon.replace('tineco-icon-', '')
38
- const tinecoIconMap: Record<string, string> = {
39
- home: 'home',
40
- dashboard: 'dashboard',
41
- system: 'system',
42
- user: 'user',
43
- role: 'role',
44
- menu: 'list',
45
- setting: 'setting',
46
- file: 'file',
47
- folder: 'folder',
48
- chart: 'chart',
49
- report: 'report',
50
- analytics: 'analytics'
51
- }
52
- return tinecoIconMap[iconName] || iconName
53
- }
54
-
55
- const iconMap: Record<string, string> = {
56
- dashboard: 'dashboard',
57
- system: 'system',
58
- user: 'user',
59
- role: 'role',
60
- menu: 'list',
61
- setting: 'setting',
62
- home: 'home',
63
- chart: 'chart',
64
- report: 'report',
65
- analytics: 'analytics',
66
- permission: 'permission',
67
- log: 'log',
68
- notification: 'notification',
69
- app: 'app',
70
- list: 'list',
71
- grid: 'grid'
72
- }
73
-
74
- return iconMap[icon] || icon
75
- }
76
-
77
- // 获取菜单名称第一个字
78
- const getFirstChar = (name?: string): string => {
79
- if (!name) return ''
80
- return name.charAt(0)
81
- }
82
-
83
- // 判断图标是否存在
84
- const iconExists = (iconName: string): boolean => {
85
- return knownIcons.has(iconName)
86
- }
87
-
88
- // 是否有子菜单
89
- const hasChildren = computed(() => {
90
- return props.menu.children && props.menu.children.length > 0
91
- })
92
- </script>
93
-
94
- <template>
95
- <!-- 有子菜单 -->
96
- <SubMenu v-if="hasChildren" :index="menu.menuUrl">
97
- <template #title>
98
- <span class="menu-item__content">
99
- <span class="menu-item__icon">
100
- <Icon v-if="iconExists(getMenuIcon(menu.icon))" :name="getMenuIcon(menu.icon)" :size="16" />
101
- <span v-else class="menu-item__char">{{ getFirstChar(menu.menuName) }}</span>
102
- </span>
103
- <span class="menu-item__text">{{ menu.menuName }}</span>
104
- </span>
105
- </template>
106
- <!-- 递归渲染子菜单 -->
107
- <template v-for="child in menu.children" :key="child.menuUrl">
108
- <SidebarMenuItem :menu="child" />
109
- </template>
110
- </SubMenu>
111
-
112
- <!-- 无子菜单 -->
113
- <MenuItem v-else :index="menu.menuUrl">
114
- <span class="menu-item__content">
115
- <span v-if="menu.menuName !== '首页'" class="menu-item__icon">
116
- <Icon v-if="iconExists(getMenuIcon(menu.icon))" :name="getMenuIcon(menu.icon)" :size="16" />
117
- <span v-else class="menu-item__char">{{ getFirstChar(menu.menuName) }}</span>
118
- </span>
119
- <span class="menu-item__text">{{ menu.menuName }}</span>
120
- </span>
121
- </MenuItem>
122
- </template>
123
-
124
- <style lang="scss" scoped>
125
- .menu-item__content {
126
- display: inline-flex;
127
- align-items: center;
128
- line-height: 1;
129
- }
130
-
131
- .menu-item__text {
132
- flex: 1;
133
- line-height: 1;
134
- }
135
-
136
- .menu-item__icon {
137
- display: inline-flex;
138
- align-items: center;
139
- justify-content: center;
140
- width: 16px;
141
- height: 16px;
142
- margin-right: 8px;
143
- flex-shrink: 0;
144
- }
145
-
146
- .menu-item__char {
147
- display: inline-flex;
148
- align-items: center;
149
- justify-content: center;
150
- width: 16px;
151
- height: 16px;
152
- font-size: 12px;
153
- font-weight: 600;
154
- color: var(--color-primary);
155
- background-color: var(--color-primary-light-8);
156
- border-radius: 4px;
157
- }
158
- </style>
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+ import { MenuItem, SubMenu } from '@xto/navigation'
4
+ import { Icon } from '@xto/base'
5
+
6
+ // Props
7
+ const props = defineProps<{
8
+ menu: any
9
+ }>()
10
+
11
+ // 已知的图标名称列表
12
+ const knownIcons = new Set([
13
+ 'arrow-up', 'arrow-down', 'arrow-left', 'arrow-right',
14
+ 'caret-down', 'caret-right', 'plus', 'minus', 'close', 'check',
15
+ 'edit', 'delete', 'copy', 'download', 'upload', 'refresh', 'search',
16
+ 'filter', 'more', 'setting', 'share', 'loading', 'info', 'success',
17
+ 'warning', 'error', 'question', 'user', 'user-add', 'user-group',
18
+ 'logout', 'login', 'file', 'folder', 'folder-open', 'document',
19
+ 'image', 'video', 'music', 'camera', 'mail', 'phone', 'chat',
20
+ 'bell', 'message', 'eye', 'eye-off', 'calendar', 'clock', 'history',
21
+ 'timer', 'location', 'map', 'globe', 'star', 'heart', 'thumb-up',
22
+ 'link', 'external-link', 'lock', 'unlock', 'key', 'home', 'menu',
23
+ 'menu-fold', 'menu-unfold', 'sidebar-fold', 'sidebar-expand',
24
+ 'sidebar-left', 'dashboard', 'chart', 'chart-pie', 'chart-line',
25
+ 'report', 'analytics', 'system', 'permission', 'role', 'user-manage',
26
+ 'log', 'notification', 'app', 'list', 'grid', 'fullscreen',
27
+ 'fullscreen-exit', 'zoom-in', 'zoom-out', 'print', 'bookmark',
28
+ 'tag', 'code', 'terminal', 'database', 'server', 'cloud', 'gift',
29
+ 'moon', 'sun', 'theme', 'skin'
30
+ ])
31
+
32
+ // 获取菜单图标名称
33
+ const getMenuIcon = (icon?: string): string => {
34
+ if (!icon || icon === '') return ''
35
+
36
+ if (icon.startsWith('tineco-icon-')) {
37
+ const iconName = icon.replace('tineco-icon-', '')
38
+ const tinecoIconMap: Record<string, string> = {
39
+ home: 'home',
40
+ dashboard: 'dashboard',
41
+ system: 'system',
42
+ user: 'user',
43
+ role: 'role',
44
+ menu: 'list',
45
+ setting: 'setting',
46
+ file: 'file',
47
+ folder: 'folder',
48
+ chart: 'chart',
49
+ report: 'report',
50
+ analytics: 'analytics'
51
+ }
52
+ return tinecoIconMap[iconName] || iconName
53
+ }
54
+
55
+ const iconMap: Record<string, string> = {
56
+ dashboard: 'dashboard',
57
+ system: 'system',
58
+ user: 'user',
59
+ role: 'role',
60
+ menu: 'list',
61
+ setting: 'setting',
62
+ home: 'home',
63
+ chart: 'chart',
64
+ report: 'report',
65
+ analytics: 'analytics',
66
+ permission: 'permission',
67
+ log: 'log',
68
+ notification: 'notification',
69
+ app: 'app',
70
+ list: 'list',
71
+ grid: 'grid'
72
+ }
73
+
74
+ return iconMap[icon] || icon
75
+ }
76
+
77
+ // 获取菜单名称第一个字
78
+ const getFirstChar = (name?: string): string => {
79
+ if (!name) return ''
80
+ return name.charAt(0)
81
+ }
82
+
83
+ // 判断图标是否存在
84
+ const iconExists = (iconName: string): boolean => {
85
+ return knownIcons.has(iconName)
86
+ }
87
+
88
+ // 是否有子菜单
89
+ const hasChildren = computed(() => {
90
+ return props.menu.children && props.menu.children.length > 0
91
+ })
92
+ </script>
93
+
94
+ <template>
95
+ <!-- 有子菜单 -->
96
+ <SubMenu v-if="hasChildren" :index="menu.menuUrl">
97
+ <template #title>
98
+ <span class="menu-item__content">
99
+ <span class="menu-item__icon">
100
+ <Icon v-if="iconExists(getMenuIcon(menu.icon))" :name="getMenuIcon(menu.icon)" :size="16" />
101
+ <span v-else class="menu-item__char">{{ getFirstChar(menu.menuName) }}</span>
102
+ </span>
103
+ <span class="menu-item__text">{{ menu.menuName }}</span>
104
+ </span>
105
+ </template>
106
+ <!-- 递归渲染子菜单 -->
107
+ <template v-for="child in menu.children" :key="child.menuUrl">
108
+ <SidebarMenuItem :menu="child" />
109
+ </template>
110
+ </SubMenu>
111
+
112
+ <!-- 无子菜单 -->
113
+ <MenuItem v-else :index="menu.menuUrl">
114
+ <span class="menu-item__content">
115
+ <span v-if="menu.menuName !== '首页'" class="menu-item__icon">
116
+ <Icon v-if="iconExists(getMenuIcon(menu.icon))" :name="getMenuIcon(menu.icon)" :size="16" />
117
+ <span v-else class="menu-item__char">{{ getFirstChar(menu.menuName) }}</span>
118
+ </span>
119
+ <span class="menu-item__text">{{ menu.menuName }}</span>
120
+ </span>
121
+ </MenuItem>
122
+ </template>
123
+
124
+ <style lang="scss" scoped>
125
+ .menu-item__content {
126
+ display: inline-flex;
127
+ align-items: center;
128
+ line-height: 1;
129
+ }
130
+
131
+ .menu-item__text {
132
+ flex: 1;
133
+ line-height: 1;
134
+ }
135
+
136
+ .menu-item__icon {
137
+ display: inline-flex;
138
+ align-items: center;
139
+ justify-content: center;
140
+ width: 16px;
141
+ height: 16px;
142
+ margin-right: 8px;
143
+ flex-shrink: 0;
144
+ }
145
+
146
+ .menu-item__char {
147
+ display: inline-flex;
148
+ align-items: center;
149
+ justify-content: center;
150
+ width: 16px;
151
+ height: 16px;
152
+ font-size: 12px;
153
+ font-weight: 600;
154
+ color: var(--color-primary);
155
+ background-color: var(--color-primary-light-8);
156
+ border-radius: 4px;
157
+ }
158
+ </style>