// ==UserScript== // @name ЕТИС REBORN // @namespace http://tampermonkey.net/ // @version 2.1000 // @changelog 1) Умное добавление пар. 2) Настройка сайта под себя через универсальное окно. 3) Поддержка новой вкладки "ПФК", 4) История всех версий скрипта, 5) Окна на мобильных в виде шторок, 6) Фикс для Firefox. // @description Глобальный редизайн ЕТИСа // @author dya_dya // @icon https://raw.githubusercontent.com/defl-orator/etis-reborn/main/img/logo.png // @icon64 https://raw.githubusercontent.com/defl-orator/etis-reborn/main/img/logo.png // @match https://student.psu.ru/* // @run-at document-start // @grant GM_xmlhttpRequest // @grant GM_info // @grant GM_getValue // @grant GM_setValue // @grant unsafeWindow // @connect raw.githubusercontent.com // @connect * // @updateURL https://raw.githubusercontent.com/defl-orator/etis-reborn/refs/heads/main/etis.user.js // @downloadURL https://raw.githubusercontent.com/defl-orator/etis-reborn/refs/heads/main/etis.user.js // ==/UserScript== (function() { 'use strict'; // ========================================== // НАСТРОЙКИ ОБНОВЛЕНИЯ И ТЕСТИРОВАНИЯ // ========================================== const IS_TEST_MODE = false; const BASE_REPO_URL = 'https://raw.githubusercontent.com/defl-orator/etis-reborn/refs/heads/main/'; const UPDATE_URL = IS_TEST_MODE ? BASE_REPO_URL + 'etis-test.user.js' : BASE_REPO_URL + 'etis.user.js'; // Детектор iOS устройств const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1); // ========================================== // 1. ВНЕДРЕНИЕ CSS СТИЛЕЙ // ========================================== const styles = ` @font-face { font-family: 'Material Icons Outlined'; font-style: normal; font-weight: 400; src: url(https://fonts.gstatic.com/s/materialiconsoutlined/v38/gok-H7zzDkdnRel8-DQ6KAXJ69wP1tGnf4ZGhUce.woff2) format('woff2'); } :root { --font-family: 'PT Sans Caption', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; --radius-small: 12px; --radius-medium: 16px; --radius-large: 24px; --width-aside: 26rem; --width-page: 1120px; --width-content-margin-left: 3rem; --transition: 0.2s ease; } [theme="light"] { /* Основные цвета */ --color-body: #F2F2F6; --color-card: #FFFFFF; /* Акцент: ГОЛУБОЙ */ --color-accent: #007AFF; --color-accent-dark: #0056b3; --color-accent-active: #E3F2FD; --color-text-link: #007AFF; /* Элементы */ --color-tooltip: #fff; --color-highlight: #F2F2F7; --color-highlight-light: #fff; --color-input: #F2F2F7; --color-input-highlight: #fff; --color-scrollbar-thumb: #c1c1c1; --color-scrollbar-thumb-highlight: #a8a8a8; --color-table-border: rgba(0, 0, 0, 0.08); --color-table-header: #F9F9F9; --color-table-highlight: #F5F5F5; /* Статусы */ --color-red: #FF3B30; --color-green: #34C759; --color-blue: #007AFF; --color-yellow: #FFCC00; --color-warning: #FF9500; --color-white: #fff; --color-error: #FF3B30; /* Текст */ --color-text-primary: #1C1C1E; --color-text-secondary: #8E8E93; --color-text-primary-invert: #fff; --color-text-accent: #007AFF; --shadow-main: 0 4px 12px rgba(0, 0, 0, 0.05); --shadow-dialog: 0 10px 30px rgba(0, 0, 0, 0.2); --border-input: 1px solid transparent; --color-table-highlight: rgba(0, 0, 0, 0.03); --color-table-border: rgba(0, 0, 0, 0.08); } [theme="dark"] { /* Основные цвета */ --color-body: #16181A; --color-card: #212325; /* Акцент */ --color-accent: #4B89DC; --color-accent-dark: #3565A8; --color-accent-active: rgba(75, 137, 220, 0.15); --color-text-link: #60A5FA; /* Элементы интерфейса */ --color-tooltip: #2A2C2F; --color-highlight: #2A2C2F; --color-highlight-light: #35383C; --color-input: #2A2C2F; --color-input-highlight: #16181A; --color-scrollbar-thumb: #4A4D51; --color-scrollbar-thumb-highlight: #606468; --color-table-border: rgba(255, 255, 255, 0.08); --color-table-header: #1A1C1E; --color-table-highlight: #2A2C2F; /* Статусы */ --color-red: #E06C65; --color-green: #5BB974; --color-blue: #4B89DC; --color-yellow: #E2B953; --color-warning: #E29953; --color-white: #ffffff; --color-error: #E06C65; /* Текст */ --color-text-primary: #EAECEE; --color-text-secondary: #8E9499; --color-text-primary-invert: #ffffff; --color-text-accent: #60A5FA; --shadow-main: 0 4px 12px rgba(0, 0, 0, 0.2); --shadow-dialog: 0 10px 30px rgba(0, 0, 0, 0.5); --border-input: 1px solid #3A3D40; } /* Page Base */ html { font-size: 10px !important; background-color: var(--color-body) !important; } body { background: var(--color-body) !important; color: var(--color-text-primary) !important; font-family: var(--font-family) !important; min-height: 100vh !important; min-height: 100dvh !important; } /* ПК версия скроллбара и layout */ @media (min-width: 961px) { html, body { height: 100% !important; overflow-y: auto !important; } } .container { padding: 0 !important; max-width: var(--width-page) !important; width: 100% !important; margin: 0 auto !important; } .container .row { margin: 0 !important; padding: 2rem 2rem 10rem !important; } .span9 > br:first-child, .span9 > script + br, .span9 > style + br { display: none !important; } .span9 { width: auto !important; margin-left: calc(var(--width-aside) + var(--width-content-margin-left)) !important; float: none !important; } .span9 > h3 { margin-bottom: 1.4rem !important; } .submenu { font-size: 1.2rem !important; margin-bottom: 2.4rem !important; } .submenu + .submenu { margin-top: -0.8rem !important; } .warning { margin: 0 !important; width: auto !important; margin-bottom: 2rem !important; background: none !important; color: var(--color-text-error) !important; font-size: 1.2rem !important; } #tooltip { background: var(--color-tooltip) !important; color: var(--color-text-primary) !important; border: 0.1rem solid var(--color-text-primary) !important; padding: 0.4rem 0.6rem !important; } .flex-row { display: flex !important; align-items: center !important; } *, *:before, *:after { box-sizing: border-box !important; } /* Scrollbar */ ::-webkit-scrollbar { display: none !important; width: 0 !important; height: 0 !important; } * { scrollbar-width: none !important; -ms-overflow-style: none !important; } @supports (-moz-appearance:none) { .span3 { padding-right: 0.4rem !important; } } /* Colors & Fonts */ font[color="red"], tr[style="color:red;"], span[style="color:red;"], div[style="font-size:0.8em;color:red;"], font[style="color:red;font-weight:bold"], font[style="color:#d00;"] { color: var(--color-red) !important; } span[style="color:green;"], font[color="green"], div[style="font-size:0.8em;color:green;"] { color: var(--color-green) !important; } font[color="blue"], font[style="font-weight:bold;color:blue;cursor:pointer"], div[style="color:blue;font-size: 0.8em;"], span[style="color:blue;"] { color: var(--color-blue) !important; } font[color="gray"], font[color="#808080"], font[style="font-size:10px;color:#808080"], div[style="font-size:0.8em;color:gray;"], span[style="color:#808080"], font[style="font-weight:bold;color:#333333;"], span[style="color:#333333"] { color: var(--color-text-secondary) !important; } font[color="#6A0035"] { color: var(--color-text-accent); } a { color: var(--color-text-link) !important; } a.dashed { color: var(--color-text-secondary) !important; } a.dashed:hover { color: var(--color-text-highlight) !important; } .navbar-static-top { display: none !important; } /* --- TABLES --- */ table { width: 100% !important; border-collapse: separate !important; border-spacing: 0 !important; border: none !important; border-radius: var(--radius-medium) !important; background: var(--color-card) !important; box-shadow: var(--shadow-main) !important; overflow: hidden !important; margin-bottom: 2.4rem !important; color: var(--color-text-primary) !important; } .day table { margin-bottom: 0 !important; } table tr, table td, .common tr, .common td, .slimtab_nice tr, .slimtab_nice td { background: transparent !important; background-color: transparent !important; } /* Шапка таблицы */ table th, .common th, .slimtab_nice th { background: var(--color-table-header) !important; color: var(--color-text-secondary) !important; font-weight: 600 !important; font-size: 1.1rem !important; text-transform: uppercase !important; letter-spacing: 0.5px !important; border: none !important; border-bottom: 1px solid var(--color-table-border) !important; padding: 1.2rem 1.6rem !important; vertical-align: middle !important; text-align: center !important; } /* Ячейки */ table td, .common td, .slimtab_nice td { border: none !important; border-bottom: 1px solid var(--color-table-border) !important; padding: 1.4rem 1.6rem !important; vertical-align: middle !important; font-size: 1.3rem !important; color: var(--color-text-primary) !important; text-align: center !important; /* Центрируем контент */ } table th:first-child, table td:first-child, .common th:first-child, .common td:first-child { text-align: left !important; } table tr:last-child td { border-bottom: none !important; } table tbody tr:hover td { background-color: var(--color-table-highlight) !important; } table tbody tr:hover th { background-color: var(--color-table-header) !important; } table tbody tr:hover td[rowspan] { background-color: var(--color-card) !important; } .slimtab_nice, .common, .teach_plan { border: none !important; } .slimtab_nice:after, .common:after { display: none !important; } font[color="green"], span[style*="color:green"] { color: var(--color-green) !important; font-weight: 600 !important; } font[color="red"], span[style*="color:red"] { color: var(--color-red) !important; font-weight: 600 !important; } font[color="blue"], span[style*="color:blue"] { color: var(--color-blue) !important; font-weight: 600 !important; } /* --- SUBMENU --- */ .submenu { display: flex !important; flex-direction: row !important; flex-wrap: nowrap !important; align-items: stretch !important; position: relative !important; overflow-x: auto !important; overflow-y: hidden !important; scrollbar-width: none !important; -webkit-overflow-scrolling: touch !important; width: 100% !important; border-radius: 50px !important; background-color: var(--color-card) !important; box-shadow: var(--shadow-main) !important; padding: 4px !important; gap: 8px !important; margin-bottom: 2.4rem !important; border-bottom: none !important; /* Индикация скролла по бокам */ background-image: linear-gradient(to right, var(--color-card) 20%, rgba(255,255,255,0) 100%), linear-gradient(to left, var(--color-card) 20%, rgba(255,255,255,0) 100%) !important; background-position: left center, right center !important; background-repeat: no-repeat !important; background-size: 40px 100% !important; background-attachment: scroll !important; } [theme="dark"] .submenu { background: linear-gradient(to right, var(--color-card) 30%, rgba(255,255,255,0)) left center / 40px 100% no-repeat local, linear-gradient(to left, var(--color-card) 30%, rgba(255,255,255,0)) right center / 40px 100% no-repeat local, radial-gradient(farthest-side at 0 50%, rgba(0,0,0,0.5), rgba(0,0,0,0)) left center / 15px 100% no-repeat scroll, radial-gradient(farthest-side at 100% 50%, rgba(0,0,0,0.5), rgba(0,0,0,0)) right center / 15px 100% no-repeat scroll !important; background-color: var(--color-card) !important; } .submenu::-webkit-scrollbar { display: none !important; } /* Вкладки в подменю */ .submenu a:not(.answer-btn-custom), .submenu .answer-btn-custom, .submenu b { flex: 1 0 auto !important; min-width: max-content !important; white-space: nowrap !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; border-radius: 50px !important; height: 3.8rem !important; padding: 0 16px !important; margin: 0 !important; font-size: 1.3rem !important; font-weight: 500 !important; box-shadow: none !important; border: none !important; transition: all 0.2s ease !important; box-sizing: border-box !important; text-decoration: none !important; } /* Обычная вкладка и кнопка оценки */ .submenu a:not(.answer-btn-custom), .submenu .answer-btn-custom { background: var(--color-highlight) !important; color: var(--color-text-primary) !important; } .submenu .answer-btn-custom .material-icons { color: var(--color-accent) !important; } /* Активная вкладка */ .submenu b { background: var(--color-accent) !important; color: var(--color-text-primary-invert) !important; font-weight: 600 !important; } .submenu a:hover, .submenu .answer-btn-custom:hover { background: var(--color-highlight-light) !important; transform: translateY(-1px); } /* UI Dialog */ .ui-dialog { box-shadow: var(--shadow-dialog) !important; } .ui-dialog .ui-dialog-content { width: initial !important; height: initial !important; } .ui-dialog .ui-dialog-content > form { display: flex !important; flex-direction: column !important; } .ui-dialog .ui-dialog-content > form > input { margin-top: 6px !important; } .ui-dialog .ui-dialog-content > form > input.btn { align-self: flex-end !important; } .ui-widget-content { border: none !important; background: var(--color-card) !important; color: var(--color-text-primary) !important; } .ui-widget-header { border: none !important; background: var(--color-highlight) !important; color: var(--color-text-primary) !important; } .ui-widget-overlay { background: var(--color-dialog-fade) !important; opacity: 1 !important; } .ui-dialog .ui-dialog-titlebar-close { border: none !important; background: none !important; color: var(--color-text-secondary) !important; } .ui-dialog .ui-dialog-titlebar-close > .ui-button-icon-primary { display: none !important; } .ui-dialog .ui-dialog-titlebar-close:before { content: 'close' !important; font-family: 'Material Icons Outlined' !important; font-size: 18px !important; } /* Inputs & Buttons */ input, select, textarea, button { font-family: inherit !important; } textarea { width: 100% !important; } select, textarea { background: var(--color-input) !important; color: var(--color-text-primary) !important; padding: 0.4rem 0.8rem !important; border-radius: var(--radius-small) !important; border: var(--border-input) !important; } select:hover { background: var(--color-input-highlight) !important; } input[type="text"], input[type="password"], input[type="email"] { background: transparent !important; color: var(--color-text-primary) !important; border: none !important; box-shadow: inset 0 -1px 0 0 var(--color-text-secondary) !important; width: 100% !important; padding: 0.8rem 0 !important; margin-bottom: 1.6rem !important; } input[type="text"]:focus, input[type="password"]:focus, input[type="email"]:focus { box-shadow: inset 0 -2px 0 0 var(--color-accent) !important; outline: none !important; } input[type="checkbox"], input[type="radio"] { position: relative !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; margin-right: 1rem !important; } input[type="checkbox"]:before { width: 1.8rem !important; height: 1.8rem !important; background: var(--color-input) !important; content: '' !important; position: absolute !important; border-radius: 0.2rem !important; border: var(--border-input) !important; } input[type="checkbox"]:checked:after { width: 0.8rem !important; height: 0.8rem !important; background: var(--color-accent) !important; content: '' !important; position: absolute !important; border-radius: 0.1rem !important; margin: 0.5rem !important; } input[type="radio"]:before { width: 1.8rem !important; height: 1.8rem !important; background: var(--color-input) !important; content: '' !important; position: absolute !important; border-radius: 50% !important; border: var(--border-input) !important; } input[type="radio"]:checked:after { width: 0.8rem !important; height: 0.8rem !important; background: var(--color-accent) !important; content: '' !important; position: absolute !important; border-radius: 50% !important; margin: 0.5rem !important; } button { padding: 0.8rem 1.6rem !important; color: var(--color-text-primary) !important; background: var(--color-highlight) !important; font-size: 1.4rem !important; border: none !important; border-radius: var(--radius-small) !important; text-shadow: none !important; box-shadow: var(--shadow-main) !important; display: flex !important; align-items: center !important; line-height: 1 !important; } button:hover { background: var(--color-highlight-light) !important; } .button_gray { width: fit-content !important; align-self: flex-end !important; border: none !important; background: none !important; } .button_gray button { color: var(--color-text-primary-invert) !important; background: var(--color-accent) !important; } .button.blue { background: var(--color-accent) !important; } .icon-button { display: flex !important; align-items: center !important; background: var(--color-card) !important; color: var(--color-text-primary) !important; font-size: 1.2rem !important; padding: 0.4rem 0.8rem !important; border-radius: var(--radius-small) !important; width: fit-content !important; box-shadow: var(--shadow-main) !important; text-decoration: none !important; } .icon-button2 { margin-left: 0.4rem !important; font-family: 'Material Icons Outlined' !important; font-size: 2rem !important; cursor: pointer !important; text-decoration: none !important; color: var(--color-text-secondary) !important; } .icon-button:before { margin-right: 0.6rem !important; font-family: 'Material Icons Outlined' !important; font-size: 1.8rem !important; } .icon-button.icon-feedback:before { content: 'feedback' !important; } .icon-button.icon-analytics:before { content: 'analytics' !important; } .icon-button.icon-today:before { content: 'today' !important; } /* Page Specifics */ .review { padding-bottom: 3rem !important; border-radius: var(--radius-medium) !important; width: 100% !important; } .question { margin: 0 0 1.6rem 0 !important; } .question li { margin-left: 0.8rem !important; margin-top: 0.4rem !important; } .question > .text { color: var(--color-text-primary) !important; } .question label { color: var(--color-text-secondary) !important; display: flex !important; align-items: center !important; } .comment > label { color: var(--color-text-primary) !important; margin-bottom: 0.4rem !important; } .comment > textarea { width: 100% !important; height: 20rem !important; padding: 0.8rem 1.2rem !important; resize: none !important; } form.que_form { margin-top: 1rem !important; } .question_table { margin: 1.4rem 0 3rem !important; } .question_table .text, .question_table tr:first-child { background: var(--color-table-header) !important; } .cgrldatarow:hover { background: var(--color-table-highlight) !important; } .span3 > .nav.nav-tabs.nav-stacked { border-radius: var(--radius-medium) !important; background: transparent !important; box-shadow: none !important; overflow: hidden !important; } .span3 > .nav.nav-tabs.nav-stacked:last-child { margin-bottom: 4rem !important; } .span3 > .nav.nav-tabs.nav-stacked:last-child > li > a { justify-content: flex-start !important; } .span3 > .nav.nav-tabs.nav-stacked > li > a { display: flex !important; align-items: center !important; justify-content: flex-start !important; padding: 1.1rem 1.4rem !important; background: var(--color-card) !important; color: var(--color-text-primary) !important; border: none !important; gap: 12px !important; text-align: left !important; } .span3 > .nav.nav-tabs.nav-stacked > .active:before { display: none !important; } .span3 > .nav.nav-tabs.nav-stacked > li > a > .badge { background-color: var(--color-accent) !important; padding: 0.2rem 0 !important; color: var(--color-text-primary-invert) !important; border-radius: var(--radius-small) !important; margin: -1.2rem 0 !important; width: 2.4rem !important; font-weight: normal !important; } .material-icons { font-family: 'Material Icons Outlined' !important; font-size: 20px !important; font-weight: normal !important; } .span3 > .nav.nav-tabs.nav-stacked > li > a > .material-icons { margin-right: 10px !important; } .material-icons.icon-load-doc-new { pointer-events: auto !important; } .themes .hour, .ctl_hours, .book_list .pages, .link_list .descr { color: var(--color-text-secondary) !important; } .badge.ctl { padding: 0.2rem 0.4rem !important; background: var(--color-error) !important; border-radius: 0.4rem !important; display: inline !important; } .tpr_part { line-height: 1.5 !important; } .ses_part { line-height: 1.5 !important; } /* Week Select */ .week-select { margin: 0 auto 1.5rem !important; margin-top: 0 !important; margin-bottom: 1.5rem !important; width: 100% !important; clear: both !important; } .week-select h3 { display: none !important; } .timetable-toolbar + br, .span9 > br { display: none !important; } /* Капсула для недель */ .weeks { display: flex !important; flex-wrap: nowrap !important; justify-content: flex-start !important; align-items: center !important; gap: 8px !important; margin: 0 !important; margin-top: 0 !important; margin-bottom: 0 !important; width: 100% !important; padding: 4px !important; background-color: var(--color-card) !important; box-shadow: var(--shadow-main) !important; border-radius: 50px !important; overflow-x: auto !important; overflow-y: hidden !important; scrollbar-width: none !important; -webkit-overflow-scrolling: touch !important; /* Индикация скролла по бокам */ background-image: linear-gradient(to right, var(--color-card) 20%, rgba(255,255,255,0) 100%), linear-gradient(to left, var(--color-card) 20%, rgba(255,255,255,0) 100%) !important; background-position: left center, right center !important; background-repeat: no-repeat !important; background-size: 40px 100% !important; background-attachment: scroll !important; } .weeks::-webkit-scrollbar { display: none !important; } /* Темная тема для градиентов скролла */ [theme="dark"] .weeks { background: linear-gradient(to right, var(--color-card) 30%, rgba(255,255,255,0)) left center / 40px 100% no-repeat local, linear-gradient(to left, var(--color-card) 30%, rgba(255,255,255,0)) right center / 40px 100% no-repeat local, radial-gradient(farthest-side at 0 50%, rgba(0,0,0,0.5), rgba(0,0,0,0)) left center / 15px 100% no-repeat scroll, radial-gradient(farthest-side at 100% 50%, rgba(0,0,0,0.5), rgba(0,0,0,0)) right center / 15px 100% no-repeat scroll !important; background-color: var(--color-card) !important; } .weeks .week { position: relative !important; display: flex !important; justify-content: center !important; align-items: center !important; flex: 0 0 auto !important; margin: 0 !important; padding: 0 !important; width: 3.8rem !important; height: 3.8rem !important; background-color: var(--color-highlight) !important; color: var(--color-text-primary) !important; border: none !important; font-size: 1.3rem !important; font-weight: 500 !important; transition: background 0.2s, transform 0.2s !important; box-shadow: none !important; } .weeks > .week > a { display: flex !important; justify-content: center !important; align-items: center !important; width: 100% !important; height: 100% !important; color: inherit !important; text-decoration: none !important; border-radius: 50% !important; } .weeks .week:not(.current):hover { background-color: var(--color-highlight-light) !important; } .weeks .week.pract:not(.current) { color: var(--color-text-primary) !important; } /* АКТИВНАЯ НЕДЕЛЯ */ .weeks .week.current { background-color: var(--color-accent) !important; color: var(--color-text-primary-invert) !important; box-shadow: 0 2px 8px rgba(0,0,0,0.2) !important; } .weeks .week.current > a { font-weight: 700 !important; } /* Выделение актуальной (календарной) недели, если мы сейчас смотрим другую */ .weeks .week.actual-week:not(.current) > a { color: var(--color-accent) !important; font-weight: 800 !important; } @media (min-width: 961px) { .mobile-menu-btn, .mobile-overlay { display: none !important; } } /* Timetable */ div.timetable-buttonbar { display: flex !important; flex-direction: row !important; align-items: center !important; justify-content: flex-end !important; flex-wrap: wrap !important; white-space: nowrap !important; } .timetable-btn { margin: 0 0 1.4rem 1.4rem !important; } div.consultations { display: flex !important; align-items: center !important; float: none !important; color: var(--color-text-primary) !important; } span.holiday { background-color: var(--color-green) !important; color: var(--color-text-primary-invert) !important; padding: 0.4rem 0.8rem !important; border-radius: 50rem !important; margin-top: 0.6rem !important; display: inline-block !important; } .day { border-radius: var(--radius-large) !important; background-color: var(--color-card) !important; box-shadow: var(--shadow-main) !important; overflow: hidden !important; padding: 0 !important; margin-bottom: 2rem !important; } .span9 .day h3 { display: flex !important; align-items: center !important; justify-content: space-between !important; /* День СЛЕВА, Дата СПРАВА */ padding: 1.6rem 2rem !important; background: var(--color-table-header) !important; border-bottom: 1px solid var(--color-table-border) !important; margin: 0 !important; font-size: 1.6rem !important; } .span9 .day h3 .day-name { font-weight: 700 !important; color: var(--color-text-primary) !important; text-transform: capitalize !important; letter-spacing: 0.3px !important; } /* Дата */ .span9 .day h3 .day-date { font-weight: 500 !important; font-size: 1.5rem !important; color: var(--color-text-secondary) !important; background: transparent !important; padding: 0 !important; border-radius: 0 !important; box-shadow: none !important; text-align: right !important; } .no_pairs { padding: 1.2rem 1.6rem 2rem !important; } .timetable { display: flex !important; flex-direction: column !important; width: 100% !important; } .timetable td { border: none !important; vertical-align: middle !important; padding-top: 0.2rem !important; padding-bottom: 0.2rem !important; font-size: 1.2rem !important; } .pair_num { width: 9.6rem !important; height: 5rem !important; border: none !important; font-size: 0 !important; padding-left: 1.6rem !important; } .pair_num .eval { font-size: 1.1rem !important; color: var(--color-text-secondary) !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; gap: 6px !important;} .pair_info { padding-right: 1.4rem !important; } .pair_info .dis a { color: var(--color-text-primary) !important; text-decoration: none !important; font-size: 1.4rem !important; } .pair_teacher { width: 14rem !important; text-align: right !important; padding-right: 1.6rem !important; } .pair_teacher > a { color: var(--color-text-secondary) !important; text-decoration: none !important; } .pair_info .aud { display: flex !important; flex-direction: row !important; align-items: center !important; gap: 6px !important; margin-top: 4px !important; flex-wrap: nowrap !important; width: max-content !important; position: relative !important; z-index: 0 !important; } .pair_info .aud > a:before { margin-right: 0.6rem !important; font-family: 'Material Icons Outlined' !important; content: 'videocam' !important; font-size: 1.8rem !important; } .pair_info .aud > a > img { display: none !important; } /* --- TEACHERS --- */ /* карточка преподавателя */ .teacher-card { display: flex; background: var(--color-card) !important; border-radius: var(--radius-large) !important; box-shadow: var(--shadow-main) !important; margin-bottom: 2.4rem !important; padding: 2.4rem !important; gap: 2.4rem !important; align-items: flex-start !important; border: 1px solid transparent !important; transition: transform 0.2s ease !important; } .teacher-card:hover { transform: translateY(-2px); border-color: var(--color-accent-active) !important; } /* Блок фото */ .teacher-avatar-box { flex-shrink: 0 !important; width: 110px !important; } .teacher-avatar-box img { display: block !important; width: 110px !important; height: 150px !important; object-fit: cover !important; border-radius: var(--radius-medium) !important; box-shadow: 0 4px 12px rgba(0,0,0,0.1) !important; } /* Блок информации */ .teacher-details { display: flex !important; flex-direction: column !important; flex-grow: 1 !important; justify-content: center !important; min-height: 150px !important; } /* Имя */ .teacher-name-link { font-size: 1.8rem !important; font-weight: 800 !important; color: var(--color-accent) !important; margin-bottom: 0.8rem !important; cursor: pointer !important; line-height: 1.3 !important; text-decoration: none !important; width: fit-content !important; } .teacher-name-link:hover { text-decoration: underline !important; opacity: 0.8 !important; } /* Кафедра */ .teacher-dept-link { font-size: 1.3rem !important; color: var(--color-text-secondary) !important; cursor: pointer !important; line-height: 1.4 !important; display: block !important; border-bottom: none !important; margin-bottom: 0 !important; padding-bottom: 0 !important; } .teacher-dept-link:hover { color: var(--color-text-primary) !important; } /* Список предметов */ .teacher-subjects { font-size: 1.5rem !important; line-height: 1.6 !important; color: var(--color-text-primary) !important; } /* Кнопка статистики вверху */ a[href="stu.dis_stat"] { display: inline-flex !important; align-items: center !important; background: var(--color-highlight) !important; color: var(--color-text-primary) !important; padding: 1.2rem 2rem !important; border-radius: var(--radius-medium) !important; text-decoration: none !important; font-weight: 600 !important; font-size: 1.3rem !important; margin-bottom: 2.4rem !important; } a[href="stu.dis_stat"]:before { content: 'insights'; font-family: 'Material Icons Outlined'; font-size: 2rem; margin-right: 1rem; color: var(--color-accent); } /* Мобильная адаптация */ @media (max-width: 600px) { .teacher-card { flex-direction: column !important; align-items: center !important; text-align: center !important; } .teacher-details { width: 100% !important; min-height: auto !important; } .teacher-name-link, .teacher-dept-link { width: auto !important; margin-left: auto !important; margin-right: auto !important; } } /* Адаптация под мобильные */ @media (max-width: 600px) { table.teacher_info tr { flex-direction: column !important; align-items: center !important; } .teacher_photo { padding: 2rem !important; } .teacher_desc { padding: 0 2rem 2rem !important; text-align: center !important; } .teacher_desc .chair { width: auto !important; margin: 0 auto 1.6rem !important; } .teacher_desc .dis { text-align: center !important; } } /* Messages */ .nav.answ, .nav.msg { padding: 1.2rem !important; border: none !important; border-radius: var(--radius-medium) !important; background: var(--color-card) !important; box-shadow: var(--shadow-main) !important; text-decoration: none !important; margin-bottom: 2rem !important; } .nav.msg.message > .message-header { display: flex !important; justify-content: space-between !important; background-color: var(--color-highlight) !important; border-radius: var(--radius-medium) var(--radius-medium) 0 0 !important; padding: 1.8rem 2.4rem 1.8rem 2.4rem !important; } .ord-inactive { color: var(--color-text-secondary) !important; } .certificates-info { color: var(--color-green) !important; font-size: 1.2rem !important; display: block !important; margin-bottom: 2rem !important; } /* Login */ .login-container { display: flex !important; flex-direction: column !important; min-height: 100vh !important; width: 100% !important; } .login { margin: 0 !important; display: flex !important; align-items: center !important; justify-content: center !important; flex: 1 1 auto !important; background: var(--color-body) !important; width: 100% !important; } .login:before, .login:after { display: none !important; } .psu-logo { display: flex !important; flex-direction: column !important; align-items: center !important; width: 100% !important; margin-bottom: 1.5rem !important; opacity: 0.9 !important; } .psu-logo::before { content: '' !important; display: block !important; height: 13rem !important; width: 100% !important; background-image: url("https://raw.githubusercontent.com/defl-orator/etis-reborn/main/img/logo_fill.png") !important; background-size: contain !important; background-position: center bottom !important; background-repeat: no-repeat !important; margin-bottom: 1.2rem !important; } .psu-logo::after { content: 'Е Т И С' !important; display: block !important; width: 80% !important; text-align-last: justify !important; font-size: 2.8rem !important; font-weight: 800 !important; color: var(--color-text-primary) !important; line-height: 1 !important; } html[theme="dark"] .psu-logo::before { filter: invert(1) !important; } .login > form > .choose { display: block !important; padding: 0 !important; border-bottom: none !important; background: none !important; margin-bottom: 2.4rem !important; font-size: 0 !important; } .login .items { padding: 0 !important; } .login-actions { display: flex !important; align-items: center !important; justify-content: space-between !important; width: 100% !important; margin-top: 3.2rem !important; } #sbmt { margin: 0 !important; } .forgot-password { font-size: 1.4rem !important; font-weight: 600 !important; color: var(--color-accent) !important; text-decoration: none !important; margin: 0 !important; padding: 0 !important; display: inline-flex !important; align-items: center !important; line-height: 1 !important; } .forgot-password:hover { text-decoration: underline !important; } .forgot-password { font-size: 1.4rem !important; font-weight: 600 !important; color: var(--color-accent) !important; text-decoration: none !important; margin: 0 !important; padding: 0 !important; display: inline-flex !important; align-items: center !important; line-height: 1 !important; } .forgot-password:hover { text-decoration: underline !important; } .login form, .form { display: flex !important; flex-direction: column !important; padding: 3.2rem !important; box-shadow: var(--shadow-main) !important; background: var(--color-card) !important; border-radius: var(--radius-large) !important; width: 36rem !important; margin: 0 auto !important; } .footer { margin: 0 auto !important; max-width: var(--width-content) !important; padding: 2rem !important; color: var(--color-text-secondary) !important; font-size: 1.2rem !important; text-align: center !important; } /* Tooltip */ .sign-tooltip-wrapper { position: fixed; display: flex; flex-direction: column; align-items: center; filter: drop-shadow(var(--shadow-tooltip)); } .sign-tooltip { padding: 0.8rem 1.6rem; max-width: 26rem; border-radius: var(--radius-large); font-size: 1.2rem; line-height: 1.8rem; text-align: center; color: var(--color-text-primary); background: var(--color-highlight); z-index: 12; } .psu-logo-subtitle { display: none !important; } @media (min-width: 961px) { .login form { flex-direction: row !important; width: 840px !important; min-height: 400px !important; padding: 48px 48px 40px 48px !important; display: flex !important; align-items: stretch !important; } .psu-logo { flex: 1 !important; margin-bottom: 0 !important; display: flex !important; flex-direction: column !important; align-items: flex-start !important; justify-content: flex-start !important; padding-right: 40px !important; } .psu-logo::before { height: 4.8rem !important; width: 4.8rem !important; margin-bottom: 1.6rem !important; background-position: left center !important; } .psu-logo::after { display: none !important; } .psu-logo-subtitle { display: block !important; font-size: 3.6rem !important; line-height: 1.2 !important; font-weight: 400 !important; color: var(--color-text-primary) !important; } .login .items { flex: 1 !important; display: flex !important; flex-direction: column !important; justify-content: center !important; padding-left: 40px !important; } .login-inputs-wrapper { margin-top: 0 !important; margin-bottom: 0 !important; width: 100% !important; } .login-actions { margin-top: 4rem !important; margin-bottom: 0 !important; display: flex !important; justify-content: space-between !important; align-items: center !important; gap: 2.4rem !important; } #sbmt { min-width: 130px !important; height: 48px !important; padding: 0 32px !important; font-size: 1.5rem !important; font-weight: 700 !important; border-radius: 24px !important; background: var(--color-accent) !important; display: flex !important; align-items: center !important; justify-content: center !important; border: none !important; } #sbmt span { padding: 0 !important; border: none !important; line-height: 1 !important; display: block !important; text-shadow: none !important; } } /* --- TIMETABLE TOOLBAR --- */ .timetable-toolbar { display: flex !important; flex-direction: row !important; flex-wrap: nowrap !important; align-items: stretch !important; position: relative !important; overflow-x: auto !important; overflow-y: hidden !important; scrollbar-width: none; -webkit-overflow-scrolling: touch; width: 100% !important; border-radius: 50px !important; background-color: var(--color-card) !important; box-shadow: var(--shadow-main) !important; padding: 4px !important; gap: 8px !important; margin-bottom: 1.5rem !important; /* Индикация скролла */ background-image: linear-gradient(to right, var(--color-card) 20%, rgba(255,255,255,0) 100%), linear-gradient(to left, var(--color-card) 20%, rgba(255,255,255,0) 100%) !important; background-position: left center, right center !important; background-repeat: no-repeat !important; background-size: 40px 100% !important; background-attachment: scroll !important; } .timetable-toolbar::-webkit-scrollbar { display: none; } .timetable-toolbar > * { flex: 1 0 auto !important; min-width: max-content !important; white-space: nowrap !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; border-radius: 50px !important; padding: 8px 16px !important; margin: 0 !important; font-size: 1.3rem !important; font-weight: 500 !important; background: var(--color-highlight) !important; color: var(--color-text-primary) !important; border: none !important; transition: all 0.2s ease !important; gap: 8px !important; cursor: pointer !important; } @media (max-width: 600px) { .timetable-toolbar > * { flex: 0 0 auto !important; } } .timetable-toolbar > *:hover { background: var(--color-highlight-light) !important; } .timetable-toolbar .toolbar-item { display: flex !important; align-items: center !important; color: var(--color-text-primary) !important; cursor: pointer !important; text-decoration: none !important; font-size: 1.3rem !important; white-space: nowrap !important; background: var(--color-highlight) !important; padding: 0.8rem 1.4rem !important; border-radius: var(--radius-small) !important; border: none !important; gap: 0.6rem !important; font-weight: 500 !important; transition: background 0.2s !important; } .timetable-toolbar .toolbar-item:hover { background: var(--color-highlight-light) !important; } /* Кнопки-капсулы внутри тулбара */ .timetable-toolbar .toolbar-item, .timetable-toolbar .sync-btn, .timetable-toolbar label.toolbar-item { flex: 1 1 0 !important; min-width: max-content !important; white-space: nowrap !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; border-radius: 50px !important; padding: 8px 16px !important; margin: 0 !important; font-size: 1.3rem !important; font-weight: 500 !important; background: var(--color-highlight) !important; color: var(--color-text-primary) !important; border: none !important; transition: all 0.2s ease !important; gap: 8px !important; } .timetable-toolbar .toolbar-item:hover { background: var(--color-highlight-light) !important; } /* Универсальный тумблер */ html body input[type="checkbox"].tumbler-checkbox { position: relative !important; width: 3.6rem !important; min-width: 3.6rem !important; height: 2rem !important; margin: 0 !important; appearance: none !important; background: var(--color-input) !important; border-radius: 2rem !important; border: 1px solid var(--color-scrollbar-thumb) !important; cursor: pointer !important; transition: background 0.3s, border-color 0.3s !important; display: inline-flex !important; box-shadow: none !important; flex-shrink: 0 !important; box-sizing: border-box !important; } html body input[type="checkbox"].tumbler-checkbox:before { display: none !important; } html body input[type="checkbox"].tumbler-checkbox:after { content: '' !important; position: absolute !important; top: 0.1rem !important; left: 0.15rem !important; width: 1.6rem !important; height: 1.6rem !important; background: var(--color-text-secondary) !important; border-radius: 50% !important; transition: transform 0.3s cubic-bezier(0.2, 0.85, 0.32, 1.2), background 0.3s !important; margin: 0 !important; box-shadow: 0 2px 4px rgba(0,0,0,0.2) !important; } html body input[type="checkbox"].tumbler-checkbox:checked { background: var(--color-accent) !important; border-color: var(--color-accent) !important; } html body input[type="checkbox"].tumbler-checkbox:checked:after { transform: translateX(1.55rem) !important; background: var(--color-white) !important; width: 1.6rem !important; height: 1.6rem !important; margin: 0 !important; border-radius: 50% !important; } /* --- CAPSULE SEARCH BAR --- */ .timetable-toolbar .capsule-search-item { flex: 1 1 0 !important; min-width: 150px !important; padding: 0 !important; display: inline-flex !important; align-items: center !important; background: var(--color-input) !important; border-radius: 50px !important; height: 3.8rem !important; overflow: hidden !important; } .timetable-toolbar .capsule-search-item:hover { background: var(--color-input) !important; } .timetable-toolbar .capsule-search-item .material-icons { margin-left: 16px !important; color: var(--color-text-secondary) !important; } .timetable-toolbar .capsule-search-item input { flex: 1 !important; height: 100% !important; border: none !important; background: transparent !important; box-shadow: none !important; padding: 0 16px 0 8px !important; margin: 0 !important; font-size: 1.4rem !important; color: var(--color-text-primary) !important; outline: none !important; } .timetable-toolbar .capsule-search-item input:focus { box-shadow: none !important; } @media (max-width: 960px) { .timetable-toolbar .capsule-search-item { flex: 1 1 auto !important; min-width: 140px !important; } } /* --- MOBILE ADAPTATION --- */ @media (max-width: 960px) { /* 1. Нативная прокрутка */ html, body { overflow-x: hidden !important; position: relative !important; height: auto !important; } .container { max-width: 100% !important; padding: 0 !important; } .span9 { margin-left: 0 !important; margin-top: 2rem !important; padding: 0 1rem 15rem !important; width: 100% !important; max-width: 100vw !important; overflow-x: hidden !important; float: none !important; box-sizing: border-box !important; } .span9 > div[style*="float: right"] { float: none !important; width: 100% !important; text-align: left !important; margin-bottom: 1rem !important; } /* Сайдбар */ .span3 { display: block !important; position: fixed !important; top: 0 !important; left: 0 !important; bottom: 0 !important; width: 280px !important; max-width: 85% !important; height: 100dvh !important; margin: 0 !important; padding-top: 60px !important; padding-bottom: calc(env(safe-area-inset-bottom, 40px) + 100px) !important; background: var(--color-card) !important; z-index: 1000000 !important; transform: translateX(-105%) !important; transition: none !important; overflow-y: auto !important; border-radius: 0 24px 24px 0 !important; visibility: visible !important; overscroll-behavior: contain !important; } .span3.ready-to-animate { transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; } .span3.mobile-active { transform: translateX(0) !important; box-shadow: 100px 0 100px rgba(0,0,0,0.5) !important; } .mobile-menu-btn { display: block !important; position: fixed !important; bottom: calc(env(safe-area-inset-bottom, 0px) + 20px) !important; left: 50% !important; transform: translateX(-50%) !important; z-index: 1000001 !important; width: 120px !important; height: 48px !important; background: var(--color-accent) !important; color: var(--color-text-primary-invert) !important; border-radius: 24px !important; box-shadow: 0 4px 20px rgba(0,0,0,0.3) !important; transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1) !important; } .mobile-menu-btn.open { left: calc(100vw - 41px) !important; width: 52px !important; height: 52px !important; border-radius: 50% !important; box-shadow: 0 4px 12px rgba(0,0,0,0.3) !important; } .menu-btn-content { position: absolute !important; top: 0 !important; left: 0 !important; right: 0 !important; bottom: 0 !important; display: flex !important; justify-content: center !important; align-items: center !important; gap: 8px !important; transition: opacity 0.3s ease, transform 0.4s cubic-bezier(0.4, 0, 0.2, 1) !important; } .menu-closed { opacity: 1 !important; transform: scale(1) !important; } .menu-open { opacity: 0 !important; transform: scale(0.5) rotate(-90deg) !important; } .mobile-menu-btn.open .menu-closed { opacity: 0 !important; transform: scale(0.5) !important; } .mobile-menu-btn.open .menu-open { opacity: 1 !important; transform: scale(1) rotate(0) !important; } .mobile-menu-btn .material-icons { font-size: 20px !important; } .mobile-menu-btn.open .material-icons { font-size: 24px !important; } .mobile-overlay { position: fixed !important; top: 0 !important; left: 0 !important; right: 0 !important; bottom: 0 !important; background: rgba(0,0,0,0.6) !important; z-index: 999999 !important; opacity: 0; visibility: hidden; transition: none !important; backdrop-filter: blur(4px) !important; -webkit-backdrop-filter: blur(4px) !important; } .mobile-overlay.ready-to-animate { transition: opacity 0.3s ease, visibility 0.3s ease !important; } .mobile-overlay.active { opacity: 1; visibility: visible; } .teach_plan, .slimtab_nice { display: block !important; width: 100% !important; overflow-x: auto !important; -webkit-overflow-scrolling: touch; } .common td, .common th, .teach_plan td, .teach_plan th, .slimtab_nice td, .slimtab_nice th { white-space: nowrap !important; max-width: none !important; } .timetable { display: table !important; width: 100% !important; table-layout: auto !important; } .timetable td { white-space: normal !important; word-wrap: break-word !important; } .pair_num { width: 8.1rem !important; min-width: 8.1rem !important; padding-right: 1rem !important; padding-left: 1.6rem !important; } .pair_teacher { width: 35% !important; padding-left: 0.5rem !important; padding-right: 1.6rem !important; } .timetable-toolbar { display: flex !important; flex-direction: row !important; justify-content: flex-start !important; flex-wrap: nowrap !important; align-items: center !important; overflow-x: auto !important; overflow-y: hidden !important; scrollbar-width: none; -webkit-overflow-scrolling: touch; width: 100% !important; border-radius: 50px !important; padding: 4px !important; gap: 6px !important; margin-bottom: 1.5rem !important; background-color: var(--color-card) !important; background-image: linear-gradient(to right, var(--color-card) 10%, rgba(255,255,255,0) 100%), linear-gradient(to left, var(--color-card) 10%, rgba(255,255,255,0) 100%) !important; background-position: left center, right center !important; background-repeat: no-repeat !important; background-size: 40px 100% !important; background-attachment: scroll !important; } [theme="dark"] .timetable-toolbar { background: linear-gradient(to right, var(--color-card) 30%, rgba(255,255,255,0)) left center / 40px 100% no-repeat local, linear-gradient(to left, var(--color-card) 30%, rgba(255,255,255,0)) right center / 40px 100% no-repeat local, radial-gradient(farthest-side at 0 50%, rgba(0,0,0,0.5), rgba(0,0,0,0)) left center / 15px 100% no-repeat scroll, radial-gradient(farthest-side at 100% 50%, rgba(0,0,0,0.5), rgba(0,0,0,0)) right center / 15px 100% no-repeat scroll !important; background-color: var(--color-card) !important; } .timetable-toolbar::-webkit-scrollbar { display: none; } .timetable-toolbar > * { flex: 0 0 auto !important; min-width: max-content !important; white-space: nowrap !important; display: inline-flex !important; } .timetable-toolbar .toolbar-item, .timetable-toolbar .sync-btn { flex: 0 0 auto !important; min-width: max-content !important; border-radius: 50px !important; padding: 8px 12px !important; font-size: 13px !important; } .sync-btn, .toolbar-item { padding: 0.8rem 1rem !important; background: var(--color-highlight) !important; border-radius: var(--radius-small) !important; } .span9 div[style*="inline-block"] { display: block !important; width: 100% !important; max-width: 100% !important; } .submenu { padding: 4px !important; gap: 6px !important; margin-left: 0 !important; margin-right: 0 !important; } .submenu a:not(.answer-btn-custom), .submenu b { flex: 0 0 auto !important; padding: 0 14px !important; } .wide-table-wrapper { width: 100% !important; overflow-x: auto !important; -webkit-overflow-scrolling: touch !important; margin-bottom: 2rem !important; display: block !important; } .term-table-v6, .session-table-v6 { display: table !important; width: auto !important; min-width: 650px !important; margin-bottom: 0 !important; } .container, .container .row { overflow-x: hidden !important; } } @media (min-width: 961px) { .span3 { position: fixed !important; top: 2rem !important; bottom: 2rem !important; width: var(--width-aside) !important; margin: 0 !important; padding-top: 0 !important; padding-bottom: 0.5rem !important; overflow-x: hidden !important; overflow-y: auto !important; float: none !important; background: var(--color-card) !important; border-radius: var(--radius-large) !important; z-index: 100 !important; } } .span3 > .nav.nav-tabs.nav-stacked > li > a, .span3 > .nav.nav-tabs.nav-stacked > li > a * { color: var(--color-text-primary) !important; font-weight: normal !important; background: transparent !important; border: none !important; } .span3 > .nav.nav-tabs.nav-stacked > li.active > a { background-color: var(--color-accent) !important; color: var(--color-text-primary-invert) !important; font-weight: 600 !important; margin: 0 12px 4px 12px !important; border-radius: var(--radius-small) !important; width: auto !important; box-shadow: 0 4px 12px rgba(0,0,0,0.15) !important; } .span3 > .nav.nav-tabs.nav-stacked > li.active > a, .span3 > .nav.nav-tabs.nav-stacked > li.active > a:hover { background-color: var(--color-accent) !important; box-shadow: 0 4px 12px rgba(0,0,0,0.15) !important; margin: 0 12px 4px 12px !important; border-radius: var(--radius-small) !important; width: auto !important; } .span3 > .nav.nav-tabs.nav-stacked > li.active > a, .span3 > .nav.nav-tabs.nav-stacked > li.active > a *, .span3 > .nav.nav-tabs.nav-stacked > li.active > a font { color: var(--color-text-primary-invert) !important; font-weight: 700 !important; text-shadow: none !important; } .span3 > .nav.nav-tabs.nav-stacked > li.active > a .material-icons { color: var(--color-text-primary-invert) !important; opacity: 1 !important; } .span3 > .nav.nav-tabs.nav-stacked > .active:before { display: none !important; } @media (hover: hover) { .span3 > .nav.nav-tabs.nav-stacked > li:not(.active) > a:hover { background: var(--color-highlight) !important; margin: 0 12px 4px 12px !important; border-radius: var(--radius-small) !important; width: auto !important; } .timetable-toolbar .toolbar-item:hover, .submenu a:hover, button:hover, .cgrldatarow:hover, table tbody tr:hover td { background-color: var(--color-highlight) !important; } } .mobile-menu-btn { font-weight: 800 !important; letter-spacing: 0.5px !important; } .span3 > .nav.nav-tabs.nav-stacked > li > a > .badge { display: none !important; } .span3 > .nav.nav-tabs.nav-stacked > li > a > .badge { display: none !important; } .span3 li.warn_menu, .span3 li.warn_menu a { background: transparent !important; color: var(--color-text-primary) !important; } /* --- TIMETABLE SEPARATORS --- */ .timetable td { border: none !important; vertical-align: middle !important; padding-top: 1rem !important; padding-bottom: 1rem !important; position: relative !important; } .timetable .pair_num { border-bottom: none !important; } .timetable .pair_info { text-align: left !important; } .timetable .pair_num { text-align: center !important; } .timetable .pair_teacher { text-align: right !important; } .timetable td.pair_info { padding-left: 0 !important; } .timetable .pair_teacher .eval { opacity: 0; visibility: hidden; transition: opacity var(--transition), visibility var(--transition); display: block; font-size: 1.1rem !important; } .timetable tr:hover .pair_teacher .eval { opacity: 1; visibility: visible; } .timetable .pair_num { width: 8.5rem !important; padding-left: 1rem !important; padding-right: 1rem !important; } /* --- VIDEO CALL STYLING (ZOOM, TELEMOST, GENERIC) --- */ .pair_info .aud a[href*="zoom"], .pair_info .aud a[href*="telemost"], .pair_info .aud a.btn-generic-online { display: inline-flex !important; align-items: center !important; justify-content: center !important; gap: 0.6rem !important; padding: 0.5rem 1.4rem 0.5rem 1.5rem !important; border-radius: 50px !important; text-decoration: none !important; font-weight: 700 !important; font-size: 1.2rem !important; line-height: 1 !important; transition: all 0.2s !important; margin: 0 !important; } /* ZOOM (Синий) */ .pair_info .aud a[href*="zoom"] { background: rgba(45, 140, 255, 0.12) !important; color: #2D8CFF !important; border: 1px solid rgba(45, 140, 255, 0.2) !important; } .pair_info .aud a[href*="zoom"]:hover { background: rgba(45, 140, 255, 0.2) !important; transform: translateY(-1px); } .pair_info .aud a[href*="zoom"]:before { content: 'public' !important; font-family: 'Material Icons Outlined' !important; font-size: 1.8rem !important; display: block !important; } .pair_info .aud a[href*="zoom"] img { display: none !important; } /* ЯНДЕКС ТЕЛЕМОСТ (Оранжевый) */ .pair_info .aud a[href*="telemost"] { background: rgba(255, 149, 0, 0.12) !important; color: #FF9500 !important; border: 1px solid rgba(255, 149, 0, 0.2) !important; } .pair_info .aud a[href*="telemost"]:hover { background: rgba(255, 149, 0, 0.2) !important; transform: translateY(-1px); } .pair_info .aud a[href*="telemost"]:before { content: 'public' !important; font-family: 'Material Icons Outlined' !important; font-size: 1.8rem !important; display: block !important; } /* ДРУГИЕ ОНЛАЙН ССЫЛКИ (Фиолетовая капсула) */ .pair_info .aud a.btn-generic-online { background: rgba(175, 82, 222, 0.12) !important; color: #AF52DE !important; border: 1px solid rgba(175, 82, 222, 0.2) !important; } .pair_info .aud a.btn-generic-online:hover { background: rgba(175, 82, 222, 0.2) !important; transform: translateY(-1px); } .pair_info .aud a.btn-generic-online:before { content: 'public' !important; font-family: 'Material Icons Outlined' !important; font-size: 1.8rem !important; display: block !important; } /* --- DATE STYLING --- */ .week-date-styled { display: table !important; margin: 2.4rem auto 0 auto !important; padding: 0.6rem 1.6rem !important; background: var(--color-card) !important; border-radius: 2rem !important; box-shadow: var(--shadow-main) !important; color: var(--color-text-secondary) !important; font-size: 1.3rem !important; font-weight: 500 !important; text-align: center !important; margin-top: 1.5rem !important; } /* --- LOGIN HELP BUTTON --- */ .login-help-icon { width: 2.4rem !important; height: 2.4rem !important; border-radius: 50% !important; border: 1.5px solid var(--color-text-secondary) !important; color: var(--color-text-secondary) !important; display: flex !important; align-items: center !important; justify-content: center !important; cursor: pointer !important; font-weight: bold !important; font-size: 1.4rem !important; transition: all 0.2s !important; } .login-help-icon:hover { color: var(--color-accent) !important; border-color: var(--color-accent) !important; background: var(--color-highlight) !important; } .login-help-dropdown { display: none !important; position: absolute !important; top: 3.5rem !important; right: 0 !important; width: 30rem !important; background: var(--color-card) !important; box-shadow: var(--shadow-dialog) !important; padding: 1.6rem !important; border-radius: var(--radius-medium) !important; font-size: 1.2rem !important; color: var(--color-text-primary) !important; line-height: 1.5 !important; z-index: 20 !important; } .login-help-dropdown.active { display: block !important; } .login-help-dropdown p { margin-bottom: 1rem !important; } .login-help-dropdown p:last-child { margin-bottom: 0 !important; } .login-help-container { position: fixed !important; top: 2rem !important; right: 2rem !important; z-index: 1000 !important; } .button span { border: none !important; text-shadow: none !important; padding: 0 !important; } .login-actions button { border-radius: var(--radius-large) !important; font-weight: 600 !important; } input::placeholder { color: var(--color-text-secondary) !important; opacity: 1 !important; } /* Логотип ЕТИС в сайдбаре */ .sidebar-logo { display: flex !important; align-items: center !important; padding: 2.2rem 2.2rem 0.5rem 2.2rem !important; gap: 10px !important; margin-bottom: 2.4rem !important; position: relative !important; transition: transform 0.5s cubic-bezier(0.68, -0.6, 0.32, 1.6) !important; cursor: pointer; transform-origin: center bottom; } .sidebar-logo img { height: 3.5rem !important; width: auto !important; flex-shrink: 0 !important; transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) !important; } .sidebar-logo span { font-size: 3.2rem !important; font-weight: 800 !important; color: var(--color-text-primary) !important; letter-spacing: 0.5px !important; line-height: 1 !important; } [theme="dark"] .sidebar-logo img { filter: invert(1) brightness(2); } .logo-say-hey { position: absolute; left: 45px; top: 55px; font-size: 1.2rem; font-weight: 900; color: var(--color-accent); background: var(--color-card); padding: 2px 8px; border-radius: 8px; box-shadow: var(--shadow-main); opacity: 0; transform: translateY(5px); transition: all 0.3s ease; pointer-events: none; z-index: 10; } .logo-say-hey.active { opacity: 1; transform: translateY(0); } /* Выпадающая карточка синхронизации в расписании */ .sync-card { background: var(--color-card) !important; border-radius: var(--radius-medium) !important; padding: 2rem !important; margin-bottom: 2rem !important; box-shadow: var(--shadow-main) !important; font-size: 1.3rem !important; line-height: 1.6 !important; color: var(--color-text-primary) !important; animation: fadeIn 0.2s ease; } .sync-card h3 { margin-top: 0 !important; margin-bottom: 1.4rem !important; font-size: 1.4rem !important; font-weight: bold !important; } .sync-card p { margin-bottom: 1.6rem !important; color: var(--color-text-secondary) !important; } .sync-card #calendar { display: flex !important; flex-wrap: wrap !important; gap: 1rem !important; align-items: center !important; } .sync-card #calendar input[type="text"] { flex: 1 !important; min-width: 250px !important; margin: 0 !important; } .sync-card #calendar button { margin: 0 !important; } @keyframes fadeIn { from { opacity: 0; transform: translateY(-5px); } to { opacity: 1; transform: translateY(0); } } /* --- MESSAGES REFINEMENT --- */ /* Пагинация (страницы) */ .message-pages { justify-content: center !important; gap: 1rem !important; margin: 2rem 0 !important; } /* Скрываем текст "Страницы" */ .message-pages li:first-child { display: none !important; } /* Оформление вложений (файлов) */ .file-attachment-link { display: inline-flex !important; align-items: center !important; gap: 6px !important; background: var(--color-highlight) !important; padding: 8px 14px !important; border-radius: 20px !important; text-decoration: none !important; color: var(--color-text-primary) !important; font-size: 1.2rem !important; border: 1px solid var(--color-table-border) !important; transition: all 0.2s !important; max-width: 300px !important; overflow: hidden !important; } .file-attachment-link .material-icons { color: var(--color-accent) !important; } .file-attachment-link span.file-name { white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important; display: block !important; } .file-attachment-link:hover { background: var(--color-highlight-light) !important; } .answer-btn-custom { background: var(--color-accent) !important; color: var(--color-text-primary-invert) !important; border-radius: 20px !important; padding: 8px 18px !important; font-weight: 600 !important; font-size: 1.2rem !important; cursor: pointer !important; border: none !important; white-space: nowrap !important; display: inline-flex !important; align-items: center !important; flex-shrink: 0 !important; } .answer-btn-custom:hover { background: var(--color-accent-dark, #0056b3) !important; color: var(--color-text-primary-invert) !important; opacity: 0.9; } .message-footer { display: flex !important; flex-wrap: nowrap !important; align-items: center !important; gap: 10px !important; margin-top: 14px !important; padding-top: 0 !important; border-top: none !important; } .file-attachment-link:hover { background: var(--color-highlight-light) !important; transform: translateY(-1px) !important; } /* Кнопка ответа */ .answer-wrapper { margin-top: 1.6rem !important; padding-top: 1.6rem !important; border-top: 1px solid var(--color-table-border) !important; } .answer-wrapper button { background: var(--color-accent) !important; color: var(--color-text-primary-invert) !important; border-radius: 2rem !important; padding: 1rem 2rem !important; font-weight: 600 !important; } /* Текстовое поле ответа */ .nav.msg textarea { width: 100% !important; border-radius: var(--radius-medium) !important; padding: 1.2rem !important; margin-bottom: 1rem !important; border: 1px solid var(--color-table-border) !important; background: var(--color-input) !important; } /* --- REPLY FORM STYLING --- */ /* Контейнер формы */ div[id^="frm_"] { margin-top: 1.5rem !important; padding: 1.5rem !important; background: var(--color-highlight) !important; border-radius: var(--radius-medium) !important; animation: fadeInReply 0.3s ease-out !important; } @keyframes fadeInReply { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } /* Текстовое поле */ div[id^="frm_"] textarea { width: 100% !important; min-height: 120px !important; padding: 12px !important; border-radius: var(--radius-small) !important; border: 1px solid var(--color-table-border) !important; background: var(--color-card) !important; color: var(--color-text-primary) !important; font-family: inherit !important; font-size: 1.3rem !important; resize: vertical !important; margin-bottom: 12px !important; transition: border-color 0.2s !important; box-shadow: none !important; } div[id^="frm_"] textarea:focus { border-color: var(--color-accent) !important; outline: none !important; } /* Вспомогательный текст про файлы */ .reply-helper-text { display: block !important; font-size: 1.1rem !important; color: var(--color-text-secondary) !important; margin-bottom: 15px !important; line-height: 1.4 !important; } /* Кнопка "Отправить ответ" */ .send-reply-btn { background: var(--color-accent) !important; color: var(--color-text-primary-invert) !important; border-radius: 24px !important; padding: 10px 20px !important; font-weight: 600 !important; font-size: 1.3rem !important; border: none !important; cursor: pointer !important; transition: opacity 0.2s !important; } .send-reply-btn:hover { opacity: 0.9 !important; } /* --- SIDEBAR FOOTER --- */ .sidebar-footer { position: relative !important; padding: 1.6rem 2.6rem !important; font-size: 1.1rem !important; color: var(--color-text-secondary) !important; line-height: 1.5 !important; border-top: none !important; margin-top: 0 !important; } /* Рисуем новый аккуратный разделитель с отступами */ .sidebar-footer::before { content: '' !important; position: absolute !important; top: 0 !important; left: 1.6rem !important; right: 1.6rem !important; height: 1px !important; background: var(--color-table-border) !important; } .sidebar-footer a { color: var(--color-text-secondary) !important; text-decoration: underline !important; transition: color 0.2s !important; } .sidebar-footer a:hover { color: var(--color-accent) !important; } /* --- TIMETABLE WINDOWS --- */ .timetable-gap-row td { padding-top: 1rem !important; padding-bottom: 1rem !important; border: none !important; vertical-align: middle !important; } .timetable-gap-capsule { display: inline-flex !important; align-items: center !important; gap: 0.6rem !important; background: var(--color-accent-active) !important; color: var(--color-accent) !important; padding: 0.5rem 1.2rem !important; border-radius: 50px !important; font-size: 1.1rem !important; font-weight: 600 !important; line-height: 1 !important; border: 1px solid var(--color-accent-active) !important; } /* Блок с информацией о пользователе в сайдбаре */ .sidebar-user-info { position: relative !important; padding: 1.6rem 2.6rem !important; font-size: 1.1rem !important; color: var(--color-text-secondary) !important; line-height: 1.5 !important; border-top: none !important; margin-top: auto !important; } /* Рисуем новый аккуратный разделитель с отступами */ .sidebar-user-info::before { content: '' !important; position: absolute !important; top: 0 !important; left: 1.6rem !important; right: 1.6rem !important; height: 1px !important; background: var(--color-table-border) !important; } .sidebar-user-info b { color: var(--color-text-primary) !important; display: block !important; margin-bottom: 4px !important; font-size: 1.2rem !important; } .sidebar-user-info span { display: block !important; margin-left: 0 !important; } /* --- ELECTRONIC RESOURCES --- */ .electr-access-info { width: 100% !important; max-width: 100% !important; background: rgba(0, 139, 210, 0.08) !important; border: 1px dashed var(--color-accent) !important; border-radius: var(--radius-medium) !important; padding: 1.6rem !important; font-size: 1.4rem !important; font-weight: 600 !important; color: var(--color-text-primary) !important; margin-bottom: 2rem !important; box-sizing: border-box !important; } /* Стили заголовков внутри таблицы ресурсов */ #resources th[colspan="3"] { background: var(--color-highlight) !important; color: var(--color-accent) !important; text-align: left !important; padding: 1.2rem 1.6rem !important; font-size: 1.2rem !important; letter-spacing: 0.5px !important; border-bottom: 1px solid var(--color-table-border) !important; } /* Стилизация логинов и паролей для удобства копирования */ #resources td:nth-child(2), #resources td:nth-child(3) { font-family: 'SF Mono', 'Cascadia Code', monospace !important; font-size: 1.2rem !important; color: var(--color-text-primary) !important; } #resources td:first-child a { font-weight: 600 !important; } .day .common { box-shadow: none !important; margin-bottom: 0 !important; } .day .common td { text-align: left !important; } .day .common td:last-child:hover { background: var(--color-accent-active) !important; } .resource-block:first-of-type { margin-top: 3.5rem !important; } .resource-block { margin-bottom: 2.4rem !important; } .electr-description a { font-weight: bold !important; } /* Индикация копирования */ .copy-pass:hover { background-color: var(--color-accent-active) !important; transition: background 0.2s; border-radius: 4px; } .day.resource-block h3 { font-size: 1.6rem !important; font-weight: 700 !important; color: var(--color-text-primary) !important; text-transform: uppercase !important; letter-spacing: 1px !important; padding: 1.8rem !important; margin: 0 !important; } .resource-table { table-layout: fixed !important; width: 100% !important; } /* Колонки: Ресурс (~60%), Логин (~20%), Пароль (~20%) */ .resource-table td:nth-child(1) { width: 60% !important; text-align: left !important; } .resource-table td:nth-child(2) { width: 20% !important; text-align: center !important; } .resource-table td:nth-child(3) { width: 20% !important; text-align: right !important; } /* Особый случай для длинных строк (BOOK.RU) */ .resource-table td[colspan="2"] { text-align: right !important; width: 40% !important; } /* --- РЕКОМЕНДАЦИИ И СОВЕТЫ --- */ .advice-container { display: grid !important; grid-template-columns: 1fr !important; gap: 12px !important; margin-top: 2.4rem !important; } .advice-card { display: flex !important; align-items: center !important; padding: 1.6rem 2rem !important; background: var(--color-card) !important; border-radius: var(--radius-medium) !important; box-shadow: var(--shadow-main) !important; text-decoration: none !important; transition: all 0.2s ease !important; gap: 16px !important; border: 1px solid transparent !important; } .advice-card:hover { transform: translateY(-2px); background: var(--color-highlight) !important; border-color: var(--color-accent-active) !important; } .advice-card .material-icons { font-size: 2.2rem !important; color: var(--color-accent) !important; flex-shrink: 0 !important; } .advice-card .material-icons::before { content: none !important; } .cert-footer-block { background: var(--color-highlight) !important; border-radius: var(--radius-medium) !important; padding: 2rem !important; margin-top: 1.5rem !important; font-size: 1.3rem !important; line-height: 1.6 !important; color: var(--color-text-primary) !important; } .cert-footer-block b, .cert-footer-block strong { color: var(--color-red) !important; } .cert-footer-grid { display: grid !important; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)) !important; gap: 2rem !important; margin-top: 4rem !important; } .cert-footer-card { background: var(--color-card) !important; border-radius: var(--radius-medium) !important; padding: 2.4rem !important; box-shadow: var(--shadow-main) !important; display: flex !important; gap: 1.6rem !important; align-items: flex-start !important; } .cert-footer-card .material-icons { color: var(--color-accent) !important; font-size: 2.4rem !important; flex-shrink: 0 !important; } .cert-footer-card-content { font-size: 1.3rem !important; line-height: 1.6 !important; color: var(--color-text-primary) !important; } .cert-footer-card-content b, .cert-footer-card-content strong { color: var(--color-text-primary) !important; font-weight: 700 !important; } .cert-footer-card-content small { display: block !important; margin-top: 0.8rem !important; color: var(--color-text-secondary) !important; font-size: 1.2rem !important; } .advice-card .advice-label { color: var(--color-text-primary) !important; font-size: 1.4rem !important; font-weight: 500 !important; line-height: 1.4 !important; } /* Иконка PDF и Видео */ .advice-card[href*=".pdf"] .material-icons::before { content: "picture_as_pdf"; } .advice-card[href*=".mp4"] .material-icons::before { content: "play_circle_outline"; } .advice-card:not([href*=".pdf"]):not([href*=".mp4"]) .material-icons::before { content: "article"; } /* Специальный блок для правил выдачи справок */ .cert-alert-box { background: rgba(52, 199, 89, 0.1) !important; border: 1px solid var(--color-green) !important; color: var(--color-text-primary) !important; padding: 1.6rem 2rem !important; border-radius: var(--radius-medium) !important; font-size: 1.3rem !important; line-height: 1.5 !important; margin-bottom: 3rem !important; } /* Иконки для разных типов справок */ .advice-card .icon-new::before { content: "add_circle_outline"; } .advice-card .icon-history::before { content: "assignment_turned_in"; } /* --- SURVEYS --- */ .survey-card { background: var(--color-card) !important; border-radius: var(--radius-large) !important; box-shadow: var(--shadow-main) !important; margin-bottom: 2.5rem !important; padding: 0 !important; overflow: hidden !important; border: none !important; list-style: none !important; } /* Шапка карточки опроса */ .survey-card > li:first-child { background: var(--color-table-header) !important; padding: 1.8rem 5rem 1.8rem 2.4rem !important; border-bottom: 1px solid var(--color-table-border) !important; cursor: pointer !important; position: relative !important; display: block !important; } .survey-card > li:first-child:hover { background: var(--color-highlight) !important; } /* Стрелочка только для опросов */ .survey-card > li:first-child::after { content: 'expand_more' !important; font-family: 'Material Icons Outlined' !important; position: absolute !important; right: 2rem !important; top: 50% !important; transform: translateY(-50%) rotate(0deg) !important; font-size: 2.2rem !important; color: var(--color-text-secondary) !important; transition: transform 0.3s ease !important; } .survey-card > li:first-child.is-open::after { transform: translateY(-50%) rotate(180deg) !important; color: var(--color-accent) !important; } /* Содержимое опроса */ .survey-card > li:nth-child(2) { padding: 2.4rem !important; background: var(--color-card) !important; display: block !important; } /* Скрываем содержимое, если есть класс hide_elem (родной для ETIS) */ .survey-card > li.hide_elem { display: none !important; } /* --- СТИЛИ ДЛЯ ОБЫЧНЫХ СООБЩЕНИЙ (чтобы они не ломались) --- */ .message-card { background: var(--color-card) !important; border-radius: var(--radius-medium) !important; box-shadow: var(--shadow-main) !important; padding: 2rem !important; margin-bottom: 2rem !important; border: none !important; } /* Внутренняя структура истории (Вопрос - Ответ) */ .survey-result-item { margin-bottom: 2rem !important; padding-bottom: 1.5rem !important; border-bottom: 1px solid var(--color-table-border) !important; } .survey-result-item:last-child { border-bottom: none !important; margin-bottom: 0 !important; } .survey-result-q { display: block !important; font-weight: 700 !important; font-size: 1.3rem !important; color: var(--color-text-primary) !important; margin-bottom: 0.8rem !important; } .survey-result-a { color: var(--color-accent) !important; font-weight: 600 !important; font-size: 1.3rem !important; padding-left: 1.2rem !important; border-left: 3px solid var(--color-accent) !important; } /* Текст-заголовок секции */ .survey-intro-text { margin: 4.5rem 0 1.5rem !important; padding: 0 1rem !important; font-size: 1.3rem !important; line-height: 1.5 !important; color: var(--color-text-secondary) !important; font-weight: 600 !important; text-align: left !important; } /* Улучшение форм в карточках */ form.form { background: var(--color-card) !important; border-radius: var(--radius-large) !important; padding: 3.2rem !important; box-shadow: var(--shadow-main) !important; } /* Инпуты на этих страницах */ form.form input[type="text"], form.form input[type="password"] { display: block !important; width: 100% !important; background: transparent !important; border: none !important; border-bottom: 1px solid var(--color-table-border) !important; padding: 1.2rem 0 !important; margin-bottom: 2.4rem !important; border-radius: 0 !important; font-size: 1.5rem !important; color: var(--color-text-primary) !important; transition: border-color 0.2s !important; } form.form input:focus { outline: none !important; border-bottom: 2px solid var(--color-accent) !important; } /* Оформление инфо-блока внизу (Email) */ .electr-description { display: block !important; background: var(--color-highlight) !important; color: var(--color-text-secondary) !important; border-radius: var(--radius-medium) !important; padding: 2.4rem !important; line-height: 1.6 !important; font-size: 1.3rem !important; margin-top: 4rem !important; margin-bottom: 2.4rem !important; width: 100% !important; box-sizing: border-box !important; text-align: center !important; } .electr-description ul { list-style: none !important; margin: 1rem 0 0 0 !important; padding: 0 !important; } .electr-description li { position: relative !important; padding-left: 2rem !important; margin-bottom: 0.8rem !important; } .electr-description div { margin-bottom: 1rem !important; } .electr-description li::before { content: "" !important; position: absolute !important; left: 0.4rem !important; top: 0.8rem !important; width: 6px !important; height: 6px !important; background-color: var(--color-accent) !important; border-radius: 50% !important; } /* Кнопка */ .button_gray { width: 100% !important; margin-top: 1rem !important; } .span9 ul, .span9 li, .electr-description ul, .electr-description li { list-style: none !important; list-style-type: none !important; text-indent: 0 !important; } .form input::placeholder { color: var(--color-text-secondary) !important; opacity: 0.7 !important; } /* --- АНКЕТИРОВАНИЕ --- */ .review-card { background: var(--color-card) !important; border-radius: var(--radius-large) !important; box-shadow: var(--shadow-main) !important; overflow: hidden !important; margin-bottom: 3rem !important; border: none !important; } .review-list { list-style: none !important; margin: 0 !important; padding: 0 !important; } .review-item { display: flex !important; justify-content: space-between !important; align-items: center !important; padding: 1.6rem 2.4rem !important; border-bottom: 1px solid var(--color-table-border) !important; transition: background 0.2s ease !important; gap: 2rem !important; } .review-item:last-child { border-bottom: none !important; } .review-item:hover { background: var(--color-table-highlight) !important; } .review-dis-link { font-size: 1.4rem !important; font-weight: 600 !important; line-height: 1.4 !important; text-decoration: none !important; color: var(--color-text-link) !important; } .review-teacher-info { display: flex !important; align-items: center !important; gap: 0.8rem !important; color: var(--color-text-secondary) !important; font-size: 1.2rem !important; white-space: nowrap !important; flex-shrink: 0 !important; } .review-teacher-info .material-icons { font-size: 1.8rem !important; opacity: 0.7 !important; } /* Адаптация под мобильные */ @media (max-width: 600px) { .review-item { flex-direction: column !important; align-items: flex-start !important; gap: 0.8rem !important; } } /* --- СТРАНИЦА "О РЕСУРСЕ" --- */ .about-card { background: var(--color-card) !important; border-radius: var(--radius-large) !important; box-shadow: var(--shadow-main) !important; padding: 4rem !important; margin-bottom: 3rem !important; max-width: 900px !important; } .about-card p { font-size: 1.5rem !important; line-height: 1.8 !important; color: var(--color-text-primary) !important; margin-bottom: 2.4rem !important; text-align: left !important; } .about-card h2 { margin: 4.5rem 0 2rem 0 !important; font-size: 2.2rem !important; font-weight: 800 !important; color: var(--color-text-primary) !important; line-height: 1.3 !important; letter-spacing: -0.5px !important; } .about-card h2:first-of-type { margin-top: 0 !important; } /* Красивый акцент для первого абзаца */ .about-card p:first-of-type { font-size: 1.6rem !important; color: var(--color-text-secondary) !important; font-style: italic !important; border-left: 4px solid var(--color-accent); padding-left: 2rem; margin-bottom: 4rem !important; } @media (max-width: 768px) { .about-card { padding: 2.4rem !important; } } /* --- ПОРТФОЛИО --- */ /* Контейнер заголовка раздела */ .portfolio-header { display: flex !important; align-items: center !important; background-color: var(--color-card) !important; padding: 1.6rem !important; border-radius: var(--radius-medium) !important; box-shadow: var(--shadow-main) !important; margin-bottom: 1rem !important; cursor: pointer !important; border: 1px solid var(--color-table-border) !important; height: auto !important; justify-content: space-between !important; } .portfolio-header a.dashed { font-size: 1.4rem !important; font-weight: 700 !important; color: var(--color-text-primary) !important; text-decoration: none !important; border: none !important; } .portfolio-header a.dashed { white-space: normal !important; word-wrap: break-word !important; line-height: 1.4 !important; border-bottom: none !important; text-align: left !important; flex: 1 1 auto !important; margin-right: 1rem !important; display: block !important; } /* Бейдж-счетчик */ .portfolio-count { margin-left: auto !important; background: var(--color-accent-active) !important; color: var(--color-accent) !important; padding: 0.3rem 1rem !important; border-radius: 2rem !important; font-size: 1.1rem !important; font-weight: 800 !important; pointer-events: none !important; } .portfolio-count { flex-shrink: 0 !important; margin-left: 0 !important; margin-right: 0.5rem !important; } /* Иконка стрелочки в конце */ .portfolio-header::after { content: 'expand_more' !important; font-family: 'Material Icons Outlined' !important; font-size: 2.2rem !important; color: var(--color-text-secondary) !important; margin-left: 1.5rem !important; } .portfolio-header::after { flex-shrink: 0 !important; margin-left: 0 !important; } div[id="pub"], div[id="pis"], div[id="agr"], div[id="ooo"], div[id="saw"], div[id="vkr"] { background: transparent !important; border: none !important; box-shadow: none !important; padding: 0 !important; margin-top: 10px !important; margin-bottom: 3rem !important; } /* Стилизация таблицы внутри раскрытого блока */ div[id] table.common { box-shadow: var(--shadow-main) !important; background: var(--color-card) !important; border-radius: var(--radius-medium) !important; overflow: hidden !important; margin-top: 1rem !important; } /* Иконка загрузки файла в таблице */ .icon-load-doc-new { font-family: 'Material Icons Outlined' !important; font-size: 2.2rem !important; color: var(--color-accent) !important; cursor: pointer !important; transition: transform 0.2s !important; display: inline-block !important; vertical-align: middle !important; } .icon-load-doc-new:hover { transform: scale(1.2); } span[id$="_cnt"] { display: none !important; } /* --- UI DIALOG REBORN (MODAL WINDOW) --- */ /* Контейнер самого окна */ .ui-dialog { background: var(--color-card) !important; border: none !important; border-radius: var(--radius-large) !important; box-shadow: var(--shadow-dialog) !important; padding: 0 !important; overflow: hidden !important; z-index: 1000002 !important; } /* Шапка окна */ .ui-widget-header { background: var(--color-table-header) !important; border: none !important; border-bottom: 1px solid var(--color-table-border) !important; padding: 1.6rem 2.4rem !important; border-radius: 0 !important; } .ui-dialog .ui-dialog-title { font-size: 1.6rem !important; font-weight: 700 !important; color: var(--color-text-primary) !important; margin: 0 !important; } /* Кнопка закрытия (крестик) */ .ui-dialog .ui-dialog-titlebar-close { position: absolute !important; right: 12px !important; top: 50% !important; transform: translateY(-50%) !important; width: 30px !important; height: 30px !important; padding: 0 !important; margin: 0 !important; border: none !important; background: var(--color-highlight) !important; border-radius: 50% !important; cursor: pointer !important; font-size: 0 !important; color: transparent !important; text-indent: -9999px !important; overflow: visible !important; display: block !important; } .ui-dialog .ui-dialog-titlebar-close span, .ui-dialog .ui-dialog-titlebar-close .ui-icon, .ui-dialog .ui-dialog-titlebar-close .ui-button-icon-primary { display: none !important; } .ui-dialog .ui-dialog-titlebar-close::after { content: 'close' !important; font-family: 'Material Icons Outlined' !important; font-size: 20px !important; color: var(--color-text-secondary) !important; /* СБРОС И ЦЕНТРИРОВАНИЕ */ position: absolute !important; top: 50% !important; left: 50% !important; transform: translate(-50%, -50%) !important; display: block !important; text-indent: 0 !important; visibility: visible !important; line-height: 1 !important; width: 20px !important; height: 20px !important; text-align: center !important; text-transform: none !important; } .ui-dialog .ui-dialog-titlebar-close:hover { background: var(--color-accent-active) !important; } .ui-dialog .ui-dialog-titlebar-close:hover::after { color: var(--color-accent) !important; } .ui-dialog .ui-dialog-titlebar-close * { display: none !important; } .ui-dialog .ui-dialog-titlebar-close::before { content: '\e5cd' !important; font-family: 'Material Icons Outlined' !important; font-size: 20px !important; color: var(--color-text-secondary) !important; display: block !important; visibility: visible !important; line-height: 1 !important; } .ui-dialog .ui-dialog-titlebar-close:before { content: 'close' !important; font-family: 'Material Icons Outlined' !important; font-size: 2.2rem !important; color: var(--color-text-secondary) !important; } .ui-dialog .ui-dialog-titlebar-close .ui-button-icon-primary, .ui-dialog .ui-dialog-titlebar-close .ui-icon { display: none !important; } .ui-dialog .ui-dialog-titlebar-close:after { content: 'close' !important; font-family: 'Material Icons Outlined' !important; font-size: 20px !important; color: var(--color-text-secondary) !important; display: block !important; text-indent: 0 !important; } .ui-dialog .ui-dialog-titlebar-close:hover::before { color: var(--color-accent) !important; } .ui-dialog .ui-dialog-titlebar-close:active { transform: translateY(-50%) scale(0.9) !important; } .ui-dialog .ui-dialog-titlebar-close:hover:after { color: var(--color-accent) !important; } /* Содержимое окна */ .ui-dialog .ui-dialog-content { padding: 2.4rem !important; background: var(--color-card) !important; color: var(--color-text-primary) !important; font-size: 1.3rem !important; } /* Стилизация формы внутри окна */ #dialog form { margin-top: 2rem !important; padding-top: 2rem !important; border-top: 1px solid var(--color-table-border) !important; display: flex !important; flex-direction: column !important; gap: 1.2rem !important; } #dialog p { margin-bottom: 1rem !important; color: var(--color-text-secondary) !important; } #dialog span { font-weight: 600 !important; color: var(--color-text-primary) !important; } /* Выбор файла (input type="file") */ .fileselect { background: var(--color-input) !important; padding: 1rem !important; border-radius: var(--radius-small) !important; border: 1px dashed var(--color-table-border) !important; width: 100% !important; font-size: 1.2rem !important; cursor: pointer !important; } /* Кнопка "Загрузить" */ #dialog .btn { background: var(--color-accent) !important; color: var(--color-text-primary-invert) !important; border: none !important; border-radius: 50px !important; padding: 1rem 2rem !important; font-weight: 600 !important; cursor: pointer !important; align-self: flex-end !important; transition: opacity 0.2s !important; } #dialog .btn:hover { opacity: 0.9 !important; } /* Затемнение фона (overlay) */ .ui-widget-overlay { background: rgba(0, 0, 0, 0.5) !important; opacity: 1 !important; backdrop-filter: blur(4px) !important; -webkit-backdrop-filter: blur(4px) !important; } /* Таблица файлов внутри модалки (если есть) */ #dialog table { width: 100% !important; box-shadow: none !important; border: 1px solid var(--color-table-border) !important; } /* --- ДОГОВОРЫ --- */ .contracts-container { display: flex !important; flex-direction: column !important; gap: 1.2rem !important; margin-top: 2.5rem !important; } /* Карточка инструкции внизу */ .contract-card.instruction-footer { background: var(--color-card) !important; border: 1px solid var(--color-table-border) !important; box-shadow: none !important; opacity: 0.8; } .contract-card.instruction-footer:hover { opacity: 1; background: var(--color-highlight) !important; } .span9 > h2 { margin-bottom: 1rem !important; } /* Стиль для инструкции внизу страницы договоров */ .contracts-container + .advice-card { margin-top: 4rem !important; background: var(--color-highlight) !important; border: 1px dashed var(--color-table-border) !important; box-shadow: none !important; } .contract-card { display: flex !important; align-items: center !important; padding: 1.6rem 2rem !important; background: var(--color-card) !important; border-radius: var(--radius-medium) !important; box-shadow: var(--shadow-main) !important; text-decoration: none !important; transition: all 0.2s ease !important; gap: 1.6rem !important; border: 1px solid transparent !important; position: relative !important; overflow: hidden !important; } .contract-card:hover { transform: translateY(-2px) !important; background: var(--color-highlight) !important; } /* Иконка документа */ .contract-card .material-icons { font-size: 2.4rem !important; color: var(--color-accent) !important; flex-shrink: 0 !important; } .contract-content { display: flex !important; flex-direction: column !important; gap: 0.4rem !important; flex-grow: 1 !important; } .contract-title { font-size: 1.4rem !important; font-weight: 700 !important; color: var(--color-text-primary) !important; line-height: 1.3 !important; } .contract-meta { font-size: 1.2rem !important; color: var(--color-text-secondary) !important; } /* Статусы */ .contract-status { font-size: 1.1rem !important; font-weight: 800 !important; text-transform: uppercase !important; padding: 0.4rem 1rem !important; border-radius: 2rem !important; letter-spacing: 0.5px !important; } /* Действующий договор */ .contract-card.status-active { border-left: 4px solid var(--color-green) !important; } .contract-card.status-active .contract-status { background: rgba(52, 199, 89, 0.1) !important; color: var(--color-green) !important; } /* Расторгнутый договор */ .contract-card.status-terminated { opacity: 0.7 !important; } .contract-card.status-terminated .contract-status { background: var(--color-highlight) !important; color: var(--color-text-secondary) !important; } /* Инструкция (PDF) сверху */ .instruction-card-wrapper { margin-bottom: 3rem !important; } /* --- ПРИКАЗЫ --- */ .orders-container { display: flex !important; flex-direction: column !important; gap: 1.4rem !important; margin-top: 2rem !important; } .order-card { display: flex !important; align-items: center !important; padding: 1.6rem 2rem !important; background: var(--color-card) !important; border-radius: var(--radius-medium) !important; box-shadow: var(--shadow-main) !important; text-decoration: none !important; transition: all 0.2s ease !important; gap: 1.8rem !important; border: 1px solid transparent !important; } .order-card:hover { transform: translateX(5px) !important; background: var(--color-highlight) !important; border-color: var(--color-accent-active) !important; } .order-icon-box { width: 4.2rem !important; height: 4.2rem !important; background: var(--color-accent-active) !important; border-radius: 1.2rem !important; display: flex !important; align-items: center !important; justify-content: center !important; flex-shrink: 0 !important; } .order-icon-box .material-icons { color: var(--color-accent) !important; font-size: 2.2rem !important; } .order-info { display: flex !important; flex-direction: column !important; gap: 0.4rem !important; flex-grow: 1 !important; } .order-meta { font-size: 1.1rem !important; font-weight: 700 !important; color: var(--color-text-secondary) !important; text-transform: uppercase !important; letter-spacing: 0.5px !important; } .order-title { font-size: 1.4rem !important; font-weight: 500 !important; color: var(--color-text-primary) !important; line-height: 1.4 !important; } /* Стили для разных типов */ .order-card[data-type="благодарность"] .order-icon-box { background: rgba(255, 204, 0, 0.15) !important; } .order-card[data-type="благодарность"] .order-icon-box .material-icons { color: #FF9500 !important; } /* --- БЛАНКИ --- */ .forms-grid { display: grid !important; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)) !important; gap: 1.2rem !important; margin: 1.6rem 0 3rem 0 !important; } .form-card { background: var(--color-card) !important; padding: 1.4rem 1.6rem !important; border-radius: var(--radius-medium) !important; box-shadow: var(--shadow-main) !important; display: flex !important; align-items: center !important; gap: 1.2rem !important; text-decoration: none !important; transition: all 0.2s ease !important; border: 1px solid transparent !important; } .form-card:hover { transform: translateY(-2px) !important; background: var(--color-highlight) !important; border-color: var(--color-accent-active) !important; } .form-icon-box { width: 4rem !important; height: 4rem !important; border-radius: 1rem !important; display: flex !important; align-items: center !important; justify-content: center !important; flex-shrink: 0 !important; } .form-name { font-size: 1.3rem !important; font-weight: 500 !important; color: var(--color-text-primary) !important; line-height: 1.4 !important; flex-grow: 1 !important; } .form-badges { display: flex !important; gap: 0.4rem !important; margin-left: auto !important; } /* Цвета по типам файлов */ .type-word { background: rgba(43, 87, 154, 0.1) !important; color: #2b579a !important; } .type-excel { background: rgba(33, 115, 70, 0.1) !important; color: #217346 !important; } .type-pdf { background: rgba(244, 15, 2, 0.1) !important; color: #f40f02 !important; } .badge-ext { font-size: 0.9rem !important; font-weight: 800 !important; padding: 0.2rem 0.5rem !important; border-radius: 0.5rem !important; background: var(--color-body) !important; color: var(--color-text-secondary) !important; border: 1px solid var(--color-table-border) !important; } /* Стилизация заголовков секций (h3) */ .span9 > h3 { margin-top: 3rem !important; font-size: 1.6rem !important; font-weight: 700 !important; color: var(--color-text-primary) !important; } /* --- DETAILED TEACH PLAN --- */ /* Контейнер для карточек триместров */ .calendar-grid { display: grid !important; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)) !important; gap: 1.6rem !important; margin: 2rem 0 4rem !important; } .calendar-card { background: var(--color-card) !important; border-radius: var(--radius-medium) !important; box-shadow: var(--shadow-main) !important; padding: 2rem !important; border: 1px solid var(--color-table-border) !important; } .calendar-event { display: flex !important; gap: 1.2rem !important; margin-bottom: 0.8rem !important; font-size: 1.25rem !important; line-height: 1.4 !important; align-items: flex-start !important; } .calendar-event .date-range { color: var(--color-accent) !important; font-weight: 700 !important; white-space: nowrap !important; flex-shrink: 0 !important; width: 14.5rem !important; } .calendar-event .event-desc { color: var(--color-text-primary) !important; } .calendar-card h4 { color: var(--color-text-primary) !important; border-bottom: 1px solid var(--color-table-border) !important; padding-bottom: 1rem !important; margin-bottom: 1.5rem !important; font-size: 1.3rem !important; } /* Обертка для очень широких таблиц */ .wide-table-wrapper { width: 100% !important; overflow-x: auto !important; -webkit-overflow-scrolling: touch !important; margin-bottom: 3rem !important; border-radius: var(--radius-medium) !important; box-shadow: var(--shadow-main) !important; } .wide-table-wrapper table { margin-bottom: 0 !important; box-shadow: none !important; min-width: 800px !important; } .teach_plan td font[color="red"] { font-weight: 800 !important; } .teach_plan .bg_bold { background: var(--color-table-header) !important; font-weight: 700 !important; } /* --- TEACHER STATS --- */ nobr { white-space: normal !important; } /* Настройка шапки для таблицы статистики */ .wide-table-wrapper table th[colspan], .wide-table-wrapper table th[rowspan] { font-size: 1rem !important; text-transform: uppercase !important; padding: 0.8rem !important; background: var(--color-table-header) !important; border: 1px solid var(--color-table-border) !important; } td.empty { background: var(--color-body) !important; opacity: 0.3; } /* Чтобы длинные названия дисциплин не растягивали ячейку бесконечно */ .wide-table-wrapper td { min-width: 150px; max-width: 300px; word-wrap: break-word !important; white-space: normal !important; } /* --- ЖУРНАЛ ПОСЕЩЕНИЙ --- */ .jour-container { display: flex !important; flex-direction: column !important; gap: 1.2rem !important; } .jour-card { display: flex !important; align-items: center !important; padding: 1.6rem 2rem !important; background: var(--color-card) !important; border-radius: var(--radius-medium) !important; box-shadow: var(--shadow-main) !important; text-decoration: none !important; transition: all 0.2s ease !important; border: 1px solid transparent !important; gap: 1.6rem !important; } .jour-card:hover { transform: translateX(5px) !important; background: var(--color-highlight) !important; border-color: var(--color-accent-active) !important; } .jour-icon-box { width: 4.2rem !important; height: 4.2rem !important; border-radius: 1.2rem !important; display: flex !important; align-items: center !important; justify-content: center !important; flex-shrink: 0 !important; } .jour-icon-box .material-icons { font-size: 2.2rem !important; } .jour-title { font-size: 1.4rem !important; font-weight: 500 !important; color: var(--color-text-primary) !important; line-height: 1.4 !important; flex-grow: 1 !important; } .jour-badge { font-size: 1.1rem !important; font-weight: 700 !important; text-transform: uppercase !important; padding: 0.4rem 1rem !important; border-radius: 2rem !important; letter-spacing: 0.5px !important; } /* Цвета для разных типов занятий */ .jour-badge-lek { background: rgba(0, 122, 255, 0.1) !important; color: var(--color-blue) !important; } .jour-badge-pract { background: rgba(52, 199, 89, 0.1) !important; color: var(--color-green) !important; } .jour-badge-lab { background: rgba(255, 149, 0, 0.1) !important; color: var(--color-warning) !important; } .jour-badge-default { background: var(--color-highlight) !important; color: var(--color-text-secondary) !important; } /* Адаптация под темную тему */ [theme="dark"] .jour-badge-lek { background: rgba(96, 165, 250, 0.15) !important; color: #60a5fa !important; } [theme="dark"] .jour-badge-pract { background: rgba(52, 211, 153, 0.15) !important; color: #34d399 !important; } [theme="dark"] .jour-badge-lab { background: rgba(251, 191, 36, 0.15) !important; color: #fbbf24 !important; } @media (max-width: 600px) { .jour-card { padding: 1.2rem 1.6rem !important; gap: 1.2rem !important; } .jour-badge { display: none !important; } } /* --- LOGIN MOBILE --- */ @media (max-width: 600px) { .login { width: 100% !important; margin: 0 !important; display: flex !important; justify-content: center !important; } .login form, .form { width: 90% !important; max-width: 360px !important; margin: 0 auto !important; padding: 3.2rem 2.4rem 2.4rem 2.4rem !important; box-sizing: border-box !important; } .login-container { width: 100% !important; display: flex !important; align-items: center !important; justify-content: center !important; min-height: 100vh !important; } .psu-logo { margin-bottom: 1.5rem !important; } .psu-logo::before { height: 9rem !important; margin-bottom: 1rem !important; } .psu-logo::after { font-size: 2.4rem !important; width: 80% !important; } } /* --- ТАБЛИЦА ПОСЕЩЕНИЙ --- */ /* Карточка информации о предмете */ .jour-info-card { background: var(--color-card) !important; border-radius: var(--radius-large) !important; box-shadow: var(--shadow-main) !important; padding: 2.4rem !important; margin-bottom: 2.4rem !important; } .jour-info-header { display: flex !important; flex-direction: column !important; gap: 1rem !important; margin-bottom: 1.6rem !important; padding-bottom: 1.6rem !important; border-bottom: 1px solid var(--color-table-border) !important; } .jour-info-subject { font-size: 1.6rem !important; font-weight: 800 !important; color: var(--color-text-primary) !important; line-height: 1.4 !important; } .jour-info-group { font-size: 1.2rem !important; font-weight: 700 !important; color: var(--color-accent) !important; display: inline-block !important; background: var(--color-accent-active) !important; padding: 0.4rem 1.2rem !important; border-radius: 2rem !important; width: fit-content !important; letter-spacing: 0.5px !important; } .jour-info-teacher { display: flex !important; align-items: center !important; gap: 1.6rem !important; color: var(--color-text-secondary) !important; font-size: 1.2rem !important; line-height: 1.4 !important; } .jour-info-teacher .material-icons { font-size: 2.4rem !important; color: var(--color-text-secondary) !important; background: var(--color-highlight) !important; padding: 1rem !important; border-radius: 50% !important; } .jour-info-teacher strong { display: block !important; font-size: 1.4rem !important; color: var(--color-text-primary) !important; margin-bottom: 0.4rem !important; } /* Обертка для кнопки сохранения */ .jour-save-wrapper { margin-top: 2rem !important; display: flex !important; justify-content: flex-end !important; } /* Стилизация отключенной кнопки сохранения */ .answer-btn-custom:disabled, .answer-btn-custom[disabled] { background: var(--color-highlight) !important; color: var(--color-text-secondary) !important; cursor: not-allowed !important; opacity: 0.7 !important; box-shadow: none !important; } /* Улучшения для самой таблицы посещений */ .wide-table-wrapper table th { white-space: nowrap !important; } .wide-table-wrapper table td { white-space: nowrap !important; } /* --- ЕДИНЫЙ СТИЛЬ СООБЩЕНИЙ И ОБЪЯВЛЕНИЙ --- */ .msg-container { display: flex !important; flex-direction: column !important; gap: 2rem !important; margin-top: 1rem !important; } .msg-card { background: var(--color-card) !important; border-radius: var(--radius-large) !important; box-shadow: var(--shadow-main) !important; padding: 2.4rem !important; border: none !important; margin-bottom: 2rem !important; } .msg-header { display: flex !important; justify-content: space-between !important; align-items: flex-start !important; gap: 1.6rem !important; margin-bottom: 1.6rem !important; } .msg-sender { font-size: 1.4rem !important; font-weight: 700 !important; color: var(--color-accent) !important; display: flex !important; align-items: center !important; gap: 0.8rem !important; line-height: 1.3 !important; } .msg-sender .material-icons { font-size: 2rem !important; color: var(--color-accent) !important; } .msg-date { font-size: 1.2rem !important; color: var(--color-text-secondary) !important; white-space: nowrap !important; font-weight: 500 !important; padding-top: 0.2rem !important; } .msg-subject { font-size: 1.5rem !important; font-weight: 800 !important; color: var(--color-text-primary) !important; margin-bottom: 1.2rem !important; line-height: 1.4 !important; } .msg-body { font-size: 1.4rem !important; line-height: 1.6 !important; color: var(--color-text-primary) !important; word-wrap: break-word !important; } .msg-footer { display: flex !important; flex-wrap: wrap !important; align-items: center !important; justify-content: space-between !important; gap: 1.2rem !important; margin-top: 2rem !important; padding-top: 1.6rem !important; border-top: 1px solid var(--color-table-border) !important; } .msg-attachments { display: flex !important; flex-wrap: wrap !important; gap: 1rem !important; flex-grow: 1 !important; } .nav.msg.message-card, .nav.msg.msg-card { margin-bottom: 2rem !important; } /* Пагинация сообщений */ .message-pages { display: flex !important; justify-content: center !important; gap: 1rem !important; margin: 2rem 0 !important; flex-wrap: wrap !important; } .message-pages li:first-child { display: none !important; } /* Кнопка "Поделиться" в сообщениях */ .share-msg-btn { color: var(--color-text-secondary); user-select: none; transition: all 0.2s ease; } .share-msg-btn:hover { color: var(--color-accent) !important; transform: scale(1.15); } /* --- АНТИ-МОРГАНИЕ --- */ .span9 > ul.nav.msg { display: none !important; } /* --- ПРИНУДИТЕЛЬНЫЙ РАЗМЕР ШРИФТА В СООБЩЕНИЯХ --- */ .msg-body { font-size: 1.4rem !important; line-height: 1.6 !important; color: var(--color-text-primary) !important; word-wrap: break-word !important; } .msg-body, .msg-body p, .msg-body span, .msg-body div, .msg-body font { font-size: 1.4rem !important; line-height: 1.6 !important; color: var(--color-text-primary) !important; font-family: inherit !important; } .msg-body a { font-size: 1.4rem !important; color: var(--color-text-link) !important; } /* --- ОТЗЫВЫ И АНКЕТИРОВАНИЕ --- */ form.que_form, form[name="estimate"] { display: flex !important; flex-direction: column !important; gap: 2rem !important; max-width: 800px !important; margin-top: 0 !important; } /* Карточка каждого вопроса */ form.que_form .question, form[name="estimate"] .question { background: var(--color-card) !important; border-radius: var(--radius-large) !important; padding: 2.4rem !important; box-shadow: var(--shadow-main) !important; margin: 0 !important; border: none !important; } /* Текст вопроса */ form.que_form .question > .text, form[name="estimate"] .question > .text { font-size: 1.6rem !important; font-weight: 800 !important; color: var(--color-text-primary) !important; margin-bottom: 1.6rem !important; line-height: 1.4 !important; } /* Список вариантов ответа */ form.que_form .question ul, form[name="estimate"] .question ul { display: flex !important; flex-direction: column !important; gap: 1rem !important; margin: 0 !important; padding: 0 !important; } form.que_form .question li, form[name="estimate"] .question li { margin: 0 !important; } /* Плашка варианта ответа */ form.que_form .question label, form[name="estimate"] .question label { display: flex !important; align-items: center !important; padding: 1.2rem 1.6rem !important; background: var(--color-highlight) !important; border-radius: var(--radius-medium) !important; cursor: pointer !important; transition: all 0.2s !important; font-size: 1.4rem !important; font-weight: 500 !important; color: var(--color-text-primary) !important; border: 1px solid transparent !important; } form.que_form .question label:hover, form[name="estimate"] .question label:hover { background: var(--color-highlight-light) !important; border-color: var(--color-accent-active) !important; transform: translateX(4px) !important; } /* Чекбокс "Анонимно" (Одиночный вопрос) */ form.que_form .question > label[for="anonim"], form[name="estimate"] .question > label[for="anonim"] { display: inline-flex !important; width: fit-content !important; } /* Блок текстового комментария */ form.que_form .comment, form[name="estimate"] .comment { background: var(--color-card) !important; border-radius: var(--radius-large) !important; padding: 2.4rem !important; box-shadow: var(--shadow-main) !important; margin: 0 !important; } form.que_form .comment > label, form[name="estimate"] .comment > label { display: block !important; font-size: 1.6rem !important; font-weight: 800 !important; color: var(--color-text-primary) !important; margin-bottom: 1.6rem !important; } form.que_form .comment > textarea, form[name="estimate"] .comment > textarea { width: 100% !important; min-height: 140px !important; padding: 1.6rem !important; border-radius: var(--radius-medium) !important; border: 1px solid var(--color-table-border) !important; background: var(--color-input) !important; color: var(--color-text-primary) !important; font-size: 1.4rem !important; font-family: inherit !important; line-height: 1.5 !important; resize: vertical !important; transition: all 0.2s !important; } form.que_form .comment > textarea:focus, form[name="estimate"] .comment > textarea:focus { border-color: var(--color-accent) !important; outline: none !important; box-shadow: 0 0 0 3px var(--color-accent-active) !important; } /* Обертка и кнопка "Отправить" */ form.que_form .button_gray, form[name="estimate"] .button_gray { margin-top: 1rem !important; width: 100% !important; text-align: left !important; } form.que_form #send_btn, form[name="estimate"] #send_btn { background: var(--color-accent) !important; color: var(--color-text-primary-invert) !important; border-radius: 50px !important; padding: 1.4rem 3.2rem !important; font-size: 1.5rem !important; font-weight: 700 !important; border: none !important; cursor: pointer !important; transition: all 0.2s !important; box-shadow: 0 4px 12px rgba(0,0,0,0.15) !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; width: fit-content !important; } form.que_form #send_btn:hover:not(:disabled), form[name="estimate"] #send_btn:hover:not(:disabled) { opacity: 0.9 !important; transform: translateY(-2px) !important; } form.que_form #send_btn:disabled, form[name="estimate"] #send_btn:disabled { background: var(--color-highlight) !important; color: var(--color-text-secondary) !important; cursor: not-allowed !important; box-shadow: none !important; transform: none !important; } form.que_form select, form[name="estimate"] select { margin-left: 1.2rem !important; padding: 0.6rem 3rem 0.6rem 1.2rem !important; font-size: 1.3rem !important; border-radius: var(--radius-small) !important; background-color: var(--color-card) !important; border: 1px solid var(--color-table-border) !important; color: var(--color-text-primary) !important; cursor: pointer !important; appearance: none !important; background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e") !important; background-repeat: no-repeat !important; background-position: right 1rem center !important; background-size: 1em !important; } /* --- ТАБЛИЦА ОЦЕНКИ ЗАНЯТИЯ (ДЛЯ МОБИЛЬНЫХ) --- */ .question-table-wrapper { width: 100% !important; overflow-x: auto !important; -webkit-overflow-scrolling: touch !important; border-radius: var(--radius-large) !important; box-shadow: var(--shadow-main) !important; background: var(--color-card) !important; margin-bottom: 0 !important; } table.question_table { width: 100% !important; min-width: 850px !important; /* Форсируем ширину для свайпа */ margin: 0 !important; box-shadow: none !important; border-radius: 0 !important; } table.question_table td.answer_text { font-weight: 600 !important; color: var(--color-text-secondary) !important; font-size: 1.1rem !important; text-transform: uppercase !important; line-height: 1.3 !important; padding: 1.2rem 1rem !important; text-align: center !important; vertical-align: middle !important; } table.question_table td.text { font-weight: 600 !important; color: var(--color-text-primary) !important; font-size: 1.3rem !important; padding: 1.6rem !important; } table.question_table td.answer_cell { text-align: center !important; vertical-align: middle !important; padding: 1rem !important; } table.question_table td.answer_cell label { display: inline-flex !important; justify-content: center !important; align-items: center !important; width: 100% !important; height: 100% !important; margin: 0 !important; padding: 1rem !important; cursor: pointer !important; border-radius: 50% !important; } table.question_table td.answer_cell input[type="radio"] { margin: 0 !important; } /* --- ОБРАТНАЯ СВЯЗЬ --- */ .feedback-table { width: 100% !important; margin-top: 1.6rem !important; border: 1px solid var(--color-table-border) !important; border-radius: var(--radius-small) !important; font-size: 1.3rem !important; } .feedback-table td { border-bottom: 1px solid var(--color-table-border) !important; padding: 0.8rem 1.2rem !important; vertical-align: middle !important; } .feedback-table tr:last-child td { border-bottom: none !important; } /* Первая колонка (вопрос) - посветлее */ .feedback-table td:first-child { color: var(--color-text-secondary) !important; font-weight: 500 !important; } /* Вторая колонка (ответ) - потемнее */ .feedback-table td:last-child { color: var(--color-text-primary) !important; font-weight: 600 !important; text-align: right !important; } /* --- РЕЙТИНГ ПРЕПОДАВАТЕЛЕЙ --- */ #rating { width: auto !important; min-width: 1500px !important; border-collapse: separate !important; border-spacing: 0 !important; table-layout: auto !important; } /* Строки факультетов (lvl1) */ #rating tr.lvl1 td { background-color: var(--color-highlight) !important; font-weight: 800 !important; color: var(--color-text-primary) !important; border-top: 2px solid var(--color-table-border) !important; padding-top: 1.4rem !important; padding-bottom: 1.4rem !important; position: sticky !important; left: 0; } /* Первая колонка (Названия кафедр) */ #rating td:first-child, #rating th:first-child { text-align: left !important; min-width: 300px !important; max-width: 400px !important; position: sticky !important; left: 0; z-index: 2; background-color: var(--color-card) !important; border-right: 1px solid var(--color-table-border) !important; } /* Отступ для кафедр */ #rating tr.lvl2 td:first-child { padding-left: 3rem !important; color: var(--color-text-secondary) !important; font-weight: 500 !important; } /* Ячейки с оценками */ #rating td:not(:first-child) { text-align: center !important; padding: 1rem !important; border-bottom: 1px solid var(--color-table-border) !important; min-width: 60px !important; white-space: nowrap !important; } /* Красные оценки */ #rating font[style*="color:#d00"], #rating font[color="#d00"] { color: var(--color-red) !important; font-weight: 800 !important; background: rgba(255, 59, 48, 0.1) !important; padding: 0.4rem 0.8rem !important; border-radius: 6px !important; display: inline-block !important; } #rating b { font-weight: 600 !important; } /* --- MOBILE LOADING STATE --- */ .mobile-menu-btn.is-loading { width: 48px !important; height: 48px !important; border-radius: 50% !important; padding: 0 !important; left: 50% !important; transform: translateX(-50%) !important; } /* Скрываем текст "Меню" в момент загрузки */ .mobile-menu-btn.is-loading .menu-btn-content span:last-child { display: none !important; } /* Гарантируем, что виден только гамбургер */ .mobile-menu-btn.is-loading .menu-closed { opacity: 1 !important; transform: scale(1) !important; } .mobile-menu-btn.is-loading .menu-open { opacity: 0 !important; transform: scale(0.5) !important; } /* --- ПРОПУЩЕННЫЕ ЗАНЯТИЯ --- */ .absence-capsule { display: inline-block !important; padding: 0.4rem 1rem !important; border-radius: 50px !important; font-weight: 700 !important; font-size: 1.2rem !important; white-space: nowrap !important; cursor: help !important; } .absence-capsule.valid { background: rgba(52, 199, 89, 0.15) !important; color: var(--color-green) !important; } .absence-capsule.invalid { background: rgba(255, 59, 48, 0.15) !important; color: var(--color-red) !important; } .absence-summary { display: grid !important; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)) !important; gap: 1.6rem !important; margin-top: 3rem !important; margin-bottom: 2rem !important; } .absence-stat { background: var(--color-card) !important; border-radius: var(--radius-large) !important; padding: 2.4rem !important; box-shadow: var(--shadow-main) !important; display: flex !important; flex-direction: column !important; align-items: center !important; justify-content: center !important; text-align: center !important; border: 1px solid var(--color-table-border) !important; } .absence-stat-val { font-size: 3.6rem !important; font-weight: 800 !important; line-height: 1 !important; margin-bottom: 0.8rem !important; color: var(--color-text-primary) !important; } .absence-stat-label { font-size: 1.2rem !important; font-weight: 600 !important; color: var(--color-text-secondary) !important; text-transform: uppercase !important; letter-spacing: 0.5px !important; } .absence-stat.valid { border-color: rgba(52, 199, 89, 0.3) !important; } .absence-stat.valid .absence-stat-val { color: var(--color-green) !important; } .absence-stat.invalid { border-color: rgba(255, 59, 48, 0.3) !important; } .absence-stat.invalid .absence-stat-val { color: var(--color-red) !important; } /* --- STU.SIGNS (МОИ ОЦЕНКИ) --- */ .gpa-container { display: inline-flex !important; align-items: center !important; gap: 1.2rem !important; margin-bottom: 2.4rem !important; font-size: 1.4rem !important; font-weight: 600 !important; color: var(--color-text-primary) !important; background: var(--color-card) !important; padding: 1.2rem 2rem !important; border-radius: var(--radius-medium) !important; box-shadow: var(--shadow-main) !important; } .gpa-capsule { background: var(--color-accent) !important; color: var(--color-text-primary-invert) !important; padding: 0.4rem 1.6rem !important; border-radius: 50px !important; font-weight: 800 !important; font-size: 1.5rem !important; } .subject-header-flex { display: flex !important; justify-content: space-between !important; align-items: center !important; margin-top: 3.2rem !important; margin-bottom: 1.2rem !important; width: 100% !important; box-sizing: border-box !important; } .subject-header-flex h3 { margin: 0 !important; line-height: 1.4 !important; flex-grow: 1 !important; } .subject-score-capsule { padding: 0.6rem 1.4rem !important; border-radius: 50px !important; font-weight: 800 !important; font-size: 1.4rem !important; white-space: nowrap !important; flex-shrink: 0 !important; margin-left: 1.5rem !important; box-shadow: 0 2px 8px rgba(0,0,0,0.1) !important; } /* --- ОБЩИЕ СТИЛИ ТАБЛИЦ --- */ .wide-table-wrapper table td, .wide-table-wrapper table th, .span9 table.common td, .span9 table.common th { border-left: none !important; border-right: none !important; vertical-align: middle !important; } /* --- СТИЛИ ДЛЯ ПК --- */ @media (min-width: 961px) { /* Глобальный фикс древних оберток ЕТИСа */ .span9 div[style*="inline-block"] { display: block !important; width: 100% !important; max-width: 100% !important; } .wide-table-wrapper { overflow-x: auto !important; border-radius: var(--radius-medium); } .wide-table-wrapper table, .span9 table.common { width: 100% !important; border-collapse: separate !important; border-spacing: 0 !important; table-layout: auto !important; } /* ШАПКА ТАБЛИЦЫ */ .wide-table-wrapper table th, .span9 table.common th { white-space: normal !important; vertical-align: bottom !important; padding: 12px 16px !important; font-size: 1.1rem !important; font-weight: 700 !important; text-transform: uppercase !important; color: var(--color-text-secondary) !important; border-bottom: 1px solid var(--color-table-border) !important; background: var(--color-table-header) !important; height: auto !important; } /* ЯЧЕЙКИ ТЕЛА */ .wide-table-wrapper table td, .span9 table.common td { padding: 14px 16px !important; font-size: 1.3rem !important; line-height: 1.4 !important; height: auto !important; color: var(--color-text-primary) !important; } /* === УМНЫЕ КОЛОНКИ === */ /* Общие отступы для всех таблиц .common */ .span9 table.common td, .span9 table.common th { padding: 1.2rem 1.6rem !important; line-height: 1.4 !important; vertical-align: middle !important; } /* ПРАВИЛА ТОЛЬКО ДЛЯ ТАБЛИЦ ОЦЕНОК (Session & Term) */ .session-table-v6, .term-table-v6 { table-layout: auto !important; } .session-table-v6 td:not(:first-child):not(:last-child), .term-table-v6 td:not(:first-child):not(:last-child) { width: 1% !important; white-space: nowrap !important; min-width: 90px !important; text-align: center !important; } /* Первая колонка в оценках (Предмет/Тема) */ .session-table-v6 td:first-child, .term-table-v6 td:first-child { width: auto !important; white-space: normal !important; font-weight: 600 !important; } .timetable-grid { table-layout: fixed !important; width: 100% !important; } .timetable-grid td { white-space: normal !important; word-wrap: break-word !important; } /* Левая колонка (Время пары) */ .timetable-grid td.pair_num { width: 95px !important; min-width: 95px !important; text-align: center !important; } /* Средняя колонка (Предмет) */ .timetable-grid td.pair_info { width: auto !important; text-align: left !important; padding-left: 1rem !important; } /* Правая колонка (Преподаватель) */ .timetable-grid td.pair_teacher { width: 160px !important; min-width: 140px !important; text-align: right !important; color: var(--color-text-secondary) !important; } } /* Специальные стили для таблицы пропусков */ .span9 table.common.absence-table { table-layout: auto !important; width: 100% !important; min-width: 700px !important; border-collapse: separate !important; } /* Перебиваем глобальные настройки умных колонок */ .span9 table.common.absence-table tr > th, .span9 table.common.absence-table tr > td { white-space: normal !important; word-wrap: break-word !important; vertical-align: middle !important; } /* Развешиваем ширину колонок в процентах (в сумме 100%) */ .span9 table.common.absence-table tr > th:nth-child(1), .span9 table.common.absence-table tr > td:nth-child(1) { width: 5% !important; text-align: center !important; } .span9 table.common.absence-table tr > th:nth-child(2), .span9 table.common.absence-table tr > td:nth-child(2) { width: 15% !important; text-align: center !important; } .span9 table.common.absence-table tr > th:nth-child(3), .span9 table.common.absence-table tr > td:nth-child(3) { width: 35% !important; text-align: left !important; } .span9 table.common.absence-table tr > th:nth-child(4), .span9 table.common.absence-table tr > td:nth-child(4) { width: 25% !important; text-align: left !important; } .span9 table.common.absence-table tr > th:nth-child(5), .span9 table.common.absence-table tr > td:nth-child(5) { width: 20% !important; text-align: left !important; } /* Фикс для заголовков в Библиотеке */ .span9 h3 { background: transparent !important; padding: 0 !important; box-shadow: none !important; border: none !important; } /* Стилизация подзаголовков внутри таблицы (Обязательная / Дополнительная) */ .resource-table .subheader { background: var(--color-table-header) !important; color: var(--color-text-secondary) !important; font-size: 1.1rem !important; text-transform: uppercase !important; letter-spacing: 0.5px !important; font-weight: 700 !important; padding: 1rem !important; } /* --- LIBRARY CATALOG SEARCH --- */ .search-flex-container { display: flex !important; gap: 1.2rem !important; align-items: stretch !important; width: 100% !important; } /* Сброс кривых стилей ЕТИСа */ .width_setter { position: static !important; margin: 0 !important; flex: 1 !important; } .search-flex-container input[type="text"] { position: static !important; width: 100% !important; margin: 0 !important; padding: 1.2rem 1.6rem !important; border-radius: var(--radius-small) !important; background: var(--color-input) !important; border: 1px solid var(--color-table-border) !important; box-shadow: none !important; font-size: 1.4rem !important; } .search-flex-container .answer-btn-custom { padding: 0 2.4rem !important; height: auto !important; flex-shrink: 0 !important; } /* Результаты поиска */ #record_list { margin-top: 2.4rem !important; } /* Фикс для индикатора загрузки */ #record_list img { vertical-align: middle !important; margin-right: 10px !important; } /* --- ТАБЛИЦА РАСПИСАНИЯ --- */ /* Усиливаем приоритет через html[theme], чтобы 100% перебить глобальные правила старой темы */ html[theme] table.timetable-grid, html[theme] .span9 table.common.timetable-grid { table-layout: fixed !important; width: 100% !important; border-spacing: 0 !important; border-collapse: collapse !important; } /* Настройка колонок расписания */ html[theme] .timetable-grid td { padding: 1.2rem 0 !important; white-space: normal !important; word-wrap: break-word !important; } /* 1. Колонка с временем (Левая) */ html[theme] .timetable-grid td.pair_num { width: 90px !important; min-width: 90px !important; text-align: center !important; font-weight: 500 !important; padding-left: 0 !important; padding-right: 0 !important; } /* 2. Колонка с предметом (Центральная) - забирает всё место */ html[theme] .timetable-grid td.pair_info { overflow: visible !important; vertical-align: middle !important; } /* 3. Колонка с преподавателем (Правая) */ html[theme] .timetable-grid td.pair_teacher { width: 160px !important; min-width: 140px !important; text-align: right !important; padding-right: 2rem !important; color: var(--color-text-secondary) !important; position: relative !important; vertical-align: middle !important; padding-top: 1rem !important; padding-bottom: 1rem !important; } html[theme] .timetable-grid td.pair_teacher br { display: none !important; } /* Имя преподавателя: центрируется таблицей, при наведении плавно уезжает вверх */ html[theme] .timetable-grid td.pair_teacher a:not(.eval) { display: inline-block !important; transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; position: relative !important; z-index: 2 !important; line-height: 1.2 !important; } html[theme] .timetable-grid tr:has(td.pair_teacher .eval).tr-needs-space:hover td.pair_teacher a:not(.eval) { transform: translateY(-12px) !important; } html[theme] .timetable-grid tr:has(td.pair_teacher .eval):not(.tr-needs-space):hover td.pair_teacher a:not(.eval) { transform: translateY(-8px) !important; } /* Кнопка "Оценить занятие": висит невидимо в центре ячейки */ html[theme] .timetable-grid td.pair_teacher .eval { position: absolute !important; right: 2rem !important; top: 50% !important; transform: translateY(-50%) scale(0.9) !important; opacity: 0 !important; visibility: hidden !important; transition: all 0.3s ease !important; font-size: 1.05rem !important; display: block !important; z-index: 10 !important; color: var(--color-text-secondary) !important; text-decoration: underline !important; } html[theme] .timetable-grid tr:not(.tr-needs-space):hover td.pair_teacher .eval { opacity: 1 !important; visibility: visible !important; transform: translateY(6px) scale(1) !important; } html[theme] .timetable-grid tr.tr-needs-space:hover td.pair_teacher .eval { opacity: 1 !important; visibility: visible !important; transform: translateY(4px) scale(1) !important; } /* При наведении кнопка появляется и отъезжает вниз, занимая место */ html[theme] .timetable-grid tr:hover td.pair_teacher .eval { opacity: 1 !important; visibility: visible !important; transform: translateY(0) !important; } html[theme] .timetable-grid tr:not(:last-child) { background-image: linear-gradient(to right, transparent 90px, var(--color-table-border) 90px, var(--color-table-border) calc(100% - 1.6rem), transparent calc(100% - 1.6rem) ) !important; background-position: bottom !important; background-repeat: no-repeat !important; background-size: 100% 1px !important; } html[theme] .timetable-grid tr:hover td { background: transparent !important; } /* Фикс для строк с "Окнами" */ html[theme] .timetable-grid tr.timetable-gap-row td { padding-top: 1rem !important; padding-bottom: 1rem !important; } /* Метки типа пары (ЛЕК, ПРАКТ, ЛАБ) */ .pair-type-badge { font-size: 1.05rem !important; font-weight: 800 !important; text-transform: uppercase !important; letter-spacing: 0.5px !important; margin-bottom: 0.6rem !important; line-height: 1 !important; display: block !important; } /* Цвета для разных типов занятий */ .type-badge-lek { color: var(--color-blue) !important; } .type-badge-pract { color: var(--color-green) !important; } .type-badge-lab { color: var(--color-warning) !important; } .type-badge-exam { color: var(--color-red) !important; } .type-badge-holiday { color: #00BFA5 !important; } /* --- АНИМАЦИИ ДЛЯ СТРОК РАСПИСАНИЯ --- */ @keyframes cellScaleIn { 0% { opacity: 0; transform: scale(0.95) translateY(10px); } 100% { opacity: 1; transform: scale(1) translateY(0); } } @keyframes cellScaleOut { 0% { opacity: 1; transform: scale(1) translateY(0); } 100% { opacity: 0; transform: scale(0.95) translateY(-10px); } } /* Анимация для вновь появляющихся "Окон" */ .timetable-gap-row td { animation: cellScaleIn 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards; } /* Анимации, которые будет переключать JS */ .row-animating-in td { animation: cellScaleIn 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards; } .row-animating-out td { animation: cellScaleOut 0.25s ease forwards; } /* --- РАСПИСАНИЕ ДЛЯ МОБИЛЬНЫХ --- */ @media (max-width: 960px) { .span9 .day h3 { padding: 1.2rem 1.4rem !important; font-size: 1.4rem !important; flex-wrap: nowrap !important; } .span9 .day h3 .day-name { white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important; } .span9 .day h3 .day-date { padding: 0 !important; background: transparent !important; font-size: 1.3rem !important; } html[theme] .timetable-grid { table-layout: fixed !important; width: 100% !important; } html[theme] .timetable-grid td.pair_num { width: 75px !important; min-width: 75px !important; padding-left: 1rem !important; padding-right: 0.5rem !important; font-size: 1.1rem !important; } html[theme] .timetable-grid td.pair_info { width: auto !important; padding-left: 0.5rem !important; padding-right: 0.5rem !important; } html[theme] .timetable-grid td.pair_teacher .eval { right: 1.4rem !important; top: 3.8rem !important; } html[theme] .timetable-grid tr:not(:last-child) { background-image: linear-gradient(to right, transparent calc(75px + 0.5rem), var(--color-table-border) calc(75px + 0.5rem), var(--color-table-border) calc(100% - 1.6rem), transparent calc(100% - 1.6rem) ) !important; } } /* ========================================================= */ /* --- УЧЕБНО-МЕТОДИЧЕСКИЙ КОМПЛЕКС (stu.tpr) --- */ /* ========================================================= */ /* Список тем */ .themes { display: flex !important; flex-direction: column !important; gap: 1rem !important; margin-bottom: 3rem !important; } .theme { display: flex !important; align-items: center !important; flex-wrap: wrap !important; gap: 0.8rem !important; line-height: 1.5 !important; } /* Заголовок семестра (верхний уровень) */ .theme[style*="padding-left: 0px"] { margin-top: 1rem !important; margin-bottom: 0.5rem !important; } .theme[style*="padding-left: 0px"] a { font-size: 1.5rem !important; font-weight: 700 !important; color: var(--color-text-primary) !important; } /* Обычные темы (с отступом) */ .theme[style*="padding-left: 25px"] { padding-left: 2rem !important; } .theme a { font-size: 1.4rem !important; color: var(--color-accent) !important; text-decoration: none !important; transition: opacity 0.2s !important; } .theme a:hover { opacity: 0.8 !important; } /* Часы */ .theme .hour { font-size: 1.2rem !important; color: var(--color-text-secondary) !important; } /* --- АКЦЕНТНЫЙ (СИНИЙ) БЕЙДЖ --- */ .badge.ctl { background: var(--color-accent-active) !important; color: var(--color-accent) !important; border: 1px solid var(--color-accent) !important; padding: 0.2rem 0.8rem !important; border-radius: 50px !important; font-size: 1.1rem !important; font-weight: 700 !important; text-transform: uppercase !important; letter-spacing: 0.5px !important; display: inline-flex !important; align-items: center !important; opacity: 0.9 !important; } /* Ссылки на вопросы */ .tpr_part > a { display: inline-flex !important; font-size: 1.4rem !important; color: var(--color-accent) !important; margin-bottom: 2rem !important; text-decoration: none !important; } .tpr_part > a:hover { text-decoration: underline !important; } /* Текстовые блоки показателей оценивания */ .tpr_part > div:not([style]) { font-size: 1.3rem !important; line-height: 1.6 !important; color: var(--color-text-primary) !important; margin-bottom: 0.6rem !important; } /* --- ОБЕРТКА ТАБЛИЦЫ (СКРОЛЛ И ОТСТУПЫ) --- */ .wide-table-wrapper { width: 100% !important; overflow-x: auto !important; -webkit-overflow-scrolling: touch !important; margin-bottom: 3rem !important; border-radius: var(--radius-large) !important; box-shadow: var(--shadow-main) !important; background: var(--color-card) !important; } /* Сама таблица */ .tpr_part table { width: 100% !important; min-width: 600px !important; background: transparent !important; border-collapse: collapse !important; margin: 0 !important; box-shadow: none !important; } .tpr_part table td { padding: 1.6rem 2rem !important; border-bottom: 1px solid var(--color-table-border) !important; font-size: 1.3rem !important; line-height: 1.5 !important; vertical-align: middle !important; color: var(--color-text-primary) !important; white-space: normal !important; word-wrap: break-word !important; } /* Убираем линию у последней строки */ .tpr_part table tr:last-child td { border-bottom: none !important; } /* Первая колонка таблицы (Оценка) */ .tpr_part table td:first-child { width: 25% !important; min-width: 140px !important; font-weight: 700 !important; color: var(--color-text-primary) !important; border-right: 1px solid var(--color-table-border) !important; background: var(--color-highlight) !important; } .tpr_part table td:last-child { color: var(--color-text-secondary) !important; } /* --- ПОИСК ПРЕПОДАВАТЕЛЕЙ --- */ /* Контейнер поиска */ .teacher-search-wrapper { margin: 0 0 2.4rem 0 !important; display: flex !important; justify-content: center !important; width: 100% !important; } /* Капсула */ .search-capsule { display: flex !important; align-items: center !important; position: relative !important; width: 100% !important; height: 40px !important; background: var(--color-card) !important; border: 1px solid var(--color-table-border) !important; border-radius: 22px !important; box-shadow: var(--shadow-main) !important; box-sizing: border-box !important; text-decoration: none !important; } button.search-capsule { justify-content: flex-start !important; padding: 0 10px 0 34px !important; color: var(--color-text-secondary) !important; font-size: 1.4rem !important; font-weight: 400 !important; font-family: inherit !important; cursor: pointer !important; transition: background 0.2s ease !important; } /* Специфика для ИНПУТА внутри капсулы */ .search-capsule input { width: 100% !important; height: 100% !important; background: transparent !important; border: none !important; box-shadow: none !important; padding: 0 10px 0 34px !important; margin: 0 !important; color: var(--color-text-primary) !important; font-size: 1.4rem !important; } .search-capsule input::placeholder { color: var(--color-text-secondary) !important; opacity: 1 !important; } /* Общая иконка */ .search-capsule .material-icons { position: absolute !important; left: 10px !important; top: 50% !important; transform: translateY(-50%) !important; font-size: 20px !important; color: var(--color-text-secondary) !important; pointer-events: none !important; } /* Ховер для кнопки */ button.search-capsule:hover { background: var(--color-highlight) !important; color: var(--color-text-primary) !important; } /* Поле ввода внутри капсулы */ .search-capsule .search-input { width: 100% !important; background: transparent !important; border: none !important; box-shadow: none !important; padding: 0 0 0 32px !important; margin: 0 !important; height: 100% !important; font-size: 1.6rem !important; color: var(--color-text-primary) !important; } /* Сдвигаем лупу чуть левее */ .search-capsule .search-icon { position: absolute !important; left: 12px !important; color: var(--color-text-secondary) !important; font-size: 20px !important; } /* Ссылка статистики внизу */ .stats-link-bottom { display: flex !important; align-items: center !important; justify-content: center !important; gap: 8px !important; margin: 4rem auto 2rem !important; padding: 1.2rem 2rem !important; background: var(--color-highlight) !important; border-radius: 12px !important; color: var(--color-text-secondary) !important; text-decoration: none !important; font-size: 1.3rem !important; width: fit-content !important; transition: all 0.2s ease !important; } .stats-link-bottom:hover { color: var(--color-accent) !important; background: var(--color-accent-active) !important; } /* Список учителей */ .teachers-list { display: flex !important; flex-direction: column !important; gap: 1.6rem !important; } .no-results-msg { text-align: center !important; padding: 3rem !important; color: var(--color-text-secondary) !important; font-size: 1.5rem !important; } /* Фикс для таблиц библиотеки (чтобы текст не наезжал) */ .resource-table td, .common td { white-space: normal !important; word-wrap: break-word !important; } /* Поиск в библиотеке (фикс прозрачности и отступов) */ .library-search-wrap { background: var(--color-card) !important; border: 1px solid var(--color-table-border) !important; border-radius: 50px !important; padding: 6px 6px 6px 20px !important; display: flex !important; align-items: center !important; margin-bottom: 30px !important; box-shadow: var(--shadow-main) !important; } .library-search-wrap input { flex: 1 !important; background: transparent !important; border: none !important; box-shadow: none !important; padding: 8px 0 !important; margin: 0 !important; font-size: 1.4rem !important; color: var(--color-text-primary) !important; } .library-search-wrap .search-icon { margin-right: 10px !important; color: var(--color-text-secondary) !important; } /* Фикс наслоения текста в библиотеке */ .library-subject-block table, #record_list table { table-layout: auto !important; width: 100% !important; } .library-subject-block td, #record_list td { white-space: normal !important; word-wrap: break-word !important; overflow-wrap: break-word !important; line-height: 1.4 !important; vertical-align: top !important; } .span9 .wide-table-wrapper table, .span9 table.resource-table, .span9 table.common { table-layout: auto !important; width: 100% !important; border-collapse: collapse !important; } .span9 .wide-table-wrapper td, .span9 .wide-table-wrapper th { white-space: normal !important; word-break: break-word !important; overflow-wrap: break-word !important; line-height: 1.5 !important; vertical-align: top !important; padding: 12px 10px !important; } /* Колонки: РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА */ .library-subject-block table td:nth-child(1) { width: 70% !important; text-align: left !important; } .library-subject-block table td:nth-child(2) { width: 10% !important; text-align: center !important; } .library-subject-block table td:nth-child(3) { width: 20% !important; text-align: left !important; } /* Колонки: КАТАЛОГ */ #record_list table td:nth-child(1) { width: 65% !important; text-align: left !important; } #record_list table td:nth-child(2) { width: 10% !important; text-align: center !important; } #record_list table td:nth-child(3) { width: 25% !important; text-align: left !important; } /* Сбрасываем фиксированную сетку */ .span9 .wide-table-wrapper table.library-history-table, .span9 .wide-table-wrapper table.resource-table { table-layout: auto !important; width: 100% !important; } /* Принудительный перенос текста для первой колонки (Название книги) */ .span9 .wide-table-wrapper table.library-history-table td:first-child, .span9 .wide-table-wrapper table.resource-table td:first-child, .span9 .wide-table-wrapper table.common td:first-child { white-space: normal !important; word-wrap: break-word !important; overflow-wrap: break-word !important; text-align: left !important; line-height: 1.5 !important; min-width: 250px !important; } /* Колонки с датами (Выданные книги)*/ .span9 table.library-history-table td:not(:first-child) { white-space: nowrap !important; text-align: center !important; width: 120px !important; } /* 1. Точка в сайдбаре (ПК и Мобайл меню) */ .span3 > .nav.nav-tabs.nav-stacked > li > a .badge-point { display: block !important; width: 8px !important; height: 8px !important; min-width: 8px !important; min-height: 8px !important; background-color: #FF3B30 !important; border-radius: 50% !important; margin-left: auto !important; margin-right: 4px !important; flex-shrink: 0 !important; align-self: center !important; border: none !important; box-shadow: 0 0 4px rgba(255, 59, 48, 0.4) !important; } /* Фикс: чтобы во флекс-контейнере текст не выталкивал точку */ .span3 > .nav.nav-tabs.nav-stacked > li > a { display: flex !important; flex-direction: row !important; align-items: center !important; justify-content: flex-start !important; overflow: visible !important; } .sidebar-link-text { flex: 1 1 auto !important; min-width: 0 !important; white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important; } /* 2. Точка на мобильной кнопке (Капсула) */ .mobile-notify-dot { position: absolute !important; top: 50% !important; left: 42px !important; transform: translateY(-160%) scale(0) !important; width: 10px !important; height: 10px !important; background-color: #FF3B30 !important; border-radius: 50% !important; border: 2px solid var(--color-accent) !important; z-index: 100 !important; pointer-events: none !important; opacity: 0 !important; transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) !important; } /* Показ точки при наличии обновлений */ .mobile-menu-btn.has-updates .mobile-notify-dot { opacity: 1 !important; transform: translateY(-160%) scale(1) !important; } /* Скрываем точку, когда меню открыто */ .mobile-menu-btn.open .mobile-notify-dot { display: none !important; } /* Убираем подчеркивание в капсулах-кнопках */ .answer-btn-custom, .answer-btn-custom:hover { text-decoration: none !important; } /* --- LIVE TIMETABLE INDICATORS --- */ @keyframes pulse-live { 0% { transform: scale(0.9); box-shadow: 0 0 0 0 var(--pulse-color); } 70% { transform: scale(1); box-shadow: 0 0 0 6px rgba(0, 0, 0, 0); } 100% { transform: scale(0.9); box-shadow: 0 0 0 0 rgba(0, 0, 0, 0); } } .live-dot { width: 8px; height: 8px; border-radius: 50%; z-index: 10; display: inline-block; } .pair_num .live-dot, .timetable-gap-capsule .live-dot { position: absolute !important; top: 50%; transform: translateY(-50%); } .pair_num .live-dot { right: 8px; } .timetable-gap-capsule .live-dot { right: -14px; } .pair_num { position: relative; } .pair_num .live-dot { right: 8px; top: 50%; margin-top: -4px; position: static !important; transform: none !important; margin: 0 !important; } .timetable-gap-capsule { position: relative; } .timetable-gap-capsule .live-dot { right: -16px; top: 50%; margin-top: -4px; } .live-dot.active { --pulse-color: rgba(52, 199, 89, 0.4); background-color: var(--color-green) !important; animation: pulse-live 2s infinite; } .live-dot.soon { --pulse-color: rgba(255, 204, 0, 0.4); background-color: var(--color-yellow) !important; animation: pulse-live 1.5s infinite; } .live-dot.ending { --pulse-color: rgba(255, 59, 48, 0.4); background-color: var(--color-red) !important; animation: pulse-live 1s infinite; } /* Для заголовка дня подгоняем отступ */ .day-name .live-dot { position: static !important; vertical-align: middle; transform: none; margin-left: 10px; } /* --- ANALYTICS MODAL --- */ .analytics-modal { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%) scale(0.95); background: var(--color-card); border-radius: var(--radius-large); box-shadow: var(--shadow-dialog); z-index: 1000003; width: 90%; max-width: 800px; max-height: 90vh; overflow-y: auto; opacity: 0; visibility: hidden; transition: all 0.2s ease-out; } .analytics-modal.active { opacity: 1; visibility: visible; transform: translate(-50%, -50%) scale(1); } .analytics-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); z-index: 1000002; opacity: 0; visibility: hidden; transition: all 0.2s ease-out; } .analytics-overlay.active { opacity: 1; visibility: visible; } .stat-box { background: var(--color-highlight); padding: 1.6rem; border-radius: var(--radius-medium); display: flex; flex-direction: column; gap: 0.6rem; } .stat-box-title { font-size: 1.15rem; color: var(--color-text-secondary); text-transform: uppercase; font-weight: 700; letter-spacing: 0.5px; } .stat-box-value { font-size: 1.6rem; color: var(--color-text-primary); font-weight: 800; line-height: 1.3;} .stat-box-value.good { color: var(--color-green); } .stat-box-value.bad { color: var(--color-red); } .analytics-btn:hover { transform: scale(1.02); opacity: 0.9; } /* --- LEADERBOARD (ТОП ПРЕДМЕТОВ) --- */ .leaderboard-list { display: flex; flex-direction: column; gap: 1rem; } .leaderboard-item { display: flex; align-items: center; gap: 1.4rem; background: var(--color-highlight); padding: 1.2rem 1.6rem; border-radius: var(--radius-medium); transition: transform 0.2s; } .leaderboard-item:hover { transform: translateX(4px); } .leaderboard-rank { font-size: 1.6rem; font-weight: 800; width: 3.6rem; height: 3.6rem; display: flex; align-items: center; justify-content: center; border-radius: 50%; background: var(--color-card); color: var(--color-text-primary); flex-shrink: 0; box-shadow: var(--shadow-main); } .rank-1 { background: linear-gradient(135deg, #FFD700, #FDB931) !important; color: #fff !important; } .rank-2 { background: linear-gradient(135deg, #E0E0E0, #BDBDBD) !important; color: #fff !important; } .rank-3 { background: linear-gradient(135deg, #FFB870, #CD7F32) !important; color: #fff !important; } .leaderboard-info { flex-grow: 1; min-width: 0; } .leaderboard-name { font-size: 1.3rem; font-weight: 700; color: var(--color-text-primary); white-space: normal; line-height: 1.3; margin-bottom: 0.4rem; } .leaderboard-meta { font-size: 1.2rem; color: var(--color-text-secondary); } /* --- GRADE CALCULATOR (Прогноз оценок) --- */ .subject-score-capsule { position: relative; cursor: help; } .score-tooltip { position: absolute; bottom: 130%; right: 0; transform: translateY(10px); background: #2A2C2F; color: #fff; padding: 0.6rem 1.2rem; border-radius: var(--radius-small); font-size: 1.2rem; font-weight: 600; white-space: nowrap; opacity: 0; visibility: hidden; transition: all 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275); box-shadow: 0 4px 12px rgba(0,0,0,0.2); z-index: 100; pointer-events: none; } .score-tooltip::after { content: ''; position: absolute; top: 100%; right: 20px; border-width: 5px; border-style: solid; border-color: #2A2C2F transparent transparent transparent; } .subject-score-capsule:hover .score-tooltip, .subject-score-capsule:active .score-tooltip { opacity: 1; visibility: visible; transform: translateY(0); } /* --- ЗАМЕТКИ ДЛЯ ПРЕДМЕТОВ (To-Do) --- */ .subject-note-btn { display: inline-flex !important; align-items: center !important; justify-content: center !important; margin-left: 6px !important; padding: 2px !important; width: 24px !important; height: 24px !important; border-radius: 50% !important; cursor: pointer !important; background: transparent !important; border: none !important; box-shadow: none !important; flex-shrink: 0 !important; opacity: 0 !important; visibility: hidden !important; transform: scale(0.8) !important; pointer-events: none !important; transition: all 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275) !important; } .subject-note-btn .material-icons { font-size: 1.6rem !important; margin: 0 !important; } /* При наведении ИЛИ если есть заметка - плавно проявляем */ .timetable-grid tr:hover .subject-note-btn, .subject-note-btn.has-note { opacity: 1 !important; visibility: visible !important; transform: scale(1) !important; pointer-events: auto !important; } /* Цвет для заполненной заметки */ .subject-note-btn.has-note { color: var(--color-warning) !important; } /* Цвет пустой кнопки */ .subject-note-btn:not(.has-note) { color: var(--color-text-secondary) !important; } .subject-note-btn:hover { transform: scale(1.15) !important; color: var(--color-accent) !important; background: var(--color-highlight) !important; } /* Стили текстового поля в модалке */ .note-modal-textarea { width: 100%; min-height: 140px; padding: 1.4rem; border-radius: var(--radius-small); border: 1px solid var(--color-table-border); background: var(--color-input); color: var(--color-text-primary); font-size: 1.4rem; resize: vertical; margin-top: 1rem; font-family: inherit; line-height: 1.5; } .note-modal-textarea:focus { border-color: var(--color-accent); outline: none; box-shadow: 0 0 0 3px var(--color-accent-active); } /* --- Одинаковая высота для капсул тулбара и кружков недель --- */ .timetable-toolbar > *, .timetable-toolbar .toolbar-item, .timetable-toolbar label.toolbar-item, .timetable-toolbar .sync-btn { height: 3.8rem !important; padding: 0 1.6rem !important; box-sizing: border-box !important; } /* Перебиваем старые урезанные отступы на мобильных экранах */ @media (max-width: 960px) { .timetable-toolbar > *, .timetable-toolbar .toolbar-item, .timetable-toolbar label.toolbar-item, .timetable-toolbar .sync-btn { height: 3.8rem !important; padding: 0 1.4rem !important; border-radius: 50px !important; } } /* --- АНИМАЦИЯ И ВЫРАВНИВАНИЕ ИКОНКИ ПОДЕЛИТЬСЯ --- */ .msg-date-wrapper { display: flex !important; align-items: flex-end !important; justify-content: flex-end; } .msg-date-text { line-height: 1 !important; padding-bottom: 1px; } .share-msg-wrap { display: flex; align-items: flex-end; justify-content: center; transition: max-width 0.3s ease, opacity 0.3s ease, margin-left 0.3s ease, transform 0.3s ease; } .share-msg-btn { color: var(--color-text-secondary); cursor: pointer; display: block; transition: color 0.2s ease, transform 0.2s ease; margin-bottom: -1px; } .share-msg-btn:hover { color: var(--color-accent) !important; transform: scale(1.15) translateY(-1px); } @media (hover: hover) and (pointer: fine) { .share-msg-wrap { max-width: 0; opacity: 0; margin-left: 0; transform: translateX(10px); pointer-events: none; } .msg-card:hover .share-msg-wrap { max-width: 24px; opacity: 1; margin-left: 8px; transform: translateX(0); pointer-events: auto; } } /* Логика для смартфонов (иконка всегда видима, так как нет курсора) */ @media (hover: none), (pointer: coarse) { .share-msg-wrap { max-width: 24px; opacity: 1; margin-left: 8px; transform: none; } } /* --- PSEUDO PUSH NOTIFICATIONS --- */ .push-container { position: fixed; z-index: 2000000; display: flex; flex-direction: column; gap: 1.2rem; pointer-events: none; } @media (min-width: 961px) { .push-container { top: 2.5rem; right: 2rem; width: 380px; } } @media (max-width: 960px) { .push-container { top: 1.5rem; left: 1rem; right: 1rem; } .submenu > *:not(:last-child):not(.answer-btn-custom)::after, .weeks .week:not(:last-child)::after { right: -3.5px !important; } } .push-toast { box-sizing: border-box !important; backdrop-filter: blur(18px) saturate(180%) !important; -webkit-backdrop-filter: blur(18px) saturate(180%) !important; background-color: rgba(var(--push-bg-rgb), 0.65) !important; color: var(--color-text-primary); padding: 1.6rem; border-radius: 24px; box-shadow: 0 10px 40px rgba(0,0,0,0.3); border: 1px solid rgba(255, 255, 255, 0.12) !important; width: 100% !important; display: flex; align-items: center; gap: 1.5rem; opacity: 0; transform: scale(0.9) translateY(-20px); transition: all 0.5s cubic-bezier(0.22, 1, 0.36, 1); pointer-events: auto; cursor: pointer; } /* Цвета фона для темной и светлой темы */ [theme="light"] .push-toast { --push-bg-rgb: 255, 255, 255; border-color: rgba(0,0,0,0.05) !important; } [theme="dark"] .push-toast { --push-bg-rgb: 28, 30, 32; } .push-toast.show { opacity: 1; transform: scale(1) translateY(0); } .push-icon-wrap { width: 4.4rem; height: 4.4rem; border-radius: 16px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; box-shadow: inset 0 0 12px rgba(255,255,255,0.05); } .push-icon-wrap .material-icons { font-size: 2.4rem !important; } /* Настройки цветов для типов уведомлений */ .push-toast.info .push-icon-wrap { background: rgba(0, 122, 255, 0.25); color: #007AFF; } .push-toast.success .push-icon-wrap { background: rgba(52, 199, 89, 0.25); color: #34C759; } .push-toast.warning .push-icon-wrap { background: rgba(255, 149, 0, 0.25); color: #FF9500; } .push-content { flex-grow: 1; display: flex; flex-direction: column; gap: 0.2rem; min-width: 0; } .push-toast-title { font-weight: 800; font-size: 1.05rem; text-transform: uppercase; letter-spacing: 1px; color: var(--color-text-primary); opacity: 0.5; } .push-subject { font-size: 1.6rem; font-weight: 700; line-height: 1.2; color: var(--color-text-primary); } .push-detail { font-size: 1.35rem; color: var(--color-text-primary); opacity: 0.7; } .push-toast:hover { transform: translateY(-2px) scale(1.02); background-color: rgba(var(--push-bg-rgb), 0.8) !important; } /* --- ПОЛЬЗОВАТЕЛЬСКИЕ ПАРЫ --- */ .add-custom-pair-btn { cursor: pointer; color: var(--color-text-secondary); opacity: 0; visibility: hidden; transform: scale(0.8) translateZ(0); will-change: opacity, visibility, transform; transition: all 0.2s ease; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; } /* Показываем при наведении на шапку дня */ .span9 .day h3:hover .add-custom-pair-btn { opacity: 1; visibility: visible; transform: scale(1) translateZ(0); } .add-custom-pair-btn:hover { color: var(--color-accent); background: var(--color-highlight); } /* Строка пользовательской пары */ .custom-pair-row .pair_info .dis a { color: var(--color-accent) !important; font-weight: 700 !important; } /* Кнопка удаления (крестик справа от названия предмета) */ .delete-custom-pair-btn { opacity: 0; visibility: hidden; transform: scale(0.8) translateZ(0); will-change: opacity, visibility, transform; cursor: pointer; color: var(--color-red); transition: all 0.2s ease; margin-left: 8px; display: inline-flex; align-items: center; justify-content: center; border-radius: 50%; padding: 2px; vertical-align: middle; } /* Показываем крестик при наведении на строку */ .custom-pair-row:hover .delete-custom-pair-btn { opacity: 1; visibility: visible; transform: scale(1) translateZ(0); } .delete-custom-pair-btn:hover { background: rgba(255, 59, 48, 0.1); } /* Инпуты в модалке */ .custom-pair-input-group { display: flex; gap: 1rem; margin-bottom: 1.2rem; } .custom-pair-input-group > input, .custom-pair-input-group > select { flex: 1; padding: 1rem 1.2rem !important; border: 1px solid var(--color-table-border) !important; background: var(--color-input) !important; border-radius: var(--radius-small) !important; color: var(--color-text-primary) !important; font-size: 1.4rem !important; } /* Вкладки в модальном окне редактирования */ .modal-tabs { display: flex; border-bottom: 1px solid var(--color-table-border); margin-bottom: 1.5rem; } .modal-tab { flex: 1; padding: 1rem; background: transparent; border: none; border-bottom: 2px solid transparent; color: var(--color-text-secondary); cursor: pointer; font-weight: 600; font-size: 1.3rem; transition: all 0.2s; } .modal-tab.active { color: var(--color-accent); border-bottom-color: var(--color-accent); } .tab-content { display: none; } .tab-content.active { display: block; } /* --- SUBMENU (ПОДВКЛАДКИ) --- */ .submenu { /* Убираем боковые градиенты-тени */ background-image: none !important; } [theme="dark"] .submenu { background: var(--color-card) !important; } /* Стили неактивных кнопок (убираем фон) */ .submenu a:not(.answer-btn-custom) { background: transparent !important; color: var(--color-text-secondary) !important; } .submenu a:not(.answer-btn-custom):hover { background: transparent !important; color: var(--color-text-primary) !important; transform: none !important; } /* Разделители между вкладками */ .submenu > *:not(:last-child):not(.answer-btn-custom) { position: relative !important; } .submenu > *:not(:last-child):not(.answer-btn-custom)::after { content: ''; position: absolute !important; right: -4.5px !important; top: 25% !important; bottom: 25% !important; width: 1px !important; background-color: var(--color-table-border) !important; pointer-events: none !important; } /* Скрываем разделитель рядом с активной кнопкой для красоты */ .submenu > *:has(+ b)::after, .submenu > b::after { display: none !important; } /* --- WEEKS (НЕДЕЛИ) --- */ .weeks { /* Убираем боковые градиенты-тени */ background-image: none !important; } [theme="dark"] .weeks { background: var(--color-card) !important; } .weeks .week { background-color: transparent !important; color: var(--color-text-secondary) !important; border-radius: 50px !important; width: auto !important; min-width: 3.8rem !important; padding: 0 14px !important; } .weeks > .week > a { border-radius: 50px !important; color: var(--color-text-secondary) !important; } .weeks .week:not(.current):hover { background-color: transparent !important; } .weeks .week:not(.current):hover > a { color: var(--color-text-primary) !important; } /* Разделители между неделями */ .weeks .week:not(:last-child) { position: relative !important; } .weeks .week:not(:last-child)::after { content: ''; position: absolute !important; right: -4.5px !important; top: 25% !important; bottom: 25% !important; width: 1px !important; background-color: var(--color-table-border) !important; pointer-events: none !important; } /* Скрываем разделитель рядом с активной кнопкой */ .weeks .week:has(+ .current)::after, .weeks .week.current::after { display: none !important; } /* Убираем тень у кнопок внутри тулбара (Аналитика, Топ предметов и т.д.) */ .timetable-toolbar button.toolbar-item, button.analytics-btn { box-shadow: none !important; } /* Отключаем системную серую/синюю подсветку при тапе на мобильных */ .mobile-menu-btn, .submenu a, .submenu b, .weeks .week a, .weeks .week { -webkit-tap-highlight-color: transparent !important; } /* Активное состояние для кнопок в тулбаре (Синхронизация) */ .timetable-toolbar .toolbar-item.is-active { background: var(--color-accent) !important; color: var(--color-text-primary-invert) !important; font-weight: 600 !important; } /* Затемнение активной кнопки при наведении */ .timetable-toolbar .toolbar-item.is-active:hover { filter: brightness(0.85) !important; } .weeks .week.session:not(.current), .weeks .week.session:not(.current) a { color: var(--color-red) !important; } .weeks .week.holiday:not(.current), .weeks .week.holiday:not(.current) a { color: var(--color-green) !important; } @media (max-width: 960px) { /* 1. скрытое состояние карандаша по умолчанию */ .subject-note-btn { opacity: 0 !important; visibility: hidden !important; transform: scale(0.8) !important; transition: all 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275) !important; pointer-events: none !important; } /* Показываем карандаш только при наведении на всю строку */ .timetable-grid tr:hover .subject-note-btn { opacity: 1 !important; visibility: visible !important; transform: scale(1) !important; pointer-events: auto !important; } /* 2. Фикс "Онлайн в" (запрещаем перенос слов внутри текста) */ .pair_info .aud { display: flex !important; flex-direction: row !important; flex-wrap: wrap !important; align-items: center !important; gap: 6px !important; max-width: none !important; } /* Контейнер текста "Онлайн в" делаем неразрывным */ .pair_info .aud div { white-space: nowrap !important; } /* 3. Фикс колонки преподавателя и оценки */ html[theme] .timetable-grid td.pair_teacher { width: 100px !important; min-width: 100px !important; padding-right: 1.6rem !important; vertical-align: middle !important; position: relative !important; } /* Оборачиваем содержимое ячейки препода в Flex-стек */ html[theme] .timetable-grid td.pair_teacher { display: table-cell !important; } /* Убираем абсолютное позиционирование у оценки, чтобы она не наезжала на Zoom */ html[theme] .timetable-grid td.pair_teacher .eval { position: static !important; display: block !important; width: auto !important; text-align: right !important; margin-top: 4px !important; opacity: 0 !important; visibility: hidden !important; height: 0 !important; overflow: hidden !important; transform: translateY(5px) !important; transition: all 0.2s ease !important; } /* Состояние ХОВЕРА для препода и оценки */ html[theme] .timetable-grid tr:hover td.pair_teacher a:not(.eval) { transform: translateY(0) !important; display: block !important; } html[theme] .timetable-grid tr:hover td.pair_teacher .eval { opacity: 1 !important; visibility: visible !important; height: auto !important; transform: translateY(0) !important; } /* УДАЛЕНИЕ ВЕРХНИХ ГРАНИЦ У ТАБЛИЦ */ .span9 table.common, .span9 table.teach_plan, .wide-table-wrapper table { border-top: none !important; } /* Убираем границу у самих ячеек первой строки */ .span9 table.common tr:first-child th, .span9 table.common tr:first-child td, .span9 table.teach_plan tr:first-child th, .span9 table.teach_plan tr:first-child td { border-top: none !important; border-top-width: 0 !important; } .submenu .eval-plan-link { background: transparent !important; color: var(--color-text-secondary) !important; text-decoration: underline !important; font-size: 1.2rem !important; font-weight: 500 !important; margin-left: auto !important; padding-right: 15px !important; } .submenu .eval-plan-link:hover { color: var(--color-accent) !important; background: transparent !important; transform: none !important; } } .teacher-meta-row { display: flex !important; flex-direction: row !important; justify-content: space-between !important; align-items: center !important; gap: 1.2rem !important; border-bottom: 1px solid var(--color-table-border) !important; padding-bottom: 1.2rem !important; margin-bottom: 1.6rem !important; width: 100% !important; } .teacher-badges-box { display: flex !important; flex-wrap: wrap !important; gap: 6px !important; justify-content: flex-end !important; } @media (max-width: 600px) { .teacher-meta-row { flex-direction: column !important; align-items: center !important; text-align: center !important; gap: 0.8rem !important; } .teacher-badges-box { justify-content: center !important; width: 100% !important; } .teacher-dept-link { width: auto !important; text-align: center !important; } } /* Стили плавающего индикатора при свайпе */ #swipe-action-bubble { position: fixed; width: 24px; height: 24px; color: var(--color-text-secondary); display: flex; align-items: center; justify-content: center; z-index: 10000; pointer-events: none; opacity: 0; transform: scale(0.8); transition: color 0.2s, opacity 0.1s, transform 0.2s; } #swipe-action-bubble .material-icons { font-size: 28px !important; } #swipe-action-bubble.active-threshold { transform: scale(1.15); } #swipe-action-bubble.active-threshold.action-add { color: var(--color-accent) !important; } #swipe-action-bubble.active-threshold.action-note { color: var(--color-accent); } #swipe-action-bubble.active-threshold.action-eval { color: var(--color-yellow); } /* БЛОКИРОВКА ХОВЕРОВ НА СМАРТФОНАХ */ @media (hover: none), (pointer: coarse) { .timetable-grid tr, .day { touch-action: pan-y; } /* Жестко убиваем все смещения текста преподавателей на мобилках */ html[theme] .timetable-grid tr:hover td.pair_teacher a:not(.eval), html[theme] .timetable-grid tr:has(td.pair_teacher .eval).tr-needs-space:hover td.pair_teacher a:not(.eval), html[theme] .timetable-grid tr:has(td.pair_teacher .eval):not(.tr-needs-space):hover td.pair_teacher a:not(.eval) { transform: none !important; } html[theme] .timetable-grid tr:hover td.pair_teacher .eval, html[theme] .timetable-grid td.pair_teacher .eval { opacity: 0 !important; visibility: hidden !important; height: 0 !important; pointer-events: none !important; } /* Отключаем системную вспышку на ссылках сайдбара в iOS */ .span3 > .nav.nav-tabs.nav-stacked > li > a { -webkit-tap-highlight-color: transparent !important; } .add-custom-pair-btn { display: none !important; } .delete-custom-pair-btn { opacity: 1 !important; visibility: visible !important; transform: scale(1) !important; color: var(--color-text-secondary) !important; } .timetable-grid tr:hover .subject-note-btn:not(.has-note) { opacity: 0 !important; visibility: hidden !important; pointer-events: none !important; } .subject-note-btn.has-note { opacity: 1 !important; visibility: visible !important; pointer-events: auto !important; } } /* --- COLOR PICKER MODAL --- */ .color-picker-grid { display: grid; grid-template-columns: repeat(5, 42px); gap: 1.2rem; margin-top: 1rem; justify-content: center; } .color-picker-circle { width: 42px; height: 42px; border-radius: 50%; cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: 1.6rem; font-weight: 800; color: #fff; transition: all 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275); box-shadow: 0 2px 8px rgba(0,0,0,0.1); } .color-picker-circle:hover { transform: scale(1.15); } .color-picker-circle.selected { transform: scale(1.2); color: var(--color-text-primary); text-shadow: 0 0 6px var(--color-card), 0 0 2px var(--color-card); } .color-picker-controls-row { display: flex; align-items: center; justify-content: center; gap: 10px; margin-bottom: 2.4rem; } .color-picker-toggle-wrap { display: flex; align-items: center; gap: 12px; padding: 0.8rem 1.6rem; border-radius: 50px; transition: background 0.4s ease; box-shadow: 0 4px 12px rgba(0,0,0,0.15); height: 42px; } .color-picker-toggle-wrap span { font-size: 1.1rem; font-weight: 800; text-transform: uppercase; color: #fff !important; text-shadow: 0 1px 2px rgba(0,0,0,0.2); } .color-picker-random-btn { width: 42px !important; height: 42px !important; padding: 0 !important; border-radius: 50% !important; display: flex !important; align-items: center !important; justify-content: center !important; background: var(--color-card) !important; color: var(--color-text-secondary) !important; border: 1px solid var(--color-table-border) !important; cursor: pointer !important; box-shadow: var(--shadow-main) !important; transition: transform 0.25s cubic-bezier(0.175, 0.885, 0.32, 1.275), color 0.2s, background 0.2s !important; } @media (hover: hover) and (pointer: fine) { .color-picker-random-btn:hover { color: var(--color-accent) !important; transform: scale(1.15) !important; } } /* Анимация при самом клике (сжатие) */ .color-picker-random-btn:active, .color-picker-random-btn.clicked { transform: scale(0.9) !important; transition: transform 0.1s ease !important; } .color-picker-random-btn .material-icons { font-size: 22px !important; margin: 0 !important; } /* --- THEME SELECTOR --- */ .theme-selector-group { display: inline-flex; background: var(--color-card); border: 1px solid var(--color-table-border); border-radius: 50px; padding: 4px; gap: 4px; height: 42px; align-items: center; box-shadow: var(--shadow-main); } .theme-btn { display: flex; align-items: center; justify-content: center; background: transparent !important; border: none !important; color: var(--color-text-secondary) !important; border-radius: 50px !important; cursor: pointer; transition: all 0.2s ease !important; box-shadow: none !important; width: 48px; height: 34px; padding: 0 !important; } .theme-btn .material-icons { font-size: 22px !important; margin: 0 !important; } /* Ховер только для ПК */ @media (hover: hover) and (pointer: fine) { .theme-btn:hover { color: var(--color-text-primary) !important; background: var(--color-highlight) !important; } } .theme-btn.active { background: var(--color-highlight) !important; color: var(--color-text-primary) !important; box-shadow: inset 0 0 0 1px var(--color-table-border) !important; } /* --- СТИЛИ ДЛЯ УМНЫХ ДАТ --- */ .msg-event-link { cursor: pointer; text-decoration: underline; text-decoration-style: dashed; text-decoration-color: var(--color-text-secondary); color: var(--color-text-primary); font-weight: 700; transition: color 0.2s ease, text-decoration-color 0.2s ease, background 0.2s ease; padding: 2px 4px; border-radius: 6px; margin: 0 2px; } .msg-event-link:hover { color: var(--color-accent) !important; text-decoration-color: var(--color-accent) !important; background: var(--color-accent-active); } /* Состояние "Уже добавлено" */ .msg-event-link.added { color: var(--color-accent) !important; text-decoration: none !important; background: var(--color-accent-active); pointer-events: auto; /* Разрешаем повторный клик */ } /* Ховер для добавленного события (Удаление) */ .msg-event-link.added:hover { color: var(--color-red) !important; background: rgba(255, 59, 48, 0.15) !important; text-decoration: line-through !important; } /* --- ВКЛАДКИ СИНХРОНИЗАЦИИ --- */ .sync-tabs { display: flex; background: var(--color-input) !important; border-radius: 50px !important; padding: 4px !important; margin-bottom: 2rem !important; gap: 4px !important; border: none !important; } button.sync-tab { flex: 1; padding: 1rem 1.6rem !important; background: transparent !important; border: none !important; border-radius: 50px !important; box-shadow: none !important; color: var(--color-text-secondary) !important; cursor: pointer; font-weight: 600 !important; font-size: 1.3rem !important; transition: all 0.2s; display: flex; align-items: center; justify-content: center !important; } button.sync-tab.active { background: var(--color-card) !important; color: var(--color-text-primary) !important; box-shadow: var(--shadow-main) !important; } [theme="dark"] button.sync-tab.active { background: var(--color-highlight-light) !important; } .sync-tab-content { display: none; } .sync-tab-content.active { display: block; animation: fadeIn 0.2s ease; } /* Цвет бейджа для консультаций */ .type-badge-cons { color: var(--color-text-secondary) !important; } /* Затемнение активной кнопки Синхронизации при наведении */ .timetable-toolbar .toolbar-item.is-active:hover { filter: brightness(0.85) !important; } /* Кнопка удаления внешнего календаря */ .delete-cal-btn { background: none; border: none; cursor: pointer; color: var(--color-text-secondary); display: flex; align-items: center; justify-content: center; padding: 6px; border-radius: 50%; flex-shrink: 0; transition: all 0.2s ease; } .delete-cal-btn:hover { background: rgba(255, 59, 48, 0.12) !important; color: var(--color-red) !important; } /* Фикс всплывающего окна в рейтинге */ #tooltip { max-width: 500px !important; width: auto !important; background: var(--color-card) !important; border: 1px solid var(--color-table-border) !important; border-radius: var(--radius-medium) !important; box-shadow: var(--shadow-dialog) !important; padding: 12px !important; z-index: 1000000 !important; pointer-events: none !important; } #tooltip table.common { margin: 0 !important; box-shadow: none !important; width: 100% !important; background: transparent !important; } #tooltip table.common th { font-size: 1rem !important; padding: 6px !important; background: var(--color-table-header) !important; color: var(--color-text-secondary) !important; } #tooltip table.common td { font-size: 1.1rem !important; padding: 6px !important; border-bottom: 1px solid var(--color-table-border) !important; background: transparent !important; } /* --- ВАЖНЫЕ ПАРЫ --- */ .timetable-grid tr.is-important .pair-type-badge { background: transparent !important; color: var(--color-red) !important; } /* Контейнер, который держит элементы по центру */ .pair-badge-wrapper { display: flex !important; align-items: center !important; justify-content: center !important; margin-bottom: 2px !important; } .pair-type-badge { display: inline-block !important; margin-bottom: 0 !important; white-space: nowrap !important; } .pair-important-btn { position: relative !important; /* Возвращаем в общий поток */ width: 0 !important; /* Скрыто по умолчанию */ margin-right: 0 !important; cursor: pointer !important; background: transparent !important; border: none !important; box-shadow: none !important; color: var(--color-text-secondary) !important; padding: 0 !important; border-radius: 50% !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; opacity: 0 !important; visibility: hidden !important; overflow: hidden !important; /* Чтобы иконка не торчала при сужении */ transition: all 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275) !important; } /* Уменьшаем саму иконку, чтобы она была вровень с текстом */ .pair-important-btn .material-icons { font-size: 1.4rem !important; } /* При наведении ширина увеличивается, плавно сдвигая текст вправо */ .timetable-grid tr:hover .pair-important-btn, .pair-important-btn.is-active { opacity: 1 !important; visibility: visible !important; width: 16px !important; margin-right: 4px !important; pointer-events: auto !important; } .pair-important-btn.is-active { color: var(--color-red) !important; animation: pulse-important-bell 2s infinite; } .pair-important-btn:hover { color: var(--color-red) !important; transform: scale(1.15) !important; } @keyframes pulse-important-bell { 0% { transform: scale(1); } 50% { transform: scale(0.85); } 100% { transform: scale(1); } } #swipe-action-bubble.active-threshold.action-important { color: var(--color-red) !important; } /* Фикс для смартфонов */ @media (hover: none), (pointer: coarse) { .timetable-grid tr:hover .pair-important-btn:not(.is-active) { opacity: 0 !important; visibility: hidden !important; pointer-events: none !important; width: 0 !important; margin-right: 0 !important; } .pair-important-btn.is-active { opacity: 1 !important; visibility: visible !important; pointer-events: auto !important; width: 16px !important; margin-right: 4px !important; } } /* --- ШЕРИНГ ДНЯ И ЗАТЕМНЕНИЕ ПРОШЕДШИХ ПАР --- */ .day-header-right { display: flex; align-items: center; justify-content: flex-end; } .share-day-btn { font-size: 1.8rem !important; color: var(--color-text-secondary); cursor: pointer; opacity: 0; visibility: hidden; width: 0; margin-left: 0; overflow: hidden; transition: all 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275); } /* Прошедшие пары */ .timetable-grid tr.pair-passed td { opacity: 0.45; transition: opacity 0.3s ease; } .timetable-grid tr.pair-passed .timetable-gap-capsule { background: var(--color-highlight) !important; color: var(--color-text-secondary) !important; border-color: var(--color-highlight) !important; } /* Ховеры только для ПК (мышь) */ @media (hover: hover) and (pointer: fine) { .timetable-grid tr.pair-passed:hover td { opacity: 0.9; } .span9 .day h3:hover .share-day-btn { opacity: 1; visibility: visible; width: 18px; margin-left: 8px; } } #swipe-action-bubble.active-threshold.action-share { color: var(--color-blue) !important; } /* --- SETTINGS MODAL --- */ .settings-menu-list { display: flex; flex-direction: column; gap: 8px; } .settings-menu-btn { display: flex; align-items: center; width: 100%; padding: 16px; background: var(--color-highlight); border: none; border-radius: var(--radius-medium); color: var(--color-text-primary); font-size: 1.4rem; font-weight: 600; cursor: pointer; transition: all 0.2s ease; font-family: inherit; } .settings-menu-btn:hover { background: var(--color-highlight-light); transform: translateY(-2px); } .settings-menu-btn .material-icons { color: var(--color-accent); margin-right: 12px; font-size: 2.2rem; } .settings-menu-btn .material-icons.chevron { margin-right: 0; color: var(--color-text-secondary); margin-left: auto; font-size: 2.4rem; } .back-modal-btn:hover { color: var(--color-accent) !important; } /* ========================================== УНИВЕРСАЛЬНЫЕ МОДАЛЬНЫЕ ОКНА (ШТОРКИ НА МОБИЛЬНЫХ) ========================================== */ #etis-settings-modal, .analytics-modal, #etis-reviews-modal { position: fixed !important; background: var(--color-card) !important; box-shadow: var(--shadow-dialog) !important; z-index: 2000001 !important; display: flex !important; flex-direction: column !important; overflow: hidden !important; opacity: 0; visibility: hidden; border: none !important; font-family: var(--font-family) !important; } #etis-settings-overlay, .analytics-overlay, #etis-reviews-overlay { position: fixed !important; top: 0 !important; left: 0 !important; right: 0 !important; bottom: 0 !important; background: rgba(0,0,0,0.6) !important; backdrop-filter: blur(4px) !important; -webkit-backdrop-filter: blur(4px) !important; z-index: 2000000 !important; opacity: 0; visibility: hidden; transition: all 0.3s ease-out !important; } #etis-settings-overlay.active, .analytics-overlay.active, #etis-reviews-overlay.active { opacity: 1 !important; visibility: visible !important; } /* Десктоп (По центру, широкие) */ @media (min-width: 961px) { #etis-settings-modal, .analytics-modal, #etis-reviews-modal { top: 50% !important; left: 50% !important; transform: translate(-50%, -50%) scale(0.95) !important; width: 90% !important; max-width: 600px !important; /* Увеличили ширину настроек */ max-height: 85vh !important; border-radius: 24px !important; transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) !important; } #etis-settings-modal.active, .analytics-modal.active, #etis-reviews-modal.active { opacity: 1 !important; visibility: visible !important; transform: translate(-50%, -50%) scale(1) !important; } /* Для аналитики и расписания делаем окно еще шире */ .analytics-modal { max-width: 750px !important; } } /* Мобильные (Шторка снизу) */ @media (max-width: 960px) { #etis-settings-modal, .analytics-modal, #etis-reviews-modal { top: auto !important; bottom: 0 !important; left: 0 !important; right: 0 !important; width: 100% !important; max-width: 100% !important; max-height: 90vh !important; border-radius: 24px 24px 0 0 !important; transform: translateY(100%) !important; transition: transform 0.35s cubic-bezier(0.2, 0.8, 0.2, 1), opacity 0.35s ease !important; padding-bottom: env(safe-area-inset-bottom, 20px) !important; margin: 0 !important; } #etis-settings-modal.active, .analytics-modal.active, #etis-reviews-modal.active { opacity: 1 !important; visibility: visible !important; transform: translateY(0) !important; } /* Индикатор свайпа (полоска сверху) */ #etis-settings-modal::before, .analytics-modal::before, #etis-reviews-modal::before { content: ''; position: absolute; top: 8px; left: 50%; transform: translateX(-50%); width: 40px; height: 4px; background: var(--color-scrollbar-thumb); border-radius: 4px; z-index: 10; } #etis-settings-modal .ui-widget-header, .analytics-modal .ui-widget-header, #etis-reviews-modal .ui-widget-header { padding-top: 24px !important; /* Отступ под полоску */ border-radius: 24px 24px 0 0 !important; } } /* Скролл внутри контента модалки */ #etis-settings-modal .ui-dialog-content, .analytics-modal .ui-dialog-content, #etis-reviews-modal .ui-dialog-content { overflow-y: auto !important; flex: 1 1 auto !important; } @media (max-width: 960px) { #etis-settings-modal .ui-dialog-content, .analytics-modal .ui-dialog-content, #etis-reviews-modal .ui-dialog-content { scrollbar-width: none !important; } #etis-settings-modal .ui-dialog-content::-webkit-scrollbar, .analytics-modal .ui-dialog-content::-webkit-scrollbar, #etis-reviews-modal .ui-dialog-content::-webkit-scrollbar { display: none !important; } } /* Макет окна настроек для ПК (Сайдбар + Контент) */ @media (min-width: 961px) { #etis-settings-modal { max-width: 850px !important; height: 60vh !important; min-height: 500px !important; } .settings-layout { display: flex; height: 100%; width: 100%; } .settings-sidebar { width: 250px; min-width: 250px; border-right: 1px solid var(--color-table-border); padding: 2.4rem 1.6rem; background: var(--color-highlight); display: flex !important; flex-direction: column; gap: 8px; overflow-y: auto; } .settings-content-area { flex: 1; display: flex; flex-direction: column; overflow: hidden; } .settings-content-scroll { flex: 1; padding: 2.4rem; overflow-y: auto; } /* Скрываем мобильную шапку и кнопку "Назад" на ПК */ .settings-mobile-header, .mobile-main-title { display: none !important; } } /* Макет окна настроек для мобильных */ @media (max-width: 960px) { .settings-layout { display: flex; flex-direction: column; height: 100%; } .settings-sidebar { padding: 2.4rem; display: flex; flex-direction: column; gap: 8px; } .settings-content-area { display: flex; flex-direction: column; height: 100%; } .settings-content-scroll { padding: 2.4rem; overflow-y: auto; } .hidden-on-mobile { display: none !important; } .desktop-main-title { display: none !important; } } /* Кнопки сайдбара настроек */ #etis-settings-modal .settings-sidebar-btn { display: flex !important; flex-direction: row !important; align-items: center !important; justify-content: flex-start !important; width: 100% !important; max-width: 100% !important; padding: 12px 16px !important; margin: 0 0 8px 0 !important; background: transparent !important; border: none !important; border-radius: var(--radius-medium) !important; color: var(--color-text-primary) !important; font-size: 1.4rem !important; font-weight: 600 !important; cursor: pointer !important; transition: all 0.2s ease !important; font-family: inherit !important; box-shadow: none !important; box-sizing: border-box !important; height: 48px !important; } #etis-settings-modal .settings-sidebar-btn:hover { background: var(--color-table-highlight) !important; } /* Защита внутренних спанов от глобальных стилей */ #etis-settings-modal .settings-sidebar-btn span { display: block !important; border: none !important; padding: 0 !important; } #etis-settings-modal .settings-sidebar-btn .sidebar-btn-text { flex-grow: 1 !important; text-align: left !important; white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important; color: inherit !important; } #etis-settings-modal .settings-sidebar-btn .material-icons { flex-shrink: 0 !important; margin-right: 12px !important; font-size: 2.2rem !important; color: var(--color-text-secondary) !important; } #etis-settings-modal .settings-sidebar-btn .chevron { flex-shrink: 0 !important; margin-right: 0 !important; margin-left: auto !important; } #etis-settings-modal .settings-sidebar-btn.active { background: var(--color-accent) !important; color: var(--color-text-primary-invert) !important; box-shadow: 0 4px 12px rgba(0,0,0,0.15) !important; } #etis-settings-modal .settings-sidebar-btn.active .material-icons { color: var(--color-text-primary-invert) !important; } #etis-settings-modal .settings-sidebar-btn.active .chevron { display: none !important; } .appearance-section { display: flex; flex-direction: column; align-items: flex-start; margin-bottom: 3.2rem; } .appearance-title { font-size: 1.1rem; font-weight: 800; color: var(--color-text-secondary); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 1.2rem; text-align: left; width: 100%; } .color-picker-controls-row { display: flex; align-items: center; justify-content: flex-start; gap: 10px; margin-bottom: 1.6rem; width: 100%; } .color-picker-grid { display: grid; grid-template-columns: repeat(8, 42px); gap: 1.2rem; margin-top: 1rem; justify-content: flex-start; } @media (max-width: 600px) { .color-picker-grid { grid-template-columns: repeat(5, 42px); justify-content: center; } .appearance-section { align-items: center; } .appearance-title { text-align: center; } .color-picker-controls-row { justify-content: center; } } `; // Безопасное внедрение элементов const safeAppend = (element) => { if (document.head) { document.head.appendChild(element); } else { document.documentElement.appendChild(element); } }; // Внедряем стили const injectStyles = (css) => { const style = document.createElement('style'); style.innerHTML = css; safeAppend(style); }; injectStyles(styles); // ========================================== // 2. ВНЕДРЕНИЕ JS ЛОГИКИ // ========================================== const ACCENT_COLORS = { blue: '#007AFF', green: '#34C759', orange: '#FF9500', red: '#FF3B30', pink: '#FF2D55', lightblue: '#5AC8FA', mint: '#00C7BE', yellow: '#FFCC00', lightpurple: '#E58FFF', rose: '#FF94A5', indigo: '#5856D6', teal: '#30B0C7', lime: '#AEEA00', cyan: '#00BCD4', magenta: '#E91E63', deeporange: '#FF5722', brown: '#A2845E', slate: '#708090', cobalt: '#3F51B5', crimson: '#DC143C', darkblue: '#1A237E', darkgreen: '#1B5E20', chocolate: '#5D4037', darkred: '#800000', graphite: '#333333' }; const COLOR_ORDER = [ 'blue', 'green', 'orange', 'red', 'pink', 'lightblue', 'mint', 'yellow', 'lightpurple', 'rose', 'indigo', 'teal', 'lime', 'cyan', 'magenta', 'deeporange', 'brown', 'slate', 'cobalt', 'crimson', 'darkblue', 'darkgreen', 'chocolate', 'darkred', 'graphite' ]; const GENERAL_CONFIG_KEY = 'etis_general_config'; let savedConfig = JSON.parse(localStorage.getItem(GENERAL_CONFIG_KEY)) || {}; let generalConfig = { dimPastPairs: true, shortAudFormat: false, hideDaysOff: false, showSunday: false, absoluteScores: false, watermark: true, datesLeft: false, ...savedConfig }; function applyAccentColor() { const config = JSON.parse(localStorage.getItem('etis_accent_config')) || { isGradient: true, colors: ['blue', 'lightblue'] }; let c1 = ACCENT_COLORS[config.colors[0]] || ACCENT_COLORS.blue; let c2 = config.colors[1] ? ACCENT_COLORS[config.colors[1]] : c1; let styleEl = document.getElementById('etis-custom-accent'); if (!styleEl) { styleEl = document.createElement('style'); styleEl.id = 'etis-custom-accent'; safeAppend(styleEl); } const hexToRgba = (hex, alpha) => { let r = parseInt(hex.slice(1, 3), 16), g = parseInt(hex.slice(3, 5), 16), b = parseInt(hex.slice(5, 7), 16); return `rgba(${r}, ${g}, ${b}, ${alpha})`; }; const bgAccent = config.isGradient ? `linear-gradient(135deg, ${c1}, ${c2})` : c1; styleEl.innerHTML = ` :root, [theme="light"], [theme="dark"] { --color-accent: ${c1} !important; --color-text-link: ${c1} !important; --color-accent-active: ${hexToRgba(c1, 0.15)} !important; --bg-accent: ${bgAccent} !important; } .span3 > .nav.nav-tabs.nav-stacked > li.active > a, .weeks .week.current, .submenu b, .answer-btn-custom, #sbmt, .gpa-capsule, .mobile-menu-btn, .timetable-toolbar .toolbar-item.is-active, form.que_form #send_btn, .badge.ctl, .jour-info-group { background: var(--bg-accent) !important; border: none !important; color: #fff !important; } ${config.isGradient ? ` .msg-sender, .msg-sender .material-icons, .file-attachment-link .material-icons, .teacher-name-link, .review-dis-link, .tpr_part > a, .theme a, .logo-say-hey, .accent-stat, #swipe-action-bubble.active-threshold.action-note, #swipe-action-bubble.active-threshold.action-note .material-icons, #swipe-action-bubble.active-threshold.action-add, #swipe-action-bubble.active-threshold.action-add .material-icons { background: var(--bg-accent) !important; -webkit-background-clip: text !important; -webkit-text-fill-color: transparent !important; color: transparent !important; display: inline-block; } .weeks .week.actual-week:not(.current) > a, .stat-box-value, .msg-sender { display: inline-flex !important; } ` : ` .msg-sender, .msg-sender .material-icons, .file-attachment-link .material-icons, .teacher-name-link, .review-dis-link, .tpr_part > a, .theme a, .logo-say-hey, .accent-stat, #swipe-action-bubble.active-threshold.action-note, #swipe-action-bubble.active-threshold.action-add, #swipe-action-bubble.active-threshold.action-note .material-icons { color: var(--color-accent) !important; } `} `; } // Применяем сразу при загрузке applyAccentColor(); let theme = 'auto'; let prefersColorSchemeMedia; if (window.matchMedia) { prefersColorSchemeMedia = window.matchMedia('(prefers-color-scheme: dark)'); } function setDarkTheme(e) { document.documentElement.setAttribute('theme', e.matches ? 'dark' : 'light'); } function setSystemThemeDetection() { if (window.matchMedia) { prefersColorSchemeMedia = window.matchMedia('(prefers-color-scheme: dark)'); document.documentElement.setAttribute('theme', prefersColorSchemeMedia.matches ? 'dark' : 'light'); prefersColorSchemeMedia.addEventListener('change', setDarkTheme); } } function removeSystemThemeDetection() { if (window.matchMedia) { prefersColorSchemeMedia.removeEventListener('change', setDarkTheme); } } function detectTheme() { if (localStorage.getItem('theme')) { theme = localStorage.getItem('theme'); if (theme == 'auto') { setSystemThemeDetection(); } else { document.documentElement.setAttribute('theme', theme); } } else { theme = 'auto'; setSystemThemeDetection(); } } function switchTheme(e) { if (theme == 'auto') { theme = 'light'; e.srcElement.innerHTML = e.srcElement.innerHTML.replace('Системная', 'Светлая'); document.documentElement.setAttribute('theme', theme); removeSystemThemeDetection(); } else if (theme == 'light') { theme = 'dark'; e.srcElement.innerHTML = e.srcElement.innerHTML.replace('Светлая', 'Темная'); document.documentElement.setAttribute('theme', theme); } else if (theme == 'dark') { theme = 'auto'; e.srcElement.innerHTML = e.srcElement.innerHTML.replace('Темная', 'Системная'); setSystemThemeDetection(); } localStorage.setItem('theme', theme); } detectTheme(); // --- ФИКС ЦВЕТА БРАУЗЕРНОЙ ПАНЕЛИ НАВИГАЦИИ И СТАТУС-БАРА --- function updateBrowserNavColor() { const isDark = document.documentElement.getAttribute('theme') === 'dark'; const color = isDark ? '#16181A' : '#F2F2F6'; // Цвета нашего var(--color-body) let metaTheme = document.querySelector('meta[name="theme-color"]'); if (!metaTheme) { metaTheme = document.createElement('meta'); metaTheme.name = 'theme-color'; safeAppend(metaTheme); } metaTheme.content = color; } // Следим за сменой темы и мгновенно обновляем цвет браузера new MutationObserver(updateBrowserNavColor).observe(document.documentElement, { attributes: true, attributeFilter: ['theme'] }); updateBrowserNavColor(); function createTooltipTriangle() { const xmlns = 'http://www.w3.org/2000/svg' const svg = document.createElementNS(xmlns, 'svg'); svg.setAttributeNS(null, 'width', '15') svg.setAttributeNS(null, 'height', '9') svg.setAttributeNS(null, 'viewBox', '0 0 15 9') svg.setAttributeNS(null, 'fill', 'none') svg.classList.add('sign-tooltip-triangle') const path = document.createElementNS(xmlns, 'path') path.classList.add('tooltipTriangle') path.setAttributeNS(null, 'd', 'M6.79289 7.79289L0.707107 1.70711C0.0771419 1.07714 0.523308 0 1.41421 0H13.5858C14.4767 0 14.9229 1.07714 14.2929 1.70711L8.20711 7.79289C7.81658 8.18342 7.18342 8.18342 6.79289 7.79289Z') svg.appendChild(path) return svg } function addViewport() { // Проверяем, нет ли уже такого тега if (!document.querySelector('meta[name="viewport"]')) { const meta = document.createElement('meta'); meta.name = 'viewport'; meta.content = 'width=device-width, initial-scale=1'; safeAppend(meta); } } // Запускаем при загрузке документа function init() { addViewport(); setIcon(); stylePages(); // Запуск через секунду, чтобы страница прогрузилась setTimeout(initAutoUpdateCheck, 1500); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } // Установка иконки function setIcon() { // Удаляем существующие иконки сайта, чтобы они не конфликтовали const existingIcons = document.querySelectorAll("link[rel*='icon']"); existingIcons.forEach(el => el.remove()); const icon = document.createElement('link'); icon.rel = 'icon'; icon.type = 'image/png'; icon.href = 'https://raw.githubusercontent.com/defl-orator/etis-reborn/cf8b9cf9ab49c0eb14de7d2fdf32e5697004a13a/img/logo.png'; safeAppend(icon); } // ========================================== // ЛОГИКА ОБНОВЛЕНИЯ // ========================================== let updateState = { status: 'idle', hasUpdate: false, remoteVer: '', remoteDate: '', remoteLog: '', details: '' }; function compareVersions(v1, v2) { if (!v1 || !v2) return 0; const p1 = v1.split('.'); const p2 = v2.split('.'); for (let i = 0; i < Math.max(p1.length, p2.length); i++) { let s1 = p1[i] || "0"; let s2 = p2[i] || "0"; if (s1.length !== s2.length) { const maxLen = Math.max(s1.length, s2.length); s1 = s1.padEnd(maxLen, '0'); s2 = s2.padEnd(maxLen, '0'); } const n1 = parseInt(s1, 10); const n2 = parseInt(s2, 10); if (n1 > n2) return 1; if (n1 < n2) return -1; } return 0; } // Безопасное получение заголовка (даже если метода .getResponseHeader нет) function getHeaderSafe(res, headerName) { if (typeof res.getResponseHeader === 'function') { try { return res.getResponseHeader(headerName); } catch(e) {} } if (res.responseHeaders) { const regex = new RegExp(headerName + ':\\s*(.*)', 'i'); const match = res.responseHeaders.match(regex); return match ? match[1] : null; } return null; } function initAutoUpdateCheck(isManual = false) { if (updateState.status === 'loading' && !isManual) return; updateState.status = 'loading'; if (isManual) refreshModalUI(); GM_xmlhttpRequest({ method: "GET", url: UPDATE_URL + '?t=' + Date.now(), timeout: 10000, onload: function(res) { try { const text = res.responseText; const verMatch = text.match(/@version\s+([\d\.]+)/); if (!verMatch) throw new Error("Версия не найдена в файле"); const remoteVer = verMatch[1]; const currentVer = GM_info.script.version; // ПАРСИНГ ЛОГА ИЗ ТЕКСТА const logMatch = text.match(/@changelog\s+(.*)/); const remoteLog = logMatch ? logMatch[1].trim() : ""; let dateStr = "н/д"; const lastMod = getHeaderSafe(res, "Last-Modified") || getHeaderSafe(res, "Date"); if (lastMod) { const d = new Date(lastMod); if (!isNaN(d.getTime())) { dateStr = `${d.getDate()}.${String(d.getMonth() + 1).padStart(2, '0')}.${String(d.getFullYear()).slice(2)}`; } } updateState.remoteVer = remoteVer; updateState.remoteDate = dateStr; updateState.remoteLog = remoteLog; // Сохраняем лог updateState.hasUpdate = compareVersions(remoteVer, currentVer) > 0; updateState.status = 'success'; if (updateState.hasUpdate) triggerUpdateIndicators(); } catch (e) { updateState.status = 'error'; updateState.details = e.message; } refreshModalUI(); }, onerror: () => { updateState.status = 'error'; updateState.details = "Сеть недоступна"; refreshModalUI(); } }); } function loadVersionHistory() { const container = document.getElementById('version-history-list'); if (!container) return; const apiUrl = 'https://api.github.com/repos/defl-orator/etis-reborn/commits?path=etis.user.js&per_page=10'; GM_xmlhttpRequest({ method: 'GET', url: apiUrl, onload: async function(res) { if (res.status !== 200) { container.innerHTML = '
${oldFooter.innerHTML}
`; oldFooter.remove(); // Удаляем футер } // Текст внутри формы const walker = document.createTreeWalker(loginItems, NodeFilter.SHOW_TEXT, null, false); let node; const nodesToRemove = []; while(node = walker.nextNode()) { if (node.textContent.includes('2396870') || node.textContent.includes('технической поддержки')) { if (!helpTextContent.includes(node.textContent.trim())) { helpTextContent += `${node.textContent.trim()}
`; } nodesToRemove.push(node); } } nodesToRemove.forEach(n => n.remove()); loginItems.querySelectorAll('br').forEach(br => br.remove()); // 3. Создание кнопки "Вопрос" if (helpTextContent) { const helpContainer = document.createElement('div'); helpContainer.className = 'login-help-container'; const helpIcon = document.createElement('div'); helpIcon.className = 'login-help-icon'; helpIcon.textContent = '?'; const helpDropdown = document.createElement('div'); helpDropdown.className = 'login-help-dropdown'; helpDropdown.innerHTML = helpTextContent; // Логика клика helpIcon.addEventListener('click', (e) => { e.stopPropagation(); helpDropdown.classList.toggle('active'); }); // Закрытие при клике снаружи document.addEventListener('click', () => { helpDropdown.classList.remove('active'); }); helpDropdown.addEventListener('click', (e) => e.stopPropagation()); helpContainer.appendChild(helpIcon); helpContainer.appendChild(helpDropdown); document.body.appendChild(helpContainer); } // 4. Стандартная стилизация полей и кнопок const loginActions = document.createElement('div'); loginActions.className = 'login-actions'; loginItems.appendChild(loginActions); if (page != 'stu_email_pkg.send_r_email') { let el = loginItems.querySelector('a'); if (el) { el.className = 'forgot-password'; loginActions.appendChild(el); } } let sbmt = document.getElementById('sbmt'); if(sbmt) loginActions.appendChild(sbmt); const items = loginItems.querySelectorAll('div.item'); items.forEach(item => { const errorMessage = item.querySelector('div.error_message'); if (errorMessage) { loginContainer.prepend(errorMessage); item.remove(); } let input = item.querySelector('input'); let label = item.querySelector('label'); if (input && label) { let labelText = label.textContent.trim(); // Меняем текст плейсхолдера if (labelText === 'Фамилия / email') labelText = 'Email'; input.placeholder = labelText; label.remove(); } }); } else { const submenus = document.querySelectorAll('.submenu'); submenus.forEach(menu => { menu.querySelectorAll('.submenu-item').forEach(span => { const link = span.querySelector('a'); if (link) { span.replaceWith(link); } else { const b = document.createElement('b'); b.textContent = span.textContent.trim(); span.replaceWith(b); } }); // Очистка текстовых узлов и мусора Array.from(menu.childNodes).forEach(node => { if (node.nodeType === Node.TEXT_NODE) { let text = node.textContent.replace(/ |\u00A0/g, '').trim(); if (text) { let b = document.createElement('b'); b.textContent = text; menu.replaceChild(b, node); } else { node.remove(); } } else if (node.tagName === 'BR') { node.remove(); } else if (node.tagName !== 'A' && node.tagName !== 'B') { if (!node.querySelector('a')) { let b = document.createElement('b'); b.textContent = node.textContent.trim(); menu.replaceChild(b, node); } } }); }); // Центрирование активного элемента подменю (вкладки) на мобильных устройствах if (window.innerWidth <= 960) { submenus.forEach(menu => { const activeItem = menu.querySelector('b'); if (activeItem) { setTimeout(() => { const containerWidth = menu.offsetWidth; const itemWidth = activeItem.offsetWidth; const itemLeft = activeItem.offsetLeft; const scrollTarget = itemLeft - (containerWidth / 2) + (itemWidth / 2); menu.scrollTo({ left: scrollTarget, behavior: 'smooth' }); }, 300); } }); } // Style Sidebar const sidebar = document.querySelector("div.span3"); if (sidebar) { const sidebarStyles = document.createElement('style'); sidebarStyles.innerHTML = ` .span3 > .nav.nav-tabs.nav-stacked > li > a { margin: 0 12px 4px 12px !important; padding: 10px 14px !important; border-radius: var(--radius-small) !important; width: auto !important; border: 1px solid transparent !important; transition: background-color 0.15s ease, color 0.15s ease, transform 0.15s ease !important; transform: translateZ(0); -webkit-tap-highlight-color: transparent !important; } @media (hover: hover) and (pointer: fine) { .span3 > .nav.nav-tabs.nav-stacked > li:not(.active) > a:hover { background: var(--color-highlight) !important; } } .span3 > .nav.nav-tabs.nav-stacked > li:not(.active) > a:active { background: var(--color-highlight) !important; opacity: 0.7; } .span3 > ul.nav.nav-tabs.nav-stacked:not(:first-of-type) { display: none !important; } `; safeAppend(sidebarStyles); if (!sidebar.querySelector('.sidebar-logo')) { const logo = document.createElement('div'); logo.className = 'sidebar-logo'; logo.innerHTML = `
ЕТИС
`;
sidebar.prepend(logo);
}
// --- ЛОГИКА ПАСХАЛКИ ЛОГОТИПА ---
const logoImg = sidebar.querySelector('.sidebar-logo img');
const logoContainer = sidebar.querySelector('.sidebar-logo');
if (logoImg && logoContainer) {
const heyLabel = document.createElement('div');
heyLabel.className = 'logo-say-hey';
logoContainer.appendChild(heyLabel);
const phrases = [
'эй', // 10 кликов
'прекрати', // 20
'голова кружится', // 30
'хватит!', // 40
'сейчас упаду...', // 50
'меня тошнит 🤢', // 60
'зачем ты это делаешь?',// 70
'ну всё, я обиделся', // 80
'...помогите...', // 90
'💫💫💫', // 100
'ты думаешь это смешно?', // 110
'у меня пиксели болят', // 120
'я пожалуюсь разработчику!', // 130
'остановись, кому говорю!', // 140
'ты мышку сломаешь', // 150
'заняться совсем нечем?',// 160
'иди учись!', // 170
'пары сами себя не сдадут', // 180
'а курсовая написана?', // 190
'я просто логотип...', // 200
'я сейчас ЕТИС сломаю', // 210
'удаляю твои оценки...', // 220
'шучу, я так не умею', // 230
'но очень хотел бы!', // 240
'окей, я тебя игнорирую',// 250
'...', // 260
'......', // 270
'всё ещё кликаешь?', // 280
'какая выдержка...', // 290
'может, скачаешь кликер?', // 300
'я вызываю полицию мышек', // 310
'🚨 виу-виу-виу 🚨', // 320
'сдаюсь, ты победил', // 330
'возьми с полки пирожок',// 340
'или автомат по физре', // 350
'хотя кого я обманываю', // 360
'я устал крутиться', // 370
'центробежный предел достигнут', // 380
'ты меня укачал 😵💫', // 390
'я вижу матрицу...', // 400
'01000101 01010100', // 410
'я ухожу в спящий режим',// 420
'zzZzzZzz...', // 430
'ты меня разбудил!', // 440
'требую надбавку за вредность', // 450
'создатель мне за это не платит', // 460
'просто. закрой. вкладку.', // 470
'я буду сниться тебе в кошмарах', // 480
'АСТАНАВИТЕС!!!', // 490
'💀 System Error 💀' // 500 кликов
];
let clickCounter = 0;
let isRotateLeft = true;
let resetTimer;
let hideTimer;
let rotateTimer;
logoImg.addEventListener('click', () => {
// 1. Поворот
clearTimeout(rotateTimer);
const angle = isRotateLeft ? -30 : 30;
logoImg.style.transform = `rotate(${angle}deg) scale(1.1)`;
rotateTimer = setTimeout(() => {
logoImg.style.transform = 'rotate(0deg) scale(1)';
}, 250);
isRotateLeft = !isRotateLeft;
// 2. Счётчик кликов
clickCounter++;
// Сбрасываем всё, если не мучать медведя 3 секунды
clearTimeout(resetTimer);
resetTimer = setTimeout(() => {
clickCounter = 0;
heyLabel.classList.remove('active');
}, 3000);
// 3. Проверка порогов (каждые 10 кликов)
if (clickCounter % 10 === 0 && clickCounter > 0) {
const phraseIndex = (clickCounter / 10) - 1;
if (phraseIndex < phrases.length) {
heyLabel.textContent = phrases[phraseIndex];
heyLabel.classList.add('active');
// Прячем фразу через 2 секунды, чтобы она не висела вечно
clearTimeout(hideTimer);
hideTimer = setTimeout(() => {
heyLabel.classList.remove('active');
}, 2000);
}
}
});
}
// 3. Инфо о студенте
const originalInfo = document.querySelector('.navbar-static-top .span12 > span');
if (originalInfo && !sidebar.querySelector('.sidebar-user-info')) {
const userInfoDiv = document.createElement('div');
userInfoDiv.className = 'sidebar-user-info';
const nameText = originalInfo.childNodes[0].textContent.trim();
const subInfo = Array.from(originalInfo.querySelectorAll('span')).map(s => s.textContent.trim());
userInfoDiv.innerHTML = `
${nameText}
${subInfo.map(info => `${info}`).join('')}
`;
const sidebarFooter = sidebar.querySelector('.sidebar-footer');
if (sidebarFooter) sidebar.insertBefore(userInfoDiv, sidebarFooter);
else sidebar.appendChild(userInfoDiv);
}
// 4. ПОДГОТОВКА ВСЕХ ЭЛЕМЕНТОВ
const allNavs = sidebar.querySelectorAll('ul.nav.nav-tabs.nav-stacked');
const mainNav = allNavs[0];
let allListItems = [];
let globalHasNotifications = false;
allNavs.forEach(nav => {
nav.querySelectorAll('li').forEach(li => {
const href = li.querySelector('a')?.getAttribute('href') || '';
if (!href.includes('choose_dis') && !href.includes('fcl_choice') && !href.includes('ebl_choice')) {
allListItems.push(li);
}
});
});
// Вкладка "Настройки"
const settingsLi = document.createElement("li");
settingsLi.className = 'theme-switcher-item';
const settingsLink = document.createElement("a");
settingsLink.style.cursor = 'pointer';
settingsLink.href = "#settings";
settingsLink.textContent = 'Настройки';
settingsLink.addEventListener('click', (e) => {
e.preventDefault();
const side = document.querySelector('.span3');
if (side && side.classList.contains('mobile-active')) {
side.classList.remove('mobile-active');
document.querySelector('.mobile-overlay')?.classList.remove('active');
document.querySelector('.mobile-menu-btn')?.classList.remove('open');
}
openSettingsModal('main');
});
settingsLi.appendChild(settingsLink);
allListItems.push(settingsLi);
// Функция иконок
const getIconForHref = (href) => {
if (href === '#version-check') return 'system_update';
if (href === '#appearance') return 'palette';
if (href === '#report-bug') return 'bug_report';
if (href === '#settings') return 'settings';
if (href.includes('teach_plan')) return 'school';
if (href.includes('timetable')) return 'calendar_today';
if (href.includes('signs')) return 'assignment_turned_in';
if (href.includes('absence')) return 'event_busy';
if (href.includes('stu_phs.show_slots')) return 'directions_run';
if (href.includes('orders')) return 'assignment';
if (href.includes('library')) return 'local_library';
if (href.includes('teachers')) return 'people';
if (href.includes('est_pkg.show_list')) return 'forum';
if (href.includes('group_tt')) return 'playlist_add_check';
if (href.includes('announces')) return 'announcement';
if (href.includes('teacher_notes')) return 'mail';
if (href.includes('ses')) return 'account_balance';
if (href.includes('advice')) return 'lightbulb';
if (href.includes('electr')) return 'public';
if (href.includes('cert_pkg')) return 'description';
if (href.includes('contract_list')) return 'receipt';
if (href.includes('blank_forms')) return 'insert_drive_file';
if (href.includes('portfolio')) return 'folder_shared';
if (href.includes('about')) return 'info';
if (href.includes('term_test')) return 'rate_review';
if (href.includes('special_est_list')) return 'poll';
if (href.includes('change_pass')) return 'vpn_key';
if (href.includes('change_email')) return 'alternate_email';
if (href.includes('change_pr_page')) return 'account_box';
if (href.includes('logout')) return 'exit_to_app';
return 'chevron_right';
};
const allowedDotHrefs = ['stu_ann.announces', 'stu.teacher_notes', 'est_pkg.show_list'];
// Обработка элементов (Добавление иконок и точек)
allListItems.forEach(li => {
const a = li.querySelector('a');
if (!a) return;
const href = a.getAttribute('href') || '';
let itemHasNotification = false;
Array.from(a.childNodes).forEach(node => {
if (node.nodeType === Node.TEXT_NODE) {
const match = node.textContent.match(/\s*\(([^)]+)\)\s*$/);
if (match) {
const counterStr = match[1];
const counts = counterStr.split('/');
const lastCount = counts[counts.length - 1].trim();
if (lastCount !== '0') itemHasNotification = true;
node.textContent = node.textContent.replace(/\s*\([^)]+\)\s*$/, '');
}
}
});
const etisBadge = a.querySelector('.badge');
if (etisBadge) {
if (etisBadge.textContent.trim() !== '0') itemHasNotification = true;
etisBadge.remove();
}
const iconName = getIconForHref(href);
const pureText = a.textContent.trim();
a.innerHTML = '';
const iconSpan = document.createElement('span');
iconSpan.className = 'material-icons';
iconSpan.textContent = iconName;
iconSpan.style.marginRight = '12px';
iconSpan.style.flexShrink = '0';
a.appendChild(iconSpan);
const textSpan = document.createElement('span');
textSpan.className = 'sidebar-link-text';
textSpan.textContent = pureText;
a.appendChild(textSpan);
const isAllowed = allowedDotHrefs.some(target => href.includes(target)) || href.includes('term_test');
if (itemHasNotification && isAllowed) {
globalHasNotifications = true;
const dot = document.createElement('span');
dot.className = 'badge-point';
a.appendChild(dot);
}
// --- БЕЗОПАСНОЕ ОБНОВЛЕНИЕ БЕЗ ПАРАМЕТРОВ ---
if (allowedDotHrefs.some(target => href.includes(target))) {
a.onclick = function(e) {
if (window.location.href.includes(href)) {
e.preventDefault();
window.location.reload();
}
};
}
});
if (globalHasNotifications) {
const mobileBtn = document.querySelector('.mobile-menu-btn');
if (mobileBtn) mobileBtn.classList.add('has-updates');
}
// 5. ГРУППИРОВКА И СОРТИРОВКА
mainNav.innerHTML = '';
const groupsOrder = [
['teach_plan'],
['timetable', 'signs', 'absence', 'stu_phs.show_slots'],
['announces', 'teacher_notes', 'teachers', 'est_pkg.show_list'],
['orders', 'cert_pkg', 'contract_list', 'blank_forms', 'portfolio', 'group_tt'],
['library', 'electr', 'advice', 'ses', 'about'],
['term_test', 'special_est_list', 'оцените дистанционное'],
['#settings', 'change_pass', 'change_email', 'change_pr_page', 'logout']
];
const usedItems = new Set();
groupsOrder.forEach((groupPatterns, index) => {
groupPatterns.forEach(pattern => {
const li = allListItems.find(item => {
if (usedItems.has(item)) return false;
const h = item.querySelector('a')?.getAttribute('href') || '';
const t = item.textContent.toLowerCase();
if (pattern === 'оцените дистанционное') return t.includes('дистанционн');
return h.includes(pattern);
});
if (li) {
mainNav.appendChild(li);
usedItems.add(li);
}
});
if (index < groupsOrder.length - 1) {
const separator = document.createElement('div');
separator.style.height = '1px';
separator.style.background = 'var(--color-table-border)';
separator.style.margin = '1rem 1.6rem 1.4rem 1.6rem';
mainNav.appendChild(separator);
}
});
const remaining = allListItems.filter(li => !usedItems.has(li));
if (remaining.length > 0) {
const separator = document.createElement('div');
separator.style.height = '1px';
separator.style.background = 'var(--color-table-border)';
separator.style.margin = '1rem 1.6rem 1.4rem 1.6rem';
mainNav.appendChild(separator);
remaining.forEach(li => mainNav.appendChild(li));
}
// 6. Активный класс и скролл
requestAnimationFrame(() => {
const top = sessionStorage.getItem("sidebar-scroll");
if (top) sidebar.scrollTop = parseInt(top, 10);
window.addEventListener("beforeunload", () => {
sessionStorage.setItem("sidebar-scroll", Math.round(sidebar.scrollTop));
});
});
const currentFullUrl = window.location.pathname.split('/').pop() + window.location.search;
let bestMatch = null;
let maxMatchLength = -1;
mainNav.querySelectorAll('li').forEach(li => {
li.classList.remove('active');
const href = li.querySelector('a')?.getAttribute('href');
if (!href || href.startsWith('#')) return;
if (currentFullUrl.startsWith(href)) {
if (href.length > maxMatchLength) {
maxMatchLength = href.length;
bestMatch = li;
}
}
});
if (bestMatch) bestMatch.classList.add('active');
else {
const currentBase = currentFullUrl.split('?')[0].split('.').pop();
// --- ФИКС ПОДСВЕТКИ ДЛЯ СКРЫТЫХ ВКЛАДОК ---
if (currentBase === 'ebl_choice' || currentBase === 'fcl_choice' || currentBase === 'choose_dis') {
const tpLi = Array.from(mainNav.querySelectorAll('li')).find(li => li.querySelector('a')?.getAttribute('href')?.includes('teach_plan'));
if (tpLi) tpLi.classList.add('active');
} else {
mainNav.querySelectorAll('li').forEach(li => {
const href = li.querySelector('a')?.getAttribute('href') || '';
if (currentBase.length > 3 && href.includes(currentBase)) li.classList.add('active');
});
}
}
// Подвал
if (!sidebar.querySelector('.sidebar-footer')) {
const footer = document.createElement('div');
footer.className = 'sidebar-footer';
// flex-контейнер для ссылок, чтобы они красиво шли друг под другом
footer.innerHTML = `
`;
sidebar.appendChild(footer);
// Функция для закрытия мобильного меню
const closeMobileMenu = () => {
const side = document.querySelector('.span3');
if (side && side.classList.contains('mobile-active')) {
side.classList.remove('mobile-active');
document.querySelector('.mobile-overlay')?.classList.remove('active');
document.querySelector('.mobile-menu-btn')?.classList.remove('open');
}
};
// Обработчик: Нашли ошибку?
const bugLinkFooter = footer.querySelector('#footer-report-bug');
if (bugLinkFooter) {
bugLinkFooter.addEventListener('click', (e) => {
e.preventDefault();
closeMobileMenu();
openUserscriptBugModal();
});
}
sidebar.appendChild(footer);
}
}
// Main page content
const span9 = document.querySelector('div.span9');
if (!span9 && !document.querySelector('.login')) return;
const urlParams = new URLSearchParams(window.location.search);
const pageMode = urlParams.get('p_mode');
const warning = document.querySelector('div.warning');
if (warning && span9) {
span9.prepend(warning);
}
let el, btn, img;
// УНИВЕРСАЛЬНАЯ ФУНКЦИЯ ДЛЯ КРАСИВОЙ ДАТЫ (macOS Style)
// Текущий год: "Пт, 6 марта 16:35"
// Прошлые годы: "6 марта 2024" (без времени)
const formatEtisDate = (rawStr) => {
if (!rawStr) return '';
const match = rawStr.match(/(\d{2})\.(\d{2})\.(\d{4})\s(\d{2}:\d{2})/);
if (match) {
const day = parseInt(match[1], 10);
const monthIndex = parseInt(match[2], 10) - 1; // Месяцы в JS от 0 до 11
const year = parseInt(match[3], 10);
const time = match[4];
const dateObj = new Date(year, monthIndex, day);
const now = new Date();
const months = ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'];
const shortDays = ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'];
const monthName = months[monthIndex];
// 1. Текущий год: День недели, Число Месяц Время
if (year === now.getFullYear()) {
const dayName = shortDays[dateObj.getDay()];
return `${dayName}, ${day} ${monthName} ${time}`;
}
// 2. Прошлые годы: Число Месяц Год (время убираем)
return `${day} ${monthName} ${year}`;
}
return rawStr;
};
// --- МЯГКАЯ ИКОНКА ПОДЕЛИТЬСЯ (SVG) ---
const softShareSVG = `
`;
// --- ФУНКЦИЯ СКРИНШОТА СООБЩЕНИЯ/ОБЪЯВЛЕНИЯ ---
const shareMessageCard = (cardElement, defaultFileName) => {
const originalBtnContainer = cardElement.querySelector('.share-msg-wrap');
const originalSVG = originalBtnContainer ? originalBtnContainer.innerHTML : '';
if (originalBtnContainer) {
originalBtnContainer.innerHTML = '';
}
const renderScreenshot = () => {
let h2c = null;
if (typeof html2canvas !== 'undefined') h2c = html2canvas;
else if (typeof unsafeWindow !== 'undefined' && unsafeWindow.html2canvas) h2c = unsafeWindow.html2canvas;
else if (typeof window !== 'undefined' && window.html2canvas) h2c = window.html2canvas;
if (!h2c) {
console.error('html2canvas не найден');
cleanup(true);
return;
}
const isMobile = window.innerWidth <= 960;
const renderWidth = 540;
const exportContainer = document.createElement('div');
exportContainer.style.position = 'fixed';
exportContainer.style.top = '100vh';
exportContainer.style.left = '0';
exportContainer.style.width = renderWidth + 'px';
exportContainer.style.padding = isMobile ? '24px 24px 12px 24px' : '40px 40px 20px 40px';
exportContainer.style.boxSizing = 'border-box';
exportContainer.style.background = getComputedStyle(document.body).getPropertyValue('--color-body').trim() || '#F2F2F6';
exportContainer.style.fontFamily = getComputedStyle(document.body).fontFamily;
exportContainer.style.zIndex = '-9999';
const span9Wrapper = document.createElement('div');
span9Wrapper.className = 'span9';
span9Wrapper.style.setProperty('margin', '0', 'important');
span9Wrapper.style.setProperty('padding', '0', 'important');
span9Wrapper.style.setProperty('width', '100%', 'important');
// Клонируем карточку
const clone = cardElement.cloneNode(true);
// Получаем текущий цвет из конфига, чтобы скриншот был в цвет темы
const accConfig = JSON.parse(localStorage.getItem('etis_accent_config')) || { colors: ['blue'] };
const fallbackColor = '#007AFF'; // дефолтный синий
const currentAccentHex = ACCENT_COLORS[accConfig.colors[0]] || fallbackColor;
// Находим все элементы, которые могут иметь градиентный текст
const gradientSelectors = '.msg-sender, .msg-sender *, .teacher-name-link, .review-dis-link, .accent-stat, .file-attachment-link .material-icons';
clone.querySelectorAll(gradientSelectors).forEach(el => {
// Полностью вычищаем свойства градиента
el.style.setProperty('background', 'none', 'important');
el.style.setProperty('background-image', 'none', 'important');
el.style.setProperty('-webkit-background-clip', 'unset', 'important');
el.style.setProperty('background-clip', 'unset', 'important');
el.style.setProperty('-webkit-text-fill-color', currentAccentHex, 'important');
el.style.setProperty('color', currentAccentHex, 'important');
// Возвращаем правильный display, чтобы иконка и текст не слипались
if (el.classList.contains('msg-sender')) {
el.style.setProperty('display', 'flex', 'important');
} else {
el.style.setProperty('display', 'inline-block', 'important');
}
});
// Принудительно убиваем отступы снаружи карточки у клона
clone.style.setProperty('margin', '0', 'important');
// Удаляем обертку кнопки из клона
const cloneShareBtn = clone.querySelector('.share-msg-wrap');
if (cloneShareBtn) cloneShareBtn.remove();
clone.querySelectorAll('.answer-wrapper, .send-reply-btn, div[id^="frm_"], .msg-footer button').forEach(el => el.remove());
const cloneFooter = clone.querySelector('.msg-footer');
if (cloneFooter && cloneFooter.innerHTML.trim() === '') cloneFooter.remove();
// --- ГЕНЕРАЦИЯ УМНОГО ИМЕНИ ФАЙЛА ---
let dynamicFileName = defaultFileName;
if (defaultFileName.includes('.png')) {
const base = defaultFileName.replace('.png', '').toLowerCase();
// Достаем отправителя (очищаем от иконок и берем первое слово, например "Деканат")
const senderRaw = clone.querySelector('.msg-sender')?.textContent.replace(/campaign|person/g, '').trim() || '';
const sender = senderRaw.split('/')[0].trim().replace(/\s+/g, '-').toLowerCase();
// Достаем дату и превращаем "25 марта 10:41" в "25.03"
const dateRaw = clone.querySelector('.msg-date-text')?.textContent.trim() || '';
let dateShort = '';
const dmMatch = dateRaw.match(/(\d{1,2})\s+([а-яА-Я]+)/);
if (dmMatch) {
const mMap = {'января':'01', 'февраля':'02', 'марта':'03', 'апреля':'04', 'мая':'05', 'июня':'06', 'июля':'07', 'августа':'08', 'сентября':'09', 'октября':'10', 'ноября':'11', 'декабря':'12'};
const m = mMap[dmMatch[2].toLowerCase()] || '01';
const d = dmMatch[1].padStart(2, '0');
dateShort = `${d}.${m}`;
} else {
const isoMatch = dateRaw.match(/(\d{2})\.(\d{2})/);
if (isoMatch) dateShort = `${isoMatch[1]}.${isoMatch[2]}`;
}
const parts = [base];
if (sender) parts.push(sender);
if (dateShort) parts.push(dateShort);
dynamicFileName = parts.join('-') + '.png';
}
span9Wrapper.appendChild(clone);
// --- НЕЗАМЕТНАЯ ВОТЕРМАРКА ---
if (generalConfig.watermark) {
const watermark = document.createElement('div');
watermark.style.cssText = 'text-align: right; margin-top: 12px; width: 100%; box-sizing: border-box;';
watermark.innerHTML = `etisreborn.ru`;
span9Wrapper.appendChild(watermark);
}
exportContainer.appendChild(span9Wrapper);
document.body.appendChild(exportContainer);
h2c(exportContainer, {
scale: 2,
useCORS: true,
windowWidth: renderWidth,
backgroundColor: getComputedStyle(document.body).getPropertyValue('--color-body').trim() || '#F2F2F6'
}).then(canvas => {
canvas.toBlob(blob => {
if (!blob) throw new Error('Blob creation failed');
const file = new File([blob], dynamicFileName, { type: 'image/png' });
if (isMobile && navigator.canShare && navigator.canShare({ files: [file] })) {
navigator.share({
files: [file],
title: defaultFileName.replace('.png', '')
}).then(() => cleanup())
.catch(err => cleanup(true));
} else {
const link = document.createElement('a');
link.download = defaultFileName;
link.href = URL.createObjectURL(blob);
link.click();
URL.revokeObjectURL(link.href);
cleanup();
}
}, 'image/png');
}).catch(err => {
console.error('Screenshot error:', err);
cleanup(true);
});
function cleanup(isError = false) {
exportContainer.remove();
if (originalBtnContainer) {
originalBtnContainer.innerHTML = isError ? '' : '';
setTimeout(() => { originalBtnContainer.innerHTML = originalSVG; }, 2000);
}
}
};
let h2cObj = typeof html2canvas !== 'undefined' ? html2canvas : (window.html2canvas || (typeof unsafeWindow !== 'undefined' ? unsafeWindow.html2canvas : null));
if (!h2cObj) {
const script = document.createElement('script');
script.src = 'https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js';
script.onload = () => {
renderScreenshot();
};
script.onerror = () => {
if (originalBtnContainer) {
originalBtnContainer.innerHTML = '';
setTimeout(() => { originalBtnContainer.innerHTML = originalSVG; }, 2000);
}
};
safeAppend(script);
} else {
renderScreenshot();
}
};
// --- ФУНКЦИЯ СВАЙПОВ ДЛЯ СООБЩЕНИЙ/ОБЪЯВЛЕНИЙ (МОБИЛЬНЫЕ) ---
const initMessageSwipes = (container, defaultFileName) => {
if (window.innerWidth > 960) return; // Только для мобилок
let bubble = document.getElementById('swipe-action-bubble');
if (!bubble) {
bubble = document.createElement('div');
bubble.id = 'swipe-action-bubble';
bubble.innerHTML = '';
document.body.appendChild(bubble);
}
const iconEl = bubble.querySelector('.material-icons');
let startX = 0, startY = 0, currentCard = null, originalRect = null;
let isSwiping = false, isScrollDetermined = false;
const THRESHOLD = 80;
container.addEventListener('touchstart', (e) => {
const touch = e.touches[0];
startX = touch.clientX; startY = touch.clientY;
isSwiping = false; isScrollDetermined = false;
currentCard = e.target.closest('.msg-card');
if (currentCard) {
originalRect = currentCard.getBoundingClientRect();
currentCard.style.transition = 'none';
}
}, { passive: true });
container.addEventListener('touchmove', (e) => {
if (!currentCard || !originalRect) return;
const touch = e.touches[0];
const diffX = touch.clientX - startX;
const diffY = touch.clientY - startY;
if (!isScrollDetermined) {
if (Math.abs(diffX) < 10 && Math.abs(diffY) < 10) return;
isScrollDetermined = true;
// Разрешаем только свайп ВЛЕВО (diffX < 0). Скролл вниз игнорируем
if (Math.abs(diffY) > Math.abs(diffX) || diffX > 0) {
currentCard = null; return;
}
isSwiping = true;
bubble.className = '';
iconEl.textContent = 'ios_share';
}
if (isSwiping && diffX < 0) {
let moveX = diffX;
// Пружинистое сопротивление
if (Math.abs(moveX) > THRESHOLD) moveX = -THRESHOLD - (Math.abs(moveX) - THRESHOLD) * 0.25;
currentCard.style.transform = `translateX(${moveX}px)`;
bubble.style.top = `${originalRect.top + originalRect.height / 2 - 12}px`;
bubble.style.left = `${originalRect.right + (moveX / 2) - 12}px`;
bubble.style.opacity = Math.min(Math.abs(diffX) / 30, 1).toString();
if (Math.abs(diffX) >= THRESHOLD) {
bubble.classList.add('active-threshold', 'action-share');
if (!bubble.dataset.vibrated && navigator.vibrate) {
navigator.vibrate(15); bubble.dataset.vibrated = 'true';
}
} else {
bubble.classList.remove('active-threshold', 'action-share');
bubble.dataset.vibrated = '';
}
}
}, { passive: true });
container.addEventListener('touchend', (e) => {
if (!currentCard || !isSwiping) return;
const diffX = e.changedTouches[0].clientX - startX;
const cardToShare = currentCard;
currentCard.style.transition = 'transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)';
currentCard.style.transform = 'translateX(0px)';
bubble.style.opacity = '0';
bubble.classList.remove('active-threshold', 'action-share');
bubble.dataset.vibrated = '';
if (diffX <= -THRESHOLD) {
setTimeout(() => shareMessageCard(cardToShare, defaultFileName), 150);
}
currentCard = null; isSwiping = false;
});
};
switch (page) {
case 'stu.teach_plan':
case 'stu.fcl_choice':
case 'stu.ebl_choice':
case 'ebl_stu.ebl_choice': {
const params = new URLSearchParams(window.location.search);
const currentMode = params.get('p_mode');
let submenu = span9.querySelector('.submenu');
// 1. Создаем контейнер меню
if (!submenu) {
submenu = document.createElement('div');
submenu.className = 'submenu';
const h3 = span9.querySelector('h3') || span9.firstChild;
if (h3 && h3.parentNode) {
h3.parentNode.insertBefore(submenu, h3.nextSibling);
} else {
span9.prepend(submenu);
}
}
// 2. ГЕНЕРАЦИЯ МЕНЮ
submenu.innerHTML = `
Подробно
Кратко
Факультативы
Элективы
Дисциплины по выбору
`;
// 3. Подсветка активной вкладки
const links = Array.from(submenu.querySelectorAll('a'));
links.forEach(link => {
const href = link.getAttribute('href');
let isActive = false;
if (page === 'stu.teach_plan') {
if (href.includes('p_mode=advanced')) {
if (currentMode === 'advanced') isActive = true;
}
else if (href.includes('p_mode=short')) {
if (currentMode === 'short' || !currentMode) isActive = true;
}
else if (href.includes('p_mode=choose_dis') && currentMode === 'choose_dis') {
isActive = true;
}
}
else if ((page === 'stu.ebl_choice' || page === 'ebl_stu.ebl_choice') && href.includes('ebl_choice')) {
isActive = true;
}
else if (page === 'stu.fcl_choice' && href.includes('fcl_choice')) {
isActive = true;
}
if (isActive) {
const b = document.createElement('b');
b.textContent = link.textContent;
link.replaceWith(b);
}
});
// --- КНОПКА ОЦЕНКИ В SUBMENU ---
const planEvalBtn = span9.querySelector('a[onclick*="cust.est_plan_form_stu"], a[href*="cust.est_plan_form_stu"]');
if (planEvalBtn) {
// Сбрасываем всё лишнее
planEvalBtn.className = 'eval-plan-link';
planEvalBtn.innerHTML = 'Оценить учебный план';
// Добавляем в конец сабменю
if (submenu) {
submenu.appendChild(planEvalBtn);
}
}
// Очистка от лишних оберток ЕТИСа, которые могут создавать пустые места
span9.querySelectorAll('div[style*="inline-block"]').forEach(div => {
div.style.display = 'block';
div.style.width = '100%';
});
// --- СТИЛИЗАЦИЯ КОНТЕНТА ---
if (page === 'stu.teach_plan') {
const isAdvanced = currentMode === 'advanced';
const isChooseDis = currentMode === 'choose_dis';
// Перенос номера плана (для дисциплин по выбору)
if (isChooseDis) {
const tpInfo = Array.from(span9.querySelectorAll('div')).find(d =>
d.textContent.includes('Учебный план') && d.textContent.trim().length < 30 && d.parentNode === span9
);
const targetH3 = Array.from(span9.querySelectorAll('h3')).find(h => h.textContent.includes('Блоки дисциплин'));
if (tpInfo && targetH3) {
const headerFlex = document.createElement('div');
headerFlex.className = 'subject-header-flex';
headerFlex.style.marginTop = '2rem';
const capsule = document.createElement('div');
capsule.className = 'subject-score-capsule';
capsule.style.background = 'var(--color-highlight)';
capsule.style.color = 'var(--color-text-secondary)';
capsule.style.border = '1px solid var(--color-table-border)';
capsule.style.boxShadow = 'none';
const tpNumber = tpInfo.textContent.replace(/Учебный план/i, '').trim();
capsule.innerHTML = ` План №${tpNumber}`;
targetH3.parentNode.insertBefore(headerFlex, targetH3);
headerFlex.appendChild(targetH3);
headerFlex.appendChild(capsule);
tpInfo.remove();
}
}
span9.querySelectorAll('br').forEach((br, i) => { if(i < 3) br.remove(); });
// ПОДРОБНЫЙ ВИД
if (isAdvanced) {
const calendarGrid = document.createElement('div');
calendarGrid.className = 'calendar-grid';
const headers = Array.from(span9.querySelectorAll('b')).filter(b => {
const text = b.textContent.toLowerCase();
return text.includes('триместр') || text.includes('семестр');
});
headers.forEach(header => {
const card = document.createElement('div');
card.className = 'calendar-card';
const h4 = document.createElement('h4');
h4.textContent = header.textContent.toUpperCase();
card.appendChild(h4);
let next = header.parentElement.tagName === 'P' ? header.parentElement : header;
let current = next.nextSibling;
const toRem =[header, header.parentElement];
// В условии цикла while проверяем оба варианта через regex
while (current && current.tagName !== 'TABLE' && !(current.querySelector && current.querySelector('b')?.textContent.toLowerCase().match(/триместр|семестр/))) {
let nxt = current.nextSibling;
if (current.nodeType === 1 && (current.tagName === 'DIV' || current.tagName === 'P')) {
const row = document.createElement('div');
row.className = 'calendar-event';
const txt = current.textContent.trim();
const m = txt.match(/^(\d{2}\.\d{2}\.\d{4}\s-\s\d{2}\.\d{2}\.\d{4})(.*)/);
if (m) row.innerHTML = `${m[1]}${m[2].trim()}`;
else if (txt.length > 5) row.innerHTML = `${txt}`;
card.appendChild(row);
toRem.push(current);
}
current = nxt;
}
if (card.children.length > 1) calendarGrid.appendChild(card);
toRem.forEach(el => el?.remove?.());
});
const mainTitle = Array.from(span9.querySelectorAll('h3')).find(h => h.textContent.includes('Календарный учебный график'));
if (mainTitle) mainTitle.after(calendarGrid);
span9.querySelectorAll('table.teach_plan').forEach(table => {
const wrapper = document.createElement('div');
wrapper.className = 'wide-table-wrapper';
table.parentNode.insertBefore(wrapper, table);
wrapper.appendChild(table);
});
}
// КРАТКИЙ ВИД (Добавляем капсулы)
if (!isAdvanced && !isChooseDis) {
const shortTables = span9.querySelectorAll('table.teach_plan, table.common');
shortTables.forEach(table => {
if (!table.parentNode.classList.contains('wide-table-wrapper')) {
const wrapper = document.createElement('div');
wrapper.className = 'wide-table-wrapper';
table.parentNode.insertBefore(wrapper, table);
wrapper.appendChild(table);
}
// --- ЛОГИКА КАПСУЛ ---
table.querySelectorAll('td').forEach(cell => {
const text = cell.textContent.replace(/\s/g, '').toLowerCase();
let bg, color;
if (text === 'экзамен') {
// СИНИЙ
bg = 'rgba(0, 122, 255, 0.15)';
color = 'var(--color-blue)';
} else if (text === 'зачет' || text === 'зачёт') {
// ЗЕЛЕНЫЙ
bg = 'rgba(52, 199, 89, 0.15)';
color = 'var(--color-green)';
}
if (bg) {
cell.innerHTML = `${cell.textContent.trim()}`;
}
});
});
}
// Дисциплины по выбору
if (isChooseDis) {
span9.querySelectorAll('table.common').forEach(table => {
const wrapper = document.createElement('div');
wrapper.className = 'wide-table-wrapper';
table.parentNode.insertBefore(wrapper, table);
wrapper.appendChild(table);
});
}
}
// 2. ЭЛЕКТИВЫ И ФАКУЛЬТАТИВЫ
if (page === 'stu.ebl_choice' || page === 'stu.fcl_choice' || page === 'ebl_stu.ebl_choice') {
span9.querySelectorAll('table.common').forEach(table => {
const wrapper = document.createElement('div');
wrapper.className = 'wide-table-wrapper';
table.parentNode.insertBefore(wrapper, table);
wrapper.appendChild(table);
});
span9.querySelectorAll('br').forEach((br, i) => { if(i < 3) br.remove(); });
const headers = span9.querySelectorAll('h3');
headers.forEach(h => {
h.style.marginTop = '2rem';
h.style.marginBottom = '1.5rem';
});
}
break;
}
case 'stu_phs.show_slots': {
// 1. Меняем главный заголовок
const h2 = span9.querySelector('h2');
if (h2 && h2.textContent.includes('Прикладная')) {
h2.textContent = 'Учебный период и количество занятий';
h2.style.marginBottom = '2.4rem';
}
// 2. Ремонтируем и стилизуем таблицу
const table = span9.querySelector('table.common');
if (table) {
// Удаляем первый Вставьте ссылку на ваш публичный календарь в формате .ics (iCloud, Google), чтобы видеть личные события прямо в расписании ЕТИС. Можно добавить несколько!
${line}
`; } }); infoBox.innerHTML = `${line}
`; } }); infoBox.innerHTML = `${line}
`; }).join(''); infoBox.innerHTML = `${line}
`) .join(''); infoBox.innerHTML = `