/** * Admin Form Components * * Form controls, filters, and input elements for admin interfaces * Extended from base form styles with admin-specific enhancements */ /* Form Groups */ .admin-form-group { margin-bottom: var(--space-lg); } .admin-form-group__label { display: block; font-weight: 500; color: var(--text); margin-bottom: var(--space-sm); font-size: 0.875rem; } .admin-form-group__label--required::after { content: ' *'; color: var(--error); } .admin-form-group__help { color: var(--muted); font-size: 0.75rem; margin-top: var(--space-sm); } .admin-form-group__error { color: var(--error); font-size: 0.75rem; margin-top: var(--space-sm); } /* Input Fields */ .admin-input { width: 100%; padding: var(--space-sm) var(--space-md); border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--bg); color: var(--text); font-size: 0.875rem; transition: all var(--duration-default) var(--easing-default); } .admin-input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px oklch(from var(--accent) l c h / 0.1); } .admin-input:invalid { border-color: var(--error); } .admin-input:invalid:focus { box-shadow: 0 0 0 3px oklch(from var(--error) l c h / 0.1); } .admin-input--small { padding: 0.25rem var(--space-sm); font-size: 0.75rem; } .admin-input--large { padding: var(--space-md) var(--space-lg); font-size: 1rem; } /* Select Fields */ .admin-select { appearance: none; background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M6 9l6 6 6-6'/%3e%3c/svg%3e"); background-repeat: no-repeat; background-position: right var(--space-sm) center; background-size: 1rem 1rem; padding-right: calc(var(--space-md) + 1.5rem); } /* Textarea */ .admin-textarea { min-height: 100px; resize: vertical; font-family: inherit; } /* Search Fields */ .admin-search { position: relative; display: inline-block; } .admin-search__input { padding-left: calc(var(--space-md) + 1.5rem); background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3ccircle cx='11' cy='11' r='8'/%3e%3cpath d='m21 21-4.35-4.35'/%3e%3c/svg%3e"); background-repeat: no-repeat; background-position: left var(--space-sm) center; background-size: 1rem 1rem; } .admin-search__clear { position: absolute; right: var(--space-sm); top: 50%; transform: translateY(-50%); background: none; border: none; color: var(--muted); cursor: pointer; font-size: 1rem; padding: 0.25rem; border-radius: var(--radius-md); } .admin-search__clear:hover { background: oklch(from var(--border) l c h / 0.5); } /* Filter Bar */ .admin-filter-bar { display: flex; gap: var(--space-md); align-items: center; padding: var(--space-md); background: var(--bg-alt); border: 1px solid var(--border); border-radius: var(--radius-lg); margin-bottom: var(--space-lg); flex-wrap: wrap; } .admin-filter-bar__group { display: flex; gap: var(--space-sm); align-items: center; } .admin-filter-bar__label { font-size: 0.75rem; font-weight: 500; color: var(--muted); text-transform: uppercase; letter-spacing: 0.05em; white-space: nowrap; } .admin-filter-bar__input { min-width: 120px; } .admin-filter-bar__actions { margin-left: auto; display: flex; gap: var(--space-sm); } /* Button Groups */ .admin-button-group { display: inline-flex; border-radius: var(--radius-md); overflow: hidden; border: 1px solid var(--border); } .admin-button-group .admin-button { border-radius: 0; border: none; border-right: 1px solid var(--border); } .admin-button-group .admin-button:last-child { border-right: none; } .admin-button-group .admin-button.active { background: var(--accent); color: var(--bg); } /* Toggle Switches */ .admin-toggle { position: relative; display: inline-block; width: 44px; height: 24px; } .admin-toggle__input { opacity: 0; width: 0; height: 0; } .admin-toggle__slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background: var(--border); transition: var(--duration-default); border-radius: 24px; } .admin-toggle__slider:before { position: absolute; content: ""; height: 18px; width: 18px; left: 3px; bottom: 3px; background: var(--bg); transition: var(--duration-default); border-radius: 50%; } .admin-toggle__input:checked + .admin-toggle__slider { background: var(--accent); } .admin-toggle__input:checked + .admin-toggle__slider:before { transform: translateX(20px); } /* Checkbox/Radio Groups */ .admin-checkbox-group, .admin-radio-group { display: flex; flex-direction: column; gap: var(--space-sm); } .admin-checkbox-group--horizontal, .admin-radio-group--horizontal { flex-direction: row; flex-wrap: wrap; gap: var(--space-md); } .admin-checkbox, .admin-radio { display: flex; align-items: center; gap: var(--space-sm); cursor: pointer; } .admin-checkbox__input, .admin-radio__input { width: 1rem; height: 1rem; accent-color: var(--accent); } .admin-checkbox__label, .admin-radio__label { font-size: 0.875rem; color: var(--text); } /* Form Actions */ .admin-form-actions { display: flex; gap: var(--space-md); justify-content: flex-end; padding-top: var(--space-lg); border-top: 1px solid var(--border); margin-top: var(--space-lg); } .admin-form-actions--left { justify-content: flex-start; } .admin-form-actions--center { justify-content: center; } .admin-form-actions--space-between { justify-content: space-between; } /* Drag & Drop Upload Zone */ .admin-upload-zone { border: 2px dashed var(--border); border-radius: var(--radius-lg); padding: 3rem 2rem; text-align: center; background: var(--bg-alt); transition: all var(--duration-default) var(--easing-default); cursor: pointer; } .admin-upload-zone:hover { border-color: var(--accent); background: oklch(from var(--accent) l c h / 0.05); } .admin-upload-zone--dragover { border-color: var(--accent); background: oklch(from var(--accent) l c h / 0.1); transform: scale(1.02); } /* Progress Bar */ .admin-upload-progress { margin-bottom: var(--space-lg); } .admin-progress-bar { width: 100%; height: 8px; background: var(--bg-alt); border-radius: 4px; overflow: hidden; margin-bottom: var(--space-sm); } .admin-progress-fill { height: 100%; background: var(--accent); transition: width var(--duration-default) var(--easing-default); } .admin-progress-text { font-size: 0.875rem; color: var(--muted); text-align: center; } /* File Preview */ .admin-file-preview { margin-bottom: var(--space-lg); padding: var(--space-md); background: var(--bg-alt); border-radius: var(--radius-lg); border: 1px solid var(--border); } .admin-file-preview__image { max-width: 100%; height: auto; border-radius: var(--radius-md); margin-bottom: var(--space-md); box-shadow: 0 2px 8px oklch(from var(--text) l c h / 0.1); } .admin-file-preview__info { display: flex; justify-content: space-between; align-items: center; gap: var(--space-md); } /* Validation States */ .admin-input--error, .admin-select--error, .admin-textarea--error { border-color: var(--error); } .admin-input--error:focus, .admin-select--error:focus, .admin-textarea--error:focus { border-color: var(--error); box-shadow: 0 0 0 3px oklch(from var(--error) l c h / 0.1); } .admin-input--success, .admin-select--success, .admin-textarea--success { border-color: var(--success, #4caf50); } .admin-input--success:focus, .admin-select--success:focus, .admin-textarea--success:focus { border-color: var(--success, #4caf50); box-shadow: 0 0 0 3px oklch(from var(--success, #4caf50) l c h / 0.1); } .admin-field--error .admin-form-label { color: var(--error); } .admin-field--success .admin-form-label { color: var(--success, #4caf50); } /* Loading Spinner */ .admin-spinner { display: inline-block; width: 1rem; height: 1rem; border: 2px solid var(--border); border-top-color: var(--accent); border-radius: 50%; animation: admin-spin 0.6s linear infinite; } @keyframes admin-spin { to { transform: rotate(360deg); } } .admin-spinner--large { width: 2rem; height: 2rem; border-width: 3px; } .admin-spinner--small { width: 0.75rem; height: 0.75rem; border-width: 1.5px; } /* Toast Notifications */ .admin-toast { position: fixed; top: var(--space-lg); right: var(--space-lg); min-width: 300px; max-width: 500px; padding: var(--space-md) var(--space-lg); border-radius: var(--radius-lg); box-shadow: 0 4px 12px oklch(from var(--text) l c h / 0.15); z-index: 1000; animation: admin-toast-slide-in 0.3s var(--easing-default); } @keyframes admin-toast-slide-in { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } .admin-toast--success { background: var(--success, #4caf50); color: white; } .admin-toast--error { background: var(--error); color: white; } .admin-toast--info { background: var(--accent); color: white; } .admin-toast--warning { background: var(--warning, #ff9800); color: white; } .admin-toast__message { font-size: 0.875rem; font-weight: 500; margin: 0; } .admin-toast__close { position: absolute; top: var(--space-sm); right: var(--space-sm); background: none; border: none; color: inherit; cursor: pointer; font-size: 1.25rem; line-height: 1; opacity: 0.8; padding: 0.25rem; } .admin-toast__close:hover { opacity: 1; } /* Alert Styles */ .admin-alert { padding: var(--space-md); border-radius: var(--radius-md); margin-bottom: var(--space-lg); border-left: 4px solid; } .admin-alert--error { background: oklch(from var(--error) l c h / 0.1); border-color: var(--error); color: oklch(from var(--error) l c h / 0.9); } .admin-alert--success { background: oklch(from var(--success, #4caf50) l c h / 0.1); border-color: var(--success, #4caf50); color: oklch(from var(--success, #4caf50) l c h / 0.9); } .admin-alert--info { background: oklch(from var(--accent) l c h / 0.1); border-color: var(--accent); color: oklch(from var(--accent) l c h / 0.9); } .admin-alert--warning { background: oklch(from var(--warning, #ff9800) l c h / 0.1); border-color: var(--warning, #ff9800); color: oklch(from var(--warning, #ff9800) l c h / 0.9); } .admin-error-list { margin: var(--space-sm) 0 0 var(--space-lg); padding: 0; list-style: disc; } /* Badge Styles */ .badge { display: inline-block; padding: 0.25rem 0.5rem; border-radius: var(--radius-sm); font-size: 0.75rem; font-weight: 500; margin-left: var(--space-sm); } .badge--info { background: oklch(from var(--accent) l c h / 0.1); color: var(--accent); } .badge--success { background: oklch(from var(--success, #4caf50) l c h / 0.1); color: var(--success, #4caf50); } .badge--error { background: oklch(from var(--error) l c h / 0.1); color: var(--error); } .badge--warning { background: oklch(from var(--warning, #ff9800) l c h / 0.1); color: var(--warning, #ff9800); } /* Form Sections */ .admin-form-sections { display: flex; flex-direction: column; gap: var(--space-xl); } .admin-form-section { background: var(--bg-alt); border-radius: var(--radius-lg); padding: var(--space-lg); border: 1px solid var(--border); } .admin-form-section__title { font-size: 1.125rem; font-weight: 600; color: var(--text); margin: 0 0 var(--space-lg) 0; padding-bottom: var(--space-md); border-bottom: 2px solid var(--border); } /* Responsive */ @media (max-width: 768px) { .admin-filter-bar { flex-direction: column; align-items: stretch; } .admin-filter-bar__group { justify-content: space-between; } .admin-filter-bar__actions { margin-left: 0; width: 100%; justify-content: flex-start; } .admin-form-actions { flex-direction: column; } .admin-button-group { width: 100%; } .admin-checkbox-group--horizontal, .admin-radio-group--horizontal { flex-direction: column; } .admin-toast { right: var(--space-sm); left: var(--space-sm); min-width: auto; max-width: none; } .admin-upload-zone { padding: 2rem 1rem; } }