/* انیمیشنهای پیشرفته */
.fade-enter-active, .fade-leave-active { transition: opacity 0.3s ease; }
.fade-enter-from, .fade-leave-to { opacity: 0; }
.slide-up-enter-active, .slide-up-leave-active { transition: all 0.3s ease; }
.slide-up-enter-from, .slide-up-leave-to { opacity: 0; transform: translateY(20px); }
/* افکتهای هاور پیشرفته */
.hover-lift { transition: all 0.3s ease; }
.hover-lift:hover { transform: translateY(-2px); box-shadow: 0 10px 25px rgba(0,0,0,0.1); }
/* لودر زیبا */
.loading-spinner { border: 3px solid #f3f3f3; border-top: 3px solid #2563eb; border-radius: 50%; width: 24px; height: 24px; animation: spin 1s linear infinite; }
@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
/* افکت شیشهای */
.glass-effect { backdrop-filter: blur(10px); background: rgba(255, 255, 255, 0.9); }
/* انیمیشن پالس برای دکمهها */
.pulse-animation { animation: pulse 2s infinite; }
@keyframes pulse { 0% { box-shadow: 0 0 0 0 rgba(37, 99, 235, 0.7); } 70% { box-shadow: 0 0 0 10px rgba(37, 99, 235, 0); } 100% { box-shadow: 0 0 0 0 rgba(37, 99, 235, 0); } }
/* استایلهای واکنشگرا */
.container-responsive {
width: 100%;
max-width: 1400px;
margin: 0 auto;
padding: 0 1rem;
}
/* موبایل اول - طراحی واکنشگرا */
@media (max-width: 640px) {
.container-responsive {
padding: 0 0.5rem;
}
.text-xs {
font-size: 0.65rem;
}
.text-sm {
font-size: 0.75rem;
}
.p-4 {
padding: 0.75rem;
}
.p-6 {
padding: 1rem;
}
.grid-cols-2 {
grid-template-columns: 1fr;
}
.md\:grid-cols-2 {
grid-template-columns: 1fr;
}
.md\:grid-cols-4 {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 768px) {
.mobile-nav-container {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: rgba(255, 255, 255, 0.98);
border-top: 1px solid #cbd5e1;
z-index: 100;
padding-bottom: env(safe-area-inset-bottom);
height: 60px;
box-shadow: 0 -4px 15px rgba(0,0,0,0.08);
display: block !important;
}
.desktop-sidebar {
display: none !important;
}
.main-content {
margin-right: 0 !important;
padding-bottom: 80px !important;
}
.search-box {
width: 100% !important;
}
.grid-cols-2 {
grid-template-columns: 1fr;
}
.md\:grid-cols-2 {
grid-template-columns: 1fr;
}
.lg\:grid-cols-4 {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 769px) {
.mobile-nav-container {
display: none !important;
}
.desktop-sidebar {
display: flex !important;
}
.main-content {
margin-right: 16rem !important;
padding-bottom: 2rem !important;
}
}
/* بهبود اسکرول */
.main-content {
overflow-y: auto;
overflow-x: hidden;
min-height: 100vh;
}
.desktop-sidebar {
overflow-y: auto;
overflow-x: hidden;
}
/* استایل برای موبایل */
.mobile-nav-flex {
display: flex;
justify-content: space-around;
align-items: center;
height: 100%;
width: 100%;
}
.nav-item {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: #94a3b8;
font-size: 0.65rem;
transition: all 0.2s;
height: 100%;
padding-top: 4px;
}
.nav-item.active {
color: #2563eb;
font-weight: 800;
}
.nav-item.active i {
transform: translateY(-2px);
color: #2563eb;
}
.nav-item i {
font-size: 1.1rem;
margin-bottom: 2px;
}
/* بهبود جداول برای موبایل */
.table-responsive {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
@media (max-width: 640px) {
.text-xs {
font-size: 0.65rem;
}
.text-sm {
font-size: 0.75rem;
}
.p-4 {
padding: 0.75rem;
}
.p-6 {
padding: 1rem;
}
.rounded-xl {
border-radius: 0.5rem;
}
.text-lg {
font-size: 1rem;
}
}
/* استایل برای صفحات باریک */
@media (max-width: 390px) {
.text-xs {
font-size: 0.6rem;
}
.p-4 {
padding: 0.5rem;
}
.grid-cols-2 {
grid-template-columns: 1fr;
}
.text-lg {
font-size: 0.9rem;
}
}
/* استایل برای تبلت */
@media (min-width: 768px) and (max-width: 1024px) {
.lg\:grid-cols-4 {
grid-template-columns: repeat(2, 1fr);
}
.container-responsive {
padding: 0 1.5rem;
}
}
/* استایل برای دسکتاپ بزرگ */
@media (min-width: 1440px) {
.container-responsive {
max-width: 1600px;
padding: 0 2rem;
}
}
{{ activeTabLabel }}
{{ currentDate }}
نتایج جستجو: {{ searchQuery }}
{{ res.title }}
{{ res.subtitle }}
{{ res.type }}
چیزی یافت نشد.
وضعیت پروژه
پروژه جدید
-- انتخاب پروژه --
{{ p.name }} {{ p.finished ? '(تمام)' : '' }}
-- کل پروژه (همه مراحل) --
فیلتر مرحله: {{ s.name }}
هشدار ثبت تکراری!
این فعالیت قبلاً در {{ duplicateWarning.projectName }} ثبت شده است.
هزینه {{ dashboardStageId ? 'مرحله' : 'کل' }}
{{ formatPrice(projectStats.totalCost) }}
پرداختی (تایید شده)
{{ formatPrice(projectStats.totalPaid) }}
مانده بدهی
{{ formatPrice(projectStats.debt) }}
پیشرفت مالی
{{ projectStats.progress }}%
لطفا ابتدا پروژه را از داشبورد انتخاب کنید.
ثبت هزینه جدید
{{ activeProject.name }}
{{ p.name }}
{{ p.role || '---' }}
{{ getPersonBalanceText(p.id) }}
همه پروژهها
{{ p.name }}
همه اشخاص
{{ p.name }}
همه مراحل
{{ getProjectName(s.projectId) }} - {{ s.name }}
همه انواع
کارکرد
مصالح
پرداخت مستقیم
دانلود PDF
اکسل
حذف فیلتر
شرح
هزینه/کارکرد
پرداختی
مانده
واحد
پروژه
عملیات
{{ getPersonName(t.personId) }}
{{ t.date }} - {{ t.description }}
{{ formatPrice(t.amount) }}
{{ formatPrice(t.paid) }}
{{ formatPrice((t.amount||0)-(t.paid||0)) }}
{{ t.quantity ? t.quantity + ' ' + (t.unit || '') : '-' }}
{{ getProjectName(t.projectId) }}
({{ getStageName(t.stageId) }})
جمع کل هزینه
{{ formatPrice(filteredTransactions.reduce((sum, t) => sum + (t.amount || 0), 0)) }}
جمع پرداختی
{{ formatPrice(filteredTransactions.reduce((sum, t) => sum + (t.paid || 0), 0)) }}
مانده کل
{{ formatPrice(filteredTransactions.reduce((sum, t) => sum + (t.amount || 0) - (t.paid || 0), 0)) }}
فیلترهای انتخاب شخص
همه پروژهها
{{ p.name }}
همه انواع
پرسنل
تامینکننده
همه مراحل
{{ getProjectName(s.projectId) }} - {{ s.name }}
وضعیت حساب
بدهکار
طلبکار
تسویه شده
حذف فیلتر
بروزرسانی
انتخاب شخص ({{ filteredPeopleForPayment.length }} نفر):
-- انتخاب --
{{ p.name }} ({{ p.type === 'employee' ? 'پرسنل' : 'تامینکننده' }}) - {{ getPersonBalanceText(p.id) }}
{{ getPersonBalanceText(paymentPersonId) }}
اقلام تسویه نشده (تیک بزنید)
انتخاب همه
جمع: {{ formatPrice(selectedTotal) }}
هیچ بدهی بازی وجود ندارد.
{{ t.date }}
{{ formatPrice((t.amount||0) - (t.paid||0)) }}
{{ t.description }}
{{ getProjectName(t.projectId) }} ({{ getStageName(t.stageId) }})
تسویه موارد انتخاب شده ({{ selectedTransactionIds.length }} مورد)
انتقال فعالیت به پروژه دیگر
اطلاعات فعلی:
پروژه: {{ getProjectName(transferData.sourceProjectId) }}
مرحله: {{ getStageName(transferData.sourceStageId) || 'بدون مرحله' }}
شخص: {{ getPersonName(transferData.personId) }}
شرح: {{ transferData.description }}
مبلغ: {{ formatPrice(transferData.amount) }}
پروژه مقصد *
-- انتخاب پروژه مقصد --
{{ p.name }}
مرحله مقصد
-- انتخاب مرحله مقصد (اختیاری) --
{{ s.name }}
این فعالیت قبلاً در پروژه مقصد ثبت شده است!
انتقال کامل (حذف از پروژه مبدا)
تأیید انتقال
انصراف
ریز حساب: {{ selectedPerson.name }}
وضعیت کلی:
{{ getPersonBalanceText(selectedPerson.id) }}
حذف این شخص
{{ t.date }}
{{ t.description }} ({{ getProjectName(t.projectId) }})
{{ t.quantity }} {{ t.unit }}
{{ formatPrice(t.amount) }}
پ: {{ formatPrice(t.paid) }}