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