This commit is contained in:
Vova 2025-11-30 20:10:54 +03:00
commit 1d78a3e864
112 changed files with 5352 additions and 0 deletions

8
.env.development Normal file
View File

@ -0,0 +1,8 @@
NODE_ENV=development
VITE_API_URL=https://joyworkdev.ru
VITE_LARAVEL_URL=https://llar.joyworkdev.ru
VITE_LARAVEL_API_URL=https://joyworkdev.ru
VITE_DEV_SESSION_ID=e74fad113507355529accbf75227afb8
VITE_DEV_REQUISITION_ID=17539
#VITE_BASIC_AUTH_USER=adminlogin
#VITE_BASIC_AUTH_PASS=adminpassword

8
.env.production Normal file
View File

@ -0,0 +1,8 @@
NODE_ENV=production
VITE_API_URL=https://joyworkdev.ru
VITE_LARAVEL_URL=https://llar.joyworkdev.ru
VITE_LARAVEL_API_URL=https://joyworkdev.ru
VITE_DEV_SESSION_ID=e33a6f076567ef9c7c6a9e244f0fd626
VITE_DEV_REQUISITION_ID=17539
#VITE_BASIC_AUTH_USER=adminlogin
#VITE_BASIC_AUTH_PASS=adminpassword

24
.gitignore vendored Normal file
View File

@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

3
.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"recommendations": ["Vue.volar"]
}

5
README.md Normal file
View File

@ -0,0 +1,5 @@
# Vue 3 + Vite
This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
Learn more about IDE Support for Vue in the [Vue Docs Scaling up Guide](https://vuejs.org/guide/scaling-up/tooling.html#ide-support).

13
index.html Normal file
View File

@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Joywork</title>
</head>
<body>
<div id="app_deal"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

28
package.json Normal file
View File

@ -0,0 +1,28 @@
{
"name": "deal",
"private": true,
"version": "0.0.1",
"type": "module",
"scripts": {
"dev": "vite",
"build:dev": "vite build --mode development && node postbuild.js",
"build:prod": "vite build --mode production && node postbuild.js",
"preview": "vite preview"
},
"dependencies": {
"@primevue/themes": "^4.4.1",
"axios": "^1.13.2",
"dayjs": "^1.11.19",
"primeicons": "^7.0.0",
"primevue": "^4.4.1",
"vue": "^3.5.24",
"vue-router": "^4.6.3"
},
"devDependencies": {
"@tailwindcss/vite": "^4.1.17",
"@vitejs/plugin-vue": "^6.0.2",
"sass": "^1.94.2",
"tailwindcss": "^4.1.17",
"vite": "^7.2.4"
}
}

39
postbuild.js Normal file
View File

@ -0,0 +1,39 @@
// postbuild.js
import { readFile, writeFile } from 'fs/promises';
import { join } from 'path';
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const distPath = join(__dirname, 'dist');
const assetsPath = join(distPath, 'assets');
// Читаем index.html
const indexHtml = await readFile(join(distPath, 'index.html'), 'utf-8');
// Обновлённые регулярки — учитывают /deal/assets/ и атрибуты
const jsMatch = indexHtml.match(/<script[^>]+src="\/deal\/assets\/([^"]+\.js)"/);
const cssMatch = indexHtml.match(/<link[^>]+href="\/deal\/assets\/([^"]+\.css)"/);
if (!jsMatch || !cssMatch) {
console.error('❌ Не удалось найти JS/CSS в index.html');
console.log('Содержимое index.html:', indexHtml.substring(0, 500)); // Для отладки
process.exit(1);
}
const jsFile = jsMatch[1];
const cssFile = cssMatch[1];
const jsContent = `// Авто-сгенерировано: postbuild.js
import '/deal/assets/${jsFile}';`;
const cssContent = `/* Авто-сгенерировано: postbuild.js */
@import '/deal/assets/${cssFile}';`;
// Записываем прослойки
await writeFile(join(assetsPath, 'app.js'), jsContent);
await writeFile(join(assetsPath, 'app.css'), cssContent);
console.log('✅ Прослойки созданы: app.js и app.css');

1
public/vite.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

57
src/App.vue Normal file
View File

@ -0,0 +1,57 @@
<template>
<div>
<h1>Сделка</h1>
<a href="#" @click.prevent="createDeal(17539)">Открыть тестовую сделку</a>
</div>
<DynamicDialog />
</template>
<script setup>
import { ref, onMounted } from 'vue'
import DealModal from './components/deals/DealModal.vue'
import DynamicDialog from 'primevue/dynamicdialog'
import {useDialog} from "primevue/usedialog";
const isOpen = ref(false)
const dealId = ref(null)
const newDealReqId = ref(null)
const dialog = useDialog()
const createDeal = (newDealReqId) => {
console.log('[createDeal] Открываем DealModal через DynamicDialog', newDealReqId)
dialog.open(DealModal, {
props: {
header: 'Создание сделки',
style: { width: '80vw' },
modal: true
},
data: {
newDealReqId: newDealReqId
},
onClose: (opt) => {
console.log('[DynamicDialog] Закрыто с данными:', opt?.data)
}
})
}
const editDeal = (id) => {
isOpen.value = true
dealId.value = id
newDealReqId.value = null
}
const backToStep = () => {
isOpen.value = false
}
onMounted(() => {
window.createDeal = createDeal
window.createDealReady = true
window.editDeal = editDeal
window.backToStep = backToStep
console.log('✅ window.createDeal доступна')
})
</script>

2
src/assets/css/main.css Normal file
View File

@ -0,0 +1,2 @@
@import '@/assets/css/temporary.css';
@import '@/assets/css/tailwind.css';

View File

@ -0,0 +1,8 @@
@import "tailwindcss";
@source "../../**/*.{vue,js,ts,jsx,tsx}";
@source "../../../index.html";
@theme {
}

View File

@ -0,0 +1,26 @@
.addDeal {
.p-2 {
padding: calc(var(--spacing) * 2)!important;
}
.p-4 {
padding: calc(var(--spacing) * 4)!important;
}
.mb-3 {
margin-bottom: calc(var(--spacing) * 3)!important;
}
.ml-4 {
margin-left: calc(var(--spacing) * 4)!important;
}
.mr-4 {
margin-right: calc(var(--spacing) * 4)!important;
}
.p-4 {
padding: calc(var(--spacing) * 4)!important;
}
.mt-4 {
margin-top: calc(var(--spacing) * 4)!important;
}
.ml-auto {
margin-left: auto!important;
}
}

1
src/assets/vue.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>

After

Width:  |  Height:  |  Size: 496 B

View File

@ -0,0 +1,43 @@
<script setup>
import { ref } from 'vue'
defineProps({
msg: String,
})
const count = ref(0)
</script>
<template>
<h1>{{ msg }}</h1>
<div class="card">
<button type="button" @click="count++">count is {{ count }}</button>
<p>
Edit
<code>components/HelloWorld.vue</code> to test HMR
</p>
</div>
<p>
Check out
<a href="https://vuejs.org/guide/quick-start.html#local" target="_blank"
>create-vue</a
>, the official Vue + Vite starter
</p>
<p>
Learn more about IDE Support for Vue in the
<a
href="https://vuejs.org/guide/scaling-up/tooling.html#ide-support"
target="_blank"
>Vue Docs Scaling up Guide</a
>.
</p>
<p class="read-the-docs">Click on the Vite and Vue logos to learn more</p>
</template>
<style scoped>
.read-the-docs {
color: #888;
}
</style>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,139 @@
<template>
<div class="modal dealAddDoc">
<div class="modal-content">
<span class="close" @click="closeModal">&times;</span>
<h3 class="mb-4">Добавление документа</h3>
<div class="mb-4">
<label for="document-name" class="block text-sm font-medium text-gray-700">Название документа</label>
<InputText
id="document-name"
v-model="documentName"
placeholder="Введите название документа"
class="w-full p-2 border rounded"
/>
</div>
<div class="mb-4">
<label for="document-file" class="block text-sm font-medium text-gray-700">Выберите файл</label>
<input
type="file"
id="document-file"
@change="handleFileChange"
class="w-full p-2 border rounded"
/>
</div>
<div class="text-center">
<button @click="saveDealDoc" class="mt-4 p-2 rounded bg-blue-500 text-white">
Загрузить
</button>
</div>
</div>
</div>
</template>
<script setup>
import {ref} from 'vue';
//import { useLaravelApi } from '@/composables/useLaravelApi';
import { dealsApi } from '@/shared/api/deals';
import InputText from "primevue/inputtext";
const props = defineProps({
deal: {
type: Object,
required: true
},
});
const emit = defineEmits(['close', 'select']);
// Реактивные переменные для названия и файла
const documentName = ref('');
const selectedFile = ref(null);
// Обработчик изменения файла
const handleFileChange = (event) => {
selectedFile.value = event.target.files[0];
};
const closeModal = () => {
emit('close');
};
// Сохранение документа
const saveDealDoc = async () => {
if (!documentName.value || !selectedFile.value) {
alert('Пожалуйста, заполните все поля');
return;
}
//const { fetchData } = useLaravelApi();
// Создаем FormData для отправки файла
const formData = new FormData();
formData.append('name', documentName.value);
formData.append('file', selectedFile.value);
if (props.deal.id) {
formData.append('target_id', props.deal.id);
}
formData.append('target_type', 10); // Пример значения
try {
const response = await dealsApi.uploadDocument(formData);
emit('select', response.data.data);
closeModal();
} catch (error) {
console.error('Ошибка при загрузке документа:', error);
alert('Произошла ошибка при загрузке документа');
}
// try {
// const response = await fetchData('/documents', {
// method: 'POST',
// data: formData,
// });
//
// // Передаем документ в родительский компонент
// emit('select', response.data.data);
//
// // Закрываем модальное окно
// closeModal();
// } catch (error) {
// console.error('Ошибка при загрузке документа:', error);
// alert('Произошла ошибка при загрузке документа');
// }
};
</script>
<!--<style>-->
<!--.modal {-->
<!-- display: flex;-->
<!-- justify-content: center;-->
<!-- align-items: center;-->
<!-- position: fixed;-->
<!-- z-index: 1;-->
<!-- left: 0;-->
<!-- top: 0;-->
<!-- width: 100%;-->
<!-- height: 100%;-->
<!-- background-color: rgba(0, 0, 0, 0.5);-->
<!--}-->
<!--.modal-content {-->
<!-- background-color: #fff;-->
<!-- padding: 20px;-->
<!-- border-radius: 10px;-->
<!-- width: 80%;-->
<!-- max-width: 500px;-->
<!--}-->
<!--.close {-->
<!-- position: absolute;-->
<!-- top: 10px;-->
<!-- right: 20px;-->
<!-- font-size: 24px;-->
<!-- cursor: pointer;-->
<!--}-->
<!--</style>-->

View File

