All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 7m10s
sticky bottom: 0 的语义是"natural 位置在视口底之下时贴底,否则正常坐落"。 当 .content 滚动容器下方还有内容时,翻页按钮浮在视口底部, 表格行从它身后滚过 — 视觉上"翻页按钮下面又有表格内容"非常违和。 恢复成普通 .pagination + padding-bottom 兜底, 依赖批次 I 的根因三件套(100dvh + min-height: 0)解决 Safari 翻页被工具栏遮挡: - 100dvh 保证 .layout 高度 = 用户实际可见区(不被 Safari 工具栏吃掉) - min-height: 0 保证 .content 内部能正常 overflow-y: auto 滚动 - padding-bottom: 8px 给按钮一点缓冲 用户期望就是"滚动条能滚到最底,翻页按钮可见可点",而不是"翻页按钮固定不动"。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
111 lines
8.1 KiB
CSS
111 lines
8.1 KiB
CSS
.page { max-width: none; }
|
|
.title { font-size: 22px; font-weight: 600; color: var(--color-text-primary); margin-bottom: 20px; }
|
|
|
|
.filters { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; gap: 12px; flex-wrap: wrap; }
|
|
.searchGroup { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
|
|
.searchInput {
|
|
padding: 8px 12px; background: var(--color-bg-card); border: 1px solid var(--color-border-card);
|
|
border-radius: 8px; color: var(--color-text-primary); font-size: 13px; width: 240px; outline: none;
|
|
}
|
|
.searchInput:focus { border-color: var(--color-primary); }
|
|
.statusSelect {
|
|
padding: 8px 12px; background: var(--color-bg-card); border: 1px solid var(--color-border-card);
|
|
border-radius: 8px; color: var(--color-text-primary); font-size: 13px; outline: none;
|
|
}
|
|
.searchBtn, .refreshBtn {
|
|
padding: 8px 16px; border-radius: 8px; font-size: 13px; cursor: pointer; transition: all 0.15s;
|
|
}
|
|
.searchBtn { background: var(--color-primary); border: none; color: var(--color-on-primary); }
|
|
.searchBtn:hover { opacity: 0.9; }
|
|
.refreshBtn { background: transparent; border: 1px solid var(--color-border-card); color: var(--color-text-secondary); }
|
|
.refreshBtn:hover { background: var(--color-sidebar-hover); }
|
|
.createBtn { padding: 8px 16px; border-radius: 8px; font-size: 13px; cursor: pointer; transition: all 0.15s; background: var(--color-success); border: none; color: var(--color-on-primary); font-weight: 500; }
|
|
.createBtn:hover { opacity: 0.9; }
|
|
|
|
.tableWrapper {
|
|
background: var(--color-bg-card); border: 1px solid var(--color-border-card);
|
|
border-radius: var(--radius-card); overflow-x: auto;
|
|
box-shadow: var(--shadow-card-light);
|
|
}
|
|
.table { width: 100%; border-collapse: collapse; font-size: 13px; }
|
|
.table th { padding: 12px 16px; text-align: left; color: var(--color-text-secondary); font-weight: 500; border-bottom: 1px solid var(--color-border-card); white-space: nowrap; }
|
|
.table td { padding: 12px 16px; color: var(--color-text-primary); border-bottom: 1px solid var(--color-border-row); white-space: nowrap; }
|
|
.table tr:last-child td { border-bottom: none; }
|
|
.table tr:hover td { background: var(--color-bg-row-hover); }
|
|
|
|
.usernameLink { background: none; border: none; color: var(--color-primary); cursor: pointer; font-size: 13px; text-decoration: underline; }
|
|
.statusBadge { padding: 2px 8px; border-radius: 4px; font-size: 12px; }
|
|
.active { background: var(--color-success-bg); color: var(--color-success); }
|
|
.disabled { background: var(--color-danger-bg); color: var(--color-danger); }
|
|
|
|
.actions { display: flex; gap: 6px; }
|
|
.editBtn, .toggleBtn { padding: 4px 10px; border-radius: 6px; font-size: 12px; cursor: pointer; transition: all 0.15s; }
|
|
.editBtn { background: transparent; border: 1px solid var(--color-primary); color: var(--color-primary); }
|
|
.editBtn:hover { background: var(--color-info-bg-hover); }
|
|
.disableBtn { background: transparent; border: 1px solid var(--color-danger); color: var(--color-danger); }
|
|
.disableBtn:hover { background: var(--color-danger-bg-hover); }
|
|
.enableBtn { background: transparent; border: 1px solid var(--color-success); color: var(--color-success); }
|
|
.enableBtn:hover { background: var(--color-success-bg-hover); }
|
|
|
|
.empty { text-align: center; color: var(--color-text-secondary); padding: 40px; }
|
|
.skeletonCell { height: 16px; background: var(--color-border-card); border-radius: 4px; animation: pulse 1.5s ease-in-out infinite; }
|
|
@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }
|
|
|
|
.pagination { display: flex; justify-content: space-between; align-items: center; margin-top: 16px; padding-bottom: 8px; }
|
|
.pageInfo { color: var(--color-text-secondary); font-size: 13px; }
|
|
.pageButtons { display: flex; gap: 4px; }
|
|
.pageButtons button {
|
|
padding: 6px 12px; background: var(--color-bg-card); border: 1px solid var(--color-border-card);
|
|
border-radius: 6px; color: var(--color-text-secondary); font-size: 13px; cursor: pointer;
|
|
}
|
|
.pageButtons button:hover:not(:disabled) { background: var(--color-sidebar-hover); color: var(--color-text-primary); }
|
|
.pageButtons button:disabled { opacity: 0.4; cursor: not-allowed; }
|
|
.activePage { background: var(--color-primary) !important; color: var(--color-on-primary) !important; border-color: var(--color-primary) !important; }
|
|
|
|
/* Modal */
|
|
.modalOverlay { position: fixed; inset: 0; background: var(--color-modal-overlay); display: flex; align-items: center; justify-content: center; z-index: 300; }
|
|
.modal { background: var(--color-bg-modal-elevated); border: 1px solid var(--color-border-card); border-radius: var(--radius-card); padding: 24px; width: 400px; max-width: 90vw; }
|
|
.modalTitle { font-size: 16px; font-weight: 600; color: var(--color-text-primary); margin-bottom: 20px; }
|
|
.formGroup { margin-bottom: 16px; }
|
|
.formGroup label { display: block; color: var(--color-text-secondary); font-size: 13px; margin-bottom: 6px; }
|
|
.formGroup input { width: 100%; padding: 8px 12px; background: var(--color-bg-page); border: 1px solid var(--color-border-card); border-radius: 8px; color: var(--color-text-primary); font-size: 14px; outline: none; }
|
|
.formGroup input:focus { border-color: var(--color-primary); }
|
|
.modalActions { display: flex; justify-content: flex-end; gap: 8px; }
|
|
.cancelBtn { padding: 8px 16px; background: transparent; border: 1px solid var(--color-border-card); border-radius: 8px; color: var(--color-text-secondary); font-size: 13px; cursor: pointer; }
|
|
.saveBtn { padding: 8px 16px; background: var(--color-primary); border: none; border-radius: 8px; color: var(--color-on-primary); font-size: 13px; cursor: pointer; }
|
|
.formRow { display: flex; gap: 12px; }
|
|
.formRow .formGroup { flex: 1; }
|
|
.checkboxLabel { display: flex; align-items: center; gap: 8px; cursor: pointer; color: var(--color-text-primary); font-size: 13px; }
|
|
.checkboxLabel input[type="checkbox"] { width: 16px; height: 16px; accent-color: var(--color-primary); cursor: pointer; }
|
|
.formError { color: var(--color-danger); font-size: 13px; margin-bottom: 12px; }
|
|
|
|
/* Drawer */
|
|
.drawerOverlay { position: fixed; inset: 0; background: var(--color-overlay-soft); z-index: 300; }
|
|
.drawer {
|
|
position: fixed; right: 0; top: 0; bottom: 0; width: 440px; max-width: 90vw;
|
|
background: var(--color-bg-modal-elevated); border-left: 1px solid var(--color-border-card);
|
|
display: flex; flex-direction: column; z-index: 301;
|
|
animation: slideIn 0.2s ease;
|
|
}
|
|
@keyframes slideIn { from { transform: translateX(100%); } to { transform: translateX(0); } }
|
|
.drawerHeader { display: flex; justify-content: space-between; align-items: center; padding: 16px 20px; border-bottom: 1px solid var(--color-border-card); }
|
|
.drawerHeader h3 { font-size: 16px; color: var(--color-text-primary); }
|
|
.drawerClose { background: none; border: none; color: var(--color-text-secondary); font-size: 24px; cursor: pointer; line-height: 1; }
|
|
.drawerBody { flex: 1; overflow-y: auto; padding: 20px; }
|
|
.detailGrid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 24px; }
|
|
.detailItem { display: flex; flex-direction: column; gap: 4px; }
|
|
.detailLabel { color: var(--color-text-secondary); font-size: 12px; }
|
|
.detailValue { color: var(--color-text-primary); font-size: 14px; }
|
|
.recordsTitle { font-size: 15px; font-weight: 600; color: var(--color-text-primary); margin-bottom: 12px; }
|
|
.recordsList { display: flex; flex-direction: column; gap: 8px; }
|
|
.recordItem { padding: 12px; background: var(--color-bg-page); border-radius: 8px; }
|
|
.recordTime { color: var(--color-text-secondary); font-size: 12px; margin-bottom: 4px; }
|
|
.recordMeta { display: flex; gap: 8px; align-items: center; margin-bottom: 4px; }
|
|
.recordSeconds { color: var(--color-primary); font-weight: 600; font-size: 14px; }
|
|
.recordMode { color: var(--color-text-secondary); font-size: 12px; }
|
|
.recordStatus { font-size: 12px; padding: 1px 6px; border-radius: 4px; }
|
|
.completed { background: var(--color-success-bg); color: var(--color-success); }
|
|
.failed { background: var(--color-danger-bg); color: var(--color-danger); }
|
|
.queued, .processing { background: var(--color-info-bg); color: var(--color-primary); }
|
|
.recordPrompt { color: var(--color-text-secondary); font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|