/** * Montact CRM (منتکت) Design System - Core Tokens & Utilities * RTL-first, IRANSans typography, unified spacing, controls & surfaces. */ /* ========================================================================== Page Layout ========================================================================== */ .crm-page, .page, .dashboard, .profile, .notes-page { display: flex; flex-direction: column; gap: var(--sp-5); padding: 0; margin: 0; max-width: 100%; width: 100%; min-width: 0; box-sizing: border-box; } .crm-page.narrow, .crm-page.wide, .crm-page.full { max-width: 100%; } .crm-page.embedded { padding: 0; gap: var(--sp-4); } /* ========================================================================== Page Header ========================================================================== */ .crm-page-header { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: var(--sp-4); min-width: 0; } .crm-page-header-titles { display: flex; flex-direction: column; gap: var(--sp-1); min-width: 0; } .crm-page-title { margin: 0; font-size: var(--fs-xl); font-weight: var(--fw-bold); color: var(--ink); line-height: var(--lh-tight); } .crm-page-lead { margin: 0; font-size: var(--fs-sm); color: var(--muted); line-height: var(--lh-normal); } .crm-header-actions { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-2); } /* ========================================================================== Toolbar & Filter Bar ========================================================================== */ .crm-toolbar { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-3); min-width: 0; width: 100%; } .crm-toolbar-stretch, .crm-toolbar .toolbar-search, .crm-toolbar .search-box, .crm-toolbar .crm-search { flex: 1 1 200px; min-width: 180px; max-width: 380px; } .crm-toolbar .toolbar-select, .crm-toolbar .ui-select:not(.block) { width: auto; min-width: 130px; max-width: 220px; } .crm-toolbar .ui-btn, .crm-toolbar .btn { flex-shrink: 0; } /* ========================================================================== Card & Container Surfaces ========================================================================== */ .crm-card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow-xs); padding: var(--sp-5); box-sizing: border-box; transition: box-shadow var(--transition-fast), border-color var(--transition-fast); } .crm-card-sm { padding: var(--sp-3); } .crm-card-lg { padding: var(--sp-6); } .crm-card-interactive:hover { border-color: var(--line-strong); box-shadow: var(--shadow-sm); } .crm-card-header { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); padding-bottom: var(--sp-3); margin-bottom: var(--sp-4); border-bottom: 1px solid var(--line-light); } .crm-card-title { margin: 0; font-size: var(--fs-md); font-weight: var(--fw-semibold); color: var(--ink); } .crm-card-actions { display: flex; align-items: center; gap: var(--sp-2); } /* ========================================================================== Forms & Field Layouts ========================================================================== */ .crm-form { display: flex; flex-direction: column; gap: var(--sp-5); width: 100%; } .crm-form-section { display: flex; flex-direction: column; gap: var(--sp-3); } .crm-form-section-title { margin: 0; font-size: var(--fs-md); font-weight: var(--fw-semibold); color: var(--ink); padding-bottom: var(--sp-2); border-bottom: 1px solid var(--line-light); } .crm-form-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--sp-4); width: 100%; } .crm-form-grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--sp-4); width: 100%; } .crm-form-grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--sp-4); width: 100%; } .crm-form-grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--sp-4); width: 100%; } .crm-col-span-2 { grid-column: span 2; } .crm-col-span-full { grid-column: 1 / -1; } .crm-field { display: flex; flex-direction: column; gap: var(--sp-1); min-width: 0; } .crm-label { display: flex; align-items: center; gap: var(--sp-1); font-size: var(--fs-sm); font-weight: var(--fw-medium); color: var(--ink-secondary); } .crm-required-indicator { color: var(--danger); } .crm-hint { font-size: var(--fs-xs); color: var(--muted); line-height: var(--lh-normal); } .crm-field-error { font-size: var(--fs-xs); color: var(--danger); font-weight: var(--fw-medium); display: flex; align-items: center; gap: var(--sp-1); } .crm-form-actions { display: flex; align-items: center; justify-content: flex-start; gap: var(--sp-3); padding-top: var(--sp-4); margin-top: var(--sp-2); border-top: 1px solid var(--line-light); flex-wrap: wrap; } /* ========================================================================== Data Table ========================================================================== */ .crm-table-container { width: 100%; overflow-x: auto; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow-xs); -webkit-overflow-scrolling: touch; } .crm-table { width: 100%; border-collapse: collapse; text-align: right; font-size: var(--fs-sm); } .crm-table th { background: var(--surface-subtle); color: var(--muted); font-weight: var(--fw-semibold); padding: var(--sp-3) var(--sp-4); border-bottom: 1px solid var(--line); white-space: nowrap; } .crm-table td { padding: var(--sp-3) var(--sp-4); border-bottom: 1px solid var(--line-light); color: var(--ink); vertical-align: middle; } .crm-table tbody tr:last-child td { border-bottom: none; } .crm-table tbody tr:hover td { background: var(--surface-hover); } .crm-table-actions { display: inline-flex; align-items: center; gap: var(--sp-1); white-space: nowrap; } /* ========================================================================== Badges & Status Indicators ========================================================================== */ .crm-badge { display: inline-flex; align-items: center; justify-content: center; gap: 0.35rem; padding: 0.2rem 0.6rem; border-radius: var(--radius-full); font-size: var(--fs-xs); font-weight: var(--fw-semibold); line-height: 1.2; white-space: nowrap; border: 1px solid transparent; } .crm-badge-sm { padding: 0.1rem 0.45rem; font-size: 0.7rem; } .crm-badge-neutral { background: var(--surface-subtle); color: var(--ink-secondary); border-color: var(--line); } .crm-badge-accent, .crm-badge-primary { background: var(--accent-soft); color: var(--accent-deep); border-color: color-mix(in srgb, var(--accent) 30%, transparent); } .crm-badge-success { background: var(--success-soft); color: var(--success-deep); border-color: color-mix(in srgb, var(--success) 30%, transparent); } .crm-badge-warning { background: var(--warning-soft); color: var(--warning-deep); border-color: color-mix(in srgb, var(--warning) 30%, transparent); } .crm-badge-danger { background: var(--danger-soft); color: var(--danger); border-color: color-mix(in srgb, var(--danger) 30%, transparent); } .crm-badge-info { background: var(--info-soft); color: var(--info-deep); border-color: color-mix(in srgb, var(--info) 30%, transparent); } /* ========================================================================== Pagination ========================================================================== */ .crm-pagination { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: var(--sp-3); padding-top: var(--sp-3); } .crm-pagination-info { font-size: var(--fs-sm); color: var(--muted); } .crm-pagination-nav { display: inline-flex; align-items: center; gap: var(--sp-1); } /* ========================================================================== Empty States ========================================================================== */ .crm-empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; padding: var(--sp-10) var(--sp-6); gap: var(--sp-3); color: var(--muted); background: var(--surface); border: 1px dashed var(--line-strong); border-radius: var(--radius); } .crm-empty-title { margin: 0; font-size: var(--fs-md); font-weight: var(--fw-semibold); color: var(--ink); } .crm-empty-desc { margin: 0; font-size: var(--fs-sm); max-width: 360px; line-height: var(--lh-relaxed); } /* ========================================================================== Typography Utilities ========================================================================== */ .crm-text-xs { font-size: var(--fs-xs); } .crm-text-sm { font-size: var(--fs-sm); } .crm-text-base { font-size: var(--fs-base); } .crm-text-md { font-size: var(--fs-md); } .crm-text-lg { font-size: var(--fs-lg); } .crm-text-xl { font-size: var(--fs-xl); } .crm-text-2xl { font-size: var(--fs-2xl); } .crm-font-normal { font-weight: var(--fw-normal); } .crm-font-medium { font-weight: var(--fw-medium); } .crm-font-semibold { font-weight: var(--fw-semibold); } .crm-font-bold { font-weight: var(--fw-bold); } .crm-font-extrabold { font-weight: var(--fw-extrabold); } .crm-text-ink { color: var(--ink); } .crm-text-secondary { color: var(--ink-secondary); } .crm-text-muted { color: var(--muted); } .crm-text-accent { color: var(--accent); } .crm-text-danger { color: var(--danger); } .crm-text-success { color: var(--success); } .crm-text-warning { color: var(--warning); } /* ========================================================================== Responsive Breakpoints ========================================================================== */ @media (max-width: 900px) { .crm-page { padding: 0; gap: var(--sp-4); } .crm-page-title { font-size: var(--fs-xl); } .crm-page-header { flex-direction: column; align-items: stretch; gap: var(--sp-3); } .crm-header-actions { justify-content: stretch; } .crm-header-actions > * { flex: 1 1 auto; } .crm-form-grid-2, .crm-form-grid-3, .crm-form-grid-4 { grid-template-columns: 1fr; } .crm-col-span-2 { grid-column: auto; } .crm-pagination { flex-direction: column; align-items: center; } }