diff --git a/assets/css/custom.css b/assets/css/custom.css index 024b070..642bd03 100644 --- a/assets/css/custom.css +++ b/assets/css/custom.css @@ -1,26 +1,28 @@ :root { - --bg: #f6f8fa; - --surface: #ffffff; - --surface-muted: #f6f8fa; - --surface-soft: #fafff8; - --border: #d0d7de; - --border-strong: #8c959f; + --bg: #f3f6fb; + --surface: rgba(255, 255, 255, 0.84); + --surface-strong: rgba(255, 255, 255, 0.94); + --surface-muted: #f7fafd; + --surface-soft: #f2fbf5; + --border: rgba(31, 35, 40, 0.10); + --border-strong: rgba(31, 35, 40, 0.22); --text: #1f2328; - --text-muted: #57606a; - --text-soft: #6e7781; + --text-muted: #5b6573; + --text-soft: #7b8490; --accent: #2da44e; --accent-dark: #1f883d; --accent-contrast: #ffffff; --accent-blue: #0969da; - --accent-blue-soft: #ddf4ff; - --nav-bg: #0d1117; + --accent-blue-soft: #e8f3ff; + --nav-bg: rgba(13, 17, 23, 0.84); --nav-text: #f0f6fc; --success: #1a7f37; --danger: #cf222e; - --shadow: 0 1px 0 rgba(27, 31, 36, 0.04), 0 8px 24px rgba(140, 149, 159, 0.18); - --radius-sm: 10px; - --radius-md: 14px; - --radius-lg: 18px; + --shadow: 0 1px 0 rgba(15, 23, 42, 0.04), 0 12px 32px rgba(15, 23, 42, 0.08); + --shadow-soft: 0 20px 45px rgba(15, 23, 42, 0.08); + --radius-sm: 12px; + --radius-md: 18px; + --radius-lg: 24px; } html { @@ -28,41 +30,66 @@ html { } body { + min-height: 100vh; background: - radial-gradient(circle at top left, rgba(45, 164, 78, 0.08), transparent 26%), - radial-gradient(circle at top right, rgba(9, 105, 218, 0.08), transparent 22%), - var(--bg); + radial-gradient(circle at top left, rgba(45, 164, 78, 0.10), transparent 24%), + radial-gradient(circle at top right, rgba(9, 105, 218, 0.12), transparent 20%), + radial-gradient(circle at 50% 100%, rgba(255, 193, 7, 0.08), transparent 26%), + linear-gradient(180deg, #f8fbff 0%, #f3f6fb 52%, #eef3f8 100%); color: var(--text); font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; text-rendering: optimizeLegibility; } +main.container-xxl { + position: relative; +} + +main.container-xxl::before { + content: ''; + position: fixed; + inset: auto auto -12rem -12rem; + width: 24rem; + height: 24rem; + background: radial-gradient(circle, rgba(9, 105, 218, 0.10), transparent 70%); + pointer-events: none; + filter: blur(20px); + z-index: 0; +} + +main.container-xxl > * { + position: relative; + z-index: 1; +} + .app-header { - background: rgba(13, 17, 23, 0.92); - backdrop-filter: blur(12px); - border-bottom-color: rgba(240, 246, 252, 0.08) !important; + background: var(--nav-bg); + backdrop-filter: blur(16px) saturate(150%); + -webkit-backdrop-filter: blur(16px) saturate(150%); + border-bottom-color: rgba(240, 246, 252, 0.10) !important; + box-shadow: 0 10px 34px rgba(13, 17, 23, 0.12); } .navbar { - min-height: 72px; + min-height: 74px; } .brand-mark { - width: 36px; - height: 36px; - border-radius: 11px; + width: 40px; + height: 40px; + border-radius: 14px; display: inline-flex; align-items: center; justify-content: center; background: linear-gradient(135deg, var(--accent) 0%, var(--accent-blue) 100%); color: var(--accent-contrast); font-size: 1rem; - box-shadow: 0 10px 22px rgba(9, 105, 218, 0.22); + box-shadow: 0 14px 30px rgba(9, 105, 218, 0.28); } .brand-title { color: var(--nav-text); - font-size: 0.96rem; + font-size: 0.98rem; font-weight: 700; letter-spacing: -0.02em; line-height: 1.1; @@ -70,29 +97,53 @@ body { .brand-subtitle { color: rgba(240, 246, 252, 0.72); - font-size: 0.76rem; + font-size: 0.77rem; line-height: 1.2; } .panel { - background: rgba(255, 255, 255, 0.94); + position: relative; + overflow: hidden; + background: linear-gradient(180deg, var(--surface-strong) 0%, rgba(255, 255, 255, 0.78) 100%); border: 1px solid var(--border); border-radius: var(--radius-lg); box-shadow: var(--shadow); - padding: 1.25rem; + backdrop-filter: blur(18px); + -webkit-backdrop-filter: blur(18px); + padding: 1.35rem; +} + +.panel::after { + content: ''; + position: absolute; + inset: 0; + background: linear-gradient(180deg, rgba(255, 255, 255, 0.28), transparent 36%); + pointer-events: none; +} + +.panel > * { + position: relative; + z-index: 1; } .panel-hero { - padding: 1.5rem; + padding: 1.6rem; } .eyebrow { - color: var(--text-muted); + display: inline-flex; + align-items: center; + gap: 0.45rem; + color: var(--accent-blue); + background: rgba(9, 105, 218, 0.08); + border: 1px solid rgba(9, 105, 218, 0.12); + border-radius: 999px; + padding: 0.38rem 0.7rem; text-transform: uppercase; letter-spacing: 0.08em; - font-size: 0.71rem; + font-size: 0.70rem; font-weight: 700; - margin-bottom: 0.85rem; + margin-bottom: 0.95rem; } .hero-title, @@ -119,25 +170,29 @@ body { display: inline-flex; align-items: center; gap: 0.4rem; - padding: 0.42rem 0.7rem; + padding: 0.46rem 0.78rem; border-radius: 999px; font-size: 0.78rem; - font-weight: 600; + font-weight: 650; border: 1px solid var(--border); - background: var(--surface-muted); + background: rgba(247, 250, 253, 0.92); color: var(--text); -} - -.stat-card { - display: flex; - flex-direction: column; - justify-content: space-between; - min-height: 100%; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.55); } .stat-card { position: relative; - overflow: hidden; + display: flex; + flex-direction: column; + justify-content: space-between; + min-height: 100%; + transition: transform 0.22s ease, box-shadow 0.22s ease, border-color 0.22s ease; +} + +.stat-card:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-soft); + border-color: rgba(9, 105, 218, 0.16); } .stat-card::before { @@ -149,6 +204,34 @@ body { background: linear-gradient(90deg, var(--accent), var(--accent-blue)); } +.stat-card::after { + content: ''; + position: absolute; + top: -2rem; + right: -2rem; + width: 8rem; + height: 8rem; + border-radius: 50%; + background: radial-gradient(circle, rgba(9, 105, 218, 0.12), transparent 70%); + pointer-events: none; +} + +.stat-card-total { + background: linear-gradient(180deg, rgba(255, 255, 255, 0.92) 0%, rgba(240, 247, 255, 0.88) 100%); +} + +.stat-card-active { + background: linear-gradient(180deg, rgba(255, 255, 255, 0.92) 0%, rgba(237, 245, 255, 0.90) 100%); +} + +.stat-card-done { + background: linear-gradient(180deg, rgba(255, 255, 255, 0.92) 0%, rgba(239, 251, 243, 0.90) 100%); +} + +.stat-card-urgent { + background: linear-gradient(180deg, rgba(255, 255, 255, 0.92) 0%, rgba(255, 247, 236, 0.90) 100%); +} + .stat-card-active::before { background: linear-gradient(90deg, var(--accent-blue), #54aeff); } @@ -165,7 +248,8 @@ body { .stat-note, .detail-label, .task-meta, -.form-text { +.form-text, +.form-label { color: var(--text-muted); } @@ -178,14 +262,14 @@ body { } .stat-value { - font-size: clamp(1.8rem, 3vw, 2.35rem); + font-size: clamp(2rem, 3vw, 2.55rem); line-height: 1; - letter-spacing: -0.05em; - margin: 0.5rem 0 0.35rem; + letter-spacing: -0.06em; + margin: 0.75rem 0 0.42rem; } .stat-note { - font-size: 0.85rem; + font-size: 0.86rem; } .panel-header { @@ -193,7 +277,9 @@ body { align-items: center; justify-content: space-between; gap: 1rem; - margin-bottom: 1rem; + margin-bottom: 1.1rem; + padding-bottom: 0.95rem; + border-bottom: 1px solid rgba(31, 35, 40, 0.08); } .panel-header-stack { @@ -201,8 +287,14 @@ body { } .panel-title { - font-size: 1.15rem; - font-weight: 700; + font-size: 1.18rem; + font-weight: 750; +} + +.form-label { + font-size: 0.86rem; + font-weight: 650; + margin-bottom: 0.45rem; } .form-control, @@ -216,26 +308,52 @@ body { .form-control, .form-select, .input-group-text { - border-color: var(--border); - min-height: 46px; - background: #fff; + border-color: rgba(31, 35, 40, 0.10); + min-height: 48px; + background: rgba(255, 255, 255, 0.78); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.65); +} + +.form-control::placeholder, +.form-select::placeholder { + color: #97a0ab; +} + +.form-control:hover, +.form-select:hover { + border-color: rgba(9, 105, 218, 0.20); } .form-control:focus, .form-select:focus { - border-color: var(--accent-blue); - box-shadow: 0 0 0 0.2rem rgba(9, 105, 218, 0.14); + border-color: rgba(9, 105, 218, 0.45); + background: #ffffff; + box-shadow: 0 0 0 0.24rem rgba(9, 105, 218, 0.11); +} + +textarea.form-control { + min-height: 124px; + resize: vertical; } .btn { - font-weight: 600; + min-height: 44px; + font-weight: 650; + letter-spacing: -0.01em; box-shadow: none !important; + transition: transform 0.18s ease, background-color 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease; +} + +.btn:hover, +.btn:focus { + transform: translateY(-1px); } .btn-dark { background: linear-gradient(180deg, #3fb950 0%, var(--accent) 100%); border-color: var(--accent-dark); color: var(--accent-contrast); + box-shadow: 0 12px 24px rgba(45, 164, 78, 0.18) !important; } .btn-dark:hover, @@ -243,18 +361,19 @@ body { background: linear-gradient(180deg, #2ea043 0%, var(--accent-dark) 100%); border-color: #1a7f37; color: var(--accent-contrast); + box-shadow: 0 16px 28px rgba(31, 136, 61, 0.24) !important; } .btn-light { - background: #f6f8fa; - border-color: var(--border); + background: rgba(246, 248, 250, 0.92); + border-color: rgba(31, 35, 40, 0.10); color: var(--text); } .btn-light:hover, .btn-light:focus { - background: #eef2f6; - border-color: var(--border-strong); + background: #ffffff; + border-color: rgba(9, 105, 218, 0.16); color: var(--text); } @@ -264,21 +383,23 @@ body { } .btn-filter { - border: 1px solid var(--border); - background: var(--surface-muted); + border: 1px solid rgba(31, 35, 40, 0.10); + background: rgba(247, 250, 253, 0.88); color: var(--text); - padding-inline: 0.9rem; + padding-inline: 0.95rem; } .btn-filter:hover { - border-color: var(--accent-blue); + border-color: rgba(9, 105, 218, 0.22); color: var(--accent-blue); + background: #ffffff; } .btn-check:checked + .btn-filter { background: var(--accent-blue-soft); color: var(--accent-blue); - border-color: #b6e3ff; + border-color: rgba(9, 105, 218, 0.24); + box-shadow: inset 0 0 0 1px rgba(9, 105, 218, 0.08); } .sort-select { @@ -286,6 +407,8 @@ body { } .task-list { + display: grid; + gap: 0.85rem; max-height: 70vh; overflow: auto; padding-right: 0.25rem; @@ -293,61 +416,83 @@ body { .task-item { position: relative; - border: 1px solid var(--border); + border: 1px solid rgba(31, 35, 40, 0.08); border-radius: var(--radius-md); - padding: 1rem; - background: #fff; + padding: 1.05rem; + background: linear-gradient(180deg, rgba(255, 255, 255, 0.92) 0%, rgba(250, 252, 255, 0.88) 100%); cursor: pointer; transition: border-color 0.18s ease, box-shadow 0.18s ease, transform 0.18s ease, background-color 0.18s ease; } +.task-item::before { + content: ''; + position: absolute; + inset: 0 auto 0 0; + width: 0; + border-radius: inherit; + background: linear-gradient(180deg, var(--accent-blue), #54aeff); + transition: width 0.18s ease; +} + +.task-item > * { + position: relative; + z-index: 1; +} + .task-item:focus-visible { outline: none; - border-color: var(--accent-blue); - box-shadow: 0 0 0 3px rgba(9, 105, 218, 0.16); + border-color: rgba(9, 105, 218, 0.36); + box-shadow: 0 0 0 4px rgba(9, 105, 218, 0.12); } .task-item:hover { - border-color: var(--accent-blue); - box-shadow: 0 12px 24px rgba(9, 105, 218, 0.08); - background: #fbfdff; - transform: translateY(-1px); + border-color: rgba(9, 105, 218, 0.24); + box-shadow: 0 18px 34px rgba(9, 105, 218, 0.10); + background: #ffffff; + transform: translateY(-2px); +} + +.task-item:hover::before, +.task-item-active::before { + width: 4px; } .task-item-active { - border-color: var(--accent-blue); - box-shadow: inset 3px 0 0 var(--accent-blue), 0 0 0 1px rgba(9, 105, 218, 0.08); - background: #f9fcff; + border-color: rgba(9, 105, 218, 0.30); + box-shadow: 0 20px 38px rgba(9, 105, 218, 0.12); + background: linear-gradient(180deg, #ffffff 0%, #f4f9ff 100%); } .task-item-done { - background: #f6fff8; + background: linear-gradient(180deg, rgba(246, 255, 248, 0.94) 0%, rgba(239, 251, 243, 0.90) 100%); } .check-button { - width: 38px; - height: 38px; + width: 40px; + height: 40px; border-radius: 50%; - border: 1px solid var(--border); - background: #fff; + border: 1px solid rgba(31, 35, 40, 0.10); + background: rgba(255, 255, 255, 0.94); color: var(--text-muted); display: inline-flex; align-items: center; justify-content: center; font-size: 1.05rem; + transition: all 0.18s ease; } .check-button:hover { - border-color: var(--accent); + border-color: rgba(45, 164, 78, 0.24); color: var(--accent); - background: #f6fff8; + background: #ffffff; + transform: scale(1.03); } .task-title-link { font-weight: 700; color: var(--text); text-decoration: none; - font-size: 0.97rem; + font-size: 1rem; } .task-title-link:hover { @@ -357,16 +502,16 @@ body { .task-snippet, .detail-description { color: var(--text-muted); - line-height: 1.55; + line-height: 1.58; } .task-item-done .task-title-link, .task-item-done .task-snippet { - opacity: 0.72; + opacity: 0.74; } .task-meta { - font-size: 0.78rem; + font-size: 0.79rem; } .priority-high, @@ -374,37 +519,37 @@ body { .priority-low, .status-active, .status-done { - border: 1px solid var(--border); + border: 1px solid rgba(31, 35, 40, 0.08); } .priority-high { - background: #fef2f2; - color: #991b1b; - border-color: #fecaca; + background: #fff1f1; + color: #ae2a19; + border-color: rgba(207, 34, 46, 0.18); } .priority-medium { - background: #fff8c5; + background: #fff9db; color: #9a6700; - border-color: #eedb85; + border-color: rgba(154, 103, 0, 0.16); } .priority-low { - background: #dafbe1; + background: #ddfbe6; color: #1a7f37; - border-color: #aceebb; + border-color: rgba(26, 127, 55, 0.16); } .status-active { background: var(--accent-blue-soft); color: var(--accent-blue); - border-color: #b6e3ff; + border-color: rgba(9, 105, 218, 0.16); } .status-done { - background: #dafbe1; + background: #ddfbe6; color: var(--success); - border-color: #aceebb; + border-color: rgba(26, 127, 55, 0.16); } .icon-button { @@ -419,6 +564,7 @@ body { .detail-panel { display: flex; flex-direction: column; + background: linear-gradient(180deg, rgba(255, 255, 255, 0.95) 0%, rgba(244, 248, 253, 0.90) 100%); } .detail-stack { @@ -426,46 +572,48 @@ body { } .detail-title { - font-size: 1.35rem; - margin-bottom: 0.7rem; + font-size: 1.4rem; + margin-bottom: 0.75rem; } .detail-block { - padding: 0.9rem 1rem; - border: 1px solid var(--border); + padding: 1rem 1.05rem; + border: 1px solid rgba(31, 35, 40, 0.08); border-radius: var(--radius-md); - background: linear-gradient(180deg, #ffffff 0%, #f6f8fa 100%); + background: linear-gradient(180deg, rgba(255, 255, 255, 0.92) 0%, rgba(247, 250, 253, 0.88) 100%); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.55); } .detail-value { - margin-top: 0.3rem; - font-weight: 600; + margin-top: 0.34rem; + font-weight: 650; } .empty-state { - border: 1px dashed var(--border-strong); + border: 1px dashed rgba(31, 35, 40, 0.16); border-radius: var(--radius-md); - background: linear-gradient(180deg, #ffffff 0%, #f6f8fa 100%); - padding: 1.25rem; + background: linear-gradient(180deg, rgba(255, 255, 255, 0.88) 0%, rgba(244, 248, 253, 0.86) 100%); + padding: 1.5rem; } .empty-icon { - width: 54px; - height: 54px; + width: 60px; + height: 60px; margin-inline: auto; - border-radius: 50%; - background: #fff; - border: 1px solid var(--border); + border-radius: 18px; + background: linear-gradient(180deg, #ffffff 0%, #f3f7fb 100%); + border: 1px solid rgba(31, 35, 40, 0.08); display: inline-flex; align-items: center; justify-content: center; - font-size: 1.35rem; - color: var(--text-muted); + font-size: 1.45rem; + color: var(--accent-blue); + box-shadow: 0 12px 28px rgba(9, 105, 218, 0.10); } .toast { - border-radius: 12px; - box-shadow: 0 18px 36px rgba(13, 17, 23, 0.16); + border-radius: 14px; + box-shadow: 0 20px 42px rgba(13, 17, 23, 0.18); } .stretched-link-reset { @@ -484,7 +632,7 @@ body { } ::-webkit-scrollbar-thumb { - background: #d4d4d8; + background: rgba(123, 132, 144, 0.45); border-radius: 999px; border: 2px solid transparent; background-clip: padding-box; @@ -494,6 +642,14 @@ body { background: transparent; } +@media (min-width: 1200px) { + #task-form, + .detail-panel { + position: sticky; + top: 92px; + } +} + @media (max-width: 1199.98px) { .task-list { max-height: none; @@ -518,10 +674,10 @@ body { .sort-select { width: 100%; } -} -.detail-panel { - background: linear-gradient(180deg, rgba(255, 255, 255, 0.98) 0%, rgba(246, 248, 250, 0.98) 100%); + .stat-value { + font-size: 1.85rem; + } } .navbar .btn-dark { @@ -529,8 +685,9 @@ body { } .btn-outline-danger { - border-color: rgba(207, 34, 46, 0.28); + border-color: rgba(207, 34, 46, 0.22); color: var(--danger); + background: rgba(255, 255, 255, 0.82); } .btn-outline-danger:hover,