*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { font-size: 16px; scroll-behavior: smooth; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; background: #f5f5f7; color: #1a1a2e; min-height: 100vh; line-height: 1.5; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; } :root { --accent: #4f46e5; --accent-light: #eef2ff; --accent-dark: #3730a3; --surface: #ffffff; --surface-2: #f8f8fc; --border: #e2e2ef; --text: #1a1a2e; --text-2: #6b6b8d; --text-3: #9999b8; --danger: #dc2626; --warn: #d97706; --radius: 10px; --radius-sm: 6px; --shadow: 0 1px 4px rgba(79,70,229,.08), 0 4px 16px rgba(0,0,0,.06); --shadow-sm: 0 1px 3px rgba(0,0,0,.08); --t: 140ms ease; } .site-header { background: var(--surface); border-bottom: 1px solid var(--border); position: sticky; top: 0; z-index: 100; } .header-inner { max-width: 1100px; margin: 0 auto; padding: .875rem 1.5rem; display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; } .brand { display: flex; align-items: center; gap: .5rem; } .brand-icon { color: var(--accent); font-size: 1.2rem; } .brand-name { font-size: 1.2rem; font-weight: 700; letter-spacing: -.02em; } .counts { display: flex; align-items: center; gap: .5rem; font-size: .85rem; color: var(--text-2); } .count-num { font-weight: 700; font-size: .9rem; } .count-num.accent { color: var(--accent); } .count-num.muted { color: var(--text-3); } .count-sep { color: var(--border); } .main-layout { max-width: 1100px; margin: 0 auto; padding: 1.5rem 1.5rem 4rem; display: grid; grid-template-columns: 320px 1fr; gap: 1.5rem; align-items: start; } @media (max-width: 750px) { .main-layout { grid-template-columns: 1fr; padding: 1rem 1rem 3rem; } } .create-panel, .tasks-panel { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem; box-shadow: var(--shadow-sm); } .create-panel { position: sticky; top: 72px; } @media (max-width: 750px) { .create-panel { position: static; } } .panel-title { font-size: .8rem; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--text-2); margin-bottom: 1rem; } .field-group { display: flex; flex-direction: column; gap: .3rem; margin-bottom: .85rem; } .field-group:last-child { margin-bottom: 0; } .field-label { font-size: .8rem; font-weight: 600; color: var(--text-2); } .required { color: var(--accent); } .field-row { display: flex; gap: .75rem; } .field-group--half { flex: 1; } .field-error { font-size: .75rem; color: var(--danger); min-height: 1em; } .input { width: 100%; padding: .5rem .75rem; border: 1px solid var(--border); border-radius: var(--radius-sm); font-size: .9rem; font-family: inherit; color: var(--text); background: var(--surface-2); transition: border-color var(--t), box-shadow var(--t); outline: none; -webkit-appearance: none; appearance: none; } .input:focus { border-color: var(--accent); box-shadow: 0 0 0 3px rgba(79,70,229,.15); background: var(--surface); } .input::placeholder { color: var(--text-3); } .textarea { resize: vertical; min-height: 56px; } .select { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%236b6b8d' d='M0 0l6 8 6-8z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right .7rem center; padding-right: 2rem; cursor: pointer; } .select--compact { width: auto; font-size: .82rem; padding: .4rem .7rem; padding-right: 1.9rem; } input[type="date"] { cursor: pointer; } .btn { display: inline-flex; align-items: center; justify-content: center; gap: .4rem; padding: .55rem 1rem; border-radius: var(--radius-sm); font-size: .875rem; font-weight: 600; font-family: inherit; border: 1px solid transparent; cursor: pointer; transition: background var(--t), color var(--t), box-shadow var(--t), border-color var(--t); outline: none; white-space: nowrap; } .btn:focus-visible { box-shadow: 0 0 0 3px rgba(79,70,229,.25); outline: 2px solid var(--accent); outline-offset: 2px; } .btn--primary { background: var(--accent); color: #fff; border-color: var(--accent); } .btn--primary:hover { background: var(--accent-dark); border-color: var(--accent-dark); } .btn--ghost { background: transparent; color: var(--text-2); border-color: var(--border); } .btn--ghost:hover { background: var(--surface-2); color: var(--text); } .btn--full { width: 100%; } .btn--icon { padding: .4rem; background: transparent; border: 1px solid transparent; color: var(--text-3); border-radius: var(--radius-sm); } .btn--icon:hover { background: var(--surface-2); color: var(--text-2); border-color: var(--border); } .btn--icon.danger:hover { color: var(--danger); background: #fff1f1; border-color: #fca5a5; } .filters-bar { display: flex; gap: .75rem; flex-wrap: wrap; align-items: center; margin-bottom: 1rem; } .search-wrap { flex: 1; min-width: 160px; position: relative; } .search-icon { position: absolute; left: .7rem; top: 50%; transform: translateY(-50%); color: var(--text-3); font-size: 1rem; pointer-events: none; } .input--search { padding-left: 2rem; } .filter-selects { display: flex; gap: .5rem; flex-shrink: 0; } .task-list { list-style: none; display: flex; flex-direction: column; gap: .5rem; } .task-item { border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); padding: .875rem 1rem; display: flex; align-items: flex-start; gap: .875rem; transition: box-shadow var(--t), border-color var(--t); position: relative; animation: slide-in 180ms ease; } .task-item:hover { box-shadow: var(--shadow); border-color: #c7c7e6; } .task-item.completed { opacity: .65; } .task-item.completed .task-main-title { text-decoration: line-through; color: var(--text-3); } .task-item::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; border-radius: var(--radius) 0 0 var(--radius); } .task-item[data-priority="high"]::before { background: var(--danger); } .task-item[data-priority="medium"]::before { background: var(--warn); } .task-item[data-priority="low"]::before { background: #22c55e; } .task-toggle { width: 18px; height: 18px; flex-shrink: 0; margin-top: 2px; accent-color: var(--accent); cursor: pointer; } .task-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } .task-body { flex: 1; min-width: 0; } .task-main-title { font-size: .9rem; font-weight: 600; color: var(--text); word-break: break-word; } .task-meta { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; margin-top: .3rem; } .task-notes-text { font-size: .8rem; color: var(--text-2); margin-top: .2rem; word-break: break-word; white-space: pre-wrap; } .badge { font-size: .7rem; font-weight: 600; letter-spacing: .04em; padding: .15rem .45rem; border-radius: 999px; text-transform: uppercase; } .badge-priority-high { background: #fee2e2; color: #b91c1c; } .badge-priority-medium { background: #fef3c7; color: #92400e; } .badge-priority-low { background: #dcfce7; color: #15803d; } .badge-due { background: var(--accent-light); color: var(--accent-dark); font-size: .7rem; } .badge-due.overdue { background: #fee2e2; color: #b91c1c; } .task-actions { display: flex; gap: .25rem; flex-shrink: 0; align-items: center; } .empty-state { text-align: center; padding: 3rem 1.5rem; color: var(--text-3); } .empty-icon { font-size: 2.5rem; display: block; margin-bottom: .75rem; } .empty-title { font-size: 1rem; font-weight: 600; color: var(--text-2); margin-bottom: .4rem; } .empty-sub { font-size: .85rem; } .modal-backdrop { position: fixed; inset: 0; z-index: 200; background: rgba(26,26,46,.45); display: flex; align-items: center; justify-content: center; padding: 1rem; backdrop-filter: blur(2px); } .modal-backdrop[hidden] { display: none; } .modal-box { background: var(--surface); border-radius: var(--radius); box-shadow: 0 8px 40px rgba(0,0,0,.18); padding: 1.5rem; width: 100%; max-width: 460px; max-height: 90vh; overflow-y: auto; } .modal-title { font-size: 1rem; font-weight: 700; color: var(--text); margin-bottom: 1.25rem; } .modal-actions { display: flex; gap: .75rem; justify-content: flex-end; margin-top: 1rem; } :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } input:focus-visible, textarea:focus-visible, select:focus-visible { outline: none; } @keyframes slide-in { from { opacity:0; transform:translateY(-6px); } to { opacity:1; transform:translateY(0); } }