Some checks failed
Deploy Application / deploy (push) Has been cancelled
624 lines
13 KiB
CSS
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;
|
|
}
|
|
} |