@befly-addon/admin 1.0.36 → 1.0.38

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 (57) hide show
  1. package/apis/admin/del.ts +1 -5
  2. package/apis/admin/ins.ts +2 -6
  3. package/apis/admin/list.ts +5 -0
  4. package/apis/admin/roleDetail.ts +1 -5
  5. package/apis/admin/roleSave.ts +1 -5
  6. package/apis/admin/upd.ts +1 -6
  7. package/apis/api/all.ts +1 -6
  8. package/apis/auth/login.ts +1 -5
  9. package/apis/auth/logout.ts +1 -5
  10. package/apis/auth/register.ts +1 -5
  11. package/apis/auth/sendSmsCode.ts +1 -5
  12. package/apis/dashboard/changelog.ts +1 -5
  13. package/apis/dashboard/configStatus.ts +1 -5
  14. package/apis/dashboard/environmentInfo.ts +1 -5
  15. package/apis/dashboard/performanceMetrics.ts +1 -5
  16. package/apis/dashboard/permissionStats.ts +1 -5
  17. package/apis/dashboard/serviceStatus.ts +1 -5
  18. package/apis/dashboard/systemInfo.ts +1 -5
  19. package/apis/dashboard/systemOverview.ts +1 -5
  20. package/apis/dashboard/systemResources.ts +1 -5
  21. package/apis/dict/all.ts +0 -3
  22. package/apis/menu/del.ts +1 -5
  23. package/apis/role/all.ts +18 -0
  24. package/apis/role/apiDetail.ts +1 -5
  25. package/apis/role/apiSave.ts +1 -5
  26. package/apis/role/del.ts +1 -5
  27. package/apis/role/detail.ts +1 -5
  28. package/apis/role/ins.ts +0 -3
  29. package/apis/role/list.ts +5 -0
  30. package/apis/role/menuDetail.ts +1 -5
  31. package/apis/role/menuSave.ts +1 -5
  32. package/apis/role/save.ts +1 -5
  33. package/package.json +5 -3
  34. package/styles/variables.scss +87 -0
  35. package/tables/admin.json +2 -8
  36. package/views/403/index.vue +21 -30
  37. package/views/admin/components/edit.vue +73 -48
  38. package/views/admin/index.vue +128 -48
  39. package/views/dict/index.vue +0 -2
  40. package/views/index/components/addonList.vue +20 -14
  41. package/views/index/components/environmentInfo.vue +6 -6
  42. package/views/index/components/operationLogs.vue +9 -9
  43. package/views/index/components/performanceMetrics.vue +22 -32
  44. package/views/index/components/serviceStatus.vue +14 -14
  45. package/views/index/components/systemNotifications.vue +21 -21
  46. package/views/index/components/systemOverview.vue +24 -24
  47. package/views/index/components/systemResources.vue +4 -4
  48. package/views/index/components/userInfo.vue +7 -7
  49. package/views/index/index.vue +0 -2
  50. package/views/login/components/emailLoginForm.vue +47 -46
  51. package/views/login/index_1.vue +158 -121
  52. package/views/role/components/api.vue +11 -9
  53. package/views/role/components/edit.vue +13 -2
  54. package/views/role/index.vue +0 -2
  55. package/utils/scanBeflyAddonViews.js +0 -43
  56. package/views/admin/components/role.vue +0 -138
  57. /package/apis/admin/{info.ts → detail.ts} +0 -0
