Files
michaelschiemer/resources/css/components/admin/admin-forms.css
2025-11-24 21:28:25 +01:00

624 lines
13 KiB
CSS

/**
* 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;
}
}