@ -0,0 +1,142 @@
<template>
<div class="w-full sm:w-1/2 md:w-1/3 lg:w-1/4 p-2">
<div class="document-card p-4 rounded flex">
<div class="deal-document-thumbnail w-16 h-16 flex-shrink-0 rounded-lg overflow-hidden">
<img v-if="isImage" :src="fileUrl" alt="Превью документа" class="w-full h-full object-cover" />
<img v-else
:src="require('@/shared/assets/images/deal/deal-doc-icon.png')"
:alt="fileExtension + ' документ'"
class="w-full h-full object-contain bg-gray-100" />
</div>
<!-- Название документа -->
<div class="ml-4 flex flex-col justify-between flex-grow">
<div class="font-bold text-gray-800">{{ doc.name }}</div>
<div class="flex">
<img src="@/shared/assets/icons/doc.svg" alt="Договор" class="w-5 h-5">
<a :href="fileUrl" target="_blank" class="ml-2 underline document-file">{{ getFileName(doc.file) }}</a>
</div>
</div>
<button @click="confirmDelete" class="ml-auto mt-2 px-4 py-2 rounded">
<!-- <img src="@/shared/assets/icons/trash.svg" alt="Удалить" class="w-6 h-6">-->
<span class="simple-button delete" title="Удалить"><i class="jw-action-icon-delete"></i></span>
</button>
</div>
</div>
</template>
<script setup>
import { useConfirm } from 'primevue/useconfirm';
import { useToast } from 'primevue/usetoast';
import { computed } from "vue";
const props = defineProps({
doc: {
type: Object,
required: true,
validator: (doc) => doc.id && doc.name && doc.file
},
urlLaravel: {
type: String,
required: true
}
});
const fileUrl = computed(() => {
if (!props.doc.file) return '';
return `${props.urlLaravel}/storage/${props.doc.file}`;
});
// Проверка, является ли файл изображением
const isImage = computed(() => {
if (!props.doc.file) return false;
const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
return imageExtensions.includes(fileExtension.value);
});
// Расширение файла
const fileExtension = computed(() => {
if (!props.doc.file) return false;
return props.doc.file.split('.').pop().toLowerCase();
});
const getFileName = (fullPath) => {
return fullPath.split('/').pop();
}
const emit = defineEmits(['remove']);
const confirm = useConfirm();
const toast = useToast();
const confirmDelete = (event) => {
confirm.require({
target: event.currentTarget,
message: `Удалить документ "${props.doc.name}"?`,
header: 'Подтверждение удаления',
acceptLabel: 'Удалить',
rejectLabel: 'Отмена',
acceptClass: 'p-button-danger',
accept: async () => {
try {
emit('remove', props.doc.id);
toast.add({
severity: 'success',
summary: 'Успешно',
detail: 'Документ удален',
life: 3000
});
} catch (error) {
toast.add({
severity: 'error',
summary: 'Ошибка',
detail: 'Не удалось удалить документ',
life: 3000
});
}
},
reject: () => {
toast.add({
severity: 'info',
summary: 'Отменено',
detail: 'Удаление отменено',
life: 2000
});
}
});
};
</script>
<style scoped>
.addDeal__form {
.document-card {
background: linear-gradient(360deg, #F5F5F5 0%, #FFFFFF 100%);
border: 1px solid #E0E0E0;
border-radius: 5px;
padding: 10px;
a {
border: none;
}
.deal-document-thumbnail {
min-width: 4rem;
}
embed {
pointer-events: none; /* Запрещаем взаимодействие с PDF внутри превью */
}
.document-file {
font-family: 'Lato', sans-serif;
font-style: normal;
font-weight: 400;
font-size: 12px;
color: #757575;
}
}
}
</style>

View File

@ -0,0 +1,118 @@
<template>
<div class="modal dealAddEmployee">
<div class="modal-content">
<span class="close" @click="closeModal">&times;</span>
<h3 class="mb-4">Выберите сотрудников</h3>
<MultiSelect
v-model="selectedEmployeeIds"
:options="employeesWithFullName"
optionLabel="fullName"
optionValue="id"
placeholder="Выберите сотрудников"
class="w-full"
display="chip"
:maxSelectedLabels="3"
:filter="true"
>
<template #dropdownicon>
<DropdownIcon />
</template>
</MultiSelect>
<button @click="handleSelect" class="mt-4 p-2 rounded add-employee-btn">
Выбрать
</button>
</div>
</div>
</template>
<script setup>
import { ref, defineEmits, watch, computed } from 'vue';
import MultiSelect from 'primevue/multiselect';
import DropdownIcon from "@/shared/assets/icons/dropdown-icon.vue";
const props = defineProps({
employees: {
type: Array,
required: true,
},
selected: {
type: Array,
default: () => [],
},
});
const emit = defineEmits(['close', 'select']);
const selectedEmployeeIds = ref([]);
// Добавляем поле fullName для каждого сотрудника
const employeesWithFullName = computed(() => {
return props.employees.map(employee => ({
...employee,
fullName: employee.fio || `${employee.first_name} ${employee.last_name}`,
}));
});
// Инициализируем selectedEmployeeIds при открытии модального окна
watch(() => props.selected, (newSelected) => {
selectedEmployeeIds.value = newSelected.map(employee => employee.id);
}, { immediate: true });
const closeModal = () => {
emit('close');
};
const handleSelect = () => {
// Находим объекты сотрудников по их id
const selectedEmployeeObjects = selectedEmployeeIds.value
.map(id => props.employees.find(employee => employee.id === id))
.filter(employee => employee !== undefined); // Убираем undefined, если сотрудник не найден
// Передаем выбранных сотрудников в родительский компонент
emit('select', selectedEmployeeObjects);
closeModal();
};
</script>
<style>
.modal.dealAddEmployee {
display: flex;
justify-content: center;
align-items: center;
position: fixed;
z-index: 1;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
.modal-content {
position: absolute;
background-color: #fff;
padding: 20px;
border-radius: 10px;
width: 80%;
max-width: 500px;
text-align: center;
}
.close {
position: absolute;
top: 10px;
right: 20px;
font-size: 24px;
cursor: pointer;
}
.p-multiselect {
height: auto;
}
.add-employee-btn {
background: #64A853;
color: #fff;
width: 50%;
}
}
</style>

View File

@ -0,0 +1,70 @@
<template>
<div class="sm:w-1/2 md:w-1/3 lg:w-1/4 p-2">
<div class="employee-card p-4 rounded flex">
<div class="deal-employee-logo w-16 h-16 flex-shrink-0 rounded-full overflow-hidden">
<img class="w-full" v-if="employee.user_logo" :src="`${url}/photos/agency/${employee.user_logo}`" alt="">
</div>
<div class="ml-4 flex flex-col justify-between">
<div>
<div class="font-bold">{{ getFullName(employee) }}</div>
<div class="font-bold">{{ employee.role ? employee.role.name : 'Агент' }}</div>
<div class="deal-employee-phone">{{ employee.phone }}</div>
</div>
<div class="flex space-x-2 mt-2">
<a :href="'https://t.me/' + employee.phone" target="_blank">
<img src="@/shared/assets/icons/social/telegram.svg" alt="Telegram" class="w-6 h-6">
</a>
<a :href="'https://wa.me/' + employee.phone" target="_blank">
<img src="@/shared/assets/icons/social/whatsapp.svg" alt="WhatsApp" class="w-6 h-6">
</a>
</div>
</div>
<button @click="$emit('remove', employee.id)" class="ml-auto mt-2 px-4 py-2 rounded">
<!-- <img src="@/shared/assets/icons/trash.svg" alt="Удалить" class="w-6 h-6">-->
<span class="simple-button delete" title="Удалить"><i class="jw-action-icon-delete"></i></span>
</button>
</div>
</div>
</template>
<script>
export default {
props: {
employee: {
type: Object,
required: true
},
url: {
type: String,
required: true
}
},
methods: {
getFullName(employee) {
return employee.fio || `${employee.first_name} ${employee.last_name}`;
}
}
};
</script>
<style>
.addDeal__form {
.employee-card {
background: linear-gradient(360deg, #F5F5F5 0%, #FFFFFF 100%);
border: 1px solid #E0E0E0;
border-radius: 5px;
.deal-employee-phone {
font-family: 'Lato', sans-serif;
font-style: normal;
font-weight: 400;
font-size: 14px;
line-height: 17px;
}
a {
border: none;
}
}
}
</style>

View File

@ -0,0 +1,26 @@
<template>
<div>
<ul>
<li v-for="employee in employees" :key="employee.id" @click="selectEmployee(employee)">
{{ employee.first_name }} {{ employee.last_name }}
</li>
</ul>
</div>
</template>
<script setup>
import { defineEmits } from 'vue';
const props = defineProps({
employees: {
type: Array,
required: true
}
});
const emit = defineEmits(['select']);
const selectEmployee = (employee) => {
emit('select', employee);
};
</script>

View File

@ -0,0 +1,245 @@
<template>
<div class="modal dealAddContract">
<div class="modal-content">
<span class="close" @click="closeModal">&times;</span>
<h3>Составить договор</h3>
<div class="mb-4 mt-4 add-contract-title">
<label class="mb-2">Бланк документа:</label>
<Dropdown
v-model="selectedInnerBlankId"
:options="innerBlanksList"
optionLabel="name"
optionValue="id"
class="w-full"
>
<template #dropdownicon>
<DropdownIcon />
</template>
</Dropdown>
</div>
<div class="mb-4 add-contract-title">
<label class="mb-2">Комментарий:</label>
<Textarea
v-model="commentDealInnerBlank"
placeholder="Введите комментарий"
class="w-full"
rows="8"
cols="30"
style="height: auto"
/>
</div>
<button @click="saveDealInnerDoc" class="mt-4 p-2 rounded w-full add-deal-contract-button">
Составить договор
</button>
</div>
</div>
</template>
<script setup>
import {defineEmits, onMounted, ref} from 'vue';
import { useLaravelApi } from '@/composables/useLaravelApi';
import DropdownIcon from "@/shared/assets/icons/dropdown-icon.vue";
import Textarea from "primevue/textarea";
const props = defineProps({
deal: {
type: Object,
required: true
},
});
const emit = defineEmits(['close', 'select']);
// Состояния формы
const selectedInnerBlankId = ref(null);
const commentDealInnerBlank = ref('');
const isLoading = ref(false);
const validationErrors = ref({});
//Договора
const { data: innerBlanksData, error: innerBlanksError, fetchData: fetchInnerBlanksData } = useLaravelApi();
const innerBlanksList = ref([]);
onMounted(async () => {
console.log(props.deal);
// Загружаем список бланков
await fetchInnerBlanksData('/inner-blanks');
if (innerBlanksData.value && innerBlanksData.value.success) {
innerBlanksList.value = innerBlanksData.value.data; // Сохраняем данные
} else {
console.error('Ошибка при загрузке списка бланков:', innerBlanksError.value);
}
});
const closeModal = () => {
emit('close');
};
const getTemplateData = () => {
const sidesMap = {
'Продавец': 'sobstv',
'Арендодатель': 'sobstv',
'Наймодатель': 'sobstv',
'Покупатель': 'clients',
'Арендатор': 'clients',
'Наниматель': 'clients'
};
const result = {
sobstv: [],
clients: [],
object_id: null,
};
// Обработка стороны 1
if (props.deal.side_one) {
const roleType = sidesMap[props.deal.side_one];
if (roleType) {
// Основной клиент
if (props.deal.side_one_client_main) {
result[roleType].push(props.deal.side_one_client_main.id);
}
// Дополнительные клиенты
if (props.deal.side_one_clients?.length) {
result[roleType].push(...props.deal.side_one_clients.map(c => c.id));
}
}
}
// Обработка стороны 2
if (props.deal.side_two) {
const roleType = sidesMap[props.deal.side_two];
if (roleType) {
// Основной клиент
if (props.deal.side_two_client_main) {
result[roleType].push(props.deal.side_two_client_main.id);
}
// Дополнительные клиенты
if (props.deal.side_two_clients?.length) {
result[roleType].push(...props.deal.side_two_clients.map(c => c.id));
}
//result[roleType].push(...props.deal.side_two_clients.map(c => c.id));
}
}
// Объект может быть только один либо из side_one, либо из side_two
if (props.deal.side_one_object_id) {
result.object_id = props.deal.side_one_object_id;
} else if (props.deal.side_two_object_id) {
result.object_id = props.deal.side_two_object_id;
}
return result;
};
const saveDealInnerDoc = async () => {
validationErrors.value = {};
isLoading.value = true;
try {
const { fetchData } = useLaravelApi();
console.log('Props перед payload:', props);
const dealId = props.deal.id ? Number(props.deal.id) : null;
const templateData = getTemplateData();
const payload = {
template_data: {
...templateData,
blank_id: selectedInnerBlankId.value,
side_one_requisition_id: props.deal.side_one_requisition_id,
},
deal_id: dealId,
comment: commentDealInnerBlank.value || '',
side_one: [
// Основной клиент стороны 1
(props.deal.side_one_client_main ? {
client_id: props.deal.side_one_client_main.id,
role: props.deal.side_one
} : null),
// Дополнительные клиенты стороны 1
...(props.deal.side_one_clients?.map(client => ({
client_id: client.id,
role: props.deal.side_one
})) || [])
].filter(Boolean), // Убираем null, если основного клиента нет
side_two: [
// Основной клиент стороны 2
(props.deal.side_two_client_main ? {
client_id: props.deal.side_two_client_main.id,
role: props.deal.side_two
} : null),
// Дополнительные клиенты стороны 2
...(props.deal.side_two_clients?.map(client => ({
client_id: client.id,
role: props.deal.side_two
})) || [])
].filter(Boolean), // Убираем null, если основного клиента нет
};
console.log('Full payload:', payload);
const response = await fetchData('/deals/inner-docs', {
method: 'POST',
data: payload,
});
if (response.data.success) {
emit('created', response.data.data);
closeModal();
} else {
// Обработка ошибок валидации
if (response.data.errors) {
validationErrors.value = response.data.errors;
}
throw new Error(response.data.message || 'Ошибка при создании документа');
}
} catch (error) {
console.error('Ошибка:', error);
if (!validationErrors.value) {
alert(error.message || 'Произошла ошибка при создании документа');
}
} finally {
isLoading.value = false;
}
};
</script>
<style>
.modal {
display: flex;
justify-content: center;
align-items: center;
position: fixed;
z-index: 1;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
}
.modal-content {
background-color: #fff;
padding: 20px;
border-radius: 10px;
width: 80%;
max-width: 500px;
}
.close {
position: absolute;
top: 10px;
right: 20px;
font-size: 24px;
cursor: pointer;
}
</style>

View File

@ -0,0 +1,223 @@
<template>
<div class="w-full sm:w-1/2 md:w-1/3 lg:w-1/4 p-2">
<div class="inner-doc p-4 rounded">
<h3>Сформированный документ</h3>
<div class="mt-3">
<p class="inner-doc-small-gray">Дата формирования документа {{ formatDate(innerDoc.created_at) }}</p>
</div>
<!-- Сторона 1 -->
<div class="clients-inner-doc mt-4">
<h4 class="inner-doc-title">Сторона 1:</h4>
<div v-for="side in innerDoc.deals[0]?.side_one || []" :key="side.client_id" class="mt-2 flex items-baseline">
<span style="margin-right: 10px;" class="font-medium min-w-[80px]">{{ side.role }}:</span>
<div class="ml-2 underline">
<span>{{ getClientName(side) }} ({{ side.phone }})</span>
</div>
</div>
</div>
<!-- Сторона 2 -->
<div class="clients-inner-doc mt-4">
<h4 class="inner-doc-title">Сторона 2:</h4>
<div v-for="side in innerDoc.deals[0]?.side_two || []" :key="side.client_id" class="mt-2 flex items-baseline">
<span style="margin-right: 10px;" class="font-medium min-w-[80px]">{{ side.role }}:</span>
<div class="ml-2 underline">
<span>{{ getClientName(side) }} ({{ side.phone }})</span>
</div>
</div>
</div>
<div class="clients-inner-doc mt-4">
<h4 class="inner-doc-title">Комментарий:</h4>
<p class="mt-2">{{ currentPivot?.comment || 'Нет комментария' }}</p>
</div>
<div class="clients-inner-doc mt-4">
<h4 class="inner-doc-title">Документ:</h4>
</div>
<div class="flex flex-col flex-grow mt-4">
<div class="mt-2 flex space-x-2">
<img src="@/shared/assets/icons/doc.svg" alt="Договор" class="w-5 h-5">
<a :href="`/api/inner-docs/${innerDoc.id}/download`" target="_blank" class="inner-doc-small-gray underline">{{ innerDoc.name }}.pdf</a>
</div>
</div>
<div class="mt-4">
<p class="inner-doc-small-gray">{{ innerDoc.creator.last_name }} {{ innerDoc.creator.first_name }}</p>
</div>
<div class="mt-4 flex">
<button @click="previewInnerDocVue(innerDoc.id ? innerDoc.id : '')">
<!-- <img src="@/shared/assets/icons/view.svg" alt="Предпросмотр">-->
<span class="simple-button settings" title="Предпросмотр"><i class="far fa-eye"></i></span>
</button>
<button @click="sendInnerDocVue(innerDoc.id ? innerDoc.id : '')">
<!-- <img style="margin-left: 5px;" src="@/shared/assets/icons/send.svg" alt="Отправить">-->
<span style="margin-left: 5px;" class="simple-button settings" title="Отправить"><i class="ti-write"></i></span>
</button>
<button @click="editInnerDocVue(innerDoc.id ? innerDoc.id : '')">
<!-- <img src="@/shared/assets/icons/edit.svg" alt="Редактировать" class="w-6 h-6">-->
<span style="margin-left: 5px;" class="simple-button settings" title="Редактировать"><i class="jw-action-icon-settings"></i></span>
</button>
<button @click="handleRemoveDealDoc($event)" class="ml-2">
<!-- <img src="@/shared/assets/icons/trash.svg" alt="Удалить" class="w-6 h-6">-->
<span style="margin-left: 5px;" class="simple-button delete" title="Удалить"><i class="jw-action-icon-delete"></i></span>
</button>
</div>
</div>
</div>
</template>
<script setup>
import { computed, ref } from 'vue';
import { useConfirm } from 'primevue/useconfirm';
import { useToast } from 'primevue/usetoast';
const props = defineProps({
innerDoc: {
type: Object,
required: true,
},
dealClients: {
type: Object,
default: () => ({ side_one_clients: [], side_two_clients: [] })
}
});
const emit = defineEmits(['remove']);
const confirm = useConfirm();
const toast = useToast();
// Получаем pivot данные для текущего документа
const currentPivot = computed(() => {
return props.innerDoc.deals?.[0]?.pivot;
});
// Получаем имя клиента по ID
const getClientName = (client) => {
return client?.fio || `${client.client_id}`;
};
const handleEditInnerDoc = () => {
emit('edit', props.innerDoc); // Немедленно передаем документ на редактирование
};
const handleRemoveDealDoc = (event) => {
confirm.require({
target: event.currentTarget,
message: `Вы уверены, что хотите удалить документ "${props.innerDoc.name}"?`,
header: 'Подтверждение удаления',
icon: 'pi pi-exclamation-triangle',
acceptLabel: 'Удалить',
rejectLabel: 'Отмена',
acceptClass: 'p-button-danger',
accept: async () => {
try {
emit('remove', props.innerDoc.id);
toast.add({
severity: 'success',
summary: 'Успешно',
detail: 'Документ удалён',
life: 3000
});
} catch (error) {
toast.add({
severity: 'error',
summary: 'Ошибка',
detail: 'Не удалось удалить документ',
life: 3000
});
}
},
reject: () => {
toast.add({
severity: 'info',
summary: 'Отменено',
detail: 'Удаление отменено',
life: 2000
});
}
});
};
const formatDate = (dateString) => {
return new Date(dateString).toLocaleDateString('ru-RU', {
day: '2-digit',
month: '2-digit',
year: 'numeric',
hour: '2-digit',
minute: '2-digit'
});
};
const previewInnerDocVue = (docId) => {
if (docId) {
previewInnerDoc(docId);
} else {
console.error('ID документа не найден!');
}
};
const sendInnerDocVue = (docId) => {
if (docId) {
sendInnerDocWin(docId);
} else {
console.error('ID документа не найден!');
}
};
const editInnerDocVue = (docId) => {
if (docId) {
editInnerDoc(docId);
} else {
console.error('ID документа не найден!');
}
};
</script>
<style scoped>
.addDeal__form {
.inner-doc {
background: linear-gradient(360deg, #F5F5F5 0%, #FFFFFF 100%);
border: 1px solid #E0E0E0;
border-radius: 5px;
padding: 10px;
a {
border: none;
}
h3 {
font-family: 'Lato', sans-serif;
font-style: normal;
font-weight: 400;
font-size: 18px;
line-height: 22px;
color: #000000;
}
.inner-doc-title {
color: #757575;
font-family: 'Lato',sans-serif;
font-style: normal;
font-weight: 400;
font-size: 18px;
line-height: 22px;
}
.inner-doc-small-gray {
color: #757575;
font-family: 'Lato', sans-serif;
font-style: normal;
font-weight: 400;
font-size: 14px;
line-height: 17px;
}
}
}
</style>

View File

@ -0,0 +1,165 @@
<template>
<div v-if="object" class="mt-3 deal-obj-card mr-4 sm:w-1/2 md:w-1/3 lg:w-full p-4 flex">
<div class="w-full flex">
<div class="md:w-1/4 mr-2 flex items-center justify-center overflow-hidden h-50">
<img
v-if="object.photos && object.photos.length > 0"
:src="object.photos[0].photo"
alt="Фото объекта"
class="h-full w-full object-cover"
/>
</div>
<div class="md:w-3/4 ml-2 w-full">
<div class="created_at flex">
<div class="created_at mr-4">{{ formattedDate }}</div>
<div class="mx-4">{{ object.operation_type === 0 ? 'Сдается' : object.operation_type === 1 ? 'Продается' : '' }}</div>
<div class="ml-4">ID: {{ object.id }}</div>
<div class="ml-auto cursor-pointer" @click="closeDealObject">
<img src="@/shared/assets/icons/close.svg" alt="Close">
</div>
</div>
<div class="mt-4 flex">
<p class="title">{{ object.nazv }}</p>
</div>
<div class="mt-4 flex items-center justify-between">
<div>Тип объекта: {{ object.type }}</div>
<div>Стоимость объекта: {{ formatPrice(object.stoim) }} рублей</div>
</div>
<div class="mt-4 flex justify-between items-center">
<div>
<button class="history-task ml-auto flex add-event" :data-id="object.id">
<img src="@/shared/assets/icons/history-task.svg" alt="История и задачи">
<span class="ml-4">История и задачи</span>
</button>
</div>
<div>Добавил: {{ object.add_user && object.add_user.fio ? object.add_user.fio : '' }}</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { computed } from 'vue';
import dayjs from 'dayjs';
import ru from 'dayjs/locale/ru';
const props = defineProps({
object: {
type: Object,
required: true
},
side: {
type: String,
required: true
},
deal: {
type: Object,
required: true
},
});
const emit = defineEmits(['closeDealObject']);
// Инициализация выбранных объектов при монтировании
// onMounted(() => {
// if (props.side === 'sideOne' && props.deal.side_one_object_id) {
// selectedClient.value = props.deal.side_one_clients;
// } else if (props.side === 'sideTwo' && props.deal.side_two_object_id) {
// selectedClient.value = props.deal.side_two_clients;
// }
// });
const formattedDate = computed(() => {
dayjs.locale(ru);
return dayjs(props.object.date_add).locale('ru').format('D MMMM YYYY H:m');
});
function formatPrice(value) {
return new Intl.NumberFormat('ru-RU').format(value);
}
// Обработка закрытия объекта
const closeDealObject = () => {
//isVisible.value = false;
emit('closeDealObject', props.side);
};
</script>
<style>
.deal-obj-card {
background: linear-gradient(360deg, #F5F5F5 0%, #FFFFFF 100%);
border: 1px solid #E0E0E0;
border-radius: 5px;
.created_at, .stage, .obj-id p {
font-family: 'Lato',sans-serif;
font-style: normal;
font-weight: 400;
font-size: 14px;
line-height: 100%;
color: #757575;
}
.title {
font-family: 'Lato',sans-serif;
font-style: normal;
font-weight: 400;
font-size: 18px;
line-height: 22px;
color: #000000;
}
.history-task {
box-sizing: border-box;
flex-direction: row;
justify-content: center;
align-items: center;
padding: 10px 12px;
background: linear-gradient(360deg, #F5F5F5 0%, #FFFFFF 100%);
border: 1px solid #CDCED0;
border-radius: 3px;
span {
font-family: 'Lato', sans-serif;
font-style: normal;
font-weight: 400;
font-size: 14px;
line-height: 100%;
display: flex;
align-items: center;
text-align: center;
color: #848484;
}
}
.client {
font-family: 'Lato', sans-serif;
font-weight: 400;
font-style: normal;
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-items: center;
font-size: 14px;
line-height: 17px;
align-content: flex-start;
padding: 8px 8px 8px 12px;
background: #FFFFFF;
opacity: 0.8;
border: 1px solid #E0E0E0;
border-radius: 3px;
span {
color: #757575;
margin-right: 5px;
}
p {
text-decoration-line: underline;
color: #000000;
}
}
}
</style>

View File

@ -0,0 +1,422 @@
<template>
<div v-if="requisition" class="mt-3 deal-req-card mr-4 sm:w-1/2 md:w-1/3 lg:w-full p-2 flex">
<div class="p-4 w-full">
<div class="flex items-center">
<div class="created_at">{{ formattedDate }}</div>
<div class="stage ml-4">{{ typeReq }}</div>
<div class="progress-bar-container ml-4 flex w-full">
<div class="progress-bar flex">
<div
v-for="(step, index) in steps"
:key="index"
class="progress-step"
:class="{ 'bg-green-500': index < requisition.stage, 'bg-white': index >= requisition.stage }"
>
</div>
</div>
</div>
<div class="stage-current ml-4"> {{ currentStageName }}</div>
<div class="ml-auto cursor-pointer" @click="closeDealRequisition">
<img src="@/shared/assets/icons/close.svg" alt="Close">
</div>
</div>
<div class="mt-4 flex justify-between items-center">
<p class="title">{{ requisition.name }}</p>
<button class="history-task ml-auto flex req-events-new" :data-id="requisition.id">
<img src="@/shared/assets/icons/history-task.svg" alt="История и задачи">
<span class="ml-4">История и задачи</span>
</button>
</div>
<div class="mt-4 flex flex-wrap">
<!-- Основной клиент -->
<div class="w-1/2 p-2">
<div class="client flex justify-between items-center">
<div class="client-name flex space-x-1">
<span>Клиент:</span>
<p class="client-name-value cursor-pointer neweditClient" :data-id="props.requisition.client ? props.requisition.client.id : ''" :title="props.requisition.client ? props.requisition.client.fio : 'Клиент удален'">
{{ truncatedClientName }}
</p>
</div>
<div class="client-info flex items-center space-x-4">
<div class="client-phone flex space-x-1">
<span>Телефон:</span>
<p class="client-phone-value">{{ props.requisition.client ? props.requisition.client.phone : 'Клиент удален' }}</p>
</div>
<button class="history-task flex client-events-new" :data-id="props.requisition.client ? props.requisition.client.id : ''" @click="openHistoryClient(props.requisition.client ? props.requisition.client.id : '')">
<img src="@/shared/assets/icons/history-task.svg" alt="История и задачи">
</button>
</div>
</div>
</div>
<!-- Дополнительные клиенты стороны 1 -->
<template v-if="props.deal.side_one_clients && props.deal.side_one_clients.length > 0 && props.side === 'sideOne'">
<div v-for="(client, index) in props.deal.side_one_clients" :key="index" class="w-1/2 p-2">
<div class="client flex justify-between items-center">
<div class="client-name flex space-x-1">
<span>Клиент:</span>
<p class="client-name-value cursor-pointer neweditClient" :data-id="client.id" :title="client.fio">
{{ truncateText(client.fio, 12) }}
</p>
</div>
<div class="client-info flex items-center space-x-4">
<div class="client-phone flex space-x-1">
<span>Телефон:</span>
<p class="client-phone-value">{{ client.phone }}</p>
</div>
<button class="history-task flex client-events-new" :data-id="client.id" @click="openHistoryClient(client ? client.id : '')">
<img src="@/shared/assets/icons/history-task.svg" alt="История и задачи">
</button>
</div>
</div>
</div>
</template>
<!-- Дополнительные клиенты стороны 2 -->
<template v-if="props.deal.side_two_clients && props.deal.side_two_clients.length > 0 && props.side === 'sideTwo'">
<div v-for="(client, index) in props.deal.side_two_clients" :key="index" class="w-1/2 p-2">
<div class="client flex justify-between items-center">
<div class="client-name flex space-x-1">
<span>Клиент:</span>
<p class="client-name-value cursor-pointer neweditClient" :data-id="client.id" :title="client.fio">
{{ truncateText(client.fio, 12) }}
</p>
</div>
<div class="client-info flex items-center space-x-4">
<div class="client-phone flex space-x-1">
<span>Телефон:</span>
<p class="client-phone-value">{{ client.phone }}</p>
</div>
<button class="history-task flex client-events-new" :data-id="client.id" @click="openHistoryClient(client ? client.id : '')">
<img src="@/shared/assets/icons/history-task.svg" alt="История и задачи">
</button>
</div>
</div>
</div>
</template>
<!-- Dropdown для выбора клиентов -->
<div class="w-1/2 p-2 flex justify-between items-center">
<div class="client w-full">
<MultiSelect
v-if="Array.isArray(clientsList)"
v-model="selectedClientIds"
:options="clientsList"
optionLabel="fio"
optionValue="id"
placeholder="Выбрать клиента"
class="w-full choiceDealClient"
:maxSelectedLabels="3"
:filter="true"
display="chip"
:virtualScrollerOptions="{ itemSize: 40 }"
>
<template #dropdownicon>
<DropdownIcon />
</template>
</MultiSelect>
</div>
<div class="p-4">
<a href="javascript:{}" class="add_client_new" style="border: none;">
<img src="@/shared/assets/icons/plus-green.svg" alt="Добавить клиента" class="w-6 h-6">
</a>
</div>
</div>
</div>
<div class="mt-4 flex items-center req-id">
<p>ID: {{ requisition.id }}</p>
<p v-if="requisition.user" class="ml-4">Добавил {{ requisition.user.fio }}</p>
<p v-if="requisition.worker" class="ml-4">В работе у {{ requisition.worker.fio }}</p>
</div>
</div>
</div>
</template>
<script setup>
import { computed, ref, onMounted, watch } from 'vue';
import dayjs from 'dayjs';
import ru from 'dayjs/locale/ru';
import DropdownIcon from "@/shared/assets/icons/dropdown-icon.vue";
const props = defineProps({
requisition: {
type: Object,
required: true
},
side: {
type: String, // 'sideOne' или 'sideTwo'
required: true
},
deal: {
type: Object,
required: true
},
clientsList: {
type: Array,
required: true,
},
});
const emit = defineEmits(['closeDealRequisition']); // Добавляем событие для закрытия
const selectedClientIds = ref([]);
onMounted(() => {
if (props.side === 'sideOne' && props.deal.side_one_clients) {
selectedClientIds.value = props.deal.side_one_clients.map(c => c.id);
} else if (props.side === 'sideTwo' && props.deal.side_two_clients) {
selectedClientIds.value = props.deal.side_two_clients.map(c => c.id);
}
});
watch(selectedClientIds, (newIds) => {
const selectedClients = props.clientsList.filter(c => newIds.includes(c.id));
if (props.side === 'sideOne') {
props.deal.side_one_clients = selectedClients;
} else if (props.side === 'sideTwo') {
props.deal.side_two_clients = selectedClients;
}
});
// // Выбранные клиенты
// const selectedClient = ref([]);
//
// // Инициализация выбранных клиентов при монтировании
// onMounted(() => {
// if (props.side === 'sideOne' && props.deal.side_one_clients) {
// selectedClient.value = props.deal.side_one_clients;
// } else if (props.side === 'sideTwo' && props.deal.side_two_clients) {
// selectedClient.value = props.deal.side_two_clients;
// }
// });
//
// // Следим за изменениями selectedClient
// watch(selectedClient, (newValue) => {
// if (props.side === 'sideOne') {
// props.deal.side_one_clients = newValue;
// } else if (props.side === 'sideTwo') {
// props.deal.side_two_clients = newValue;
// }
// });
const formattedDate = computed(() => {
dayjs.locale(ru);
return dayjs(props.requisition.created_at).locale('ru').format('D MMMM YYYY');
});
const truncateText = (text, maxLength) => {
if (text.length > maxLength) {
return text.slice(0, maxLength) + '...';
}
return text;
};
const truncatedClientName = computed(() => {
return props.requisition.client ? truncateText(props.requisition.client.fio, 12) : 'Клиент удален';
});
// Обработка закрытия заявки
const closeDealRequisition = () => {
//isVisible.value = false; // Скрываем компонент
emit('closeDealRequisition', props.side); // Отправляем событие родителю
};
const openHistoryClient = (clientId) => {
if (clientId) {
openClientEventsWindowNew(clientId, 'Array', 0);
} else {
console.error('ID клиента не найден!');
}
};
// Переменные для шагов
const steps = ref([]);
const currentStageName = ref("");
watch(
() => props.requisition,
(newRequisition) => {
if (newRequisition.funnel_id === 0) {
steps.value = [
"Новый",
"В работе",
"Презентация",
"Показ",
"Бронь",
"Подаем на ипотеку",
"Сделка",
"Закрыт",
];
currentStageName.value =
steps.value[newRequisition.stage - 1] || "Неизвестный шаг";
} else {
// Берём шаги из funnel_steps
if (newRequisition.funnel_steps && Array.isArray(newRequisition.funnel_steps)) {
steps.value = newRequisition.funnel_steps.map(step => step.name);
} else {
steps.value = [];
}
currentStageName.value =
newRequisition.funnel_steps?.[newRequisition.stage - 1]?.name ||
"Неизвестный шаг";
}
console.log('newRequisition:', newRequisition);
console.log('steps:', steps.value);
},
{ immediate: true }
);
const REQ_TYPES = {
1: "Подбор объекта",
2: "Реализация объекта",
3: "Другие услуги",
4: "Спрос по нашему объекту",
};
const typeReq = computed(() => {
return REQ_TYPES[props.requisition.type_id] || "Неизвестный тип услуги";
});
</script>
<style>
.deal-req-card {
background: linear-gradient(360deg, #F5F5F5 0%, #FFFFFF 100%);
border: 1px solid #E0E0E0;
border-radius: 5px;
padding: 10px;
.created_at, .stage, .stage-current, .req-id p {
font-family: 'Lato',sans-serif;
font-style: normal;
font-weight: 400;
font-size: 14px;
line-height: 100%;
color: #757575;
}
.title {
font-family: 'Lato',sans-serif;
font-style: normal;
font-weight: 400;
font-size: 18px;
line-height: 22px;
text-decoration-line: underline;
color: #000000;
}
.history-task {
box-sizing: border-box;
flex-direction: row;
justify-content: center;
align-items: center;
padding: 10px;
background: linear-gradient(360deg, #F5F5F5 0%, #FFFFFF 100%);
border: 1px solid #CDCED0;
border-radius: 3px;
span {
font-family: 'Lato', sans-serif;
font-style: normal;
font-weight: 400;
font-size: 14px;
line-height: 100%;
display: flex;
align-items: center;
text-align: center;
color: #848484;
}
}
.client {
font-family: 'Lato', sans-serif;
font-weight: 400;
font-style: normal;
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-items: center;
font-size: 14px;
line-height: 17px;
align-content: flex-start;
padding: 10px 8px 8px 12px;
background: #FFFFFF;
opacity: 0.8;
border: 1px solid #E0E0E0;
border-radius: 3px;
height: 60px;
.client-name {
padding: 0;
border: none;
}
.client-info {
height: auto;
width: auto;
}
span {
color: #757575;
margin-right: 5px;
}
p {
text-decoration-line: underline;
color: #000000;
margin: 0;
}
.p-multiselect.p-inputwrapper.choiceDealClient {
width: 100%!important;
border: none;
padding: 0 !important;
}
}
.progress-bar-container {
max-width: 250px;
}
.progress-bar {
display: flex;
width: 100%;
height: 10px;
overflow: hidden;
border-radius: 4px;
border: 1px solid #DEDEDE;
background-color: #5cb85c;
}
.progress-step {
flex: 1;
position: relative;
}
.progress-step::before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 2px;
background-color: #DEDEDE;
z-index: 1;
}
.progress-step:first-child::before {
display: none;
}
}
</style>

View File

@ -0,0 +1,46 @@
import { ref } from 'vue';
import {
fetchDeal,
createDeal,
uploadDealDocument
} from '@/shared/api/deals';
export default function useDeal() {
const deal = ref(null);
const isLoading = ref(false);
const error = ref(null);
const loadDeal = async (dealId) => {
try {
isLoading.value = true;
const response = await fetchDeal(dealId);
deal.value = response.data;
} catch (err) {
error.value = err.message;
} finally {
isLoading.value = false;
}
};
const saveDeal = async (dealData) => {
try {
isLoading.value = true;
const response = await createDeal(dealData);
deal.value = response.data;
return response;
} catch (err) {
error.value = err.message;
throw err;
} finally {
isLoading.value = false;
}
};
return {
deal,
isLoading,
error,
loadDeal,
saveDeal
};
}

View File

@ -0,0 +1,25 @@
import { ref } from 'vue';
import laravelApiService from '@/services/laravelApiService';
export function useLaravelApi() {
const data = ref(null);
const error = ref(null);
const loading = ref(false);
const fetchData = async (endpoint, options = {}) => {
loading.value = true;
try {
const response = await laravelApiService.fetchData(endpoint, options);
data.value = response.data;
error.value = null;
return response;
} catch (err) {
error.value = err;
throw err;
} finally {
loading.value = false;
}
};
return { data, error, loading, fetchData };
}

52
src/main.js Normal file
View File

@ -0,0 +1,52 @@
import { createApp } from 'vue'
import App from './App.vue'
import { initAuth } from './services/authService'
import DialogService from 'primevue/dialogservice'
import PrimeVue from 'primevue/config'
import ToastService from 'primevue/toastservice'
import ConfirmationService from 'primevue/confirmationservice'
import Aura from '@primevue/themes/aura'
import InputText from 'primevue/inputtext'
import Select from 'primevue/select'
import DatePicker from 'primevue/datepicker'
import InputNumber from 'primevue/inputnumber'
import Button from 'primevue/button'
import MultiSelect from 'primevue/multiselect'
import '@/assets/css/main.css'
await initAuth()
const app = createApp(App)
// Подключаем PrimeVue
app.use(PrimeVue, {
theme: {
preset: Aura,
options: {
prefix: 'p',
darkModeSelector: '.my-app-dark',
cssLayer: false
}
},
locale: {
emptyMessage: 'Нет доступных вариантов'
}
})
app.use(ToastService)
app.use(ConfirmationService)
app.use(DialogService)
app.component('InputText', InputText)
app.component('Select', Select)
app.component('DatePicker', DatePicker)
app.component('InputNumber', InputNumber)
app.component('Button', Button)
app.component('MultiSelect', MultiSelect)
app.mount('#app_deal')

View File

@ -0,0 +1,46 @@
import axios from 'axios'
// Совет: один раз задать базу для прослойки
axios.defaults.baseURL = 'https://joyworkdev.ru/deal/index.php'
export async function initAuth() {
// 1) если токен уже сохранён — ставим заголовок и выходим
const stored = sessionStorage.getItem('access_token')
if (stored) {
axios.defaults.headers.common['Authorization'] = `Bearer ${stored}`
return stored
}
// 2) достаём PHPSESSID
const sessionId = getSessionIdFromCookie()
console.log('sessionId', sessionId)
//const sessionId = 'bfcf0cc168ec34cf8e26950cf1038dc2';
if (!sessionId) {
console.warn('PHPSESSID not found in cookies')
return null
}
try {
// ВАЖНО: через прослойку вызываем как ?path=...
const response = await axios.post('?path=auth/session/token', null, {
headers: {
'X-Session-ID': sessionId
}
})
const token = response.data.access_token
if (!token) throw new Error('No access_token in response')
sessionStorage.setItem('access_token', token)
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`
return token
} catch (error) {
console.error('Failed to get access token:', error.response?.data || error.message)
return null
}
}
function getSessionIdFromCookie() {
const match = document.cookie.match(/(?:^|;\s*)PHPSESSID=([^;]+)/)
return match ? decodeURIComponent(match[1]) : null
}

View File

@ -0,0 +1,75 @@
import { laravel_api_instance, get_user_id } from '@/shared/api';
// Функция для получения куки по имени
const getCookie = (name) => {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
};
const fetchData = (endpoint, options = {}) => {
if (typeof endpoint !== 'string') {
throw new Error('endpoint должен быть строкой');
}
// Деструктурируем headers из options
const { method = 'GET', data, params = {}, headers = {} } = options;
// Получаем PHPSESSID
//const sessionId = getCookie('PHPSESSID');
const isDev = import.meta.env.MODE === 'development';
const sessionId = isDev
? import.meta.env.VITE_DEV_SESSION_ID
: getCookie('PHPSESSID');
//const sessionId = 'bfcf0cc168ec34cf8e26950cf1038dc2';
//const usernameDev = process.env.VUE_APP_BASIC_AUTH_USER;
//const passwordDev = process.env.VUE_APP_BASIC_AUTH_PASS;
//const authDev = btoa(`${usernameDev}:${passwordDev}`);
// Проверяем окружение
//const isDev = process.env.NODE_ENV === 'development';
//let authHeaders = {};
//Добавляем Basic Auth только в dev
// if (isDev) {
// const usernameDev = process.env.VUE_APP_BASIC_AUTH_USER;
// const passwordDev = process.env.VUE_APP_BASIC_AUTH_PASS;
//
// if (usernameDev && passwordDev) {
// const authDev = btoa(`${usernameDev}:${passwordDev}`);
// authHeaders['Authorization'] = `Basic ${authDev}`;
// }
// }
// Извлекаем путь из endpoint: например "/clients"
const path = endpoint.replace(/^\//, '');
const isFormData = data instanceof FormData;
const finalHeaders = { ...headers };
if (isFormData) {
delete finalHeaders['Content-Type'];
}
return laravel_api_instance({
//url: isDev ? '/deal/index.php' : endpoint,
url: '/deal/index.php',
method,
data,
headers: finalHeaders,
params: {
//user_id: get_user_id(),
path,
...params,
},
withCredentials: true
});
};
export default {
fetchData,
};

View File

@ -0,0 +1,43 @@
<template>
<button :disabled="disabled" :class="['btn', theme]"><slot /></button>
</template>
<script setup>
const props =defineProps({
theme: "green" | "grey-icon",
disabled: {
type: Boolean,
default: false
}
});
</script>
<style scoped lang="scss">
.btn {
width: auto;
height: auto;
border-radius: 3px;
display: flex;
justify-content: center;
align-items: center;
column-gap: 6px;
&.green {
padding: 6px 12px;
}
&.brilliant_azure {
padding: 6px 12px;
}
&.grey-icon {
border-radius: 3px;
background: linear-gradient(180deg, #fefefe 0%, #f6f6f6 100%);
padding: 8px;
}
&:disabled {
cursor: not-allowed;
}
}
</style>

42
src/shared/api/core.js Normal file
View File

@ -0,0 +1,42 @@
import axios from 'axios'
import { get_user_id } from './user'
const LARAVEL_API_URL = import.meta.env.VITE_LARAVEL_API_URL
const API_URL = import.meta.env.VITE_API_URL
export const laravel_api_instance = axios.create({
baseURL: LARAVEL_API_URL,
withCredentials: true,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
}
})
export const api_instance = axios.create({
baseURL: API_URL,
withCredentials: true
})
export const callLaravelApi = (endpoint, params = {}) => {
return laravel_api_instance.post(endpoint, {
user_id: get_user_id(),
...params
})
}
export const callApi = (request, params = {}) => {
return api_instance.post('', {
request,
user_id: get_user_id(),
...params
})
}
export const callWithFormData = (request, formData) => {
formData.append('request', request)
formData.append('user_id', get_user_id())
return api_instance.post('', formData, {
headers: { 'Content-Type': 'multipart/form-data' }
})
}

67
src/shared/api/deals.js Normal file
View File

@ -0,0 +1,67 @@
// import { laravelApi } from '@/shared/api.js';
//
// export const fetchDeal = (dealId) => {
// return laravelApi.get(`/deals/${dealId}`);
// };
//
// export const createDeal = (dealData) => {
// return laravelApi.post('/deals', dealData);
// };
//
// export const uploadDealDocument = (formData) => {
// return laravelApi.post('/deals/documents', formData, {
// headers: { 'Content-Type': 'multipart/form-data' }
// });
// };
import laravelApi from '@/services/laravelApiService';
/**
* Сервис для работы с документами сделок
*/
export const dealsApi = {
/**
* Загружает документ
* @param {FormData} formData - Данные документа (name, file, target_id, target_type)
* @returns {Promise} - Ответ сервера
*/
uploadDocument(formData) {
return laravelApi.fetchData('/documents', {
method: 'POST',
data: formData,
headers: {
'Content-Type': 'multipart/form-data', // Важно для FormData!
},
});
},
/**
* Получает список документов сделки
* @param {number} dealId - ID сделки
* @returns {Promise} - Ответ сервера
*/
getDealDocuments(dealId) {
return laravelApi.fetchData('/documents', {
method: 'GET',
params: {
target_id: dealId,
target_type: 10, // Пример типа (уточните актуальное значение)
},
});
},
/**
* Удаляет документ
* @param {number} documentId - ID документа
* @returns {Promise} - Ответ сервера
*/
deleteDocument(documentId) {
return laravelApi.fetchData(`/documents/${documentId}`, {
method: 'DELETE',
});
},
// Другие методы API для сделок...
// getDeal, updateDeal, createDealTask и т.д.
};

3
src/shared/api/index.js Normal file
View File

@ -0,0 +1,3 @@
export * from './core'
export * from './deals'
export * from './user'

7
src/shared/api/user.js Normal file
View File

@ -0,0 +1,7 @@
export const get_user_id = () => {
if (window.auth_user_id) return window.auth_user_id
const el = document.getElementById('session_user_id')
window.auth_user_id = el?.value || null
return window.auth_user_id
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,5 @@
<template>
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none">
<path d="M3 8.2C3 7.07989 3 6.51984 3.21799 6.09202C3.40973 5.71569 3.71569 5.40973 4.09202 5.21799C4.51984 5 5.0799 5 6.2 5H9.67452C10.1637 5 10.4083 5 10.6385 5.05526C10.8425 5.10425 11.0376 5.18506 11.2166 5.29472C11.4184 5.4184 11.5914 5.59135 11.9373 5.93726L12.0627 6.06274C12.4086 6.40865 12.5816 6.5816 12.7834 6.70528C12.9624 6.81494 13.1575 6.89575 13.3615 6.94474C13.5917 7 13.8363 7 14.3255 7H17.8C18.9201 7 19.4802 7 19.908 7.21799C20.2843 7.40973 20.5903 7.71569 20.782 8.09202C21 8.51984 21 9.0799 21 10.2V15.8C21 16.9201 21 17.4802 20.782 17.908C20.5903 18.2843 20.2843 18.5903 19.908 18.782C19.4802 19 18.9201 19 17.8 19H6.2C5.07989 19 4.51984 19 4.09202 18.782C3.71569 18.5903 3.40973 18.2843 3.21799 17.908C3 17.4802 3 16.9201 3 15.8V8.2Z" stroke="#666666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</template>

View File

@ -0,0 +1,13 @@
<template>
<svg
xmlns="http://www.w3.org/2000/svg"
width="120px"
height="120px"
viewBox="0 0 24 24"
id="Layer_1"
data-name="Layer 1"
>
<circle fill="none" stroke="#424242" stroke-miterlimit="10" stroke-width="1.91px" cx="12" cy="12" r="10.5" />
<line fill="none" stroke="#424242" stroke-miterlimit="10" stroke-width="1.91px" x1="19.64" y1="4.36" x2="4.36" y2="19.64" />
</svg>
</template>

View File

@ -0,0 +1,4 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.23999 13.6448L13.76 2.12482" stroke="#EE2222" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M2.23999 2.12482L13.76 13.6448" stroke="#EE2222" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 362 B

View File

@ -0,0 +1,13 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_209_54)">
<path d="M9.33331 14.1666H6.66665V15.1666H9.33331V14.1666ZM1.83331 9.33329V6.66662H0.833313V9.33329H1.83331ZM14.1666 9.04188V9.33329H15.1666V9.04188H14.1666ZM9.92745 3.07403L12.5666 5.4493L13.2356 4.706L10.5964 2.33074L9.92745 3.07403ZM15.1666 9.04188C15.1666 7.91629 15.1767 7.20362 14.8927 6.56593L13.9792 6.97275C14.1566 7.37095 14.1666 7.82795 14.1666 9.04188H15.1666ZM12.5666 5.4493C13.4689 6.26135 13.8019 6.57461 13.9792 6.97275L14.8927 6.56593C14.6087 5.92823 14.0722 5.45897 13.2356 4.706L12.5666 5.4493ZM6.68651 1.83329C7.74105 1.83329 8.13898 1.84101 8.49365 1.97711L8.85191 1.04349C8.28405 0.825566 7.66531 0.833286 6.68651 0.833286V1.83329ZM10.5964 2.33074C9.87245 1.67914 9.41978 1.26138 8.85191 1.04349L8.49365 1.97711C8.84845 2.11324 9.14765 2.37219 9.92745 3.07403L10.5964 2.33074ZM6.66665 14.1666C5.39543 14.1666 4.49232 14.1656 3.80721 14.0734C3.13649 13.9833 2.75005 13.8142 2.46791 13.532L1.76081 14.2392C2.25972 14.738 2.89235 14.9594 3.67397 15.0646C4.44119 15.1677 5.4237 15.1666 6.66665 15.1666V14.1666ZM0.833313 9.33329C0.833313 10.5762 0.832253 11.5588 0.9354 12.326C1.04049 13.1076 1.2619 13.7402 1.76081 14.2392L2.46791 13.532C2.18577 13.2499 2.01666 12.8634 1.92649 12.1928C1.83437 11.5076 1.83331 10.6045 1.83331 9.33329H0.833313ZM9.33331 15.1666C10.5762 15.1666 11.5588 15.1677 12.326 15.0646C13.1076 14.9594 13.7402 14.738 14.2392 14.2392L13.532 13.532C13.2499 13.8142 12.8634 13.9833 12.1928 14.0734C11.5076 14.1656 10.6045 14.1666 9.33331 14.1666V15.1666ZM14.1666 9.33329C14.1666 10.6045 14.1656 11.5076 14.0734 12.1928C13.9833 12.8634 13.8142 13.2499 13.532 13.532L14.2392 14.2392C14.738 13.7402 14.9594 13.1076 15.0646 12.326C15.1677 11.5588 15.1666 10.5762 15.1666 9.33329H14.1666ZM1.83331 6.66662C1.83331 5.39541 1.83437 4.49229 1.92649 3.80719C2.01666 3.13646 2.18577 2.75003 2.46791 2.46789L1.76081 1.76078C1.2619 2.25969 1.04049 2.89232 0.9354 3.67394C0.832253 4.44117 0.833313 5.42367 0.833313 6.66662H1.83331ZM6.68651 0.833286C5.4369 0.833286 4.44959 0.832232 3.67923 0.935332C2.89486 1.04031 2.26011 1.26149 1.76081 1.76078L2.46791 2.46789C2.74967 2.18614 3.13729 2.01679 3.81188 1.9265C4.50048 1.83434 5.40872 1.83329 6.68651 1.83329V0.833286Z" fill="#757575"/>
<path d="M4 9.66675H9.33333" stroke="#757575" stroke-linecap="round"/>
<path d="M4 12H7.66667" stroke="#757575" stroke-linecap="round"/>
<path d="M8.66669 1.66675V3.33341C8.66669 4.90476 8.66669 5.69043 9.15482 6.17859C9.64302 6.66675 10.4287 6.66675 12 6.66675H14.6667" stroke="#757575"/>
</g>
<defs>
<clipPath id="clip0_209_54">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1,5 @@
<template>
<svg width="16" height="14" viewBox="0 0 16 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M16 1.13335H0V0.0666809H16V1.13335ZM16 5.40001H0V4.33335H16V5.40001ZM16 9.66668H0V8.60001H16V9.66668ZM16 13.9333H0V12.8667H16V13.9333Z" fill="#9E9E9E"/>
</svg>
</template>

View File

@ -0,0 +1,9 @@
<svg width="21" height="21" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect width="21" height="21" fill="url(#pattern0_209_64)"/>
<defs>
<pattern id="pattern0_209_64" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#image0_209_64" transform="translate(-0.380952 -0.619048) scale(0.047619)"/>
</pattern>
<image id="image0_209_64" width="39" height="43" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAArCAIAAAB0AwYZAAABiklEQVRYCe2W25HDIAxF038RFGAKUAfQgVIDNKEdiYfBQwx4nPhjyY9jIDrS1QXyoic+ryegtKjfln0pvBS+T4Hlpvu0bEe6pLC3WimltPXtoN3Reaq3erOOAzu7XQSPUbm4AEBQShuBEjmjlQIkon1Bt05eMECNxTm7qcioInMeiqufKL1H5SKkmor06WUUfIUqwoqdktQpi7uo0rzcSHqznPk14OEdoc7oPJXyaD97tRJCdKxYBlCMw4XKhy2GoBLY2W2oHWdU8UmuTCLu2yYUESTdM4vi99An1D0WE7zVgM7A8WSQcYRq4yJ0sBNUMK4VjscO2bSWVQ2eoP6mVrZJ4dgf9TVoUnRXWtjycG7qHR6ONjU6bQyS/Vo6heUoZ2/ar3IiWh+Pe8kjCB/2a5kBOY+Dt9CJm5LCD5zD8RYDDN6qagtp5QmE4Xu+W6uEztfnp3M4L4iZdB5j1DKIt5CumsPhUK46/z5PjX8hyq18jmjMXqE2wkwOLeqkYNPLl8LTkk3+4D8p/AeopBVJuHAuVAAAAABJRU5ErkJggg=="/>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,10 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_78_326)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M3.34075 7.71645L4.19526 6.86191C4.45561 6.60155 4.87772 6.60155 5.13807 6.86191C5.39842 7.12225 5.39842 7.54438 5.13807 7.80471L3.13807 9.80471C3.01305 9.92971 2.84348 9.99998 2.66667 9.99998C2.48985 9.99998 2.32029 9.92971 2.19526 9.80471L0.195262 7.80471C-0.0650874 7.54438 -0.0650874 7.12225 0.195262 6.86191C0.455612 6.60155 0.87772 6.60155 1.13807 6.86191L2.00541 7.72925C2.14745 4.17287 5.07545 1.33331 8.66667 1.33331C12.3486 1.33331 15.3333 4.31808 15.3333 7.99998C15.3333 11.6818 12.3486 14.6666 8.66667 14.6666C6.57212 14.6666 4.70287 13.6999 3.48176 12.1909C3.25015 11.9047 3.29443 11.4849 3.58065 11.2533C3.86686 11.0217 4.28665 11.066 4.51825 11.3522C5.49709 12.5618 6.99154 13.3333 8.66667 13.3333C11.6122 13.3333 14 10.9455 14 7.99998C14 5.05446 11.6122 2.66665 8.66667 2.66665C5.81628 2.66665 3.48815 4.90273 3.34075 7.71645ZM8.66667 3.33331C9.03487 3.33331 9.33334 3.63179 9.33334 3.99998V7.72385L11.1381 9.52858C11.3984 9.78891 11.3984 10.211 11.1381 10.4714C10.8777 10.7317 10.4556 10.7317 10.1953 10.4714L8.19527 8.47138C8.07027 8.34638 8.00001 8.17678 8.00001 7.99998V3.99998C8.00001 3.63179 8.29847 3.33331 8.66667 3.33331Z" fill="#9E9E9E"/>
</g>
<defs>
<clipPath id="clip0_78_326">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,3 @@
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.5 0.375H1.5C1.20284 0.378885 0.918943 0.498659 0.708801 0.708801C0.498659 0.918943 0.378885 1.20284 0.375 1.5V7.5C0.378885 7.79716 0.498659 8.08106 0.708801 8.2912C0.918943 8.50134 1.20284 8.62111 1.5 8.625H7.5C7.79716 8.62111 8.08106 8.50134 8.2912 8.2912C8.50134 8.08106 8.62111 7.79716 8.625 7.5V1.5C8.62111 1.20284 8.50134 0.918943 8.2912 0.708801C8.08106 0.498659 7.79716 0.378885 7.5 0.375ZM6.375 6.375H2.625V2.625H6.375V6.375ZM28.5 0.375H22.5C22.2028 0.378885 21.9189 0.498659 21.7088 0.708801C21.4987 0.918943 21.3789 1.20284 21.375 1.5V7.5C21.3789 7.79716 21.4987 8.08106 21.7088 8.2912C21.9189 8.50134 22.2028 8.62111 22.5 8.625H28.5C28.7972 8.62111 29.0811 8.50134 29.2912 8.2912C29.5013 8.08106 29.6211 7.79716 29.625 7.5V1.5C29.6211 1.20284 29.5013 0.918943 29.2912 0.708801C29.0811 0.498659 28.7972 0.378885 28.5 0.375ZM27.375 6.375H23.625V2.625H27.375V6.375ZM18 0.375H12C11.7028 0.378885 11.4189 0.498659 11.2088 0.708801C10.9987 0.918943 10.8789 1.20284 10.875 1.5V7.5C10.8789 7.79716 10.9987 8.08106 11.2088 8.2912C11.4189 8.50134 11.7028 8.62111 12 8.625H18C18.2972 8.62111 18.5811 8.50134 18.7912 8.2912C19.0013 8.08106 19.1211 7.79716 19.125 7.5V1.5C19.1211 1.20284 19.0013 0.918943 18.7912 0.708801C18.5811 0.498659 18.2972 0.378885 18 0.375ZM16.875 6.375H13.125V2.625H16.875V6.375ZM7.5 10.875H1.5C1.20284 10.8789 0.918943 10.9987 0.708801 11.2088C0.498659 11.4189 0.378885 11.7028 0.375 12V18C0.378885 18.2972 0.498659 18.5811 0.708801 18.7912C0.918943 19.0013 1.20284 19.1211 1.5 19.125H7.5C7.79716 19.1211 8.08106 19.0013 8.2912 18.7912C8.50134 18.5811 8.62111 18.2972 8.625 18V12C8.62111 11.7028 8.50134 11.4189 8.2912 11.2088C8.08106 10.9987 7.79716 10.8789 7.5 10.875ZM6.375 16.875H2.625V13.125H6.375V16.875ZM18 10.875H12C11.7028 10.8789 11.4189 10.9987 11.2088 11.2088C10.9987 11.4189 10.8789 11.7028 10.875 12V18C10.8789 18.2972 10.9987 18.5811 11.2088 18.7912C11.4189 19.0013 11.7028 19.1211 12 19.125H18C18.2972 19.1211 18.5811 19.0013 18.7912 18.7912C19.0013 18.5811 19.1211 18.2972 19.125 18V12C19.1211 11.7028 19.0013 11.4189 18.7912 11.2088C18.5811 10.9987 18.2972 10.8789 18 10.875ZM16.875 16.875H13.125V13.125H16.875V16.875ZM28.5 10.875H22.5C22.2028 10.8789 21.9189 10.9987 21.7088 11.2088C21.4987 11.4189 21.3789 11.7028 21.375 12V18C21.3789 18.2972 21.4987 18.5811 21.7088 18.7912C21.9189 19.0013 22.2028 19.1211 22.5 19.125H28.5C28.7972 19.1211 29.0811 19.0013 29.2912 18.7912C29.5013 18.5811 29.6211 18.2972 29.625 18V12C29.6211 11.7028 29.5013 11.4189 29.2912 11.2088C29.0811 10.9987 28.7972 10.8789 28.5 10.875ZM27.375 16.875H23.625V13.125H27.375V16.875ZM18 21.375H12C11.7028 21.3789 11.4189 21.4987 11.2088 21.7088C10.9987 21.9189 10.8789 22.2028 10.875 22.5V28.5C10.8789 28.7972 10.9987 29.0811 11.2088 29.2912C11.4189 29.5013 11.7028 29.6211 12 29.625H18C18.2972 29.6211 18.5811 29.5013 18.7912 29.2912C19.0013 29.0811 19.1211 28.7972 19.125 28.5V22.5C19.1211 22.2028 19.0013 21.9189 18.7912 21.7088C18.5811 21.4987 18.2972 21.3789 18 21.375ZM16.875 27.375H13.125V23.625H16.875V27.375Z" fill="#4CAF50"/>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1,3 @@
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21 12H22.5C22.8978 12 23.2794 11.842 23.5607 11.5607C23.842 11.2794 24 10.8978 24 10.5C24 10.1022 23.842 9.72064 23.5607 9.43934C23.2794 9.15804 22.8978 9 22.5 9H21C20.6022 9 20.2206 9.15804 19.9393 9.43934C19.658 9.72064 19.5 10.1022 19.5 10.5C19.5 10.8978 19.658 11.2794 19.9393 11.5607C20.2206 11.842 20.6022 12 21 12ZM21 18H22.5C22.8978 18 23.2794 17.842 23.5607 17.5607C23.842 17.2794 24 16.8978 24 16.5C24 16.1022 23.842 15.7206 23.5607 15.4393C23.2794 15.158 22.8978 15 22.5 15H21C20.6022 15 20.2206 15.158 19.9393 15.4393C19.658 15.7206 19.5 16.1022 19.5 16.5C19.5 16.8978 19.658 17.2794 19.9393 17.5607C20.2206 17.842 20.6022 18 21 18ZM13.5 12H15C15.3978 12 15.7794 11.842 16.0607 11.5607C16.342 11.2794 16.5 10.8978 16.5 10.5C16.5 10.1022 16.342 9.72064 16.0607 9.43934C15.7794 9.15804 15.3978 9 15 9H13.5C13.1022 9 12.7206 9.15804 12.4393 9.43934C12.158 9.72064 12 10.1022 12 10.5C12 10.8978 12.158 11.2794 12.4393 11.5607C12.7206 11.842 13.1022 12 13.5 12ZM13.5 18H15C15.3978 18 15.7794 17.842 16.0607 17.5607C16.342 17.2794 16.5 16.8978 16.5 16.5C16.5 16.1022 16.342 15.7206 16.0607 15.4393C15.7794 15.158 15.3978 15 15 15H13.5C13.1022 15 12.7206 15.158 12.4393 15.4393C12.158 15.7206 12 16.1022 12 16.5C12 16.8978 12.158 17.2794 12.4393 17.5607C12.7206 17.842 13.1022 18 13.5 18ZM31.5 30H30V4.5C30 4.10218 29.842 3.72064 29.5607 3.43934C29.2794 3.15804 28.8978 3 28.5 3H7.5C7.10218 3 6.72064 3.15804 6.43934 3.43934C6.15804 3.72064 6 4.10218 6 4.5V30H4.5C4.10218 30 3.72064 30.158 3.43934 30.4393C3.15804 30.7206 3 31.1022 3 31.5C3 31.8978 3.15804 32.2794 3.43934 32.5607C3.72064 32.842 4.10218 33 4.5 33H31.5C31.8978 33 32.2794 32.842 32.5607 32.5607C32.842 32.2794 33 31.8978 33 31.5C33 31.1022 32.842 30.7206 32.5607 30.4393C32.2794 30.158 31.8978 30 31.5 30ZM19.5 30H16.5V24H19.5V30ZM27 30H22.5V22.5C22.5 22.1022 22.342 21.7206 22.0607 21.4393C21.7794 21.158 21.3978 21 21 21H15C14.6022 21 14.2206 21.158 13.9393 21.4393C13.658 21.7206 13.5 22.1022 13.5 22.5V30H9V6H27V30Z" fill="#4CAF50"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,3 @@
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.31 8.31H9.81C9.41218 8.31 9.03064 8.46804 8.74934 8.74934C8.46804 9.03064 8.31 9.41218 8.31 9.81V11.31C8.31 11.7078 8.46804 12.0894 8.74934 12.3707C9.03064 12.652 9.41218 12.81 9.81 12.81C10.2078 12.81 10.5894 12.652 10.8707 12.3707C11.152 12.0894 11.31 11.7078 11.31 11.31C11.7078 11.31 12.0894 11.152 12.3707 10.8707C12.652 10.5894 12.81 10.2078 12.81 9.81C12.81 9.41218 12.652 9.03064 12.3707 8.74934C12.0894 8.46804 11.7078 8.31 11.31 8.31ZM20.19 17.19C19.7922 17.19 19.4106 17.348 19.1293 17.6293C18.848 17.9106 18.69 18.2922 18.69 18.69C18.2922 18.69 17.9106 18.848 17.6293 19.1293C17.348 19.4106 17.19 19.7922 17.19 20.19C17.19 20.5878 17.348 20.9694 17.6293 21.2507C17.9106 21.532 18.2922 21.69 18.69 21.69H20.19C20.387 21.69 20.582 21.6512 20.764 21.5758C20.946 21.5004 21.1114 21.3899 21.2507 21.2507C21.3899 21.1114 21.5004 20.946 21.5758 20.764C21.6512 20.582 21.69 20.387 21.69 20.19V18.69C21.69 18.2922 21.532 17.9106 21.2507 17.6293C20.9694 17.348 20.5878 17.19 20.19 17.19ZM28.5 8.31H21.69V1.5C21.69 1.10218 21.532 0.720644 21.2507 0.43934C20.9694 0.158035 20.5878 0 20.19 0H1.5C1.10218 0 0.720644 0.158035 0.43934 0.43934C0.158035 0.720644 0 1.10218 0 1.5V20.19C0 20.5878 0.158035 20.9694 0.43934 21.2507C0.720644 21.532 1.10218 21.69 1.5 21.69H8.31V28.5C8.31 28.8978 8.46804 29.2794 8.74934 29.5607C9.03064 29.842 9.41218 30 9.81 30H28.5C28.8978 30 29.2794 29.842 29.5607 29.5607C29.842 29.2794 30 28.8978 30 28.5V9.81C30 9.41218 29.842 9.03064 29.5607 8.74934C29.2794 8.46804 28.8978 8.31 28.5 8.31ZM27 27H11.31V21.69C11.7078 21.69 12.0894 21.532 12.3707 21.2507C12.652 20.9694 12.81 20.5878 12.81 20.19C12.81 19.7922 12.652 19.4106 12.3707 19.1293C12.0894 18.848 11.7078 18.69 11.31 18.69C11.31 18.2922 11.152 17.9106 10.8707 17.6293C10.5894 17.348 10.2078 17.19 9.81 17.19C9.41218 17.19 9.03064 17.348 8.74934 17.6293C8.46804 17.9106 8.31 18.2922 8.31 18.69H3V3H18.69V8.31C18.2922 8.31 17.9106 8.46804 17.6293 8.74934C17.348 9.03064 17.19 9.41218 17.19 9.81C17.19 10.2078 17.348 10.5894 17.6293 10.8707C17.9106 11.152 18.2922 11.31 18.69 11.31C18.69 11.7078 18.848 12.0894 19.1293 12.3707C19.4106 12.652 19.7922 12.81 20.19 12.81C20.5878 12.81 20.9694 12.652 21.2507 12.3707C21.532 12.0894 21.69 11.7078 21.69 11.31H27V27Z" fill="#4CAF50"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,3 @@
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M28.5 0H1.5C1.10218 0 0.720644 0.158035 0.43934 0.43934C0.158035 0.720644 0 1.10218 0 1.5V28.5C0 28.8978 0.158035 29.2794 0.43934 29.5607C0.720644 29.842 1.10218 30 1.5 30H28.5C28.8978 30 29.2794 29.842 29.5607 29.5607C29.842 29.2794 30 28.8978 30 28.5V1.5C30 1.10218 29.842 0.720644 29.5607 0.43934C29.2794 0.158035 28.8978 0 28.5 0ZM13.5 27H3V16.5H13.5V27ZM13.5 13.5H3V3H13.5V13.5ZM27 27H16.5V16.5H27V27ZM27 13.5H16.5V3H27V13.5Z" fill="#4CAF50"/>
</svg>

After

Width:  |  Height:  |  Size: 561 B

View File

@ -0,0 +1,14 @@
<template>
<svg
xmlns="http://www.w3.org/2000/svg"
width="40px"
height="40px"
viewBox="0 0 45 45"
fill="none"
>
<path
d="M24.155 8.78099L24.33 8.94499L37.402 21.787L36 23.213L34.2 21.445L34.201 35C34.201 36.054 33.385 36.918 32.35 36.994L32.201 37H12.201C11.147 37 10.283 36.184 10.206 35.149L10.201 35L10.2 21.446L8.402 23.213L7 21.787L20.058 8.95799C21.171 7.82199 22.966 7.75899 24.155 8.78099ZM21.569 10.285L21.473 10.372L12.2 19.481L12.201 35L17.2 34.999L17.201 25C17.201 23.946 18.017 23.082 19.052 23.005L19.201 23H25.201C26.255 23 27.119 23.816 27.196 24.851L27.201 25L27.2 34.999L32.201 35L32.2 19.48L22.901 10.344C22.537 9.98699 21.969 9.96499 21.569 10.285ZM25.201 25H19.201L19.2 34.999H25.2L25.201 25Z"
fill="#3C3C3C"
/>
</svg>
</template>

View File

@ -0,0 +1,10 @@
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_128_48)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M24 11.3571V13.6428H13.2V23.9286H10.8V13.6428H0V11.3571H10.8V1.07141H13.2V11.3571H24Z" fill="#64A853"/>
</g>
<defs>
<clipPath id="clip0_128_48">
<rect width="24" height="24" fill="white" transform="translate(0 0.5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 477 B

View File

@ -0,0 +1,18 @@
<template>
<svg
fill="#4CAF50"
height="24px"
width="24px"
version="1.1"
id="Layer_1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 455 455"
xml:space="preserve"
>
<polygon
points="455,212.5 242.5,212.5 242.5,0 212.5,0 212.5,212.5 0,212.5 0,242.5 212.5,242.5 212.5,455 242.5,455 242.5,242.5
455,242.5 "
/>
</svg>
</template>

View File

@ -0,0 +1,16 @@
<template>
<svg
xmlns="http://www.w3.org/2000/svg"
width="20px"
height="20px"
viewBox="0 0 20 20"
version="1.1"
>
<g id="layer1">
<path
d="M 4 4.2910156 L 3.2910156 5 L 3.6464844 5.3535156 L 10 11.708984 L 16.353516 5.3535156 L 16.708984 5 L 16 4.2910156 L 15.646484 4.6464844 L 10 10.291016 L 4.3535156 4.6464844 L 4 4.2910156 z M 4 8.2910156 L 3.2910156 9 L 3.6464844 9.3535156 L 10 15.708984 L 16.353516 9.3535156 L 16.708984 9 L 16 8.2910156 L 15.646484 8.6464844 L 10 14.291016 L 4.3535156 8.6464844 L 4 8.2910156 z "
style="fill: #757575; fill-opacity: 1; stroke: none; stroke-width: 0px"
/>
</g>
</svg>
</template>

View File

@ -0,0 +1,6 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<g>
<path d="M16.8911 0H10.7019C10.0901 0 9.59242 0.497735 9.59242 1.10946C9.59242 1.72118 10.0901 2.21892 10.7019 2.21892H14.2127L8.35629 8.07522C8.14663 8.28475 8.03125 8.56332 8.03125 8.85976C8.03125 9.15621 8.14657 9.43472 8.35616 9.64406C8.56576 9.85384 8.84426 9.96929 9.14071 9.96929C9.43703 9.96929 9.71566 9.8539 9.92532 9.64425L15.7816 3.78789V7.29866C15.7816 7.91038 16.2794 8.40812 16.8911 8.40812C17.5028 8.40812 18.0005 7.91038 18.0005 7.29866V1.10946C18.0005 0.497735 17.5028 0 16.8911 0Z" fill="#757579"/>
<path d="M12.7516 16.0981H1.90193V5.24837H10.0619L11.9638 3.34644H0.950965C0.425779 3.34644 0 3.77221 0 4.2974V17.049C0 17.5742 0.425779 18 0.950965 18H13.7026C14.2278 18 14.6536 17.5742 14.6536 17.049V6.03615L12.7516 7.93808V16.0981Z" fill="#757579"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 906 B

View File

@ -0,0 +1,11 @@
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="14" r="14" fill="#41A0DA"/>
<g clip-path="url(#clip0_135_68)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.1849 8.95319C19.9101 8.64781 20.6877 9.26109 20.5596 10.0376L19.047 19.2087C18.9011 20.093 17.9299 20.6004 17.1187 20.1597C16.4398 19.791 15.4326 19.2234 14.5249 18.6303C14.0716 18.3341 12.6837 17.3844 12.8543 16.7083C13.0001 16.1302 15.3334 13.9583 16.6667 12.6666C17.1905 12.1592 16.9519 11.8661 16.3334 12.3333C14.799 13.4922 12.3356 15.2541 11.5209 15.75C10.8022 16.1874 10.4269 16.2621 9.97925 16.1874C9.16183 16.0512 8.40398 15.8403 7.78526 15.5838C6.94901 15.2372 6.98975 14.088 7.78469 13.7533L19.1849 8.95319Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_135_68">
<rect width="16" height="16" fill="white" transform="translate(6 6)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 915 B

View File

@ -0,0 +1,4 @@
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="14" cy="14" r="14" fill="#2ED56C"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.33335 14C8.33335 10.8704 10.8704 8.33333 14 8.33333C17.1296 8.33333 19.6667 10.8704 19.6667 14C19.6667 17.1296 17.1296 19.6667 14 19.6667C12.8852 19.6667 11.8475 19.3455 10.972 18.7907C10.8091 18.6875 10.6094 18.6599 10.4246 18.7151L8.50513 19.2879L9.22783 17.5969C9.31325 17.397 9.29587 17.1681 9.18125 16.9834C8.64381 16.1173 8.33335 15.0959 8.33335 14ZM14 7C10.134 7 7.00002 10.134 7.00002 14C7.00002 15.2254 7.31545 16.3789 7.86977 17.3818L6.72032 20.0713C6.6187 20.3091 6.66375 20.5842 6.83589 20.7771C7.00803 20.9701 7.27622 21.0461 7.524 20.9721L10.5236 20.077C11.5483 20.6643 12.7358 21 14 21C17.866 21 21 17.866 21 14C21 10.134 17.866 7 14 7ZM15.5283 15.4549L14.6522 16.0721C14.2419 15.8383 13.7882 15.5121 13.3331 15.057C12.8601 14.5839 12.5094 14.0955 12.2508 13.6475L12.8075 13.1749C13.0465 12.9721 13.1119 12.6302 12.9647 12.3535L12.2552 11.0202C12.1597 10.8406 11.9874 10.7145 11.7874 10.6777C11.5874 10.6409 11.3815 10.6973 11.2283 10.8311L11.018 11.0146C10.5122 11.4561 10.213 12.1815 10.4609 12.9161C10.718 13.6775 11.2666 14.876 12.3904 15.9998C13.5994 17.2089 14.8275 17.685 15.5457 17.8699C16.1244 18.0189 16.672 17.8192 17.0579 17.5048L17.4522 17.1835C17.6209 17.0461 17.7119 16.8349 17.696 16.6179C17.6801 16.4009 17.5593 16.2053 17.3723 16.0939L16.2535 15.4273C16.0275 15.2927 15.7435 15.3035 15.5283 15.4549Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,7 @@
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21 6.47998C17.67 6.14998 14.32 5.97998 10.98 5.97998C9 5.97998 7.02 6.07998 5.04 6.27998L3 6.47998" stroke="#9E9E9E" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M8.5 5.47L8.72 4.16C8.88 3.21 9 2.5 10.69 2.5H13.31C15 2.5 15.13 3.25 15.28 4.17L15.5 5.47" stroke="#9E9E9E" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M18.85 9.64001L18.2 19.71C18.09 21.28 18 22.5 15.21 22.5H8.79002C6.00002 22.5 5.91002 21.28 5.80002 19.71L5.15002 9.64001" stroke="#9E9E9E" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M10.33 17H13.66" stroke="#9E9E9E" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9.5 13H14.5" stroke="#9E9E9E" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 845 B

View File

@ -0,0 +1,10 @@
<svg width="37" height="37" viewBox="0 0 37 37" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M37 15H0V16H37V15Z" fill="#757575"/>
<path d="M37 31H0V32H37V31Z" fill="#757575"/>
<path d="M37 5H0V6H37V5Z" fill="#757575"/>
<path d="M37 21H0V22H37V21Z" fill="#757575"/>
<path d="M1 15L1 5H0L0 15H1Z" fill="#757575"/>
<path d="M1 31L1 21H0L0 31H1Z" fill="#757575"/>
<path d="M37 15V5H36V15H37Z" fill="#757575"/>
<path d="M37 31V21H36V31H37Z" fill="#757575"/>
</svg>

After

Width:  |  Height:  |  Size: 472 B

View File

@ -0,0 +1,25 @@
<svg width="37" height="37" viewBox="0 0 37 37" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1_67)">
<path d="M1 32L1 23H0L0 32H1Z" fill="#757575"/>
<path d="M23 32V23H22V32H23Z" fill="#757575"/>
<path d="M29 32V23H28V32H29Z" fill="#757575"/>
<path d="M9 32V23H8V32H9Z" fill="#757575"/>
<path d="M15 32V23H14V32H15Z" fill="#757575"/>
<path d="M37 32V23H36V32H37Z" fill="#757575"/>
<path d="M0 24H9V23H0V24Z" fill="#757575"/>
<path d="M0 32H9V31H0V32Z" fill="#757575"/>
<path d="M14 24H23V23H14V24Z" fill="#757575"/>
<path d="M28 24H37V23H28V24Z" fill="#757575"/>
<path d="M28 32H37V31H28V32Z" fill="#757575"/>
<path d="M14 32H23V31H14V32Z" fill="#757575"/>
<path d="M37 15H0V16H37V15Z" fill="#757575"/>
<path d="M37 5H0V6H37V5Z" fill="#757575"/>
<path d="M1 15L1 5H0L0 15H1Z" fill="#757575"/>
<path d="M37 15V5H36V15H37Z" fill="#757575"/>
</g>
<defs>
<clipPath id="clip0_1_67">
<rect width="37" height="27" fill="white" transform="translate(0 5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1004 B

View File

@ -0,0 +1,33 @@
<svg width="37" height="37" viewBox="0 0 37 37" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1_39)">
<path d="M1 15L1 6H0L0 15H1Z" fill="#757575"/>
<path d="M11 15V6H10V15H11Z" fill="#757575"/>
<path d="M0 6L11 6V5L0 5V6Z" fill="#757575"/>
<path d="M0 16L11 16V15L0 15V16Z" fill="#757575"/>
<path d="M1 31L1 22H0L0 31H1Z" fill="#757575"/>
<path d="M11 31V22H10V31H11Z" fill="#757575"/>
<path d="M0 22H11V21H0V22Z" fill="#757575"/>
<path d="M0 32H11V31H0V32Z" fill="#757575"/>
<path d="M14 15V6H13V15H14Z" fill="#757575"/>
<path d="M24 15V6H23V15H24Z" fill="#757575"/>
<path d="M13 6L24 6V5L13 5V6Z" fill="#757575"/>
<path d="M13 16L24 16V15L13 15V16Z" fill="#757575"/>
<path d="M14 31V22H13V31H14Z" fill="#757575"/>
<path d="M24 31V22H23V31H24Z" fill="#757575"/>
<path d="M13 22H24V21H13V22Z" fill="#757575"/>
<path d="M13 32H24V31H13V32Z" fill="#757575"/>
<path d="M27 15V6H26V15H27Z" fill="#757575"/>
<path d="M37 15V6H36V15H37Z" fill="#757575"/>
<path d="M26 6L37 6V5L26 5V6Z" fill="#757575"/>
<path d="M26 16L37 16V15L26 15V16Z" fill="#757575"/>
<path d="M27 31V22H26V31H27Z" fill="#757575"/>
<path d="M37 31V22H36V31H37Z" fill="#757575"/>
<path d="M26 22H37V21H26V22Z" fill="#757575"/>
<path d="M26 32H37V31H26V32Z" fill="#757575"/>
</g>
<defs>
<clipPath id="clip0_1_39">
<rect width="37" height="27" fill="white" transform="translate(0 5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,5 @@
<template>
<svg xmlns="http://www.w3.org/2000/svg" width="18px" height="18px" viewBox="0 0 24 24" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.24223 4.5H17.7578L19.5 8.85556V18L18.75 18.75H5.25L4.5 18V8.85556L6.24223 4.5ZM7.25777 6L6.35777 8.25H17.6422L16.7422 6H7.25777ZM18 9.75H6V17.25H18V9.75ZM14.4053 13.3447L13.3446 14.4054L12.75 13.8108V15.75H11.25V13.8106L10.6553 14.4054L9.59461 13.3447L11.9999 10.9394L14.4053 13.3447Z" fill="#454444"/>
</svg>
</template>

View File

@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9ZM11 12C11 11.4477 11.4477 11 12 11C12.5523 11 13 11.4477 13 12C13 12.5523 12.5523 13 12 13C11.4477 13 11 12.5523 11 12Z" fill="#000000"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M21.83 11.2807C19.542 7.15186 15.8122 5 12 5C8.18777 5 4.45796 7.15186 2.17003 11.2807C1.94637 11.6844 1.94361 12.1821 2.16029 12.5876C4.41183 16.8013 8.1628 19 12 19C15.8372 19 19.5882 16.8013 21.8397 12.5876C22.0564 12.1821 22.0536 11.6844 21.83 11.2807ZM12 17C9.06097 17 6.04052 15.3724 4.09173 11.9487C6.06862 8.59614 9.07319 7 12 7C14.9268 7 17.9314 8.59614 19.9083 11.9487C17.9595 15.3724 14.939 17 12 17Z" fill="#000000"/>
</svg>

After

Width:  |  Height:  |  Size: 888 B

View File

@ -0,0 +1,3 @@
<svg width="18" height="17" viewBox="0 0 18 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10.667 5.16699H11.5003C11.7213 5.16699 11.9333 5.07919 12.0896 4.92291C12.2459 4.76663 12.3337 4.55467 12.3337 4.33366C12.3337 4.11264 12.2459 3.90068 12.0896 3.7444C11.9333 3.58812 11.7213 3.50033 11.5003 3.50033H10.667C10.446 3.50033 10.234 3.58812 10.0777 3.7444C9.92146 3.90068 9.83366 4.11264 9.83366 4.33366C9.83366 4.55467 9.92146 4.76663 10.0777 4.92291C10.234 5.07919 10.446 5.16699 10.667 5.16699ZM10.667 8.50033H11.5003C11.7213 8.50033 11.9333 8.41253 12.0896 8.25625C12.2459 8.09997 12.3337 7.88801 12.3337 7.66699C12.3337 7.44598 12.2459 7.23402 12.0896 7.07774C11.9333 6.92146 11.7213 6.83366 11.5003 6.83366H10.667C10.446 6.83366 10.234 6.92146 10.0777 7.07774C9.92146 7.23402 9.83366 7.44598 9.83366 7.66699C9.83366 7.88801 9.92146 8.09997 10.0777 8.25625C10.234 8.41253 10.446 8.50033 10.667 8.50033ZM6.50033 5.16699H7.33366C7.55467 5.16699 7.76663 5.07919 7.92291 4.92291C8.07919 4.76663 8.16699 4.55467 8.16699 4.33366C8.16699 4.11264 8.07919 3.90068 7.92291 3.7444C7.76663 3.58812 7.55467 3.50033 7.33366 3.50033H6.50033C6.27931 3.50033 6.06735 3.58812 5.91107 3.7444C5.75479 3.90068 5.66699 4.11264 5.66699 4.33366C5.66699 4.55467 5.75479 4.76663 5.91107 4.92291C6.06735 5.07919 6.27931 5.16699 6.50033 5.16699ZM6.50033 8.50033H7.33366C7.55467 8.50033 7.76663 8.41253 7.92291 8.25625C8.07919 8.09997 8.16699 7.88801 8.16699 7.66699C8.16699 7.44598 8.07919 7.23402 7.92291 7.07774C7.76663 6.92146 7.55467 6.83366 7.33366 6.83366H6.50033C6.27931 6.83366 6.06735 6.92146 5.91107 7.07774C5.75479 7.23402 5.66699 7.44598 5.66699 7.66699C5.66699 7.88801 5.75479 8.09997 5.91107 8.25625C6.06735 8.41253 6.27931 8.50033 6.50033 8.50033ZM16.5003 15.167H15.667V1.00033C15.667 0.779312 15.5792 0.56735 15.4229 0.41107C15.2666 0.25479 15.0547 0.166992 14.8337 0.166992H3.16699C2.94598 0.166992 2.73402 0.25479 2.57774 0.41107C2.42146 0.56735 2.33366 0.779312 2.33366 1.00033V15.167H1.50033C1.27931 15.167 1.06735 15.2548 0.91107 15.4111C0.75479 15.5673 0.666992 15.7793 0.666992 16.0003C0.666992 16.2213 0.75479 16.4333 0.91107 16.5896C1.06735 16.7459 1.27931 16.8337 1.50033 16.8337H16.5003C16.7213 16.8337 16.9333 16.7459 17.0896 16.5896C17.2459 16.4333 17.3337 16.2213 17.3337 16.0003C17.3337 15.7793 17.2459 15.5673 17.0896 15.4111C16.9333 15.2548 16.7213 15.167 16.5003 15.167ZM9.83366 15.167H8.16699V11.8337H9.83366V15.167ZM14.0003 15.167H11.5003V11.0003C11.5003 10.7793 11.4125 10.5674 11.2562 10.4111C11.1 10.2548 10.888 10.167 10.667 10.167H7.33366C7.11265 10.167 6.90068 10.2548 6.7444 10.4111C6.58812 10.5674 6.50033 10.7793 6.50033 11.0003V15.167H4.00033V1.83366H14.0003V15.167Z" fill="#4CAF50"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,3 @@
<svg width="18" height="17" viewBox="0 0 18 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.95033 4.78366H6.11699C5.89598 4.78366 5.68402 4.87146 5.52774 5.02774C5.37146 5.18402 5.28366 5.39598 5.28366 5.61699V6.45033C5.28366 6.67134 5.37146 6.8833 5.52774 7.03958C5.68402 7.19586 5.89598 7.28366 6.11699 7.28366C6.33801 7.28366 6.54997 7.19586 6.70625 7.03958C6.86253 6.8833 6.95033 6.67134 6.95033 6.45033C7.17134 6.45033 7.3833 6.36253 7.53958 6.20625C7.69586 6.04997 7.78366 5.83801 7.78366 5.61699C7.78366 5.39598 7.69586 5.18402 7.53958 5.02774C7.3833 4.87146 7.17134 4.78366 6.95033 4.78366ZM11.8837 9.71699C11.6626 9.71699 11.4507 9.80479 11.2944 9.96107C11.1381 10.1174 11.0503 10.3293 11.0503 10.5503C10.8293 10.5503 10.6174 10.6381 10.4611 10.7944C10.3048 10.9507 10.217 11.1626 10.217 11.3837C10.217 11.6047 10.3048 11.8166 10.4611 11.9729C10.6174 12.1292 10.8293 12.217 11.0503 12.217H11.8837C11.9931 12.217 12.1015 12.1954 12.2026 12.1536C12.3037 12.1117 12.3955 12.0503 12.4729 11.9729C12.5503 11.8955 12.6117 11.8037 12.6536 11.7026C12.6954 11.6015 12.717 11.4931 12.717 11.3837V10.5503C12.717 10.3293 12.6292 10.1174 12.4729 9.96107C12.3166 9.80479 12.1047 9.71699 11.8837 9.71699ZM16.5003 4.78366H12.717V1.00033C12.717 0.779312 12.6292 0.56735 12.4729 0.41107C12.3166 0.25479 12.1047 0.166992 11.8837 0.166992H1.50033C1.27931 0.166992 1.06735 0.25479 0.91107 0.41107C0.75479 0.56735 0.666992 0.779312 0.666992 1.00033V11.3837C0.666992 11.6047 0.75479 11.8166 0.91107 11.9729C1.06735 12.1292 1.27931 12.217 1.50033 12.217H5.28366V16.0003C5.28366 16.2213 5.37146 16.4333 5.52774 16.5896C5.68402 16.7459 5.89598 16.8337 6.11699 16.8337H16.5003C16.7213 16.8337 16.9333 16.7459 17.0896 16.5896C17.2459 16.4333 17.3337 16.2213 17.3337 16.0003V5.61699C17.3337 5.39598 17.2459 5.18402 17.0896 5.02774C16.9333 4.87146 16.7213 4.78366 16.5003 4.78366ZM15.667 15.167H6.95033V12.217C7.17134 12.217 7.3833 12.1292 7.53958 11.9729C7.69586 11.8166 7.78366 11.6047 7.78366 11.3837C7.78366 11.1626 7.69586 10.9507 7.53958 10.7944C7.3833 10.6381 7.17134 10.5503 6.95033 10.5503C6.95033 10.3293 6.86253 10.1174 6.70625 9.96107C6.54997 9.80479 6.33801 9.71699 6.11699 9.71699C5.89598 9.71699 5.68402 9.80479 5.52774 9.96107C5.37146 10.1174 5.28366 10.3293 5.28366 10.5503H2.33366V1.83366H11.0503V4.78366C10.8293 4.78366 10.6174 4.87146 10.4611 5.02774C10.3048 5.18402 10.217 5.39598 10.217 5.61699C10.217 5.83801 10.3048 6.04997 10.4611 6.20625C10.6174 6.36253 10.8293 6.45033 11.0503 6.45033C11.0503 6.67134 11.1381 6.8833 11.2944 7.03958C11.4507 7.19586 11.6626 7.28366 11.8837 7.28366C12.1047 7.28366 12.3166 7.19586 12.4729 7.03958C12.6292 6.8833 12.717 6.67134 12.717 6.45033H15.667V15.167Z" fill="#4CAF50"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,13 @@
<svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_636_6204)">
<path d="M8.46153 0.5H0.769246C0.344396 0.5 0 0.844396 0 1.26925V8.96157C0 9.38642 0.344396 9.73082 0.769246 9.73082H8.46157C8.88642 9.73082 9.23082 9.38642 9.23082 8.96157V1.26925C9.23077 0.844396 8.88638 0.5 8.46153 0.5ZM7.69233 8.19233H1.53845V2.03845H7.69228V8.19233H7.69233Z" fill="#4CAF50"/>
<path d="M19.2311 0.5H11.5388C11.1139 0.5 10.7695 0.844396 10.7695 1.26925V8.96157C10.7695 9.38642 11.1139 9.73082 11.5388 9.73082H19.2311C19.656 9.73082 20.0004 9.38642 20.0004 8.96157V1.26925C20.0003 0.844396 19.6559 0.5 19.2311 0.5ZM18.4619 8.19233H12.308V2.03845H18.4619V8.19233Z" fill="#4CAF50"/>
<path d="M8.46153 11.2693H0.769246C0.344396 11.2693 0 11.6137 0 12.0385V19.7309C0 20.1557 0.344396 20.5001 0.769246 20.5001H8.46157C8.88642 20.5001 9.23082 20.1557 9.23082 19.7309V12.0385C9.23077 11.6137 8.88638 11.2693 8.46153 11.2693ZM7.69233 18.9616H1.53845V12.8078H7.69228V18.9616H7.69233Z" fill="#4CAF50"/>
<path d="M19.2311 11.2693H11.5388C11.1139 11.2693 10.7695 11.6137 10.7695 12.0385V19.7309C10.7695 20.1557 11.1139 20.5001 11.5388 20.5001H19.2311C19.656 20.5001 20.0004 20.1557 20.0004 19.7309V12.0385C20.0003 11.6137 19.6559 11.2693 19.2311 11.2693ZM18.4619 18.9616H12.308V12.8078H18.4619V18.9616Z" fill="#4CAF50"/>
</g>
<defs>
<clipPath id="clip0_636_6204">
<rect width="20" height="20" fill="white" transform="translate(0 0.5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,3 @@
<svg width="18" height="17" viewBox="0 0 18 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.5003 0.166504H1.50033C1.27931 0.166504 1.06735 0.254301 0.91107 0.410582C0.75479 0.566862 0.666992 0.778823 0.666992 0.999837V15.9998C0.666992 16.2208 0.75479 16.4328 0.91107 16.5891C1.06735 16.7454 1.27931 16.8332 1.50033 16.8332H16.5003C16.7213 16.8332 16.9333 16.7454 17.0896 16.5891C17.2459 16.4328 17.3337 16.2208 17.3337 15.9998V0.999837C17.3337 0.778823 17.2459 0.566862 17.0896 0.410582C16.9333 0.254301 16.7213 0.166504 16.5003 0.166504ZM8.16699 15.1665H2.33366V9.33317H8.16699V15.1665ZM8.16699 7.6665H2.33366V1.83317H8.16699V7.6665ZM15.667 15.1665H9.83366V9.33317H15.667V15.1665ZM15.667 7.6665H9.83366V1.83317H15.667V7.6665Z" fill="#4CAF50"/>
</svg>

After

Width:  |  Height:  |  Size: 769 B

View File

@ -0,0 +1,5 @@
<svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3.33333 11.3337H16.6667C16.8877 11.3337 17.0996 11.2459 17.2559 11.0896C17.4122 10.9333 17.5 10.7213 17.5 10.5003C17.5 10.2793 17.4122 10.0674 17.2559 9.91107C17.0996 9.75479 16.8877 9.66699 16.6667 9.66699H3.33333C3.11232 9.66699 2.90036 9.75479 2.74408 9.91107C2.5878 10.0674 2.5 10.2793 2.5 10.5003C2.5 10.7213 2.5878 10.9333 2.74408 11.0896C2.90036 11.2459 3.11232 11.3337 3.33333 11.3337Z" fill="#4CAF50"/>
<path d="M16.6667 4.66699H3.33333C3.11232 4.66699 2.90036 4.75479 2.74408 4.91107C2.5878 5.06735 2.5 5.27931 2.5 5.50033C2.5 5.72134 2.5878 5.9333 2.74408 6.08958C2.90036 6.24586 3.11232 6.33366 3.33333 6.33366H16.6667C16.8877 6.33366 17.0996 6.24586 17.2559 6.08958C17.4122 5.9333 17.5 5.72134 17.5 5.50033C17.5 5.27931 17.4122 5.06735 17.2559 4.91107C17.0996 4.75479 16.8877 4.66699 16.6667 4.66699Z" fill="#4CAF50"/>
<path d="M3.33333 16.3337H16.6667C16.8877 16.3337 17.0996 16.2459 17.2559 16.0896C17.4122 15.9333 17.5 15.7213 17.5 15.5003C17.5 15.2793 17.4122 15.0673 17.2559 14.9111C17.0996 14.7548 16.8877 14.667 16.6667 14.667H3.33333C3.11232 14.667 2.90036 14.7548 2.74408 14.9111C2.5878 15.0673 2.5 15.2793 2.5 15.5003C2.5 15.7213 2.5878 15.9333 2.74408 16.0896C2.90036 16.2459 3.11232 16.3337 3.33333 16.3337Z" fill="#4CAF50"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,3 @@
<svg width="18" height="17" viewBox="0 0 18 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.83333 0.375H1.5C1.33491 0.377158 1.17719 0.443699 1.06044 0.560445C0.943699 0.677191 0.877158 0.834911 0.875 1V4.33333C0.877158 4.49842 0.943699 4.65614 1.06044 4.77289C1.17719 4.88963 1.33491 4.95617 1.5 4.95833H4.83333C4.99842 4.95617 5.15614 4.88963 5.27289 4.77289C5.38963 4.65614 5.45617 4.49842 5.45833 4.33333V1C5.45617 0.834911 5.38963 0.677191 5.27289 0.560445C5.15614 0.443699 4.99842 0.377158 4.83333 0.375ZM4.20833 3.70833H2.125V1.625H4.20833V3.70833ZM16.5 0.375H13.1667C13.0016 0.377158 12.8439 0.443699 12.7271 0.560445C12.6104 0.677191 12.5438 0.834911 12.5417 1V4.33333C12.5438 4.49842 12.6104 4.65614 12.7271 4.77289C12.8439 4.88963 13.0016 4.95617 13.1667 4.95833H16.5C16.6651 4.95617 16.8228 4.88963 16.9396 4.77289C17.0563 4.65614 17.1228 4.49842 17.125 4.33333V1C17.1228 0.834911 17.0563 0.677191 16.9396 0.560445C16.8228 0.443699 16.6651 0.377158 16.5 0.375ZM15.875 3.70833H13.7917V1.625H15.875V3.70833ZM10.6667 0.375H7.33333C7.16824 0.377158 7.01052 0.443699 6.89378 0.560445C6.77703 0.677191 6.71049 0.834911 6.70833 1V4.33333C6.71049 4.49842 6.77703 4.65614 6.89378 4.77289C7.01052 4.88963 7.16824 4.95617 7.33333 4.95833H10.6667C10.8318 4.95617 10.9895 4.88963 11.1062 4.77289C11.223 4.65614 11.2895 4.49842 11.2917 4.33333V1C11.2895 0.834911 11.223 0.677191 11.1062 0.560445C10.9895 0.443699 10.8318 0.377158 10.6667 0.375ZM10.0417 3.70833H7.95833V1.625H10.0417V3.70833ZM4.83333 6.20833H1.5C1.33491 6.21049 1.17719 6.27703 1.06044 6.39378C0.943699 6.51052 0.877158 6.66824 0.875 6.83333V10.1667C0.877158 10.3318 0.943699 10.4895 1.06044 10.6062C1.17719 10.723 1.33491 10.7895 1.5 10.7917H4.83333C4.99842 10.7895 5.15614 10.723 5.27289 10.6062C5.38963 10.4895 5.45617 10.3318 5.45833 10.1667V6.83333C5.45617 6.66824 5.38963 6.51052 5.27289 6.39378C5.15614 6.27703 4.99842 6.21049 4.83333 6.20833ZM4.20833 9.54167H2.125V7.45833H4.20833V9.54167ZM10.6667 6.20833H7.33333C7.16824 6.21049 7.01052 6.27703 6.89378 6.39378C6.77703 6.51052 6.71049 6.66824 6.70833 6.83333V10.1667C6.71049 10.3318 6.77703 10.4895 6.89378 10.6062C7.01052 10.723 7.16824 10.7895 7.33333 10.7917H10.6667C10.8318 10.7895 10.9895 10.723 11.1062 10.6062C11.223 10.4895 11.2895 10.3318 11.2917 10.1667V6.83333C11.2895 6.66824 11.223 6.51052 11.1062 6.39378C10.9895 6.27703 10.8318 6.21049 10.6667 6.20833ZM10.0417 9.54167H7.95833V7.45833H10.0417V9.54167ZM16.5 6.20833H13.1667C13.0016 6.21049 12.8439 6.27703 12.7271 6.39378C12.6104 6.51052 12.5438 6.66824 12.5417 6.83333V10.1667C12.5438 10.3318 12.6104 10.4895 12.7271 10.6062C12.8439 10.723 13.0016 10.7895 13.1667 10.7917H16.5C16.6651 10.7895 16.8228 10.723 16.9396 10.6062C17.0563 10.4895 17.1228 10.3318 17.125 10.1667V6.83333C17.1228 6.66824 17.0563 6.51052 16.9396 6.39378C16.8228 6.27703 16.6651 6.21049 16.5 6.20833ZM15.875 9.54167H13.7917V7.45833H15.875V9.54167ZM10.6667 12.0417H7.33333C7.16824 12.0438 7.01052 12.1104 6.89378 12.2271C6.77703 12.3439 6.71049 12.5016 6.70833 12.6667V16C6.71049 16.1651 6.77703 16.3228 6.89378 16.4396C7.01052 16.5563 7.16824 16.6228 7.33333 16.625H10.6667C10.8318 16.6228 10.9895 16.5563 11.1062 16.4396C11.223 16.3228 11.2895 16.1651 11.2917 16V12.6667C11.2895 12.5016 11.223 12.3439 11.1062 12.2271C10.9895 12.1104 10.8318 12.0438 10.6667 12.0417ZM10.0417 15.375H7.95833V13.2917H10.0417V15.375Z" fill="#4CAF50"/>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="none">
<g id="Menu / Close_SM">
<path id="Vector" d="M16 16L12 12M12 12L8 8M12 12L16 8M12 12L8 16" stroke="red" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 298 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

@ -0,0 +1,20 @@
<svg
width="16"
height="17"
viewBox="0 0 16 17"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M15.375 7.875H0.625C0.279813 7.875 0 8.15481 0 8.5C0 8.84519 0.279813 9.125 0.625 9.125H15.375C15.7202 9.125 16 8.84519 16 8.5C16 8.15481 15.7202 7.875 15.375 7.875Z"
fill="#9E9E9E"
/>
<path
d="M15.375 2.875H0.625C0.279813 2.875 0 3.15481 0 3.5C0 3.84519 0.279813 4.125 0.625 4.125H15.375C15.7202 4.125 16 3.84519 16 3.5C16 3.15481 15.7202 2.875 15.375 2.875Z"
fill="#9E9E9E"
/>
<path
d="M15.375 12.875H0.625C0.279813 12.875 0 13.1548 0 13.5C0 13.8452 0.279813 14.125 0.625 14.125H15.375C15.7202 14.125 16 13.8452 16 13.5C16 13.1548 15.7202 12.875 15.375 12.875Z"
fill="#9E9E9E"
/>
</svg>

After

Width:  |  Height:  |  Size: 786 B

View File

@ -0,0 +1,12 @@
<svg
width="18"
height="18"
viewBox="0 0 18 18"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M15.75 9.00002C15.5511 9.00002 15.3603 9.07903 15.2197 9.21969C15.079 9.36034 15 9.5511 15 9.75002V14.25C15 14.4489 14.921 14.6397 14.7803 14.7803C14.6397 14.921 14.4489 15 14.25 15H3.75C3.55109 15 3.36032 14.921 3.21967 14.7803C3.07902 14.6397 3 14.4489 3 14.25V3.75002C3 3.5511 3.07902 3.36034 3.21967 3.21969C3.36032 3.07903 3.55109 3.00002 3.75 3.00002H8.25C8.44891 3.00002 8.63968 2.921 8.78033 2.78035C8.92098 2.63969 9 2.44893 9 2.25002C9 2.0511 8.92098 1.86034 8.78033 1.71969C8.63968 1.57903 8.44891 1.50002 8.25 1.50002H3.75C3.15326 1.50002 2.58097 1.73707 2.15901 2.15903C1.73705 2.58098 1.5 3.15328 1.5 3.75002V14.25C1.5 14.8468 1.73705 15.419 2.15901 15.841C2.58097 16.263 3.15326 16.5 3.75 16.5H14.25C14.8467 16.5 15.419 16.263 15.841 15.841C16.2629 15.419 16.5 14.8468 16.5 14.25V9.75002C16.5 9.5511 16.421 9.36034 16.2803 9.21969C16.1397 9.07903 15.9489 9.00002 15.75 9.00002ZM4.5 9.57001V12.75C4.5 12.9489 4.57902 13.1397 4.71967 13.2803C4.86032 13.421 5.05109 13.5 5.25 13.5H8.43C8.5287 13.5006 8.62655 13.4817 8.71793 13.4443C8.80931 13.407 8.89242 13.352 8.9625 13.2825L14.1525 8.08502L16.2825 6.00002C16.3528 5.93029 16.4086 5.84734 16.4467 5.75595C16.4847 5.66455 16.5043 5.56652 16.5043 5.46752C16.5043 5.36851 16.4847 5.27048 16.4467 5.17908C16.4086 5.08769 16.3528 5.00474 16.2825 4.93502L13.1025 1.71752C13.0328 1.64722 12.9498 1.59142 12.8584 1.55335C12.767 1.51527 12.669 1.49567 12.57 1.49567C12.471 1.49567 12.373 1.51527 12.2816 1.55335C12.1902 1.59142 12.1072 1.64722 12.0375 1.71752L9.9225 3.84002L4.7175 9.03752C4.64799 9.1076 4.59299 9.19071 4.55567 9.28209C4.51835 9.37346 4.49943 9.47131 4.5 9.57001ZM12.57 3.30752L14.6925 5.43002L13.6275 6.49502L11.505 4.37252L12.57 3.30752ZM6 9.87752L10.4475 5.43002L12.57 7.55252L8.1225 12H6V9.87752Z"
fill="#666666"
/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" width="130px" height="130px" viewBox="0 0 217.267 217.267" style="enable-background:new 0 0 217.267 217.267;" xml:space="preserve">
<g>
<path d="M163.627,138.057c1.94,0,3.505-1.564,3.505-3.505V83.749c0-1.937-1.564-3.504-3.505-3.504 c-1.937,0-3.504,1.567-3.504,3.504v50.803C160.123,136.493,161.69,138.057,163.627,138.057z" fill="#506979"></path>
<path d="M108.633,0C48.73,0,0,48.732,0,108.633c0,29.931,12.167,57.071,31.816,76.738c0.014,0.014,0.017,0.034,0.031,0.048 s0.032,0.018,0.046,0.031c19.666,19.646,46.807,31.815,76.74,31.815c59.901,0,108.634-48.731,108.634-108.633S168.531,0,108.633,0 z M108.633,7.009c26.758,0,51.12,10.416,69.285,27.379l-26.936,26.938H52.564c-9.661,0-17.521,7.861-17.521,17.521v59.573 c0,9.661,7.861,17.521,17.521,17.521h3.805l-21.979,21.978C17.42,159.753,7.009,135.394,7.009,108.633 C7.009,52.599,52.595,7.009,108.633,7.009z M86.196,108.63c0-12.363,10.056-22.42,22.417-22.42c4.921,0,9.466,1.615,13.172,4.313 l-1.875,1.875c-3.207-2.24-7.094-3.564-11.297-3.564c-10.913,0-19.789,8.879-19.789,19.792c0,4.195,1.321,8.09,3.559,11.3 l-1.874,1.868C87.811,118.095,86.196,113.554,86.196,108.63z M131.034,108.63c0,12.364-10.054,22.418-22.418,22.418 c-4.915,0-9.449-1.608-13.145-4.298l1.874-1.876c3.203,2.231,7.082,3.546,11.274,3.546c10.91,0,19.794-8.877,19.794-19.791 c0-4.187-1.321-8.071-3.549-11.272l1.875-1.875C129.433,99.181,131.034,103.717,131.034,108.63z M95.833,108.63 c0-7.051,5.735-12.784,12.78-12.784c2.257,0,4.347,0.639,6.184,1.668l-17.304,17.306C96.469,112.972,95.833,110.885,95.833,108.63 z M121.397,108.63c0,7.049-5.735,12.782-12.781,12.782c-2.244,0-4.322-0.633-6.158-1.652l17.29-17.289 C120.769,104.31,121.397,106.383,121.397,108.63z M90.467,131.753c5.005,3.936,11.298,6.311,18.146,6.311 c16.229,0,29.431-13.206,29.431-29.431c0-6.848-2.375-13.141-6.311-18.149l22.148-22.146h10.814 c5.797,0,10.513,4.717,10.513,10.513v59.573c0,5.797-4.716,10.513-10.513,10.513H73.289L90.467,131.753z M126.784,85.523 c-5.007-3.948-11.311-6.326-18.168-6.326c-16.23,0-29.426,13.204-29.426,29.429c0,6.858,2.375,13.158,6.321,18.172l-22.136,22.135 H52.561c-5.797,0-10.513-4.716-10.513-10.514V78.847c0-5.795,4.716-10.513,10.513-10.513h91.413L126.784,85.523z M108.633,210.257 c-26.759,0-51.12-10.417-69.287-27.377l26.934-26.939h98.422c9.66,0,17.521-7.86,17.521-17.521V78.847 c0-9.661-7.861-17.521-17.521-17.521h-3.806l21.977-21.979c16.968,18.17,27.381,42.529,27.381,69.287 C210.258,164.667,164.667,210.257,108.633,210.257z" fill="#506979"></path>
<path d="M53.002,54.317h23.654c1.937,0,3.504-1.567,3.504-3.504s-1.567-3.504-3.504-3.504H53.002 c-1.938,0-3.504,1.567-3.504,3.504S51.064,54.317,53.002,54.317z" fill="#506979"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="23px" height="23px" viewBox="0 0 24 24" fill="none">
<path
d="M11 3H13C13.5523 3 14 3.44772 14 4V4.56879C14 4.99659 14.2871 5.36825 14.6822 5.53228C15.0775 5.69638 15.5377 5.63384 15.8403 5.33123L16.2426 4.92891C16.6331 4.53838 17.2663 4.53838 17.6568 4.92891L19.071 6.34312C19.4616 6.73365 19.4615 7.36681 19.071 7.75734L18.6688 8.1596C18.3661 8.46223 18.3036 8.92247 18.4677 9.31774C18.6317 9.71287 19.0034 10 19.4313 10L20 10C20.5523 10 21 10.4477 21 11V13C21 13.5523 20.5523 14 20 14H19.4312C19.0034 14 18.6318 14.2871 18.4677 14.6822C18.3036 15.0775 18.3661 15.5377 18.6688 15.8403L19.071 16.2426C19.4616 16.6331 19.4616 17.2663 19.071 17.6568L17.6568 19.071C17.2663 19.4616 16.6331 19.4616 16.2426 19.071L15.8403 18.6688C15.5377 18.3661 15.0775 18.3036 14.6822 18.4677C14.2871 18.6318 14 19.0034 14 19.4312V20C14 20.5523 13.5523 21 13 21H11C10.4477 21 10 20.5523 10 20V19.4313C10 19.0034 9.71287 18.6317 9.31774 18.4677C8.92247 18.3036 8.46223 18.3661 8.1596 18.6688L7.75732 19.071C7.36679 19.4616 6.73363 19.4616 6.34311 19.071L4.92889 17.6568C4.53837 17.2663 4.53837 16.6331 4.92889 16.2426L5.33123 15.8403C5.63384 15.5377 5.69638 15.0775 5.53228 14.6822C5.36825 14.2871 4.99659 14 4.56879 14H4C3.44772 14 3 13.5523 3 13V11C3 10.4477 3.44772 10 4 10L4.56877 10C4.99658 10 5.36825 9.71288 5.53229 9.31776C5.6964 8.9225 5.63386 8.46229 5.33123 8.15966L4.92891 7.75734C4.53838 7.36681 4.53838 6.73365 4.92891 6.34313L6.34312 4.92891C6.73365 4.53839 7.36681 4.53839 7.75734 4.92891L8.15966 5.33123C8.46228 5.63386 8.9225 5.6964 9.31776 5.53229C9.71288 5.36825 10 4.99658 10 4.56876V4C10 3.44772 10.4477 3 11 3Z"
stroke="#000000" stroke-width="1.5" />
<path
d="M14 12C14 13.1046 13.1046 14 12 14C10.8954 14 10 13.1046 10 12C10 10.8954 10.8954 10 12 10C13.1046 10 14 10.8954 14 12Z"
stroke="#000000" stroke-width="1.5" />
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="23px" height="23px" viewBox="0 0 24 24" fill="none">
<rect width="24" height="24" fill="white" />
<path d="M5 7.5H19L18 21H6L5 7.5Z" stroke="#000000" stroke-linejoin="round" />
<path d="M15.5 9.5L15 19" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" />
<path d="M12 9.5V19" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" />
<path d="M8.5 9.5L9 19" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" />
<path
d="M16 5H19C20.1046 5 21 5.89543 21 7V7.5H3V7C3 5.89543 3.89543 5 5 5H8M16 5L15 3H9L8 5M16 5H8"
stroke="#000000" stroke-linejoin="round" />
</svg>

After

Width:  |  Height:  |  Size: 688 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 B

Some files were not shown because too many files have changed in this diff Show More