Update main.py
Browse files
main.py
CHANGED
@@ -315,39 +315,34 @@ def proxy(path):
|
|
315 |
style_tag = soup.new_tag('style')
|
316 |
style_tag.string = '''
|
317 |
:root {
|
318 |
-
/* Light
|
319 |
--primary-gradient: linear-gradient(135deg, #3498db 0%, #2980b9 100%);
|
320 |
--hover-gradient: linear-gradient(135deg, #2980b9 0%, #2471a3 100%);
|
321 |
--bg-gradient: linear-gradient(135deg, #f5f7fa 0%, #e4e9f2 100%);
|
322 |
--card-shadow: 0 8px 20px rgba(0,0,0,0.08);
|
323 |
--transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
324 |
--text-color: #2c3e50;
|
|
|
325 |
--card-bg: rgba(255, 255, 255, 0.98);
|
326 |
--card-border: rgba(255, 255, 255, 0.8);
|
327 |
--table-border: rgba(236, 240, 241, 0.8);
|
328 |
-
--table-row
|
329 |
-
--
|
330 |
-
--modal-text: #f1f1f1;
|
331 |
-
--zoom-btn-bg: rgba(255, 255, 255, 0.2);
|
332 |
-
--zoom-btn-border: rgba(255, 255, 255, 0.4);
|
333 |
-
--zoom-btn-color: white;
|
334 |
}
|
335 |
|
|
|
336 |
[data-theme="dark"] {
|
337 |
--primary-gradient: linear-gradient(135deg, #2563eb 0%, #1e40af 100%);
|
338 |
--hover-gradient: linear-gradient(135deg, #1e40af 0%, #1e3a8a 100%);
|
339 |
--bg-gradient: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);
|
340 |
--card-shadow: 0 8px 20px rgba(0,0,0,0.2);
|
341 |
--text-color: #e2e8f0;
|
|
|
342 |
--card-bg: rgba(30, 41, 59, 0.98);
|
343 |
--card-border: rgba(30, 41, 59, 0.8);
|
344 |
--table-border: rgba(51, 65, 85, 0.8);
|
345 |
-
--table-row
|
346 |
-
--
|
347 |
-
--modal-text: #f1f1f1;
|
348 |
-
--zoom-btn-bg: rgba(30, 41, 59, 0.4);
|
349 |
-
--zoom-btn-border: rgba(51, 65, 85, 0.6);
|
350 |
-
--zoom-btn-color: #e2e8f0;
|
351 |
}
|
352 |
body {
|
353 |
font-family: 'Segoe UI', system-ui, -apple-system, sans-serif;
|
@@ -355,9 +350,10 @@ def proxy(path):
|
|
355 |
padding: 30px;
|
356 |
max-width: 1400px;
|
357 |
margin: 0 auto;
|
358 |
-
background: var(--bg-
|
359 |
-
color:
|
360 |
min-height: 100vh;
|
|
|
361 |
}
|
362 |
.breadcrumb {
|
363 |
display: flex;
|
@@ -365,12 +361,12 @@ def proxy(path):
|
|
365 |
gap: 15px;
|
366 |
align-items: center;
|
367 |
padding: 20px;
|
368 |
-
background:
|
369 |
border-radius: 16px;
|
370 |
box-shadow: var(--card-shadow);
|
371 |
margin-bottom: 30px;
|
372 |
backdrop-filter: blur(10px);
|
373 |
-
border: 1px solid
|
374 |
}
|
375 |
.breadcrumb a {
|
376 |
text-decoration: none;
|
@@ -402,12 +398,12 @@ def proxy(path):
|
|
402 |
margin: 30px 0;
|
403 |
}
|
404 |
li {
|
405 |
-
background:
|
406 |
border-radius: 16px;
|
407 |
overflow: hidden;
|
408 |
transition: var(--transition);
|
409 |
box-shadow: var(--card-shadow);
|
410 |
-
border: 1px solid
|
411 |
}
|
412 |
li:hover {
|
413 |
transform: translateY(-5px);
|
@@ -417,10 +413,10 @@ def proxy(path):
|
|
417 |
display: block;
|
418 |
padding: 20px;
|
419 |
text-decoration: none;
|
420 |
-
color:
|
421 |
font-weight: 500;
|
422 |
transition: var(--transition);
|
423 |
-
background:
|
424 |
}
|
425 |
li a:hover {
|
426 |
background: var(--primary-gradient);
|
@@ -430,21 +426,21 @@ def proxy(path):
|
|
430 |
width: 100%;
|
431 |
border-collapse: separate;
|
432 |
border-spacing: 0;
|
433 |
-
background:
|
434 |
border-radius: 16px;
|
435 |
overflow: hidden;
|
436 |
box-shadow: var(--card-shadow);
|
437 |
margin: 30px 0;
|
438 |
backdrop-filter: blur(10px);
|
439 |
-
border: 1px solid
|
440 |
}
|
441 |
td {
|
442 |
padding: 20px;
|
443 |
-
border: 1px solid
|
444 |
transition: var(--transition);
|
445 |
}
|
446 |
tr:nth-child(even) {
|
447 |
-
background:
|
448 |
}
|
449 |
tr:hover {
|
450 |
background: var(--bg-gradient);
|
@@ -484,7 +480,7 @@ def proxy(path):
|
|
484 |
hr {
|
485 |
border: none;
|
486 |
height: 1px;
|
487 |
-
background: linear-gradient(to right, transparent,
|
488 |
margin: 30px 0;
|
489 |
}
|
490 |
.modal {
|
@@ -502,6 +498,10 @@ def proxy(path):
|
|
502 |
transition: opacity 0.3s ease;
|
503 |
}
|
504 |
|
|
|
|
|
|
|
|
|
505 |
.modal.show {
|
506 |
opacity: 1;
|
507 |
}
|
@@ -605,6 +605,67 @@ def proxy(path):
|
|
605 |
soup.append(html_tag)
|
606 |
soup.head.append(style_tag)
|
607 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
608 |
# Convert navigation links to breadcrumb
|
609 |
nav_links = soup.find_all('a', href=True)
|
610 |
breadcrumb_div = soup.new_tag('div')
|
|
|
315 |
style_tag = soup.new_tag('style')
|
316 |
style_tag.string = '''
|
317 |
:root {
|
318 |
+
/* Light mode variables */
|
319 |
--primary-gradient: linear-gradient(135deg, #3498db 0%, #2980b9 100%);
|
320 |
--hover-gradient: linear-gradient(135deg, #2980b9 0%, #2471a3 100%);
|
321 |
--bg-gradient: linear-gradient(135deg, #f5f7fa 0%, #e4e9f2 100%);
|
322 |
--card-shadow: 0 8px 20px rgba(0,0,0,0.08);
|
323 |
--transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
324 |
--text-color: #2c3e50;
|
325 |
+
--bg-color: var(--bg-gradient);
|
326 |
--card-bg: rgba(255, 255, 255, 0.98);
|
327 |
--card-border: rgba(255, 255, 255, 0.8);
|
328 |
--table-border: rgba(236, 240, 241, 0.8);
|
329 |
+
--table-even-row: rgba(245, 247, 250, 0.5);
|
330 |
+
--hr-color: rgba(44, 62, 80, 0.2);
|
|
|
|
|
|
|
|
|
331 |
}
|
332 |
|
333 |
+
/* Dark mode variables */
|
334 |
[data-theme="dark"] {
|
335 |
--primary-gradient: linear-gradient(135deg, #2563eb 0%, #1e40af 100%);
|
336 |
--hover-gradient: linear-gradient(135deg, #1e40af 0%, #1e3a8a 100%);
|
337 |
--bg-gradient: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);
|
338 |
--card-shadow: 0 8px 20px rgba(0,0,0,0.2);
|
339 |
--text-color: #e2e8f0;
|
340 |
+
--bg-color: var(--bg-gradient);
|
341 |
--card-bg: rgba(30, 41, 59, 0.98);
|
342 |
--card-border: rgba(30, 41, 59, 0.8);
|
343 |
--table-border: rgba(51, 65, 85, 0.8);
|
344 |
+
--table-even-row: rgba(30, 41, 59, 0.5);
|
345 |
+
--hr-color: rgba(226, 232, 240, 0.2);
|
|
|
|
|
|
|
|
|
346 |
}
|
347 |
body {
|
348 |
font-family: 'Segoe UI', system-ui, -apple-system, sans-serif;
|
|
|
350 |
padding: 30px;
|
351 |
max-width: 1400px;
|
352 |
margin: 0 auto;
|
353 |
+
background: var(--bg-color);
|
354 |
+
color: var(--text-color);
|
355 |
min-height: 100vh;
|
356 |
+
transition: background 0.3s ease, color 0.3s ease;
|
357 |
}
|
358 |
.breadcrumb {
|
359 |
display: flex;
|
|
|
361 |
gap: 15px;
|
362 |
align-items: center;
|
363 |
padding: 20px;
|
364 |
+
background: var(--card-bg);
|
365 |
border-radius: 16px;
|
366 |
box-shadow: var(--card-shadow);
|
367 |
margin-bottom: 30px;
|
368 |
backdrop-filter: blur(10px);
|
369 |
+
border: 1px solid var(--card-border);
|
370 |
}
|
371 |
.breadcrumb a {
|
372 |
text-decoration: none;
|
|
|
398 |
margin: 30px 0;
|
399 |
}
|
400 |
li {
|
401 |
+
background: var(--card-bg);
|
402 |
border-radius: 16px;
|
403 |
overflow: hidden;
|
404 |
transition: var(--transition);
|
405 |
box-shadow: var(--card-shadow);
|
406 |
+
border: 1px solid var(--card-border);
|
407 |
}
|
408 |
li:hover {
|
409 |
transform: translateY(-5px);
|
|
|
413 |
display: block;
|
414 |
padding: 20px;
|
415 |
text-decoration: none;
|
416 |
+
color: var(--text-color);
|
417 |
font-weight: 500;
|
418 |
transition: var(--transition);
|
419 |
+
background: var(--card-bg);
|
420 |
}
|
421 |
li a:hover {
|
422 |
background: var(--primary-gradient);
|
|
|
426 |
width: 100%;
|
427 |
border-collapse: separate;
|
428 |
border-spacing: 0;
|
429 |
+
background: var(--card-bg);
|
430 |
border-radius: 16px;
|
431 |
overflow: hidden;
|
432 |
box-shadow: var(--card-shadow);
|
433 |
margin: 30px 0;
|
434 |
backdrop-filter: blur(10px);
|
435 |
+
border: 1px solid var(--card-border);
|
436 |
}
|
437 |
td {
|
438 |
padding: 20px;
|
439 |
+
border: 1px solid var(--table-border);
|
440 |
transition: var(--transition);
|
441 |
}
|
442 |
tr:nth-child(even) {
|
443 |
+
background: var(--table-even-row);
|
444 |
}
|
445 |
tr:hover {
|
446 |
background: var(--bg-gradient);
|
|
|
480 |
hr {
|
481 |
border: none;
|
482 |
height: 1px;
|
483 |
+
background: linear-gradient(to right, transparent, var(--hr-color), transparent);
|
484 |
margin: 30px 0;
|
485 |
}
|
486 |
.modal {
|
|
|
498 |
transition: opacity 0.3s ease;
|
499 |
}
|
500 |
|
501 |
+
[data-theme="dark"] .modal {
|
502 |
+
background: rgba(0, 0, 0, 0.95);
|
503 |
+
}
|
504 |
+
|
505 |
.modal.show {
|
506 |
opacity: 1;
|
507 |
}
|
|
|
605 |
soup.append(html_tag)
|
606 |
soup.head.append(style_tag)
|
607 |
|
608 |
+
# Add dark mode toggle button
|
609 |
+
dark_mode_toggle = soup.new_tag('div')
|
610 |
+
dark_mode_toggle['id'] = 'dark-mode-toggle'
|
611 |
+
dark_mode_toggle['class'] = 'theme-toggle'
|
612 |
+
dark_mode_toggle['style'] = 'position: fixed; top: 20px; right: 20px; z-index: 999; display: flex; align-items: center; gap: 10px; background: var(--card-bg); padding: 10px 15px; border-radius: 30px; box-shadow: var(--card-shadow); cursor: pointer; transition: var(--transition);'
|
613 |
+
|
614 |
+
toggle_icon = soup.new_tag('span')
|
615 |
+
toggle_icon['class'] = 'toggle-icon'
|
616 |
+
toggle_icon['style'] = 'font-size: 18px;'
|
617 |
+
toggle_icon.string = '🌙'
|
618 |
+
|
619 |
+
toggle_text = soup.new_tag('span')
|
620 |
+
toggle_text['class'] = 'toggle-text'
|
621 |
+
toggle_text.string = 'Тёмный режим'
|
622 |
+
|
623 |
+
dark_mode_toggle.append(toggle_icon)
|
624 |
+
dark_mode_toggle.append(toggle_text)
|
625 |
+
|
626 |
+
if soup.body:
|
627 |
+
soup.body.insert(0, dark_mode_toggle)
|
628 |
+
|
629 |
+
# Add dark mode toggle script
|
630 |
+
dark_mode_script = soup.new_tag('script')
|
631 |
+
dark_mode_script.string = '''
|
632 |
+
document.addEventListener('DOMContentLoaded', function() {
|
633 |
+
const toggle = document.getElementById('dark-mode-toggle');
|
634 |
+
const toggleIcon = toggle.querySelector('.toggle-icon');
|
635 |
+
const toggleText = toggle.querySelector('.toggle-text');
|
636 |
+
const htmlElement = document.documentElement;
|
637 |
+
|
638 |
+
// Check for saved theme preference or use user's system preference
|
639 |
+
const savedTheme = localStorage.getItem('theme');
|
640 |
+
const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
641 |
+
|
642 |
+
// Apply theme based on saved preference or system preference
|
643 |
+
if (savedTheme === 'dark' || (!savedTheme && prefersDark)) {
|
644 |
+
htmlElement.setAttribute('data-theme', 'dark');
|
645 |
+
toggleIcon.textContent = '☀️';
|
646 |
+
toggleText.textContent = 'Светлый режим';
|
647 |
+
}
|
648 |
+
|
649 |
+
// Toggle theme when button is clicked
|
650 |
+
toggle.addEventListener('click', function() {
|
651 |
+
if (htmlElement.getAttribute('data-theme') === 'dark') {
|
652 |
+
htmlElement.removeAttribute('data-theme');
|
653 |
+
toggleIcon.textContent = '🌙';
|
654 |
+
toggleText.textContent = 'Тёмный режим';
|
655 |
+
localStorage.setItem('theme', 'light');
|
656 |
+
} else {
|
657 |
+
htmlElement.setAttribute('data-theme', 'dark');
|
658 |
+
toggleIcon.textContent = '☀️';
|
659 |
+
toggleText.textContent = 'Светлый режим';
|
660 |
+
localStorage.setItem('theme', 'dark');
|
661 |
+
}
|
662 |
+
});
|
663 |
+
});
|
664 |
+
'''
|
665 |
+
|
666 |
+
if soup.body:
|
667 |
+
soup.body.append(dark_mode_script)
|
668 |
+
|
669 |
# Convert navigation links to breadcrumb
|
670 |
nav_links = soup.find_all('a', href=True)
|
671 |
breadcrumb_div = soup.new_tag('div')
|