xto-fronted 0.4.85 → 0.4.87

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 (101) 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/index.html +28 -0
  35. package/package.json +91 -91
  36. package/src/App.vue +48 -48
  37. package/src/assets/styles/_root.scss +183 -183
  38. package/src/assets/styles/_variables.scss +69 -69
  39. package/src/composables/useI18n.ts +44 -0
  40. package/src/index.ts +15 -1
  41. package/src/stores/index.ts +2 -1
  42. package/src/stores/locale.ts +67 -0
  43. package/src/types/json-bigint.d.ts +18 -18
  44. package/src/types/xto.d.ts +24 -0
  45. package/src/views/dashboard/index.vue +545 -545
  46. package/src/views/error/403.vue +251 -251
  47. package/src/views/error/404.vue +253 -253
  48. package/src/views/login/index.vue +586 -586
  49. package/src/views/system/menu/index.vue +690 -690
  50. package/src/views/system/role/index.vue +583 -583
  51. package/src/views/system/user/index.vue +655 -655
  52. package/dist/App.vue.d.ts +0 -2
  53. package/dist/api/auth.d.ts +0 -8
  54. package/dist/api/system.d.ts +0 -16
  55. package/dist/api/user.d.ts +0 -13
  56. package/dist/components/Layout/Footer.vue.d.ts +0 -2
  57. package/dist/components/Layout/Header.vue.d.ts +0 -5
  58. package/dist/components/Layout/MixTopMenu.vue.d.ts +0 -5
  59. package/dist/components/Layout/Sidebar.vue.d.ts +0 -11
  60. package/dist/components/Layout/SidebarMenuItem.vue.d.ts +0 -5
  61. package/dist/components/Layout/Tabs.vue.d.ts +0 -2
  62. package/dist/components/Layout/TopMenu.vue.d.ts +0 -5
  63. package/dist/components/Layout/index.vue.d.ts +0 -2
  64. package/dist/composables/useApp.d.ts +0 -29
  65. package/dist/composables/useAuth.d.ts +0 -6
  66. package/dist/composables/useForm.d.ts +0 -20
  67. package/dist/composables/useTable.d.ts +0 -29
  68. package/dist/directives/permission.d.ts +0 -4
  69. package/dist/enums/index.d.ts +0 -32
  70. package/dist/index-BZaqYObA.js +0 -479
  71. package/dist/index-CbwOysFI.js +0 -641
  72. package/dist/index-Jynxhhda.js +0 -189
  73. package/dist/index-XgzSS-fV.js +0 -515
  74. package/dist/index-_iZKFlCa.js +0 -4178
  75. package/dist/index.d.ts +0 -54
  76. package/dist/index.es.js +0 -91
  77. package/dist/index.umd.js +0 -8
  78. package/dist/main.d.ts +0 -0
  79. package/dist/router/dynamicRoutes.d.ts +0 -30
  80. package/dist/router/guards.d.ts +0 -17
  81. package/dist/router/index.d.ts +0 -6
  82. package/dist/router/layoutRoute.d.ts +0 -18
  83. package/dist/router/staticRoutes.d.ts +0 -2
  84. package/dist/stores/app.d.ts +0 -93
  85. package/dist/stores/auth.d.ts +0 -41
  86. package/dist/stores/index.d.ts +0 -9
  87. package/dist/stores/menu.d.ts +0 -77
  88. package/dist/stores/user.d.ts +0 -92
  89. package/dist/style.css +0 -1
  90. package/dist/utils/auth.d.ts +0 -27
  91. package/dist/utils/config.d.ts +0 -30
  92. package/dist/utils/permission.d.ts +0 -18
  93. package/dist/utils/request.d.ts +0 -24
  94. package/dist/utils/storage.d.ts +0 -24
  95. package/dist/views/dashboard/index.vue.d.ts +0 -2
  96. package/dist/views/error/403.vue.d.ts +0 -2
  97. package/dist/views/error/404.vue.d.ts +0 -2
  98. package/dist/views/login/index.vue.d.ts +0 -4
  99. package/dist/views/system/menu/index.vue.d.ts +0 -4
  100. package/dist/views/system/role/index.vue.d.ts +0 -4
  101. package/dist/views/system/user/index.vue.d.ts +0 -4
