@appthen/cli 1.2.10 → 1.2.12

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 (173) hide show
  1. package/.gitignore +1 -0
  2. package/bin/main.js +92 -0
  3. package/dist/index.js +7014 -14988
  4. package/package.json +8 -1
  5. package/tests/test-app/.appthen/shadow-space-100001-test-app-e99876b1.json +1862 -0
  6. package/tests/test-app/.appthen/space-config.json +8 -0
  7. package/tests/test-app/docs/AI-Workflow.flow +112 -0
  8. package/tests/test-app/docs/Logic-1.flow +16 -0
  9. package/tests/test-app/docs/Logic.flow +16 -0
  10. package/tests/test-app/docs/Project-Blueprint-1.flow +119 -0
  11. package/tests/test-app/docs/Project-Blueprint.flow +119 -0
  12. package/tests/test-app/docs/README.md +3 -0
  13. package/tests/test-app/docs/claude.md +194 -0
  14. package/tests/test-app/docs/page_requirement_analysis.md +149 -0
  15. package/tests/test-app/docs//345/267/245/345/215/225/347/256/241/347/220/206/347/263/273/347/273/237/350/257/246/347/273/206/350/256/276/350/256/241.md +377 -0
  16. package/tests/test-app/src/apis/AddTodoPost.api.ts +42 -0
  17. package/tests/test-app/src/apis/DeleteTodoPost.api.ts +32 -0
  18. package/tests/test-app/src/apis/GetListPost.api.ts +38 -0
  19. package/tests/test-app/src/apis/TicketAttachmentUploadPost.api.ts +42 -0
  20. package/tests/test-app/src/apis/UpdateTodoPost.api.ts +46 -0
  21. package/tests/test-app/src/app.css +15 -0
  22. package/tests/test-app/src/cloud_functions/ticket|attachment|upload.node.ts +86 -0
  23. package/tests/test-app/src/cloud_functions/ticket|comment|add.node.ts +65 -0
  24. package/tests/test-app/src/cloud_functions/types|entity|Ticket.node.ts +88 -0
  25. package/tests/test-app/src/cloud_functions/types|entity|TicketAttachment.node.ts +70 -0
  26. package/tests/test-app/src/cloud_functions/types|entity|TicketCategory.node.ts +56 -0
  27. package/tests/test-app/src/cloud_functions/types|entity|TicketComment.node.ts +62 -0
  28. package/tests/test-app/src/cloud_functions/types|entity|TicketHistory.node.ts +74 -0
  29. package/tests/test-app/src/cloud_functions/types|entity|TicketPriority.node.ts +68 -0
  30. package/tests/test-app/src/cloud_functions/types|entity|TicketStatus.node.ts +63 -0
  31. package/tests/test-app/src/cloud_functions/types|models|CreateTicketParams.node.ts +20 -0
  32. package/tests/test-app/src/cloud_functions/types|models|TicketListParams.node.ts +30 -0
  33. package/tests/test-app/src/cloud_functions/types|models|UpdateTicketParams.node.ts +22 -0
  34. package/tests/test-app/src/components/Button.js +11 -0
  35. package/tests/test-app/src/components/MessageCenter.tsx +506 -0
  36. package/tests/test-app/src/components/MouduleDemoNzp.tsx +40 -0
  37. package/tests/test-app/src/components/Timeline.tsx +145 -0
  38. package/tests/test-app/src/index.ts +2 -0
  39. package/tests/test-app/src/modules/work_order_module/apis/TicketCommentAddPost.api.ts +48 -0
  40. package/tests/test-app/src/modules/work_order_module/apis/TicketCreatePost.api.ts +52 -0
  41. package/tests/test-app/src/modules/work_order_module/apis/TicketDeleteDelete.api.ts +39 -0
  42. package/tests/test-app/src/modules/work_order_module/apis/TicketDetailGet.api.ts +39 -0
  43. package/tests/test-app/src/modules/work_order_module/apis/TicketListGet.api.ts +61 -0
  44. package/tests/test-app/src/modules/work_order_module/apis/TicketUpdatePut.api.ts +57 -0
  45. package/tests/test-app/src/modules/work_order_module/apis/TrainDoorFaultListGet.ts +76 -0
  46. package/tests/test-app/src/modules/work_order_module/apis/TrainDoorListGet.ts +76 -0
  47. package/tests/test-app/src/modules/work_order_module/apis/TrainDoorOperationRecordsGet.ts +284 -0
  48. package/tests/test-app/src/modules/work_order_module/apis/TrainDoorStatisticsGet.ts +96 -0
  49. package/tests/test-app/src/modules/work_order_module/cloud_function/category|list.node.ts +40 -0
  50. package/tests/test-app/src/modules/work_order_module/cloud_function/priority|list.node.ts +26 -0
  51. package/tests/test-app/src/modules/work_order_module/cloud_function/status|list.node.ts +26 -0
  52. package/tests/test-app/src/modules/work_order_module/cloud_function/ticket|create.node.ts +54 -0
  53. package/tests/test-app/src/modules/work_order_module/cloud_function/ticket|delete.node.ts +55 -0
  54. package/tests/test-app/src/modules/work_order_module/cloud_function/ticket|detail.node.ts +65 -0
  55. package/tests/test-app/src/modules/work_order_module/cloud_function/ticket|list.node.ts +85 -0
  56. package/tests/test-app/src/modules/work_order_module/cloud_function/ticket|update.node.ts +73 -0
  57. package/tests/test-app/src/modules/work_order_module/data_model/Ticket.m.ts +85 -0
  58. package/tests/test-app/src/modules/work_order_module/data_model/TicketCategory.m.ts +53 -0
  59. package/tests/test-app/src/modules/work_order_module/data_model/TicketStatus.m.ts +60 -0
  60. package/tests/test-app/src/modules/work_order_module//345/267/245/345/215/225/347/263/273/347/273/237/344/272/247/345/223/201/350/256/276/350/256/241/346/226/207/346/241/243.md +301 -0
  61. package/tests/test-app/src/modules/work_order_module//345/267/245/345/215/225/347/263/273/347/273/237/345/274/200/345/217/221/344/273/273/345/212/241/345/210/206/345/267/245/346/226/207/346/241/243.md +345 -0
  62. package/tests/test-app/src/pages/CustomerManagement.tsx +535 -0
  63. package/tests/test-app/src/pages/CyberpunkDashboard.tsx +348 -0
  64. package/tests/test-app/src/pages/CyberpunkProductManagement.tsx +637 -0
  65. package/tests/test-app/src/pages/CyberpunkUserList.tsx +316 -0
  66. package/tests/test-app/src/pages/DashboardV2.tsx +334 -0
  67. package/tests/test-app/src/pages/DataReport.tsx +298 -0
  68. package/tests/test-app/src/pages/DataStatistics.tsx +317 -0
  69. package/tests/test-app/src/pages/DepartmentManagement.tsx +503 -0
  70. package/tests/test-app/src/pages/FileExplorer.tsx +441 -0
  71. package/tests/test-app/src/pages/OrderDetail.tsx +393 -0
  72. package/tests/test-app/src/pages/ProductManagement.tsx +521 -0
  73. package/tests/test-app/src/pages/ProjectTimeline.tsx +395 -0
  74. package/tests/test-app/src/pages/RoleManagement.tsx +523 -0
  75. package/tests/test-app/src/pages/SLAManagement.tsx +668 -0
  76. package/tests/test-app/src/pages/StaticCyberpunkDashboard.tsx +462 -0
  77. package/tests/test-app/src/pages/StaticCyberpunkUserList.tsx +567 -0
  78. package/tests/test-app/src/pages/StudentWeaknessList.tsx +547 -0
  79. package/tests/test-app/src/pages/SystemSettings.tsx +422 -0
  80. package/tests/test-app/src/pages/TaskManagement.tsx +467 -0
  81. package/tests/test-app/src/pages/TicketCreate.tsx +27 -0
  82. package/tests/test-app/src/pages/TicketDetail.tsx +27 -0
  83. package/tests/test-app/src/pages/TicketList.tsx +27 -0
  84. package/tests/test-app/src/pages/TicketManagement.tsx +402 -0
  85. package/tests/test-app/src/pages/TicketManagementPage.tsx +1238 -0
  86. package/tests/test-app/src/pages/UserProfile.tsx +404 -0
  87. package/tests/test-app/src/pages/VisualAIIDEUpgrade.tsx +245 -0
  88. package/tests/test-app/src/pages/WorkflowDesigner.tsx +434 -0
  89. package/tests/test-app/src/pages/admin/dashboard.tsx +591 -0
  90. package/tests/test-app/src/pages/appthen_guide/ComponentTreeUnderstanding.tsx +26 -0
  91. package/tests/test-app/src/pages/appthen_guide/DataBindingLearning.tsx +26 -0
  92. package/tests/test-app/src/pages/article-list.tsx +222 -0
  93. package/tests/test-app/src/pages/babyProductRecommendationPage.tsx +168 -0
  94. package/tests/test-app/src/pages/back-end/adminRootLayout.tsx +155 -0
  95. package/tests/test-app/src/pages/back-end/adminRootLayout10.tsx +157 -0
  96. package/tests/test-app/src/pages/back-end/adminRootLayout2.tsx +156 -0
  97. package/tests/test-app/src/pages/back-end/adminRootLayout3.tsx +156 -0
  98. package/tests/test-app/src/pages/back-end/adminRootLayout4.tsx +157 -0
  99. package/tests/test-app/src/pages/back-end/adminRootLayout5.tsx +157 -0
  100. package/tests/test-app/src/pages/back-end/adminRootLayout6.tsx +157 -0
  101. package/tests/test-app/src/pages/back-end/adminRootLayout7.tsx +157 -0
  102. package/tests/test-app/src/pages/back-end/adminRootLayout8.tsx +157 -0
  103. package/tests/test-app/src/pages/back-end/adminRootLayout9.tsx +157 -0
  104. package/tests/test-app/src/pages/back-end/backgroundManagementSystem.css +5 -0
  105. package/tests/test-app/src/pages/back-end/backgroundManagementSystem.tsx +1745 -0
  106. package/tests/test-app/src/pages/category-list.tsx +179 -0
  107. package/tests/test-app/src/pages/comment-list.tsx +194 -0
  108. package/tests/test-app/src/pages/component/WorkOrderCard.tsx +140 -0
  109. package/tests/test-app/src/pages/cover.tsx +42 -0
  110. package/tests/test-app/src/pages/cyberpunk/cyberpunkCRMPage.tsx +1299 -0
  111. package/tests/test-app/src/pages/data-analytics.tsx +1872 -0
  112. package/tests/test-app/src/pages/data-overview.tsx +600 -0
  113. package/tests/test-app/src/pages/data_dashboard/blueBrightGreenTechnologyWind.css +181 -0
  114. package/tests/test-app/src/pages/data_dashboard/blueBrightGreenTechnologyWind.tsx +225 -0
  115. package/tests/test-app/src/pages/data_dashboard/blueLargeScreen.css +181 -0
  116. package/tests/test-app/src/pages/data_dashboard/blueLargeScreen.tsx +138 -0
  117. package/tests/test-app/src/pages/data_dashboard/component_library/BlueBrightGreenBorder.tsx +47 -0
  118. package/tests/test-app/src/pages/data_dashboard/component_library/FullScreenContainer.tsx +133 -0
  119. package/tests/test-app/src/pages/demo-error-page.tsx +119 -0
  120. package/tests/test-app/src/pages/department-list.tsx +183 -0
  121. package/tests/test-app/src/pages/description_of_mock_interface.md +32 -0
  122. package/tests/test-app/src/pages/digitalLargeScreen.css +181 -0
  123. package/tests/test-app/src/pages/digitalLargeScreen.tsx +1417 -0
  124. package/tests/test-app/src/pages/goods-list.tsx +233 -0
  125. package/tests/test-app/src/pages/housekeeping/adminDashboardPage.tsx +880 -0
  126. package/tests/test-app/src/pages/mobile_terminal/PersonalCenter.css +3 -0
  127. package/tests/test-app/src/pages/mobile_terminal/PersonalCenter.tsx +362 -0
  128. package/tests/test-app/src/pages/mobile_terminal/WorkOrderHomepage.tsx +337 -0
  129. package/tests/test-app/src/pages/mobile_terminal/newWorkOrder.tsx +224 -0
  130. package/tests/test-app/src/pages/mobile_terminal/tabbar.tsx +67 -0
  131. package/tests/test-app/src/pages/mobile_terminal/uiHandsOnPractice.tsx +638 -0
  132. package/tests/test-app/src/pages/mobile_terminal/workOrderDetails.tsx +346 -0
  133. package/tests/test-app/src/pages/mobile_terminal/workOrderPage.tsx +345 -0
  134. package/tests/test-app/src/pages/notice-list.tsx +217 -0
  135. package/tests/test-app/src/pages/order-detail.tsx +330 -0
  136. package/tests/test-app/src/pages/order-list.tsx +195 -0
  137. package/tests/test-app/src/pages/order-management.tsx +563 -0
  138. package/tests/test-app/src/pages/page/OrderList.tsx +230 -0
  139. package/tests/test-app/src/pages/role-list.tsx +184 -0
  140. package/tests/test-app/src/pages/simple/simplePage.tsx +92 -0
  141. package/tests/test-app/src/pages/simple-page.tsx +43 -0
  142. package/tests/test-app/src/pages/test-destructure.tsx +44 -0
  143. package/tests/test-app/src/pages/test-error-page.tsx +75 -0
  144. package/tests/test-app/src/pages/test-page-with-errors.tsx +51 -0
  145. package/tests/test-app/src/pages/test-page.tsx +101 -0
  146. package/tests/test-app/src/pages/test-render.tsx +52 -0
  147. package/tests/test-app/src/pages/test-return-type.tsx +41 -0
  148. package/tests/test-app/src/pages/test-type-assertion.tsx +37 -0
  149. package/tests/test-app/src/pages/testPage.css +3 -0
  150. package/tests/test-app/src/pages/testPage.tsx +158 -0
  151. package/tests/test-app/src/pages/ui/styleSelectorPage.tsx +1554 -0
  152. package/tests/test-app/src/pages/user-list.tsx +212 -0
  153. package/tests/test-app/src/pages/web_version/website.css +205 -0
  154. package/tests/test-app/src/pages/web_version/website.tsx +1066 -0
  155. package/tests/test-app/src/pages/wrong-page.tsx +50 -0
  156. package/tests/test-app/src/pages//345/276/205/345/212/236.apidoc.json +336 -0
  157. package/tests/test-app/src/project.json +1120 -0
  158. package/tests/test-app/src/store/global.store.ts +10 -0
  159. package/tests/test-app/src/types/CreateTicketParams.m.ts +20 -0
  160. package/tests/test-app/src/types/SLAPolicy.ts +50 -0
  161. package/tests/test-app/src/types/Ticket.ts +68 -0
  162. package/tests/test-app/src/types/TicketAttachment.m.ts +67 -0
  163. package/tests/test-app/src/types/TicketComment.m.ts +59 -0
  164. package/tests/test-app/src/types/TicketEvaluation.ts +44 -0
  165. package/tests/test-app/src/types/TicketHistory.m.ts +71 -0
  166. package/tests/test-app/src/types/TicketListParams.m.ts +30 -0
  167. package/tests/test-app/src/types/TicketPriority.m.ts +65 -0
  168. package/tests/test-app/src/types/TicketRecord.ts +47 -0
  169. package/tests/test-app/src/types/TrainDoor.ts +284 -0
  170. package/tests/test-app/src/types/UpdateTicketParams.m.ts +22 -0
  171. package/tests/test-app/src/utils/__afterRequest.util.ts +3 -0
  172. package/tests/test-app/src/utils/__beforeRequest.util.ts +10 -0
  173. package/tests/test-app/src/utils/testGlobalAction.util.ts +7 -0
