/* Match: HR_TG_Bot/tgFlaskForm .../cabinet/tailwind_config.js + cabinet/login.html */ :root { --surface: #ffffff; --surface-container-low: #f3f8f9; --surface-container: #eaf3f5; --surface-container-high: #dfeef1; --on-surface: #0d1b1d; --on-surface-variant: #3d5357; --primary: #007168; --on-primary: #ffffff; --primary-container: #56f1e0; --on-primary-container: #00574f; --secondary: #506965; --secondary-container: #cce8e3; --on-secondary-container: #3d5653; --error: #af3d3b; --outline-variant: #b9bc94; --outline: #80835f; --shadow-card: 0 8px 40px rgba(0, 0, 0, 0.08); --radius-card: 2rem; --max-content: 42rem; /* max-w-2xl */ color-scheme: light; } *, *::before, *::after { box-sizing: border-box; } html { color-scheme: light; } body { margin: 0; min-height: 100dvh; font-family: 'Inter', system-ui, -apple-system, sans-serif; background: var(--surface-container-low); color: var(--on-surface); -webkit-tap-highlight-color: transparent; line-height: 1.45; } #root { min-height: 100dvh; } .font-headline, h1, h2, h3 { font-family: 'Manrope', 'Inter', sans-serif; font-weight: 700; letter-spacing: -0.02em; line-height: 1.2; color: var(--on-surface); } h1 { font-size: 1.5rem; } h2 { font-size: 1.25rem; margin: 0 0 0.75rem; } h3 { font-size: 1.1rem; margin: 1.25rem 0 0.5rem; } a { color: var(--primary); text-decoration: none; font-weight: 500; transition: color 0.15s ease; } a:hover { color: var(--on-primary-container); text-decoration: underline; } code, .code-inline { display: inline-block; background: var(--secondary-container); color: var(--on-primary-container); padding: 1px 7px; border-radius: 5px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.8rem; font-weight: 500; } .text-muted, .text-secondary { color: var(--secondary); font-size: 0.875rem; } .material-symbols-outlined { font-family: 'Material Symbols Outlined', sans-serif; font-weight: normal; font-style: normal; line-height: 1; letter-spacing: normal; text-transform: none; display: inline-block; white-space: nowrap; word-wrap: normal; font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24; direction: ltr; -webkit-font-feature-settings: 'liga'; font-feature-settings: 'liga'; -webkit-font-smoothing: antialiased; } /* --- Login (cabinet/login.html) --- */ .login-page { min-height: 100dvh; display: flex; align-items: center; justify-content: center; padding: 1.5rem; background: #ffffff; } .login-shell { width: 100%; max-width: 24rem; /* max-w-sm */ transition: max-width 0.2s ease-out; } .login-logo { text-align: center; margin-bottom: 2rem; } .login-logo__frame { width: 4rem; height: 4rem; border-radius: 1.5rem; background: #fff; display: flex; align-items: center; justify-content: center; margin: 0 auto 1rem; box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08); border: 1px solid color-mix(in srgb, var(--outline-variant) 25%, transparent); overflow: hidden; } .login-logo__frame .material-symbols-outlined { font-size: 2.25rem; color: var(--primary); } .login-page h1 { font-size: 1.5rem; font-weight: 800; color: var(--primary); margin: 0 0 0.25rem; } .login-subtitle { color: var(--secondary); font-size: 0.875rem; margin: 0; } .login-card { background: #fff; border-radius: var(--radius-card); box-shadow: var(--shadow-card); padding: 1.5rem; } /* Form controls */ .form-label { display: block; font-size: 0.9rem; font-weight: 500; color: var(--on-surface); margin-bottom: 0.35rem; } .form-input { width: 100%; padding: 11px 13px; border: 1.5px solid var(--outline-variant); border-radius: 0.75rem; font-size: 15px; font-family: inherit; outline: none; background: var(--surface-container-low); color: var(--on-surface); transition: border-color 0.15s, box-shadow 0.15s, background 0.15s; } .form-input::placeholder { color: var(--on-surface-variant); opacity: 0.7; } .form-input:focus { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(0, 113, 104, 0.12); background: #fff; } .form-field { margin-bottom: 0.75rem; } /* Buttons */ .btn { font-family: inherit; font-size: 0.9375rem; font-weight: 600; padding: 0.55rem 1.1rem; border-radius: 0.75rem; border: 1.5px solid transparent; cursor: pointer; transition: background 0.15s, color 0.15s, border-color 0.15s, box-shadow 0.15s; } .btn-primary { background: var(--primary); color: var(--on-primary); width: 100%; padding-top: 0.65rem; padding-bottom: 0.65rem; margin-top: 0.5rem; } .btn-primary:hover { background: #00645b; filter: none; } .btn-primary:active { transform: scale(0.99); } .btn-ghost { background: transparent; color: var(--primary); border-color: color-mix(in srgb, var(--outline-variant) 70%, transparent); } .btn-ghost:hover { background: var(--surface-container); border-color: var(--primary); } .btn-ghost:disabled, .btn-primary:disabled { opacity: 0.5; cursor: not-allowed; } .btn--sm { font-size: 0.8rem; padding: 0.5rem 0.75rem; border-radius: 0.5rem; min-height: 2.75rem; min-width: 2.75rem; box-sizing: border-box; } /* --- App shell (cabinet/base) --- */ .cabinet-app { min-height: 100dvh; display: flex; flex-direction: column; background: var(--surface); } .cabinet-page--center { display: flex; align-items: center; justify-content: center; min-height: 100dvh; padding: 1.5rem; } .cabinet-header { position: sticky; top: 0; z-index: 20; background: color-mix(in srgb, var(--surface) 88%, transparent); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); border-bottom: 1px solid color-mix(in srgb, var(--outline-variant) 35%, transparent); } .cabinet-header__inner { max-width: var(--max-content); margin: 0 auto; padding: 0.75rem 1.25rem; display: flex; align-items: center; justify-content: space-between; gap: 1rem; } .cabinet-brand { display: flex; align-items: center; gap: 0.65rem; color: var(--on-surface); text-decoration: none; min-width: 0; } .cabinet-brand:hover { text-decoration: none; color: var(--on-surface); } .cabinet-brand__icon { font-size: 1.75rem; color: var(--primary); background: var(--surface-container-low); border-radius: 0.75rem; padding: 0.35rem; border: 1px solid color-mix(in srgb, var(--outline-variant) 30%, transparent); flex-shrink: 0; } .cabinet-brand__title { font-family: 'Manrope', 'Inter', sans-serif; font-weight: 800; font-size: 1rem; line-height: 1.2; letter-spacing: -0.02em; } .cabinet-brand__subtitle { font-size: 0.7rem; color: var(--secondary); text-transform: uppercase; letter-spacing: 0.04em; font-weight: 600; } .cabinet-header__actions { display: flex; align-items: center; gap: 0.75rem; flex-shrink: 0; } .cabinet-user { font-size: 0.8rem; color: var(--on-surface-variant); text-align: right; max-width: 12rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: none; } @media (min-width: 480px) { .cabinet-user { display: inline; } } .cabinet-user__role { color: var(--secondary); font-weight: 500; } .cabinet-main { flex: 1; max-width: var(--max-content); width: 100%; margin: 0 auto; padding: 1.25rem 1.25rem calc(2.5rem + env(safe-area-inset-bottom, 0px)); } /* Cards & lists */ .surface-card { background: var(--surface); border: 1px solid color-mix(in srgb, var(--outline-variant) 30%, transparent); border-radius: 1rem; padding: 1rem 1.1rem; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04); } .list-stack { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.5rem; } .list-row { display: block; border: 1px solid color-mix(in srgb, var(--outline-variant) 30%, transparent); border-radius: 1rem; padding: 0.9rem 1rem; background: var(--surface); transition: border-color 0.15s, box-shadow 0.15s; } .list-row:hover { border-color: color-mix(in srgb, var(--primary) 35%, var(--outline-variant)); box-shadow: 0 2px 12px rgba(0, 113, 104, 0.08); } .list-row a { text-decoration: none; color: var(--on-surface); font-weight: 600; } .list-row a:hover { color: var(--primary); text-decoration: none; } .list-row__meta { color: var(--secondary); font-size: 0.8rem; display: block; margin-top: 0.25rem; } /* «· v1» и хвост мета — не рвём посередине (мобайл) */ .list-row__meta-tail { white-space: nowrap; } /* Вся плитка — одна ссылка */ .list-row--action { padding: 0; overflow: hidden; } .list-row--action .list-row__link { display: block; padding: 0.9rem 1rem; text-decoration: none; color: inherit; outline-offset: 2px; border-radius: inherit; transition: background 0.12s ease; } .list-row--action .list-row__link:hover { background: color-mix(in srgb, var(--primary) 6%, transparent); text-decoration: none; } .list-row--action .list-row__title { display: block; color: var(--on-surface); font-weight: 600; } /* Список: слева ссылка на карточку, справа «Пройти» */ .list-row--split { display: flex; flex-direction: row; align-items: stretch; padding: 0; overflow: hidden; gap: 0; } .list-row--split .list-row__main { flex: 1; min-width: 0; } .list-row--split .list-row__link { display: block; padding: 0.9rem 1rem; text-decoration: none; color: inherit; outline-offset: 2px; border-radius: 0.85rem 0 0 0.85rem; transition: background 0.12s ease; } .list-row--split .list-row__link:hover { background: color-mix(in srgb, var(--primary) 6%, transparent); text-decoration: none; } .list-row--split .list-row__side { display: flex; align-items: center; padding: 0.5rem 0.9rem 0.5rem 0; flex-shrink: 0; border-left: 1px solid color-mix(in srgb, var(--outline-variant) 35%, transparent); } .list-row--split .list-row__title { display: block; color: var(--on-surface); font-weight: 600; } @media (max-width: 520px) { .list-row--split { flex-wrap: wrap; } .list-row--split .list-row__link { border-radius: 0.85rem 0.85rem 0 0; } .list-row--split .list-row__side { width: 100%; justify-content: flex-end; border-left: none; border-top: 1px solid color-mix(in srgb, var(--outline-variant) 35%, transparent); padding: 0.5rem 0.9rem 0.75rem; } } /* Карточка теста: визуальные блоки + сворачивание (удобно на узком экране) */ .test-detail-page { max-width: var(--max-content, 42rem); margin: 0 auto; padding-bottom: 1.5rem; } .cabinet-brick { margin-bottom: 1.1rem; } .cabinet-brick--hero { padding: 0.1rem 0 0.2rem; border-bottom: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent); margin-bottom: 1.25rem; } .cabinet-disclosure { border: 1px solid color-mix(in srgb, var(--outline-variant) 30%, transparent); border-radius: 1rem; background: var(--surface); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04); } .cabinet-disclosure__summary { cursor: pointer; list-style: none; user-select: none; padding: 0.85rem 1rem 0.75rem; font-size: 1.05rem; border-radius: 1rem 1rem 0 0; min-height: 2.75rem; display: flex; align-items: center; } .cabinet-disclosure__summary::-webkit-details-marker { display: none; } .cabinet-disclosure__summary::after { content: 'expand_more'; font-family: 'Material Symbols Outlined', sans-serif; margin-left: auto; font-size: 1.25rem; opacity: 0.55; font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24; transition: transform 0.2s ease; } .cabinet-disclosure[open] .cabinet-disclosure__summary::after { transform: rotate(180deg); } .cabinet-disclosure__body { padding: 0 1rem 1.05rem; border-top: 1px solid color-mix(in srgb, var(--outline-variant) 35%, transparent); } .cabinet-disclosure[open] .cabinet-disclosure__summary { border-bottom: 1px solid color-mix(in srgb, var(--outline-variant) 25%, transparent); } /* Назначение: поиск + список */ .assign-toolbar { display: flex; flex-direction: column; gap: 0.5rem; margin-bottom: 0.65rem; } @media (min-width: 520px) { .assign-toolbar { flex-direction: row; flex-wrap: wrap; align-items: center; } .assign-toolbar .form-input { flex: 1 1 160px; min-width: 0; } } .assign-toolbar__search { flex: 1 1 200px; } .assign-list { max-height: min(40vh, 18rem); min-height: 0; overflow: auto; border: 1px solid color-mix(in srgb, var(--outline-variant) 30%, transparent); border-radius: 0.75rem; background: var(--surface-container-low); -webkit-overflow-scrolling: touch; } .assign-row { display: flex; gap: 0.5rem; padding: 0.65rem 0.75rem; border-bottom: 1px solid color-mix(in srgb, var(--outline-variant) 30%, transparent); cursor: pointer; align-items: flex-start; } .assign-row:last-child { border-bottom: none; } .assign-row--selected, .assign-row:hover { background: color-mix(in srgb, var(--primary) 8%, transparent); } .assign-row__text { display: flex; flex-direction: column; gap: 0.2rem; min-width: 0; flex: 1; } .assign-row__fio { font-weight: 600; color: var(--on-surface); font-size: 0.95rem; word-break: break-word; } .assign-row__login { font-size: 0.8rem; color: var(--secondary); font-family: ui-monospace, Menlo, monospace; } .assign-row__meta { font-size: 0.8rem; color: var(--secondary); line-height: 1.35; } .create-row { display: flex; flex-wrap: wrap; gap: 0.5rem; margin: 1.25rem 0; align-items: center; } .create-row .form-input { flex: 1 1 12rem; min-width: 0; } .create-row .btn { width: auto; flex: 0 0 auto; } .callout { border-radius: 1rem; padding: 0.75rem 1rem; font-size: 0.9rem; font-weight: 500; margin: 0 0 1rem; } .callout--warning { background: #fffbeb; border: 1px solid #fde68a; color: #92400e; } .callout--error { background: #fff5f5; border: 1px solid #fecaca; color: #991b1b; } .callout--success { background: #ecfdf5; border: 1px solid #a7f3d0; color: #047857; } .error-text { color: var(--error); font-size: 0.9rem; margin: 0.5rem 0 0; } .link-back { display: inline-flex; align-items: center; gap: 0.25rem; font-size: 0.9rem; font-weight: 500; margin: 0 0 1rem; } /* Table (detail) */ .table-cabinet { width: 100%; border-collapse: separate; border-spacing: 0; font-size: 0.875rem; } .table-cabinet th, .table-cabinet td { padding: 0.5rem 0.6rem; text-align: left; border-bottom: 1px solid color-mix(in srgb, var(--outline-variant) 40%, transparent); vertical-align: top; } .table-cabinet th { color: var(--secondary); font-weight: 600; font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.03em; } .table-cabinet tr:last-child td { border-bottom: none; } .table-cabinet .mono { font-size: 0.75rem; word-break: break-all; color: var(--on-surface-variant); } /* История версий: карточки вместо таблицы (мобайл) */ .version-card-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.5rem; } .version-card-list__item { margin: 0; } .version-card-list__row { display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: 0.75rem; } .version-card-list__main { min-width: 0; flex: 1 1 12rem; } .version-card-list__title-line { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; } .version-card-list__action { flex: 0 0 auto; align-self: center; } @media (max-width: 520px) { .version-card-list__row { flex-direction: column; align-items: stretch; } .version-card-list__action { width: 100%; align-self: stretch; } } .draft-block { margin-top: 1.25rem; padding: 1rem; background: var(--surface-container); border-radius: 1rem; border: 1px solid color-mix(in srgb, var(--outline-variant) 35%, transparent); } .draft-block .form-input { margin-top: 0.25rem; } .muted { color: var(--secondary); font-size: 0.875rem; } .inline-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 0.75rem; margin-top: 0.5rem; } .inline-actions .btn { width: auto; } /* Нижняя панель: полноширинные primary + secondary (без перебития .inline-actions .btn) */ .actions-bar { display: flex; flex-direction: column; align-items: stretch; gap: 0.5rem; width: 100%; box-sizing: border-box; } .actions-bar .btn-primary { width: 100%; margin-top: 0; box-sizing: border-box; } .actions-bar a.btn, .actions-bar .btn.btn-ghost { display: block; width: 100%; text-align: center; box-sizing: border-box; } @media (min-width: 480px) { .actions-bar { flex-direction: row; flex-wrap: wrap; align-items: center; } .actions-bar .btn-primary { width: auto; min-width: 12rem; flex: 1 1 auto; } .actions-bar a.btn, .actions-bar .btn.btn-ghost { display: inline-block; width: auto; flex: 0 0 auto; } } @media (max-width: 520px) { .inline-actions--block-mobile { flex-direction: column; align-items: stretch; } .inline-actions--block-mobile .btn { width: 100%; box-sizing: border-box; } } /* --- Спринт 2: редактор вопроса, прогоны, импорт, фикс. футер --- */ .question-editor-block__header { display: flex; flex-direction: column; align-items: stretch; gap: 0.5rem; margin-bottom: 0.5rem; } .question-editor-block__title { margin-bottom: 0; font-size: 0.95rem; } .question-editor-block__ai-btn { width: 100%; text-align: center; box-sizing: border-box; align-self: stretch; } @media (min-width: 520px) { .question-editor-block__header { flex-direction: row; flex-wrap: wrap; align-items: center; justify-content: space-between; } .question-editor-block__ai-btn { width: auto; align-self: center; } } /* Спринт 2.4: radio = один верный, checkbox = несколько (нативная метафора) */ .question-option-row__mark { width: 1.15rem; height: 1.15rem; flex-shrink: 0; margin-top: 0.1rem; cursor: pointer; accent-color: var(--primary); } /* Список прогонов: карточки */ .attempts-card-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.5rem; } .attempts-card-list__item { margin: 0; } .attempts-card-list__row { display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: 0.75rem; } .attempts-card-list__main { flex: 1 1 12rem; min-width: 0; } .attempts-card-list__action { flex: 0 0 auto; } @media (max-width: 520px) { .attempts-card-list__row { flex-direction: column; } .attempts-card-list__action { width: 100%; text-align: center; } } /* Импорт: скрытый input + кнопка-стиль */ .import-file-input { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } .import-file-row { position: relative; display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; } .import-file-label { margin: 0; cursor: pointer; width: auto; display: inline-block; box-sizing: border-box; } /* Мобилка: закреплённый футер с «Сохранить» (дубль панели скрыт) */ .test-detail-fixed-actions { display: none; } @media (max-width: 640px) { .test-detail-page--with-fixed-actions { padding-bottom: calc(6.5rem + env(safe-area-inset-bottom, 0px)); } .test-detail-page--with-fixed-actions .editor-actions-flow { display: none; } .test-detail-fixed-actions { display: block; position: fixed; left: 0; right: 0; bottom: 0; z-index: 30; padding: 0.65rem 1.25rem calc(0.65rem + env(safe-area-inset-bottom, 0px)); background: color-mix(in srgb, var(--surface) 96%, #fff); border-top: 1px solid color-mix(in srgb, var(--outline-variant) 45%, transparent); box-shadow: 0 -4px 24px rgba(0, 0, 0, 0.08); } .test-detail-fixed-actions__inner { max-width: var(--max-content); margin: 0 auto; } .test-detail-fixed-actions__status { margin: 0 0 0.45rem; font-size: 0.8rem; line-height: 1.3; max-height: 3.2rem; overflow: auto; } }