/* ============================================================ FileUpload Component Styles ============================================================ */ .fu-root { width: 100%; } /* ── Drop Zone ── */ .fu-zone { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 0.6rem; border: 2px dashed var(--color-neutral-300); border-radius: var(--radius-xl); padding: 2rem 1.5rem; background: var(--color-neutral-50); cursor: pointer; transition: all 0.22s ease; position: relative; overflow: hidden; text-align: center; min-height: 140px; } .fu-zone:hover { border-color: var(--color-primary-400); background: var(--color-primary-50); } .fu-zone--dragging { border-color: var(--color-primary-500); background: linear-gradient(135deg, var(--color-primary-50), #dcfce7); transform: scale(1.01); box-shadow: 0 0 0 4px rgba(45, 106, 79, 0.12); } .fu-zone--uploading { pointer-events: none; opacity: 0.85; } /* Hidden native input */ .fu-input { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; } /* Icon */ .fu-zone__icon { font-size: 2.2rem; color: var(--color-primary-400); transition: color 0.2s, transform 0.2s; } .fu-zone:hover .fu-zone__icon, .fu-zone--dragging .fu-zone__icon { color: var(--color-primary-600); transform: translateY(-2px); } .fu-zone__label { font-size: 0.95rem; font-weight: 600; color: var(--color-neutral-700); margin: 0; } .fu-zone__hint { font-size: 0.78rem; color: var(--color-neutral-400); margin: 0; } /* ── Progress Bar ── */ .fu-progress { width: 100%; height: 6px; background: var(--color-neutral-200); border-radius: 999px; overflow: hidden; position: relative; margin-top: 0.5rem; } .fu-progress__bar { height: 100%; background: linear-gradient(90deg, var(--color-primary-500), var(--color-primary-400)); border-radius: 999px; transition: width 0.2s ease; } .fu-progress__label { position: absolute; right: 0; top: -1.5rem; font-size: 0.75rem; color: var(--color-primary-600); font-weight: 600; } /* ── Preview State ── */ .fu-preview { position: relative; border-radius: var(--radius-xl); overflow: hidden; border: 2px solid var(--color-neutral-200); background: var(--color-neutral-50); } .fu-preview__img { width: 100%; height: 180px; object-fit: cover; display: block; } .fu-preview__doc { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 0.5rem; padding: 2rem; color: var(--color-neutral-500); } .fu-preview__doc-icon { font-size: 2.5rem; color: var(--color-primary-400); } /* Remove button */ .fu-preview__remove { position: absolute; top: 0.5rem; right: 0.5rem; width: 2rem; height: 2rem; background: rgba(0, 0, 0, 0.55); border: none; border-radius: 50%; color: white; font-size: 1rem; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: background 0.2s; z-index: 2; } .fu-preview__remove:hover { background: rgba(239, 68, 68, 0.85); } /* Success badge */ .fu-preview__success { position: absolute; bottom: 0.5rem; left: 0.5rem; background: rgba(16, 185, 129, 0.9); color: white; font-size: 0.75rem; font-weight: 600; padding: 0.25rem 0.6rem; border-radius: var(--radius-full); display: flex; align-items: center; gap: 0.3rem; } /* ── Error ── */ .fu-error { display: flex; align-items: center; gap: 0.4rem; margin-top: 0.5rem; font-size: 0.82rem; color: #EF4444; } /* ── Spin (shared) ── */ @keyframes spin { to { transform: rotate(360deg); } } .spin-icon { animation: spin 0.8s linear infinite; }