/* ======================================== Location Code Input Component Uses global CSS variables from app.css ======================================== */ .location-code-input { display: flex; flex-direction: column; gap: var(--space-5); } /* ======================================== Section Title ======================================== */ .input-section-title { font-family: var(--font-family-base); font-size: var(--text-sm); font-weight: var(--font-weight-semibold); color: var(--text-secondary); margin: 0; padding-bottom: var(--space-2); border-bottom: 1px solid var(--border-default); text-transform: uppercase; letter-spacing: 0.5px; } /* ======================================== Input Row - Responsive Grid ======================================== */ .input-row { display: grid; grid-template-columns: 1fr; gap: var(--space-4); } @media (min-width: 480px) { .input-row { grid-template-columns: 2fr 1fr 1fr; gap: var(--space-4); } } /* ======================================== Input Group with Validation States ======================================== */ .input-group { display: flex; flex-direction: column; gap: 0.35rem; position: relative; } .input-group label { font-family: var(--font-family-base); font-size: var(--text-sm); font-weight: var(--font-weight-semibold); color: var(--text-secondary); display: flex; align-items: center; gap: var(--space-1); } /* Required field indicator */ .required-indicator { color: var(--color-primary); font-weight: var(--font-weight-bold); } /* ======================================== Form Controls with Validation States ======================================== */ .input-group .form-control { width: 100%; padding: var(--space-3) var(--space-4); background: rgba(0, 0, 0, 0.3); border: 1.5px solid var(--border-default); border-radius: var(--radius-md); color: var(--text-primary); font-family: var(--font-family-base); font-size: var(--text-base); box-sizing: border-box; transition: all var(--duration-fast) var(--ease-default); } .input-group .form-control:focus { outline: none; border-color: var(--color-primary); box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.2); background: rgba(0, 0, 0, 0.4); } .input-group .form-control::placeholder { color: var(--text-placeholder); } /* Valid state */ .input-group .form-control.is-valid { border-color: rgba(34, 197, 94, 0.6); background: rgba(34, 197, 94, 0.05); } .input-group .form-control.is-valid:focus { border-color: var(--color-success); box-shadow: 0 0 0 3px rgba(34, 197, 94, 0.2); } /* Invalid state */ .input-group .form-control.is-invalid { border-color: rgba(239, 68, 68, 0.6); background: rgba(239, 68, 68, 0.05); } .input-group .form-control.is-invalid:focus { border-color: var(--color-error); box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.2); } /* Select styling */ .input-group select.form-control { appearance: none; -webkit-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='%23ffffff' fill-opacity='0.5' d='M6 8L1 3h10z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 12px center; padding-right: 36px; cursor: pointer; } .input-group select.form-control option { background: #1c1c1e; color: var(--text-primary); padding: 10px; } /* Number input styling */ .input-group input[type="number"].form-control { -moz-appearance: textfield; } .input-group input[type="number"].form-control::-webkit-outer-spin-button, .input-group input[type="number"].form-control::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; } /* ======================================== Field Hint & Validation Messages ======================================== */ .field-hint { font-family: var(--font-family-base); font-size: 0.75rem; color: var(--text-muted); margin-top: 2px; } .field-error { display: flex; align-items: center; gap: 0.35rem; font-family: var(--font-family-base); font-size: var(--text-xs); color: var(--color-error-light); margin-top: 4px; animation: slideIn var(--duration-fast) var(--ease-out); } .field-success { display: flex; align-items: center; font-family: var(--font-family-base); font-size: var(--text-xs); color: var(--color-success); margin-top: 4px; animation: slideIn var(--duration-fast) var(--ease-out); } .error-icon { font-size: var(--text-sm); } .success-icon { font-size: var(--text-sm); } @keyframes slideIn { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } } /* Input group states */ .input-group.has-error .form-control { border-color: rgba(239, 68, 68, 0.6); } .input-group.has-success .form-control { border-color: rgba(34, 197, 94, 0.5); } /* ======================================== Code Preview Section - Prominent Display ======================================== */ .code-preview-section { display: flex; flex-direction: column; gap: var(--space-3); padding: var(--space-5); background: linear-gradient(135deg, var(--surface-primary) 0%, rgba(0, 0, 0, 0.4) 100%); border: 1px solid var(--border-default); border-radius: var(--radius-lg); } .code-preview-header { display: flex; align-items: center; justify-content: space-between; } .preview-label { font-family: var(--font-family-base); font-size: var(--text-xs); font-weight: var(--font-weight-semibold); color: var(--text-tertiary); text-transform: uppercase; letter-spacing: 0.5px; } /* Main code display */ .code-preview-display { display: flex; align-items: center; justify-content: center; padding: var(--space-4) var(--space-6); background: rgba(0, 0, 0, 0.3); border: 2px solid var(--border-default); border-radius: var(--radius-lg); transition: all var(--duration-normal) var(--ease-default); } .code-preview-display.valid { border-color: rgba(34, 197, 94, 0.5); background: rgba(34, 197, 94, 0.08); } .code-preview-display.invalid { border-color: rgba(239, 68, 68, 0.4); background: rgba(239, 68, 68, 0.05); } .code-value { font-family: var(--font-family-heading); font-size: 2rem; font-weight: var(--font-weight-bold); letter-spacing: 0.2em; color: var(--text-primary); text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); } @media (min-width: 480px) { .code-value { font-size: 2.5rem; } } .code-preview-display.valid .code-value { color: var(--color-success-light); } .code-preview-display.invalid .code-value { color: var(--text-placeholder); } /* Description text */ .code-preview-description { text-align: center; } .display-text { font-family: var(--font-family-base); font-size: var(--text-base); color: var(--text-secondary); } .display-text.placeholder { color: var(--text-muted); font-style: italic; } /* ======================================== Availability Status ======================================== */ .availability-status { display: flex; align-items: center; justify-content: center; gap: var(--space-2); padding: var(--space-3) var(--space-4); border-radius: var(--radius-md); font-family: var(--font-family-base); font-size: var(--text-sm); font-weight: var(--font-weight-semibold); transition: all var(--duration-fast) var(--ease-default); } .availability-status.checking { background: rgba(251, 191, 36, 0.12); border: 1px solid rgba(251, 191, 36, 0.25); color: var(--color-warning); } .availability-status.available, .availability-status.new { background: rgba(34, 197, 94, 0.12); border: 1px solid rgba(34, 197, 94, 0.25); color: var(--color-success); } .availability-status.unavailable { background: rgba(239, 68, 68, 0.12); border: 1px solid rgba(239, 68, 68, 0.25); color: var(--color-error-light); } .status-icon { font-size: var(--text-lg); line-height: 1; } .available-icon, .new-icon { color: var(--color-success); } .unavailable-icon { color: var(--color-error-light); } /* Loading spinner for availability check */ .status-spinner { width: 16px; height: 16px; border: 2px solid rgba(251, 191, 36, 0.3); border-top-color: var(--color-warning); border-radius: 50%; animation: spin 0.8s linear infinite; } /* ======================================== Responsive Adjustments ======================================== */ @media (max-width: 479.98px) { .code-preview-section { padding: var(--space-4); } .code-value { font-size: 1.75rem; letter-spacing: 0.15em; } .availability-status { font-size: var(--text-sm); padding: 0.65rem 0.85rem; } } /* Reduced motion: inherited from app.css (section 17) */