smart-museum-front / css /components.css
youssef357402's picture
Upload css/components.css with huggingface_hub
ab97ba0 verified
Raw
History Blame Contribute Delete
17.7 kB
/* components.css - مكونات النظام المشتركة */
/* ========== BUTTONS ========== */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--spacing-2);
font-family: var(--font-family-arabic);
font-weight: var(--font-weight-semibold);
font-size: var(--text-sm);
line-height: var(--line-height-normal);
text-align: center;
text-decoration: none;
white-space: nowrap;
vertical-align: middle;
user-select: none;
border: var(--border-width-base) solid transparent;
border-radius: var(--radius-md);
padding: var(--spacing-2) var(--spacing-4);
cursor: pointer;
transition: all var(--transition-duration-200) var(--transition-timing-function-ease);
position: relative;
overflow: hidden;
min-height: 2.5rem;
}
/* Button Sizes */
.btn-xs {
font-size: var(--text-xs);
padding: var(--spacing-1) var(--spacing-2);
min-height: 1.75rem;
}
.btn-sm {
font-size: var(--text-sm);
padding: var(--spacing-2) var(--spacing-3);
min-height: 2rem;
}
.btn-md {
font-size: var(--text-base);
padding: var(--spacing-3) var(--spacing-4);
min-height: 2.5rem;
}
.btn-lg {
font-size: var(--text-lg);
padding: var(--spacing-4) var(--spacing-6);
min-height: 3rem;
}
.btn-xl {
font-size: var(--text-xl);
padding: var(--spacing-5) var(--spacing-8);
min-height: 3.5rem;
}
/* Button Variants */
.btn-primary {
background: linear-gradient(135deg,
var(--color-primary-500) 0%,
var(--color-primary-600) 100%
);
color: var(--color-neutral-0);
border-color: var(--color-primary-600);
box-shadow: var(--shadow-md);
}
.btn-primary:hover:not(:disabled) {
background: linear-gradient(135deg,
var(--color-primary-600) 0%,
var(--color-primary-700) 100%
);
transform: translateY(-2px);
box-shadow: var(--shadow-lg);
border-color: var(--color-primary-700);
}
.btn-primary:active:not(:disabled) {
transform: translateY(0);
box-shadow: var(--shadow-sm);
}
.btn-secondary {
background: linear-gradient(135deg,
var(--color-secondary-500) 0%,
var(--color-secondary-600) 100%
);
color: var(--color-neutral-0);
border-color: var(--color-secondary-600);
box-shadow: var(--shadow-md);
}
.btn-secondary:hover:not(:disabled) {
background: linear-gradient(135deg,
var(--color-secondary-600) 0%,
var(--color-secondary-700) 100%
);
transform: translateY(-2px);
box-shadow: var(--shadow-lg);
border-color: var(--color-secondary-700);
}
.btn-outline {
background: transparent;
color: var(--color-primary-600);
border-color: var(--color-primary-300);
}
.btn-outline:hover:not(:disabled) {
background: var(--color-primary-50);
color: var(--color-primary-700);
border-color: var(--color-primary-500);
transform: translateY(-1px);
}
.btn-ghost {
background: transparent;
color: var(--color-neutral-600);
border-color: transparent;
}
.btn-ghost:hover:not(:disabled) {
background: var(--color-neutral-100);
color: var(--color-neutral-800);
}
.btn-danger {
background: linear-gradient(135deg,
var(--color-error) 0%,
color-mix(in srgb, var(--color-error) 80%, black) 100%
);
color: var(--color-neutral-0);
border-color: var(--color-error);
}
.btn-danger:hover:not(:disabled) {
background: linear-gradient(135deg,
color-mix(in srgb, var(--color-error) 80%, black) 0%,
color-mix(in srgb, var(--color-error) 60%, black) 100%
);
transform: translateY(-2px);
box-shadow: var(--shadow-lg);
}
/* Button States */
.btn:disabled,
.btn.disabled {
opacity: 0.5;
cursor: not-allowed;
pointer-events: none;
}
.btn.loading {
position: relative;
color: transparent !important;
}
.btn.loading::after {
content: '';
position: absolute;
width: 1em;
height: 1em;
border: 2px solid currentColor;
border-radius: var(--radius-full);
border-right-color: transparent;
animation: spin 0.75s linear infinite;
}
/* Icon Buttons */
.btn-icon {
width: 2.5rem;
height: 2.5rem;
padding: 0;
border-radius: var(--radius-full);
}
.btn-icon-sm {
width: 2rem;
height: 2rem;
}
.btn-icon-lg {
width: 3rem;
height: 3rem;
}
/* Button Groups */
.btn-group {
display: inline-flex;
border-radius: var(--radius-md);
overflow: hidden;
box-shadow: var(--shadow-sm);
}
.btn-group .btn {
border-radius: 0;
border-left: 1px solid rgba(255, 255, 255, 0.2);
}
.btn-group .btn:first-child {
border-top-right-radius: var(--radius-md);
border-bottom-right-radius: var(--radius-md);
border-left: none;
}
.btn-group .btn:last-child {
border-top-left-radius: var(--radius-md);
border-bottom-left-radius: var(--radius-md);
}
/* ========== CARDS ========== */
.card {
background: var(--color-neutral-0);
border: 1px solid var(--color-neutral-200);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-md);
transition: all var(--transition-duration-300) var(--transition-timing-function-ease);
overflow: hidden;
}
.card:hover {
transform: translateY(-4px);
box-shadow: var(--shadow-xl);
border-color: var(--color-neutral-300);
}
.card-header {
padding: var(--spacing-4);
border-bottom: 1px solid var(--color-neutral-200);
background: var(--color-neutral-50);
}
.card-body {
padding: var(--spacing-4);
}
.card-footer {
padding: var(--spacing-4);
border-top: 1px solid var(--color-neutral-200);
background: var(--color-neutral-50);
}
.card-title {
font-size: var(--text-lg);
font-weight: var(--font-weight-semibold);
color: var(--color-neutral-900);
margin-bottom: var(--spacing-2);
}
.card-subtitle {
font-size: var(--text-sm);
color: var(--color-neutral-500);
margin-bottom: var(--spacing-4);
}
/* ========== FORMS ========== */
.form-group {
margin-bottom: var(--spacing-4);
}
.form-label {
display: block;
font-size: var(--text-sm);
font-weight: var(--font-weight-medium);
color: var(--color-neutral-700);
margin-bottom: var(--spacing-2);
}
.form-label.required::after {
content: " *";
color: var(--color-error);
}
.form-control {
display: block;
width: 100%;
padding: var(--spacing-3) var(--spacing-4);
font-size: var(--text-base);
font-family: var(--font-family-arabic);
line-height: var(--line-height-normal);
color: var(--color-neutral-800);
background-color: var(--color-neutral-0);
background-clip: padding-box;
border: 1px solid var(--color-neutral-300);
border-radius: var(--radius-md);
transition: border-color var(--transition-duration-200) var(--transition-timing-function-ease),
box-shadow var(--transition-duration-200) var(--transition-timing-function-ease);
}
.form-control:focus {
border-color: var(--color-primary-500);
outline: 0;
box-shadow: 0 0 0 3px rgba(30, 64, 175, 0.1);
}
.form-control::placeholder {
color: var(--color-neutral-400);
opacity: 1;
}
.form-control:disabled,
.form-control[readonly] {
background-color: var(--color-neutral-100);
opacity: 0.7;
cursor: not-allowed;
}
/* Form Validation */
.form-control.is-valid {
border-color: var(--color-success);
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23059669' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
background-repeat: no-repeat;
background-position: right var(--spacing-3) center;
background-size: 1rem 1rem;
padding-left: var(--spacing-10);
}
.form-control.is-invalid {
border-color: var(--color-error);
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc2626'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc2626' stroke='none'/%3e%3c/svg%3e");
background-repeat: no-repeat;
background-position: right var(--spacing-3) center;
background-size: 1rem 1rem;
padding-left: var(--spacing-10);
}
.form-text {
display: block;
margin-top: var(--spacing-2);
font-size: var(--text-sm);
color: var(--color-neutral-500);
}
.valid-feedback {
display: none;
width: 100%;
margin-top: var(--spacing-2);
font-size: var(--text-sm);
color: var(--color-success);
}
.invalid-feedback {
display: none;
width: 100%;
margin-top: var(--spacing-2);
font-size: var(--text-sm);
color: var(--color-error);
}
.is-valid ~ .valid-feedback {
display: block;
}
.is-invalid ~ .invalid-feedback {
display: block;
}
/* ========== ALERTS ========== */
.alert {
position: relative;
padding: var(--spacing-4);
margin-bottom: var(--spacing-4);
border: 1px solid transparent;
border-radius: var(--radius-md);
}
.alert-primary {
color: var(--color-primary-800);
background-color: var(--color-primary-50);
border-color: var(--color-primary-200);
}
.alert-secondary {
color: var(--color-secondary-800);
background-color: var(--color-secondary-50);
border-color: var(--color-secondary-200);
}
.alert-success {
color: var(--color-success);
background-color: color-mix(in srgb, var(--color-success) 10%, white);
border-color: color-mix(in srgb, var(--color-success) 30%, white);
}
.alert-danger {
color: var(--color-error);
background-color: color-mix(in srgb, var(--color-error) 10%, white);
border-color: color-mix(in srgb, var(--color-error) 30%, white);
}
.alert-warning {
color: var(--color-warning);
background-color: color-mix(in srgb, var(--color-warning) 10%, white);
border-color: color-mix(in srgb, var(--color-warning) 30%, white);
}
.alert-info {
color: var(--color-info);
background-color: color-mix(in srgb, var(--color-info) 10%, white);
border-color: color-mix(in srgb, var(--color-info) 30%, white);
}
.alert-dismissible {
padding-left: var(--spacing-12);
}
.alert-dismissible .btn-close {
position: absolute;
top: var(--spacing-4);
left: var(--spacing-4);
}
/* ========== BADGES ========== */
.badge {
display: inline-block;
padding: 0.25em 0.6em;
font-size: var(--text-xs);
font-weight: var(--font-weight-semibold);
line-height: 1;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
border-radius: var(--radius-full);
}
.badge-primary {
background-color: var(--color-primary-500);
color: var(--color-neutral-0);
}
.badge-secondary {
background-color: var(--color-secondary-500);
color: var(--color-neutral-0);
}
.badge-success {
background-color: var(--color-success);
color: var(--color-neutral-0);
}
.badge-danger {
background-color: var(--color-error);
color: var(--color-neutral-0);
}
.badge-warning {
background-color: var(--color-warning);
color: var(--color-neutral-0);
}
.badge-info {
background-color: var(--color-info);
color: var(--color-neutral-0);
}
.badge-pill {
padding-right: 0.8em;
padding-left: 0.8em;
}
/* ========== MODALS ========== */
.modal {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: var(--z-index-modal);
display: flex;
align-items: center;
justify-content: center;
padding: var(--spacing-4);
background-color: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(4px);
opacity: 0;
visibility: hidden;
transition: all var(--transition-duration-300) var(--transition-timing-function-ease);
}
.modal.show {
opacity: 1;
visibility: visible;
}
.modal-dialog {
width: 100%;
max-width: 500px;
margin: auto;
background: var(--color-neutral-0);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-2xl);
transform: translateY(-20px);
transition: transform var(--transition-duration-300) var(--transition-timing-function-ease);
}
.modal.show .modal-dialog {
transform: translateY(0);
}
.modal-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
padding: var(--spacing-4);
border-bottom: 1px solid var(--color-neutral-200);
}
.modal-title {
margin-bottom: 0;
font-size: var(--text-lg);
font-weight: var(--font-weight-semibold);
}
.modal-body {
padding: var(--spacing-4);
}
.modal-footer {
display: flex;
align-items: center;
justify-content: flex-end;
gap: var(--spacing-2);
padding: var(--spacing-4);
border-top: 1px solid var(--color-neutral-200);
}
.btn-close {
width: 1.5rem;
height: 1.5rem;
padding: 0;
background: transparent;
border: none;
opacity: 0.5;
cursor: pointer;
transition: opacity var(--transition-duration-200) var(--transition-timing-function-ease);
}
.btn-close:hover {
opacity: 1;
}
.btn-close::before {
content: "×";
font-size: 1.5rem;
font-weight: var(--font-weight-bold);
line-height: 1;
color: var(--color-neutral-500);
}
/* ========== LOADING SPINNER ========== */
.spinner {
display: inline-block;
width: 2rem;
height: 2rem;
vertical-align: text-bottom;
border: 0.25em solid currentColor;
border-right-color: transparent;
border-radius: var(--radius-full);
animation: spin 0.75s linear infinite;
}
.spinner-sm {
width: 1rem;
height: 1rem;
border-width: 0.2em;
}
.spinner-lg {
width: 3rem;
height: 3rem;
border-width: 0.3em;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* ========== TOOLTIPS ========== */
.tooltip {
position: absolute;
z-index: var(--z-index-tooltip);
display: block;
padding: var(--spacing-2) var(--spacing-3);
font-size: var(--text-xs);
color: var(--color-neutral-0);
background-color: var(--color-neutral-800);
border-radius: var(--radius-sm);
white-space: nowrap;
opacity: 0;
transition: opacity var(--transition-duration-200) var(--transition-timing-function-ease);
pointer-events: none;
}
.tooltip.show {
opacity: 1;
}
.tooltip-arrow {
position: absolute;
display: block;
width: 0.8rem;
height: 0.4rem;
}
.tooltip-arrow::before {
content: "";
position: absolute;
border-color: transparent;
border-style: solid;
}
/* ========== AVATARS ========== */
.avatar {
display: inline-flex;
align-items: center;
justify-content: center;
width: 2.5rem;
height: 2.5rem;
font-size: var(--text-base);
font-weight: var(--font-weight-semibold);
color: var(--color-neutral-0);
background: linear-gradient(135deg, var(--color-primary-400), var(--color-primary-600));
border-radius: var(--radius-full);
overflow: hidden;
}
.avatar-sm {
width: 2rem;
height: 2rem;
font-size: var(--text-sm);
}
.avatar-lg {
width: 3rem;
height: 3rem;
font-size: var(--text-lg);
}
.avatar-xl {
width: 4rem;
height: 4rem;
font-size: var(--text-xl);
}
.avatar img {
width: 100%;
height: 100%;
object-fit: cover;
}
/* ========== PROGRESS BARS ========== */
.progress {
display: flex;
height: 1rem;
overflow: hidden;
background-color: var(--color-neutral-200);
border-radius: var(--radius-full);
}
.progress-bar {
display: flex;
flex-direction: column;
justify-content: center;
overflow: hidden;
color: var(--color-neutral-0);
text-align: center;
white-space: nowrap;
background-color: var(--color-primary-500);
transition: width var(--transition-duration-500) var(--transition-timing-function-ease);
}
.progress-bar-striped {
background-image: linear-gradient(45deg,
rgba(255, 255, 255, 0.15) 25%,
transparent 25%,
transparent 50%,
rgba(255, 255, 255, 0.15) 50%,
rgba(255, 255, 255, 0.15) 75%,
transparent 75%,
transparent
);
background-size: 1rem 1rem;
}
.progress-bar-animated {
animation: progress-bar-stripes 1s linear infinite;
}
@keyframes progress-bar-stripes {
0% { background-position: 1rem 0; }
100% { background-position: 0 0; }
}
/* ========== DROPDOWNS ========== */
.dropdown {
position: relative;
display: inline-block;
}
.dropdown-toggle {
display: inline-flex;
align-items: center;
gap: var(--spacing-2);
}
.dropdown-menu {
position: absolute;
top: 100%;
right: 0;
z-index: var(--z-index-dropdown);
display: none;
min-width: 10rem;
padding: var(--spacing-2) 0;
margin: var(--spacing-1) 0 0;
font-size: var(--text-base);
color: var(--color-neutral-800);
background-color: var(--color-neutral-0);
border: 1px solid var(--color-neutral-200);
border-radius: var(--radius-md);
box-shadow: var(--shadow-lg);
}
.dropdown-menu.show {
display: block;
}
.dropdown-item {
display: block;
width: 100%;
padding: var(--spacing-2) var(--spacing-4);
clear: both;
font-weight: var(--font-weight-normal);
color: var(--color-neutral-700);
text-align: inherit;
text-decoration: none;
white-space: nowrap;
background-color: transparent;
border: 0;
cursor: pointer;
transition: all var(--transition-duration-200) var(--transition-timing-function-ease);
}
.dropdown-item:hover,
.dropdown-item:focus {
color: var(--color-neutral-900);
background-color: var(--color-neutral-100);
}
.dropdown-divider {
height: 0;
margin: var(--spacing-2) 0;
overflow: hidden;
border-top: 1px solid var(--color-neutral-200);
}