.app-shell { min-height: 100vh; display: grid; grid-template-columns: 240px minmax(0, 1fr); background: #f5f7fa; color: #17202a; } .sidebar { background: #ffffff; border-right: 1px solid #d7dde5; padding: 18px 14px; } .brand { display: flex; align-items: center; gap: 12px; padding: 4px 6px 18px; border-bottom: 1px solid #e6eaf0; } .brand-mark { width: 38px; height: 38px; display: grid; place-items: center; border-radius: 8px; background: #1d4ed8; color: #ffffff; font-weight: 700; } .brand h1 { margin: 0; font-size: 17px; line-height: 22px; } .brand span, .topbar span { color: #657386; font-size: 12px; } .tabs { display: grid; gap: 6px; margin-top: 18px; } .tabs button, button { min-height: 34px; display: inline-flex; align-items: center; justify-content: center; gap: 7px; border: 1px solid #cfd7e3; border-radius: 6px; background: #ffffff; color: #17202a; font: inherit; cursor: pointer; white-space: nowrap; } .tabs button { justify-content: flex-start; padding: 0 10px; } button:hover:not(:disabled) { border-color: #1d4ed8; color: #1d4ed8; } button:disabled { cursor: not-allowed; opacity: 0.56; } button.active, .tabs button.active, .segmented button.active { background: #eaf1ff; border-color: #1d4ed8; color: #1d4ed8; } button.secondary { background: #f9fafb; } button.ghost { background: transparent; } button.danger { border-color: #f2c8c8; color: #b42318; } button.danger:hover:not(:disabled) { border-color: #b42318; color: #8a1f16; } .icon-only { width: 34px; padding: 0; } .workspace { min-width: 0; padding: 18px; } .topbar { min-height: 58px; display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 12px; } .topbar h2 { margin: 0; font-size: 22px; line-height: 28px; } .topbar-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; } .notice { margin-bottom: 12px; padding: 10px 12px; border: 1px solid #b9dfc5; border-radius: 6px; background: #eefbf2; color: #166534; } .notice.error { border-color: #f1b7b7; background: #fff1f1; color: #9f1c1c; } .panel { background: #ffffff; border: 1px solid #d7dde5; border-radius: 8px; padding: 14px; } .form-grid { display: grid; grid-template-columns: repeat(3, minmax(180px, 1fr)); gap: 14px; } label, .field { display: grid; gap: 6px; align-content: start; } label span, .field > span { color: #4b5b6f; font-size: 12px; font-weight: 600; } input { width: 100%; box-sizing: border-box; min-height: 34px; border: 1px solid #cfd7e3; border-radius: 6px; background: #ffffff; color: #17202a; font: inherit; padding: 0 10px; outline: none; } input:focus { border-color: #1d4ed8; box-shadow: 0 0 0 3px rgba(29, 78, 216, 0.12); } .checkbox { grid-template-columns: 18px 1fr; align-items: center; gap: 8px; } .checkbox input { width: 16px; min-height: 16px; } .segmented { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; } .toolbar { display: flex; align-items: center; gap: 8px; margin-top: 14px; } .toolbar.split { justify-content: space-between; margin-top: 0; margin-bottom: 12px; } .search { max-width: 360px; } .table-wrap { overflow: auto; border: 1px solid #e2e7ee; border-radius: 8px; } table { width: 100%; min-width: 840px; border-collapse: collapse; table-layout: fixed; } th, td { height: 44px; border-bottom: 1px solid #e8edf3; padding: 0 10px; text-align: left; vertical-align: middle; overflow: hidden; text-overflow: ellipsis; } th { background: #f8fafc; color: #4b5b6f; font-size: 12px; font-weight: 700; } tr:last-child td { border-bottom: none; } .name-cell { font-weight: 700; } .path-cell { max-width: 280px; color: #4b5b6f; font-family: Consolas, "Courier New", monospace; font-size: 12px; } .row-actions { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; } .row-actions button { min-height: 30px; padding: 0 8px; font-size: 12px; } .badge { display: inline-flex; align-items: center; min-height: 22px; padding: 0 8px; border-radius: 999px; background: #eef2f7; color: #4b5b6f; font-size: 12px; line-height: 22px; } .badge.downloaded, .badge.installed, .badge.local { background: #e8f7ee; color: #166534; } .badge.check_failed, .badge.error { background: #fff1f1; color: #9f1c1c; } .empty { height: 72px; text-align: center; color: #657386; } @media (max-width: 860px) { .app-shell { grid-template-columns: 1fr; } .sidebar { border-right: none; border-bottom: 1px solid #d7dde5; } .tabs { grid-template-columns: repeat(3, 1fr); } .form-grid { grid-template-columns: 1fr; } }