/* ═══════════════════════════════════════════════════════════════════════════════ Auth Pages — CSS Foundation EN: Styles for all auth pages (Login, Register, Forgot Password, Workflows) VI: Styles cho tất cả trang xác thực (Đăng nhập, Đăng ký, Quên MK, Workflows) Based on: pencil-design/src/pages/tPOS/auth/ tokens ═══════════════════════════════════════════════════════════════════════════════ */ /* ═════════════════════════════════════════════════════════════════════════ 1. AUTH-SPECIFIC VARIABLES ═════════════════════════════════════════════════════════════════════════ */ :root { /* Auth card */ --auth-card-bg: #111113; --auth-card-border: #1F1F23; --auth-card-radius: 24px; --auth-card-width: 440px; --auth-card-padding: 48px; /* Auth inputs */ --auth-input-bg: #0A0A0B; --auth-input-border: #2A2A2E; --auth-input-border-focus: #FF5C00; --auth-input-radius: 12px; --auth-input-height: 48px; /* Auth CTA colors */ --auth-cta-blue: #3B82F6; --auth-cta-blue-hover: #2563EB; --auth-cta-orange: #FF5C00; --auth-cta-orange-hover: #E05200; --auth-cta-green: #22C55E; --auth-cta-green-hover: #16A34A; /* Brand panel */ --auth-brand-orange: linear-gradient(180deg, #FF5C00 0%, #FF8A4C 50%, #FFB347 100%); --auth-brand-dark: linear-gradient(135deg, #0A0A0B 0%, #1A1A1D 50%, #0A0A0B 100%); /* OTP input */ --auth-otp-size: 52px; --auth-otp-bg: #1A1A1D; --auth-otp-border: #2A2A2E; --auth-otp-border-focus: #FF5C00; } /* ═════════════════════════════════════════════════════════════════════════ 2. AUTH PAGE LAYOUT — Full page containers ═════════════════════════════════════════════════════════════════════════ */ /* EN: Centered card layout (admin, staff, forgot-password, workflows) */ /* VI: Layout card giữa trang (admin, staff, quên MK, workflows) */ .auth-page { display: flex; align-items: center; justify-content: center; min-height: 100vh; background-color: var(--bg-page); padding: 24px; } /* EN: Split panel layout (branch, customer, register) */ /* VI: Layout chia đôi (chi nhánh, khách hàng, đăng ký) */ .auth-page--split { display: flex; min-height: 100vh; background-color: var(--bg-page); padding: 0; } /* ═════════════════════════════════════════════════════════════════════════ 3. AUTH CARD — Central form container ═════════════════════════════════════════════════════════════════════════ */ .auth-card { display: flex; flex-direction: column; align-items: center; gap: 32px; width: 100%; max-width: var(--auth-card-width); padding: var(--auth-card-padding); background-color: var(--auth-card-bg); border: 1px solid var(--auth-card-border); border-radius: var(--auth-card-radius); } .auth-card--compact { gap: 28px; } .auth-card--transparent { background-color: transparent; border: none; padding: 0; } /* ═════════════════════════════════════════════════════════════════════════ 4. AUTH HEADER — Icon + Title + Subtitle ═════════════════════════════════════════════════════════════════════════ */ .auth-header { display: flex; flex-direction: column; align-items: center; gap: 12px; text-align: center; width: 100%; } .auth-icon { display: flex; align-items: center; justify-content: center; width: 64px; height: 64px; border-radius: 16px; margin-bottom: 4px; } .auth-icon--blue { background-color: rgba(59, 130, 246, 0.15); color: var(--auth-cta-blue); } .auth-icon--orange { background-color: rgba(255, 92, 0, 0.15); color: var(--auth-cta-orange); } .auth-icon--green { background-color: rgba(34, 197, 94, 0.15); color: var(--auth-cta-green); } .auth-icon--success { background-color: rgba(34, 197, 94, 0.15); color: var(--auth-cta-green); border-radius: 50%; } .auth-icon svg, .auth-icon .lucide { width: 28px; height: 28px; stroke-width: 2; background: none !important; } .auth-role-badge { display: inline-flex; align-items: center; gap: 6px; padding: 4px 14px; border-radius: 100px; font-size: 0.75rem; font-weight: 600; letter-spacing: 0.5px; text-transform: uppercase; } .auth-role-badge--blue { background-color: rgba(59, 130, 246, 0.15); color: var(--auth-cta-blue); border: 1px solid rgba(59, 130, 246, 0.25); } .auth-role-badge--green { background-color: rgba(34, 197, 94, 0.15); color: var(--auth-cta-green); border: 1px solid rgba(34, 197, 94, 0.25); } .auth-heading { font-size: 1.625rem; font-weight: 700; color: var(--text-primary); line-height: 1.2; margin: 0; } .auth-subheading { font-size: 0.875rem; color: var(--text-secondary); line-height: 1.5; margin: 0; max-width: 360px; } .auth-security-hint { display: flex; align-items: center; gap: 8px; padding: 10px 16px; border-radius: 10px; font-size: 0.813rem; width: 100%; } .auth-security-hint--warning { background-color: rgba(255, 92, 0, 0.08); border: 1px solid rgba(255, 92, 0, 0.2); color: var(--auth-cta-orange); } .auth-security-hint--info { background-color: rgba(59, 130, 246, 0.08); border: 1px solid rgba(59, 130, 246, 0.2); color: var(--auth-cta-blue); } .auth-security-hint svg { width: 16px; height: 16px; flex-shrink: 0; background: none !important; } /* ═════════════════════════════════════════════════════════════════════════ 5. AUTH FORM — Inputs, labels, groups ═════════════════════════════════════════════════════════════════════════ */ .auth-form { display: flex; flex-direction: column; gap: 20px; width: 100%; } .auth-field { display: flex; flex-direction: column; gap: 8px; width: 100%; } .auth-label { font-size: 0.813rem; font-weight: 500; color: var(--text-secondary); } .auth-label-row { display: flex; justify-content: space-between; align-items: center; width: 100%; } .auth-label-link { font-size: 0.813rem; color: var(--auth-cta-orange); text-decoration: none; font-weight: 500; transition: color 0.2s; } .auth-label-link:hover { color: var(--accent-light); text-decoration: underline; } .auth-input-wrapper { position: relative; display: flex; align-items: center; width: 100%; } .auth-input { display: flex; align-items: center; width: 100%; height: var(--auth-input-height); padding: 0 16px 0 44px; background-color: var(--auth-input-bg); border: 1px solid var(--auth-input-border); border-radius: var(--auth-input-radius); color: var(--text-primary); font-size: 0.875rem; font-family: var(--font-body); outline: none; transition: border-color 0.2s, box-shadow 0.2s; } .auth-input:focus { border-color: var(--auth-input-border-focus); box-shadow: 0 0 0 3px rgba(255, 92, 0, 0.1); } .auth-input::placeholder { color: var(--text-disabled); } .auth-input--no-icon { padding-left: 16px; } .auth-input-icon { position: absolute; left: 14px; top: 50%; transform: translateY(-50%); color: var(--text-tertiary); pointer-events: none; } .auth-input-icon svg { width: 18px; height: 18px; background: none !important; } .auth-input-action { position: absolute; right: 12px; top: 50%; transform: translateY(-50%); background: none; border: none; color: var(--text-tertiary); cursor: pointer; padding: 4px; display: flex; align-items: center; transition: color 0.2s; } .auth-input-action:hover { color: var(--text-primary); } .auth-input-action svg { width: 18px; height: 18px; background: none !important; } /* EN: Phone input with country code */ /* VI: Input điện thoại với mã quốc gia */ .auth-phone-group { display: flex; gap: 8px; width: 100%; } .auth-phone-prefix { display: flex; align-items: center; justify-content: center; height: var(--auth-input-height); padding: 0 14px; background-color: var(--auth-input-bg); border: 1px solid var(--auth-input-border); border-radius: var(--auth-input-radius); color: var(--text-secondary); font-size: 0.875rem; font-weight: 500; white-space: nowrap; min-width: 70px; } .auth-phone-input { flex: 1; height: var(--auth-input-height); padding: 0 16px; background-color: var(--auth-input-bg); border: 1px solid var(--auth-input-border); border-radius: var(--auth-input-radius); color: var(--text-primary); font-size: 0.875rem; font-family: var(--font-body); outline: none; transition: border-color 0.2s, box-shadow 0.2s; } .auth-phone-input:focus { border-color: var(--auth-input-border-focus); box-shadow: 0 0 0 3px rgba(255, 92, 0, 0.1); } .auth-phone-input::placeholder { color: var(--text-disabled); } /* EN: Checkbox + Terms group */ /* VI: Group checkbox + Điều khoản */ .auth-checkbox-row { display: flex; align-items: flex-start; gap: 10px; font-size: 0.813rem; color: var(--text-secondary); line-height: 1.5; } .auth-checkbox-row input[type="checkbox"] { appearance: none; width: 18px; height: 18px; border: 1px solid var(--auth-input-border); border-radius: 4px; background-color: var(--auth-input-bg); flex-shrink: 0; cursor: pointer; margin-top: 2px; position: relative; } .auth-checkbox-row input[type="checkbox"]:checked { background-color: var(--auth-cta-orange); border-color: var(--auth-cta-orange); } .auth-checkbox-row input[type="checkbox"]:checked::after { content: '✓'; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: white; font-size: 12px; font-weight: 700; } .auth-checkbox-row a { color: var(--auth-cta-orange); text-decoration: none; } .auth-checkbox-row a:hover { text-decoration: underline; } /* ═════════════════════════════════════════════════════════════════════════ 6. AUTH BUTTON — CTA variants ═════════════════════════════════════════════════════════════════════════ */ .auth-btn { display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%; height: 48px; border: none; border-radius: var(--auth-input-radius); font-size: 0.938rem; font-weight: 600; font-family: var(--font-body); cursor: pointer; transition: background-color 0.2s, transform 0.1s, box-shadow 0.2s; } .auth-btn:hover { transform: translateY(-1px); } .auth-btn:active { transform: translateY(0); } .auth-btn:disabled { opacity: 0.5; cursor: not-allowed; transform: none; } .auth-btn svg { width: 18px; height: 18px; background: none !important; } .auth-btn--orange { background-color: var(--auth-cta-orange); color: white; } .auth-btn--orange:hover:not(:disabled) { background-color: var(--auth-cta-orange-hover); box-shadow: 0 4px 16px rgba(255, 92, 0, 0.3); } .auth-btn--blue { background-color: var(--auth-cta-blue); color: white; } .auth-btn--blue:hover:not(:disabled) { background-color: var(--auth-cta-blue-hover); box-shadow: 0 4px 16px rgba(59, 130, 246, 0.3); } .auth-btn--green { background-color: var(--auth-cta-green); color: white; } .auth-btn--green:hover:not(:disabled) { background-color: var(--auth-cta-green-hover); box-shadow: 0 4px 16px rgba(34, 197, 94, 0.3); } .auth-btn--outline { background-color: transparent; color: var(--text-primary); border: 1px solid var(--auth-card-border); } .auth-btn--outline:hover:not(:disabled) { background-color: var(--bg-elevated); box-shadow: none; } .auth-btn--ghost { background-color: transparent; color: var(--text-secondary); height: auto; padding: 8px 16px; } .auth-btn--ghost:hover:not(:disabled) { color: var(--text-primary); box-shadow: none; } /* ═════════════════════════════════════════════════════════════════════════ 7. BRAND PANEL — Left panel for split layouts ═════════════════════════════════════════════════════════════════════════ */ .auth-brand-panel { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 80px; min-height: 100vh; } .auth-brand-panel--orange { background: var(--auth-brand-orange); width: 640px; flex-shrink: 0; } .auth-brand-panel--dark { background: var(--auth-brand-dark); width: 800px; flex-shrink: 0; } .auth-brand-logo { display: flex; align-items: center; justify-content: center; width: 72px; height: 72px; border-radius: 20px; background-color: rgba(255, 255, 255, 0.15); font-size: 2rem; font-weight: 700; color: white; margin-bottom: 24px; } .auth-brand-panel--dark .auth-brand-logo { background-color: var(--auth-cta-orange); } .auth-brand-title { font-size: 1.75rem; font-weight: 700; color: white; text-align: center; margin: 0 0 12px 0; } .auth-brand-desc { font-size: 0.938rem; color: rgba(255, 255, 255, 0.8); text-align: center; line-height: 1.6; max-width: 400px; margin: 0 0 40px 0; } /* EN: Trust stats row */ /* VI: Hàng thống kê tin cậy */ .auth-brand-stats { display: flex; gap: 40px; margin-top: 24px; } .auth-brand-stat { display: flex; flex-direction: column; align-items: center; gap: 4px; } .auth-brand-stat-value { font-size: 1.5rem; font-weight: 700; color: white; } .auth-brand-stat-label { font-size: 0.75rem; color: rgba(255, 255, 255, 0.7); text-transform: capitalize; } /* EN: Feature list on brand panel */ /* VI: Danh sách tính năng trên brand panel */ .auth-brand-features { display: flex; flex-direction: column; gap: 14px; margin-top: 20px; } .auth-brand-feature { display: flex; align-items: center; gap: 10px; font-size: 0.875rem; color: rgba(255, 255, 255, 0.85); } .auth-brand-feature svg { width: 16px; height: 16px; color: var(--auth-cta-orange); background: none !important; } /* EN: Auth panel (right side) */ /* VI: Panel xác thực (bên phải) */ .auth-form-panel { display: flex; align-items: center; justify-content: center; flex: 1; min-height: 100vh; padding: 60px; background-color: var(--bg-surface); } .auth-form-panel .auth-card { background: transparent; border: none; padding: 0; max-width: 400px; } /* ═════════════════════════════════════════════════════════════════════════ 8. SOCIAL LOGIN — Google, Apple, Zalo buttons ═════════════════════════════════════════════════════════════════════════ */ .auth-divider { display: flex; align-items: center; gap: 16px; width: 100%; font-size: 0.813rem; color: var(--text-tertiary); } .auth-divider::before, .auth-divider::after { content: ''; flex: 1; height: 1px; background-color: var(--border-subtle); } .auth-social-group { display: flex; gap: 12px; justify-content: center; } .auth-social-btn { display: flex; align-items: center; justify-content: center; width: 52px; height: 52px; border-radius: 14px; border: 1px solid var(--auth-card-border); background-color: var(--bg-elevated); cursor: pointer; transition: border-color 0.2s, background-color 0.2s; } .auth-social-btn:hover { border-color: var(--border-strong); background-color: var(--bg-interactive); } .auth-social-btn--google { color: #FF5C00; font-weight: 700; font-size: 1.25rem; } .auth-social-btn--apple { color: white; font-size: 1.25rem; } .auth-social-btn--zalo { background-color: #0068FF; border-color: #0068FF; color: white; font-weight: 700; font-size: 0.875rem; } .auth-social-btn--zalo:hover { background-color: #0054cc; border-color: #0054cc; } /* ═════════════════════════════════════════════════════════════════════════ 9. OTP INPUT — 6-digit code boxes ═════════════════════════════════════════════════════════════════════════ */ .auth-otp-group { display: flex; gap: 10px; justify-content: center; width: 100%; } .auth-otp-input { width: var(--auth-otp-size); height: var(--auth-otp-size); text-align: center; font-size: 1.375rem; font-weight: 600; color: var(--text-primary); background-color: var(--auth-otp-bg); border: 1px solid var(--auth-otp-border); border-radius: 12px; outline: none; font-family: var(--font-body); transition: border-color 0.2s, box-shadow 0.2s; caret-color: var(--auth-cta-orange); } .auth-otp-input:focus { border-color: var(--auth-otp-border-focus); box-shadow: 0 0 0 3px rgba(255, 92, 0, 0.1); } .auth-otp-input--filled { border-color: var(--auth-cta-orange); background-color: rgba(255, 92, 0, 0.05); } .auth-otp-input--blue:focus { border-color: var(--auth-cta-blue); box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } .auth-otp-input--blue.auth-otp-input--filled { border-color: var(--auth-cta-blue); background-color: rgba(59, 130, 246, 0.05); } /* ═════════════════════════════════════════════════════════════════════════ 10. PASSWORD STRENGTH — Checklist ═════════════════════════════════════════════════════════════════════════ */ .auth-strength { display: flex; flex-direction: column; gap: 8px; width: 100%; padding: 14px 16px; background-color: var(--bg-page); border: 1px solid var(--auth-card-border); border-radius: 12px; } .auth-strength-title { font-size: 0.813rem; font-weight: 600; color: var(--text-secondary); margin-bottom: 4px; } .auth-strength-item { display: flex; align-items: center; gap: 8px; font-size: 0.813rem; color: var(--text-tertiary); } .auth-strength-item--pass { color: var(--auth-cta-green); } .auth-strength-item svg { width: 14px; height: 14px; flex-shrink: 0; background: none !important; } /* ═════════════════════════════════════════════════════════════════════════ 11. AUTH FOOTER — Links, navigation, timer ═════════════════════════════════════════════════════════════════════════ */ .auth-footer { display: flex; flex-direction: column; align-items: center; gap: 12px; text-align: center; width: 100%; } .auth-footer-text { font-size: 0.813rem; color: var(--text-tertiary); } .auth-footer-text a, .auth-footer-link { color: var(--auth-cta-orange); text-decoration: none; font-weight: 500; cursor: pointer; } .auth-footer-text a:hover, .auth-footer-link:hover { text-decoration: underline; } .auth-footer-link--blue { color: var(--auth-cta-blue); } .auth-back-link { display: inline-flex; align-items: center; gap: 6px; font-size: 0.813rem; color: var(--text-tertiary); text-decoration: none; transition: color 0.2s; align-self: flex-start; } .auth-back-link:hover { color: var(--text-primary); } .auth-back-link svg { width: 14px; height: 14px; background: none !important; } /* Timer */ .auth-timer { display: flex; align-items: center; gap: 6px; font-size: 0.813rem; color: var(--text-tertiary); } .auth-timer svg { width: 14px; height: 14px; background: none !important; } .auth-timer-value { color: var(--auth-cta-orange); font-weight: 600; } /* EN: Highlighted email in confirmations */ /* VI: Email highlight trong xác nhận */ .auth-highlight { color: var(--auth-cta-orange); font-weight: 500; } /* ═════════════════════════════════════════════════════════════════════════ 12. ROLE HINTS — Staff login role section ═════════════════════════════════════════════════════════════════════════ */ .auth-role-hints { display: flex; flex-direction: column; align-items: center; gap: 8px; padding-top: 40px; } .auth-role-hints-title { font-size: 0.75rem; color: var(--text-tertiary); text-transform: uppercase; letter-spacing: 0.5px; } .auth-role-list { display: flex; gap: 16px; align-items: center; } .auth-role-item { display: flex; align-items: center; gap: 6px; font-size: 0.813rem; color: var(--text-secondary); } .auth-role-item svg { width: 16px; height: 16px; background: none !important; color: var(--text-tertiary); } /* EN: Disclaimer text */ /* VI: Ghi chú điều khoản */ .auth-disclaimer { font-size: 0.688rem; color: var(--text-disabled); text-align: center; line-height: 1.5; max-width: 360px; margin-top: 8px; } .auth-disclaimer a { color: var(--text-tertiary); text-decoration: underline; } /* ═════════════════════════════════════════════════════════════════════════ 13. RESPONSIVE — Tablet & Mobile ═════════════════════════════════════════════════════════════════════════ */ /* EN: Tablet (768px) */ /* VI: Tablet (768px) */ @media (max-width: 768px) { .auth-page--split { flex-direction: column; } .auth-brand-panel--orange, .auth-brand-panel--dark { width: 100%; min-height: auto; padding: 40px 24px; } .auth-brand-stats { gap: 24px; } .auth-brand-stat-value { font-size: 1.25rem; } .auth-brand-features { display: none; } .auth-form-panel { min-height: auto; padding: 40px 24px; } .auth-card { padding: 32px; } } /* EN: Mobile (480px) */ /* VI: Di động (480px) */ @media (max-width: 480px) { .auth-page { padding: 16px; } .auth-page--split { flex-direction: column; } .auth-brand-panel--orange, .auth-brand-panel--dark { width: 100%; min-height: auto; padding: 24px 20px; flex-direction: row; gap: 12px; justify-content: flex-start; } .auth-brand-logo { width: 40px; height: 40px; border-radius: 10px; font-size: 1.125rem; margin-bottom: 0; } .auth-brand-title { font-size: 1rem; text-align: left; margin: 0; } .auth-brand-desc, .auth-brand-stats, .auth-brand-features { display: none; } .auth-form-panel { padding: 24px 20px; } .auth-card { padding: 24px; border-radius: 16px; gap: 24px; } .auth-heading { font-size: 1.375rem; } .auth-icon { width: 56px; height: 56px; } .auth-otp-input { width: 44px; height: 44px; font-size: 1.125rem; } .auth-role-list { flex-wrap: wrap; justify-content: center; gap: 10px; } .auth-social-btn { width: 48px; height: 48px; } }