@font-face { font-family: 'IRANSans'; src: url('./assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_UltraLight.woff2') format('woff2'); font-weight: 200; font-style: normal; font-display: swap; } @font-face { font-family: 'IRANSans'; src: url('./assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Light.woff2') format('woff2'); font-weight: 300; font-style: normal; font-display: swap; } @font-face { font-family: 'IRANSans'; src: url('./assets/fonts/iranSans/woff2/IRANSansWeb(FaNum).woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: swap; } @font-face { font-family: 'IRANSans'; src: url('./assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Medium.woff2') format('woff2'); font-weight: 500; font-style: normal; font-display: swap; } @font-face { font-family: 'IRANSans'; src: url('./assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Bold.woff2') format('woff2'); font-weight: 700; font-style: normal; font-display: swap; } @font-face { font-family: 'IRANSans'; src: url('./assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Black.woff2') format('woff2'); font-weight: 900; font-style: normal; font-display: swap; } :root { --bg: #eef2f7; --panel: #ffffff; --ink: #2d3748; --ink-soft: #8b95a8; --line: #e8eef5; --teal: #20c997; --teal-deep: #168f81; --purple: #7c5cfc; --coral: #ff6b6b; --orange: #ffb84d; --shadow: 0 12px 32px rgba(45, 55, 72, 0.08); --shadow-hover: 0 18px 40px rgba(45, 55, 72, 0.12); --radius: 24px; --font-ui: 'IRANSans', Tahoma, sans-serif; --font-dana: var(--font-ui); font-family: var(--font-ui); } * { box-sizing: border-box; } html, body, #app { margin: 0; min-height: 100%; max-width: 100%; font-family: var(--font-ui); } html { overflow-x: hidden; } body { color: var(--ink); background: var(--bg); -webkit-font-smoothing: antialiased; overflow-x: hidden; } button, input, textarea, select, .ant-btn, .ant-input, .ant-select, .ant-menu, .ant-modal, .ant-message, .ant-form, .ant-typography, .ant-tabs { font-family: var(--font-ui) !important; } .brand-mark { font-weight: 800; color: var(--ink); } .page-shell { background: var(--panel); border-radius: var(--radius); padding: 16px; color: var(--ink); box-shadow: var(--shadow); width: 100%; max-width: 100%; min-width: 0; overflow-x: clip; } @media (min-width: 768px) { .page-shell { padding: 28px; } } .page-title { margin: 0; font-size: 1.2rem; color: var(--ink); font-weight: 800; overflow-wrap: break-word; word-break: normal; } @media (min-width: 768px) { .page-title { font-size: 1.35rem; } } .page-sub { margin-top: 6px; color: var(--ink-soft); font-size: 0.92rem; line-height: 1.7; overflow-wrap: break-word; } .page-domain { direction: ltr; unicode-bidi: isolate; overflow-wrap: anywhere; word-break: break-word; } .page-head { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 8px 10px; margin-bottom: 16px; width: 100%; min-width: 0; } .page-head-back { flex: 0 0 auto; } .page-head-text { flex: 1 1 0; min-width: 0; } .page-head-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; min-width: 0; } @media (max-width: 767px) { .page-head-actions, .page-head .page-nav-slot, .head-aside { flex: 1 1 100%; width: 100%; margin-inline-start: 0; } .page-head-actions { flex-direction: column; align-items: stretch; } .page-head-actions > * { width: 100%; justify-content: space-between; } } @media (min-width: 768px) { .page-head-actions { flex: 0 1 auto; margin-inline-start: auto; } } .sa-modal-wrap .ant-modal { max-width: calc(100vw - 24px); top: 12px; padding-bottom: 12px; } .dash-modules { display: grid; gap: 14px; margin-top: 22px; } @media (min-width: 640px) { .dash-modules { grid-template-columns: 1fr 1fr; gap: 16px; } } @media (min-width: 1100px) { .dash-modules { grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); } } .module-card { appearance: none; border: none; text-align: right; cursor: pointer; font-family: inherit; background: #fff; border-radius: 22px; padding: 18px; box-shadow: var(--shadow); transition: transform 0.18s ease, box-shadow 0.18s ease; min-height: 168px; display: flex; flex-direction: column; justify-content: space-between; position: relative; overflow: hidden; } .module-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-hover); } .module-card .icon-wrap { width: 48px; height: 48px; border-radius: 16px; display: grid; place-items: center; color: #fff; font-size: 22px; margin-bottom: 14px; } .module-card.sms .icon-wrap { background: linear-gradient(145deg, #9b7cff, #7c5cfc); } .module-card.server .icon-wrap { background: linear-gradient(145deg, #ff8a8a, #ff6b6b); } .module-card.plugin .icon-wrap { background: linear-gradient(145deg, #5ec8e8, #2aa8cc); } .module-card.support .icon-wrap { background: linear-gradient(145deg, #60a5fa, #3b82f6); } .module-card.admins .icon-wrap { background: linear-gradient(145deg, #5b8def, #3b6fd4); } .module-card.hamkar .icon-wrap { background: linear-gradient(145deg, #3ad4b0, #20c997); } .module-card.khanegi .icon-wrap { background: linear-gradient(145deg, #ffc86b, #ffb84d); } .module-card h3 { margin: 0; font-size: 1.1rem; font-weight: 800; color: var(--ink); } .module-card p { margin: 8px 0 0; color: var(--ink-soft); font-size: 0.86rem; line-height: 1.7; } .module-card .module-meta { margin-top: 16px; display: flex; justify-content: space-between; align-items: center; gap: 8px; color: var(--ink-soft); font-size: 0.8rem; font-weight: 600; } .module-card .progress { height: 6px; border-radius: 999px; background: #edf2f7; overflow: hidden; margin-top: 10px; } .module-card .progress > span { display: block; height: 100%; border-radius: inherit; } .module-card.sms .progress > span { background: #7c5cfc; width: 72%; } .module-card.server .progress > span { background: #ff6b6b; width: 54%; } .module-card.plugin .progress > span { background: #2aa8cc; width: 58%; } .module-card.support .progress > span { background: #3b82f6; width: 62%; } .module-card.admins .progress > span { background: #3b6fd4; width: 66%; } .module-card.hamkar .progress > span { background: #20c997; width: 80%; } .module-card.khanegi .progress > span { background: #ffb84d; width: 68%; } .toolbar { display: flex; flex-wrap: wrap; gap: 10px; margin: 14px 0 16px; width: 100%; min-width: 0; } .toolbar > .ant-input-affix-wrapper { flex: 1 1 100%; min-width: 0 !important; max-width: 100%; } @media (min-width: 640px) { .toolbar > .ant-input-affix-wrapper { flex: 1 1 14rem; } } @media (max-width: 639px) { .toolbar > .ant-btn { flex: 1 1 calc(50% - 10px); } } .version-list { display: grid; gap: 12px; } .version-card { border: 1px solid var(--line); border-radius: 18px; padding: 14px; background: #fff; transition: border-color 0.15s ease, box-shadow 0.15s ease; } .version-card:hover { border-color: rgba(32, 201, 151, 0.35); box-shadow: var(--shadow); } .version-card-head { display: flex; gap: 12px; align-items: flex-start; } .version-avatar { width: 52px; height: 52px; border-radius: 16px; object-fit: cover; background: #f1f5f9; flex-shrink: 0; } .version-avatar.fallback { display: grid; place-items: center; color: #fff; font-weight: 800; font-size: 1.1rem; } .version-meta { flex: 1; min-width: 0; } .version-meta h3 { margin: 0; font-size: 1.05rem; color: var(--ink); font-weight: 800; } .version-meta .domain { margin-top: 4px; color: var(--ink-soft); font-size: 0.85rem; word-break: break-all; } .version-meta .created-at { margin-top: 4px; color: #94a3b8; font-size: 0.8rem; } .version-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; } .audit-list { display: grid; gap: 10px; } .audit-item { border: 1px solid var(--line); border-radius: 16px; padding: 12px 14px; background: #fff; } .audit-item .when { color: var(--ink-soft); font-size: 0.8rem; } .audit-item .action { margin-top: 4px; font-weight: 700; color: var(--ink); } .form-section { margin-bottom: 18px; padding-bottom: 14px; border-bottom: 1px solid var(--line); } .form-section:last-of-type { border-bottom: none; } .form-section h3 { margin: 0 0 12px; font-size: 0.98rem; color: var(--ink); font-weight: 800; } .sticky-actions { position: sticky; bottom: 12px; display: flex; gap: 8px; padding-top: 12px; background: linear-gradient(to top, #fff 72%, rgba(255, 255, 255, 0)); } .login-shell { min-height: 100vh; display: grid; place-items: center; padding: 20px; background: radial-gradient(600px 320px at 90% 0%, rgba(32, 201, 151, 0.18), transparent 60%), radial-gradient(520px 280px at 0% 100%, rgba(124, 92, 252, 0.14), transparent 55%), #eef2f7; } .login-card { width: min(440px, 100%); border-radius: 28px !important; border: none !important; background: #fff !important; box-shadow: var(--shadow) !important; } .login-card :deep(.ant-card-body) { padding: 28px 24px; } .login-kicker { display: inline-flex; align-items: center; gap: 8px; padding: 6px 12px; border-radius: 999px; background: rgba(32, 201, 151, 0.12); color: var(--teal-deep); font-size: 0.8rem; font-weight: 700; margin-bottom: 14px; } .hint-box { margin-top: 18px; padding: 14px 16px; border-radius: 18px; background: #f5f8fc; color: var(--ink-soft); font-size: 0.85rem; line-height: 1.8; } .placeholder-hero { border-radius: 22px; padding: 22px; color: #fff; margin-bottom: 16px; } .placeholder-hero.sms { background: linear-gradient(135deg, #9b7cff, #7c5cfc); } .placeholder-hero.server { background: linear-gradient(135deg, #ff8a8a, #ff6b6b); } .tenant-panel-shortcuts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; margin: 0 0 16px; } .tenant-panel-shortcuts-loading { grid-column: 1 / -1; border-radius: 14px; background: #f5f7fb; padding: 12px 14px; color: #7b8798; font-size: 0.85rem; } .tenant-panel-status-card { border: none; border-radius: 14px; padding: 10px 12px; text-align: right; font-family: inherit; cursor: pointer; display: grid; gap: 2px; color: #17324d; box-shadow: 0 6px 16px rgba(23, 50, 77, 0.08); transition: transform 0.15s ease, box-shadow 0.15s ease; min-width: 0; } .tenant-panel-status-card:hover { transform: translateY(-1px); box-shadow: var(--shadow); } .tenant-panel-status-card .card-top { display: flex; align-items: center; gap: 6px; min-width: 0; } .tenant-panel-status-card .card-icon { display: inline-grid; place-items: center; font-size: 14px; opacity: 0.85; flex-shrink: 0; } .tenant-panel-status-card strong { font-size: 0.88rem; overflow-wrap: break-word; } .tenant-panel-status-card .card-value, .tenant-panel-status-card .card-meta { color: inherit; opacity: 0.92; font-size: 0.82rem; line-height: 1.45; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .tenant-panel-status-card.healthy { background: linear-gradient(135deg, #dff8ea, #c3efd7); } .tenant-panel-status-card.warning { background: linear-gradient(135deg, #fff4c7, #ffe39a); } .tenant-panel-status-card.critical { background: linear-gradient(135deg, #ffd8d8, #ffb9b9); } .tenant-panel-status-card.dedicated { background: linear-gradient(135deg, #e8eef8, #d6e0f5); } .tenant-panel-status-card.unknown { background: linear-gradient(135deg, #eef2f7, #dde5ef); } @media (max-width: 720px) { .tenant-panel-shortcuts { grid-template-columns: 1fr; } }