@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&family=Roboto+Mono:wght@400;500&display=swap'); /* ─── Reset & Base ───────────────────────────────────────────── */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } :root { --c-primary: #1565c0; --c-primary-light: #e3f2fd; --c-primary-dark: #0d47a1; --c-surface: #ffffff; --c-bg: #f0f4ff; --c-sidebar-bg: #ffffff; --c-text: #1a1a2e; --c-muted: #6b7a99; --c-border: #c5d0e8; --c-success-bg: #e8f5e9; --c-success: #2e7d32; --c-warn-bg: #fff3e0; --c-warn: #e65100; --c-info-bg: #e3f2fd; --c-info: #1565c0; --c-danger-bg: #ffebee; --c-danger: #c62828; --primary: var(--c-primary); --primary-dark: var(--c-primary-dark); --primary-light: var(--c-primary-light); --success: var(--c-success); --success-light: var(--c-success-bg); --danger: var(--c-danger); --danger-light: var(--c-danger-bg); --warning: var(--c-warn); --warning-light: var(--c-warn-bg); --gray-50: #f7f9ff; --gray-100: #eef3ff; --gray-200: #dbe5f6; --gray-300: #c5d0e8; --gray-400: #97a7c6; --gray-500: #6b7a99; --gray-600: #52627f; --gray-700: #33415c; --gray-800: #1f2a44; --gray-900: #1a1a2e; --sidebar-w: 220px; --radius: 8px; --radius-lg: 12px; --shadow: 0 4px 16px rgba(21, 101, 192, 0.05); --shadow-md: 0 10px 30px rgba(19, 45, 89, 0.08); } html, body, #root { height: 100%; font-family: 'Roboto', system-ui, -apple-system, sans-serif; font-size: 13px; color: var(--c-text); background: var(--c-bg); line-height: 1.45; } body { overflow-x: hidden; overflow-y: auto; } a { color: inherit; } button, input, textarea, select { font: inherit; } /* ─── Layout ─────────────────────────────────────────────────── */ .app-layout { display: flex; min-height: 100vh; background: var(--c-bg); overflow: visible; } .mobile-topbar, .mobile-sidebar-backdrop, .mobile-sidebar-close { display: none; } .sidebar { width: var(--sidebar-w); flex-shrink: 0; background: var(--c-sidebar-bg); border-right: 0.5px solid var(--c-border); display: flex; flex-direction: column; position: sticky; top: 0; height: 100vh; color: var(--c-text); } .sidebar-brand { padding: 18px 16px 14px; display: flex; align-items: center; gap: 10px; border-bottom: 0.5px solid var(--c-border); } .sidebar-brand-mark { width: 32px; height: 32px; border-radius: 8px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .sidebar-brand-mark img { width: 32px; height: 32px; border-radius: 8px; object-fit: contain; } .sidebar-brand-copy { display: flex; flex-direction: column; min-width: 0; } .sidebar-brand-copy span { font-size: 14px; font-weight: 500; color: var(--c-text); } .sidebar-brand-copy small { font-size: 10px; color: var(--c-muted); } .sidebar-nav { flex: 1; padding: 12px 8px 4px; display: flex; flex-direction: column; gap: 12px; } .sidebar-group { display: flex; flex-direction: column; gap: 2px; } .nav-group-label { font-size: 10px; font-weight: 500; color: var(--c-muted); padding: 0 8px; margin-bottom: 4px; text-transform: uppercase; letter-spacing: .5px; } .nav-item { display: flex; align-items: center; gap: 8px; padding: 7px 8px; border-radius: 8px; cursor: pointer; color: var(--c-muted); text-decoration: none; margin-bottom: 1px; transition: background .15s ease, color .15s ease; } .nav-item span { font-size: 12px; } .nav-item:hover:not(.active) { background: var(--gray-50); color: var(--c-text); } .nav-item.active { background: var(--c-info-bg); color: var(--c-primary); } .nav-item.active span { font-weight: 500; } .nav-item--static { opacity: 0.8; } .sidebar-group--disabled .nav-item { cursor: default; } .sidebar-footer { margin-top: auto; padding: 12px 8px; border-top: 0.5px solid var(--c-border); display: flex; align-items: center; gap: 8px; } .user-info-button { flex: 1; min-width: 0; border: none; background: none; padding: 6px 8px; border-radius: 8px; cursor: pointer; display: flex; align-items: center; gap: 8px; color: inherit; text-align: left; } .user-info-button:hover { background: var(--gray-50); } .user-info { flex: 1; min-width: 0; display: flex; align-items: center; gap: 8px; } .user-avatar { width: 28px; height: 28px; border-radius: 50%; background: var(--c-primary); color: #fff; display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 500; flex-shrink: 0; } .user-details { min-width: 0; } .user-name { display: block; font-size: 12px; font-weight: 500; color: var(--c-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .user-email { display: block; font-size: 10px; color: var(--c-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .btn-logout { width: 30px; height: 30px; border: none; border-radius: 8px; background: none; color: var(--c-muted); display: inline-flex; align-items: center; justify-content: center; cursor: pointer; } .btn-logout:hover { background: var(--gray-50); color: var(--c-primary); } .main-content { flex: 1; min-width: 0; overflow: visible; background: var(--c-bg); } .topbar { background: var(--c-surface); border-bottom: 0.5px solid var(--c-border); padding: 0 24px; height: 52px; display: flex; align-items: center; gap: 12px; position: sticky; top: 0; z-index: 20; } .topbar-title { flex: 1; font-size: 15px; font-weight: 500; color: var(--c-text); } .topbar-brand-logo { display: flex; align-items: center; justify-content: flex-end; gap: 6px; min-width: 0; flex-shrink: 0; } .topbar-brand-by { font-size: 11px; line-height: 1; font-weight: 500; color: var(--c-muted); text-transform: lowercase; } .topbar-brand-logo img { display: block; height: 24px; width: auto; max-width: 180px; object-fit: contain; } /* ─── Page ───────────────────────────────────────────────────── */ .page { padding: 20px 24px; max-width: 1380px; min-height: calc(100vh - 52px); } .page-header { display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 24px; gap: 16px; } .page-header h2 { font-size: 20px; font-weight: 500; color: var(--c-text); } .page-header p { font-size: 12px; color: var(--c-muted); margin-top: 2px; } .header-actions { display: flex; align-items: center; gap: 8px; } /* ─── Auth ───────────────────────────────────────────────────── */ .auth-page { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%); padding: 20px; } .auth-card { background: #fff; border-radius: 12px; padding: 36px 40px; width: 100%; max-width: 420px; box-shadow: var(--shadow-md); } .auth-logo { text-align: center; margin-bottom: 28px; color: var(--primary); } .auth-logo h1 { font-size: 24px; font-weight: 800; color: var(--gray-900); margin-top: 8px; } .auth-logo p { font-size: 13px; color: var(--gray-500); margin-top: 4px; } .auth-form { display: flex; flex-direction: column; gap: 16px; } .auth-link { text-align: center; margin-top: 20px; font-size: 13px; color: var(--gray-500); } .auth-link a { color: var(--primary); font-weight: 600; text-decoration: none; } .auth-link a:hover { text-decoration: underline; } .auth-version { text-align: center; margin-top: 10px; font-size: 12px; color: var(--gray-400); } .auth-download-btn { justify-content: center; } /* ─── Form fields ────────────────────────────────────────────── */ .field { display: flex; flex-direction: column; gap: 5px; } .field label { font-size: 12.5px; font-weight: 600; color: var(--gray-700); display: flex; align-items: center; gap: 4px; } .field input, .field select, .field textarea { padding: 9px 12px; border: 1px solid var(--gray-300); border-radius: 6px; font-size: 13.5px; transition: border-color .15s, box-shadow .15s; outline: none; background: #fff; } .field input:focus, .field select:focus, .field textarea:focus { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(79,70,229,.1); } .field-hint { font-size: 11.5px; color: var(--gray-400); margin-top: 2px; } .password-rules { display: flex; flex-direction: column; gap: 4px; margin-top: 4px; } .password-rule { display: flex; align-items: center; gap: 6px; font-size: 11.5px; } .password-rule--ok { color: var(--success); } .password-rule--pending { color: var(--gray-500); } .legal-register-box { border: 1px solid var(--gray-300); border-radius: 12px; padding: 14px; background: #f8fbff; display: grid; gap: 12px; } .legal-register-header { display: flex; gap: 10px; align-items: flex-start; color: var(--c-text); } .legal-register-header p { margin-top: 3px; color: var(--c-muted); font-size: 12px; } .legal-register-list { display: grid; gap: 8px; } .legal-template-row { border: 1px solid var(--gray-300); border-radius: 10px; padding: 12px 14px; background: #fff; } .legal-template-stack { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; } .legal-template-button { border: none; border-radius: 0; padding: 0; background: transparent; color: var(--c-text); display: flex; align-items: flex-start; gap: 8px; cursor: pointer; text-align: left; } .legal-template-button svg { flex: 0 0 15px; width: 15px; height: 15px; margin-top: 2px; } .legal-template-button:hover { color: var(--primary); } .legal-template-button span { font-weight: 600; text-decoration: underline; text-underline-offset: 2px; } .legal-template-version { display: inline-flex; align-items: center; gap: 5px; color: var(--c-muted); font-weight: 500; font-size: 12px; } .legal-template-version svg { flex: 0 0 12px; width: 12px; height: 12px; } .legal-template-check { display: flex; align-items: center; gap: 8px; color: var(--c-text); font-size: 12px; white-space: nowrap; } .legal-template-check input { accent-color: var(--primary); flex: 0 0 15px; width: 15px; height: 15px; opacity: 1; } .legal-template-check.is-disabled { opacity: 1; cursor: not-allowed; } .legal-template-check span { color: var(--c-text); } .legal-template-check.is-disabled span { color: var(--c-text); } .legal-register-status { display: flex; align-items: center; gap: 8px; color: var(--c-muted); font-size: 12px; } .btn[disabled] { opacity: 0.55; cursor: not-allowed; } .legal-register-status.is-complete { color: var(--success); } .legal-document-modal { background: #fff; border-radius: 12px; width: min(840px, 95vw); max-height: 92vh; display: flex; flex-direction: column; box-shadow: 0 24px 80px rgba(0, 0, 0, 0.35); overflow: hidden; } .legal-document-body { flex: 1; overflow-y: auto; display: flex; justify-content: center; padding: 16px; background: var(--gray-100); } .legal-document-meta { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; font-size: 11px; color: var(--gray-500); } .legal-document-summary { margin-bottom: 16px; color: var(--gray-700); font-size: 13px; line-height: 1.6; } .legal-document-footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 16px; border-top: 1px solid var(--gray-200); background: var(--gray-50); } .audit-toolbar, .audit-pagination { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 16px; } .audit-toolbar-group { display: flex; align-items: center; gap: 8px; color: var(--gray-700); } .audit-toolbar-group select { border: 1px solid var(--gray-300); border-radius: 8px; background: #fff; padding: 6px 10px; } .documents-page-size { display: inline-flex; align-items: center; gap: 8px; color: var(--gray-700); font-size: 12px; } .documents-page-size select { border: 1px solid var(--gray-300); border-radius: 8px; background: #fff; padding: 6px 10px; } .audit-table-header, .audit-table-row { grid-template-columns: minmax(220px, 1.2fr) 180px 120px minmax(260px, 1.5fr); } .audit-event-cell { display: flex; align-items: center; gap: 10px; min-width: 0; } .audit-event-icon { width: 28px; height: 28px; border-radius: 8px; background: var(--c-info-bg); color: var(--c-primary); display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; } .audit-event-icon.is-error { background: var(--c-danger-bg); color: var(--c-danger); } .audit-detail-cell { color: var(--gray-600); line-height: 1.5; } /* ─── Buttons ────────────────────────────────────────────────── */ .btn { display: inline-flex; align-items: center; gap: 6px; padding: 7px 14px; border-radius: 8px; font-size: 12px; font-weight: 500; border: none; cursor: pointer; transition: opacity .15s, transform .1s; text-decoration: none; } .btn:active { transform: scale(.98); } .btn:disabled { opacity: .6; cursor: not-allowed; } .btn-primary { background: var(--primary); color: #fff; } .btn-primary:hover:not(:disabled) { background: var(--primary-dark); } .btn-secondary { background: var(--gray-50); color: var(--c-muted); border: 0.5px solid var(--c-border); } .btn-secondary:hover:not(:disabled) { background: var(--gray-100); color: var(--c-text); } .btn-ghost { background: transparent; color: var(--c-muted); border: 0.5px solid var(--c-border); } .btn-ghost:hover:not(:disabled) { background: var(--gray-50); color: var(--c-primary); } .btn-full { width: 100%; justify-content: center; } .btn-icon { background: none; border: 0.5px solid var(--c-border); cursor: pointer; width: 28px; height: 28px; border-radius: 8px; color: var(--c-muted); display: inline-flex; align-items: center; justify-content: center; transition: background .15s, color .15s; } .btn-icon:hover { background: var(--gray-50); color: var(--c-primary); } .btn-icon.danger:hover { background: var(--danger-light); color: var(--danger); } /* ─── Dashboard stats ────────────────────────────────────────── */ .stats-grid, .stats-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-bottom: 20px; } .stat-card { background: var(--c-surface); border: 0.5px solid var(--c-border); border-radius: 12px; padding: 14px 16px; cursor: pointer; transition: box-shadow .15s ease, transform .15s ease; } .stat-card:hover { box-shadow: var(--shadow); transform: translateY(-1px); } .stat-label { font-size: 11px; color: var(--c-muted); margin-bottom: 6px; font-weight: 400; } .stat-value, .stat-val { font-size: 22px; font-weight: 500; color: var(--c-text); margin-bottom: 4px; } .stat-badge { display: inline-flex; align-items: center; gap: 3px; font-size: 10px; padding: 2px 7px; border-radius: 20px; } .badge-green { background: var(--c-success-bg); color: var(--c-success); } .badge-orange { background: var(--c-warn-bg); color: var(--c-warn); } .badge-blue { background: var(--c-info-bg); color: var(--c-info); } .quick-actions h3 { font-size: 13px; font-weight: 500; margin-bottom: 12px; color: var(--c-text); } .actions-row { display: flex; gap: 10px; flex-wrap: wrap; } /* ─── Table ──────────────────────────────────────────────────── */ .two-col { display: grid; grid-template-columns: 1fr 360px; gap: 16px; } .right-panel { display: flex; flex-direction: column; gap: 16px; } .panel, .table-wrapper { background: var(--c-surface); border: 0.5px solid var(--c-border); border-radius: 12px; overflow: hidden; } .panel-header { padding: 12px 16px; border-bottom: 0.5px solid var(--c-border); display: flex; align-items: center; justify-content: space-between; gap: 12px; } .panel-title { font-size: 13px; font-weight: 500; color: var(--c-text); } .panel-action { font-size: 11px; color: var(--c-primary); cursor: pointer; } .data-table { width: 100%; border-collapse: collapse; min-width: 720px; } .data-table th { background: var(--gray-50); border-bottom: 0.5px solid var(--c-border); padding: 8px 16px; text-align: left; font-size: 10px; font-weight: 500; text-transform: uppercase; letter-spacing: .04em; color: var(--c-muted); } .data-table td { padding: 10px 16px; border-bottom: 0.5px solid var(--c-border); font-size: 11px; } .data-table tr:last-child td { border-bottom: none; } .data-table tr:hover td { background: var(--gray-50); } .table-header { display: grid; grid-template-columns: 1fr 90px 80px 80px 44px; gap: 8px; padding: 8px 16px; background: var(--gray-50); border-bottom: 0.5px solid var(--c-border); } .th { font-size: 10px; font-weight: 500; color: var(--c-muted); text-transform: uppercase; letter-spacing: .4px; } .table-row { display: grid; grid-template-columns: 1fr 90px 80px 80px 44px; gap: 8px; padding: 10px 16px; border-bottom: 0.5px solid var(--c-border); align-items: center; } .table-row:last-child { border-bottom: none; } .table-row:hover { background: var(--gray-50); } .doc-name, .doc-cell { display: flex; align-items: center; gap: 8px; min-width: 0; } .doc-thumb { width: 28px; height: 34px; border-radius: 4px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .doc-n { font-size: 12px; font-weight: 500; color: var(--c-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .doc-m, .td { font-size: 10px; color: var(--c-muted); } .actions-cell { display: flex; align-items: center; gap: 4px; } .action-ico { width: 28px; height: 28px; border-radius: 8px; border: 0.5px solid var(--c-border); display: inline-flex; align-items: center; justify-content: center; cursor: pointer; color: var(--c-muted); background: transparent; } .action-ico:hover { background: var(--gray-50); color: var(--c-primary); } /* ─── Badges ─────────────────────────────────────────────────── */ .badge { display: inline-block; padding: 2px 8px; border-radius: 12px; font-size: 11px; font-weight: 600; } .badge-pending { background: var(--warning-light); color: var(--warning); } .badge-signed { background: var(--success-light); color: var(--success); } .badge-partial { background: var(--primary-light); color: var(--primary); } .badge-rejected { background: var(--danger-light); color: var(--danger); } .status-pill { display: inline-flex; align-items: center; gap: 4px; padding: 3px 8px; border-radius: 20px; font-size: 10px; font-weight: 500; white-space: nowrap; } .pill-pending { background: var(--c-warn-bg); color: var(--c-warn); } .pill-signed { background: var(--c-success-bg); color: var(--c-success); } .pill-review { background: var(--c-info-bg); color: var(--c-info); } .dot { width: 5px; height: 5px; border-radius: 50%; flex-shrink: 0; background: currentColor; } /* ─── Certificates ───────────────────────────────────────────── */ .certs-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 14px; } .legal-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 14px; } .cert-card { background: #fff; border: 1px solid var(--gray-200); border-radius: 10px; padding: 16px; } .cert-card.inactive { opacity: .6; } .cert-header { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; color: var(--primary); font-weight: 600; } .cert-alias { flex: 1; font-size: 14px; } .cert-details { font-size: 12.5px; color: var(--gray-600); display: flex; flex-direction: column; gap: 3px; } .cert-actions { margin-top: 10px; display: flex; justify-content: flex-end; } .cert-warning { display: flex; align-items: center; gap: 5px; font-size: 11.5px; color: var(--danger); background: var(--danger-light); border-radius: 5px; padding: 5px 8px; margin-top: 8px; } .cert-footer { display: flex; align-items: center; justify-content: space-between; margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--gray-100); } .cert-password-note { display: flex; align-items: center; gap: 4px; font-size: 11px; color: var(--gray-400); } .form-card { background: #fff; border: 0.5px solid var(--c-border); border-radius: 12px; padding: 20px 24px; margin-bottom: 20px; } .form-card h3 { font-size: 14px; font-weight: 500; margin-bottom: 16px; color: var(--c-text); } .form-card form { display: flex; flex-direction: column; gap: 14px; } .legal-summary-card { display: flex; align-items: flex-start; gap: 12px; margin-bottom: 16px; } .legal-summary-icon { width: 40px; height: 40px; border-radius: 999px; display: inline-flex; align-items: center; justify-content: center; background: var(--c-info-bg); color: var(--c-primary); flex-shrink: 0; } .legal-card { min-height: 100%; } .legal-footer { gap: 8px; } .form-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 8px; } /* ─── Sign page ──────────────────────────────────────────────── */ .sign-layout { display: grid; grid-template-columns: 1fr 340px; gap: 16px; align-items: start; } .sign-form-card { background: #fff; border: 0.5px solid var(--c-border); border-radius: 12px; padding: 24px; } .sign-form-card form { display: flex; flex-direction: column; gap: 14px; } .sign-info-panel { display: flex; flex-direction: column; gap: 14px; } .result-card { background: var(--success-light); border: 0.5px solid #86efac; border-radius: 12px; padding: 20px; text-align: center; color: var(--success); } .result-card h3 { margin: 8px 0 4px; font-size: 16px; } .result-card code { font-size: 11px; word-break: break-all; display: block; margin-top: 8px; } .sigs-list { background: #fff; border: 0.5px solid var(--c-border); border-radius: 12px; padding: 16px; } .sigs-list h3 { font-size: 13px; font-weight: 500; margin-bottom: 10px; color: var(--c-text); } .sig-item { display: flex; align-items: flex-start; gap: 10px; padding: 6px 0; } .sig-icon { color: var(--success); margin-top: 2px; flex-shrink: 0; } .sig-item strong { font-size: 13px; } .sig-item p { font-size: 12px; color: var(--gray-500); } .sig-item small { font-size: 11px; color: var(--gray-400); } .info-box { background: var(--primary-light); border: 0.5px solid var(--c-border); border-radius: 12px; padding: 16px; color: var(--primary-dark); } .info-box h4 { font-size: 13px; font-weight: 500; margin-bottom: 8px; } .info-box ol { padding-left: 16px; font-size: 12.5px; display: flex; flex-direction: column; gap: 4px; } /* ─── States ─────────────────────────────────────────────────── */ .empty-state { display: flex; flex-direction: column; align-items: center; gap: 12px; padding: 60px 20px; color: var(--gray-400); text-align: center; } .loading-area { display: flex; justify-content: center; padding: 60px; } .loading-screen { display: flex; align-items: center; justify-content: center; height: 100vh; background: var(--gray-50); } .spinner { width: 32px; height: 32px; border: 3px solid var(--gray-200); border-top-color: var(--primary); border-radius: 50%; animation: spin .7s linear infinite; } .spin-soft { animation: spin .9s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* ─── Steps ──────────────────────────────────────────────────── */ .steps-bar, .step-bar { display: flex; align-items: center; margin-bottom: 20px; flex-wrap: wrap; gap: 4px; } .step { display: flex; align-items: center; gap: 6px; flex: initial; } .step::after { display: none; } .step-num, .step-dot { width: 22px; height: 22px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 500; flex-shrink: 0; } .step-num.done, .step-dot.done { background: var(--c-success-bg); color: var(--c-success); } .step-num.active, .step-dot.active { background: var(--c-primary); color: #fff; } .step-num.todo, .step-dot { background: var(--gray-50); color: var(--c-muted); border: 0.5px solid var(--c-border); } .step-label { font-size: 11px; } .step-label.done-label { color: var(--c-success); } .step-label.active-label { color: var(--c-text); font-weight: 500; } .step-label.todo-label { color: var(--c-muted); } .step-line { flex: 1; min-width: 20px; height: 0.5px; background: var(--c-border); margin: 0 8px; } .step-line.done-line { background: var(--c-success); } .step-nav { display: flex; align-items: center; gap: 16px; margin-bottom: 16px; } .step-desc { font-size: 13px; color: var(--gray-600); } .verify-page { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 24px; background: linear-gradient(180deg, #f4f7fb 0%, #eef3ff 100%); } .verify-card { width: min(760px, 100%); background: #fff; border: 1px solid var(--gray-200); border-radius: 18px; padding: 28px; box-shadow: 0 20px 60px rgba(15, 23, 42, 0.08); display: flex; flex-direction: column; gap: 20px; } .verify-status { display: flex; align-items: flex-start; gap: 14px; border-radius: 14px; padding: 18px; } .verify-status h1 { margin: 0 0 6px; font-size: 24px; } .verify-status p { margin: 0; color: var(--gray-600); } .verify-status--valid { background: #ecfdf3; color: #166534; } .verify-status--invalid { background: #fef2f2; color: #b91c1c; } .verify-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; } .verify-item { display: flex; gap: 10px; align-items: flex-start; background: var(--gray-50); border-radius: 12px; padding: 14px; } .verify-item strong, .verify-details strong { color: var(--gray-900); } .verify-item span, .verify-details p { color: var(--gray-600); } .verify-item div { display: flex; flex-direction: column; gap: 4px; } .verify-details { border-top: 1px solid var(--gray-200); padding-top: 16px; display: flex; flex-direction: column; gap: 8px; } .documents-sections { display: flex; flex-direction: column; gap: 24px; } .documents-section { display: flex; flex-direction: column; gap: 12px; } .section-header { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; } .section-header h3 { margin: 0; font-size: 18px; color: var(--gray-900); } .section-header p { margin: 0; font-size: 13px; color: var(--gray-500); } .empty-state.compact { min-height: 180px; } .sig-tabs { display: flex; gap: 6px; } .sig-tab { font-size: 10px; padding: 3px 8px; border-radius: 20px; cursor: default; } .sig-tab.active { background: var(--c-info-bg); color: var(--c-primary); font-weight: 500; } .sig-tab:not(.active) { background: var(--gray-50); color: var(--c-muted); } .toolbar { display: flex; align-items: center; gap: 8px; padding: 8px 16px; border-bottom: 0.5px solid var(--c-border); flex-wrap: wrap; } .tool-btn { width: 28px; height: 28px; border-radius: 8px; border: 0.5px solid var(--c-border); display: flex; align-items: center; justify-content: center; cursor: pointer; background: var(--c-surface); color: var(--c-muted); } .tool-btn.active-tool { border-color: var(--c-primary); background: var(--c-info-bg); color: var(--c-primary); } .tool-sep { width: 0.5px; height: 18px; background: var(--c-border); margin: 0 2px; } .color-swatch { width: 14px; height: 14px; border-radius: 50%; cursor: pointer; border: 1.5px solid transparent; } .color-swatch.selected { border-color: var(--c-primary); } .tool-size-group { display: flex; align-items: center; gap: 4px; } .tool-size { width: 22px; border-radius: 999px; background: var(--c-border); } .tool-size--sm { height: 2px; } .tool-size--md { height: 4px; background: var(--c-primary-dark); } .tool-size--lg { height: 6px; } .panel-body { padding: 12px 16px; } .panel-empty { padding: 20px 16px; display: flex; flex-direction: column; align-items: center; gap: 8px; color: var(--c-muted); } .cert-v--success { color: var(--c-success); } /* ─── PDF Placer ─────────────────────────────────────────────── */ .pdf-placer { display: flex; flex-direction: column; gap: 12px; } .pdf-placer-toolbar { display: flex; align-items: center; justify-content: space-between; background: var(--gray-800); color: #fff; padding: 8px 14px; border-radius: 8px 8px 0 0; font-size: 13px; } .pdf-placer-hint { color: var(--gray-300); } .pdf-placer-pages { display: flex; align-items: center; gap: 8px; } .pdf-placer-pages .btn { color: #fff; border-color: rgba(255,255,255,.2); padding: 4px 10px; } .pdf-placer-stage { width: 100%; } .pdf-placer-canvas { border: 2px dashed var(--primary); border-radius: 0 0 8px 8px; overflow: hidden; user-select: none; } .pdf-placer-canvas .react-pdf__Page { display: block; } .pdf-placer-actions { display: flex; justify-content: flex-end; gap: 8px; } /* Signature preview box overlaid on PDF */ .sig-preview-box { position: absolute; background: rgba(235, 237, 255, 0.92); border: 1.5px solid var(--primary); border-radius: 4px; overflow: hidden; pointer-events: none; box-shadow: 0 2px 8px rgba(79,70,229,.25); } .sig-preview-box--professional { background: rgba(247, 248, 252, 0.96); border-color: #1f2937; } .sig-preview-box--qr { background: transparent; border-color: transparent; box-shadow: none; } .sig-preview-box--qr[data-background='soft'] { background: rgba(242, 244, 255, 0.96); } .sig-preview-box--qr[data-border='line'] { border-color: var(--primary); box-shadow: 0 2px 8px rgba(79,70,229,.18); } .sig-preview-box--image { background: rgba(255, 255, 255, 0.96); border-color: #23915a; } .sig-preview-bar { position: absolute; left: 0; top: 0; bottom: 0; width: 4px; background: var(--primary); } .sig-preview-body { display: flex; align-items: center; gap: 6px; padding: 6px 8px 6px 12px; height: 100%; } .sig-preview-body--qr { padding: 6px 6px; } .sig-preview-body--professional { display: flex; flex-direction: column; align-items: stretch; gap: 0; padding: 0; } .sig-preview-body--image { padding: 6px 8px; } .sig-preview-badge { font-size: 9px; font-weight: 800; color: var(--primary); background: var(--primary-light); border-radius: 3px; padding: 2px 4px; flex-shrink: 0; } .sig-preview-text { display: flex; flex-direction: column; overflow: hidden; } .sig-preview-text strong { font-size: 10px; color: var(--gray-800); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .sig-preview-text small { font-size: 8px; color: var(--gray-500); } .sig-preview-body--qr .sig-preview-text strong { font-weight: 500; } .sig-preview-qr-box { width: 44px; height: 44px; border: 1px solid transparent; background: transparent; border-radius: 4px; display: flex; flex-direction: column; align-items: center; justify-content: center; flex-shrink: 0; } .sig-preview-qr-box[data-background='soft'] { background: #fff; } .sig-preview-qr-box[data-border='line'] { border-color: var(--primary); } .sig-preview-qr-pattern { width: 26px; height: 26px; background: linear-gradient(90deg, #1f1b6e 12%, transparent 12%, transparent 24%, #1f1b6e 24%, #1f1b6e 36%, transparent 36%, transparent 48%, #1f1b6e 48%, #1f1b6e 60%, transparent 60%, transparent 72%, #1f1b6e 72%, #1f1b6e 84%, transparent 84%), linear-gradient(#1f1b6e 12%, transparent 12%, transparent 24%, #1f1b6e 24%, #1f1b6e 36%, transparent 36%, transparent 48%, #1f1b6e 48%, #1f1b6e 60%, transparent 60%, transparent 72%, #1f1b6e 72%, #1f1b6e 84%, transparent 84%); } .sig-preview-qr-box span { font-size: 7px; color: var(--gray-500); margin-top: 2px; } .sig-preview-pro-header { background: #1f2937; color: #fff; font-size: 8px; font-weight: 700; letter-spacing: .04em; padding: 5px 8px; } .sig-preview-pro-content { display: flex; flex-direction: column; gap: 4px; padding: 6px 8px; } .sig-preview-pro-content strong { font-size: 10px; color: var(--gray-800); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .sig-preview-pro-content small { font-size: 8px; color: var(--gray-500); } .sig-preview-image-area { width: 78px; height: 100%; min-height: 44px; border-right: 1px solid rgba(35, 145, 90, 0.2); display: flex; align-items: center; justify-content: center; padding-right: 8px; flex-shrink: 0; } .sig-preview-image { max-width: 100%; max-height: 100%; object-fit: contain; } .sig-preview-image-placeholder { font-size: 9px; color: var(--gray-400); } /* Signature style picker */ .field-label-standalone { display: block; margin-bottom: 10px; font-size: 13px; font-weight: 600; color: var(--gray-700); } .style-picker { display: flex; flex-direction: column; gap: 12px; } .style-card-inline-tools { display: flex; justify-content: flex-end; flex-wrap: wrap; gap: 8px; } .style-inline-group { display: flex; gap: 8px; } .style-icon-toggle { width: 34px; height: 34px; border-radius: 10px; border: 1px solid var(--gray-200); background: #fff; color: var(--gray-600); display: grid; place-items: center; } .style-icon-toggle--active { border-color: var(--primary); color: var(--primary); background: rgba(79, 70, 229, 0.08); box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.08); } .style-picker-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; } .style-card { background: #fff; border: 1px solid var(--gray-200); border-radius: 12px; padding: 12px; text-align: left; display: flex; flex-direction: column; gap: 10px; transition: border-color .2s ease, box-shadow .2s ease, transform .2s ease; } .style-card:hover { border-color: rgba(79, 70, 229, 0.35); box-shadow: 0 10px 24px rgba(15, 23, 42, 0.08); transform: translateY(-1px); } .style-card--active { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.12); } .style-card-header { display: flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 700; color: var(--gray-800); } .style-card-check { margin-left: auto; width: 20px; height: 20px; border-radius: 999px; background: var(--primary); color: #fff; display: grid; place-items: center; font-size: 12px; } .style-card-preview { border: 1px solid var(--gray-200); border-radius: 10px; background: linear-gradient(180deg, #f8faff 0%, #f2f4fb 100%); padding: 10px; } .style-card-desc { font-size: 12px; color: var(--gray-500); margin: 0; } .sig-preview { width: 100%; min-height: 86px; border-radius: 8px; overflow: hidden; position: relative; } .sig-preview .sp-info { display: flex; flex-direction: column; overflow: hidden; flex: 1; min-width: 0; } .sig-preview .sp-info strong, .sig-preview .sp-pro-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .sig-preview .sp-info--qr strong { white-space: normal; line-height: 1.1; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } .sig-preview .sp-info span, .sig-preview .sp-pro-fields span, .sig-preview .sp-pro-fields b, .sig-preview .sp-qr-hint, .sig-preview .sp-img-placeholder { font-size: 10px; } .sig-preview--classic { background: rgba(235, 237, 255, 0.92); border: 1px solid rgba(79, 70, 229, 0.25); } .sig-preview--classic .sp-bar { position: absolute; inset: 0 auto 0 0; width: 5px; background: var(--primary); } .sig-preview--classic .sp-body { height: 100%; display: flex; align-items: center; gap: 8px; padding: 10px 10px 10px 16px; } .sig-preview--classic .sp-badge { font-size: 10px; font-weight: 800; color: var(--primary); background: rgba(99, 102, 241, 0.16); border-radius: 4px; padding: 4px 6px; flex-shrink: 0; } .sig-preview--classic .sp-watermark { position: absolute; right: 8px; bottom: 6px; font-size: 9px; color: var(--gray-400); } .sig-preview--qr { display: flex; align-items: stretch; gap: 10px; background: transparent; border: 1px solid transparent; padding: 10px; } .sig-preview--qr[data-background='soft'] { background: #eef2ff; } .sig-preview--qr[data-border='line'] { border-color: rgba(79, 70, 229, 0.25); } .sp-qr-box { width: 56px; min-width: 56px; border-radius: 8px; background: transparent; border: 1px solid transparent; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 4px; } .sp-qr-box[data-background='soft'] { background: #fff; } .sp-qr-box[data-border='line'] { border-color: rgba(31, 27, 110, 0.2); } .sp-qr-svg { width: 36px; height: 36px; } .sp-qr-hint { color: var(--gray-500); } .sp-divider-v { width: 1px; background: rgba(79, 70, 229, 0.18); } .sig-preview--professional { background: #f8fafc; border: 1px solid rgba(31, 41, 55, 0.15); } .sp-pro-header { background: #1f2937; color: #fff; font-size: 10px; font-weight: 700; display: flex; justify-content: space-between; gap: 8px; padding: 8px 10px; } .sp-pro-header span { color: rgba(255,255,255,0.7); font-size: 9px; font-weight: 500; } .sp-pro-name { padding: 10px 10px 6px; font-size: 13px; font-weight: 700; color: var(--gray-800); } .sp-pro-line { height: 1px; background: rgba(148, 163, 184, 0.4); margin: 0 10px; } .sp-pro-fields { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; padding: 8px 10px 10px; } .sp-pro-fields div { display: flex; flex-direction: column; gap: 2px; } .sig-preview--image { display: flex; align-items: stretch; gap: 10px; background: #fff; border: 1px solid rgba(35, 145, 90, 0.2); padding: 10px; } .sp-img-bar { width: 5px; border-radius: 999px; background: #23915a; } .sp-img-area { flex: 0 0 88px; min-height: 58px; display: flex; align-items: center; justify-content: center; } .sp-sig-img { max-width: 100%; max-height: 52px; object-fit: contain; } .sp-img-placeholder { color: var(--gray-400); } .image-upload-area { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; } /* ─── Sign confirm ───────────────────────────────────────────── */ .sign-confirm-card { background: #fff; border: 0.5px solid var(--c-border); border-radius: 12px; padding: 28px; max-width: 520px; display: flex; flex-direction: column; gap: 20px; } .sign-confirm-header { display: flex; align-items: center; gap: 10px; font-size: 15px; font-weight: 700; color: var(--gray-900); } .sign-confirm-details { display: flex; flex-direction: column; gap: 6px; font-size: 13px; color: var(--gray-600); background: var(--gray-50); border-radius: 8px; padding: 14px; } .sign-confirm-details strong { color: var(--gray-800); } .sign-confirm-actions { display: flex; gap: 10px; justify-content: flex-end; } /* ─── Modal ──────────────────────────────────────────────────── */ .modal-overlay { position: fixed; inset: 0; background: rgba(0,0,0,.45); display: flex; align-items: center; justify-content: center; z-index: 1000; padding: 20px; } .modal-card { background: #fff; border-radius: 12px; padding: 24px; width: 100%; max-width: 400px; box-shadow: 0 20px 60px rgba(0,0,0,.2); display: flex; flex-direction: column; gap: 14px; } .modal-header { display: flex; align-items: center; justify-content: space-between; } .modal-title { display: flex; align-items: center; gap: 8px; font-size: 15px; font-weight: 700; color: var(--gray-900); } .modal-desc { font-size: 13px; color: var(--gray-500); line-height: 1.5; } .modal-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 4px; } /* ─── PDF Viewer Modal ───────────────────────────────────────── */ .pdf-viewer-modal { background: #fff; border-radius: 12px; width: min(900px, 95vw); max-height: 92vh; display: flex; flex-direction: column; box-shadow: 0 24px 80px rgba(0,0,0,.35); overflow: hidden; } .pdf-viewer-header { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; border-bottom: 1px solid var(--gray-200); background: var(--gray-50); flex-shrink: 0; } .pdf-viewer-title { display: flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 600; color: var(--gray-800); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .pdf-viewer-controls { display: flex; align-items: center; gap: 8px; flex-shrink: 0; font-size: 13px; color: var(--gray-600); } .pdf-viewer-body { flex: 1; overflow-y: auto; display: flex; justify-content: center; padding: 16px; background: var(--gray-100); } .pdf-viewer-body .react-pdf__Page { box-shadow: 0 4px 20px rgba(0,0,0,.15); } .guest-invitation-page { padding: 32px 16px; } .guest-invitation-card { width: min(1100px, 100%); max-width: 1100px; } .guest-invitation-header { display: flex; justify-content: space-between; gap: 16px; align-items: flex-start; margin-bottom: 18px; } .guest-invitation-header h1 { margin: 0 0 8px; font-size: 28px; } .guest-invitation-header p { margin: 0; color: var(--gray-500); } .guest-invitation-order { display: inline-flex; align-items: center; padding: 8px 12px; border-radius: 999px; background: var(--c-info-bg); color: var(--c-primary); font-size: 13px; font-weight: 600; } .invitation-terms-modal { max-width: 520px; } .invitation-info-card, .invitation-owner-card, .invitation-completed-card { gap: 12px; } .invitation-info-line { display: flex; align-items: flex-start; gap: 10px; color: var(--gray-700); font-size: 14px; line-height: 1.5; } .invitation-info-line svg { flex-shrink: 0; margin-top: 2px; color: var(--c-primary); } .invitation-completed-card { text-align: center; } .invitation-completed-icon { width: 56px; height: 56px; border-radius: 50%; margin: 0 auto 6px; display: flex; align-items: center; justify-content: center; background: var(--c-success-bg); color: var(--c-success); } .invitation-modal { width: min(920px, 96vw); } .invitation-modal-body { align-items: stretch; } .invitation-owner-warnings { display: flex; flex-direction: column; gap: 10px; } .invitation-draft-list, .invitation-order-list { display: flex; flex-direction: column; gap: 12px; } .invitation-draft-row, .invitation-order-row { border: 1px solid var(--gray-200); border-radius: 12px; padding: 14px; background: white; } .invitation-order-row { display: flex; justify-content: space-between; gap: 12px; align-items: center; } .invitation-order-actions { display: flex; align-items: center; gap: 10px; flex-shrink: 0; } .invitation-order-row strong { display: block; margin-bottom: 4px; color: var(--gray-900); } .invitation-order-row span:not(.badge) { display: block; color: var(--gray-500); font-size: 13px; } .invitation-status-badge { text-transform: capitalize; } .invitation-status-queued { background: var(--gray-100); color: var(--gray-600); } .invitation-status-sent, .invitation-status-opened { background: var(--c-info-bg); color: var(--c-primary); } .invitation-status-signed { background: var(--c-success-bg); color: var(--c-success); } .invitation-owner-actions { margin-top: 8px; } .invitation-remove-btn { align-self: flex-start; } .invitation-inline-delete { min-width: 92px; justify-content: center; } /* ─── Responsive ─────────────────────────────────────────────── */ @media (max-width: 768px) { .app-layout { display: block; height: auto; min-height: 100vh; overflow: visible; } .mobile-topbar { position: sticky; top: 0; z-index: 70; display: flex; align-items: center; gap: 12px; height: 60px; padding: 0 16px; background: var(--c-surface); color: var(--c-text); border-bottom: 0.5px solid var(--c-border); } .mobile-topbar-brand { display: flex; align-items: center; gap: 8px; font-size: 16px; font-weight: 700; } .mobile-menu-toggle, .mobile-sidebar-close { width: 36px; height: 36px; border: none; border-radius: 10px; display: inline-flex; align-items: center; justify-content: center; background: var(--gray-50); color: var(--c-text); cursor: pointer; } .mobile-sidebar-backdrop { position: fixed; inset: 0; z-index: 79; display: block; border: none; background: rgba(15, 23, 42, 0.55); } .sidebar { position: fixed; top: 0; left: 0; bottom: 0; z-index: 80; width: min(84vw, 320px); transform: translateX(-100%); transition: transform .2s ease; box-shadow: 0 18px 40px rgba(0,0,0,.18); } .sidebar--mobile-open { transform: translateX(0); } .sidebar-brand { justify-content: space-between; } .mobile-sidebar-close { display: inline-flex; margin-left: auto; flex-shrink: 0; } .sidebar-footer { align-items: flex-start; } .main-content { min-height: calc(100vh - 60px); } .topbar { padding: 12px 16px; height: auto; flex-wrap: wrap; } .topbar-title { flex-basis: 100%; } .topbar-brand-logo { display: none; } .page { padding: 16px; max-width: 100%; } .page-header, .section-header, .step-nav, .pdf-viewer-header, .modal-actions, .sign-confirm-actions, .form-actions { flex-direction: column; align-items: stretch; } .page-header h2 { font-size: 20px; } .header-actions { width: 100%; flex-wrap: wrap; } .header-actions .btn, .header-actions .btn-icon, .form-actions .btn, .sign-confirm-actions .btn { width: 100%; justify-content: center; } .auth-card, .form-card, .sign-form-card, .sign-confirm-card, .verify-card, .modal-card { width: 100%; max-width: 100%; padding: 18px; } .stats-grid, .stats-row, .certs-grid, .style-picker-grid, .verify-grid, .sign-layout, .two-col { grid-template-columns: 1fr; } .steps-bar { flex-direction: column; align-items: stretch; gap: 10px; } .step { flex: none; } .step::after { display: none; } .documents-section, .documents-sections, .sign-info-panel { gap: 16px; } .table-wrapper { overflow-x: auto; -webkit-overflow-scrolling: touch; } .data-table td, .data-table th { white-space: nowrap; } .actions-cell { flex-wrap: nowrap; } .pdf-placer-toolbar { flex-direction: column; align-items: stretch; gap: 10px; } .pdf-placer-pages { justify-content: space-between; } .pdf-placer-canvas { overflow: auto; max-width: 100%; } .pdf-placer-canvas .react-pdf__Page, .pdf-viewer-body .react-pdf__Page { max-width: 100%; } .pdf-placer-canvas .react-pdf__Page__canvas, .pdf-viewer-body .react-pdf__Page__canvas { width: 100% !important; height: auto !important; } .pdf-viewer-modal { width: 100%; max-height: 94vh; border-radius: 14px; } .pdf-viewer-body { padding: 10px; } .pdf-viewer-controls { width: 100%; justify-content: space-between; flex-wrap: wrap; } .guest-invitation-header, .invitation-order-row { flex-direction: column; align-items: stretch; } .invitation-order-actions { width: 100%; justify-content: space-between; } .style-card-inline-tools, .image-upload-area { justify-content: flex-start; } } @media (max-width: 480px) { .page { padding: 12px; } .auth-page { padding: 12px; } .auth-card { padding: 20px 16px; } .btn, .btn-icon, .btn-logout, .mobile-menu-toggle, .mobile-sidebar-close { min-height: 40px; } .page-header { margin-bottom: 18px; } .section-header h3 { font-size: 16px; } .doc-name { min-width: 180px; } }