/* ======================================== 報到系統 - Bootstrap-style CSS 使用黑翅鳶配色方案 ======================================== */ /* ========================================== CSS 變數定義 - 黑翅鳶配色 定義位置:Content/Site.css (line 8-60) ========================================== */ :root { /* 主色系 - 黑灰白 (Black-winged Kite) */ --color-black: #1a1a1a; /* 純黑 - 黑翅鳶翅膀 */ --color-dark-gray: #2d2d2d; /* 深灰 - 羽毛陰影 */ --color-medium-gray: #4a4a4a; /* 中灰 - 身體輪廓 */ --color-light-gray: #8a8a8a; /* 淺灰 - 次要文字 */ --color-silver: #d0d0d0; /* 銀灰 - 邊框 */ --color-pale-gray: #e8e8e8; /* 淡灰 - 按鈕背景 */ --color-bright-gray: #f5f5f5; /* 亮灰 - 卡片標題 */ --color-white: #ffffff; /* 純白 - 內容區域 */ /* 強調色 - 黑翅鳶特徵 */ --color-red-eye: #c41e3a; /* 深紅 - 黑翅鳶的紅眼睛 ?? */ --color-red-eye-dark: #a01828; /* 深紅暗色 - 懸停狀態 */ --color-red-eye-light: #d42040; /* 深紅亮色 - 啟用狀態 */ --color-yellow-claw: #d4a017; /* 金黃 - 黑翅鳶的黃爪子 ?? */ --color-yellow-claw-dark: #b8890d; /* 金黃暗色 */ /* 語意化顏色 */ --color-primary: var(--color-red-eye); --color-primary-hover: var(--color-red-eye-dark); --color-secondary: var(--color-pale-gray); --color-success: #28a745; --color-danger: var(--color-red-eye); --color-warning: var(--color-yellow-claw); --color-info: #17a2b8; /* 背景色 */ --bg-body: #f0f0f0; --bg-content: var(--color-white); --bg-sidebar: var(--color-dark-gray); --bg-navbar: var(--color-black); --bg-card-header: var(--color-bright-gray); /* 文字顏色 */ --text-primary: var(--color-dark-gray); --text-secondary: var(--color-medium-gray); --text-muted: var(--color-light-gray); --text-light: var(--color-white); /* 邊框 */ --border-color: #dee2e6; --border-color-dark: var(--color-silver); --border-radius: 4px; /* 陰影 */ --shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.08); --shadow-md: 0 2px 8px rgba(0, 0, 0, 0.1); --shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.15); --shadow-navbar: 0 2px 8px rgba(0, 0, 0, 0.3); /* 焦點狀態 */ --focus-color: var(--color-red-eye); --focus-shadow: 0 0 0 0.2rem rgba(196, 30, 58, 0.25); /* 間距 */ --spacing-xs: 5px; --spacing-sm: 10px; --spacing-md: 15px; --spacing-lg: 20px; --spacing-xl: 30px; --spacing-xxl: 40px; /* 字體 */ --font-family: "Microsoft JhengHei", "微軟正黑體", Arial, sans-serif; --font-size-base: 14px; --font-size-sm: 12px; --font-size-lg: 16px; --line-height: 1.6; } /* 基本重置和全局樣式 */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: var(--font-family); font-size: var(--font-size-base); line-height: var(--line-height); color: var(--text-primary); background-color: var(--bg-body); } a { color: var(--text-secondary); text-decoration: none; } a:hover { color: var(--color-red-eye); text-decoration: underline; } /* 容器 */ .container { width: 100%; max-width: 1200px; margin: 0 auto; padding: 0 15px; } .container-fluid { width: 100%; padding: 0 15px; } /* 導航列 - 頂部 Bar */ .navbar { grid-area: navbar; background-color: var(--bg-navbar); color: var(--text-light); padding: 0; box-shadow: var(--shadow-navbar); z-index: 1000; height: 60px; } .navbar-container { display: flex; justify-content: space-between; align-items: center; height: 100%; padding: 0 20px; } .navbar-brand { font-size: 20px; font-weight: bold; color: var(--text-light) !important; padding: 0; display: inline-block; } .navbar-user { display: flex; align-items: center; gap: 15px; } .user-name { color: rgba(255,255,255,0.85); font-size: var(--font-size-base); } .btn-logout { color: var(--color-black) !important; background-color: var(--color-pale-gray); padding: 6px var(--spacing-md); border-radius: var(--border-radius); text-decoration: none !important; transition: all 0.3s; border: 1px solid var(--color-silver); cursor: pointer; } .btn-logout:hover { background-color: var(--color-white); border-color: #b0b0b0; box-shadow: var(--shadow-sm); } .navbar-nav { list-style: none; margin: 0; padding: 0; display: flex; } .navbar-nav li { position: relative; } .navbar-nav a { color: rgba(255,255,255,0.85); padding: 15px 20px; display: block; transition: all 0.3s; } .navbar-nav a:hover { background-color: rgba(255,255,255,0.1); color: #fff; text-decoration: none; } .navbar-nav .active a { background-color: #007bff; color: #fff; } /* 下拉選單 */ .dropdown { position: relative; } .dropdown-menu { display: none; position: absolute; top: 100%; left: 0; background-color: #fff; min-width: 180px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); list-style: none; padding: 5px 0; z-index: 1000; } .dropdown:hover .dropdown-menu { display: block; } .dropdown-menu a { color: #333; padding: 10px 20px; display: block; } .dropdown-menu a:hover { background-color: #f8f9fa; color: #007bff; } /* 主要內容區域 */ .main-content { background-color: var(--bg-content); padding: var(--spacing-xl); margin: var(--spacing-lg) auto; border-radius: var(--border-radius); box-shadow: var(--shadow-md); border: 1px solid var(--border-color); } /* 標題 */ h1, h2, h3, h4, h5, h6 { margin-bottom: var(--spacing-md); font-weight: 600; line-height: 1.2; } h1 { font-size: 32px; color: var(--text-primary); } h2 { font-size: 28px; color: var(--text-primary); } h3 { font-size: 24px; color: var(--text-primary); } h4 { font-size: 20px; color: var(--text-secondary); } /* 表單樣式 */ .form-group { display: flex; flex-direction: column; margin-bottom: var(--spacing-lg); } .form-label { display: block; margin-bottom: var(--spacing-xs); font-weight: 500; color: var(--text-primary); font-size: var(--font-size-base); } .form-label.required::after { content: " *"; color: var(--color-danger); } /* 表單行 - 多欄位水平佈局 */ .form-row { display: flex; gap: var(--spacing-lg); margin-bottom: 0; } .form-col-50 { flex: 1; min-width: 0; } .form-col-100 { flex: 1; min-width: 0; } .form-col-50 .form-control, .form-col-50 textarea, .form-col-100 .form-control, .form-col-100 textarea { width: 100%; } /* 表單組 - 單行輸入水平佈局 */ .form-group-inline { display: flex; align-items: center; gap: var(--spacing-sm); margin-bottom: var(--spacing-md); position: relative; } .form-group-inline.form-col-50 { flex: 1; min-width: 0; } .form-label-inline { white-space: nowrap; font-weight: 900; color: var(--text-primary); font-size: var(--font-size-base); min-width: 70px; flex-shrink: 0; text-align: right; } .form-label-inline::after { content: ':'; } .form-label-inline.required::before { content: '* '; color: var(--color-danger); } /* 標籤寬度變體 - Grid 基礎 */ .form-label-inline.w-2 { min-width: calc(2 / 12 * 100%); } .form-label-inline.w-3 { min-width: calc(3 / 12 * 100%); } .form-label-inline.w-4 { min-width: calc(4 / 12 * 100%); } .form-label-inline.w-5 { min-width: calc(5 / 12 * 100%); } .form-label-inline.w-6 { min-width: calc(6 / 12 * 100%); } /* 標籤寬度變體 - 固定像素 */ .form-label-inline.w-px-60 { min-width: 60px; } .form-label-inline.w-px-70 { min-width: 70px; } .form-label-inline.w-px-80 { min-width: 80px; } .form-label-inline.w-px-100 { min-width: 100px; } .form-group-inline .form-control, .form-group-inline select { flex: 1; margin: 0; } /* 複選框樣式 */ .checkbox-group { display: flex; align-items: center; gap: var(--spacing-sm); } .checkbox-group input[type="checkbox"] { width: auto; height: auto; cursor: pointer; margin: 0; } .checkbox-label { margin: 0; cursor: pointer; font-weight: normal; user-select: none; font-size: var(--font-size-base); } /* 錯誤訊息 */ .error-message { color: var(--color-danger); font-size: var(--font-size-sm); margin-top: var(--spacing-xs); display: block; } .form-control { display: block; width: 100%; padding: var(--spacing-sm) var(--spacing-md); font-size: var(--font-size-base); line-height: var(--line-height); color: var(--text-primary); background-color: var(--bg-content); border: 1px solid var(--border-color); border-radius: var(--border-radius); box-sizing: border-box; transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; font-family: inherit; } .form-control:focus { border-color: var(--focus-color); outline: 0; box-shadow: var(--focus-shadow); } .form-control:disabled, .form-control[readonly] { background-color: #e9ecef; opacity: 1; cursor: not-allowed; } input[type="text"], input[type="password"], input[type="email"], input[type="number"], input[type="tel"], input[type="date"], textarea, select { display: block; width: 100%; padding: var(--spacing-sm) var(--spacing-md); font-size: var(--font-size-base); line-height: var(--line-height); color: var(--text-primary); background-color: #fff; border: 1px solid var(--border-color); border-radius: var(--border-radius); font-family: inherit; } textarea.form-control { min-height: 9lh; resize: vertical; } /* 模板按鈕 */ .btn-template { padding: 4px 8px; font-size: var(--font-size-sm); background: #6c757d; color: white; border: none; border-radius: var(--border-radius); cursor: pointer; transition: background 0.2s; } .btn-template:hover { background: #5a6268; } /* 模板按鈕容器 */ .template-buttons { display: flex; gap: var(--spacing-sm); margin-top: var(--spacing-xs); flex-wrap: wrap; } /* 模板預覽 */ .template-preview { background: var(--bg-card-header); border: 1px solid var(--border-color); border-radius: var(--border-radius); padding: var(--spacing-md); min-height: 120px; font-size: var(--font-size-base); line-height: var(--line-height); word-wrap: break-word; white-space: pre-wrap; overflow-y: auto; } .template-preview .preview-placeholder { color: var(--text-muted); margin: 0; } .template-preview .preview-content { color: var(--text-primary); margin: 0; } /* 密碼顯示/隱藏按鈕 */ .btn-icon { margin-left: var(--spacing-sm); padding: 2px 6px; background: none; border: 1px solid var(--border-color); border-radius: 3px; cursor: pointer; font-size: var(--font-size-sm); color: var(--color-primary); transition: all 0.2s; } .btn-icon:hover { background: #e7f3ff; border-color: var(--color-primary); } /* 頁面容器 - 統一邊框和間距 */ .page-container { padding: var(--spacing-lg); max-width: 1800px; margin: 0 auto; } /* 頁面標題區塊 */ .page-header { margin-bottom: var(--spacing-xl); } .page-title { font-size: 28px; font-weight: 600; color: var(--text-primary); margin: 0 0 var(--spacing-sm) 0; } .page-description { color: var(--text-muted); font-size: var(--font-size-base); margin: 0; } /* 內容面板 */ .content-panel { background: var(--bg-content); border-radius: var(--border-radius); border: 1px solid var(--border-color); padding: var(--spacing-lg); margin-bottom: var(--spacing-lg); } .panel-title { font-size: 18px; font-weight: 600; color: var(--text-primary); margin: 0 0 var(--spacing-md) 0; padding-bottom: var(--spacing-sm); border-bottom: 2px solid var(--border-color); } /* 搜尋面板 */ .search-panel { background: var(--bg-content); border-radius: var(--border-radius); border: 1px solid var(--border-color); padding: var(--spacing-lg); margin-bottom: var(--spacing-lg); } .search-row { display: grid; grid-template-columns: repeat(12, 1fr); gap: var(--spacing-md); margin-bottom: var(--spacing-md); } /* 搜尋欄位(縱向佈局) */ .search-field { display: flex; flex-direction: column; flex: 1; min-width: 200px; } /* 搜尋欄位(橫向佈局) */ .search-field-inline { display: flex; align-items: center; gap: var(--spacing-sm); height: 40px; } .search-label { display: block; font-weight: 500; margin-bottom: var(--spacing-xs); color: var(--text-primary); font-size: var(--font-size-base); } .search-label-inline { white-space: nowrap; font-weight: 900; color: var(--text-primary); font-size: var(--font-size-base); min-width: 80px; flex-shrink: 0; text-align: right; } .search-label-inline::after { content: ':'; } .search-label.required::before, .search-label-inline.required::before { content: ' *'; color: var(--color-danger); } .search-input { width: 100%; padding: var(--spacing-sm) var(--spacing-md); border: 1px solid var(--border-color); border-radius: var(--border-radius); font-size: var(--font-size-base); transition: all 0.2s; } .search-input:focus { outline: none; border-color: var(--focus-color); box-shadow: var(--focus-shadow); } /* 搜尋欄位寬度 - Grid 基礎 12 欄 */ .search-field-inline.w-2 { grid-column: span 2; } .search-field-inline.w-3 { grid-column: span 3; } .search-field-inline.w-4 { grid-column: span 4; } .search-field-inline.w-5 { grid-column: span 5; } .search-field-inline.w-6 { grid-column: span 6; } /* 搜尋輸入群組 - 複合輸入 */ .search-input-group { display: flex; align-items: center; gap: var(--spacing-sm); flex: 1; } .search-checkbox-label { display: flex; align-items: center; gap: 4px; white-space: nowrap; font-size: var(--font-size-base); color: var(--text-secondary); cursor: pointer; margin: 0; } .search-checkbox-label input[type="checkbox"] { cursor: pointer; margin: 0; } .search-actions { display: flex; gap: var(--spacing-sm); justify-content: flex-end; margin-top: var(--spacing-md); } /* 結果面板 */ .result-panel { background: var(--bg-content); border-radius: var(--border-radius); border: 1px solid var(--border-color); padding: var(--spacing-lg); overflow: hidden; } .result-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--spacing-md); padding: 0 var(--spacing-md); gap: var(--spacing-md); } .result-title { font-size: 18px; font-weight: 600; color: var(--text-primary); } .header-actions { display: flex; align-items: center; gap: var(--spacing-md); } /* 自動完成欄位 */ .autocomplete-field { position: relative; } .autocomplete-container { position: relative; flex: 1; } .autocomplete-input { width: 100%; } .autocomplete-dropdown { position: absolute; top: 100%; left: 0; right: 0; background: var(--bg-content); border: 1px solid var(--border-color); border-top: none; max-height: 200px; overflow-y: auto; z-index: 1000; box-shadow: var(--shadow-md); border-radius: 0 0 var(--border-radius) var(--border-radius); } .autocomplete-item { padding: var(--spacing-sm) var(--spacing-md); cursor: pointer; border-bottom: 1px solid #f0f0f0; display: flex; justify-content: space-between; align-items: center; gap: var(--spacing-md); transition: background-color 0.2s; } .autocomplete-item:last-child { border-bottom: none; } .autocomplete-item:hover { background-color: var(--bg-card-header); } .autocomplete-value { font-weight: 600; color: var(--text-primary); min-width: 100px; } .autocomplete-name { color: var(--text-muted); flex: 1; text-align: left; } /* 結果表格樣式 */ .result-table { width: 100%; border-collapse: collapse; margin-bottom: var(--spacing-md); background: var(--bg-content); } .result-table th { background: linear-gradient(135deg, var(--color-bright-gray) 0%, #e9e9e9 100%); padding: var(--spacing-md); text-align: left; font-weight: 600; color: var(--text-primary); border-bottom: 2px solid var(--border-color); } .result-table th.text-center, .result-table td.text-center { text-align: center; } .result-table td { padding: var(--spacing-md); border-bottom: 1px solid var(--border-color); font-size: var(--font-size-base); color: var(--text-primary); transition: background-color 0.2s; } .result-table tbody tr:hover { background: var(--bg-card-header); } .result-table tbody input[type="checkbox"], .result-table thead input[type="checkbox"] { width: 18px; height: 18px; cursor: pointer; margin: 0; vertical-align: middle; accent-color: var(--color-primary); } .password-cell { position: relative; } .password-mask { color: var(--text-muted); letter-spacing: 2px; } .password-text { font-family: monospace; word-break: break-all; } .project-cell { max-width: 200px; word-wrap: break-word; word-break: break-all; white-space: normal; } select.form-control { appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23333' d='M6 9L1 4h10z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 10px center; padding-right: 30px; } .form-inline { display: flex; align-items: center; gap: 10px; } .form-inline .form-group { margin-bottom: 0; } .form-inline .form-control { width: auto; } /* 表單驗證 */ .form-control.is-invalid { border-color: #dc3545; } .form-control.is-valid { border-color: #28a745; } .invalid-feedback { display: block; color: #dc3545; font-size: 12px; margin-top: 5px; } .valid-feedback { display: block; color: #28a745; font-size: 12px; margin-top: 5px; } /* 按鈕 */ .btn { display: inline-block; font-weight: 400; text-align: center; white-space: nowrap; vertical-align: middle; user-select: none; border: 1px solid transparent; padding: 8px 16px; font-size: 14px; line-height: 1.6; border-radius: 4px; transition: all 0.15s ease-in-out; cursor: pointer; } .btn:hover { text-decoration: none; } .btn:focus { outline: 0; box-shadow: 0 0 0 0.2rem rgba(0,123,255,0.25); } .btn-primary { color: var(--text-light); background-color: var(--color-primary); border-color: var(--color-primary); } .btn-primary:hover { background-color: var(--color-primary-hover); border-color: var(--color-primary-hover); box-shadow: var(--shadow-md); } .btn-secondary { color: var(--text-primary); background-color: var(--color-secondary); border-color: var(--color-silver); } .btn-secondary:hover { background-color: #d8d8d8; border-color: #c0c0c0; } .btn-success { color: #fff; background-color: #28a745; border-color: #28a745; } .btn-success:hover { background-color: #218838; border-color: #1e7e34; } .btn-danger { color: #fff; background-color: #dc3545; border-color: #dc3545; } .btn-danger:hover { background-color: #c82333; border-color: #bd2130; } .btn-warning { color: #212529; background-color: #ffc107; border-color: #ffc107; } .btn-warning:hover { background-color: #e0a800; border-color: #d39e00; } .btn-info { color: #fff; background-color: #17a2b8; border-color: #17a2b8; } .btn-info:hover { background-color: #138496; border-color: #117a8b; } .btn-light { color: #212529; background-color: #f8f9fa; border-color: #f8f9fa; } .btn-light:hover { background-color: #e2e6ea; border-color: #dae0e5; } .btn-dark { color: #fff; background-color: #343a40; border-color: #343a40; } .btn-dark:hover { background-color: #23272b; border-color: #1d2124; } .btn-link { color: #007bff; background-color: transparent; border-color: transparent; } .btn-link:hover { color: #0056b3; background-color: transparent; border-color: transparent; text-decoration: underline; } .btn-sm { padding: 4px 12px; font-size: 14px; } .btn-lg { padding: 10px 20px; font-size: 16px; } .btn-block { display: block; width: 100%; } .btn:disabled { opacity: 0.5; cursor: not-allowed; } .btn-primary:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(196, 30, 58, 0.3); } .btn-secondary:hover:not(:disabled) { transform: translateY(-2px); } .btn-success:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(40, 167, 69, 0.3); } .btn-danger:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(220, 53, 69, 0.3); } /* 表格 */ .table { width: 100%; margin-bottom: var(--spacing-lg); border-collapse: collapse; background-color: var(--bg-content); } .table th, .table td { padding: 12px; text-align: left; border-bottom: 1px solid var(--border-color); } .table thead th { background-color: var(--bg-card-header); font-weight: 600; color: var(--text-primary); border-bottom: 2px solid var(--color-silver); vertical-align: bottom; } .table tbody tr:hover { background-color: #f8f9fa; } .table-striped tbody tr:nth-of-type(odd) { background-color: rgba(0,0,0,0.02); } .table-bordered { border: 1px solid #dee2e6; } .table-bordered th, .table-bordered td { border: 1px solid #dee2e6; } .table-hover tbody tr:hover { background-color: rgba(0,0,0,0.05); } .table-sm th, .table-sm td { padding: 6px; } /* 表格響應式 */ .table-responsive { display: block; width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; } /* 卡片 */ .card { background-color: var(--bg-content); border: 1px solid rgba(0,0,0,0.125); border-radius: var(--border-radius); margin-bottom: var(--spacing-lg); } .card-header { padding: 12px var(--spacing-lg); background-color: var(--bg-card-header); border-bottom: 1px solid var(--border-color); font-weight: 600; color: var(--text-primary); } .card-body { padding: var(--spacing-lg); } .card-footer { padding: 12px 20px; background-color: #f8f9fa; border-top: 1px solid rgba(0,0,0,0.125); } /* 提示訊息 */ .alert { padding: 12px 20px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; } .alert-success { color: #155724; background-color: #d4edda; border-color: #c3e6cb; } .alert-info { color: #0c5460; background-color: #d1ecf1; border-color: #bee5eb; } .alert-warning { color: #856404; background-color: #fff3cd; border-color: #ffeaa7; } .alert-danger { color: #721c24; background-color: #f8d7da; border-color: #f5c6cb; } /* 徽章 */ .badge { display: inline-block; padding: 4px 8px; font-size: 12px; font-weight: 600; line-height: 1; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: 3px; } .badge-primary { color: #ffffff; background-color: #c41e3a; } .badge-success { color: #ffffff; background-color: #5a5a5a; } .badge-danger { color: #ffffff; background-color: #c41e3a; } .badge-warning { color: #1a1a1a; background-color: #d4a017; } .badge-info { color: #ffffff; background-color: #4a4a4a; } /* 分頁 */ .pagination { display: flex; justify-content: center; align-items: center; gap: var(--spacing-sm); list-style: none; padding: var(--spacing-md); margin: var(--spacing-lg) 0; background: var(--bg-card-header); border-top: 1px solid var(--border-color); border-radius: var(--border-radius); } .pagination-info { color: var(--text-muted); margin: 0 var(--spacing-md); } .pagination-control { display: flex; align-items: center; gap: var(--spacing-sm); justify-content: center; white-space: nowrap; } .pagination li { margin-right: 5px; } .pagination a, .pagination button { display: block; padding: 8px 12px; border: 1px solid var(--border-color); color: var(--color-primary); background-color: #fff; border-radius: var(--border-radius); } .pagination a:hover, .pagination button:hover:not(:disabled) { background-color: #e9ecef; text-decoration: none; } .pagination .active a { background-color: var(--color-primary); color: #fff; border-color: var(--color-primary); } .pagination .disabled a, .pagination button:disabled { color: #6c757d; pointer-events: none; background-color: #fff; border-color: var(--border-color); opacity: 0.5; cursor: not-allowed; } .pagination-select { padding: 6px 12px; border: 1px solid var(--border-color); border-radius: var(--border-radius); font-size: var(--font-size-base); background: white; cursor: pointer; } .pagination-select:focus { outline: none; border-color: var(--focus-color); box-shadow: var(--focus-shadow); } /* SMS 批發面板 */ .sms-send-panel { background: #fff8f0; border: 1px solid #ffc9a6; border-radius: var(--border-radius); padding: var(--spacing-md); margin-bottom: var(--spacing-lg); } .sms-send-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--spacing-md); padding-bottom: var(--spacing-sm); border-bottom: 1px solid #ffc9a6; } .sms-send-title { font-size: 16px; font-weight: 600; color: var(--color-danger); } .sms-selected-count { background: var(--color-danger); color: white; padding: 4px 12px; border-radius: 12px; font-size: var(--font-size-sm); font-weight: 600; } .sms-send-content { display: flex; flex-direction: column; gap: var(--spacing-md); } .sms-actions { display: flex; justify-content: flex-end; gap: var(--spacing-md); } /* SMS 批發壓縮版 */ .sms-send-compact { display: flex; align-items: center; gap: var(--spacing-sm); padding: 0; } /* 彈窗樣式 */ .modal { display: none; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); } .modal.show { display: flex; justify-content: center; align-items: center; } .modal-dialog { background: var(--bg-content); border-radius: var(--border-radius); width: 50vw; max-height: 95vh; display: flex; flex-direction: column; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); } /* RWD 斷點設定 - modal-dialog */ /* 超大屏 (>=1920px) - Desktop XL */ @media (min-width: 1920px) { .modal-dialog { width: 50vw; } } /* 大屏 (>=1200px) - Desktop */ @media (min-width: 1200px) and (max-width: 1919px) { .modal-dialog { width: 60vw; } } /* 中屏 (>=768px and <1200px) - Tablet */ @media (min-width: 768px) and (max-width: 1199px) { .modal-dialog { width: 75vw; } } /* 小屏 (>=576px and <768px) - Small mobile */ @media (min-width: 576px) and (max-width: 767px) { .modal-dialog { width: 90vw; } } /* 超小屏 (<576px) - Mobile */ @media (max-width: 575px) { .modal-dialog { width: 95vw; } } .modal-header { padding: var(--spacing-lg); border-bottom: 1px solid var(--border-color); } .modal-title { font-size: 20px; font-weight: 600; margin: 0; } .modal-body { padding: var(--spacing-lg); flex: 1; overflow-y: auto; } .modal-footer { padding: var(--spacing-lg); border-top: 1px solid var(--border-color); display: flex; gap: var(--spacing-sm); justify-content: flex-end; } /* 訊息樣式 */ .empty-message { text-align: center; padding: var(--spacing-xl); color: var(--text-muted); } .loading-message { text-align: center; padding: var(--spacing-xl); color: var(--text-muted); } /* 驗證錯誤訊息樣式 */ .error-message { color: #dc3545; font-size: 12px; margin-top: 4px; min-height: 16px; } /* 網格系統 */ .row { display: flex; flex-wrap: wrap; margin-right: -15px; margin-left: -15px; } .col, .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12 { position: relative; width: 100%; padding-right: 15px; padding-left: 15px; } .col-1 { flex: 0 0 8.333333%; max-width: 8.333333%; } .col-2 { flex: 0 0 16.666667%; max-width: 16.666667%; } .col-3 { flex: 0 0 25%; max-width: 25%; } .col-4 { flex: 0 0 33.333333%; max-width: 33.333333%; } .col-5 { flex: 0 0 41.666667%; max-width: 41.666667%; } .col-6 { flex: 0 0 50%; max-width: 50%; } .col-7 { flex: 0 0 58.333333%; max-width: 58.333333%; } .col-8 { flex: 0 0 66.666667%; max-width: 66.666667%; } .col-9 { flex: 0 0 75%; max-width: 75%; } .col-10 { flex: 0 0 83.333333%; max-width: 83.333333%; } .col-11 { flex: 0 0 91.666667%; max-width: 91.666667%; } .col-12 { flex: 0 0 100%; max-width: 100%; } /* 工具類別 */ .text-center { text-align: center; } .text-left { text-align: left; } .text-right { text-align: right; } .text-primary { color: var(--color-primary); } .text-success { color: var(--color-medium-gray); } .text-danger { color: var(--color-danger); } .text-warning { color: var(--color-warning); } .text-info { color: #3d3d3d; } .text-muted { color: var(--text-muted); } .bg-primary { background-color: var(--color-primary); } .bg-success { background-color: #5a5a5a; } .bg-danger { background-color: var(--color-danger); } .bg-warning { background-color: var(--color-warning); } .bg-info { background-color: #3d3d3d; } .bg-light { background-color: var(--color-bright-gray); } .bg-dark { background-color: var(--color-black); } .mt-1 { margin-top: 5px; } .mt-2 { margin-top: 10px; } .mt-3 { margin-top: 20px; } .mt-4 { margin-top: 30px; } .mt-5 { margin-top: 40px; } .mb-1 { margin-bottom: 5px; } .mb-2 { margin-bottom: 10px; } .mb-3 { margin-bottom: 20px; } .mb-4 { margin-bottom: 30px; } .mb-5 { margin-bottom: 40px; } .ml-1 { margin-left: 5px; } .ml-2 { margin-left: 10px; } .ml-3 { margin-left: 20px; } .mr-1 { margin-right: 5px; } .mr-2 { margin-right: 10px; } .mr-3 { margin-right: 20px; } .pt-1 { padding-top: 5px; } .pt-2 { padding-top: 10px; } .pt-3 { padding-top: 20px; } .pt-4 { padding-top: 30px; } .pt-5 { padding-top: 40px; } .pb-1 { padding-bottom: 5px; } .pb-2 { padding-bottom: 10px; } .pb-3 { padding-bottom: 20px; } .pb-4 { padding-bottom: 30px; } .pb-5 { padding-bottom: 40px; } .pl-1 { padding-left: 5px; } .pl-2 { padding-left: 10px; } .pl-3 { padding-left: 20px; } .pr-1 { padding-right: 5px; } .pr-2 { padding-right: 10px; } .pr-3 { padding-right: 20px; } .d-none { display: none; } .d-block { display: block; } .d-inline { display: inline; } .d-inline-block { display: inline-block; } .float-left { float: left; } .float-right { float: right; } .clearfix::after { content: ""; display: table; clear: both; } /* 響應式工具 */ @media (max-width: 768px) { .container { max-width: 100%; } .navbar-nav { flex-direction: column; } .main-content { padding: 15px; margin: 10px auto; } .table-responsive { border: 1px solid #dee2e6; } .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12 { flex: 0 0 100%; max-width: 100%; } } /* 主容器布局 */ .main-container { display: flex; margin-top: 60px; min-height: calc(100vh - 60px); } /* 側邊選單 */ .sidebar { grid-area: sidebar; background-color: var(--bg-sidebar); color: var(--color-pale-gray); overflow-y: auto; transition: all 0.3s ease; z-index: 999; border-right: 1px solid var(--color-black); width: 250px; } .grid-container.sidebar-collapsed .sidebar { width: 60px; } .sidebar-toggle { width: 100%; padding: 15px; background-color: #1a1a1a; color: #fff; border: none; cursor: pointer; font-size: 20px; text-align: center; transition: background-color 0.3s; } .sidebar-toggle:hover { background-color: #0d0d0d; } .sidebar-menu { padding: 10px 0; } .menu-list { list-style: none; margin: 0; padding: 0; } .menu-item { margin-bottom: 2px; } .menu-link { display: flex; align-items: center; padding: 12px 15px; color: #e8e8e8; text-decoration: none; transition: all 0.3s; cursor: pointer; } .menu-link:hover { background-color: #3d3d3d; color: #ffffff; text-decoration: none; } .menu-icon { font-size: 18px; min-width: 30px; text-align: center; } .menu-text { flex: 1; margin-left: 10px; } .menu-arrow { font-size: 12px; transition: transform 0.3s; } .sidebar.collapsed .menu-text, .sidebar.collapsed .menu-arrow { display: none; } .submenu { list-style: none; padding: 0; margin: 0; background-color: #1a1a1a; display: none; } .submenu li { padding: 0; } .submenu a { display: block; padding: 10px 15px 10px 55px; color: #b0b0b0; text-decoration: none; transition: all 0.3s; font-size: 13px; } .submenu a:hover { background-color: #2d2d2d; color: #ffffff; padding-left: 60px; } .sidebar.collapsed .submenu { display: none !important; } /* 內容區域 */ .content-area { grid-area: content; padding: 0; background-color: var(--bg-body); overflow-y: auto; transition: all 0.3s ease; } /* 自訂滾動條 */ ::-webkit-scrollbar { width: 10px; height: 10px; } ::-webkit-scrollbar-track { background: #f1f1f1; } ::-webkit-scrollbar-thumb { background: #888; border-radius: 5px; } ::-webkit-scrollbar-thumb:hover { background: #555; } .sidebar::-webkit-scrollbar-thumb { background: #34495e; } .sidebar::-webkit-scrollbar-thumb:hover { background: #2c3e50; } /* 黑翅鳶強調色 - 紅眼與黃爪 */ .accent-red { color: #c41e3a; } .accent-yellow { color: #d4a017; } .accent-red-bg { background-color: #c41e3a; color: #ffffff; } .accent-yellow-bg { background-color: #d4a017; color: #1a1a1a; } /* 數據卡片強調 */ .stat-card-red h3 { color: #c41e3a !important; } .stat-card-yellow h3 { color: #d4a017 !important; } /* 連結懸停效果 */ a:hover { color: var(--color-red-eye); } /* 焦點狀態 */ .form-control:focus { border-color: var(--focus-color); box-shadow: var(--focus-shadow); } input[type="text"]:focus, input[type="password"]:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="tel"]:focus, input[type="date"]:focus, textarea:focus, select:focus { border-color: var(--focus-color); } /* 按鈕焦點 */ .btn:focus { box-shadow: var(--focus-shadow); } /* 選單項目啟用狀態 */ .menu-link.active { background-color: var(--color-red-eye) !important; color: var(--text-light) !important; } .submenu a.active { background-color: var(--color-red-eye) !important; color: var(--text-light) !important; } /* 分頁啟用狀態 */ .pagination .active a { background-color: var(--color-red-eye); border-color: var(--color-red-eye); } .pagination a:hover { color: var(--color-red-eye); } /* ======================================== CSS Grid 主容器佈局 ======================================== */ .grid-container { display: grid; grid-template-areas: "navbar navbar" "sidebar content"; grid-template-columns: 250px 1fr; grid-template-rows: 60px 1fr; min-height: 100vh; width: 100%; } .grid-container.sidebar-collapsed { grid-template-columns: 60px 1fr; }