@@ -0,0 +1,212 @@
1
+ /**
2
+ * 用户列表
3
+ * 查看和管理所有用户信息
4
+ *
5
+ * @type Page
6
+ * @route /users
7
+ * @screen 1920w
8
+ * @frames web
9
+ */
10
+ import React from 'react';
11
+
12
+
13
+
14
+ class IProps {}
15
+
16
+ /*
17
+ * 数据与接口请求定义
18
+ */
19
+ class IState {
20
+ users?: {
21
+ /* @example 1 */id?: number,
22
+ /* @example 张三 */name?: string,
23
+ /* @example zhangsan@example.com */email?: string,
24
+ /* @example 138****1234 */phone?: string,
25
+ /* @example active */status?: string,
26
+ /* @example admin */role?: string,
27
+ /* @example 2024-01-15 */createTime?: string,
28
+ }[];
29
+ loading?: boolean;
30
+ searchKeyword?: string;
31
+ }
32
+
33
+ class Document extends React.Component<IProps, IState> {
34
+ state = {
35
+ users: [
36
+ {
37
+ id: 1,
38
+ name: '张三',
39
+ email: 'zhangsan@example.com',
40
+ phone: '138****1234',
41
+ status: 'active',
42
+ role: 'admin',
43
+ createTime: '2024-01-15',
44
+ },
45
+ {
46
+ id: 2,
47
+ name: '李四',
48
+ email: 'lisi@example.com',
49
+ phone: '139****5678',
50
+ status: 'active',
51
+ role: 'user',
52
+ createTime: '2024-02-20',
53
+ },
54
+ {
55
+ id: 3,
56
+ name: '王五',
57
+ email: 'wangwu@example.com',
58
+ phone: '137****9012',
59
+ status: 'inactive',
60
+ role: 'user',
61
+ createTime: '2024-03-10',
62
+ },
63
+ {
64
+ id: 4,
65
+ name: '赵六',
66
+ email: 'zhaoliu@example.com',
67
+ phone: '136****3456',
68
+ status: 'active',
69
+ role: 'user',
70
+ createTime: '2024-04-05',
71
+ },
72
+ {
73
+ id: 5,
74
+ name: '钱七',
75
+ email: 'qianqi@example.com',
76
+ phone: '135****7890',
77
+ status: 'active',
78
+ role: 'manager',
79
+ createTime: '2024-05-12',
80
+ },
81
+ ],
82
+ loading: false,
83
+ searchKeyword: '',
84
+ };
85
+
86
+ handleSearch(value) {
87
+ this.setState({
88
+ searchKeyword: value,
89
+ });
90
+ }
91
+
92
+ handleAdd() {
93
+ console.log('添加用户');
94
+ }
95
+
96
+ handleEdit(record) {
97
+ console.log('编辑用户', record);
98
+ }
99
+
100
+ handleDelete(record) {
101
+ console.log('删除用户', record);
102
+ }
103
+
104
+ getStatusTag(status) {
105
+ if (status === 'active') {
106
+ return <Tag color="green">活跃</Tag>;
107
+ }
108
+ return <Tag color="gray">禁用</Tag>;
109
+ }
110
+
111
+ getRoleTag(role) {
112
+ const config = {
113
+ admin: {
114
+ text: '管理员',
115
+ color: 'red',
116
+ },
117
+ manager: {
118
+ text: '经理',
119
+ color: 'blue',
120
+ },
121
+ user: {
122
+ text: '用户',
123
+ color: 'default',
124
+ },
125
+ };
126
+ const configItem = config[role] || config.user;
127
+ return <Tag color={configItem.color}>{configItem.text}</Tag>;
128
+ }
129
+
130
+ render() {
131
+ return (
132
+ <Page className="p-[24px] bg-[var(--gray-50)] min-h-screen">
133
+ <View className="mb-[24px]">
134
+ <h1 className="text-2xl font-bold text-[#1f2937]">用户列表</h1>
135
+ <p className="text-[#6b7280] text-sm mt-[4px]">
136
+ 管理系统中的所有用户
137
+ </p>
138
+ </View>
139
+ <Card className="mb-[24px]">
140
+ <View className="flex items-center justify-between">
141
+ <Input
142
+ placeholder="搜索用户名/邮箱/手机号"
143
+ value={this.state.searchKeyword}
144
+ onChange={e => this.handleSearch(e.target.value)}
145
+ prefix="🔍"
146
+ className=""
147
+ />
148
+ <Button type="primary" onClick={() => this.handleAdd()}>
149
+ + 新增用户
150
+ </Button>
151
+ </View>
152
+ </Card>
153
+ <Card>
154
+ <Table
155
+ loading={this.state.loading}
156
+ columns={[
157
+ { title: 'ID', dataIndex: 'id', key: 'id', width: 80 },
158
+ { title: '用户名', dataIndex: 'name', key: 'name' },
159
+ { title: '邮箱', dataIndex: 'email', key: 'email' },
160
+ { title: '手机号', dataIndex: 'phone', key: 'phone' },
161
+ {
162
+ title: '状态',
163
+ dataIndex: 'status',
164
+ key: 'status',
165
+ render: function (text) {
166
+ return this.getStatusTag(text);
167
+ },
168
+ },
169
+ {
170
+ title: '角色',
171
+ dataIndex: 'role',
172
+ key: 'role',
173
+ render: function (text) {
174
+ return this.getRoleTag(text);
175
+ },
176
+ },
177
+ { title: '创建时间', dataIndex: 'createTime', key: 'createTime' },
178
+ {
179
+ title: '操作',
180
+ key: 'action',
181
+ render: (text, record) => (
182
+ <Space>
183
+ <Button type="link" onClick={() => this.handleEdit(record)}>
184
+ 编辑
185
+ </Button>
186
+ <Button
187
+ type="link"
188
+ danger={true}
189
+ onClick={() => this.handleDelete(record)}
190
+ >
191
+ 删除
192
+ </Button>
193
+ </Space>
194
+ ),
195
+ },
196
+ ]}
197
+ dataSource={this.state.users}
198
+ rowKey="id"
199
+ pagination={{
200
+ pageSize: 10,
201
+ showTotal: function (total) {
202
+ return `共 ${total} 条`;
203
+ },
204
+ }}
205
+ />
206
+ </Card>
207
+ </Page>
208
+ );
209
+ }
210
+ }
211
+
212
+ export default Document;
@@ -0,0 +1,205 @@
1
+ .container {
2
+ max-width: 1200px;
3
+ margin: 0 auto;
4
+ padding: 0 16px;
5
+ }
6
+ .nav {
7
+ backdrop-filter: blur(10px);
8
+ -webkit-backdrop-filter: blur(10px);
9
+ }
10
+ .btn-primary {
11
+ background: linear-gradient(135deg, #E74C3C, #c0392b);
12
+ border: none;
13
+ color: white;
14
+ padding: 12px 32px;
15
+ border-radius: 50px;
16
+ font-weight: 600;
17
+ transition: all 0.3s ease;
18
+ cursor: pointer;
19
+ }
20
+ .btn-primary:hover {
21
+ transform: translateY(-2px);
22
+ box-shadow: 0 10px 20px rgba(231, 76, 60, 0.3);
23
+ }
24
+ .btn-secondary {
25
+ background: transparent;
26
+ border: 2px solid white;
27
+ color: white;
28
+ padding: 12px 32px;
29
+ border-radius: 50px;
30
+ font-weight: 600;
31
+ transition: all 0.3s ease;
32
+ cursor: pointer;
33
+ }
34
+ .btn-secondary:hover {
35
+ background: white;
36
+ color: #1A3E72;
37
+ }
38
+ .card {
39
+ background: white;
40
+ border-radius: 16px;
41
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
42
+ transition: all 0.3s ease;
43
+ overflow: hidden;
44
+ }
45
+ .card:hover {
46
+ transform: translateY(-8px);
47
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
48
+ }
49
+ .gradient-text {
50
+ background: linear-gradient(135deg, #1A3E72, #E74C3C);
51
+ -webkit-background-clip: text;
52
+ -webkit-text-fill-color: transparent;
53
+ background-clip: text;
54
+ }
55
+ @keyframes fadeInUp {
56
+ from {
57
+ opacity: 0;
58
+ transform: translateY(30px);
59
+ }
60
+ to {
61
+ opacity: 1;
62
+ transform: translateY(0);
63
+ }
64
+ }
65
+ .fade-in-up {
66
+ animation: fadeInUp 0.6s ease-out;
67
+ }
68
+ @media (max-width: 768px) {
69
+ .container {
70
+ padding: 0 12px;
71
+ }
72
+ . h1 {
73
+ font-size: 2.5rem !important;
74
+ }
75
+ . h2 {
76
+ font-size: 2rem !important;
77
+ }
78
+ .btn-primary,
79
+ .btn-secondary {
80
+ padding: 10px 24px;
81
+ font-size: 14px;
82
+ }
83
+ }
84
+ ::-webkit-scrollbar {
85
+ width: 8px;
86
+ }
87
+ ::-webkit-scrollbar-track {
88
+ background: #f1f1f1;
89
+ }
90
+ ::-webkit-scrollbar-thumb {
91
+ background: #1A3E72;
92
+ border-radius: 4px;
93
+ }
94
+ ::-webkit-scrollbar-thumb:hover {
95
+ background: #E74C3C;
96
+ }
97
+ @keyframes pulse {
98
+ 0%, 100% {
99
+ opacity: 1;
100
+ }
101
+ 50% {
102
+ opacity: 0.5;
103
+ }
104
+ }
105
+ .animate-pulse {
106
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
107
+ }
108
+ .bg-pattern {
109
+ background-image: radial-gradient(circle at 25% 25%, rgba(231, 76, 60, 0.1) 0%, transparent 50%),
110
+ radial-gradient(circle at 75% 75%, rgba(26, 62, 114, 0.1) 0%, transparent 50%);
111
+ }
112
+ .form-input {
113
+ width: 100%;
114
+ padding: 12px 16px;
115
+ border: 1px solid #d1d5db;
116
+ border-radius: 8px;
117
+ font-size: 16px;
118
+ transition: border-color 0.3s ease;
119
+ }
120
+ .form-input:focus {
121
+ outline: none;
122
+ border-color: #1A3E72;
123
+ box-shadow: 0 0 0 3px rgba(26, 62, 114, 0.1);
124
+ }
125
+ .icon-wrapper {
126
+ display: inline-flex;
127
+ align-items: center;
128
+ justify-content: center;
129
+ width: 48px;
130
+ height: 48px;
131
+ border-radius: 50%;
132
+ background: rgba(26, 62, 114, 0.1);
133
+ color: #1A3E72;
134
+ font-size: 20px;
135
+ }
136
+ .counter {
137
+ font-size: 3rem;
138
+ font-weight: bold;
139
+ color: #F39C12;
140
+ line-height: 1;
141
+ }
142
+ .team-card {
143
+ position: relative;
144
+ overflow: hidden;
145
+ }
146
+ .team-card::before {
147
+ content: '';
148
+ position: absolute;
149
+ top: 0;
150
+ left: 0;
151
+ right: 0;
152
+ height: 4px;
153
+ background: linear-gradient(90deg, #1A3E72, #E74C3C, #F39C12);
154
+ }
155
+ .client-logo {
156
+ filter: grayscale(100%);
157
+ transition: filter 0.3s ease;
158
+ }
159
+ .client-logo:hover {
160
+ filter: grayscale(0%);
161
+ }
162
+ .testimonial-card {
163
+ position: relative;
164
+ background: white;
165
+ border-radius: 16px;
166
+ padding: 32px;
167
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
168
+ }
169
+ .testimonial-card::before {
170
+ content: '"';
171
+ position: absolute;
172
+ top: 16px;
173
+ right: 16px;
174
+ font-size: 4rem;
175
+ color: #e5e7eb;
176
+ font-family: serif;
177
+ }
178
+ .footer {
179
+ background: #2C3E50;
180
+ color: white;
181
+ }
182
+ .footer a {
183
+ color: #d1d5db;
184
+ text-decoration: none;
185
+ transition: color 0.3s ease;
186
+ }
187
+ .footer a:hover {
188
+ color: white;
189
+ }
190
+ .social-icon {
191
+ display: inline-flex;
192
+ align-items: center;
193
+ justify-content: center;
194
+ width: 40px;
195
+ height: 40px;
196
+ border-radius: 50%;
197
+ background: rgba(255, 255, 255, 0.1);
198
+ color: #d1d5db;
199
+ transition: all 0.3s ease;
200
+ }
201
+ .social-icon:hover {
202
+ background: rgba(255, 255, 255, 0.2);
203
+ color: white;
204
+ transform: translateY(-2px);
205
+ }