hesabixCore/webUI/src/views/wizard/home.vue

782 lines
25 KiB
Vue
Raw Normal View History

2025-04-12 18:50:34 +03:30
<template>
2025-05-04 01:07:39 +03:30
<v-toolbar color="toolbar" title="هوش مصنوعی حسابیکس">
2025-07-18 02:30:04 +03:30
<v-spacer></v-spacer>
<!-- نمایش وضعیت سرویس -->
<div class="d-flex align-center mr-4">
<v-chip
:color="aiSettings.aiEnabled ? 'success' : 'error'"
size="small"
variant="flat"
class="mr-2"
>
<v-icon start size="16">
{{ aiSettings.aiEnabled ? 'mdi-robot' : 'mdi-robot-off' }}
</v-icon>
{{ aiSettings.aiEnabled ? 'فعال' : 'غیرفعال' }}
</v-chip>
<span class="text-caption text-medium-emphasis">
{{ aiSettings.aiAgentSource.toUpperCase() }} - {{ aiSettings.aiModel }}
</span>
</div>
<!-- نمایش وضعیت اتصال -->
<div class="d-flex align-center mr-4">
<v-chip
:color="connectionStatus.color"
size="small"
variant="flat"
class="mr-2"
>
<v-icon start size="16">
{{ connectionStatus.icon }}
</v-icon>
{{ connectionStatus.text }}
</v-chip>
</div>
2025-05-04 01:07:39 +03:30
</v-toolbar>
<div class="page-container">
2025-07-18 02:30:04 +03:30
<!-- کارت اطلاعات قیمتگذاری -->
<div class="pricing-info" v-if="aiSettings.aiEnabled">
<v-card variant="outlined" class="ma-4" elevation="0">
<v-card-text class="pa-4">
<div class="d-flex align-center justify-space-between">
<div class="d-flex align-center">
<v-icon color="info" class="mr-2">mdi-currency-usd</v-icon>
<span class="text-subtitle-2">قیمتگذاری توکنها:</span>
</div>
<div class="d-flex align-center gap-4">
<div class="text-center">
<div class="text-caption text-medium-emphasis">ورودی</div>
<div class="text-body-2 font-weight-medium">{{ aiSettings.inputTokenPrice.toLocaleString('fa-IR') }} ریال</div>
</div>
<v-divider vertical></v-divider>
<div class="text-center">
<div class="text-caption text-medium-emphasis">خروجی</div>
<div class="text-body-2 font-weight-medium">{{ aiSettings.outputTokenPrice.toLocaleString('fa-IR') }} ریال</div>
</div>
<div class="text-caption text-medium-emphasis">(به ازای هر 1000 توکن)</div>
</div>
</div>
</v-card-text>
</v-card>
</div>
<!-- آمار استفاده -->
<div class="usage-stats" v-if="userMessages.length > 0">
<v-card variant="outlined" class="ma-4" elevation="0">
<v-card-text class="pa-4">
<div class="d-flex align-center justify-space-between">
<div class="d-flex align-center">
<v-icon color="success" class="mr-2">mdi-chart-line</v-icon>
<span class="text-subtitle-2">آمار استفاده:</span>
</div>
<div class="d-flex align-center gap-4">
<div class="text-center">
<div class="text-caption text-medium-emphasis">کل پیامها</div>
<div class="text-body-2 font-weight-medium">{{ userMessages.length }}</div>
</div>
<v-divider vertical></v-divider>
<div class="text-center">
<div class="text-caption text-medium-emphasis">پیامهای هوش مصنوعی</div>
<div class="text-body-2 font-weight-medium">{{ aiMessageCount }}</div>
</div>
<v-divider vertical></v-divider>
<div class="text-center">
<div class="text-caption text-medium-emphasis">پیامهای کاربر</div>
<div class="text-body-2 font-weight-medium">{{ userMessageCount }}</div>
</div>
</div>
</div>
</v-card-text>
</v-card>
</div>
2025-05-04 01:07:39 +03:30
<div class="content-container">
<v-card class="chat-container" elevation="0">
<div class="chat-box">
<div class="messages-container" ref="messagesContainer">
<!-- پیام هوش مصنوعی -->
<div class="message ai-message" v-if="displayWelcome">
<v-avatar color="#1a237e" size="36" class="mr-2">
<v-icon color="white" size="20">mdi-robot</v-icon>
</v-avatar>
<div class="message-content">
<div class="message-text typing-text">{{ displayWelcome }}</div>
</div>
</div>
<!-- پیامهای کاربر و پاسخهای هوش مصنوعی -->
<template v-for="(message, index) in userMessages" :key="index">
<!-- پیام کاربر -->
<div class="message user-message" v-if="typeof message === 'string'">
<div class="message-content">
<div class="message-text">{{ message }}</div>
2025-07-18 02:30:04 +03:30
<div class="message-time">{{ formatTime(new Date()) }}</div>
2025-05-04 01:07:39 +03:30
</div>
<v-avatar color="grey lighten-2" size="36" class="ml-2">
<v-icon color="grey darken-1" size="20">mdi-account</v-icon>
</v-avatar>
</div>
<!-- پیام هوش مصنوعی -->
<div class="message ai-message" v-else-if="message && message.isAI">
<v-avatar color="#1a237e" size="36" class="mr-2">
<v-icon color="white" size="20">mdi-robot</v-icon>
</v-avatar>
<div class="message-content" :class="{ 'details-message': message.isDetails }">
<div class="message-text" v-html="message.text.replace(/\n/g, '<br>')"></div>
2025-07-18 02:30:04 +03:30
<div class="message-time">{{ formatTime(new Date()) }}</div>
2025-05-04 01:07:39 +03:30
</div>
</div>
</template>
<!-- نشانگر تایپ -->
<div class="message ai-message" v-if="isTyping">
<v-avatar color="#1a237e" size="36" class="mr-2">
<v-icon color="white" size="20">mdi-robot</v-icon>
</v-avatar>
<div class="message-content">
<div class="message-text">
<span class="typing-indicator">
<span></span>
<span></span>
<span></span>
</span>
</div>
</div>
</div>
</div>
<!-- باکس ورودی پیام -->
<div class="input-container">
2025-07-18 02:30:04 +03:30
<div class="d-flex align-center justify-space-between mb-2">
<v-btn
size="small"
variant="text"
color="grey"
@click="clearChat"
:disabled="userMessages.length === 0"
>
<v-icon start size="16">mdi-delete</v-icon>
پاک کردن تاریخچه
</v-btn>
<span class="text-caption text-medium-emphasis">
{{ userMessages.length }} پیام
</span>
</div>
2025-05-04 01:07:39 +03:30
<v-textarea v-model="userMessage" placeholder="پیام خود را اینجا بنویسید..." rows="1" auto-grow hide-details
variant="plain" class="message-input" @keydown.enter.prevent="sendMessage"></v-textarea>
<v-btn color="#1a237e" icon :loading="isLoading" @click="sendMessage" class="send-button"
:disabled="!userMessage.trim()">
<v-icon>mdi-send</v-icon>
</v-btn>
2025-07-18 02:30:04 +03:30
<!-- پیشنمایش پیام -->
<div class="message-preview" v-if="userMessage.trim()">
<div class="text-caption text-medium-emphasis mb-1">پیشنمایش:</div>
<div class="preview-content">
{{ userMessage }}
</div>
</div>
</div>
<!-- پیشنهادات سوالات -->
<div class="suggestions-container" v-if="userMessages.length === 0">
<div class="text-caption text-medium-emphasis mb-2">پیشنهادات:</div>
<div class="d-flex flex-wrap gap-2">
<v-chip
v-for="suggestion in suggestions"
:key="suggestion"
size="small"
variant="outlined"
@click="useSuggestion(suggestion)"
class="suggestion-chip"
>
{{ suggestion }}
</v-chip>
</div>
2025-05-04 01:07:39 +03:30
</div>
</div>
2025-04-12 18:50:34 +03:30
</v-card>
2025-05-04 01:07:39 +03:30
</div>
</div>
2025-04-12 18:50:34 +03:30
</template>
<script>
2025-07-18 02:30:04 +03:30
import axios from 'axios'
2025-04-12 18:50:34 +03:30
export default {
name: 'WizardHome',
data() {
return {
2025-05-04 01:07:39 +03:30
userMessage: '',
isLoading: false,
isTyping: true,
userMessages: [],
2025-07-18 02:30:04 +03:30
aiSettings: {
aiEnabled: false,
aiAgentSource: 'gapgpt',
aiModel: 'gpt-4o',
inputTokenPrice: 0,
outputTokenPrice: 0,
aiPrompt: ''
},
2025-05-04 01:07:39 +03:30
aiResponses: [
{
message: 'با عرض پوزش، در حال حاضر سخت‌افزار پردازش داده متصل نشده است. لطفاً با پشتیبانی فنی تماس بگیرید تا در اسرع وقت مشکل را برطرف کنیم.',
details: 'برای اتصال سخت‌افزار پردازش داده، نیاز به تنظیمات خاصی است که باید توسط تیم فنی انجام شود. این تنظیمات شامل:\n- اتصال به سرور پردازش\n- تنظیم پارامترهای امنیتی\n- راه‌اندازی ماژول‌های پردازشی\nمیباشد.'
},
{
message: 'متأسفانه در حال حاضر سیستم پردازش داده در دسترس نیست. این مشکل موقت است و به زودی برطرف خواهد شد.',
details: 'برای فعال‌سازی کامل سیستم، نیاز به انجام مراحل زیر است:\n- تأیید اتصال به سرور مرکزی\n- راه‌اندازی ماژول‌های پردازشی\n- تنظیم پارامترهای امنیتی\nلطفاً با پشتیبانی فنی تماس بگیرید.'
},
{
message: 'با کمال تأسف، سخت‌افزار پردازش داده هنوز آماده بهره‌برداری نیست. این مشکل به زودی برطرف خواهد شد.',
details: 'برای راه‌اندازی کامل سیستم، تیم فنی در حال انجام مراحل زیر است:\n- نصب و پیکربندی سرور پردازش\n- تنظیم پارامترهای امنیتی\n- راه‌اندازی ماژول‌های پردازشی\nلطفاً با پشتیبانی فنی تماس بگیرید.'
},
{
message: 'در حال حاضر سیستم پردازش داده در حالت تعمیر و نگهداری است. به زودی سرویس‌دهی از سر گرفته خواهد شد.',
details: 'برای فعال‌سازی مجدد سیستم، نیاز به انجام مراحل زیر است:\n- بررسی اتصال به سرور مرکزی\n- به‌روزرسانی ماژول‌های پردازشی\n- تنظیم مجدد پارامترهای امنیتی\nلطفاً با پشتیبانی فنی تماس بگیرید.'
},
{
message: 'با عرض پوزش، سخت‌افزار پردازش داده در حال حاضر غیرفعال است. تیم فنی در حال بررسی و رفع مشکل است.',
details: 'برای فعال‌سازی سیستم، نیاز به انجام مراحل زیر است:\n- تأیید اتصال به سرور پردازش\n- راه‌اندازی ماژول‌های پردازشی\n- تنظیم پارامترهای امنیتی\nلطفاً با پشتیبانی فنی تماس بگیرید.'
}
],
welcomePatterns: [
{
welcome: 'سلام! 👋',
2025-07-18 02:30:04 +03:30
thanks: 'به هوش مصنوعی حسابیکس خوش آمدید! من آماده کمک به شما هستم.'
2025-05-04 01:07:39 +03:30
},
{
welcome: 'درود! 🌟',
2025-07-18 02:30:04 +03:30
thanks: 'خوشحالم که از هوش مصنوعی حسابیکس استفاده می‌کنید. چطور می‌توانم کمک کنم؟'
2025-05-04 01:07:39 +03:30
},
{
welcome: 'سلام و وقت بخیر! ✨',
2025-07-18 02:30:04 +03:30
thanks: 'به عنوان دستیار هوشمند حسابیکس، آماده خدمت‌رسانی به شما هستم.'
2025-05-04 01:07:39 +03:30
},
{
welcome: 'به حسابیکس خوش آمدید! 🚀',
2025-07-18 02:30:04 +03:30
thanks: 'من هوش مصنوعی حسابیکس هستم. سؤال یا درخواست خود را بنویسید.'
2025-05-04 01:07:39 +03:30
},
{
2025-07-18 02:30:04 +03:30
welcome: 'سلام! من دستیار شما هستم 🤖',
thanks: 'خوشحالم که می‌توانم در استفاده از نرم‌افزار حسابیکس به شما کمک کنم.'
2025-05-04 01:07:39 +03:30
}
],
selectedPattern: null,
displayWelcome: '',
2025-07-18 02:30:04 +03:30
suggestions: [
'چگونه می‌توانم گزارش مالی تهیه کنم؟',
'راهنمای استفاده از نرم‌افزار',
'چگونه فاکتور جدید ایجاد کنم؟',
'مشکلات رایج و راه‌حل‌ها',
'تنظیمات سیستم'
],
connectionStatus: {
color: 'warning',
icon: 'mdi-clock',
text: 'در حال بررسی اتصال...'
}
}
},
computed: {
aiMessageCount() {
return this.userMessages.filter(msg => msg && msg.isAI).length
},
userMessageCount() {
return this.userMessages.filter(msg => typeof msg === 'string').length
2025-05-04 01:07:39 +03:30
}
},
async mounted() {
2025-07-18 02:30:04 +03:30
await this.loadAISettings()
await this.checkConnectionStatus()
2025-05-04 01:07:39 +03:30
await this.startTypingAnimation()
},
watch: {
userMessages: {
handler() {
this.$nextTick(() => {
this.scrollToBottom()
})
},
deep: true
},
displayWelcome() {
this.$nextTick(() => {
this.scrollToBottom()
})
2025-04-12 18:50:34 +03:30
}
},
methods: {
2025-07-18 02:30:04 +03:30
async loadAISettings() {
try {
const response = await axios.get('/api/wizard/settings')
if (response.data.success) {
this.aiSettings = response.data.settings
}
} catch (error) {
console.error('Error loading AI settings:', error)
}
},
async checkConnectionStatus() {
try {
const response = await axios.get('/api/wizard/status')
console.log('Status response:', response.data) // اضافه کردن log
if (response.data.success) {
let color = 'success'
let icon = 'mdi-check-circle'
let text = 'اتصال به سرور موفق'
switch (response.data.status) {
case 'available':
color = 'success'
icon = 'mdi-check-circle'
text = 'اتصال به سرور موفق'
break
case 'disabled':
color = 'error'
icon = 'mdi-robot-off'
text = 'سرویس هوش مصنوعی غیرفعال'
break
case 'no_api_key':
color = 'warning'
icon = 'mdi-key-remove'
text = 'کلید API تنظیم نشده'
break
default:
color = 'error'
icon = 'mdi-alert-circle'
text = 'اتصال به سرور متصل نیست'
}
this.connectionStatus = {
color: color,
icon: icon,
text: text
}
console.log('Connection status updated:', this.connectionStatus) // اضافه کردن log
} else {
this.connectionStatus = {
color: 'error',
icon: 'mdi-alert-circle',
text: 'خطا در بررسی وضعیت اتصال'
}
}
} catch (error) {
console.error('Error checking connection status:', error)
this.connectionStatus = {
color: 'error',
icon: 'mdi-alert-circle',
text: 'خطا در ارتباط با سرور'
}
}
2025-05-04 01:07:39 +03:30
},
async startTypingAnimation() {
2025-07-18 02:30:04 +03:30
// تایپ یک پیام ساده
await this.typeText('سلام! من دستیار هوشمند حسابیکس هستم. چطور می‌توانم کمک کنم؟', (text) => {
2025-05-04 01:07:39 +03:30
this.displayWelcome = text
2025-07-18 02:30:04 +03:30
}, 30)
2025-05-04 01:07:39 +03:30
this.isTyping = false
},
async typeText(text, callback, speed = 50) {
let currentText = ''
for (let i = 0; i < text.length; i++) {
currentText += text[i]
callback(currentText)
await this.delay(speed)
}
},
delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
},
async sendMessage() {
if (!this.userMessage.trim()) return
2025-07-18 02:30:04 +03:30
// بررسی فعال بودن هوش مصنوعی
if (!this.aiSettings.aiEnabled) {
this.userMessages.push({
text: 'سرویس هوش مصنوعی غیرفعال است. لطفاً ابتدا آن را در تنظیمات سیستم فعال کنید.',
isAI: true,
isDetails: true
})
return
}
2025-05-04 01:07:39 +03:30
const message = this.userMessage.trim()
this.userMessages.push(message)
this.userMessage = ''
this.isLoading = true
2025-07-18 02:30:04 +03:30
try {
// ارسال درخواست به بک‌اند
const response = await axios.post('/api/wizard/talk', {
message: message,
options: {
model: this.aiSettings.aiModel,
temperature: 0.7,
max_tokens: 1000
}
})
2025-05-04 01:07:39 +03:30
2025-07-18 02:30:04 +03:30
if (response.data.success) {
// نمایش پاسخ هوش مصنوعی
this.userMessages.push({
text: response.data.response,
isAI: true
})
// نمایش اطلاعات اضافی در صورت وجود
if (response.data.usage || response.data.cost) {
let detailsText = ''
if (response.data.usage) {
detailsText += `توکن‌های ورودی: ${response.data.usage.prompt_tokens || 0}\n`
detailsText += `توکن‌های خروجی: ${response.data.usage.completion_tokens || 0}\n`
detailsText += `کل توکن‌ها: ${response.data.usage.total_tokens || 0}\n`
}
if (response.data.cost) {
detailsText += `هزینه: ${response.data.cost.toLocaleString('fa-IR')} ریال`
}
if (response.data.model) {
detailsText += `\nمدل: ${response.data.model}`
}
if (detailsText) {
this.userMessages.push({
text: detailsText,
isAI: true,
isDetails: true
})
}
}
} else {
// نمایش خطا
this.userMessages.push({
text: `خطا: ${response.data.error}`,
isAI: true,
isDetails: true
})
}
} catch (error) {
console.error('Error sending message:', error)
// نمایش خطای شبکه
this.userMessages.push({
text: 'خطا در ارتباط با سرور. لطفاً دوباره تلاش کنید.',
isAI: true,
isDetails: true
})
}
2025-05-04 01:07:39 +03:30
this.isLoading = false
this.$nextTick(() => {
this.scrollToBottom()
})
},
scrollToBottom() {
const container = this.$refs.messagesContainer
if (container) {
container.scrollTo({
top: container.scrollHeight,
behavior: 'smooth'
})
}
2025-07-18 02:30:04 +03:30
},
clearChat() {
this.userMessages = []
this.displayWelcome = ''
this.isTyping = true
this.startTypingAnimation()
},
useSuggestion(suggestion) {
this.userMessage = suggestion
},
formatTime(date) {
return new Intl.DateTimeFormat('fa-IR', {
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
}).format(date)
2025-05-04 01:07:39 +03:30
}
2025-04-12 18:50:34 +03:30
}
}
</script>
<style scoped>
2025-05-04 01:07:39 +03:30
.page-container {
height: 100vh;
display: flex;
flex-direction: column;
}
.content-container {
flex: 1;
height: 100vh;
}
.chat-container {
height: 100%;
background-color: #f5f5f5;
}
.chat-box {
height: 100%;
display: flex;
flex-direction: column;
}
.messages-container {
flex: 1;
overflow-y: auto;
padding: 20px;
display: flex;
flex-direction: column;
gap: 16px;
}
.message {
display: flex;
align-items: flex-start;
max-width: 80%;
2025-04-12 18:50:34 +03:30
}
2025-05-04 01:07:39 +03:30
.ai-message {
align-self: flex-start;
2025-04-12 18:50:34 +03:30
}
2025-05-04 01:07:39 +03:30
.user-message {
align-self: flex-end;
flex-direction: row-reverse;
2025-04-12 18:50:34 +03:30
}
2025-05-04 01:07:39 +03:30
.message-content {
background-color: white;
padding: 12px 16px;
2025-04-12 18:50:34 +03:30
border-radius: 12px;
2025-05-04 01:07:39 +03:30
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
}
.ai-message .message-content {
background-color: #e3f2fd;
border-bottom-right-radius: 4px;
}
.user-message .message-content {
background-color: #1a237e;
color: white;
border-bottom-left-radius: 4px;
2025-04-12 18:50:34 +03:30
}
2025-05-04 01:07:39 +03:30
.message-text {
font-size: 1rem;
line-height: 1.5;
2025-04-12 18:50:34 +03:30
}
2025-07-18 02:30:04 +03:30
.message-time {
font-size: 0.75rem;
color: rgba(0, 0, 0, 0.5);
margin-top: 4px;
text-align: right;
}
.user-message .message-time {
color: rgba(255, 255, 255, 0.7);
}
/* استایل برای پیش‌نمایش پیام */
.message-preview {
margin-top: 8px;
padding: 8px;
background-color: #f5f5f5;
border-radius: 8px;
border: 1px solid #e0e0e0;
}
.preview-content {
font-size: 0.875rem;
color: #424242;
line-height: 1.4;
max-height: 60px;
overflow-y: auto;
}
2025-05-04 01:07:39 +03:30
.input-container {
padding: 16px;
background-color: white;
border-top: 1px solid rgba(0, 0, 0, 0.1);
display: flex;
align-items: center;
gap: 12px;
2025-04-12 18:50:34 +03:30
}
2025-05-04 01:07:39 +03:30
.message-input {
background-color: #f5f5f5 !important;
border-radius: 24px;
padding: 8px 16px !important;
}
.message-input :deep(.v-field__input) {
padding: 8px !important;
font-size: 1rem;
color: #424242;
}
.send-button {
transition: all 0.3s ease;
}
.send-button:hover {
2025-04-12 18:50:34 +03:30
transform: scale(1.1);
}
2025-05-04 01:07:39 +03:30
.typing-indicator {
display: flex;
gap: 4px;
align-items: center;
height: 24px;
}
.typing-indicator span {
width: 8px;
height: 8px;
background-color: #1a237e;
border-radius: 50%;
animation: typing 1s infinite ease-in-out;
}
.typing-indicator span:nth-child(2) {
animation-delay: 0.2s;
}
.typing-indicator span:nth-child(3) {
animation-delay: 0.4s;
}
@keyframes typing {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-4px); }
}
.details-message {
background-color: #f5f5f5 !important;
border: 1px solid #e0e0e0;
font-size: 0.9rem;
color: #616161;
}
.details-message .message-text {
white-space: pre-line;
}
.messages-container::-webkit-scrollbar {
width: 6px;
}
.messages-container::-webkit-scrollbar-track {
background: transparent;
2025-04-12 18:50:34 +03:30
}
2025-05-04 01:07:39 +03:30
.messages-container::-webkit-scrollbar-thumb {
background: rgba(0, 0, 0, 0.2);
border-radius: 3px;
2025-04-12 18:50:34 +03:30
}
2025-05-04 01:07:39 +03:30
.messages-container::-webkit-scrollbar-thumb:hover {
background: rgba(0, 0, 0, 0.3);
2025-04-12 18:50:34 +03:30
}
2025-07-18 02:30:04 +03:30
/* استایل برای کارت اطلاعات قیمت‌گذاری */
.pricing-info {
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
}
.pricing-info .v-card {
border: 1px solid rgba(0, 0, 0, 0.1);
background: rgba(255, 255, 255, 0.9);
backdrop-filter: blur(10px);
}
/* انیمیشن برای chip وضعیت */
.v-chip {
transition: all 0.3s ease;
}
.v-chip:hover {
transform: scale(1.05);
}
/* بهبود ظاهر toolbar */
.v-toolbar {
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
}
/* استایل برای پیام‌های خطا */
.message-content.error-message {
background-color: #ffebee !important;
border: 1px solid #ffcdd2;
color: #c62828;
}
/* استایل برای پیام‌های موفقیت */
.message-content.success-message {
background-color: #e8f5e8 !important;
border: 1px solid #c8e6c9;
color: #2e7d32;
}
/* استایل برای پیشنهادات */
.suggestions-container {
padding: 16px;
background-color: #f8f9fa;
border-top: 1px solid #e9ecef;
border-bottom: 1px solid #e9ecef;
}
.suggestion-chip {
cursor: pointer;
transition: all 0.3s ease;
background-color: white;
border: 1px solid #dee2e6;
margin: 2px;
}
.suggestion-chip:hover {
background-color: #e3f2fd !important;
transform: translateY(-1px);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
border-color: #1a237e;
}
/* بهبود ظاهر input container */
.input-container {
background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);
border-top: 2px solid #e9ecef;
padding: 16px;
}
/* استایل برای آمار استفاده */
.usage-stats {
background: linear-gradient(135deg, #e8f5e8 0%, #c8e6c9 100%);
}
.usage-stats .v-card {
border: 1px solid rgba(0, 0, 0, 0.1);
background: rgba(255, 255, 255, 0.9);
backdrop-filter: blur(10px);
}
/* انیمیشن برای کارت‌های آمار */
.usage-stats .v-card,
.pricing-info .v-card {
transition: all 0.3s ease;
}
.usage-stats .v-card:hover,
.pricing-info .v-card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
}
2025-04-12 18:50:34 +03:30
</style>