/
Snikius
/
kanban
Обзор
Документация
Войти
/
Snikius
/
kanban
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
static/css/style.css
1 267 строк
25 KB
ssamushenkov
Init kanban
23 июл 2026, 21:29
23 июл 2026, 21:29
63ee998
Код
Авторство
О чём код?
/* ── Reset & Base ────────────────────────────────────────────── */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } :root { --bg: #0f1117; --bg2: #1a1c25; --bg3: #242733; --border: #2e3140; --text: #e2e4ea; --text-dim: #8b8fa3; --accent: #6366f1; --accent-hover: #818cf8; --danger: #ef4444; --success: #22c55e; --warn: #f59e0b; --radius: 8px; --radius-sm: 4px; --shadow: 0 1px 3px rgba(0,0,0,.4); } html, body { height: 100%; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg); color: var(--text); line-height: 1.6; font-size: 14px; } a { color: var(--accent); text-decoration: none; } a:hover { color: var(--accent-hover); } /* ── Navbar ─────────────────────────────────────────────────── */ .navbar { background: var(--bg2); border-bottom: 1px solid var(--border); position: sticky; top: 0; z-index: 100; } .nav-inner { max-width: 1400px; margin: 0 auto; padding: 0 16px; height: 48px; display: flex; align-items: center; justify-content: space-between; } .nav-brand { font-weight: 700; font-size: 18px; color: var(--text) !important; } .nav-links { display: flex; align-items: center; gap: 16px; } .nav-links a { color: var(--text-dim); font-size: 13px; } .nav-links a:hover { color: var(--text); } .nav-user { font-weight: 600; color: var(--text) !important; } .header-task-counts { display: flex; align-items: center; gap: 6px; } .header-task-count { padding: 2px 7px; border: 1px solid var(--border); border-radius: 10px; color: var(--text-dim); font-size: 11px; font-weight: 700; line-height: 1.35; white-space: nowrap; } .header-task-count-todo { border-color: #6b7280; } .header-task-count-progress { border-color: #f59e0b; color: #fde68a; } /* ── Flash ──────────────────────────────────────────────────── */ .flash-container { max-width: 1400px; margin: 0 auto; padding: 8px 16px 0; } .flash { padding: 8px 12px; border-radius: var(--radius-sm); margin-bottom: 8px; font-size: 13px; } .flash-error { background: rgba(239,68,68,.15); border: 1px solid var(--danger); color: #fca5a5; } .flash-info { background: rgba(99,102,241,.15); border: 1px solid var(--accent); color: #a5b4fc; } /* ── Main ───────────────────────────────────────────────────── */ .main { max-width: 1400px; margin: 0 auto; padding: 16px; } /* ── Auth ───────────────────────────────────────────────────── */ .auth-form { max-width: 400px; margin: 60px auto; background: var(--bg2); border: 1px solid var(--border); border-radius: var(--radius); padding: 32px; } .auth-form h1 { margin-bottom: 24px; } .auth-link { text-align: center; margin-top: 16px; color: var(--text-dim); font-size: 13px; } /* ── Forms ──────────────────────────────────────────────────── */ .form-group { margin-bottom: 16px; } .form-group label { display: block; font-size: 13px; font-weight: 500; margin-bottom: 4px; color: var(--text-dim); } .form-group input[type="text"], .form-group input[type="email"], .form-group input[type="password"], .form-group input[type="color"], .form-group input[type="file"], .form-group select, .form-group textarea { width: 100%; padding: 8px 12px; background: var(--bg3); border: 1px solid var(--border); border-radius: var(--radius-sm); color: var(--text); font-size: 14px; font-family: inherit; } .form-group input[type="color"] { height: 40px; padding: 4px; cursor: pointer; } .form-group input[type="file"] { padding: 6px; } .form-group textarea { resize: vertical; min-height: 80px; } .form-group input:focus, .form-group select:focus, .form-group textarea:focus { outline: none; border-color: var(--accent); } .form-row { display: flex; gap: 16px; } .form-row .form-group { flex: 1; } .form-actions { display: flex; gap: 8px; margin-top: 16px; } .inline-form { display: inline; } /* ── Buttons ────────────────────────────────────────────────── */ .btn { display: inline-flex; align-items: center; gap: 4px; padding: 8px 16px; background: var(--bg3); border: 1px solid var(--border); border-radius: var(--radius-sm); color: var(--text); font-size: 13px; cursor: pointer; transition: background .15s; font-family: inherit; } .btn:hover { background: var(--border); color: var(--text); } .btn-primary { background: var(--accent); border-color: var(--accent); color: #fff; } .btn-primary:hover { background: var(--accent-hover); } .btn-danger { background: rgba(239,68,68,.15); border-color: var(--danger); color: #fca5a5; } .btn-danger:hover { background: rgba(239,68,68,.25); } .btn-ghost { background: transparent; border-color: transparent; color: var(--text-dim); } .btn-ghost:hover { background: var(--bg3); color: var(--text); } .btn-small { padding: 4px 8px; font-size: 12px; } .btn-icon { background: transparent; border: none; color: var(--text-dim); cursor: pointer; padding: 4px 6px; border-radius: var(--radius-sm); font-size: 14px; font-family: inherit; } .btn-icon:hover { background: var(--bg3); color: var(--text); } /* ── Page Header ────────────────────────────────────────────── */ .page-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; } .page-header h1 { font-size: 22px; font-weight: 600; } .header-actions { display: flex; gap: 8px; } .board-navigation { display: flex; gap: 4px; } .btn-scroll { min-width: 40px; justify-content: center; font-size: 18px; line-height: 1; } .btn-scroll:disabled { opacity: .35; cursor: default; } /* ── Board ──────────────────────────────────────────────────── */ .board-wrapper { overflow-x: auto; padding: 4px 4px 20px; scrollbar-gutter: stable; } .board-scrollbar-shell { position: fixed; left: 0; right: 0; bottom: 0; z-index: 90; padding: 5px 16px; background: rgba(26, 28, 37, .96); border-top: 1px solid var(--border); box-shadow: 0 -2px 10px rgba(0, 0, 0, .25); } .board-scrollbar-shell[hidden] { display: none; } .board-scrollbar { max-width: 1368px; height: 18px; margin: 0 auto; overflow-x: auto; overflow-y: hidden; } .board-scrollbar-content { height: 1px; } body.has-board-scrollbar { padding-bottom: 30px; } .board { display: flex; gap: 16px; min-height: calc(100vh - 160px); align-items: flex-start; } .board-column { background: var(--bg2); border: 1px solid var(--border); border-radius: var(--radius); min-width: 300px; max-width: 340px; width: 320px; flex-shrink: 0; display: flex; flex-direction: column; } .column-header { padding: 15px 16px 13px; display: flex; align-items: center; justify-content: space-between; } .column-title-row { display: flex; align-items: center; gap: 8px; } .column-title { font-weight: 600; font-size: 13px; text-transform: uppercase; letter-spacing: .05em; } .column-count { background: var(--bg3); color: var(--text-dim); font-size: 11px; padding: 2px 8px; border-radius: 10px; } .column-actions { display: flex; gap: 2px; opacity: 0; transition: opacity .15s; } .board-column:hover .column-actions { opacity: 1; } .column-body { display: flex; flex-direction: column; gap: 12px; padding: 0 12px 12px; min-height: 60px; flex: 1; } /* ── Task Card ──────────────────────────────────────────────── */ .task-card { background: var(--bg3); border: 1px solid var(--border); border-radius: 6px; padding: 14px; margin: 0; cursor: grab; box-shadow: 0 1px 2px rgba(0,0,0,.18); transition: border-color .15s, box-shadow .15s, transform .15s; } .task-card:hover { border-color: rgba(129, 140, 248, .55); box-shadow: 0 5px 14px rgba(0,0,0,.22); transform: translateY(-1px); } .task-card.assigned-to-current { outline: 1px solid rgba(34, 197, 94, .75); background: linear-gradient(rgba(34, 197, 94, .08), rgba(34, 197, 94, .08)), var(--bg3); } .task-card.assigned-to-current:hover { box-shadow: 0 2px 10px rgba(34, 197, 94, .22); } .task-card.task-priority-minor { border-left: 3px solid #6b7280; } .task-card.task-priority-low { border-left: 3px solid #3b82f6; } .task-card.task-priority-medium { border-left: 3px solid #f59e0b; } .task-card.task-priority-critical { border-left: 3px solid #f97316; } .task-card.task-priority-blocker { border-left: 3px solid #ef4444; } .task-card.dragging { opacity: .5; transform: rotate(2deg); } .task-card.drag-over { border-color: var(--accent); background: rgba(99,102,241,.1); } .card-title a { color: var(--text); font-weight: 500; font-size: 14px; line-height: 1.4; } .card-title a:hover { color: var(--accent); } .card-meta { display: flex; align-items: center; flex-wrap: wrap; justify-content: space-between; gap: 8px; margin-top: 10px; font-size: 11px; color: var(--text-dim); } .card-assignee { background: rgba(99,102,241,.15); color: #a5b4fc; padding: 2px 7px; border-radius: 10px; } .card-assignee-current { background: rgba(34, 197, 94, .18); border: 1px solid rgba(34, 197, 94, .45); color: #86efac; font-weight: 700; } .card-id { color: var(--text-dim); font-weight: 600; letter-spacing: .02em; } .card-controls { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; margin-top: 12px; padding-top: 10px; border-top: 1px solid rgba(255, 255, 255, .07); } .card-controls label { display: grid; gap: 4px; color: var(--text-dim); font-size: 10px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; } .priority-select, .status-select { width: 100%; background: var(--bg2); border: 1px solid var(--border); border-radius: 5px; color: var(--text); font-size: 11px; padding: 6px 7px; cursor: pointer; } .priority-select { width: 100%; min-width: 0; } .priority-select:focus, .status-select:focus { outline: 2px solid var(--accent); outline-offset: 1px; } .board-filters { display: flex; gap: 8px; margin: 0 0 16px; } .priority-badge { display: inline-flex; align-items: center; padding: 2px 7px; border: 1px solid transparent; border-radius: 10px; color: #fff; font-size: 11px; font-weight: 700; line-height: 1.35; white-space: nowrap; } .priority-minor { background: rgba(107, 114, 128, .25); border-color: #6b7280; color: #d1d5db; } .priority-low { background: rgba(59, 130, 246, .22); border-color: #3b82f6; color: #bfdbfe; } .priority-medium { background: rgba(245, 158, 11, .22); border-color: #f59e0b; color: #fde68a; } .priority-critical { background: rgba(249, 115, 22, .24); border-color: #f97316; color: #fed7aa; } .priority-blocker { background: rgba(239, 68, 68, .25); border-color: #ef4444; color: #fecaca; } /* ── Tasks Page ─────────────────────────────────────────────── */ .filters { display: flex; gap: 12px; align-items: flex-end; margin-bottom: 16px; flex-wrap: wrap; } .filter-group { display: flex; flex-direction: column; gap: 2px; } .filter-group label { font-size: 12px; color: var(--text-dim); } .filter-group input, .filter-group select { padding: 6px 10px; background: var(--bg2); border: 1px solid var(--border); border-radius: var(--radius-sm); color: var(--text); font-size: 13px; } .filter-group input:focus, .filter-group select:focus { outline: none; border-color: var(--accent); } .task-table-wrap { overflow-x: auto; } .task-table { width: 100%; border-collapse: collapse; } .task-table th { text-align: left; padding: 10px 12px; font-size: 12px; text-transform: uppercase; letter-spacing: .05em; color: var(--text-dim); border-bottom: 1px solid var(--border); font-weight: 600; } .task-table td { padding: 10px 12px; border-bottom: 1px solid var(--border); font-size: 13px; } .task-table tr:hover { background: var(--bg2); } .task-table .date { color: var(--text-dim); font-size: 12px; white-space: nowrap; } .task-table .empty { text-align: center; padding: 40px; color: var(--text-dim); } .task-key { color: var(--text-dim); font-size: 11px; margin-right: 6px; white-space: nowrap; } /* ── User Settings ──────────────────────────────────────────── */ .profile-page { max-width: 900px; } .profile-page > h1 { margin-bottom: 20px; } .settings-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; } .settings-card, .profile-card { background: var(--bg2); border: 1px solid var(--border); border-radius: var(--radius); padding: 20px; } .settings-card h2 { font-size: 16px; margin-bottom: 16px; } .profile-stats { display: flex; flex-wrap: wrap; gap: 16px; margin-top: 16px; color: var(--text-dim); font-size: 13px; } @media (max-width: 700px) { .settings-grid { grid-template-columns: 1fr; } .page-header { align-items: flex-start; gap: 12px; } .header-actions { flex-wrap: wrap; justify-content: flex-end; } } /* ── Badge ──────────────────────────────────────────────────── */ .badge { display: inline-block; padding: 2px 10px; border-radius: 10px; font-size: 11px; font-weight: 600; color: #fff; white-space: nowrap; } /* ── Task Page ──────────────────────────────────────────────── */ .task-page { max-width: 900px; } .task-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; } .task-header h1 { font-size: 22px; } .task-meta { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; font-size: 13px; color: var(--text-dim); margin-bottom: 20px; padding-bottom: 16px; border-bottom: 1px solid var(--border); } .task-description { min-height: 72px; margin: 0 0 16px; padding: 14px 16px; background: var(--bg2); border: 1px solid var(--border); border-radius: var(--radius); cursor: text; } .task-description:hover, .task-description:focus { border-color: var(--accent); outline: none; } .task-description.markdown-content { padding: 14px 16px; } .edit-section { background: var(--bg2); border: 1px solid var(--border); border-radius: var(--radius); margin-bottom: 16px; } .edit-section summary { padding: 10px 16px; cursor: pointer; font-weight: 600; font-size: 13px; color: var(--accent); } .edit-form { padding: 16px; border-top: 1px solid var(--border); } .form-label-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; } .form-label-row label { margin-bottom: 0; } .description-edit-button { color: var(--accent); } .md-editor-readonly textarea { color: var(--text-dim); cursor: default; } .md-editor-readonly .md-btn:disabled { opacity: .35; cursor: default; } .markdown-content { padding: 16px 0; line-height: 1.7; } .markdown-content h1, .markdown-content h2, .markdown-content h3 { margin: 16px 0 8px; } .markdown-content h1 { font-size: 18px; } .markdown-content h2 { font-size: 16px; } .markdown-content h3 { font-size: 14px; } .markdown-content p { margin-bottom: 8px; } .markdown-content ul, .markdown-content ol { margin: 8px 0; padding-left: 24px; } .markdown-content li { margin-bottom: 4px; } .markdown-content code { background: var(--bg3); padding: 2px 6px; border-radius: 3px; font-size: 13px; } .markdown-content pre { background: var(--bg3); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 12px; overflow-x: auto; margin: 12px 0; } .markdown-content pre code { background: none; padding: 0; } .markdown-content blockquote { border-left: 3px solid var(--accent); padding: 4px 12px; margin: 8px 0; color: var(--text-dim); } .markdown-content img { max-width: 100%; border-radius: var(--radius-sm); } .markdown-content a { color: var(--accent); } .markdown-content table { border-collapse: collapse; margin: 12px 0; width: 100%; } .markdown-content th, .markdown-content td { border: 1px solid var(--border); padding: 6px 10px; text-align: left; } .markdown-content th { background: var(--bg2); font-weight: 600; } /* ── Attachments ────────────────────────────────────────────── */ .attachments { margin: 16px 0; padding: 16px 0; border-top: 1px solid var(--border); } .attachments h2 { font-size: 16px; margin-bottom: 12px; } .attachment-grid { display: flex; flex-wrap: wrap; gap: 8px; } .attachment-img { max-width: 200px; max-height: 150px; border-radius: var(--radius-sm); border: 1px solid var(--border); object-fit: cover; } .attachment-img-small { max-width: 100px; max-height: 80px; } .attachment-file { display: block; padding: 8px 12px; background: var(--bg3); border: 1px solid var(--border); border-radius: var(--radius-sm); font-size: 12px; } /* ── Comments ───────────────────────────────────────────────── */ .comments { margin-top: 24px; padding-top: 20px; border-top: 1px solid var(--border); } .comments h2 { font-size: 16px; margin-bottom: 16px; } .comment-form { margin-bottom: 20px; padding: 16px; background: var(--bg2); border: 1px solid var(--border); border-radius: var(--radius); } .comment { padding: 12px 0; border-bottom: 1px solid var(--border); } .comment-header { display: flex; align-items: center; gap: 8px; font-size: 13px; margin-bottom: 6px; } .comment-date { color: var(--text-dim); font-size: 12px; } .comment-edited { color: var(--text-dim); font-size: 11px; font-style: italic; } .comment-actions { margin-left: auto; display: flex; gap: 4px; } .comment-body { font-size: 14px; } .comment-edit-form { margin-top: 8px; } .comment-attachments { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; } /* ── Modal ──────────────────────────────────────────────────── */ .modal-overlay { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(0,0,0,.6); display: flex; align-items: center; justify-content: center; z-index: 200; } .modal { background: var(--bg2); border: 1px solid var(--border); border-radius: var(--radius); padding: 24px; min-width: 380px; max-width: 480px; } .modal-sm { min-width: 320px; } .modal h2 { font-size: 18px; margin-bottom: 16px; } .modal p { margin-bottom: 16px; font-size: 14px; color: var(--text-dim); } /* ── Profile ────────────────────────────────────────────────── */ .profile-page { max-width: 600px; } .profile-card { background: var(--bg2); border: 1px solid var(--border); border-radius: var(--radius); padding: 24px; } .profile-card p { margin-bottom: 8px; font-size: 14px; } /* ── Empty ──────────────────────────────────────────────────── */ .empty-state { text-align: center; padding: 80px 20px; } .empty-state h1 { font-size: 48px; color: var(--text-dim); margin-bottom: 8px; } .empty-state p { color: var(--text-dim); margin-bottom: 20px; } /* ── Scrollbar ──────────────────────────────────────────────── */ ::-webkit-scrollbar { height: 8px; width: 8px; } ::-webkit-scrollbar-track { background: var(--bg); } ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: var(--text-dim); } /* ── Markdown Editor ─────────────────────────────────────────── */ .md-editor { border: 1px solid var(--border); border-radius: var(--radius-sm); overflow: hidden; } .md-editor .md-toolbar { display: flex; align-items: center; gap: 2px; padding: 4px 6px; background: var(--bg2); border-bottom: 1px solid var(--border); flex-wrap: wrap; } .md-editor .md-btn { background: transparent; border: 1px solid transparent; color: var(--text-dim); padding: 4px 10px; border-radius: 4px; cursor: pointer; font-size: 13px; font-family: inherit; line-height: 1.4; } .md-editor .md-btn:hover { background: var(--bg3); border-color: var(--border); color: var(--text); } .md-editor .md-btn i { font-style: italic; } .md-editor .md-btn b { font-weight: 700; } .md-editor .md-sep { width: 1px; height: 20px; background: var(--border); margin: 0 4px; display: inline-block; } .md-editor .md-btn-preview { color: var(--accent); font-size: 12px; } .md-editor .md-btn-preview:hover { color: var(--accent-hover); } .md-editor .md-preview { padding: 10px 12px; min-height: 80px; background: var(--bg); line-height: 1.6; font-size: 14px; } .md-editor .md-preview h1, .md-editor .md-preview h2, .md-editor .md-preview h3 { margin: 12px 0 6px; } .md-editor .md-preview h1 { font-size: 18px; } .md-editor .md-preview h2 { font-size: 16px; } .md-editor .md-preview h3 { font-size: 14px; } .md-editor .md-preview p { margin-bottom: 6px; } .md-editor .md-preview ul, .md-editor .md-preview ol { padding-left: 20px; margin: 6px 0; } .md-editor .md-preview li { margin-bottom: 2px; } .md-editor .md-preview code { background: var(--bg3); padding: 1px 5px; border-radius: 3px; font-size: 13px; } .md-editor .md-preview pre { background: var(--bg3); border: 1px solid var(--border); border-radius: 4px; padding: 10px; overflow-x: auto; margin: 8px 0; } .md-editor .md-preview pre code { background: none; padding: 0; } .md-editor .md-preview a { color: var(--accent); } .md-editor .md-preview img { max-width: 100%; border-radius: 4px; } /* Editor textarea in the wrapper */ .md-editor textarea { border: none !important; border-radius: 0 !important; background: var(--bg) !important; }