baba521 commited on
Commit
037085a
·
1 Parent(s): f71610e
Files changed (4) hide show
  1. css/components.css +437 -0
  2. css/layout.css +566 -0
  3. css/main.css +249 -0
  4. globals.py +1 -0
css/components.css ADDED
@@ -0,0 +1,437 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* 组件样式 */
2
+
3
+ /* 消息提示样式 */
4
+ #ant-message-container {
5
+ position: fixed;
6
+ top: 20px;
7
+ left: 50%;
8
+ transform: translateX(-50%);
9
+ z-index: 9999;
10
+ width: fit-content;
11
+ max-width: 80%;
12
+ }
13
+
14
+ .ant-message {
15
+ background: #fff2f0;
16
+ border: 1px solid #ffccc7;
17
+ border-radius: 4px;
18
+ padding: 10px 16px;
19
+ margin-bottom: 10px;
20
+ box-shadow: 0 4px 12px rgba(0,0,0,0.15);
21
+ display: flex;
22
+ align-items: center;
23
+ animation: antMessageFadeIn 0.3s ease-in-out;
24
+ font-size: 14px;
25
+ line-height: 1.5;
26
+ }
27
+
28
+ .ant-message-success {
29
+ background: #f6ffed;
30
+ border-color: #b7eb8f;
31
+ }
32
+
33
+ .ant-message-warning {
34
+ background: #fffbe6;
35
+ border-color: #ffe58f;
36
+ }
37
+
38
+ .ant-message-info {
39
+ background: #e6f7ff;
40
+ border-color: #91d5ff;
41
+ }
42
+
43
+ .ant-message-error {
44
+ background: #fff2f0;
45
+ border-color: #ffccc7;
46
+ }
47
+
48
+ .ant-message-icon {
49
+ margin-right: 8px;
50
+ font-weight: bold;
51
+ font-size: 16px;
52
+ }
53
+
54
+ .ant-message-success .ant-message-icon {
55
+ color: #52c41a;
56
+ }
57
+
58
+ .ant-message-warning .ant-message-icon {
59
+ color: #faad14;
60
+ }
61
+
62
+ .ant-message-info .ant-message-icon {
63
+ color: #1890ff;
64
+ }
65
+
66
+ .ant-message-error .ant-message-icon {
67
+ color: #ff4d4f;
68
+ }
69
+
70
+ @keyframes antMessageFadeIn {
71
+ from { opacity: 0; transform: translateY(-100%); }
72
+ to { opacity: 1; transform: translateY(0); }
73
+ }
74
+
75
+ @keyframes antMessageFadeOut {
76
+ from { opacity: 1; transform: translateY(0); }
77
+ to { opacity: 0; transform: translateY(-100%); }
78
+ }
79
+
80
+ /* 按钮样式 */
81
+ .btn-primary {
82
+ background-color: #2563eb;
83
+ color: white;
84
+ font-weight: 600;
85
+ padding: 0.5rem 1rem;
86
+ border-radius: 0.5rem;
87
+ border: none;
88
+ cursor: pointer;
89
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1);
90
+ }
91
+
92
+ .btn-primary:hover {
93
+ background-color: #1d4ed8;
94
+ }
95
+
96
+ .btn-secondary {
97
+ background-color: #e5e7eb;
98
+ color: #374151;
99
+ font-weight: 500;
100
+ padding: 0.5rem 1rem;
101
+ border-radius: 0.5rem;
102
+ border: 1px solid #d1d5db;
103
+ cursor: pointer;
104
+ transition: background-color 150ms cubic-bezier(0.4, 0, 0.2, 1);
105
+ }
106
+
107
+ .btn-secondary:hover {
108
+ background-color: #f3f4f6;
109
+ }
110
+
111
+ /* 输入框样式 */
112
+ .input-field {
113
+ flex: 1;
114
+ background-color: transparent;
115
+ padding: 0.5rem 0.5rem;
116
+ outline: none;
117
+ }
118
+
119
+ .input-container {
120
+ display: flex;
121
+ align-items: center;
122
+ border: 1px solid #d1d5db;
123
+ border-radius: 0.25rem;
124
+ /* padding: 0.25rem 0.5rem; */
125
+ background-color: #f3f4f6;
126
+ margin-top: 10px;
127
+ }
128
+
129
+ .input-container:focus-within {
130
+ border-color: #3b82f6;
131
+ }
132
+
133
+ .company-list-container {
134
+ padding: 0 !important;
135
+ margin: 0 !important;
136
+ border: 0 !important;
137
+ border-radius: unset !important;
138
+ border-color: unset !important;
139
+ }
140
+
141
+ .company-item {
142
+ padding: 8px 10px !important;
143
+ margin-top: 6px !important;
144
+ font-size: 16px !important;
145
+ background-color: unset !important;
146
+ cursor: pointer;
147
+ }
148
+
149
+ .company-item:hover {
150
+ background-color: #466bb5 !important;
151
+ }
152
+
153
+ /* .selected-company 样式已移至app.py中的custom_css */
154
+
155
+ /* 卡片样式 */
156
+ .card {
157
+ background-color: white;
158
+ border: 1px solid #d1d5db;
159
+ border-radius: 0.5rem;
160
+ /* padding: 1rem; */
161
+ }
162
+
163
+ .card-title {
164
+ font-weight: 500;
165
+ color: #111827;
166
+ /* margin: 0 0 0.75rem 0; */
167
+ padding: 5px 7px;
168
+ }
169
+
170
+ /* 表格样式 */
171
+ .data-table {
172
+ width: 100%;
173
+ font-size: 0.875rem;
174
+ }
175
+
176
+ .data-table th {
177
+ text-align: left;
178
+ padding: 0.5rem 0;
179
+ color: #6b7280;
180
+ border-bottom: 1px solid #e5e7eb;
181
+ }
182
+
183
+ .data-table td {
184
+ padding: 0.5rem 0;
185
+ border-bottom: 1px solid #e5e7eb;
186
+ }
187
+
188
+ .data-table tr:last-child td {
189
+ border-bottom: none;
190
+ }
191
+
192
+ .text-right {
193
+ text-align: right;
194
+ }
195
+
196
+ .text-green {
197
+ color: #16a34a;
198
+ }
199
+
200
+ .text-red {
201
+ color: #dc2626;
202
+ }
203
+
204
+ /* 进度条样式 */
205
+ .progress-container {
206
+ width: 100%;
207
+ background-color: #e5e7eb;
208
+ border-radius: 0.5rem;
209
+ height: 0.5rem;
210
+ margin-top: 0.25rem;
211
+ }
212
+
213
+ .progress-bar {
214
+ height: 100%;
215
+ border-radius: 0.5rem;
216
+ }
217
+
218
+ .progress-bar.blue {
219
+ background-color: #3b82f6;
220
+ }
221
+
222
+ .progress-bar.green {
223
+ background-color: #22c55e;
224
+ }
225
+
226
+ .progress-bar.purple {
227
+ background-color: #a855f7;
228
+ }
229
+
230
+ .progress-bar.red {
231
+ background-color: #ef4444;
232
+ }
233
+
234
+ /* PDF预览样式 */
235
+ .pdf-preview {
236
+ border: 1px solid #d1d5db;
237
+ border-radius: 0.5rem;
238
+ overflow: hidden;
239
+ }
240
+
241
+ .pdf-header {
242
+ display: flex;
243
+ align-items: center;
244
+ gap: 0.25rem;
245
+ padding: 0.5rem;
246
+ border-bottom: 1px solid #d1d5db;
247
+ font-size: 0.875rem;
248
+ }
249
+
250
+ .pdf-pages {
251
+ display: flex;
252
+ padding: 0.5rem;
253
+ }
254
+
255
+ .pdf-page {
256
+ height: 6rem;
257
+ border: 1px solid #d1d5db;
258
+ border-radius: 0.25rem;
259
+ cursor: pointer;
260
+ margin-right: 0.5rem;
261
+ }
262
+
263
+ .pdf-page:hover {
264
+ border-color: #93c5fd;
265
+ }
266
+
267
+ .pdf-page.active {
268
+ border-color: #93c5fd;
269
+ border-width: 2px;
270
+ }
271
+
272
+ .pdf-viewer {
273
+ height: 100%;
274
+ border: 1px solid #e5e7eb;
275
+ background-color: #f3f4f6;
276
+ display: flex;
277
+ align-items: center;
278
+ justify-content: center;
279
+ }
280
+
281
+ .pdf-footer {
282
+ padding: 0.5rem;
283
+ background-color: #f3f4f6;
284
+ display: flex;
285
+ align-items: center;
286
+ justify-content: space-between;
287
+ font-size: 0.875rem;
288
+ color: #6b7280;
289
+ margin-top: 0 !important;
290
+ }
291
+
292
+ /* 图标按钮 */
293
+ .icon-button {
294
+ cursor: pointer;
295
+ padding: 0.25rem;
296
+ border-radius: 0.25rem;
297
+ }
298
+
299
+ .icon-button:hover {
300
+ background-color: #f3f4f6;
301
+ color: #2563eb;
302
+ }
303
+
304
+ .custom-add-input {
305
+ position: relative;
306
+ padding-left: 32px !important;
307
+ }
308
+
309
+ .custom-add-input textarea::before {
310
+ content: "+";
311
+ position: absolute;
312
+ left: 8px;
313
+ top: 50%;
314
+ transform: translateY(-50%);
315
+ color: #007bff;
316
+ font-weight: bold;
317
+ font-size: 16px;
318
+ }
319
+
320
+ .report-list-box {
321
+ height: 300px;
322
+ display: unset !important;
323
+ overflow-y: auto !important;
324
+ }
325
+ .report-item-content {
326
+ display: flex;
327
+ align-items: center;
328
+ justify-content: space-between;
329
+ }
330
+ .report-item {
331
+ height: fit-content;
332
+ padding: 4px 6px;
333
+ }
334
+ .report-item-content span:hover {
335
+ color: #e1853e !important;
336
+ }
337
+
338
+ .metric-card-item-current-ratio {
339
+ height: 109px !important;
340
+ padding-top: 15px !important;
341
+ }
342
+ .metric-card-item-current-ratio .slider_input_container {
343
+ padding-top: 15px !important;
344
+ }
345
+ .chat-content-box {
346
+ height: 500px !important;
347
+ overflow-y: auto !important;
348
+ }
349
+ /* .chat-content-box .message-wrap {
350
+ height: 400px !important;
351
+ } */
352
+ .company-input-box {
353
+ width: 100% !important;
354
+ }
355
+ .company-input-box label {
356
+ width: 100% !important;
357
+ min-width: 100% !important;
358
+ }
359
+ .company-input-box div {
360
+ width: 100% !important;
361
+ }
362
+ .company-input-box textarea {
363
+ width: 100% !important;
364
+ }
365
+ .left-card-title {
366
+ background: #fff !important;
367
+ }
368
+
369
+ .home-company-list {
370
+ width: 100%;
371
+ padding: 10px;
372
+ background: #f9fafb !important;
373
+ }
374
+
375
+ .home-company-item-box {
376
+ display: flex;
377
+ justify-content: space-between;
378
+ align-items: center;
379
+ padding: 10px 0;
380
+ gap: 10px;
381
+ }
382
+
383
+ /* 单个元素时居中对齐 */
384
+ .home-company-item-box.single-item {
385
+ justify-content: center;
386
+ }
387
+
388
+ .home-company-item {
389
+ border: 2px solid rgb(217 217 217);
390
+ padding: 8px 12px;
391
+ border-radius: 8px;
392
+ font-size: 16px;
393
+ flex: 1;
394
+ min-width: 0;
395
+ color: rgb(142 143 143);
396
+ white-space: nowrap;
397
+ overflow: hidden;
398
+ text-overflow: ellipsis;
399
+ text-align: center;
400
+ cursor: pointer;
401
+ transition: all 0.2s ease;
402
+ }
403
+
404
+ .home-company-item:hover {
405
+ background-color: #e5e7eb;
406
+ border-color: rgb(156 163 175);
407
+ color: rgb(55 65 81);
408
+ transform: translateY(-1px);
409
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
410
+ }
411
+
412
+ .news-list-box .news-item {
413
+ padding: 5px;
414
+ }
415
+ .news-list-box .news-item-content span:hover {
416
+ color: rgb(225, 133, 62) !important
417
+ }
418
+ .invest-suggest-md-box, .analysis-report-md-box {
419
+ padding: 10px 20px !important;
420
+ /* border-left: 1px solid #d0d5dc !important; */
421
+ }
422
+ .metric-card-col-left {
423
+ max-width: 250px !important;
424
+ height: 300px !important;
425
+ }
426
+ .metric-card-col-middle {
427
+ max-width: 450px !important;
428
+ height: 300px !important;
429
+ }
430
+ .metric-card-col-right {
431
+ max-width: 600px !important;
432
+ height: 300px !important;
433
+ }
434
+
435
+ [class*="generating"] {
436
+ display: none !important;
437
+ }
css/layout.css ADDED
@@ -0,0 +1,566 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* 布局样式 */
2
+
3
+ /* 网格布局 */
4
+ .grid-cols-2 {
5
+ display: grid;
6
+ grid-template-columns: repeat(2, minmax(0, 1fr));
7
+ gap: 1.5rem;
8
+ }
9
+
10
+ .grid-cols-3 {
11
+ display: grid;
12
+ grid-template-columns: repeat(3, minmax(0, 1fr));
13
+ gap: 1.5rem;
14
+ }
15
+
16
+ .grid-cols-4 {
17
+ display: grid;
18
+ grid-template-columns: repeat(4, minmax(0, 1fr));
19
+ gap: 1rem;
20
+ }
21
+
22
+ /* Flex布局 */
23
+ .flex {
24
+ display: flex;
25
+ }
26
+
27
+ .flex-col {
28
+ flex-direction: column;
29
+ }
30
+
31
+ .flex-1 {
32
+ flex: 1 1 0%;
33
+ }
34
+
35
+ .flex-row {
36
+ flex-direction: row;
37
+ }
38
+
39
+ .items-start {
40
+ align-items: flex-start;
41
+ }
42
+
43
+ .items-center {
44
+ align-items: center;
45
+ }
46
+
47
+ .justify-center {
48
+ justify-content: center;
49
+ }
50
+
51
+ .justify-between {
52
+ justify-content: space-between;
53
+ }
54
+
55
+ .gap-1 {
56
+ gap: 0.25rem;
57
+ }
58
+
59
+ .gap-2 {
60
+ gap: 0.5rem;
61
+ }
62
+
63
+ .gap-4 {
64
+ gap: 1rem;
65
+ }
66
+
67
+ .gap-6 {
68
+ gap: 1.5rem;
69
+ }
70
+
71
+ /* 间距 */
72
+ .mt-1 {
73
+ margin-top: 0.25rem;
74
+ }
75
+
76
+ .mt-2 {
77
+ margin-top: 0.5rem;
78
+ }
79
+
80
+ .mt-3 {
81
+ margin-top: 0.75rem;
82
+ }
83
+
84
+ .mt-4 {
85
+ margin-top: 1rem;
86
+ }
87
+
88
+ .mb-1 {
89
+ margin-bottom: 0.25rem;
90
+ }
91
+
92
+ .mb-3 {
93
+ margin-bottom: 0.75rem;
94
+ }
95
+
96
+ .mb-6 {
97
+ margin-bottom: 1.5rem;
98
+ }
99
+
100
+ .ml-auto {
101
+ margin-left: auto;
102
+ }
103
+
104
+ .p-2 {
105
+ padding: 0.5rem;
106
+ }
107
+
108
+ .p-3 {
109
+ padding: 0.75rem;
110
+ }
111
+
112
+ .p-4 {
113
+ padding: 1rem;
114
+ }
115
+
116
+ .p-5 {
117
+ padding: 1.25rem;
118
+ }
119
+
120
+ .p-6 {
121
+ padding: 1.5rem;
122
+ }
123
+
124
+ .px-2 {
125
+ padding-left: 0.5rem;
126
+ padding-right: 0.5rem;
127
+ }
128
+
129
+ .px-3 {
130
+ padding-left: 0.75rem;
131
+ padding-right: 0.75rem;
132
+ }
133
+
134
+ .px-4 {
135
+ padding-left: 1rem;
136
+ padding-right: 1rem;
137
+ }
138
+
139
+ .px-5 {
140
+ padding-left: 1.25rem;
141
+ padding-right: 1.25rem;
142
+ }
143
+
144
+ .py-1 {
145
+ padding-top: 0.25rem;
146
+ padding-bottom: 0.25rem;
147
+ }
148
+
149
+ .py-2 {
150
+ padding-top: 0.5rem;
151
+ padding-bottom: 0.5rem;
152
+ }
153
+
154
+ .py-3 {
155
+ padding-top: 0.75rem;
156
+ padding-bottom: 0.75rem;
157
+ }
158
+
159
+ .py-4 {
160
+ padding-top: 1rem;
161
+ padding-bottom: 1rem;
162
+ }
163
+
164
+ .pt-2 {
165
+ padding-top: 0.5rem;
166
+ }
167
+
168
+ .pt-3 {
169
+ padding-top: 0.75rem;
170
+ }
171
+
172
+ .pb-2 {
173
+ padding-bottom: 0.5rem;
174
+ }
175
+
176
+ /* 尺寸 */
177
+ .h-full {
178
+ height: 100%;
179
+ }
180
+
181
+ .h-24 {
182
+ height: 6rem;
183
+ }
184
+
185
+ .h-32 {
186
+ height: 8rem;
187
+ }
188
+
189
+ .h-56 {
190
+ height: 14rem;
191
+ }
192
+
193
+ .h-60 {
194
+ height: 15rem;
195
+ }
196
+
197
+ .h-72 {
198
+ height: 18rem;
199
+ }
200
+
201
+ .w-full {
202
+ width: 100%;
203
+ }
204
+
205
+ .w-1\/4 {
206
+ width: 25%;
207
+ }
208
+
209
+ .w-3\/4 {
210
+ width: 75%;
211
+ }
212
+
213
+ .w-2\/5 {
214
+ width: 40%;
215
+ }
216
+
217
+ .w-3\/5 {
218
+ width: 60%;
219
+ }
220
+
221
+ .min-h-screen {
222
+ min-height: 100vh;
223
+ }
224
+
225
+ .min-h-0 {
226
+ min-height: 0px;
227
+ }
228
+
229
+ .min-h-\[250px\] {
230
+ min-height: 250px;
231
+ }
232
+
233
+ .min-h-\[90vh\] {
234
+ min-height: 90vh;
235
+ }
236
+
237
+ /* 文本对齐 */
238
+ .text-left {
239
+ text-align: left;
240
+ }
241
+
242
+ .text-right {
243
+ text-align: right;
244
+ }
245
+
246
+ /* 边框 */
247
+ .border {
248
+ border-width: 1px;
249
+ }
250
+
251
+ .border-2 {
252
+ border-width: 2px;
253
+ }
254
+
255
+ .border-t {
256
+ border-top-width: 1px;
257
+ }
258
+
259
+ .border-b {
260
+ border-bottom-width: 1px;
261
+ }
262
+
263
+ .border-b-2 {
264
+ border-bottom-width: 2px;
265
+ }
266
+
267
+ .border-r {
268
+ border-right-width: 1px;
269
+ }
270
+
271
+ .border-l {
272
+ border-left-width: 1px;
273
+ }
274
+
275
+ .border-gray-200 {
276
+ border-color: #e5e7eb;
277
+ }
278
+
279
+ .border-gray-300 {
280
+ border-color: #d1d5db;
281
+ }
282
+
283
+ .border-blue-400 {
284
+ border-color: #60a5fa;
285
+ }
286
+
287
+ .border-blue-600 {
288
+ border-color: #2563eb;
289
+ }
290
+
291
+ /* 圆角 */
292
+ .rounded {
293
+ border-radius: 0.25rem;
294
+ }
295
+
296
+ .rounded-lg {
297
+ border-radius: 0.5rem;
298
+ }
299
+
300
+ .rounded-xl {
301
+ border-radius: 0.75rem;
302
+ }
303
+
304
+ .rounded-2xl {
305
+ border-radius: 1rem;
306
+ }
307
+
308
+ .rounded-full {
309
+ border-radius: 9999px;
310
+ }
311
+
312
+ .rounded-tl-none {
313
+ border-top-left-radius: 0px;
314
+ }
315
+
316
+ .rounded-tr-none {
317
+ border-top-right-radius: 0px;
318
+ }
319
+
320
+ /* 阴影 */
321
+ .shadow {
322
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);
323
+ }
324
+
325
+ .shadow-xl {
326
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
327
+ }
328
+
329
+ .shadow-inner {
330
+ box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.05);
331
+ }
332
+
333
+ /* 溢出 */
334
+ .overflow-hidden {
335
+ overflow: hidden;
336
+ }
337
+
338
+ .overflow-x-auto {
339
+ overflow-x: auto;
340
+ }
341
+
342
+ .overflow-y-auto {
343
+ overflow-y: auto;
344
+ }
345
+
346
+ /* 光标 */
347
+ .cursor-pointer {
348
+ cursor: pointer;
349
+ }
350
+
351
+ /* 文本大小 */
352
+ .text-xs {
353
+ font-size: 0.75rem;
354
+ line-height: 1rem;
355
+ }
356
+
357
+ .text-sm {
358
+ font-size: 0.875rem;
359
+ line-height: 1.25rem;
360
+ }
361
+ .text-sm-top-time {
362
+ font-size: 0.875rem;
363
+ line-height: 1.25rem;
364
+ text-align: end;
365
+
366
+ }
367
+ .text-sm-top-time p {
368
+ color: #fff !important;
369
+ }
370
+
371
+ .text-base {
372
+ font-size: 1rem;
373
+ line-height: 1.5rem;
374
+ }
375
+
376
+ .text-xl {
377
+ font-size: 1.25rem;
378
+ line-height: 1.75rem;
379
+ }
380
+
381
+ .text-2xl {
382
+ font-size: 1.5rem;
383
+ line-height: 2rem;
384
+ }
385
+
386
+ /* 文本粗细 */
387
+ .font-medium {
388
+ font-weight: 500;
389
+ }
390
+
391
+ .font-semibold {
392
+ font-weight: 600;
393
+ }
394
+
395
+ .font-bold {
396
+ font-weight: 700;
397
+ }
398
+
399
+ /* 文本颜色 */
400
+ .text-white {
401
+ color: #ffffff;
402
+ }
403
+
404
+ .text-gray-500 {
405
+ color: #6b7280;
406
+ }
407
+
408
+ .text-gray-600 {
409
+ color: #4b5563;
410
+ }
411
+
412
+ .text-gray-700 {
413
+ color: #374151;
414
+ }
415
+
416
+ .text-gray-900 {
417
+ color: #111827;
418
+ }
419
+
420
+ .text-blue-500 {
421
+ color: #3b82f6;
422
+ }
423
+
424
+ .text-blue-600 {
425
+ color: #2563eb;
426
+ }
427
+
428
+ .text-blue-700 {
429
+ color: #1d4ed8;
430
+ }
431
+
432
+ .text-green-500 {
433
+ color: #22c55e;
434
+ }
435
+
436
+ .text-green-600 {
437
+ color: #16a34a;
438
+ }
439
+
440
+ .text-red-500 {
441
+ color: #ef4444;
442
+ }
443
+
444
+ .text-red-600 {
445
+ color: #dc2626;
446
+ }
447
+
448
+ .text-purple-500 {
449
+ color: #a855f7;
450
+ }
451
+
452
+ /* 背景颜色 */
453
+ .bg-white {
454
+ background-color: #ffffff;
455
+ }
456
+ .bg-white .wrap label {
457
+ border: unset !important;
458
+ border-color: unset !important;
459
+ }
460
+
461
+ .bg-gray-50 {
462
+ background-color: #f9fafb;
463
+ }
464
+
465
+ .bg-gray-100 {
466
+ background-color: #f3f4f6;
467
+ }
468
+
469
+ .bg-gray-200 {
470
+ background-color: #e5e7eb;
471
+ }
472
+
473
+ .bg-blue-50 {
474
+ background-color: #eff6ff;
475
+ }
476
+
477
+ .bg-blue-500 {
478
+ background-color: #3b82f6;
479
+ }
480
+
481
+ .bg-blue-600 {
482
+ background-color: #2563eb;
483
+ }
484
+
485
+ .bg-green-500 {
486
+ background-color: #22c55e;
487
+ }
488
+
489
+ .bg-purple-500 {
490
+ background-color: #a855f7;
491
+ }
492
+
493
+ .bg-red-500 {
494
+ background-color: #ef4444;
495
+ }
496
+
497
+ .bg-gradient-to-r {
498
+ background-image: linear-gradient(to right, var(--tw-gradient-stops));
499
+ }
500
+
501
+ .from-blue-600 {
502
+ --tw-gradient-from: #2563eb;
503
+ --tw-gradient-to: rgba(37, 99, 235, 0);
504
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
505
+ }
506
+
507
+ .to-blue-800 {
508
+ --tw-gradient-to: #1e40af;
509
+ }
510
+
511
+ /* 对象适应 */
512
+ .object-contain {
513
+ object-fit: contain;
514
+ }
515
+
516
+ /* 最小宽度 */
517
+ .min-w-0 {
518
+ min-width: 0px;
519
+ }
520
+
521
+ /* 最大宽度 */
522
+ .max-w-\[85\%\] {
523
+ max-width: 85%;
524
+ }
525
+
526
+ /* .gradio-container-5-49-1 {
527
+ -webkit-text-size-adjust: 100%;
528
+ line-height: 1.5;
529
+ font-family:unset !important;
530
+ -moz-tab-size: 4;
531
+ tab-size: 4
532
+ } */
533
+
534
+ /* [class^="gradio-container-"] {
535
+ -webkit-text-size-adjust: 100%;
536
+ line-height: 1.5;
537
+ font-family: unset !important;
538
+ -moz-tab-size: 4;
539
+ tab-size: 4;
540
+ } */
541
+
542
+ main {
543
+ /* min-width: 1440px !important; */
544
+ padding: 0 !important;
545
+ width: 100vw !important;
546
+ max-width: 100vw !important;
547
+ min-width: 1200px !important;
548
+ }
549
+ /* main .wrap {
550
+ height: 100vh !important;
551
+ } */
552
+ /* main .wrap .contain {
553
+ height: 100% !important;
554
+ } */
555
+ /* main .wrap .contain .column {
556
+ height: 100vh !important;
557
+ } */
558
+
559
+ .main-content-box {
560
+ gap: unset !important;
561
+ min-height: calc(100vh - 80px) !important;
562
+ }
563
+
564
+ .gradio-container {
565
+ overflow: auto !important;
566
+ }
css/main.css ADDED
@@ -0,0 +1,249 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* 主体样式 */
2
+ html {
3
+ display: unset !important;
4
+ }
5
+ body {
6
+ background-color: #f3f4f6;
7
+ /* font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; */
8
+ font-family: unset !important;
9
+ margin: 0;
10
+ padding: 0;
11
+ /* display: unset !important; */
12
+ min-height: 100vh !important;
13
+ }
14
+
15
+ /* 容器样式 */
16
+ .container {
17
+ min-width: 1440px;
18
+ /* margin: 2rem auto; */
19
+ background-color: white;
20
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
21
+ /* border-radius: 0.75rem; */
22
+ /* min-height: 90vh; */
23
+ overflow: hidden;
24
+ margin-top: 0 !important;
25
+ gap: unset !important;
26
+ margin: 0 auto !important;
27
+ }
28
+ .container-h {
29
+ /* height: 97vh !important; */
30
+ background-color: rgb(249 250 251) !important;
31
+ }
32
+ .html-container {
33
+ padding: 0 !important;
34
+ }
35
+ footer {
36
+ margin-top: 0 !important;
37
+ }
38
+
39
+ /* 头部样式 */
40
+ .header {
41
+ background: linear-gradient(to right, #2563eb, #1e40af);
42
+ color: white;
43
+ padding: 1rem 2rem;
44
+ display: flex;
45
+ align-items: center;
46
+ justify-content: space-between;
47
+ }
48
+
49
+ .top-logo-box {
50
+ display: flex;
51
+ }
52
+
53
+ .logo-title {
54
+ color: #fff !important;
55
+ margin-left: 10px;
56
+ }
57
+
58
+ .header h1 {
59
+ font-size: 1.5rem;
60
+ font-weight: 600;
61
+ margin: 0;
62
+ }
63
+
64
+ /* 主要内容区域 */
65
+ .main-content {
66
+ display: flex;
67
+ flex: 1;
68
+ overflow: hidden;
69
+ }
70
+
71
+ /* 左侧边栏 */
72
+ .sidebar {
73
+ background-color: #f9fafb;
74
+ width: 350px;
75
+ padding: 1.5rem;
76
+ display: flex;
77
+ flex-direction: column;
78
+ gap: 1.5rem;
79
+ border-right: 1px solid #e5e7eb;
80
+ }
81
+
82
+ /* 主内容区域 */
83
+ .content-area {
84
+ flex: 1;
85
+ display: flex;
86
+ flex-direction: column;
87
+ background-color: #eff6ff;
88
+ }
89
+
90
+ /* 指标仪表板 */
91
+ .metrics-dashboard {
92
+ background-color: #eff6ff;
93
+ border-bottom: 1px solid #e5e7eb;
94
+ padding: 1.5rem;
95
+ /* display: grid; */
96
+ /* grid-template-columns: repeat(4, 1fr); */
97
+ /* gap: 1rem; */
98
+ min-height: 300px;
99
+ }
100
+
101
+ .metric-card {
102
+ background-color: white;
103
+ border-radius: 0.5rem;
104
+ box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);
105
+ padding: 1.25rem;
106
+ min-height: 250px !important;
107
+ }
108
+
109
+ .metric-card h3 {
110
+ font-weight: 600;
111
+ color: #374151;
112
+ margin: 0 0 1rem 0;
113
+ }
114
+
115
+ .metric-value {
116
+ font-size: 1.5rem;
117
+ font-weight: 700;
118
+ color: #111827;
119
+ margin: 1rem 0 0.25rem 0;
120
+ }
121
+
122
+ .metric-change {
123
+ display: flex;
124
+ align-items: center;
125
+ margin-top: 0.25rem;
126
+ }
127
+
128
+ .metric-change.positive {
129
+ color: #16a34a;
130
+ }
131
+
132
+ .metric-change.negative {
133
+ color: #dc2626;
134
+ }
135
+
136
+ /* 分析区域 */
137
+ .analysis-area {
138
+ flex: 1;
139
+ display: flex;
140
+ min-height: 0;
141
+ overflow: hidden;
142
+ }
143
+
144
+ /* Tab内容 */
145
+ .tab-content {
146
+ flex: 1;
147
+ display: flex;
148
+ flex-direction: column;
149
+ min-width: 0;
150
+ padding: 0 16px !important;
151
+ }
152
+
153
+ /* Tab导航 */
154
+ .tab-navigation {
155
+ display: flex;
156
+ border-bottom: 1px solid #e5e7eb;
157
+ }
158
+
159
+ .tab-button {
160
+ padding: 0.75rem 1.25rem;
161
+ font-weight: 500;
162
+ font-size: 1rem;
163
+ color: #6b7280;
164
+ border-bottom: 2px solid transparent;
165
+ }
166
+
167
+ .tab-button.active {
168
+ color: #111827;
169
+ border-bottom: 2px solid #2563eb;
170
+ }
171
+
172
+ /* 聊天面板 */
173
+ .chat-panel {
174
+ /* width: 340px; */
175
+ display: flex;
176
+ flex-direction: column;
177
+ border-left: 1px solid #e5e7eb;
178
+ background-color: white;
179
+ box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.05);
180
+ gap: unset !important;
181
+ }
182
+
183
+ .chat-header {
184
+ padding: 1rem;
185
+ border-bottom: 1px solid #e5e7eb;
186
+ display: flex;
187
+ align-items: center;
188
+ gap: 0.5rem;
189
+ font-weight: 500;
190
+ }
191
+
192
+ .chat-area {
193
+ flex: 1;
194
+ min-height: 0;
195
+ overflow-y: auto;
196
+ padding: 1rem;
197
+ display: flex;
198
+ flex-direction: column;
199
+ gap: 1rem;
200
+ }
201
+
202
+ .chat-message {
203
+ max-width: 85%;
204
+ padding: 0.75rem;
205
+ border-radius: 1rem;
206
+ }
207
+
208
+ .chat-message.bot {
209
+ background-color: #eff6ff;
210
+ border-bottom-left-radius: 0;
211
+ }
212
+
213
+ .chat-message.user {
214
+ background-color: #f3f4f6;
215
+ border-bottom-right-radius: 0;
216
+ margin-left: auto;
217
+ }
218
+
219
+ .chat-input-area {
220
+ padding: 1rem;
221
+ border-top: 1px solid #e5e7eb;
222
+ display: flex;
223
+ gap: 0.5rem;
224
+ }
225
+
226
+ /* 隐藏滚动条 */
227
+ .hide-scrollbar::-webkit-scrollbar {
228
+ display: none;
229
+ }
230
+
231
+ .hide-scrollbar {
232
+ -ms-overflow-style: none;
233
+ scrollbar-width: none;
234
+ }
235
+
236
+ /* 渐变动画 */
237
+ .fade-in {
238
+ animation: fadeIn 0.3s ease-in-out;
239
+ }
240
+
241
+ @keyframes fadeIn {
242
+ from {
243
+ opacity: 0;
244
+ }
245
+
246
+ to {
247
+ opacity: 1;
248
+ }
249
+ }
globals.py ADDED
@@ -0,0 +1 @@
 
 
1
+ SELECT_COMPANY = ""