/* 通用组件样式 - 统一设计系统 */ /* 按钮组件 */ .btn-base { display: inline-flex; align-items: center; justify-content: center; gap: var(--spacing-sm); padding: var(--spacing-md) var(--spacing-lg); border-radius: var(--radius-lg); font-size: var(--text-sm); font-weight: var(--font-medium); line-height: 1; text-decoration: none; border: none; cursor: pointer; transition: all var(--transition-normal); white-space: nowrap; user-select: none; } .btn-base:focus { outline: 2px solid var(--primary); outline-offset: 2px; } .btn-base:disabled { background-color: var(--btn-disabled-bg); color: var(--btn-disabled-text); cursor: not-allowed; opacity: 0.6; } .btn-base svg { width: 16px; height: 16px; flex-shrink: 0; } /* 按钮变体 */ .btn-primary { background-color: var(--btn-primary-bg); color: var(--btn-primary-text); } .btn-primary:hover:not(:disabled) { background-color: var(--btn-primary-hover); } .btn-secondary { background-color: var(--btn-secondary-bg); color: var(--btn-secondary-text); border: 1px solid var(--btn-secondary-border); } .btn-secondary:hover:not(:disabled) { background-color: var(--btn-secondary-hover); } .btn-success { background-color: var(--btn-success-bg); color: var(--btn-success-text); } .btn-success:hover:not(:disabled) { background-color: var(--btn-success-hover); } .btn-warning { background-color: var(--btn-warning-bg); color: var(--btn-warning-text); } .btn-warning:hover:not(:disabled) { background-color: var(--btn-warning-hover); } .btn-error { background-color: var(--btn-error-bg); color: var(--btn-error-text); } .btn-error:hover:not(:disabled) { background-color: var(--btn-error-hover); } /* 按钮尺寸 */ .btn-sm { padding: var(--spacing-sm) var(--spacing-md); font-size: var(--text-xs); } .btn-lg { padding: var(--spacing-lg) var(--spacing-2xl); font-size: var(--text-base); } /* 输入框组件 */ .input-base { width: 100%; padding: var(--spacing-md) var(--spacing-lg); background-color: var(--input-bg); border: 1px solid var(--input-border); border-radius: var(--radius-lg); color: var(--input-text); font-size: var(--text-sm); line-height: 1.5; transition: border-color var(--transition-normal), box-shadow var(--transition-normal); } .input-base:focus { outline: none; border-color: var(--input-border-focus); box-shadow: var(--input-shadow-focus); } .input-base::placeholder { color: var(--input-placeholder); } .input-base:disabled { background-color: var(--bg-quaternary); color: var(--text-disabled); cursor: not-allowed; } /* 卡片组件 */ .card-base { background: var(--card-bg); border: 1px solid var(--card-border); border-radius: var(--radius-xl); padding: var(--spacing-2xl); box-shadow: var(--card-shadow); transition: border-color var(--transition-normal), box-shadow var(--transition-normal); } .card-base:hover { border-color: var(--card-hover-border); } .card-interactive { cursor: pointer; transition: transform var(--transition-normal), border-color var(--transition-normal), box-shadow var(--transition-normal); } .card-interactive:hover { transform: translateY(-2px); border-color: var(--card-hover-border); box-shadow: var(--shadow-lg); } /* 模态框组件 */ .modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: var(--modal-backdrop); display: flex; align-items: center; justify-content: center; z-index: var(--z-modal-backdrop); padding: var(--spacing-xl); } .modal-content { background: var(--modal-bg); border: 1px solid var(--modal-border); border-radius: var(--radius-xl); width: 100%; max-width: 500px; max-height: 90vh; overflow-y: auto; box-shadow: var(--shadow-xl); } .modal-header { display: flex; align-items: center; justify-content: space-between; padding: var(--spacing-xl) var(--spacing-2xl); border-bottom: 1px solid var(--modal-header-border); } .modal-title { font-size: var(--text-lg); font-weight: var(--font-semibold); color: var(--text-primary); margin: 0; } .modal-body { padding: var(--spacing-2xl); } .modal-footer { display: flex; align-items: center; justify-content: flex-end; gap: var(--spacing-md); padding: var(--spacing-xl) var(--spacing-2xl); border-top: 1px solid var(--modal-footer-border); } /* 表格组件 */ .table-container { background: var(--card-bg); border: 1px solid var(--card-border); border-radius: var(--radius-xl); overflow: hidden; } .table-header { background: var(--table-header-bg); border-bottom: 1px solid var(--table-border); padding: var(--spacing-lg) var(--spacing-xl); font-weight: var(--font-semibold); color: var(--text-secondary); font-size: var(--text-sm); } .table-row { border-bottom: 1px solid var(--table-border); padding: var(--spacing-lg) var(--spacing-xl); transition: background-color var(--transition-normal); } .table-row:hover { background-color: var(--table-row-hover); } .table-row:last-child { border-bottom: none; } .table-row.selected { background-color: var(--table-selected); } /* 状态徽章 */ .badge-base { display: inline-flex; align-items: center; padding: var(--spacing-xs) var(--spacing-sm); border-radius: var(--radius-md); font-size: var(--text-xs); font-weight: var(--font-medium); line-height: 1; } .badge-success { background-color: var(--status-approved-light); color: var(--status-approved); border: 1px solid var(--success-border); } .badge-warning { background-color: var(--status-pending-light); color: var(--status-pending); border: 1px solid var(--warning-border); } .badge-error { background-color: var(--error-light); color: var(--error); border: 1px solid var(--error-border); } .badge-info { background-color: var(--info-light); color: var(--info); border: 1px solid var(--info-border); } /* 加载动画 */ .spinner { width: 32px; height: 32px; border: 3px solid var(--spinner-secondary); border-top: 3px solid var(--spinner-primary); border-radius: 50%; animation: spin 1s linear infinite; } .spinner-sm { width: 16px; height: 16px; border-width: 2px; } .spinner-lg { width: 48px; height: 48px; border-width: 4px; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* 工具提示 */ .tooltip { position: relative; display: inline-block; } .tooltip-content { position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: var(--bg-quaternary); color: var(--text-primary); padding: var(--spacing-sm) var(--spacing-md); border-radius: var(--radius-md); font-size: var(--text-xs); white-space: nowrap; z-index: var(--z-tooltip); opacity: 0; visibility: hidden; transition: opacity var(--transition-normal), visibility var(--transition-normal); } .tooltip:hover .tooltip-content { opacity: 1; visibility: visible; } /* 分页组件 */ .pagination { display: flex; align-items: center; justify-content: center; gap: var(--spacing-sm); padding: var(--spacing-xl); } .pagination-btn { padding: var(--spacing-sm) var(--spacing-md); background: var(--btn-secondary-bg); border: 1px solid var(--btn-secondary-border); border-radius: var(--radius-md); color: var(--btn-secondary-text); font-size: var(--text-sm); cursor: pointer; transition: all var(--transition-normal); } .pagination-btn:hover:not(:disabled) { background: var(--btn-secondary-hover); } .pagination-btn:disabled { background: var(--btn-disabled-bg); color: var(--btn-disabled-text); cursor: not-allowed; opacity: 0.6; } .pagination-info { font-size: var(--text-sm); color: var(--text-tertiary); margin: 0 var(--spacing-lg); } /* 空状态 */ .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: var(--spacing-3xl) var(--spacing-xl); text-align: center; color: var(--text-tertiary); } .empty-state svg { width: 48px; height: 48px; margin-bottom: var(--spacing-lg); color: var(--text-disabled); } .empty-state-title { font-size: var(--text-lg); font-weight: var(--font-medium); color: var(--text-secondary); margin-bottom: var(--spacing-sm); } .empty-state-description { font-size: var(--text-sm); color: var(--text-tertiary); margin-bottom: var(--spacing-lg); }