@@ -1,184 +1,184 @@
1
- // ==============================================
2
- // CSS Variables - 企业级配色方案
3
- // 参考:阿里 Ant Design Pro、腾讯云控制台
4
- // ==============================================
5
-
6
- :root {
7
- // 主色调 - 科技蓝系(深邃、专业)
8
- --color-primary: #1677ff;
9
- --color-primary-light-1: #4096ff;
10
- --color-primary-light-2: #69b1ff;
11
- --color-primary-light-3: #91caff;
12
- --color-primary-light-4: #bae0ff;
13
- --color-primary-light-5: #e6f4ff;
14
- --color-primary-light-6: #f0f8ff;
15
- --color-primary-dark-1: #0958d9;
16
- --color-primary-dark-2: #003eb3;
17
- --color-primary-dark-3: #002c8c;
18
-
19
- // 功能色 - 精致调和
20
- --color-success: #52c41a;
21
- --color-success-light: #b7eb8f;
22
- --color-success-lighter: #f6ffed;
23
- --color-success-dark: #389e0d;
24
-
25
- --color-warning: #faad14;
26
- --color-warning-light: #ffe58f;
27
- --color-warning-lighter: #fffbe6;
28
- --color-warning-dark: #d48806;
29
-
30
- --color-danger: #ff4d4f;
31
- --color-danger-light: #ffa39e;
32
- --color-danger-lighter: #fff2f0;
33
- --color-danger-dark: #cf1322;
34
-
35
- --color-info: #1677ff;
36
- --color-info-light: #91caff;
37
- --color-info-lighter: #e6f4ff;
38
- --color-info-dark: #0958d9;
39
-
40
- // 文字颜色 - 层次分明
41
- --color-text-primary: #1f1f1f;
42
- --color-text-regular: #424242;
43
- --color-text-secondary: #757575;
44
- --color-text-placeholder: #9e9e9e;
45
- --color-text-disabled: #bdbdbd;
46
-
47
- // 边框颜色 - 克制淡雅
48
- --color-border: #d9d9d9;
49
- --color-border-light: #e8e8e8;
50
- --color-border-lighter: #f0f0f0;
51
- --color-border-extra-light: #f5f5f5;
52
- --color-border-dark: #bfbfbf;
53
-
54
- // 填充颜色 - 背景层次
55
- --color-fill: #f5f5f5;
56
- --color-fill-light: #fafafa;
57
- --color-fill-lighter: #ffffff;
58
- --color-fill-blank: #ffffff;
59
- --color-fill-dark: #e8e8e8;
60
-
61
- // 背景颜色 - 页面层级
62
- --bg-color: #ffffff;
63
- --bg-color-page: #f0f2f5;
64
- --bg-color-component: #ffffff;
65
- --bg-color-overlay: #ffffff;
66
- --bg-color-spotlight: #e6f4ff;
67
-
68
- // 盒子阴影 - 精致层次
69
- --box-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.08),
70
- 0 3px 6px -4px rgba(0, 0, 0, 0.12),
71
- 0 9px 28px 8px rgba(0, 0, 0, 0.05);
72
- --box-shadow-light: 0 1px 2px 0 rgba(0, 0, 0, 0.03),
73
- 0 1px 6px -1px rgba(0, 0, 0, 0.02),
74
- 0 2px 4px 0 rgba(0, 0, 0, 0.02);
75
- --box-shadow-lighter: 0 1px 4px rgba(0, 0, 0, 0.04);
76
- --box-shadow-dark: 0 6px 16px -8px rgba(0, 0, 0, 0.08),
77
- 0 9px 28px 8px rgba(0, 0, 0, 0.05),
78
- 0 12px 48px 16px rgba(0, 0, 0, 0.03);
79
- --box-shadow-card: 0 1px 10px -6px rgba(0, 0, 0, 0.1);
80
- --box-shadow-card-hover: 0 6px 16px -8px rgba(0, 0, 0, 0.12);
81
-
82
- // 字体 - 企业级字体栈
83
- --font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
84
- 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';
85
- --font-family-code: 'IBM Plex Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono',
86
- Consolas, 'Courier New', monospace;
87
- --font-size-base: 14px;
88
- --font-size-small: 12px;
89
- --font-size-large: 16px;
90
- --font-size-extra-large: 20px;
91
- --font-size-title: 24px;
92
- --font-size-hero: 38px;
93
- --font-line-height: 1.5714285714285714;
94
-
95
- // 圆角 - 精致圆润
96
- --border-radius-base: 6px;
97
- --border-radius-small: 4px;
98
- --border-radius-large: 8px;
99
- --border-radius-extra-large: 12px;
100
- --border-radius-round: 24px;
101
- --border-radius-circle: 50%;
102
-
103
- // 间距 - 8px 基础网格
104
- --spacing-xs: 4px;
105
- --spacing-sm: 8px;
106
- --spacing-md: 16px;
107
- --spacing-lg: 24px;
108
- --spacing-xl: 32px;
109
- --spacing-xxl: 48px;
110
-
111
- // 尺寸 - 组件规格
112
- --component-size-large: 40px;
113
- --component-size-default: 32px;
114
- --component-size-small: 24px;
115
-
116
- // 过渡 - 流畅动效
117
- --transition-duration: 0.2s;
118
- --transition-duration-fast: 0.1s;
119
- --transition-duration-slow: 0.3s;
120
- --transition-easing: cubic-bezier(0.645, 0.045, 0.355, 1);
121
- --transition-easing-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
122
-
123
- // z-index - 层级管理
124
- --z-index-dropdown: 1000;
125
- --z-index-sticky: 1020;
126
- --z-index-fixed: 1030;
127
- --z-index-modal-backdrop: 1040;
128
- --z-index-modal: 1050;
129
- --z-index-popover: 1060;
130
- --z-index-tooltip: 1070;
131
-
132
- // 布局 - 精确尺寸
133
- --sidebar-width: 220px;
134
- --sidebar-collapsed-width: 64px;
135
- --header-height: 56px;
136
- --tabs-height: 40px;
137
- --footer-height: 32px;
138
-
139
- // 特殊效果
140
- --gradient-primary: linear-gradient(135deg, #1677ff 0%, #4096ff 100%);
141
- --gradient-hero: linear-gradient(135deg, #002c8c 0%, #1677ff 50%, #4096ff 100%);
142
- --gradient-card: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.8) 100%);
143
- --gradient-mask: linear-gradient(180deg, rgba(0, 44, 140, 0.03) 0%, rgba(0, 0, 0, 0) 100%);
144
- }
145
-
146
- // 暗色主题 - 深邃科技感
147
- .dark {
148
- --color-text-primary: #ffffff;
149
- --color-text-regular: #e0e0e0;
150
- --color-text-secondary: #a6a6a6;
151
- --color-text-placeholder: #737373;
152
- --color-text-disabled: #5c5c5c;
153
-
154
- --color-border: #434343;
155
- --color-border-light: #363636;
156
- --color-border-lighter: #2a2a2a;
157
- --color-border-extra-light: #1f1f1f;
158
- --color-border-dark: #5c5c5c;
159
-
160
- --color-fill: #262626;
161
- --color-fill-light: #1f1f1f;
162
- --color-fill-lighter: #141414;
163
- --color-fill-blank: #141414;
164
- --color-fill-dark: #363636;
165
-
166
- --bg-color: #141414;
167
- --bg-color-page: #0a0a0a;
168
- --bg-color-component: #1f1f1f;
169
- --bg-color-overlay: #1f1f1f;
170
- --bg-color-spotlight: #111d2c;
171
-
172
- --box-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.32),
173
- 0 3px 6px -4px rgba(0, 0, 0, 0.48),
174
- 0 9px 28px 8px rgba(0, 0, 0, 0.2);
175
- --box-shadow-light: 0 1px 2px 0 rgba(0, 0, 0, 0.16),
176
- 0 1px 6px -1px rgba(0, 0, 0, 0.12),
177
- 0 2px 4px 0 rgba(0, 0, 0, 0.08);
178
- --box-shadow-card: 0 1px 10px -6px rgba(0, 0, 0, 0.32);
179
- --box-shadow-card-hover: 0 6px 16px -8px rgba(0, 0, 0, 0.48);
180
-
181
- --gradient-primary: linear-gradient(135deg, #1677ff 0%, #4096ff 100%);
182
- --gradient-hero: linear-gradient(135deg, #002c8c 0%, #0958d9 50%, #1677ff 100%);
183
- --gradient-card: linear-gradient(180deg, rgba(20, 20, 20, 0) 0%, rgba(20, 20, 20, 0.8) 100%);
1
+ // ==============================================
2
+ // CSS Variables - 企业级配色方案
3
+ // 参考:阿里 Ant Design Pro、腾讯云控制台
4
+ // ==============================================
5
+
6
+ :root {
7
+ // 主色调 - 科技蓝系(深邃、专业)
8
+ --color-primary: #1677ff;
9
+ --color-primary-light-1: #4096ff;
10
+ --color-primary-light-2: #69b1ff;
11
+ --color-primary-light-3: #91caff;
12
+ --color-primary-light-4: #bae0ff;
13
+ --color-primary-light-5: #e6f4ff;
14
+ --color-primary-light-6: #f0f8ff;
15
+ --color-primary-dark-1: #0958d9;
16
+ --color-primary-dark-2: #003eb3;
17
+ --color-primary-dark-3: #002c8c;
18
+
19
+ // 功能色 - 精致调和
20
+ --color-success: #52c41a;
21
+ --color-success-light: #b7eb8f;
22
+ --color-success-lighter: #f6ffed;
23
+ --color-success-dark: #389e0d;
24
+
25
+ --color-warning: #faad14;
26
+ --color-warning-light: #ffe58f;
27
+ --color-warning-lighter: #fffbe6;
28
+ --color-warning-dark: #d48806;
29
+
30
+ --color-danger: #ff4d4f;
31
+ --color-danger-light: #ffa39e;
32
+ --color-danger-lighter: #fff2f0;
33
+ --color-danger-dark: #cf1322;
34
+
35
+ --color-info: #1677ff;
36
+ --color-info-light: #91caff;
37
+ --color-info-lighter: #e6f4ff;
38
+ --color-info-dark: #0958d9;
39
+
40
+ // 文字颜色 - 层次分明
41
+ --color-text-primary: #1f1f1f;
42
+ --color-text-regular: #424242;
43
+ --color-text-secondary: #757575;
44
+ --color-text-placeholder: #9e9e9e;
45
+ --color-text-disabled: #bdbdbd;
46
+
47
+ // 边框颜色 - 克制淡雅
48
+ --color-border: #d9d9d9;
49
+ --color-border-light: #e8e8e8;
50
+ --color-border-lighter: #f0f0f0;
51
+ --color-border-extra-light: #f5f5f5;
52
+ --color-border-dark: #bfbfbf;
53
+
54
+ // 填充颜色 - 背景层次
55
+ --color-fill: #f5f5f5;
56
+ --color-fill-light: #fafafa;
57
+ --color-fill-lighter: #ffffff;
58
+ --color-fill-blank: #ffffff;
59
+ --color-fill-dark: #e8e8e8;
60
+
61
+ // 背景颜色 - 页面层级
62
+ --bg-color: #ffffff;
63
+ --bg-color-page: #f0f2f5;
64
+ --bg-color-component: #ffffff;
65
+ --bg-color-overlay: #ffffff;
66
+ --bg-color-spotlight: #e6f4ff;
67
+
68
+ // 盒子阴影 - 精致层次
69
+ --box-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.08),
70
+ 0 3px 6px -4px rgba(0, 0, 0, 0.12),
71
+ 0 9px 28px 8px rgba(0, 0, 0, 0.05);
72
+ --box-shadow-light: 0 1px 2px 0 rgba(0, 0, 0, 0.03),
73
+ 0 1px 6px -1px rgba(0, 0, 0, 0.02),
74
+ 0 2px 4px 0 rgba(0, 0, 0, 0.02);
75
+ --box-shadow-lighter: 0 1px 4px rgba(0, 0, 0, 0.04);
76
+ --box-shadow-dark: 0 6px 16px -8px rgba(0, 0, 0, 0.08),
77
+ 0 9px 28px 8px rgba(0, 0, 0, 0.05),
78
+ 0 12px 48px 16px rgba(0, 0, 0, 0.03);
79
+ --box-shadow-card: 0 1px 10px -6px rgba(0, 0, 0, 0.1);
80
+ --box-shadow-card-hover: 0 6px 16px -8px rgba(0, 0, 0, 0.12);
81
+
82
+ // 字体 - 企业级字体栈
83
+ --font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
84
+ 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';
85
+ --font-family-code: 'IBM Plex Mono', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono',
86
+ Consolas, 'Courier New', monospace;
87
+ --font-size-base: 14px;
88
+ --font-size-small: 12px;
89
+ --font-size-large: 16px;
90
+ --font-size-extra-large: 20px;
91
+ --font-size-title: 24px;
92
+ --font-size-hero: 38px;
93
+ --font-line-height: 1.5714285714285714;
94
+
95
+ // 圆角 - 精致圆润
96
+ --border-radius-base: 6px;
97
+ --border-radius-small: 4px;
98
+ --border-radius-large: 8px;
99
+ --border-radius-extra-large: 12px;
100
+ --border-radius-round: 24px;
101
+ --border-radius-circle: 50%;
102
+
103
+ // 间距 - 8px 基础网格
104
+ --spacing-xs: 4px;
105
+ --spacing-sm: 8px;
106
+ --spacing-md: 16px;
107
+ --spacing-lg: 24px;
108
+ --spacing-xl: 32px;
109
+ --spacing-xxl: 48px;
110
+
111
+ // 尺寸 - 组件规格
112
+ --component-size-large: 40px;
113
+ --component-size-default: 32px;
114
+ --component-size-small: 24px;
115
+
116
+ // 过渡 - 流畅动效
117
+ --transition-duration: 0.2s;
118
+ --transition-duration-fast: 0.1s;
119
+ --transition-duration-slow: 0.3s;
120
+ --transition-easing: cubic-bezier(0.645, 0.045, 0.355, 1);
121
+ --transition-easing-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
122
+
123
+ // z-index - 层级管理
124
+ --z-index-dropdown: 1000;
125
+ --z-index-sticky: 1020;
126
+ --z-index-fixed: 1030;
127
+ --z-index-modal-backdrop: 1040;
128
+ --z-index-modal: 1050;
129
+ --z-index-popover: 1060;
130
+ --z-index-tooltip: 1070;
131
+
132
+ // 布局 - 精确尺寸
133
+ --sidebar-width: 220px;
134
+ --sidebar-collapsed-width: 64px;
135
+ --header-height: 56px;
136
+ --tabs-height: 40px;
137
+ --footer-height: 32px;
138
+
139
+ // 特殊效果
140
+ --gradient-primary: linear-gradient(135deg, #1677ff 0%, #4096ff 100%);
141
+ --gradient-hero: linear-gradient(135deg, #002c8c 0%, #1677ff 50%, #4096ff 100%);
142
+ --gradient-card: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.8) 100%);
143
+ --gradient-mask: linear-gradient(180deg, rgba(0, 44, 140, 0.03) 0%, rgba(0, 0, 0, 0) 100%);
144
+ }
145
+
146
+ // 暗色主题 - 深邃科技感
147
+ .dark {
148
+ --color-text-primary: #ffffff;
149
+ --color-text-regular: #e0e0e0;
150
+ --color-text-secondary: #a6a6a6;
151
+ --color-text-placeholder: #737373;
152
+ --color-text-disabled: #5c5c5c;
153
+
154
+ --color-border: #434343;
155
+ --color-border-light: #363636;
156
+ --color-border-lighter: #2a2a2a;
157
+ --color-border-extra-light: #1f1f1f;
158
+ --color-border-dark: #5c5c5c;
159
+
160
+ --color-fill: #262626;
161
+ --color-fill-light: #1f1f1f;
162
+ --color-fill-lighter: #141414;
163
+ --color-fill-blank: #141414;
164
+ --color-fill-dark: #363636;
165
+
166
+ --bg-color: #141414;
167
+ --bg-color-page: #0a0a0a;
168
+ --bg-color-component: #1f1f1f;
169
+ --bg-color-overlay: #1f1f1f;
170
+ --bg-color-spotlight: #111d2c;
171
+
172
+ --box-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.32),
173
+ 0 3px 6px -4px rgba(0, 0, 0, 0.48),
174
+ 0 9px 28px 8px rgba(0, 0, 0, 0.2);
175
+ --box-shadow-light: 0 1px 2px 0 rgba(0, 0, 0, 0.16),
176
+ 0 1px 6px -1px rgba(0, 0, 0, 0.12),
177
+ 0 2px 4px 0 rgba(0, 0, 0, 0.08);
178
+ --box-shadow-card: 0 1px 10px -6px rgba(0, 0, 0, 0.32);
179
+ --box-shadow-card-hover: 0 6px 16px -8px rgba(0, 0, 0, 0.48);
180
+
181
+ --gradient-primary: linear-gradient(135deg, #1677ff 0%, #4096ff 100%);
182
+ --gradient-hero: linear-gradient(135deg, #002c8c 0%, #0958d9 50%, #1677ff 100%);
183
+ --gradient-card: linear-gradient(180deg, rgba(20, 20, 20, 0) 0%, rgba(20, 20, 20, 0.8) 100%);
184
184
  }
@@ -1,70 +1,70 @@
1
- // ==============================================
2
- // SCSS Variables - 用于样式计算
3
- // ==============================================
4
-
5
- // 主题色 - 科技蓝
6
- $color-primary: #1677ff;
7
- $color-primary-light: #4096ff;
8
- $color-primary-lighter: #91caff;
9
- $color-primary-dark: #0958d9;
10
- $color-primary-darker: #003eb3;
11
-
12
- // 功能色
13
- $color-success: #52c41a;
14
- $color-warning: #faad14;
15
- $color-danger: #ff4d4f;
16
- $color-info: #1677ff;
17
-
18
- // 文字颜色
19
- $color-text-primary: #1f1f1f;
20
- $color-text-regular: #424242;
21
- $color-text-secondary: #757575;
22
- $color-text-placeholder: #9e9e9e;
23
-
24
- // 边框颜色
25
- $color-border: #d9d9d9;
26
- $color-border-light: #e8e8e8;
27
- $color-border-lighter: #f0f0f0;
28
-
29
- // 背景颜色
30
- $bg-color: #ffffff;
31
- $bg-color-page: #f0f2f5;
32
- $bg-color-component: #ffffff;
33
-
34
- // 字体
35
- $font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
36
- $font-family-code: 'IBM Plex Mono', 'SF Mono', Monaco, Consolas, monospace;
37
- $font-size-base: 14px;
38
- $font-size-small: 12px;
39
- $font-size-large: 16px;
40
- $font-size-extra-large: 20px;
41
-
42
- // 圆角
43
- $border-radius-base: 6px;
44
- $border-radius-small: 4px;
45
- $border-radius-large: 8px;
46
- $border-radius-extra-large: 12px;
47
- $border-radius-round: 24px;
48
-
49
- // 间距 - 8px 网格系统
50
- $spacing-xs: 4px;
51
- $spacing-sm: 8px;
52
- $spacing-md: 16px;
53
- $spacing-lg: 24px;
54
- $spacing-xl: 32px;
55
- $spacing-xxl: 48px;
56
-
57
- // 布局尺寸
58
- $sidebar-width: 220px;
59
- $sidebar-collapsed-width: 64px;
60
- $header-height: 56px;
61
- $tabs-height: 40px;
62
- $footer-height: 32px;
63
-
64
- // 过渡
65
- $transition-duration: 0.2s;
66
- $transition-easing: cubic-bezier(0.645, 0.045, 0.355, 1);
67
-
68
- // 阴影
69
- $box-shadow-card: 0 1px 10px -6px rgba(0, 0, 0, 0.1);
1
+ // ==============================================
2
+ // SCSS Variables - 用于样式计算
3
+ // ==============================================
4
+
5
+ // 主题色 - 科技蓝
6
+ $color-primary: #1677ff;
7
+ $color-primary-light: #4096ff;
8
+ $color-primary-lighter: #91caff;
9
+ $color-primary-dark: #0958d9;
10
+ $color-primary-darker: #003eb3;
11
+
12
+ // 功能色
13
+ $color-success: #52c41a;
14
+ $color-warning: #faad14;
15
+ $color-danger: #ff4d4f;
16
+ $color-info: #1677ff;
17
+
18
+ // 文字颜色
19
+ $color-text-primary: #1f1f1f;
20
+ $color-text-regular: #424242;
21
+ $color-text-secondary: #757575;
22
+ $color-text-placeholder: #9e9e9e;
23
+
24
+ // 边框颜色
25
+ $color-border: #d9d9d9;
26
+ $color-border-light: #e8e8e8;
27
+ $color-border-lighter: #f0f0f0;
28
+
29
+ // 背景颜色
30
+ $bg-color: #ffffff;
31
+ $bg-color-page: #f0f2f5;
32
+ $bg-color-component: #ffffff;
33
+
34
+ // 字体
35
+ $font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
36
+ $font-family-code: 'IBM Plex Mono', 'SF Mono', Monaco, Consolas, monospace;
37
+ $font-size-base: 14px;
38
+ $font-size-small: 12px;
39
+ $font-size-large: 16px;
40
+ $font-size-extra-large: 20px;
41
+
42
+ // 圆角
43
+ $border-radius-base: 6px;
44
+ $border-radius-small: 4px;
45
+ $border-radius-large: 8px;
46
+ $border-radius-extra-large: 12px;
47
+ $border-radius-round: 24px;
48
+
49
+ // 间距 - 8px 网格系统
50
+ $spacing-xs: 4px;
51
+ $spacing-sm: 8px;
52
+ $spacing-md: 16px;
53
+ $spacing-lg: 24px;
54
+ $spacing-xl: 32px;
55
+ $spacing-xxl: 48px;
56
+
57
+ // 布局尺寸
58
+ $sidebar-width: 220px;
59
+ $sidebar-collapsed-width: 64px;
60
+ $header-height: 56px;
61
+ $tabs-height: 40px;
62
+ $footer-height: 32px;
63
+
64
+ // 过渡
65
+ $transition-duration: 0.2s;
66
+ $transition-easing: cubic-bezier(0.645, 0.045, 0.355, 1);
67
+
68
+ // 阴影
69
+ $box-shadow-card: 0 1px 10px -6px rgba(0, 0, 0, 0.1);
70
70
  $box-shadow-card-hover: 0 6px 16px -8px rgba(0, 0, 0, 0.12);
@@ -0,0 +1,44 @@
1
+ /**
2
+ * 国际化组合式函数
3
+ * 提供便捷的国际化操作
4
+ */
5
+
6
+ import { useLocaleStore } from '@/stores/locale'
7
+ import type { LocaleCode, LocaleMessages } from '@xto/core/locale'
8
+
9
+ /**
10
+ * 使用国际化
11
+ * 封装 locale store,提供更简洁的 API
12
+ */
13
+ export function useI18n() {
14
+ const localeStore = useLocaleStore()
15
+
16
+ return {
17
+ /** 当前语言代码 */
18
+ locale: localeStore.locale,
19
+ /** 当前语言名称 */
20
+ localeName: localeStore.localeName,
21
+ /** 支持的语言列表 */
22
+ locales: localeStore.locales,
23
+ /** 翻译函数 */
24
+ t: localeStore.t,
25
+ /** 当前语言包 */
26
+ messages: localeStore.messages,
27
+ /** 切换语言 */
28
+ setLocale: localeStore.changeLocale,
29
+ /** 添加自定义翻译 */
30
+ addMessages: localeStore.addMessages
31
+ }
32
+ }
33
+
34
+ /**
35
+ * 创建翻译函数
36
+ * 用于在非组件上下文中使用翻译
37
+ */
38
+ export function createTranslator() {
39
+ const localeStore = useLocaleStore()
40
+ return localeStore.t
41
+ }
42
+
43
+ // 导出类型
44
+ export type { LocaleCode, LocaleMessages }
package/src/index.ts CHANGED
@@ -3,6 +3,7 @@ import './style.scss'
3
3
 
4
4
  // 配置
5
5
  import { initAppConfig, getAppId, getClientId, getApiBaseUrl } from './utils/config'
6
+ import type { LocaleCode } from '@xto/core/locale'
6
7
 
7
8
  // XtoConfig 类型定义
8
9
  export interface XtoConfig {
@@ -12,6 +13,7 @@ export interface XtoConfig {
12
13
  apiBaseUrl?: string
13
14
  indexPath?: string
14
15
  loginPath?: string
16
+ locale?: LocaleCode
15
17
  }
16
18
 
17
19
  /**
@@ -25,6 +27,15 @@ export function createXtoApp(config: Partial<XtoConfig>) {
25
27
  clientId: config.clientId,
26
28
  apiBaseUrl: config.apiBaseUrl
27
29
  })
30
+
31
+ // 设置初始语言(如果提供)
32
+ if (config.locale) {
33
+ import('./stores/locale').then(({ useLocaleStore }) => {
34
+ const localeStore = useLocaleStore()
35
+ localeStore.changeLocale(config.locale!)
36
+ })
37
+ }
38
+
28
39
  return {
29
40
  config: {
30
41
  appName: config.appName || 'XTO App',
@@ -32,7 +43,8 @@ export function createXtoApp(config: Partial<XtoConfig>) {
32
43
  clientId: getClientId(),
33
44
  apiBaseUrl: getApiBaseUrl(),
34
45
  indexPath: config.indexPath || '/dashboard',
35
- loginPath: config.loginPath || '/login'
46
+ loginPath: config.loginPath || '/login',
47
+ locale: config.locale || 'zh-CN'
36
48
  }
37
49
  }
38
50
  }
@@ -54,6 +66,7 @@ export * from './composables/useApp'
54
66
  export * from './composables/useAuth'
55
67
  export * from './composables/useForm'
56
68
  export * from './composables/useTable'
69
+ export * from './composables/useI18n'
57
70
 
58
71
  // 工具函数
59
72
  export * from './utils/auth'
@@ -67,6 +80,7 @@ export * from './stores/app'
67
80
  export * from './stores/auth'
68
81
  export * from './stores/menu'
69
82
  export * from './stores/user'
83
+ export * from './stores/locale'
70
84
 
71
85
  // 路由
72
86
  export { default as router, resetRouter } from './router'
@@ -12,4 +12,5 @@ export default pinia
12
12
  export * from './user'
13
13
  export * from './auth'
14
14
  export * from './menu'
15
- export * from './app'
15
+ export * from './app'
16
+ export * from './locale'
@@ -0,0 +1,67 @@
1
+ /**
2
+ * 国际化状态管理
3
+ */
4
+
5
+ import { defineStore } from 'pinia'
6
+ import { ref, computed } from 'vue'
7
+ import { local } from '@/utils/storage'
8
+ import {
9
+ useLocale,
10
+ createLocaleProvider,
11
+ getSupportedLocales,
12
+ type LocaleCode,
13
+ type LocaleMessages
14
+ } from '@xto/core/locale'
15
+
16
+ export type { LocaleCode, LocaleMessages }
17
+
18
+ export const useLocaleStore = defineStore('locale', () => {
19
+ // 从本地存储获取语言设置
20
+ const savedLocale = local.get<LocaleCode>('locale') || 'zh-CN'
21
+
22
+ // 创建国际化提供者
23
+ const provider = createLocaleProvider(savedLocale)
24
+
25
+ // 状态
26
+ const locale = ref<LocaleCode>(savedLocale)
27
+ const locales = getSupportedLocales()
28
+
29
+ // 使用国际化组合式函数
30
+ const { t, messages, setLocale, mergeMessages } = useLocale()
31
+
32
+ // 当前语言名称
33
+ const localeName = computed(() => {
34
+ const found = locales.find(l => l.code === locale.value)
35
+ return found?.name || locale.value
36
+ })
37
+
38
+ // 设置语言
39
+ const changeLocale = (code: LocaleCode) => {
40
+ locale.value = code
41
+ setLocale(code)
42
+ local.set('locale', code)
43
+ provider.setLocale(code)
44
+ }
45
+
46
+ // 添加自定义翻译
47
+ const addMessages = (msgs: LocaleMessages) => {
48
+ mergeMessages(msgs)
49
+ }
50
+
51
+ // 初始化
52
+ const initLocale = () => {
53
+ setLocale(savedLocale)
54
+ }
55
+
56
+ return {
57
+ locale,
58
+ localeName,
59
+ locales,
60
+ messages,
61
+ t,
62
+ changeLocale,
63
+ addMessages,
64
+ initLocale,
65
+ provider
66
+ }
67
+ })