/* HR Candidate Matcher — Custom Design System */ /* no-design-system */ :root { --color-bg: #F5F4EF; --color-surface: #FFFFFF; --color-text: #202922; --color-text-secondary: #59645C; --color-accent: #365F48; --color-accent-hover: #2A4D39; --color-border: #D9DFD7; --color-success: #2F7A4F; --color-warning: #A8641A; --color-error: #B23B3B; --color-error-bg: #FEF2F2; --color-success-bg: #F0FDF4; --color-warning-bg: #FFFBEB; --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-5: 24px; --space-6: 32px; --space-7: 48px; --space-8: 64px; --radius-sm: 6px; --radius-md: 8px; --radius-lg: 12px; --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; --font-mono: "SF Mono", "Cascadia Code", "Fira Code", "JetBrains Mono", Menlo, Monaco, Consolas, "Liberation Mono", monospace; --text-xs: 0.75rem; --text-sm: 0.875rem; --text-base: 1rem; --text-lg: 1.125rem; --text-xl: 1.25rem; --text-2xl: 1.5rem; --text-3xl: 2rem; --shadow-sm: 0 1px 2px rgba(0,0,0,0.05); --shadow-md: 0 4px 6px -1px rgba(0,0,0,0.07), 0 2px 4px -2px rgba(0,0,0,0.05); --transition-fast: 150ms ease; --transition-normal: 200ms ease; } *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { font-size: 16px; -webkit-text-size-adjust: 100%; } body { font-family: var(--font-sans); font-size: var(--text-base); line-height: 1.5; color: var(--color-text); background: var(--color-bg); min-height: 100vh; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } } .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; } .container { max-width: 1200px; margin: 0 auto; padding: 0 var(--space-6); } @media (max-width: 768px) { .container { padding: 0 var(--space-5); } } @media (max-width: 390px) { .container { padding: 0 var(--space-4); } } /* Header */ .app-header { background: var(--color-surface); border-bottom: 1px solid var(--color-border); position: sticky; top: 0; z-index: 100; } .app-header-inner { display: flex; align-items: center; gap: var(--space-4); height: 56px; } .app-logo { display: flex; align-items: center; gap: var(--space-2); color: var(--color-accent); font-weight: 600; font-size: var(--text-sm); white-space: nowrap; flex-shrink: 0; } .app-logo svg { flex-shrink: 0; } .app-logo-text { display: none; } @media (min-width: 768px) { .app-logo-text { display: inline; } } .app-nav { flex: 1; display: flex; justify-content: center; } .app-nav[hidden] { display: none; } #btn-clear-all { margin-left: auto; flex-shrink: 0; } #btn-clear-all[hidden] { display: none; } /* Steps indicator */ .steps { list-style: none; display: flex; gap: var(--space-2); align-items: center; } .step { display: flex; align-items: center; gap: var(--space-1); font-size: var(--text-xs); color: var(--color-text-secondary); padding: var(--space-1) var(--space-2); border-radius: var(--radius-sm); white-space: nowrap; } .step-num { display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 20px; border-radius: 50%; font-size: 11px; font-weight: 600; background: var(--color-border); color: var(--color-text-secondary); } .step-active { color: var(--color-accent); font-weight: 600; } .step-active .step-num { background: var(--color-accent); color: #fff; } .step-done .step-num { background: var(--color-success); color: #fff; } @media (max-width: 600px) { .step span:not(.step-num) { display: none; } } /* Buttons */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); font-family: inherit; font-size: var(--text-sm); font-weight: 500; line-height: 1.5; border: 1px solid transparent; border-radius: var(--radius-md); cursor: pointer; transition: all var(--transition-fast); text-decoration: none; white-space: nowrap; min-height: 44px; } .btn:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; } .btn:disabled { opacity: 0.5; cursor: not-allowed; } .btn-primary { background: var(--color-accent); color: #fff; border-color: var(--color-accent); } .btn-primary:hover:not(:disabled) { background: var(--color-accent-hover); border-color: var(--color-accent-hover); } .btn-outline { background: transparent; color: var(--color-accent); border-color: var(--color-border); } .btn-outline:hover:not(:disabled) { background: var(--color-accent); color: #fff; border-color: var(--color-accent); } .btn-ghost { background: transparent; color: var(--color-text-secondary); border-color: transparent; } .btn-ghost:hover:not(:disabled) { background: rgba(0,0,0,0.04); color: var(--color-text); } .btn-danger { background: var(--color-error); color: #fff; border-color: var(--color-error); } .btn-danger:hover:not(:disabled) { opacity: 0.9; } .btn-sm { padding: var(--space-1) var(--space-2); font-size: var(--text-xs); min-height: 36px; } .btn-lg { padding: var(--space-3) var(--space-5); font-size: var(--text-base); min-height: 48px; } .btn-back { color: var(--color-text-secondary); } /* Main Content */ .main-content { min-height: calc(100vh - 56px); } .screen[hidden] { display: none; } .screen { padding: var(--space-7) 0; animation: fadeIn var(--transition-normal) ease; } @keyframes fadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } } /* Welcome */ .welcome-hero { max-width: 640px; margin: var(--space-8) auto; text-align: center; } .welcome-title { font-size: var(--text-3xl); font-weight: 700; color: var(--color-text); margin-bottom: var(--space-4); letter-spacing: -0.02em; } @media (max-width: 768px) { .welcome-title { font-size: var(--text-2xl); } } .welcome-desc { font-size: var(--text-lg); color: var(--color-text-secondary); margin-bottom: var(--space-6); line-height: 1.6; } @media (max-width: 768px) { .welcome-desc { font-size: var(--text-base); } } .welcome-actions { display: flex; gap: var(--space-3); justify-content: center; flex-wrap: wrap; margin-bottom: var(--space-5); } .welcome-privacy { display: flex; align-items: center; justify-content: center; gap: var(--space-2); font-size: var(--text-sm); color: var(--color-text-secondary); } /* Screen Header */ .screen-header { display: flex; align-items: center; gap: var(--space-3); margin-bottom: var(--space-3); } .screen-title { font-size: var(--text-2xl); font-weight: 700; letter-spacing: -0.01em; } @media (max-width: 768px) { .screen-title { font-size: var(--text-xl); } } .screen-subtitle { color: var(--color-text-secondary); margin-bottom: var(--space-5); font-size: var(--text-sm); } /* Input Grid */ .input-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-5); } @media (max-width: 768px) { .input-grid { grid-template-columns: 1fr; } } .input-actions { margin-top: var(--space-5); display: flex; justify-content: center; } /* Fields */ .field { margin-bottom: var(--space-4); } .field-label { display: block; font-size: var(--text-sm); font-weight: 500; margin-bottom: var(--space-1); color: var(--color-text); } .field-required { color: var(--color-error); } .textarea { width: 100%; padding: var(--space-3); font-family: inherit; font-size: var(--text-sm); line-height: 1.6; border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-surface); color: var(--color-text); resize: vertical; transition: border-color var(--transition-fast); } .textarea:focus { outline: none; border-color: var(--color-accent); box-shadow: 0 0 0 3px rgba(54,95,72,0.1); } .textarea::placeholder { color: var(--color-text-secondary); opacity: 0.6; } .field-error { margin-top: var(--space-1); font-size: var(--text-xs); color: var(--color-error); } .field-error[hidden] { display: none; } .field.has-error .textarea { border-color: var(--color-error); } /* Select & Input */ .select, .input { width: 100%; padding: var(--space-2) var(--space-3); font-family: inherit; font-size: var(--text-sm); line-height: 1.5; border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-surface); color: var(--color-text); min-height: 36px; } .select:focus, .input:focus { outline: none; border-color: var(--color-accent); box-shadow: 0 0 0 3px rgba(54,95,72,0.1); } /* Criteria Table */ .criteria-table-wrap { overflow-x: auto; margin-bottom: var(--space-4); border: 1px solid var(--color-border); border-radius: var(--radius-lg); background: var(--color-surface); } .criteria-table-wrap[hidden] { display: none; } .criteria-table { width: 100%; border-collapse: collapse; font-size: var(--text-sm); } .criteria-table th { text-align: left; padding: var(--space-3) var(--space-4); font-weight: 600; font-size: var(--text-xs); text-transform: uppercase; letter-spacing: 0.05em; color: var(--color-text-secondary); border-bottom: 1px solid var(--color-border); background: var(--color-bg); white-space: nowrap; } .criteria-table td { padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--color-border); vertical-align: middle; } .criteria-table tr:last-child td { border-bottom: none; } .criteria-table .col-label { min-width: 200px; } .criteria-table .col-type { width: 140px; } .criteria-table .col-weight { width: 80px; } .criteria-table .col-synonyms { min-width: 180px; } .criteria-table .col-actions { width: 48px; text-align: center; } .criteria-empty { text-align: center; padding: var(--space-7) var(--space-4); color: var(--color-text-secondary); } .criteria-empty[hidden] { display: none; } .criteria-actions { display: flex; justify-content: space-between; align-items: center; gap: var(--space-3); flex-wrap: wrap; } /* Inline edit inputs in criteria table */ .criteria-table .input-inline { width: 100%; padding: var(--space-1) var(--space-2); font-family: inherit; font-size: var(--text-sm); border: 1px solid var(--color-border); border-radius: var(--radius-sm); background: transparent; min-height: 32px; } .criteria-table .input-inline:focus { outline: none; border-color: var(--color-accent); background: var(--color-surface); } .criteria-table .select-inline { padding: var(--space-1) var(--space-2); font-size: var(--text-sm); border: 1px solid var(--color-border); border-radius: var(--radius-sm); background: transparent; min-height: 32px; cursor: pointer; } .criteria-table .select-inline:focus { outline: none; border-color: var(--color-accent); } /* Weight display */ .weight-display { display: inline-flex; align-items: center; gap: var(--space-1); font-variant-numeric: tabular-nums; font-weight: 500; } /* Delete button in table */ .btn-icon { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; padding: 0; border: none; background: transparent; color: var(--color-text-secondary); border-radius: var(--radius-sm); cursor: pointer; transition: all var(--transition-fast); } .btn-icon:hover { background: var(--color-error-bg); color: var(--color-error); } .btn-icon:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; } /* Match Screen */ .match-filter-bar { display: flex; gap: var(--space-2); margin-bottom: var(--space-4); flex-wrap: wrap; } .chip { display: inline-flex; align-items: center; gap: var(--space-1); padding: var(--space-1) var(--space-3); font-family: inherit; font-size: var(--text-xs); font-weight: 500; border: 1px solid var(--color-border); border-radius: 20px; background: var(--color-surface); color: var(--color-text-secondary); cursor: pointer; transition: all var(--transition-fast); min-height: 32px; } .chip:hover { border-color: var(--color-accent); color: var(--color-accent); } .chip:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; } .chip-active { background: var(--color-accent); color: #fff; border-color: var(--color-accent); } .chip-active:hover { background: var(--color-accent-hover); color: #fff; } .match-table-wrap { overflow-x: auto; margin-bottom: var(--space-5); border: 1px solid var(--color-border); border-radius: var(--radius-lg); background: var(--color-surface); } .match-table { width: 100%; border-collapse: collapse; font-size: var(--text-sm); } .match-table th { text-align: left; padding: var(--space-3) var(--space-4); font-weight: 600; font-size: var(--text-xs); text-transform: uppercase; letter-spacing: 0.05em; color: var(--color-text-secondary); border-bottom: 1px solid var(--color-border); background: var(--color-bg); white-space: nowrap; } .match-table td { padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--color-border); vertical-align: top; } .match-table tr:last-child td { border-bottom: none; } .match-table .col-criterion { min-width: 160px; font-weight: 500; } .match-table .col-evidence { min-width: 280px; } .match-table .col-status { width: 140px; white-space: nowrap; } .match-table .col-note { min-width: 180px; } /* Status badges */ .status-badge { display: inline-flex; align-items: center; gap: var(--space-1); padding: var(--space-1) var(--space-2); border-radius: var(--radius-sm); font-size: var(--text-xs); font-weight: 500; } .status-confirmed { background: var(--color-success-bg); color: var(--color-success); } .status-not-found { background: #F5F0EB; color: var(--color-warning); } .status-unclear { background: #F0F4FF; color: #4A6FA5; } /* Evidence fragments */ .evidence-list { list-style: none; display: flex; flex-direction: column; gap: var(--space-2); } .evidence-fragment { font-family: var(--font-mono); font-size: var(--text-xs); line-height: 1.5; background: var(--color-bg); padding: var(--space-2) var(--space-3); border-radius: var(--radius-sm); border-left: 3px solid var(--color-border); color: var(--color-text); word-break: break-word; } .evidence-fragment mark { background: #FEF3C7; color: inherit; padding: 0 2px; border-radius: 2px; } /* Coverage bar */ .match-coverage { margin-bottom: var(--space-5); padding: var(--space-4); background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); } .coverage-label { font-size: var(--text-sm); color: var(--color-text-secondary); margin-bottom: var(--space-2); } .coverage-bar-track { width: 100%; height: 8px; background: var(--color-bg); border-radius: 4px; overflow: hidden; margin-bottom: var(--space-1); } .coverage-bar-fill { height: 100%; background: var(--color-accent); border-radius: 4px; transition: width 400ms ease; min-width: 0; } .coverage-value { font-size: var(--text-2xl); font-weight: 700; color: var(--color-accent); font-variant-numeric: tabular-nums; } .match-empty { text-align: center; padding: var(--space-7) var(--space-4); color: var(--color-text-secondary); } .match-empty[hidden] { display: none; } .match-actions { display: flex; justify-content: space-between; align-items: center; gap: var(--space-3); flex-wrap: wrap; } /* Note input in match table */ .note-input { width: 100%; padding: var(--space-1) var(--space-2); font-family: inherit; font-size: var(--text-xs); border: 1px solid transparent; border-radius: var(--radius-sm); background: transparent; color: var(--color-text-secondary); min-height: 28px; transition: all var(--transition-fast); } .note-input:hover { border-color: var(--color-border); } .note-input:focus { outline: none; border-color: var(--color-accent); background: var(--color-surface); } /* Status select in match table */ .status-select { padding: var(--space-1) var(--space-2); font-family: inherit; font-size: var(--text-xs); border: 1px solid var(--color-border); border-radius: var(--radius-sm); background: var(--color-surface); cursor: pointer; min-height: 32px; } .status-select:focus { outline: none; border-color: var(--color-accent); } /* Modal */ .modal-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.4); display: flex; align-items: center; justify-content: center; z-index: 200; padding: var(--space-4); animation: fadeIn var(--transition-fast); } .modal-overlay[hidden] { display: none; } .modal-panel { background: var(--color-surface); border-radius: var(--radius-lg); box-shadow: var(--shadow-md); max-width: 900px; width: 100%; max-height: 85vh; overflow-y: auto; padding: var(--space-5); } .modal-sm { max-width: 420px; } .modal-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--space-4); } .modal-header h3 { font-size: var(--text-lg); font-weight: 600; } .modal-body { margin-bottom: var(--space-4); } .modal-actions { display: flex; justify-content: flex-end; gap: var(--space-2); margin-top: var(--space-4); } /* Source texts modal */ .source-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-5); } @media (max-width: 768px) { .source-grid { grid-template-columns: 1fr; } } .source-col h4 { font-size: var(--text-sm); font-weight: 600; margin-bottom: var(--space-2); color: var(--color-text-secondary); } .source-text { font-family: var(--font-mono); font-size: var(--text-xs); line-height: 1.6; background: var(--color-bg); padding: var(--space-3); border-radius: var(--radius-md); border: 1px solid var(--color-border); white-space: pre-wrap; word-break: break-word; max-height: 400px; overflow-y: auto; color: var(--color-text); } /* Interview Screen */ .demo-badge { display: inline-flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-3); background: var(--color-warning-bg); color: var(--color-warning); border-radius: var(--radius-md); font-size: var(--text-xs); font-weight: 500; margin-bottom: var(--space-5); } .interview-section { margin-bottom: var(--space-5); } .interview-section-title { font-size: var(--text-base); font-weight: 600; margin-bottom: var(--space-3); display: flex; align-items: center; gap: var(--space-2); } .interview-card { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: var(--space-4); margin-bottom: var(--space-3); } .interview-card-criterion { font-size: var(--text-xs); font-weight: 600; color: var(--color-accent); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: var(--space-2); } .interview-card-status { margin-bottom: var(--space-2); } .interview-questions-list { list-style: none; display: flex; flex-direction: column; gap: var(--space-2); } .interview-question { padding: var(--space-2) var(--space-3); background: var(--color-bg); border-radius: var(--radius-sm); font-size: var(--text-sm); line-height: 1.5; display: flex; gap: var(--space-2); } .interview-question-num { color: var(--color-accent); font-weight: 600; flex-shrink: 0; } .interview-empty { text-align: center; padding: var(--space-7) var(--space-4); color: var(--color-text-secondary); } .interview-empty[hidden] { display: none; } .interview-actions { display: flex; gap: var(--space-3); flex-wrap: wrap; margin-top: var(--space-5); } /* Toast */ .toast-container { position: fixed; bottom: var(--space-5); right: var(--space-5); z-index: 300; display: flex; flex-direction: column; gap: var(--space-2); pointer-events: none; } .toast { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-3) var(--space-4); background: var(--color-text); color: #fff; border-radius: var(--radius-md); font-size: var(--text-sm); box-shadow: var(--shadow-md); pointer-events: auto; animation: toastIn 200ms ease; max-width: 360px; } .toast-success { background: var(--color-success); } .toast-error { background: var(--color-error); } @keyframes toastIn { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } } .toast-out { animation: toastOut 150ms ease forwards; } @keyframes toastOut { to { opacity: 0; transform: translateY(12px); } } /* Confirm dialog */ #modal-confirm h3 { font-size: var(--text-lg); font-weight: 600; margin-bottom: var(--space-3); } #modal-confirm p { color: var(--color-text-secondary); font-size: var(--text-sm); line-height: 1.5; } /* Tabular numbers */ .tabular { font-variant-numeric: tabular-nums; } /* Print / export helpers */ @media print { .app-header, .btn-back, .btn, .toast-container, .modal-overlay { display: none !important; } .screen { padding: 0; } .match-table-wrap, .criteria-table-wrap { border: 1px solid #ccc; } }