@@ -86,22 +86,22 @@ fetchData();
86
86
  .performance-grid {
87
87
  display: grid;
88
88
  grid-template-columns: repeat(4, 1fr);
89
- gap: $spacing-sm;
90
- margin-bottom: $spacing-sm;
89
+ gap: var(--spacing-sm);
90
+ margin-bottom: var(--spacing-sm);
91
91
 
92
92
  .perf-metric {
93
93
  display: flex;
94
94
  align-items: center;
95
- gap: $spacing-sm;
96
- padding: $spacing-sm $spacing-md;
97
- background: rgba($primary-color, 0.02);
98
- border-radius: $border-radius;
99
- border: 1px solid $border-color;
100
- transition: all 0.2s ease;
95
+ gap: var(--spacing-sm);
96
+ padding: var(--spacing-sm) var(--spacing-md);
97
+ background: rgba(var(--primary-color-rgb), 0.02);
98
+ border-radius: var(--border-radius);
99
+ border: 1px solid var(--border-color);
100
+ transition: all 0.2s;
101
101
 
102
102
  &:hover {
103
- background: rgba($primary-color, 0.05);
104
- border-color: $primary-color;
103
+ background: rgba(var(--primary-color-rgb), 0.05);
104
+ border-color: var(--primary-color);
105
105
  }
106
106
 
107
107
  .perf-icon {
@@ -110,9 +110,9 @@ fetchData();
110
110
  justify-content: center;
111
111
  width: 36px;
112
112
  height: 36px;
113
- border-radius: $border-radius-small;
114
- background: linear-gradient(135deg, rgba($success-color, 0.1) 0%, rgba($success-color, 0.05) 100%);
115
- color: $success-color;
113
+ border-radius: var(--border-radius-small);
114
+ background: linear-gradient(135deg, rgba(0, 168, 112, 0.1) 0%, rgba(0, 168, 112, 0.05) 100%);
115
+ color: var(--success-color);
116
116
  flex-shrink: 0;
117
117
  }
118
118
 
@@ -121,35 +121,25 @@ fetchData();
121
121
 
122
122
  .perf-label {
123
123
  font-size: 14px;
124
- color: $text-secondary;
124
+ color: var(--text-secondary);
125
125
  margin-bottom: 2px;
126
126
  }
127
127
 
128
128
  .perf-value {
129
129
  font-size: 16px;
130
130
  font-weight: 700;
131
- color: $primary-color;
131
+ color: var(--primary-color);
132
132
  }
133
133
  }
134
134
  }
135
135
  }
136
136
 
