/
Max_Cherep
/
super-resolution
Обзор
Документация
Войти
/
Max_Cherep
/
super-resolution
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
web/app/static/style.css
979 строк
19 KB
maxim.cherepanov
add app versioning 0.99-beta
13 июл 2026, 18:45
13 июл 2026, 18:45
87c656c
Код
Авторство
О чём код?
/* Светлая тема: нейтральная база, акценты голубой · оранжевый · жёлтый */ :root { --color-blue: #1565c0; --color-blue-deep: #0d47a1; --color-orange: #e65100; --color-orange-deep: #bf360c; --md-sys-color-primary: var(--color-blue); --md-sys-color-on-primary: #ffffff; --md-sys-color-primary-container: #e3f2fd; --md-sys-color-on-primary-container: var(--color-blue-deep); --md-sys-color-secondary: var(--color-orange); --md-sys-color-secondary-container: #fff3e0; --md-sys-color-on-secondary-container: #5d3200; --md-sys-color-surface: #f5f5f5; --md-sys-color-surface-container: #ffffff; --md-sys-color-surface-container-high: #eeeeee; --md-sys-color-on-surface: #212121; --md-sys-color-on-surface-variant: #616161; --md-sys-color-outline: #9e9e9e; --md-sys-color-outline-variant: #e0e0e0; --md-sys-color-error: #c62828; --md-sys-color-error-container: #ffebee; --md-sys-color-on-error-container: #5f1212; --md-sys-color-inverse-surface: #37474f; --md-sys-color-inverse-on-surface: #ffffff; --md-sys-elevation-1: 0 1px 2px rgba(0, 0, 0, 0.06), 0 1px 3px rgba(0, 0, 0, 0.08); --md-sys-elevation-2: 0 2px 6px rgba(0, 0, 0, 0.08), 0 4px 12px rgba(0, 0, 0, 0.06); --md-shape-corner-medium: 12px; --md-shape-corner-small: 8px; --md-shape-corner-full: 999px; --status-done-bg: #e8f5e9; --status-done-fg: #2e7d32; --status-processing-bg: #fff3e0; --status-processing-fg: var(--color-orange); --status-queued-bg: #e3f2fd; --status-queued-fg: var(--color-blue-deep); --status-failed-bg: var(--md-sys-color-error-container); --status-failed-fg: var(--md-sys-color-on-error-container); --status-skipped-bg: #f5f5f5; --status-skipped-fg: #757575; --status-cancelled-bg: #fbe9e7; --status-cancelled-fg: #d84315; --status-corrupted-bg: #fff8e1; --status-corrupted-fg: #f57f17; } * { box-sizing: border-box; } body { margin: 0; font-family: Roboto, system-ui, sans-serif; font-size: 14px; line-height: 1.5; color: var(--md-sys-color-on-surface); background: var(--md-sys-color-surface); } /* Top app bar */ .app-bar { background: var(--color-blue-deep); color: var(--md-sys-color-on-primary); box-shadow: var(--md-sys-elevation-1); border-bottom: 3px solid var(--color-orange); padding: 0 1.5rem; } .app-bar__inner { max-width: 1120px; margin: 0 auto; padding: 1rem 0; } .app-bar__title { margin: 0; font-size: 1.375rem; font-weight: 500; letter-spacing: 0; color: var(--md-sys-color-on-primary); } .subtitle { margin: 0.25rem 0 0; font-size: 0.875rem; color: rgba(255, 255, 255, 0.88); } .app-version { margin: 0.35rem 0 0; font-size: 0.75rem; color: rgba(255, 255, 255, 0.72); letter-spacing: 0.02em; } .app-footer { margin: 0; padding: 0.75rem 1rem 1.25rem; text-align: center; font-size: 0.75rem; color: var(--md-sys-color-on-surface-variant); } .mock-banner { display: inline-flex; align-items: center; margin-top: 0.75rem; padding: 0.35rem 0.75rem; border-radius: var(--md-shape-corner-small); background: var(--color-orange); color: #ffffff; font-size: 0.8125rem; border: none; font-weight: 500; } .page { max-width: 1120px; margin: 0 auto; padding: 1.5rem; } /* Cards */ .card { background: var(--md-sys-color-surface-container); border-radius: var(--md-shape-corner-medium); box-shadow: var(--md-sys-elevation-1); padding: 1.25rem 1.5rem; margin-bottom: 1rem; } .card__title { margin: 0 0 1rem; padding-left: 0.65rem; border-left: 3px solid var(--color-orange); font-size: 1.125rem; font-weight: 500; color: var(--color-blue-deep); } .card__head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0.75rem 1rem; margin-bottom: 0.75rem; } .card__title--inline { margin: 0; } .ui-mode-toggle { margin: 0; font-size: 0.875rem; color: var(--md-sys-color-on-surface-variant); user-select: none; } .card--process > .hint { margin-top: 0; margin-bottom: 1rem; } .hidden { display: none !important; } /* Buttons */ .btn-row { display: flex; flex-wrap: wrap; gap: 0.75rem; align-items: center; } .btn { display: inline-flex; align-items: center; justify-content: center; min-height: 40px; padding: 0 1.25rem; border: none; border-radius: var(--md-shape-corner-full); font-family: inherit; font-size: 0.875rem; font-weight: 500; letter-spacing: 0.02em; cursor: pointer; transition: box-shadow 0.15s, background 0.15s; } .btn--filled { background: var(--color-blue-deep); color: #ffffff; box-shadow: var(--md-sys-elevation-1); } .btn--filled:hover:not(:disabled) { background: var(--color-blue); box-shadow: var(--md-sys-elevation-2); } .btn--filled:disabled { background: #bdbdbd; color: #757575; cursor: not-allowed; box-shadow: none; } .btn--tonal { background: var(--md-sys-color-primary-container); color: var(--md-sys-color-on-primary-container); border: 1px solid #90caf9; } .btn--tonal:hover { background: #bbdefb; } /* File input */ .file-field { flex: 1 1 200px; min-width: 0; } .file-field input[type="file"] { width: 100%; padding: 0.5rem; font-size: 0.875rem; color: var(--md-sys-color-on-surface-variant); background: var(--md-sys-color-surface); border: 1px dashed var(--md-sys-color-outline-variant); border-radius: var(--md-shape-corner-small); } .file-field input[type="file"]::file-selector-button { margin-right: 0.75rem; padding: 0.4rem 0.875rem; border: none; border-radius: var(--md-shape-corner-full); background: var(--md-sys-color-primary-container); color: var(--md-sys-color-on-primary-container); font-family: inherit; font-size: 0.8125rem; font-weight: 500; cursor: pointer; } .upload-form { margin-bottom: 0.75rem; } /* Snackbar / flash */ .flash { margin: 0 0 0.75rem; padding: 0.625rem 1rem; border-radius: var(--md-shape-corner-small); background: var(--md-sys-color-surface-container); color: var(--md-sys-color-on-surface); font-size: 0.875rem; border: 1px solid var(--md-sys-color-outline-variant); border-left: 4px solid var(--color-orange); } /* Data table */ .table-wrap { overflow-x: auto; border-radius: var(--md-shape-corner-small); border: 1px solid var(--md-sys-color-outline-variant); background: var(--md-sys-color-surface); } table { width: 100%; border-collapse: collapse; font-size: 0.875rem; } th { padding: 0.75rem 1rem; text-align: left; font-weight: 500; color: var(--color-blue-deep); background: var(--md-sys-color-primary-container); border-bottom: 2px solid #90caf9; } td { padding: 0.75rem 1rem; border-bottom: 1px solid var(--md-sys-color-outline-variant); color: var(--md-sys-color-on-surface); } tbody tr:last-child td { border-bottom: none; } tbody tr:hover { background: color-mix(in srgb, var(--md-sys-color-primary) 4%, transparent); } .empty { text-align: center; color: var(--md-sys-color-on-surface-variant); padding: 2rem !important; } /* Status chips */ .chip { display: inline-block; padding: 0.2rem 0.65rem; border-radius: var(--md-shape-corner-full); font-size: 0.75rem; font-weight: 500; letter-spacing: 0.02em; text-transform: lowercase; } .status-done .chip { background: var(--status-done-bg); color: var(--status-done-fg); } .status-processing .chip { background: var(--status-processing-bg); color: var(--status-processing-fg); } .status-queued .chip { background: var(--status-queued-bg); color: var(--status-queued-fg); } .status-failed .chip { background: var(--status-failed-bg); color: var(--status-failed-fg); } .status-skipped .chip { background: var(--status-skipped-bg); color: var(--status-skipped-fg); } .status-cancelled .chip { background: var(--status-cancelled-bg); color: var(--status-cancelled-fg); } .status-corrupted .chip { background: var(--status-corrupted-bg); color: var(--status-corrupted-fg); } .btn-cancel { font-size: 0.75rem; padding: 0.25rem 0.55rem; border: 1px solid #e57373; border-radius: var(--md-shape-corner-full); background: #ffebee; color: #c62828; cursor: pointer; white-space: nowrap; } .btn-cancel:hover { background: #ffcdd2; } .cancel-form { margin: 0; } .status-cell { min-width: 10rem; } .job-progress { margin-top: 0.35rem; } .job-progress__bar { display: block; width: 100%; max-width: 14rem; height: 0.45rem; border: none; border-radius: var(--md-shape-corner-full); overflow: hidden; background: #e0e0e0; } .job-progress__bar::-webkit-progress-bar { background: #e0e0e0; border-radius: var(--md-shape-corner-full); } .job-progress__bar::-webkit-progress-value { background: var(--color-orange); border-radius: var(--md-shape-corner-full); } .job-progress__bar::-moz-progress-bar { background: var(--color-orange); border-radius: var(--md-shape-corner-full); } .job-progress__text { display: block; margin-top: 0.2rem; font-size: 0.6875rem; color: var(--md-sys-color-on-surface-variant); line-height: 1.3; max-width: 22rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .job-progress__text--wait { font-style: italic; } a { color: var(--md-sys-color-primary); text-decoration: none; font-weight: 500; } a:hover { text-decoration: underline; } .error { color: var(--md-sys-color-error); cursor: help; font-size: 0.8125rem; } .corrupted { color: var(--status-corrupted-fg); cursor: help; font-size: 0.8125rem; font-weight: 500; } .hint { margin: 0 0 0.75rem; font-size: 0.8125rem; color: var(--md-sys-color-on-surface-variant); } .block { border: 1px solid var(--md-sys-color-outline-variant); border-radius: var(--md-shape-corner-small); padding: 0.75rem 1rem; margin: 0 0 0.75rem; background: var(--md-sys-color-surface); } .block legend { font-weight: 500; padding: 0 0.35rem; color: var(--color-blue-deep); } .block--highlight { border-color: #ffcc80; background: #fff8f0; border-left: 4px solid var(--color-orange); } .block--highlight legend { color: var(--color-orange); font-weight: 600; } .check-row, .radio-row { display: flex; align-items: center; gap: 0.5rem; margin: 0.35rem 0; cursor: pointer; } .sub-params { margin-top: 0.5rem; padding-left: 0.25rem; } .sub-params.hidden { display: none; } .hint-inline { font-size: 0.75rem; color: var(--md-sys-color-on-surface-variant); } .option-line { display: flex; align-items: flex-start; gap: 0.25rem; } .option-line > .radio-row, .option-line > .check-row { flex: 1; min-width: 0; } .field-inline-line { display: flex; align-items: flex-start; gap: 0.25rem; margin: 0.35rem 0; } .field-inline-line .field-inline { margin: 0; } .opt-tip { flex-shrink: 0; width: 1.125rem; height: 1.125rem; margin-top: 0.15rem; padding: 0; border: 1px solid var(--md-sys-color-outline-variant); border-radius: 50%; background: var(--md-sys-color-surface-container-high); color: var(--color-blue-deep); font-size: 0.6875rem; font-weight: 700; line-height: 1; cursor: help; position: relative; } .opt-tip:hover, .opt-tip:focus-visible { border-color: var(--color-blue); background: #e8f0fe; outline: none; } .opt-tip::after { content: attr(data-tip); position: absolute; z-index: 30; right: 0; top: calc(100% + 0.35rem); width: max(220px, 16rem); max-width: min(300px, 90vw); padding: 0.5rem 0.65rem; border-radius: var(--md-shape-corner-small); background: var(--color-blue-deep); color: #fff; font-size: 0.75rem; font-weight: 400; line-height: 1.35; text-align: left; white-space: normal; box-shadow: var(--md-sys-elevation-2); opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.15s, visibility 0.15s; } .opt-tip:hover::after, .opt-tip:focus-visible::after { opacity: 1; visibility: visible; } .block legend .opt-tip::after { left: 0; right: auto; } .slider-row__head { display: flex; align-items: flex-start; gap: 0.25rem; } .enhance-lowpass-row--disabled { opacity: 0.55; } .slider-row { display: flex; flex-direction: column; gap: 0.25rem; margin: 0.5rem 0; font-size: 0.8125rem; } .slider-row input[type="range"] { width: 100%; max-width: 320px; } .field-inline { display: inline-flex; align-items: center; gap: 0.5rem; margin: 0.5rem 0.75rem 0.5rem 0; font-size: 0.8125rem; } .num-input, .select-input { padding: 0.35rem 0.5rem; border: 1px solid var(--md-sys-color-outline-variant); border-radius: var(--md-shape-corner-small); font-family: inherit; background: var(--md-sys-color-surface); } .file-checklist-section { margin: 0 0 0.75rem; } .file-checklist-head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0.5rem 0.75rem; margin-bottom: 0.35rem; } .file-checklist-head__title { font-weight: 500; color: var(--color-blue-deep); } .file-checklist-fieldset { margin: 0; } .file-checklist-fieldset.block { padding: 0.5rem 0.75rem; } .file-checklist { max-height: 13.5rem; overflow-y: auto; } .file-checklist-toolbar { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center; flex-shrink: 0; } .file-checklist-toolbar__btn { font-size: 0.75rem; padding: 0.2rem 0.55rem; border: 1px solid var(--md-sys-color-outline-variant); border-radius: var(--md-shape-corner-full); background: var(--md-sys-color-surface); color: var(--color-blue-deep); cursor: pointer; white-space: nowrap; } .file-checklist-toolbar__btn:hover:not(:disabled) { background: #e3f2fd; } .file-checklist-toolbar__btn--danger { border-color: var(--color-orange); background: #fff3e0; color: var(--color-orange); } .file-checklist-toolbar__btn--danger:hover:not(:disabled) { background: var(--color-orange); color: #ffffff; } .file-checklist-toolbar__btn:disabled { opacity: 0.45; cursor: not-allowed; } .file-checklist-row { padding: 0.15rem 0; } .file-checklist-row .check-row { margin: 0; align-items: center; gap: 0.5rem; } .file-checklist-row--corrupted .file-checklist__name { color: var(--status-corrupted-fg); } .chip--corrupted { display: inline-block; margin-left: 0.25rem; padding: 0.125rem 0.5rem; border-radius: var(--md-shape-corner-full); font-size: 0.6875rem; font-weight: 600; letter-spacing: 0.03em; text-transform: lowercase; background: var(--status-corrupted-bg); color: var(--status-corrupted-fg); flex-shrink: 0; } .file-checklist__name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .sr-toggle { display: inline-flex; align-items: center; gap: 0.5rem; margin: 0.5rem 0 0.75rem; } .sr-toggle__label { font-size: 0.8125rem; font-weight: 500; color: var(--color-blue); } .sr-toggle__label--active { color: var(--color-blue-deep); font-weight: 600; } .sr-toggle__control { position: relative; display: inline-flex; cursor: pointer; margin: 0; } .sr-toggle__input { position: absolute; opacity: 0; width: 0; height: 0; } .sr-toggle__track { display: block; width: 2.75rem; height: 1.35rem; border-radius: var(--md-shape-corner-full); background: var(--color-orange); transition: background 0.15s; box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15); } .sr-toggle__track::after { content: ""; position: absolute; top: 0.15rem; left: 0.15rem; width: 1.05rem; height: 1.05rem; border-radius: 50%; background: #ffffff; transition: transform 0.15s; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } .sr-toggle__input:checked + .sr-toggle__track { background: var(--color-blue-deep); } .sr-toggle__input:checked + .sr-toggle__track::after { transform: translateX(1.4rem); } .sr-toggle__input:focus-visible + .sr-toggle__track { outline: 2px solid var(--color-blue); outline-offset: 2px; } .export-format-row { margin-top: 0.25rem; } .export-sr-block { margin-bottom: 0.5rem; } .export-sr-head { display: flex; align-items: flex-start; gap: 0.25rem; margin-bottom: 0.35rem; } .export-sr-head__label { font-size: 0.8125rem; color: var(--md-sys-color-on-surface-variant); } .mp3-bitrate-row.hidden { display: none; } .opts-cell { font-size: 0.75rem; color: var(--md-sys-color-on-surface-variant); max-width: 12rem; } /* Toast */ .toast { position: fixed; bottom: 1.25rem; right: 1.25rem; left: auto; max-width: min(420px, calc(100vw - 2rem)); display: flex; align-items: flex-start; gap: 0.5rem; padding: 0.875rem 1rem; background: var(--md-sys-color-inverse-surface); color: var(--md-sys-color-inverse-on-surface); border-radius: var(--md-shape-corner-small); box-shadow: var(--md-sys-elevation-2); z-index: 1000; font-size: 0.875rem; line-height: 1.45; } .toast--hidden { display: none; } .toast--done { border-left: 4px solid #2e7d32; } .toast--error { border-left: 4px solid var(--md-sys-color-error); } .toast--cancelled { border-left: 4px solid var(--color-orange); } .toast--corrupted { border-left: 4px solid var(--status-corrupted-fg); } .toast-hint { font-size: 0.8125rem; opacity: 0.9; } .toast__body { flex: 1; } .toast__close { flex-shrink: 0; border: none; background: transparent; color: inherit; font-size: 1.25rem; line-height: 1; cursor: pointer; padding: 0 0.25rem; opacity: 0.85; } .toast__close:hover { opacity: 1; } .flash--error { background: var(--md-sys-color-error-container); color: var(--md-sys-color-on-error-container); } .cue-section { margin-bottom: 1.25rem; padding-bottom: 1rem; border-bottom: 1px solid var(--md-sys-color-outline-variant); } .cue-section__title { margin: 0 0 0.75rem; padding-left: 0.5rem; border-left: 3px solid var(--color-orange); font-size: 1rem; font-weight: 500; color: var(--color-blue-deep); } .cue-meta { margin: 0 0 0.75rem; font-size: 0.875rem; } .cue-tracks { color: var(--md-sys-color-on-surface-variant); } .cue-form { margin-bottom: 1rem; padding: 0.75rem; border: 1px dashed var(--md-sys-color-outline-variant); border-radius: var(--md-shape-corner-small); } .cue-pipeline-details { margin: 0.5rem 0 0.75rem; } .cue-pipeline-details summary { cursor: pointer; font-size: 0.8125rem; color: var(--md-sys-color-primary); margin-bottom: 0.5rem; } .split-format-row { margin: 0.5rem 0 0.5rem 1.5rem; } .dl-cell { min-width: 7rem; } .jobs-batch-dl { margin-bottom: 0.65rem; } .download-frame { display: none; width: 0; height: 0; border: 0; } .download-form { display: flex; flex-direction: column; align-items: flex-start; gap: 0.25rem; } .download-form--batch { flex-direction: row; flex-wrap: wrap; align-items: center; gap: 0.75rem; } .btn--batch-dl { min-height: 36px; } .btn-dl { border: none; background: none; padding: 0; font: inherit; font-weight: 500; color: var(--md-sys-color-primary); cursor: pointer; text-decoration: none; } .btn-dl:hover { text-decoration: underline; } .btn-dl:disabled { color: #9e9e9e; cursor: not-allowed; text-decoration: none; } .download-del { display: inline-flex; align-items: center; gap: 0.25rem; font-size: 0.6875rem; color: var(--md-sys-color-on-surface-variant); cursor: pointer; white-space: nowrap; } .download-del input { margin: 0; }