137
- .perf-slowest {
138
- display: flex;
139
- align-items: center;
140
- gap: 6px;
141
- padding: $spacing-sm $spacing-md;
142
- background: rgba($warning-color, 0.05);
143
- border-radius: $border-radius-small;
144
- border: 1px solid rgba($warning-color, 0.2);
145
- font-size: 14px;
146
- color: $warning-color;
147
-
148
- span {
149
- flex: 1;
150
- overflow: hidden;
151
- text-overflow: ellipsis;
152
- white-space: nowrap;
153
- }
137
+ .warning-tip {
138
+ padding: var(--spacing-sm) var(--spacing-md);
139
+ background: rgba(var(--warning-color-rgb), 0.05);
140
+ border-radius: var(--border-radius-small);
141
+ border: 1px solid rgba(var(--warning-color-rgb), 0.2);
142
+ font-size: 13px;
143
+ color: var(--warning-color);
154
144
  }
155
145
  </style>
@@ -88,8 +88,8 @@ const getStatusText = (status) => {
88
88
  gap: 10px;
89
89
 
90
90
  .config-card {
91
- background: rgba($primary-color, 0.02);
92
- border: 1px solid $border-color;
91
+ background: rgba(var(--primary-color-rgb), 0.02);
92
+ border: 1px solid var(--border-color);
93
93
  border-radius: 6px;
94
94
  padding: 12px;
95
95
  display: flex;
@@ -100,8 +100,8 @@ const getStatusText = (status) => {
100
100
  transition: all 0.3s;
101
101
 
102
102
  &:hover {
103
- background: rgba($primary-color, 0.05);
104
- border-color: $primary-color;
103
+ background: rgba(var(--primary-color-rgb), 0.05);
104
+ border-color: var(--primary-color);
105
105
  transform: translateY(-2px);
106
106
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
107
107
  }
@@ -134,7 +134,7 @@ const getStatusText = (status) => {
134
134
 
135
135
  .latency {
136
136
  margin-left: 4px;
137
- color: $text-placeholder;
137
+ color: var(--text-placeholder);
138
138
  }
139
139
  }
140
140
  }
@@ -147,44 +147,44 @@ const getStatusText = (status) => {
147
147
  }
148
148
 
149
149
  &.config-running {
150
- border-color: $success-color;
150
+ border-color: var(--success-color);
151
151
  background: linear-gradient(135deg, rgba(82, 196, 26, 0.05), white);
152
152
 
153
153
  .config-icon {
154
154
  background: rgba(82, 196, 26, 0.1);
155
- color: $success-color;
155
+ color: var(--success-color);
156
156
  }
157
157
 
158
158
  .config-name {
159
- color: $success-color;
159
+ color: var(--success-color);
160
160
  }
161
161
  }
162
162
 
163
163
  &.config-unconfigured {
164
- border-color: $warning-color;
164
+ border-color: var(--warning-color);
165
165
  background: linear-gradient(135deg, rgba(250, 173, 20, 0.05), white);
166
166
 
167
167
  .config-icon {
168
168
  background: rgba(250, 173, 20, 0.1);
169
- color: $warning-color;
169
+ color: var(--warning-color);
170
170
  }
171
171
 
172
172
  .config-name {
173
- color: $warning-color;
173
+ color: var(--warning-color);
174
174
  }
175
175
  }
176
176
 
177
177
  &.config-stopped {
178
- border-color: $error-color;
178
+ border-color: var(--error-color);
179
179
  background: linear-gradient(135deg, rgba(255, 77, 79, 0.05), white);
180
180
 
181
181
  .config-icon {
182
182
  background: rgba(255, 77, 79, 0.1);
183
- color: $error-color;
183
+ color: var(--error-color);
184
184
  }
185
185
 
186
186
  .config-name {
187
- color: $error-color;
187
+ color: var(--error-color);
188
188
  }
189
189
  }
190
190
  }
@@ -62,21 +62,21 @@ const formatTime = (timestamp) => {
62
62
  .notification-compact-list {
63
63
  display: flex;
64
64
  flex-direction: column;
65
- gap: $spacing-xs;
65
+ gap: var(--spacing-xs);
66
66
 
67
67
  .notification-compact-item {
68
68
  display: flex;
69
69
  align-items: center;
70
- gap: $spacing-sm;
71
- padding: $spacing-sm $spacing-md;
72
- background: rgba($primary-color, 0.02);
73
- border-radius: $border-radius-small;
74
- border: 1px solid $border-color;
75
- transition: all 0.2s ease;
70
+ gap: var(--spacing-sm);
71
+ padding: var(--spacing-sm) var(--spacing-md);
72
+ background: rgba(var(--primary-color-rgb), 0.02);
73
+ border-radius: var(--border-radius-small);
74
+ border: 1px solid var(--border-color);
75
+ transition: all 0.2s;
76
76
 
77
77
  &:hover {
78
- background: rgba($primary-color, 0.05);
79
- border-color: $primary-color;
78
+ background: rgba(var(--primary-color-rgb), 0.05);
79
+ border-color: var(--primary-color);
80
80
  }
81
81
 
82
82
  .notification-icon {
@@ -85,40 +85,40 @@ const formatTime = (timestamp) => {
85
85
  justify-content: center;
86
86
  width: 32px;
87
87
  height: 32px;
88
- border-radius: $border-radius-small;
88
+ border-radius: var(--border-radius-small);
89
89
  flex-shrink: 0;
90
90
 
91
91
  &.type-info {
92
- background: rgba($primary-color, 0.1);
93
- color: $primary-color;
92
+ background: rgba(var(--primary-color-rgb), 0.1);
93
+ color: var(--primary-color);
94
94
  }
95
95
 
96
96
  &.type-success {
97
- background: rgba($success-color, 0.1);
98
- color: $success-color;
97
+ background: rgba(var(--success-color-rgb), 0.1);
98
+ color: var(--success-color);
99
99
  }
100
100
 
101
101
  &.type-warning {
102
- background: rgba($warning-color, 0.1);
103
- color: $warning-color;
102
+ background: rgba(var(--warning-color-rgb), 0.1);
103
+ color: var(--warning-color);
104
104
  }
105
105
 
106
106
  &.type-error {
107
- background: rgba($error-color, 0.1);
108
- color: $error-color;
107
+ background: rgba(var(--error-color-rgb), 0.1);
108
+ color: var(--error-color);
109
109
  }
110
110
  }
111
111
 
112
112
  .notification-content {
113
113
  display: flex;
114
114
  align-items: center;
115
- gap: $spacing-sm;
115
+ gap: var(--spacing-sm);
116
116
  flex: 1;
117
117
  min-width: 0;
118
118
 
119
119
  .notification-title {
120
120
  font-size: 14px;
121
- color: $text-primary;
121
+ color: var(--text-primary);
122
122
  font-weight: 500;
123
123
  overflow: hidden;
124
124
  text-overflow: ellipsis;
@@ -128,7 +128,7 @@ const formatTime = (timestamp) => {
128
128
 
129
129
  .notification-time {
130
130
  font-size: 14px;
131
- color: $text-placeholder;
131
+ color: var(--text-placeholder);
132
132
  flex-shrink: 0;
133
133
  }
134
134
  }
@@ -74,12 +74,12 @@ fetchData();
74
74
  gap: 6px;
75
75
  padding-bottom: 8px;
76
76
  margin-bottom: 12px;
77
- border-bottom: 2px solid $primary-color;
77
+ border-bottom: 2px solid var(--primary-color);
78
78
 
79
79
  .info-title {
80
80
  font-size: 14px;
81
81
  font-weight: 600;
82
- color: $text-primary;
82
+ color: var(--text-primary);
83
83
  }
84
84
  }
85
85
 
@@ -93,29 +93,29 @@ fetchData();
93
93
  justify-content: space-between;
94
94
  align-items: center;
95
95
  padding: 10px 12px;
96
- background: rgba($primary-color, 0.02);
97
- border-radius: $border-radius-small;
98
- border: 1px solid $border-color;
96
+ background: rgba(var(--primary-color-rgb), 0.02);
97
+ border-radius: var(--border-radius-small);
98
+ border: 1px solid var(--border-color);
99
99
  transition: all 0.2s ease;
100
100
 
101
101
  &:hover {
102
- background: rgba($primary-color, 0.05);
103
- border-color: $primary-color;
102
+ background: rgba(var(--primary-color-rgb), 0.05);
103
+ border-color: var(--primary-color);
104
104
  }
105
105
 
106
106
  .label {
107
107
  font-size: 14px;
108
- color: $text-secondary;
108
+ color: var(--text-secondary);
109
109
  font-weight: 500;
110
110
  }
111
111
 
112
112
  .value {
113
113
  font-size: 14px;
114
- color: $text-primary;
114
+ color: var(--text-primary);
115
115
  font-weight: 600;
116
116
 
117
117
  &.highlight {
118
- color: $primary-color;
118
+ color: var(--primary-color);
119
119
  }
120
120
  }
121
121
  }
@@ -128,8 +128,8 @@ fetchData();
128
128
  gap: 10px;
129
129
 
130
130
  .stat-box {
131
- background: rgba($primary-color, 0.02);
132
- border: 1px solid $border-color;
131
+ background: rgba(var(--primary-color-rgb), 0.02);
132
+ border: 1px solid var(--border-color);
133
133
  border-radius: 6px;
134
134
  padding: 12px;
135
135
  display: flex;
@@ -138,8 +138,8 @@ fetchData();
138
138
  transition: all 0.3s;
139
139
 
140
140
  &:hover {
141
- background: rgba($primary-color, 0.05);
142
- border-color: $primary-color;
141
+ background: rgba(var(--primary-color-rgb), 0.05);
142
+ border-color: var(--primary-color);
143
143
  transform: translateY(-2px);
144
144
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
145
145
  }
@@ -155,34 +155,34 @@ fetchData();
155
155
 
156
156
  .stat-label {
157
157
  font-size: 14px;
158
- color: $text-secondary;
158
+ color: var(--text-secondary);
159
159
  }
160
160
  }
161
161
 
162
162
  &.stat-primary {
163
- border-color: $primary-color;
164
- background: linear-gradient(135deg, rgba(0, 82, 217, 0.05), white);
163
+ border-color: var(--primary-color);
164
+ background: linear-gradient(135deg, rgba(var(--primary-color-rgb), 0.05), white);
165
165
 
166
166
  .stat-value {
167
- color: $primary-color;
167
+ color: var(--primary-color);
168
168
  }
169
169
  }
170
170
 
171
171
  &.stat-success {
172
- border-color: $success-color;
173
- background: linear-gradient(135deg, rgba(82, 196, 26, 0.05), white);
172
+ border-color: var(--success-color);
173
+ background: linear-gradient(135deg, rgba(var(--success-color-rgb), 0.05), white);
174
174
 
175
175
  .stat-value {
176
- color: $success-color;
176
+ color: var(--success-color);
177
177
  }
178
178
  }
179
179
 
180
180
  &.stat-warning {
181
- border-color: $warning-color;
182
- background: linear-gradient(135deg, rgba(250, 173, 20, 0.05), white);
181
+ border-color: var(--warning-color);
182
+ background: linear-gradient(135deg, rgba(var(--warning-color-rgb), 0.05), white);
183
183
 
184
184
  .stat-value {
185
- color: $warning-color;
185
+ color: var(--warning-color);
186
186
  }
187
187
  }
188
188
  }
@@ -77,7 +77,7 @@ const getProgressColor = (percentage) => {
77
77
  .resource-compact-list {
78
78
  display: grid;
79
79
  grid-template-columns: repeat(3, 1fr);
80
- gap: $spacing-md;
80
+ gap: var(--spacing-md);
81
81
 
82
82
  .resource-compact-item {
83
83
  .resource-compact-header {
@@ -89,20 +89,20 @@ const getProgressColor = (percentage) => {
89
89
  .resource-label {
90
90
  font-size: 14px;
91
91
  font-weight: 600;
92
- color: $text-secondary;
92
+ color: var(--text-secondary);
93
93
  min-width: 50px;
94
94
  }
95
95
 
96
96
  .resource-value {
97
97
  font-size: 16px;
98
98
  font-weight: 700;
99
- color: $primary-color;
99
+ color: var(--primary-color);
100
100
  min-width: 60px;
101
101
  }
102
102
 
103
103
  .resource-desc {
104
104
  font-size: 14px;
105
- color: $text-placeholder;
105
+ color: var(--text-placeholder);
106
106
  flex: 1;
107
107
  }
108
108
  }
@@ -56,7 +56,7 @@ const $Method = {
56
56
  // 获取数据
57
57
  async fetchData() {
58
58
  try {
59
- const { data } = await $Http('/addon/admin/admin/info');
59
+ const { data } = await $Http('/addon/admin/admin/detail');
60
60
  Object.assign($Data.userInfo, data);
61
61
  } catch (error) {
62
62
  console.error('获取用户信息失败:', error);
@@ -136,12 +136,12 @@ $Method.fetchData();
136
136
  align-items: center;
137
137
  gap: 12px;
138
138
  padding-bottom: 12px;
139
- border-bottom: 1px solid $border-color;
139
+ border-bottom: 1px solid var(--border-color);
140
140
 
141
141
  .user-avatar {
142
142
  width: 48px;
143
143
  height: 48px;
144
- background: linear-gradient(135deg, $primary-color, #764ba2);
144
+ background: linear-gradient(135deg, var(--primary-color), #764ba2);
145
145
  border-radius: 50%;
146
146
  display: flex;
147
147
  align-items: center;
@@ -157,7 +157,7 @@ $Method.fetchData();
157
157
  .user-name {
158
158
  font-size: 16px;
159
159
  font-weight: 600;
160
- color: $text-primary;
160
+ color: var(--text-primary);
161
161
  margin-bottom: 4px;
162
162
  overflow: hidden;
163
163
  text-overflow: ellipsis;
@@ -166,7 +166,7 @@ $Method.fetchData();
166
166
 
167
167
  .user-role {
168
168
  font-size: 12px;
169
- color: $text-secondary;
169
+ color: var(--text-secondary);
170
170
  }
171
171
  }
172
172
  }
@@ -182,7 +182,7 @@ $Method.fetchData();
182
182
  align-items: center;
183
183
  gap: 8px;
184
184
  font-size: 12px;
185
- color: $text-secondary;
185
+ color: var(--text-secondary);
186
186
 
187
187
  span {
188
188
  overflow: hidden;
@@ -195,7 +195,7 @@ $Method.fetchData();
195
195
  .user-actions {
196
196
  margin-top: 16px;
197
197
  padding-top: 12px;
198
- border-top: 1px solid $border-color;
198
+ border-top: 1px solid var(--border-color);
199
199
  display: flex;
200
200
  justify-content: center;
201
201
  }
@@ -26,7 +26,5 @@ import EnvironmentInfo from './components/environmentInfo.vue';
26
26
  background-color: #fff;
27
27
  padding: 15px;
28
28
  border: 1px solid #e8eaed;
29
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
30
- border-radius: 8px;
31
29
  }
32
30
  </style>
@@ -1,31 +1,33 @@
1
1
  <template>
2
- <TForm :model="$Data.formData" :rules="$Data2.formRules" :ref="(el) => ($From.form = el)" class="login-form" label-width="90px" label-position="left" :show-message="false">
3
- <TFormItem prop="account" label="账号">
4
- <TInput v-model="$Data.formData.account" placeholder="请输入用户名或邮箱" size="large" clearable>
2
+ <TForm :model="$Data.formData" :rules="$Data2.formRules" :ref="(el) => ($From.form = el)" class="login-form" :show-message="false" label-width="0">
3
+ <TFormItem prop="account">
4
+ <TInput v-model="$Data.formData.account" placeholder="用户名或邮箱" size="large" clearable @enter="$Method.apiLogin">
5
5
  <template #prefix-icon>
6
6
  <ILucideUser />
7
7
  </template>
8
8
  </TInput>
9
9
  </TFormItem>
10
10
 
11
- <TFormItem prop="password" label="密码">
12
- <TInput v-model="$Data.formData.password" type="password" placeholder="请输入密码" size="large" clearable>
11
+ <TFormItem prop="password">
12
+ <TInput v-model="$Data.formData.password" type="password" placeholder="密码" size="large" clearable @enter="$Method.apiLogin">
13
13
  <template #prefix-icon>
14
14
  <ILucideLock />
15
15
  </template>
16
16
  </TInput>
17
17
  </TFormItem>
18
18
 
19
- <div class="form-footer">
20
- <a href="#" class="forgot-password">忘记密码?</a>
19
+ <div class="form-options">
20
+ <TCheckbox v-model="$Data.rememberMe">记住我</TCheckbox>
21
+ <a href="#" class="link-text">忘记密码?</a>
21
22
  </div>
22
23
 
23
- <TButton theme="primary" class="auth-btn" size="large" :loading="$Data.loading" @click="$Method.apiLogin"> 登录 </TButton>
24
+ <TButton theme="primary" class="login-btn" size="large" block :loading="$Data.loading" @click="$Method.apiLogin"> 登录 </TButton>
24
25
  </TForm>
25
26
  </template>
26
27
 
27
28
  <script setup>
28
- import { Form as TForm, FormItem as TFormItem, Input as TInput, Button as TButton, MessagePlugin } from 'tdesign-vue-next';
29
+ import { useRouter } from 'vue-router';
30
+ import { Form as TForm, FormItem as TFormItem, Input as TInput, Button as TButton, Checkbox as TCheckbox, MessagePlugin } from 'tdesign-vue-next';
29
31
  import ILucideUser from '~icons/lucide/user';
30
32
  import ILucideLock from '~icons/lucide/lock';
31
33
  import { $Http } from '@/plugins/http';
@@ -41,6 +43,7 @@ const $From = $shallowRef({
41
43
  // 数据定义
42
44
  const $Data = $ref({
43
45
  loading: false,
46
+ rememberMe: false,
44
47
  formData: {
45
48
  account: '',
46
49
  password: ''
@@ -94,12 +97,10 @@ const $Method = {
94
97
  <style scoped lang="scss">
95
98
  .login-form {
96
99
  width: 100%;
97
- max-width: 450px;
98
- }
99
100
 
100
- .t-form__item {
101
- width: 100%;
102
- margin-bottom: 1.2rem;
101
+ :deep(.t-form__item) {
102
+ margin-bottom: 1.25rem;
103
+ }
103
104
 
104
105
  :deep(.t-form__controls) {
105
106
  width: 100%;
@@ -107,59 +108,59 @@ const $Method = {
107
108
 
108
109
  :deep(.t-input) {
109
110
  width: 100%;
110
- background: #f8f9fa;
111
- border: 1px solid #e0e0e0;
112
- border-radius: 6px;
111
+ border-radius: 8px;
113
112
  transition: all 0.3s;
114
113
 
115
114
  &:hover {
116
- border-color: #48b19f;
115
+ border-color: #667eea;
117
116
  }
118
117
 
119
118
  &:focus-within {
120
- border-color: #48b19f;
121
- background: #fff;
119
+ border-color: #667eea;
120
+ box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
122
121
  }
122
+ }
123
123
 
124
- input {
125
- padding: 0.75rem 1rem;
126
- }
124
+ :deep(.t-input__wrap) {
125
+ width: 100%;
127
126
  }
128
127
  }
129
128
 
130
- .form-footer {
131
- width: 100%;
129
+ .form-options {
132
130
  display: flex;
133
- justify-content: flex-end;
134
- margin-bottom: 1rem;
135
- }
131
+ justify-content: space-between;
132
+ align-items: center;
133
+ margin-bottom: 1.5rem;
134
+ font-size: 0.875rem;
136
135
 
137
- .forgot-password {
138
- font-size: 0.8rem;
139
- color: #888;
140
- text-decoration: none;
136
+ .link-text {
137
+ color: var(--login-link);
138
+ text-decoration: none;
139
+ transition: color 0.3s;
141
140
 
142
- &:hover {
143
- color: #48b19f;
141
+ &:hover {
142
+ color: var(--login-link-hover);
143
+ }
144
144
  }
145
145
  }
146
146
 
147
- .auth-btn {
148
- width: 100% !important;
149
- max-width: 100%;
150
- height: 44px;
151
- border-radius: 6px;
152
- background: #48b19f;
153
- border: none;
154
- font-size: 0.95rem;
147
+ .login-btn {
148
+ width: 100%;
149
+ height: 48px;
150
+ border-radius: 8px;
151
+ font-size: 1rem;
155
152
  font-weight: 600;
156
- margin-top: 0.5rem;
153
+ background: linear-gradient(135deg, var(--login-btn-gradient-start) 0%, var(--login-btn-gradient-end) 100%);
154
+ border: none;
157
155
  transition: all 0.3s;
158
156
 
159
157
  &:hover {
160
- background: #3a9d8f;
161
- transform: translateY(-1px);
162
- box-shadow: 0 3px 10px rgba(72, 177, 159, 0.3);
158
+ transform: translateY(-2px);
159
+ box-shadow: 0 8px 20px var(--login-btn-shadow);
160
+ }
161
+
162
+ &:active {
163
+ transform: translateY(0);
163
164
  }
164
165
 
165
166
  :deep(.t-button__text) {