initial commit

This commit is contained in:
Geetha 2025-10-27 11:52:32 +05:30
parent 176ee3370e
commit a107a4cb84
131 changed files with 12940 additions and 0 deletions

53
ipi-survey-platform/.gitignore vendored Normal file
View File

@ -0,0 +1,53 @@
# These are some examples of commonly ignored file patterns.
# You should customize this list as applicable to your project.
# Learn more about .gitignore:
# https://www.atlassian.com/git/tutorials/saving-changes/gitignore
# Node artifact files
node_modules/
dist/
# Compiled Java class files
*.class
# Compiled Python bytecode
*.py[cod]
# Log files
*.log
# Package files
*.jar
# Maven
target/
dist/
# JetBrains IDE
.idea/
# Unit test reports
TEST*.xml
# Generated by MacOS
.DS_Store
# Generated by Windows
Thumbs.db
# Applications
*.app
*.exe
*.war
# Large media files
*.mp4
*.tiff
*.avi
*.flv
*.mov
*.wmv
.env

View File

@ -0,0 +1,16 @@
# React + Vite
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
Currently, two official plugins are available:
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
## React Compiler
The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
## Expanding the ESLint configuration
If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project.

View File

@ -0,0 +1,29 @@
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import { defineConfig, globalIgnores } from 'eslint/config'
export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{js,jsx}'],
extends: [
js.configs.recommended,
reactHooks.configs['recommended-latest'],
reactRefresh.configs.vite,
],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
parserOptions: {
ecmaVersion: 'latest',
ecmaFeatures: { jsx: true },
sourceType: 'module',
},
},
rules: {
'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],
},
},
])

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>ipi-survey-platform</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>

3906
ipi-survey-platform/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,33 @@
{
"name": "ipi-survey-platform",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"lint": "eslint .",
"preview": "vite preview"
},
"dependencies": {
"axios": "^1.12.2",
"react": "^19.1.1",
"react-dom": "^19.1.1",
"react-router-dom": "^7.9.4"
},
"devDependencies": {
"@eslint/js": "^9.36.0",
"@tailwindcss/postcss": "^4.1.14",
"@types/react": "^19.1.16",
"@types/react-dom": "^19.1.9",
"@vitejs/plugin-react": "^5.0.4",
"autoprefixer": "^10.4.21",
"eslint": "^9.36.0",
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.22",
"globals": "^16.4.0",
"postcss": "^8.5.6",
"tailwindcss": "^4.1.14",
"vite": "^7.1.7"
}
}

View File

@ -0,0 +1,5 @@
import tailwind from '@tailwindcss/postcss'
export default {
plugins: [tailwind],
}

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

View File

@ -0,0 +1,42 @@
#root {
max-width: 1280px;
margin: 0 auto;
padding: 2rem;
text-align: center;
}
.logo {
height: 6em;
padding: 1.5em;
will-change: filter;
transition: filter 300ms;
}
.logo:hover {
filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.react:hover {
filter: drop-shadow(0 0 2em #61dafbaa);
}
@keyframes logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@media (prefers-reduced-motion: no-preference) {
a:nth-of-type(2) .logo {
animation: logo-spin infinite 20s linear;
}
}
.card {
padding: 2em;
}
.read-the-docs {
color: #888;
}

View File

@ -0,0 +1,35 @@
import React from 'react'
import { Routes, Route, Navigate } from 'react-router-dom'
import Dashboard from './pages/Dashboard/Dashboard'
import AdminDashboard from './pages/Admin/AdminDashboard'
import AdminUsers from './pages/Admin/AdminUsers'
import Validations from './pages/Admin/Validations'
import ValidationReview from './pages/Admin/ValidationReview'
import Configuration from './pages/Admin/Configuration'
import Survey from './pages/Survey/Survey'
import Login from './pages/Login/Login'
import History from './pages/History/History'
import ChangePassword from './pages/ChangePassword/ChangePassword'
import ForgotPassword from './pages/ForgotPassword/ForgotPassword'
function App() {
return (
<Routes>
<Route path="/login" element={<Login />} />
<Route path="/history" element={<History />} />
<Route path="/dashboard" element={<Dashboard />} />
<Route path="/admin/dashboard" element={<AdminDashboard />} />
<Route path="/admin/validations" element={<Validations />} />
<Route path="/admin/validations/:id" element={<ValidationReview />} />
<Route path="/admin/configuration" element={<Configuration />} />
<Route path="/admin/users" element={<AdminUsers />} />
<Route path="/" element={<Navigate to="/dashboard" replace />} />
<Route path="/survey" element={<Survey />} />
<Route path="/change-password" element={<ChangePassword />} />
<Route path="/forgot-password" element={<ForgotPassword />} />
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
)
}
export default App

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.6484 19.8751C20.2206 17.4067 18.0203 15.6367 15.4525 14.7976C16.7226 14.0415 17.7094 12.8893 18.2614 11.518C18.8134 10.1468 18.8999 8.63224 18.5078 7.20701C18.1157 5.78178 17.2666 4.52467 16.0909 3.62873C14.9151 2.73279 13.4778 2.24756 11.9996 2.24756C10.5215 2.24756 9.08414 2.73279 7.90842 3.62873C6.73269 4.52467 5.88358 5.78178 5.49146 7.20701C5.09935 8.63224 5.18592 10.1468 5.73788 11.518C6.28984 12.8893 7.27668 14.0415 8.54683 14.7976C5.97902 15.6357 3.77871 17.4057 2.35089 19.8751C2.29853 19.9605 2.2638 20.0555 2.24875 20.1545C2.2337 20.2535 2.23863 20.3545 2.26326 20.4516C2.28789 20.5487 2.33171 20.6399 2.39214 20.7197C2.45257 20.7996 2.52838 20.8666 2.6151 20.9167C2.70183 20.9667 2.79771 20.999 2.89709 21.0114C2.99647 21.0238 3.09733 21.0163 3.19373 20.9891C3.29012 20.9619 3.3801 20.9157 3.45835 20.8532C3.5366 20.7907 3.60154 20.7131 3.64933 20.6251C5.41558 17.5726 8.53746 15.7501 11.9996 15.7501C15.4618 15.7501 18.5837 17.5726 20.35 20.6251C20.3977 20.7131 20.4627 20.7907 20.5409 20.8532C20.6192 20.9157 20.7092 20.9619 20.8056 20.9891C20.902 21.0163 21.0028 21.0238 21.1022 21.0114C21.2016 20.999 21.2975 20.9667 21.3842 20.9167C21.4709 20.8666 21.5467 20.7996 21.6072 20.7197C21.6676 20.6399 21.7114 20.5487 21.736 20.4516C21.7607 20.3545 21.7656 20.2535 21.7505 20.1545C21.7355 20.0555 21.7008 19.9605 21.6484 19.8751ZM6.74964 9.00011C6.74964 7.96176 7.05755 6.94672 7.63443 6.08337C8.21131 5.22001 9.03124 4.5471 9.99056 4.14974C10.9499 3.75238 12.0055 3.64841 13.0239 3.85099C14.0423 4.05356 14.9777 4.55357 15.712 5.2878C16.4462 6.02202 16.9462 6.95748 17.1488 7.97589C17.3513 8.99429 17.2474 10.0499 16.85 11.0092C16.4527 11.9685 15.7797 12.7884 14.9164 13.3653C14.053 13.9422 13.038 14.2501 11.9996 14.2501C10.6077 14.2486 9.27322 13.695 8.28898 12.7108C7.30473 11.7265 6.75113 10.392 6.74964 9.00011Z" fill="#286CFF"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,3 @@
<svg width="10" height="18" viewBox="0 0 10 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.968959 9.53104L8.46896 17.031C8.53864 17.1007 8.62137 17.156 8.71241 17.1937C8.80346 17.2314 8.90104 17.2508 8.99958 17.2508C9.09813 17.2508 9.19571 17.2314 9.28676 17.1937C9.3778 17.156 9.46053 17.1007 9.53021 17.031C9.59989 16.9614 9.65517 16.8786 9.69288 16.7876C9.73059 16.6965 9.75 16.599 9.75 16.5004C9.75 16.4019 9.73059 16.3043 9.69288 16.2132C9.65517 16.1222 9.59989 16.0395 9.53021 15.9698L2.5599 9.00042L9.53021 2.03104C9.67094 1.89031 9.75 1.69944 9.75 1.50042C9.75 1.30139 9.67094 1.11052 9.53021 0.969792C9.38948 0.829062 9.19861 0.75 8.99958 0.75C8.80056 0.75 8.60969 0.829062 8.46896 0.969792L0.968959 8.46979C0.899227 8.53945 0.843907 8.62216 0.806164 8.71321C0.768421 8.80426 0.748995 8.90186 0.748995 9.00042C0.748995 9.09898 0.768421 9.19657 0.806164 9.28762C0.843907 9.37867 0.899227 9.46139 0.968959 9.53104Z" fill="#92722A"/>
</svg>

After

Width:  |  Height:  |  Size: 964 B

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.7938 16.4944C20.2735 15.5981 19.5 13.0622 19.5 9.75C19.5 7.76088 18.7098 5.85322 17.3033 4.4467C15.8968 3.04018 13.9891 2.25 12 2.25C10.0109 2.25 8.10323 3.04018 6.69671 4.4467C5.29019 5.85322 4.50001 7.76088 4.50001 9.75C4.50001 13.0631 3.72564 15.5981 3.20532 16.4944C3.07245 16.7222 3.00201 16.9811 3.00111 17.2449C3.0002 17.5086 3.06886 17.768 3.20017 17.9967C3.33147 18.2255 3.52077 18.4156 3.74899 18.5478C3.9772 18.6801 4.23625 18.7498 4.50001 18.75H8.32595C8.49899 19.5967 8.95916 20.3577 9.62864 20.9042C10.2981 21.4507 11.1358 21.7492 12 21.7492C12.8642 21.7492 13.7019 21.4507 14.3714 20.9042C15.0409 20.3577 15.501 19.5967 15.6741 18.75H19.5C19.7637 18.7496 20.0226 18.6798 20.2507 18.5475C20.4788 18.4151 20.668 18.225 20.7992 17.9963C20.9303 17.7676 20.9989 17.5083 20.998 17.2446C20.997 16.9809 20.9266 16.7222 20.7938 16.4944ZM12 20.25C11.5348 20.2499 11.0812 20.1055 10.7014 19.8369C10.3216 19.5683 10.0344 19.1886 9.87939 18.75H14.1206C13.9656 19.1886 13.6784 19.5683 13.2986 19.8369C12.9189 20.1055 12.4652 20.2499 12 20.25ZM4.50001 17.25C5.22189 16.0087 6.00001 13.1325 6.00001 9.75C6.00001 8.1587 6.63215 6.63258 7.75737 5.50736C8.88259 4.38214 10.4087 3.75 12 3.75C13.5913 3.75 15.1174 4.38214 16.2427 5.50736C17.3679 6.63258 18 8.1587 18 9.75C18 13.1297 18.7763 16.0059 19.5 17.25H4.50001Z" fill="#232528"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.0667 15.8079C16.1248 15.866 16.1708 15.9349 16.2023 16.0108C16.2337 16.0867 16.2499 16.168 16.2499 16.2501C16.2499 16.3322 16.2337 16.4135 16.2023 16.4894C16.1708 16.5653 16.1248 16.6342 16.0667 16.6923C16.0086 16.7504 15.9397 16.7964 15.8638 16.8278C15.788 16.8593 15.7066 16.8755 15.6245 16.8755C15.5424 16.8755 15.4611 16.8593 15.3852 16.8278C15.3093 16.7964 15.2404 16.7504 15.1823 16.6923L8.93233 10.4423C8.87422 10.3842 8.82812 10.3153 8.79667 10.2394C8.76521 10.1636 8.74902 10.0822 8.74902 10.0001C8.74902 9.91797 8.76521 9.83664 8.79667 9.76077C8.82812 9.68489 8.87422 9.61596 8.93233 9.55792L15.1823 3.30792C15.2996 3.19064 15.4587 3.12476 15.6245 3.12476C15.7904 3.12476 15.9494 3.19064 16.0667 3.30792C16.184 3.42519 16.2499 3.58425 16.2499 3.7501C16.2499 3.91596 16.184 4.07502 16.0667 4.19229L10.2581 10.0001L16.0667 15.8079ZM4.00811 10.0001L9.8167 4.19229C9.93398 4.07502 9.99986 3.91596 9.99986 3.7501C9.99986 3.58425 9.93398 3.42519 9.8167 3.30792C9.69943 3.19064 9.54037 3.12476 9.37452 3.12476C9.20866 3.12476 9.0496 3.19064 8.93233 3.30792L2.68233 9.55792C2.62422 9.61596 2.57812 9.68489 2.54667 9.76077C2.51521 9.83664 2.49902 9.91797 2.49902 10.0001C2.49902 10.0822 2.51521 10.1636 2.54667 10.2394C2.57812 10.3153 2.62422 10.3842 2.68233 10.4423L8.93233 16.6923C8.9904 16.7504 9.05933 16.7964 9.1352 16.8278C9.21108 16.8593 9.29239 16.8755 9.37452 16.8755C9.45664 16.8755 9.53795 16.8593 9.61383 16.8278C9.6897 16.7964 9.75863 16.7504 9.8167 16.6923C9.87477 16.6342 9.92083 16.5653 9.95226 16.4894C9.98369 16.4135 9.99986 16.3322 9.99986 16.2501C9.99986 16.168 9.98369 16.0867 9.95226 16.0108C9.92083 15.9349 9.87477 15.866 9.8167 15.8079L4.00811 10.0001Z" fill="#232528"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.0675 10.4423L4.81753 16.6923C4.70026 16.8096 4.5412 16.8755 4.37535 16.8755C4.2095 16.8755 4.05044 16.8096 3.93316 16.6923C3.81588 16.575 3.75 16.416 3.75 16.2501C3.75 16.0843 3.81588 15.9252 3.93316 15.8079L9.74175 10.0001L3.93316 4.19229C3.81588 4.07502 3.75 3.91596 3.75 3.7501C3.75 3.58425 3.81588 3.42519 3.93316 3.30792C4.05044 3.19064 4.2095 3.12476 4.37535 3.12476C4.5412 3.12476 4.70026 3.19064 4.81753 3.30792L11.0675 9.55792C11.1256 9.61596 11.1717 9.68489 11.2032 9.76077C11.2347 9.83664 11.2508 9.91797 11.2508 10.0001C11.2508 10.0822 11.2347 10.1636 11.2032 10.2394C11.1717 10.3153 11.1256 10.3842 11.0675 10.4423ZM17.3175 9.55792L11.0675 3.30792C10.9503 3.19064 10.7912 3.12476 10.6253 3.12476C10.4595 3.12476 10.3004 3.19064 10.1832 3.30792C10.0659 3.42519 10 3.58425 10 3.7501C10 3.91596 10.0659 4.07502 10.1832 4.19229L15.9918 10.0001L10.1832 15.8079C10.0659 15.9252 10 16.0843 10 16.2501C10 16.416 10.0659 16.575 10.1832 16.6923C10.3004 16.8096 10.4595 16.8755 10.6253 16.8755C10.7912 16.8755 10.9503 16.8096 11.0675 16.6923L17.3175 10.4423C17.3756 10.3842 17.4217 10.3153 17.4532 10.2394C17.4847 10.1636 17.5008 10.0822 17.5008 10.0001C17.5008 9.91797 17.4847 9.83664 17.4532 9.76077C17.4217 9.68489 17.3756 9.61596 17.3175 9.55792Z" fill="#232528"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.6925 7.94229L10.4425 14.1923C10.3845 14.2504 10.3156 14.2965 10.2397 14.328C10.1638 14.3594 10.0825 14.3756 10.0003 14.3756C9.91821 14.3756 9.83688 14.3594 9.76101 14.328C9.68514 14.2965 9.61621 14.2504 9.55816 14.1923L3.30816 7.94229C3.19088 7.82502 3.125 7.66596 3.125 7.5001C3.125 7.33425 3.19088 7.17519 3.30816 7.05792C3.42544 6.94064 3.5845 6.87476 3.75035 6.87476C3.9162 6.87476 4.07526 6.94064 4.19253 7.05792L10.0003 12.8665L15.8082 7.05792C15.8662 6.99985 15.9352 6.95378 16.011 6.92236C16.0869 6.89093 16.1682 6.87476 16.2503 6.87476C16.3325 6.87476 16.4138 6.89093 16.4897 6.92236C16.5655 6.95378 16.6345 6.99985 16.6925 7.05792C16.7506 7.11598 16.7967 7.18492 16.8281 7.26079C16.8595 7.33666 16.8757 7.41798 16.8757 7.5001C16.8757 7.58223 16.8595 7.66354 16.8281 7.73941C16.7967 7.81528 16.7506 7.88422 16.6925 7.94229Z" fill="#92722A"/>
</svg>

After

Width:  |  Height:  |  Size: 967 B

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.031 9.53055L12.531 17.0306C12.4614 17.1003 12.3787 17.1556 12.2876 17.1933C12.1966 17.2311 12.099 17.2505 12.0004 17.2505C11.9019 17.2505 11.8043 17.2311 11.7132 17.1933C11.6222 17.1556 11.5394 17.1003 11.4698 17.0306L3.96979 9.53055C3.82906 9.38982 3.75 9.19895 3.75 8.99993C3.75 8.80091 3.82906 8.61003 3.96979 8.4693C4.11052 8.32857 4.30139 8.24951 4.50042 8.24951C4.69944 8.24951 4.89031 8.32857 5.03104 8.4693L12.0004 15.4396L18.9698 8.4693C19.0395 8.39962 19.1222 8.34435 19.2132 8.30663C19.3043 8.26892 19.4019 8.24951 19.5004 8.24951C19.599 8.24951 19.6965 8.26892 19.7876 8.30663C19.8786 8.34435 19.9614 8.39962 20.031 8.4693C20.1007 8.53899 20.156 8.62171 20.1937 8.71276C20.2314 8.8038 20.2508 8.90138 20.2508 8.99993C20.2508 9.09847 20.2314 9.19606 20.1937 9.2871C20.156 9.37815 20.1007 9.46087 20.031 9.53055Z" fill="#5F646D"/>
</svg>

After

Width:  |  Height:  |  Size: 957 B

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.6922 7.94254L10.4422 14.1925C10.3842 14.2506 10.3152 14.2967 10.2393 14.3282C10.1635 14.3597 10.0821 14.3758 10 14.3758C9.91788 14.3758 9.83655 14.3597 9.76067 14.3282C9.6848 14.2967 9.61587 14.2506 9.55782 14.1925L3.30782 7.94254C3.19055 7.82526 3.12466 7.6662 3.12466 7.50035C3.12466 7.3345 3.19055 7.17544 3.30782 7.05816C3.4251 6.94088 3.58416 6.875 3.75001 6.875C3.91586 6.875 4.07492 6.94088 4.1922 7.05816L10 12.8668L15.8078 7.05816C15.8659 7.00009 15.9348 6.95403 16.0107 6.9226C16.0866 6.89117 16.1679 6.875 16.25 6.875C16.3321 6.875 16.4135 6.89117 16.4893 6.9226C16.5652 6.95403 16.6341 7.00009 16.6922 7.05816C16.7503 7.11623 16.7963 7.18517 16.8278 7.26104C16.8592 7.33691 16.8754 7.41823 16.8754 7.50035C16.8754 7.58247 16.8592 7.66379 16.8278 7.73966C16.7963 7.81553 16.7503 7.88447 16.6922 7.94254Z" fill="#92722A"/>
</svg>

After

Width:  |  Height:  |  Size: 949 B

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.1634 15.5868C13.3396 15.763 13.4385 16.0018 13.4385 16.2509C13.4385 16.5 13.3396 16.7388 13.1634 16.915C12.9873 17.0911 12.7484 17.19 12.4994 17.19C12.2503 17.19 12.0114 17.0911 11.8353 16.915L5.58531 10.665C5.49791 10.5779 5.42856 10.4744 5.38124 10.3604C5.33393 10.2465 5.30957 10.1243 5.30957 10.0009C5.30957 9.87751 5.33393 9.75533 5.38124 9.64138C5.42856 9.52742 5.49791 9.42393 5.58531 9.33683L11.8353 3.08683C12.0114 2.91071 12.2503 2.81177 12.4994 2.81177C12.7484 2.81177 12.9873 2.91071 13.1634 3.08683C13.3396 3.26295 13.4385 3.50182 13.4385 3.75089C13.4385 3.99997 13.3396 4.23884 13.1634 4.41496L7.57828 10.0001L13.1634 15.5868Z" fill="#232528"/>
</svg>

After

Width:  |  Height:  |  Size: 775 B

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.4137 10.6632L8.16374 16.9132C7.98762 17.0894 7.74874 17.1883 7.49967 17.1883C7.2506 17.1883 7.01173 17.0894 6.83561 16.9132C6.65949 16.7371 6.56055 16.4983 6.56055 16.2492C6.56055 16.0001 6.65949 15.7612 6.83561 15.5851L12.4223 9.99997L6.83717 4.41325C6.74997 4.32604 6.68079 4.22251 6.6336 4.10857C6.5864 3.99463 6.56211 3.87251 6.56211 3.74918C6.56211 3.62586 6.5864 3.50374 6.6336 3.3898C6.68079 3.27586 6.74997 3.17233 6.83717 3.08512C6.92438 2.99792 7.02791 2.92874 7.14185 2.88155C7.25579 2.83435 7.37791 2.81006 7.50124 2.81006C7.62456 2.81006 7.74668 2.83435 7.86062 2.88155C7.97456 2.92874 8.07809 2.99792 8.1653 3.08512L14.4153 9.33512C14.5026 9.42232 14.5718 9.5259 14.619 9.63991C14.6662 9.75392 14.6904 9.87612 14.6903 9.99951C14.6901 10.1229 14.6656 10.245 14.6182 10.3589C14.5707 10.4728 14.5012 10.5763 14.4137 10.6632Z" fill="#92722A"/>
</svg>

After

Width:  |  Height:  |  Size: 970 B

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.2806 9.21937C16.3504 9.28903 16.4057 9.37175 16.4434 9.46279C16.4812 9.55384 16.5006 9.65144 16.5006 9.75C16.5006 9.84856 16.4812 9.94616 16.4434 10.0372C16.4057 10.1283 16.3504 10.211 16.2806 10.2806L11.0306 15.5306C10.961 15.6004 10.8783 15.6557 10.7872 15.6934C10.6962 15.7312 10.5986 15.7506 10.5 15.7506C10.4014 15.7506 10.3038 15.7312 10.2128 15.6934C10.1218 15.6557 10.039 15.6004 9.96938 15.5306L7.71938 13.2806C7.57865 13.1399 7.49959 12.949 7.49959 12.75C7.49959 12.551 7.57865 12.3601 7.71938 12.2194C7.86011 12.0786 8.05098 11.9996 8.25 11.9996C8.44903 11.9996 8.6399 12.0786 8.78063 12.2194L10.5 13.9397L15.2194 9.21937C15.289 9.14964 15.3718 9.09432 15.4628 9.05658C15.5538 9.01884 15.6514 8.99941 15.75 8.99941C15.8486 8.99941 15.9462 9.01884 16.0372 9.05658C16.1283 9.09432 16.211 9.14964 16.2806 9.21937ZM21.75 12C21.75 13.9284 21.1782 15.8134 20.1068 17.4168C19.0355 19.0202 17.5127 20.2699 15.7312 21.0078C13.9496 21.7458 11.9892 21.9389 10.0979 21.5627C8.20656 21.1865 6.46928 20.2579 5.10571 18.8943C3.74215 17.5307 2.81355 15.7934 2.43735 13.9021C2.06114 12.0108 2.25422 10.0504 2.99218 8.26884C3.73013 6.48726 4.97982 4.96451 6.58319 3.89317C8.18657 2.82183 10.0716 2.25 12 2.25C14.585 2.25273 17.0634 3.28084 18.8913 5.10872C20.7192 6.93661 21.7473 9.41498 21.75 12ZM20.25 12C20.25 10.3683 19.7661 8.77325 18.8596 7.41655C17.9531 6.05984 16.6646 5.00242 15.1571 4.37799C13.6497 3.75357 11.9909 3.59019 10.3905 3.90852C8.79017 4.22685 7.32016 5.01259 6.16637 6.16637C5.01259 7.32015 4.22685 8.79016 3.90853 10.3905C3.5902 11.9908 3.75358 13.6496 4.378 15.1571C5.00242 16.6646 6.05984 17.9531 7.41655 18.8596C8.77326 19.7661 10.3683 20.25 12 20.25C14.1873 20.2475 16.2843 19.3775 17.8309 17.8309C19.3775 16.2843 20.2475 14.1873 20.25 12Z" fill="#92722A"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16.2806 9.21937C16.3504 9.28903 16.4057 9.37175 16.4434 9.46279C16.4812 9.55384 16.5006 9.65144 16.5006 9.75C16.5006 9.84856 16.4812 9.94616 16.4434 10.0372C16.4057 10.1283 16.3504 10.211 16.2806 10.2806L11.0306 15.5306C10.961 15.6004 10.8783 15.6557 10.7872 15.6934C10.6962 15.7312 10.5986 15.7506 10.5 15.7506C10.4014 15.7506 10.3038 15.7312 10.2128 15.6934C10.1218 15.6557 10.039 15.6004 9.96938 15.5306L7.71938 13.2806C7.57865 13.1399 7.49959 12.949 7.49959 12.75C7.49959 12.551 7.57865 12.3601 7.71938 12.2194C7.86011 12.0786 8.05098 11.9996 8.25 11.9996C8.44903 11.9996 8.6399 12.0786 8.78063 12.2194L10.5 13.9397L15.2194 9.21937C15.289 9.14964 15.3718 9.09432 15.4628 9.05658C15.5538 9.01884 15.6514 8.99941 15.75 8.99941C15.8486 8.99941 15.9462 9.01884 16.0372 9.05658C16.1283 9.09432 16.211 9.14964 16.2806 9.21937ZM21.75 12C21.75 13.9284 21.1782 15.8134 20.1068 17.4168C19.0355 19.0202 17.5127 20.2699 15.7312 21.0078C13.9496 21.7458 11.9892 21.9389 10.0979 21.5627C8.20656 21.1865 6.46928 20.2579 5.10571 18.8943C3.74215 17.5307 2.81355 15.7934 2.43735 13.9021C2.06114 12.0108 2.25422 10.0504 2.99218 8.26884C3.73013 6.48726 4.97982 4.96451 6.58319 3.89317C8.18657 2.82183 10.0716 2.25 12 2.25C14.585 2.25273 17.0634 3.28084 18.8913 5.10872C20.7192 6.93661 21.7473 9.41498 21.75 12ZM20.25 12C20.25 10.3683 19.7661 8.77325 18.8596 7.41655C17.9531 6.05984 16.6646 5.00242 15.1571 4.37799C13.6497 3.75357 11.9909 3.59019 10.3905 3.90852C8.79017 4.22685 7.32016 5.01259 6.16637 6.16637C5.01259 7.32015 4.22685 8.79016 3.90853 10.3905C3.5902 11.9908 3.75358 13.6496 4.378 15.1571C5.00242 16.6646 6.05984 17.9531 7.41655 18.8596C8.77326 19.7661 10.3683 20.25 12 20.25C14.1873 20.2475 16.2843 19.3775 17.8309 17.8309C19.3775 16.2843 20.2475 14.1873 20.25 12Z" fill="#232528"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

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">
<rect width="24" height="24" rx="12" fill="#B68A35"/>
<path d="M18.3538 8.85403L10.3538 16.854C10.3073 16.9005 10.2522 16.9374 10.1915 16.9626C10.1308 16.9877 10.0657 17.0007 10 17.0007C9.93433 17.0007 9.86926 16.9877 9.80856 16.9626C9.74786 16.9374 9.69272 16.9005 9.64628 16.854L6.14628 13.354C6.05246 13.2602 5.99976 13.133 5.99976 13.0003C5.99976 12.8676 6.05246 12.7403 6.14628 12.6465C6.2401 12.5527 6.36735 12.5 6.50003 12.5C6.63272 12.5 6.75996 12.5527 6.85378 12.6465L10 15.7934L17.6463 8.14653C17.7401 8.05271 17.8674 8 18 8C18.1327 8 18.26 8.05271 18.3538 8.14653C18.4476 8.24035 18.5003 8.3676 18.5003 8.50028C18.5003 8.63296 18.4476 8.76021 18.3538 8.85403Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 790 B

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.5 11.875V16.25C17.5 16.5815 17.3683 16.8995 17.1339 17.1339C16.8995 17.3683 16.5815 17.5 16.25 17.5H3.75C3.41848 17.5 3.10054 17.3683 2.86612 17.1339C2.6317 16.8995 2.5 16.5815 2.5 16.25V11.875C2.5 11.7092 2.56585 11.5503 2.68306 11.4331C2.80027 11.3158 2.95924 11.25 3.125 11.25C3.29076 11.25 3.44973 11.3158 3.56694 11.4331C3.68415 11.5503 3.75 11.7092 3.75 11.875V16.25H16.25V11.875C16.25 11.7092 16.3158 11.5503 16.4331 11.4331C16.5503 11.3158 16.7092 11.25 16.875 11.25C17.0408 11.25 17.1997 11.3158 17.3169 11.4331C17.4342 11.5503 17.5 11.7092 17.5 11.875ZM9.55781 12.3172C9.61586 12.3753 9.68479 12.4214 9.76066 12.4529C9.83654 12.4843 9.91787 12.5005 10 12.5005C10.0821 12.5005 10.1635 12.4843 10.2393 12.4529C10.3152 12.4214 10.3841 12.3753 10.4422 12.3172L13.5672 9.19219C13.6253 9.13412 13.6713 9.06518 13.7027 8.98931C13.7342 8.91344 13.7503 8.83212 13.7503 8.75C13.7503 8.66788 13.7342 8.58656 13.7027 8.51069C13.6713 8.43482 13.6253 8.36588 13.5672 8.30781C13.5091 8.24974 13.4402 8.20368 13.3643 8.17225C13.2884 8.14083 13.2071 8.12465 13.125 8.12465C13.0429 8.12465 12.9616 8.14083 12.8857 8.17225C12.8098 8.20368 12.7409 8.24974 12.6828 8.30781L10.625 10.3664V3.125C10.625 2.95924 10.5592 2.80027 10.4419 2.68306C10.3247 2.56585 10.1658 2.5 10 2.5C9.83424 2.5 9.67527 2.56585 9.55806 2.68306C9.44085 2.80027 9.375 2.95924 9.375 3.125V10.3664L7.31719 8.30781C7.19991 8.19054 7.04085 8.12465 6.875 8.12465C6.70915 8.12465 6.55009 8.19054 6.43281 8.30781C6.31554 8.42509 6.24965 8.58415 6.24965 8.75C6.24965 8.91585 6.31554 9.07491 6.43281 9.19219L9.55781 12.3172Z" fill="#5F646D"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,3 @@
<svg width="24" height="23" viewBox="0 0 24 23" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21 21V4.5H16.5V0H3V21H0V22.5H10.5V18H13.5V22.5H24V21H21ZM9 15H6V12H9V15ZM9 10.5H6V7.5H9V10.5ZM9 6H6V3H9V6ZM13.5 15H10.5V12H13.5V15ZM13.5 10.5H10.5V7.5H13.5V10.5ZM13.5 6H10.5V3H13.5V6ZM19.5 15H16.5V12H19.5V15ZM19.5 10.5H16.5V7.5H19.5V10.5Z" fill="#B68A35"/>
</svg>

After

Width:  |  Height:  |  Size: 370 B

View File

@ -0,0 +1,3 @@
<svg width="24" height="18" viewBox="0 0 24 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.4C0 1.76348 0.252856 1.15303 0.702944 0.702944C1.15303 0.252856 1.76348 0 2.4 0H21.6C22.2365 0 22.847 0.252856 23.2971 0.702944C23.7471 1.15303 24 1.76348 24 2.4V15.2C24 15.8365 23.7471 16.447 23.2971 16.8971C22.847 17.3471 22.2365 17.6 21.6 17.6H2.4C1.76348 17.6 1.15303 17.3471 0.702944 16.8971C0.252856 16.447 0 15.8365 0 15.2L0 2.4ZM4.8 6.4C4.8 5.55131 5.13714 4.73737 5.73726 4.13726C6.33737 3.53714 7.15131 3.2 8 3.2C8.84869 3.2 9.66263 3.53714 10.2627 4.13726C10.8629 4.73737 11.2 5.55131 11.2 6.4C11.2 7.24869 10.8629 8.06263 10.2627 8.66274C9.66263 9.26286 8.84869 9.6 8 9.6C7.15131 9.6 6.33737 9.26286 5.73726 8.66274C5.13714 8.06263 4.8 7.24869 4.8 6.4ZM19.2 6.4H14.4V4.8H19.2V6.4ZM19.2 11.2H14.4V9.6H19.2V11.2ZM8 11.2C7.13039 11.2005 6.27807 11.443 5.53833 11.9001C4.79859 12.3573 4.2006 13.0112 3.8112 13.7888L3.2832 14.8416C3.22202 14.9637 3.19311 15.0994 3.19923 15.2358C3.20534 15.3722 3.24628 15.5048 3.31813 15.621C3.38999 15.7371 3.49038 15.8329 3.60973 15.8992C3.72909 15.9656 3.86344 16.0003 4 16H12C12.1364 16 12.2706 15.9651 12.3897 15.8986C12.5089 15.8322 12.609 15.7364 12.6807 15.6203C12.7524 15.5042 12.7931 15.3717 12.7992 15.2354C12.8052 15.0991 12.7763 14.9636 12.7152 14.8416L12.1888 13.7888C11.7994 13.0112 11.2014 12.3573 10.4617 11.9001C9.72193 11.443 8.86961 11.2005 8 11.2Z" fill="#B68A35"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,79 @@
<svg width="131" height="40" viewBox="0 0 131 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0V40H39.0222V0H0ZM37.9752 38.9267H1.04703V1.07327H37.9752V38.9267Z" fill="black"/>
<path d="M34.834 4.29199H27.8672V35.7058H34.834V4.29199Z" fill="#00803D"/>
<path d="M20.9005 4.29199H4.18823V11.4334H13.9337C17.1151 10.1537 19.6521 7.55309 20.9005 4.29199Z" fill="black"/>
<path d="M13.9337 11.4336H4.18823V35.706H6.9669C8.01394 28.9362 10.4302 22.6617 13.9337 17.1302V11.4336Z" fill="#C1102E"/>
<path d="M19.4909 17.1309H13.9336C10.4301 22.6623 8.01383 28.9368 6.9668 35.7067H19.4909V17.1309Z" fill="black"/>
<path d="M46.7538 38.2529L46.3913 37.147H44.3778L44.0154 38.2529H43.21L44.9819 33.2148H45.9081L47.68 38.2529H46.7538ZM45.5859 34.7713C45.5054 34.5256 45.4248 34.3208 45.3846 34.075C45.304 34.2798 45.2638 34.5256 45.1832 34.7713L44.5792 36.4916H46.19L45.5859 34.7713Z" fill="black"/>
<path d="M51.8279 38.2529L50.056 35.2219C49.8547 34.8532 49.6936 34.5665 49.5728 34.2388C49.613 34.7304 49.613 36.082 49.613 36.8603V38.2529H48.8479V33.2148H49.8949L51.6266 36.2049C51.8279 36.5326 51.989 36.9012 52.1501 37.2289C52.1098 36.6555 52.1098 35.3447 52.1098 34.5256V33.2558H52.875V38.2938H51.8279V38.2529Z" fill="black"/>
<path d="M56.137 38.2918C55.6135 38.2918 55.2108 38.2509 54.8081 38.2509V33.2128C55.2108 33.2128 55.7746 33.1719 56.3384 33.1719C57.9089 33.1719 58.8754 33.9091 58.8754 35.6704C58.8754 37.3907 57.7479 38.2918 56.137 38.2918ZM56.2578 33.8682C56.0162 33.8682 55.7746 33.8682 55.5732 33.9092V37.5546C55.7343 37.5955 55.9759 37.5955 56.1773 37.5955C57.2243 37.5955 57.9895 37.0221 57.9895 35.7114C58.0297 34.5235 57.5062 33.8682 56.2578 33.8682Z" fill="black"/>
<path d="M63.5062 38.3357C63.1035 38.3357 62.7008 38.2947 62.3786 38.2128L62.4592 37.4346C62.7813 37.5574 63.1438 37.6394 63.5062 37.6394C64.0297 37.6394 64.4727 37.4346 64.4727 36.8611C64.4727 35.7962 62.2981 36.2467 62.2981 34.6083C62.2981 33.7482 62.9424 33.1338 64.1103 33.1338C64.3922 33.1338 64.7143 33.1747 64.9962 33.2157L64.9157 33.912C64.6338 33.8301 64.3519 33.7891 64.07 33.7891C63.4257 33.7891 63.1438 34.0759 63.1438 34.4855C63.1438 35.4685 65.3587 35.0999 65.3587 36.6973C65.3587 37.6803 64.6338 38.3357 63.5062 38.3357Z" fill="black"/>
<path d="M68.3389 33.9112V38.2529H67.5335V33.9112H66.1643V33.2148H69.7081V33.9112H68.3389Z" fill="black"/>
<path d="M73.4935 38.2529L73.1311 37.147H71.1176L70.7551 38.2529H69.9497L71.7216 33.2148H72.6478L74.4197 38.2529H73.4935ZM72.3257 34.7713C72.2451 34.5256 72.1646 34.3208 72.1243 34.075C72.0438 34.2798 72.0035 34.5256 71.923 34.7713L71.3189 36.4916H72.9297L72.3257 34.7713Z" fill="black"/>
<path d="M76.7957 33.9112V38.2529H75.9903V33.9112H74.6211V33.2148H78.1649V33.9112H76.7957Z" fill="black"/>
<path d="M79.4531 38.2529V33.2148H80.2585V38.2529H79.4531Z" fill="black"/>
<path d="M82.9569 38.3357C82.5542 38.3357 82.1515 38.2947 81.8293 38.2128L81.9099 37.4346C82.232 37.5574 82.5945 37.6394 82.9569 37.6394C83.4804 37.6394 83.9234 37.4346 83.9234 36.8611C83.9234 35.7962 81.7488 36.2467 81.7488 34.6083C81.7488 33.7482 82.3931 33.1338 83.561 33.1338C83.8428 33.1338 84.165 33.1747 84.4469 33.2157L84.3664 33.912C84.0845 33.8301 83.8026 33.7891 83.5207 33.7891C82.8764 33.7891 82.5945 34.0759 82.5945 34.4855C82.5945 35.4685 84.8093 35.0999 84.8093 36.6973C84.8093 37.6803 84.0845 38.3357 82.9569 38.3357Z" fill="black"/>
<path d="M87.7896 33.9112V38.2529H86.9842V33.9112H85.615V33.2148H89.1588V33.9112H87.7896Z" fill="black"/>
<path d="M90.4473 38.2529V33.2148H91.2527V38.2529H90.4473Z" fill="black"/>
<path d="M95.0381 38.3328C93.387 38.3328 92.783 37.2269 92.783 35.8752C92.783 34.3187 93.5884 33.1719 95.2395 33.1719C95.6019 33.1719 96.0046 33.2128 96.3268 33.3357L96.206 34.073C95.8838 33.9501 95.5214 33.8682 95.1589 33.8682C94.1119 33.8682 93.6286 34.6874 93.6286 35.7114C93.6286 36.8992 94.1119 37.5546 95.1992 37.5546C95.5214 37.5546 95.9241 37.4726 96.206 37.3088L96.3268 38.0051C95.9643 38.2099 95.5214 38.3328 95.0381 38.3328Z" fill="black"/>
<path d="M98.7833 38.3357C98.3806 38.3357 97.9779 38.2947 97.6557 38.2128L97.7363 37.4346C98.0584 37.5574 98.4209 37.6394 98.7833 37.6394C99.3068 37.6394 99.7498 37.4346 99.7498 36.8611C99.7498 35.7962 97.5752 36.2467 97.5752 34.6083C97.5752 33.7482 98.2195 33.1338 99.3874 33.1338C99.6693 33.1338 99.9914 33.1747 100.273 33.2157L100.193 33.912C99.9109 33.8301 99.629 33.7891 99.3471 33.7891C98.7028 33.7891 98.4209 34.0759 98.4209 34.4855C98.4209 35.4685 100.636 35.0999 100.636 36.6973C100.676 37.6803 99.9109 38.3357 98.7833 38.3357Z" fill="black"/>
<path d="M106.354 38.3328C104.703 38.3328 104.099 37.2269 104.099 35.8752C104.099 34.3187 104.904 33.1719 106.555 33.1719C106.918 33.1719 107.321 33.2128 107.643 33.3357L107.522 34.073C107.2 33.9501 106.837 33.8682 106.475 33.8682C105.428 33.8682 104.945 34.6874 104.945 35.7114C104.945 36.8992 105.428 37.5546 106.515 37.5546C106.837 37.5546 107.24 37.4726 107.522 37.3088L107.643 38.0051C107.321 38.2099 106.837 38.3328 106.354 38.3328Z" fill="black"/>
<path d="M109.213 38.2529V33.2148H111.831V33.8702H110.019V35.3038H111.75V35.9591H110.019V37.5156H111.831V38.2119H109.213V38.2529Z" fill="black"/>
<path d="M116.462 38.2529L114.69 35.2219C114.489 34.8532 114.328 34.5665 114.207 34.2388C114.247 34.7304 114.247 36.082 114.247 36.8603V38.2529H113.482V33.2148H114.529L116.261 36.2049C116.462 36.5326 116.623 36.9012 116.784 37.2289C116.744 36.6555 116.744 35.3447 116.744 34.5256V33.2558H117.509V38.2938H116.462V38.2529Z" fill="black"/>
<path d="M120.972 33.9112V38.2529H120.167V33.9112H118.798V33.2148H122.341V33.9112H120.972Z" fill="black"/>
<path d="M126.047 38.2509L124.557 36.08H124.436V38.2509H123.631V33.2128C123.993 33.1719 124.396 33.1719 124.96 33.1719C126.007 33.1719 126.691 33.5405 126.691 34.5235C126.691 35.3427 126.087 35.8343 125.322 35.9571C125.443 36.121 125.604 36.3258 125.725 36.4896L126.973 38.2509H126.047ZM124.879 33.8682C124.718 33.8682 124.597 33.8682 124.476 33.9092V35.5066C124.557 35.5066 124.678 35.5066 124.879 35.5066C125.523 35.5066 125.926 35.1789 125.926 34.6464C125.886 34.073 125.523 33.8682 124.879 33.8682Z" fill="black"/>
<path d="M128.342 38.2529V33.2148H130.96V33.8702H129.148V35.3038H130.879V35.9591H129.148V37.5156H130.96V38.2119H128.342V38.2529Z" fill="black"/>
<path d="M43.9753 25.3936V26.8682H45.6667V27.5235H43.9753V29.7354H43.1699V24.7383H45.7472V25.3936H43.9753Z" fill="black"/>
<path d="M46.6331 29.7763V24.7383H49.2506V25.3936H47.4385V26.8272H49.1701V27.4826H47.4385V29.08H49.2506V29.7763H46.6331Z" fill="black"/>
<path d="M51.6671 29.7753C51.1435 29.7753 50.7408 29.7343 50.3381 29.7343V24.7372C50.7408 24.7372 51.3046 24.6963 51.8684 24.6963C53.439 24.6963 54.4055 25.4336 54.4055 27.1948C54.4055 28.8742 53.2779 29.7753 51.6671 29.7753ZM51.7879 25.3516C51.5463 25.3516 51.3046 25.3516 51.1033 25.3926V29.038C51.2644 29.079 51.506 29.079 51.7073 29.079C52.7544 29.079 53.5195 28.5055 53.5195 27.1948C53.5598 26.048 53.0363 25.3516 51.7879 25.3516Z" fill="black"/>
<path d="M55.2913 29.7763V24.7383H57.9088V25.3936H56.0967V26.8272H57.8283V27.4826H56.0967V29.08H57.9088V29.7763H55.2913Z" fill="black"/>
<path d="M61.3721 29.7753L59.882 27.6044H59.8015V29.7753H58.9961V24.7372C59.3585 24.6963 59.7612 24.6963 60.325 24.6963C61.3721 24.6963 62.0567 25.0649 62.0567 26.048C62.0567 26.8672 61.4526 27.3587 60.6875 27.4815C60.8083 27.6454 60.9694 27.8502 61.0902 28.014L62.3386 29.7753H61.3721ZM60.2042 25.3516C60.0431 25.3516 59.9223 25.3516 59.8015 25.3926V26.99C59.882 26.99 60.0029 26.99 60.2042 26.99C60.8485 26.99 61.2512 26.6624 61.2512 26.1299C61.211 25.5974 60.8485 25.3516 60.2042 25.3516Z" fill="black"/>
<path d="M66.0433 29.7763L65.6809 28.6704H63.6674L63.3049 29.7763H62.4995L64.2714 24.7383H65.1976L66.9695 29.7763H66.0433ZM64.8755 26.2947C64.7949 26.049 64.7144 25.8442 64.6741 25.5984C64.5936 25.8032 64.5533 26.049 64.4728 26.2947L63.8687 28.0151H65.4795L64.8755 26.2947Z" fill="black"/>
<path d="M67.5737 29.7763V24.7383H68.3791V29.08H70.0705V29.7763H67.5737Z" fill="black"/>
<path d="M74.3389 29.8142C72.6878 29.8142 72.0837 28.7083 72.0837 27.3567C72.0837 25.8002 72.8489 24.6533 74.5402 24.6533C74.9027 24.6533 75.3054 24.6943 75.6276 24.8172L75.5067 25.5544C75.1846 25.4316 74.8221 25.3496 74.4597 25.3496C73.4127 25.3496 72.9294 26.1688 72.9294 27.1928C72.9294 28.3807 73.4127 29.036 74.5 29.036C74.8221 29.036 75.2248 28.9541 75.5067 28.7902L75.6276 29.4866C75.3054 29.7323 74.8221 29.8142 74.3389 29.8142Z" fill="black"/>
<path d="M78.326 29.8161C76.836 29.8161 76.1111 28.8331 76.1111 27.2766C76.1111 25.5973 77.1984 24.6143 78.487 24.6143C79.9771 24.6143 80.7019 25.5973 80.7019 27.1538C80.7422 28.8331 79.6549 29.8161 78.326 29.8161ZM78.4065 25.3515C77.6011 25.3515 76.9568 26.0069 76.9568 27.1947C76.9568 28.3416 77.44 29.0789 78.4065 29.0789C79.2119 29.0789 79.8562 28.4235 79.8562 27.2357C79.8965 26.1298 79.4133 25.3515 78.4065 25.3515Z" fill="black"/>
<path d="M86.3402 29.7763L85.9375 27.073C85.857 26.5815 85.8167 26.1309 85.7764 25.8032C85.7361 26.0899 85.6153 26.4586 85.4945 26.8272L84.528 29.7763H83.7226L82.8367 27.032C82.7159 26.6224 82.595 26.1719 82.5145 25.8032C82.4742 26.2128 82.434 26.6634 82.3937 27.1549L82.0715 29.7763H81.2661L81.991 24.7383H82.9575L83.924 27.6464C84.0045 27.8922 84.1253 28.3427 84.2059 28.6704C84.2864 28.3018 84.3669 27.9741 84.4878 27.6874L85.4543 24.7383H86.4207L87.1859 29.7763H86.3402Z" fill="black"/>
<path d="M89.2797 27.9321C89.0783 27.9321 88.8769 27.8911 88.8769 27.8911V29.7343H88.0715V24.7372C88.0715 24.7372 88.7561 24.6963 89.3602 24.6963C90.528 24.6963 91.1724 25.2697 91.1724 26.2118C91.1724 27.1948 90.4878 27.9321 89.2797 27.9321ZM89.2797 25.3516C89.0783 25.3516 88.8367 25.3516 88.8367 25.3516V27.1948C88.8367 27.1948 89.038 27.2358 89.3199 27.2358C90.0045 27.2358 90.367 26.8672 90.367 26.2528C90.367 25.6793 90.0045 25.3516 89.2797 25.3516Z" fill="black"/>
<path d="M91.978 29.7763V24.7383H94.5956V25.3936H92.7834V26.8272H94.5151V27.4826H92.7834V29.08H94.5956V29.7763H91.978Z" fill="black"/>
<path d="M97.3741 25.3926V29.7343H96.5687V25.3926H95.1995V24.6963H98.7433V25.3926H97.3741Z" fill="black"/>
<path d="M99.4277 29.7763V24.7383H100.233V29.7763H99.4277Z" fill="black"/>
<path d="M103.133 25.3926V29.7343H102.327V25.3926H100.958V24.6963H104.502V25.3926H103.133Z" fill="black"/>
<path d="M105.187 29.7763V24.7383H105.992V29.7763H105.187Z" fill="black"/>
<path d="M109.334 29.7753H108.408L106.636 24.7372H107.522L108.569 27.8502C108.69 28.1369 108.771 28.5055 108.891 28.8332C108.972 28.5055 109.093 28.1369 109.214 27.7683L110.261 24.6963H111.066L109.334 29.7753Z" fill="black"/>
<path d="M111.75 29.7763V24.7383H114.368V25.3936H112.556V26.8272H114.288V27.4826H112.556V29.08H114.368V29.7763H111.75Z" fill="black"/>
<path d="M118.396 29.7763L116.624 26.7453C116.422 26.3767 116.261 26.09 116.14 25.7623C116.181 26.2538 116.181 27.6055 116.181 28.3837V29.7763H115.416V24.7383H116.463L118.194 27.7283C118.396 28.056 118.557 28.4246 118.718 28.7523C118.677 28.1789 118.677 26.8682 118.677 26.049V24.7792H119.443V29.8173H118.396V29.7763Z" fill="black"/>
<path d="M120.771 29.7763V24.7383H123.389V25.3936H121.577V26.8272H123.309V27.4826H121.577V29.08H123.389V29.7763H120.771Z" fill="black"/>
<path d="M125.402 29.8161C125 29.8161 124.597 29.7752 124.275 29.6933L124.355 28.915C124.678 29.0379 125.04 29.1198 125.402 29.1198C125.926 29.1198 126.369 28.915 126.369 28.3416C126.369 27.2766 124.194 27.7272 124.194 26.0888C124.194 25.2287 124.839 24.6143 126.007 24.6143C126.288 24.6143 126.611 24.6552 126.892 24.6962L126.812 25.3925C126.53 25.3106 126.248 25.2696 125.966 25.2696C125.362 25.2696 125.04 25.5563 125.04 25.9659C125.04 26.949 127.255 26.5803 127.255 28.1778C127.255 29.1608 126.53 29.8161 125.402 29.8161Z" fill="black"/>
<path d="M129.107 29.8161C128.705 29.8161 128.302 29.7752 127.98 29.6933L128.06 28.915C128.382 29.0379 128.745 29.1198 129.107 29.1198C129.631 29.1198 130.074 28.915 130.074 28.3416C130.074 27.2766 127.899 27.7272 127.899 26.0888C127.899 25.2287 128.543 24.6143 129.711 24.6143C129.993 24.6143 130.315 24.6552 130.597 24.6962L130.517 25.3925C130.235 25.3106 129.953 25.2696 129.671 25.2696C129.067 25.2696 128.745 25.5563 128.745 25.9659C128.745 26.949 130.96 26.5803 130.96 28.1778C130.96 29.1608 130.235 29.8161 129.107 29.8161Z" fill="black"/>
<path d="M131 1.43164H130.114V7.16599H131V1.43164Z" fill="black"/>
<path d="M112.234 6.67621C112.234 4.83302 111.509 3.93191 110.341 3.44039L112.435 2.17064V1.26953L109.334 3.2356V3.89095C110.663 4.25959 111.348 4.99686 111.348 6.47141H90.6487V3.2356H89.803V6.75813C89.803 8.43747 88.6352 8.39651 87.6284 8.39651V9.17475C88.5949 9.17475 90.4474 9.21571 90.6487 7.12676H112.234V6.67621Z" fill="black"/>
<path d="M127.778 6.43159H124.757V5.07992C124.757 3.93305 124.194 3.23674 122.986 3.23674C121.616 3.23674 120.972 4.17881 120.972 5.2028C120.972 6.18584 120.61 6.43159 120.126 6.43159H114.972V3.23674H114.086V6.75927C114.086 8.43862 112.918 8.39766 111.911 8.39766V9.17589C112.878 9.17589 114.73 9.21685 114.931 7.12791H120.247C120.891 7.12791 121.254 6.84119 121.375 6.43159C121.657 6.84119 122.019 7.12791 123.187 7.12791H128.623V1.39355H127.737V6.43159H127.778ZM123.912 6.43159H123.187C122.261 6.43159 121.858 6.022 121.858 5.16184C121.858 4.42457 122.261 3.93305 122.945 3.93305C123.549 3.93305 123.912 4.30169 123.912 5.2028V6.43159Z" fill="black"/>
<path d="M90.6887 1.43164H89.8027V2.33275H90.6887V1.43164Z" fill="black"/>
<path d="M51.0224 3.15332L50.7003 3.89059C51.8681 4.42307 52.1903 5.16034 52.2305 6.43009H49.3311V7.12641H53.1165V6.67585C53.0762 4.79171 52.593 3.84963 51.0224 3.15332Z" fill="black"/>
<path d="M82.4736 6.42774H80.0171V7.16502H83.3595V1.43066H82.4736V6.42774Z" fill="black"/>
<path d="M85.6958 1.43066H84.8098V7.16502H85.6958V1.43066Z" fill="black"/>
<path d="M77.44 6.42774H73.2921C73.2921 5.85431 73.2921 4.7484 72.527 3.97016C72.0438 3.47865 71.3591 3.23289 70.4329 3.23289H69.4262V4.01112H70.4329C72.4867 4.01112 72.4867 5.60855 72.4867 6.38678V6.4687H55.1704V1.43066H54.2844V7.16502H78.2857V3.23289H77.3997V6.42774H77.44Z" fill="black"/>
<path d="M50.056 5.57109V5.32533C50.056 4.09654 49.5727 3.27734 48.0827 3.27734C47.3981 3.27734 46.794 3.40022 46.794 3.40022V6.4722H46.19C44.5792 6.4722 44.0959 5.89876 44.0959 4.66997C44.0959 4.21942 44.2167 3.68694 44.3778 3.27734L43.4516 3.44118C43.3308 3.76886 43.21 4.30134 43.21 4.75189C43.21 6.2674 43.9751 7.12755 46.0692 7.12755H47.6397V3.97366C47.6397 3.97366 47.9216 3.9327 48.123 3.9327C48.9284 3.9327 49.2908 4.3423 49.2908 5.32533V5.57109H50.056Z" fill="black"/>
<path d="M78.3259 1.43066H77.4399V2.33178H78.3259V1.43066Z" fill="black"/>
<path d="M77.1176 1.43066H76.2317V2.33178H77.1176V1.43066Z" fill="black"/>
<path d="M46.8745 8.3125H45.9885V9.21361H46.8745V8.3125Z" fill="black"/>
<path d="M45.6665 8.3125H44.7805V9.21361H45.6665V8.3125Z" fill="black"/>
<path d="M81.7896 5.77325L80.5412 1.34961L79.6956 1.47249L80.9037 5.77325H81.7896Z" fill="black"/>
<path d="M125.805 12.0381H124.919V12.9392H125.805V12.0381Z" fill="black"/>
<path d="M124.597 12.0381H123.711V12.9392H124.597V12.0381Z" fill="black"/>
<path d="M96.2461 18.9629H95.3601V19.864H96.2461V18.9629Z" fill="black"/>
<path d="M95.0378 18.9629H94.1519V19.864H95.0378V18.9629Z" fill="black"/>
<path d="M122.462 12.0381H121.576V12.9392H122.462V12.0381Z" fill="black"/>
<path d="M113.2 12.0381H112.314V12.9392H113.2V12.0381Z" fill="black"/>
<path d="M91.0512 12.0381H90.1653V12.9392H91.0512V12.0381Z" fill="black"/>
<path d="M89.843 12.0381H88.957V12.9392H89.843V12.0381Z" fill="black"/>
<path d="M130.114 12.0381V17.0761H128.221V12.0381H127.335V17.0761H125.201V13.8813H124.315V17.0761H122.422V13.8813H121.577V17.0761H116.825V12.0381H115.939V17.7724H130.96V12.0381H130.114Z" fill="black"/>
<path d="M112.918 13.8848C111.549 13.8848 110.864 14.8268 110.864 15.8508C110.864 16.4652 111.065 16.8748 111.388 17.1206C111.388 17.1206 111.226 17.0796 110.945 17.0796H108.126C108.166 16.9158 108.206 16.7519 108.206 16.5881V13.8848H107.441V16.5881C107.441 16.8748 107.24 17.0796 106.958 17.0796H105.911C105.951 16.9158 105.991 16.7519 105.991 16.5881V14.3763H105.226V16.5881C105.226 16.8748 105.025 17.0796 104.743 17.0796H103.696C103.736 16.9158 103.776 16.7519 103.776 16.5881V14.8678H103.011V16.5881C103.011 16.8748 102.81 17.0796 102.528 17.0796H99.1856H95.6821V13.8848H94.7961V17.0796H91.1718V13.8848C90.2455 13.9257 89.4401 14.3353 88.7958 15.0316C88.1515 15.728 87.789 16.67 87.6682 17.8169H88.5139C88.5944 17.4483 88.6347 17.1206 88.7555 16.8748C88.8361 16.6291 88.9569 16.3833 89.0777 16.1375C89.3998 15.5641 89.7623 15.1955 90.165 15.0316C90.2053 15.0316 90.2858 14.9907 90.3663 14.9497V17.8579H102.528C103.011 17.8579 103.374 17.6531 103.575 17.3254V17.8579H104.743C105.226 17.8579 105.589 17.6531 105.79 17.3254V17.8579H106.958C107.24 17.8579 107.441 17.7759 107.642 17.694V17.8579H114.65V15.7689C114.65 14.5811 114.086 13.8848 112.918 13.8848ZM113.804 17.0796H113.079C112.153 17.0796 111.75 16.67 111.75 15.8099C111.75 15.0726 112.153 14.5811 112.837 14.5811C113.441 14.5811 113.804 14.9497 113.804 15.8508V17.0796Z" fill="black"/>
<path d="M79.8964 12.0352H79.0105V17.7695H79.8964V12.0352Z" fill="black"/>
<path d="M44.5792 16.4612C44.5792 16.1335 44.8208 15.8878 45.2638 15.8878C45.5457 15.8878 45.8275 15.9287 45.9081 15.9697L46.0289 15.2734C45.9081 15.2734 45.6262 15.2324 45.3443 15.2324C44.1362 15.2324 43.6932 15.8878 43.6932 16.5431C43.6932 16.8298 43.814 17.0756 44.0556 17.1985C43.8543 17.1575 43.5321 17.1575 43.21 17.1575V17.8538H46.3108V17.1575H45.5859C44.8611 17.0756 44.5792 16.8298 44.5792 16.4612Z" fill="black"/>
<path d="M75.3862 19.082C75.3862 18.9182 75.507 18.8362 75.7486 18.8362C75.9097 18.8362 76.0708 18.8772 76.1513 18.8772L76.2319 18.3857C76.1513 18.3447 75.9903 18.3447 75.7889 18.3447C75.1043 18.3447 74.7821 18.7134 74.7821 19.082C74.7821 19.2458 74.8627 19.3687 74.9432 19.4097C74.8224 19.3687 74.6613 19.3687 74.5002 19.3687V19.8602H76.4332V19.3687H75.95C75.5473 19.3278 75.3862 19.2458 75.3862 19.082Z" fill="black"/>
<path d="M76.715 17.0732H74.2183V17.7695H77.601V12.0352H76.715V17.0732Z" fill="black"/>
<path d="M69.9094 13.8783H68.9027V14.6566H69.9094C71.9632 14.6566 71.9632 16.254 71.9632 17.0322V17.1142H65.9629V16.9503C65.9629 14.9433 65.238 13.9193 63.8286 13.9193C62.9024 13.9193 61.9761 14.6156 61.3318 15.6396V14.6975H60.5264V15.9673C60.5264 16.6226 60.3653 16.9094 60.164 17.0732H48.2439V12.0352H47.3579V17.7695H72.7686V17.0322C72.7686 16.4588 72.7686 15.3529 72.0035 14.5747C71.5203 14.1241 70.8357 13.8374 69.9094 13.8783ZM65.1172 17.0732H61.2915C61.7345 15.7625 62.8621 14.6156 63.7883 14.6156C64.634 14.6156 65.1172 15.4758 65.1172 16.7865C65.1575 16.8684 65.1575 16.9913 65.1172 17.0732Z" fill="black"/>
<path d="M83.1583 13.8818C81.7488 13.8818 81.1045 14.8239 81.1045 15.8889C81.1045 17.0357 81.6683 17.773 83.2388 17.773H83.9637V17.9368C83.9637 18.797 83.3596 19.1247 82.514 19.1247C81.9099 19.1247 81.2656 18.9608 81.2656 18.9608L81.185 19.6981C81.185 19.6981 81.8294 19.821 82.4334 19.821C84.1651 19.821 84.8497 18.8789 84.8497 17.8549V14.1276C84.8094 14.1686 84.0845 13.8818 83.1583 13.8818ZM83.9637 17.0767H83.3596C82.4334 17.0767 82.0307 16.6261 82.0307 15.8069C82.0307 15.0697 82.4334 14.5781 83.118 14.5781C83.6415 14.5781 84.004 14.742 84.004 14.742V17.0767H83.9637Z" fill="black"/>
<path d="M76.0301 16.4207L74.7817 11.9971L73.8958 12.1199L75.1039 16.4207H76.0301Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.6484 19.8751C20.2206 17.4067 18.0203 15.6367 15.4525 14.7976C16.7226 14.0415 17.7094 12.8893 18.2614 11.518C18.8134 10.1468 18.8999 8.63224 18.5078 7.20701C18.1157 5.78178 17.2666 4.52467 16.0909 3.62873C14.9151 2.73279 13.4778 2.24756 11.9996 2.24756C10.5215 2.24756 9.08414 2.73279 7.90842 3.62873C6.73269 4.52467 5.88358 5.78178 5.49146 7.20701C5.09935 8.63224 5.18592 10.1468 5.73788 11.518C6.28984 12.8893 7.27668 14.0415 8.54683 14.7976C5.97902 15.6357 3.77871 17.4057 2.35089 19.8751C2.29853 19.9605 2.2638 20.0555 2.24875 20.1545C2.2337 20.2535 2.23863 20.3545 2.26326 20.4516C2.28789 20.5487 2.33171 20.6399 2.39214 20.7197C2.45257 20.7996 2.52838 20.8666 2.6151 20.9167C2.70183 20.9667 2.79771 20.999 2.89709 21.0114C2.99647 21.0238 3.09733 21.0163 3.19373 20.9891C3.29012 20.9619 3.3801 20.9157 3.45835 20.8532C3.5366 20.7907 3.60154 20.7131 3.64933 20.6251C5.41558 17.5726 8.53746 15.7501 11.9996 15.7501C15.4618 15.7501 18.5837 17.5726 20.35 20.6251C20.3977 20.7131 20.4627 20.7907 20.5409 20.8532C20.6192 20.9157 20.7092 20.9619 20.8056 20.9891C20.902 21.0163 21.0028 21.0238 21.1022 21.0114C21.2016 20.999 21.2975 20.9667 21.3842 20.9167C21.4709 20.8666 21.5467 20.7996 21.6072 20.7197C21.6676 20.6399 21.7114 20.5487 21.736 20.4516C21.7607 20.3545 21.7656 20.2535 21.7505 20.1545C21.7355 20.0555 21.7008 19.9605 21.6484 19.8751ZM6.74964 9.00011C6.74964 7.96176 7.05755 6.94672 7.63443 6.08337C8.21131 5.22001 9.03124 4.5471 9.99056 4.14974C10.9499 3.75238 12.0055 3.64841 13.0239 3.85099C14.0423 4.05356 14.9777 4.55357 15.712 5.2878C16.4462 6.02202 16.9462 6.95748 17.1488 7.97589C17.3513 8.99429 17.2474 10.0499 16.85 11.0092C16.4527 11.9685 15.7797 12.7884 14.9164 13.3653C14.053 13.9422 13.038 14.2501 11.9996 14.2501C10.6077 14.2486 9.27322 13.695 8.28898 12.7108C7.30473 11.7265 6.75113 10.392 6.74964 9.00011Z" fill="#5F646D"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,3 @@
<svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18.4256 5.73214L14.935 2.24073C14.8189 2.12463 14.6811 2.03253 14.5294 1.96969C14.3777 1.90685 14.2152 1.87451 14.051 1.87451C13.8868 1.87451 13.7242 1.90685 13.5726 1.96969C13.4209 2.03253 13.2831 2.12463 13.167 2.24073L3.5334 11.8751C3.41683 11.9908 3.3244 12.1284 3.2615 12.2801C3.1986 12.4318 3.16647 12.5945 3.167 12.7587V16.2501C3.167 16.5816 3.29869 16.8996 3.53311 17.134C3.76754 17.3684 4.08548 17.5001 4.417 17.5001H7.9084C8.07262 17.5006 8.2353 17.4685 8.38699 17.4056C8.53867 17.3427 8.67635 17.2503 8.792 17.1337L18.4256 7.5001C18.5417 7.38403 18.6338 7.24622 18.6966 7.09454C18.7595 6.94286 18.7918 6.7803 18.7918 6.61612C18.7918 6.45194 18.7595 6.28937 18.6966 6.1377C18.6338 5.98602 18.5417 5.84821 18.4256 5.73214ZM7.9084 16.2501H4.417V12.7587L11.292 5.8837L14.7834 9.3751L7.9084 16.2501ZM15.667 8.49073L12.1756 5.0001L14.0506 3.1251L17.542 6.61573L15.667 8.49073Z" fill="#5F646D"/>
</svg>

After

Width:  |  Height:  |  Size: 1013 B

View File

@ -0,0 +1,3 @@
<svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18.4256 5.73214L14.935 2.24073C14.8189 2.12463 14.6811 2.03253 14.5294 1.96969C14.3777 1.90685 14.2152 1.87451 14.051 1.87451C13.8868 1.87451 13.7242 1.90685 13.5726 1.96969C13.4209 2.03253 13.2831 2.12463 13.167 2.24073L3.5334 11.8751C3.41683 11.9908 3.3244 12.1284 3.2615 12.2801C3.1986 12.4318 3.16647 12.5945 3.167 12.7587V16.2501C3.167 16.5816 3.29869 16.8996 3.53311 17.134C3.76754 17.3684 4.08548 17.5001 4.417 17.5001H7.9084C8.07262 17.5006 8.2353 17.4685 8.38699 17.4056C8.53867 17.3427 8.67635 17.2503 8.792 17.1337L18.4256 7.5001C18.5417 7.38403 18.6338 7.24622 18.6966 7.09454C18.7595 6.94286 18.7918 6.7803 18.7918 6.61612C18.7918 6.45194 18.7595 6.28937 18.6966 6.1377C18.6338 5.98602 18.5417 5.84821 18.4256 5.73214ZM7.9084 16.2501H4.417V12.7587L11.292 5.8837L14.7834 9.3751L7.9084 16.2501ZM15.667 8.49073L12.1756 5.0001L14.0506 3.1251L17.542 6.61573L15.667 8.49073Z" fill="#92722A"/>
</svg>

After

Width:  |  Height:  |  Size: 1013 B

View File

@ -0,0 +1,5 @@
<svg width="110" height="48" viewBox="0 0 110 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="110" height="48" rx="8" fill="#92722A"/>
<path d="M30.5234 17.625V29H28.5625L23.4609 20.8516V29H21.5V17.625H23.4609L28.5781 25.7891V17.625H30.5234ZM36.3984 29.1562C35.7734 29.1562 35.2083 29.0547 34.7031 28.8516C34.2031 28.6432 33.776 28.3542 33.4219 27.9844C33.0729 27.6146 32.8047 27.1797 32.6172 26.6797C32.4297 26.1797 32.3359 25.6406 32.3359 25.0625V24.75C32.3359 24.0885 32.4323 23.4896 32.625 22.9531C32.8177 22.4167 33.0859 21.9583 33.4297 21.5781C33.7734 21.1927 34.1797 20.8984 34.6484 20.6953C35.1172 20.4922 35.625 20.3906 36.1719 20.3906C36.776 20.3906 37.3047 20.4922 37.7578 20.6953C38.2109 20.8984 38.5859 21.1849 38.8828 21.5547C39.1849 21.9193 39.4089 22.3542 39.5547 22.8594C39.7057 23.3646 39.7812 23.9219 39.7812 24.5312V25.3359H33.25V23.9844H37.9219V23.8359C37.9115 23.4974 37.8438 23.1797 37.7188 22.8828C37.599 22.5859 37.4141 22.3464 37.1641 22.1641C36.9141 21.9818 36.5807 21.8906 36.1641 21.8906C35.8516 21.8906 35.5729 21.9583 35.3281 22.0938C35.0885 22.224 34.888 22.4141 34.7266 22.6641C34.5651 22.9141 34.4401 23.2161 34.3516 23.5703C34.2682 23.9193 34.2266 24.3125 34.2266 24.75V25.0625C34.2266 25.4323 34.276 25.776 34.375 26.0938C34.4792 26.4062 34.6302 26.6797 34.8281 26.9141C35.026 27.1484 35.2656 27.3333 35.5469 27.4688C35.8281 27.599 36.1484 27.6641 36.5078 27.6641C36.9609 27.6641 37.3646 27.5729 37.7188 27.3906C38.0729 27.2083 38.3802 26.9505 38.6406 26.6172L39.6328 27.5781C39.4505 27.8438 39.2135 28.099 38.9219 28.3438C38.6302 28.5833 38.2734 28.7786 37.8516 28.9297C37.4349 29.0807 36.9505 29.1562 36.3984 29.1562ZM42.6875 20.5469L44.2969 23.3516L45.9375 20.5469H48.0078L45.4453 24.6953L48.1094 29H46.0391L44.3203 26.0781L42.6016 29H40.5234L43.1797 24.6953L40.625 20.5469H42.6875ZM53.1719 20.5469V21.9219H48.4062V20.5469H53.1719ZM49.7812 18.4766H51.6641V26.6641C51.6641 26.9245 51.7005 27.125 51.7734 27.2656C51.8516 27.401 51.9583 27.4922 52.0938 27.5391C52.2292 27.5859 52.388 27.6094 52.5703 27.6094C52.7005 27.6094 52.8255 27.6016 52.9453 27.5859C53.0651 27.5703 53.1615 27.5547 53.2344 27.5391L53.2422 28.9766C53.0859 29.0234 52.9036 29.0651 52.6953 29.1016C52.4922 29.138 52.2578 29.1562 51.9922 29.1562C51.5599 29.1562 51.1771 29.0807 50.8438 28.9297C50.5104 28.7734 50.25 28.5208 50.0625 28.1719C49.875 27.8229 49.7812 27.3594 49.7812 26.7812V18.4766Z" fill="white"/>
<path d="M83.0306 24.531L75.5306 32.031C75.4609 32.1007 75.3782 32.156 75.2872 32.1937C75.1961 32.2314 75.0985 32.2508 75 32.2508C74.9014 32.2508 74.8039 32.2314 74.7128 32.1937C74.6218 32.156 74.539 32.1007 74.4694 32.031C74.3997 31.9614 74.3444 31.8786 74.3067 31.7876C74.269 31.6965 74.2496 31.599 74.2496 31.5004C74.2496 31.4019 74.269 31.3043 74.3067 31.2132C74.3444 31.1222 74.3997 31.0395 74.4694 30.9698L81.4397 24.0004L74.4694 17.031C74.3286 16.8903 74.2496 16.6994 74.2496 16.5004C74.2496 16.3014 74.3286 16.1105 74.4694 15.9698C74.6101 15.8291 74.801 15.75 75 15.75C75.199 15.75 75.3899 15.8291 75.5306 15.9698L83.0306 23.4698C83.1003 23.5394 83.1557 23.6222 83.1934 23.7132C83.2312 23.8043 83.2506 23.9019 83.2506 24.0004C83.2506 24.099 83.2312 24.1966 83.1934 24.2876C83.1557 24.3787 83.1003 24.4614 83.0306 24.531Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" y="0.5" width="19" height="19" rx="3.5" fill="white" stroke="#CBA344"/>
</svg>

After

Width:  |  Height:  |  Size: 189 B

View File

@ -0,0 +1,3 @@
<svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.542 3.75H14.417V3.125C14.417 2.62772 14.2194 2.15081 13.8678 1.79917C13.5162 1.44754 13.0393 1.25 12.542 1.25H8.79199C8.29471 1.25 7.8178 1.44754 7.46617 1.79917C7.11454 2.15081 6.91699 2.62772 6.91699 3.125V3.75H3.79199C3.62623 3.75 3.46726 3.81585 3.35005 3.93306C3.23284 4.05027 3.16699 4.20924 3.16699 4.375C3.16699 4.54076 3.23284 4.69973 3.35005 4.81694C3.46726 4.93415 3.62623 5 3.79199 5H4.41699V16.25C4.41699 16.5815 4.54869 16.8995 4.78311 17.1339C5.01753 17.3683 5.33547 17.5 5.66699 17.5H15.667C15.9985 17.5 16.3165 17.3683 16.5509 17.1339C16.7853 16.8995 16.917 16.5815 16.917 16.25V5H17.542C17.7078 5 17.8667 4.93415 17.9839 4.81694C18.1011 4.69973 18.167 4.54076 18.167 4.375C18.167 4.20924 18.1011 4.05027 17.9839 3.93306C17.8667 3.81585 17.7078 3.75 17.542 3.75ZM8.16699 3.125C8.16699 2.95924 8.23284 2.80027 8.35005 2.68306C8.46726 2.56585 8.62623 2.5 8.79199 2.5H12.542C12.7078 2.5 12.8667 2.56585 12.9839 2.68306C13.1011 2.80027 13.167 2.95924 13.167 3.125V3.75H8.16699V3.125ZM15.667 16.25H5.66699V5H15.667V16.25ZM9.41699 8.125V13.125C9.41699 13.2908 9.35114 13.4497 9.23393 13.5669C9.11672 13.6842 8.95775 13.75 8.79199 13.75C8.62623 13.75 8.46726 13.6842 8.35005 13.5669C8.23284 13.4497 8.16699 13.2908 8.16699 13.125V8.125C8.16699 7.95924 8.23284 7.80027 8.35005 7.68306C8.46726 7.56585 8.62623 7.5 8.79199 7.5C8.95775 7.5 9.11672 7.56585 9.23393 7.68306C9.35114 7.80027 9.41699 7.95924 9.41699 8.125ZM13.167 8.125V13.125C13.167 13.2908 13.1011 13.4497 12.9839 13.5669C12.8667 13.6842 12.7078 13.75 12.542 13.75C12.3762 13.75 12.2173 13.6842 12.1 13.5669C11.9828 13.4497 11.917 13.2908 11.917 13.125V8.125C11.917 7.95924 11.9828 7.80027 12.1 7.68306C12.2173 7.56585 12.3762 7.5 12.542 7.5C12.7078 7.5 12.8667 7.56585 12.9839 7.68306C13.1011 7.80027 13.167 7.95924 13.167 8.125Z" fill="#5F646D"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,3 @@
<svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.542 3.75H14.417V3.125C14.417 2.62772 14.2194 2.15081 13.8678 1.79917C13.5162 1.44754 13.0393 1.25 12.542 1.25H8.79199C8.29471 1.25 7.8178 1.44754 7.46617 1.79917C7.11454 2.15081 6.91699 2.62772 6.91699 3.125V3.75H3.79199C3.62623 3.75 3.46726 3.81585 3.35005 3.93306C3.23284 4.05027 3.16699 4.20924 3.16699 4.375C3.16699 4.54076 3.23284 4.69973 3.35005 4.81694C3.46726 4.93415 3.62623 5 3.79199 5H4.41699V16.25C4.41699 16.5815 4.54869 16.8995 4.78311 17.1339C5.01753 17.3683 5.33547 17.5 5.66699 17.5H15.667C15.9985 17.5 16.3165 17.3683 16.5509 17.1339C16.7853 16.8995 16.917 16.5815 16.917 16.25V5H17.542C17.7078 5 17.8667 4.93415 17.9839 4.81694C18.1011 4.69973 18.167 4.54076 18.167 4.375C18.167 4.20924 18.1011 4.05027 17.9839 3.93306C17.8667 3.81585 17.7078 3.75 17.542 3.75ZM8.16699 3.125C8.16699 2.95924 8.23284 2.80027 8.35005 2.68306C8.46726 2.56585 8.62623 2.5 8.79199 2.5H12.542C12.7078 2.5 12.8667 2.56585 12.9839 2.68306C13.1011 2.80027 13.167 2.95924 13.167 3.125V3.75H8.16699V3.125ZM15.667 16.25H5.66699V5H15.667V16.25ZM9.41699 8.125V13.125C9.41699 13.2908 9.35114 13.4497 9.23393 13.5669C9.11672 13.6842 8.95775 13.75 8.79199 13.75C8.62623 13.75 8.46726 13.6842 8.35005 13.5669C8.23284 13.4497 8.16699 13.2908 8.16699 13.125V8.125C8.16699 7.95924 8.23284 7.80027 8.35005 7.68306C8.46726 7.56585 8.62623 7.5 8.79199 7.5C8.95775 7.5 9.11672 7.56585 9.23393 7.68306C9.35114 7.80027 9.41699 7.95924 9.41699 8.125ZM13.167 8.125V13.125C13.167 13.2908 13.1011 13.4497 12.9839 13.5669C12.8667 13.6842 12.7078 13.75 12.542 13.75C12.3762 13.75 12.2173 13.6842 12.1 13.5669C11.9828 13.4497 11.917 13.2908 11.917 13.125V8.125C11.917 7.95924 11.9828 7.80027 12.1 7.68306C12.2173 7.56585 12.3762 7.5 12.542 7.5C12.7078 7.5 12.8667 7.56585 12.9839 7.68306C13.1011 7.80027 13.167 7.95924 13.167 8.125Z" fill="#EA4F49"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.5 11.875V16.25C17.5 16.5815 17.3683 16.8995 17.1339 17.1339C16.8995 17.3683 16.5815 17.5 16.25 17.5H3.75C3.41848 17.5 3.10054 17.3683 2.86612 17.1339C2.6317 16.8995 2.5 16.5815 2.5 16.25V11.875C2.5 11.7092 2.56585 11.5503 2.68306 11.4331C2.80027 11.3159 2.95924 11.25 3.125 11.25C3.29076 11.25 3.44973 11.3159 3.56694 11.4331C3.68415 11.5503 3.75 11.7092 3.75 11.875V16.25H16.25V11.875C16.25 11.7092 16.3158 11.5503 16.4331 11.4331C16.5503 11.3159 16.7092 11.25 16.875 11.25C17.0408 11.25 17.1997 11.3159 17.3169 11.4331C17.4342 11.5503 17.5 11.7092 17.5 11.875ZM7.31719 6.69219L9.375 4.6336V11.875C9.375 12.0408 9.44085 12.1997 9.55806 12.3169C9.67527 12.4342 9.83424 12.5 10 12.5C10.1658 12.5 10.3247 12.4342 10.4419 12.3169C10.5592 12.1997 10.625 12.0408 10.625 11.875V4.6336L12.6828 6.69219C12.8001 6.80947 12.9591 6.87535 13.125 6.87535C13.2909 6.87535 13.4499 6.80947 13.5672 6.69219C13.6845 6.57492 13.7503 6.41586 13.7503 6.25C13.7503 6.08415 13.6845 5.92509 13.5672 5.80782L10.4422 2.68282C10.3841 2.62471 10.3152 2.57861 10.2393 2.54715C10.1635 2.5157 10.0821 2.49951 10 2.49951C9.91787 2.49951 9.83654 2.5157 9.76066 2.54715C9.68479 2.57861 9.61586 2.62471 9.55781 2.68282L6.43281 5.80782C6.31554 5.92509 6.24965 6.08415 6.24965 6.25C6.24965 6.41586 6.31554 6.57492 6.43281 6.69219C6.55009 6.80947 6.70915 6.87535 6.875 6.87535C7.04085 6.87535 7.19991 6.80947 7.31719 6.69219Z" fill="#5F646D"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.5 11.875V16.25C17.5 16.5815 17.3683 16.8995 17.1339 17.1339C16.8995 17.3683 16.5815 17.5 16.25 17.5H3.75C3.41848 17.5 3.10054 17.3683 2.86612 17.1339C2.6317 16.8995 2.5 16.5815 2.5 16.25V11.875C2.5 11.7092 2.56585 11.5503 2.68306 11.4331C2.80027 11.3159 2.95924 11.25 3.125 11.25C3.29076 11.25 3.44973 11.3159 3.56694 11.4331C3.68415 11.5503 3.75 11.7092 3.75 11.875V16.25H16.25V11.875C16.25 11.7092 16.3158 11.5503 16.4331 11.4331C16.5503 11.3159 16.7092 11.25 16.875 11.25C17.0408 11.25 17.1997 11.3159 17.3169 11.4331C17.4342 11.5503 17.5 11.7092 17.5 11.875ZM7.31719 6.69219L9.375 4.6336V11.875C9.375 12.0408 9.44085 12.1997 9.55806 12.3169C9.67527 12.4342 9.83424 12.5 10 12.5C10.1658 12.5 10.3247 12.4342 10.4419 12.3169C10.5592 12.1997 10.625 12.0408 10.625 11.875V4.6336L12.6828 6.69219C12.8001 6.80947 12.9591 6.87535 13.125 6.87535C13.2909 6.87535 13.4499 6.80947 13.5672 6.69219C13.6845 6.57492 13.7503 6.41586 13.7503 6.25C13.7503 6.08415 13.6845 5.92509 13.5672 5.80782L10.4422 2.68282C10.3841 2.62471 10.3152 2.57861 10.2393 2.54715C10.1635 2.5157 10.0821 2.49951 10 2.49951C9.91787 2.49951 9.83654 2.5157 9.76066 2.54715C9.68479 2.57861 9.61586 2.62471 9.55781 2.68282L6.43281 5.80782C6.31554 5.92509 6.24965 6.08415 6.24965 6.25C6.24965 6.41586 6.31554 6.57492 6.43281 6.69219C6.55009 6.80947 6.70915 6.87535 6.875 6.87535C7.04085 6.87535 7.19991 6.80947 7.31719 6.69219Z" fill="#5F646D"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.6503 19.8751C20.2225 17.4067 18.0222 15.6367 15.4544 14.7976C16.7246 14.0415 17.7114 12.8893 18.2634 11.518C18.8153 10.1468 18.9019 8.63224 18.5098 7.20701C18.1177 5.78178 17.2685 4.52467 16.0928 3.62873C14.9171 2.73279 13.4798 2.24756 12.0016 2.24756C10.5234 2.24756 9.08609 2.73279 7.91037 3.62873C6.73465 4.52467 5.88553 5.78178 5.49342 7.20701C5.1013 8.63224 5.18787 10.1468 5.73983 11.518C6.2918 12.8893 7.27863 14.0415 8.54878 14.7976C5.98097 15.6357 3.78066 17.4057 2.35285 19.8751C2.30049 19.9605 2.26576 20.0555 2.2507 20.1545C2.23565 20.2535 2.24059 20.3545 2.26521 20.4516C2.28984 20.5487 2.33366 20.6399 2.39409 20.7197C2.45452 20.7996 2.53033 20.8666 2.61706 20.9167C2.70378 20.9667 2.79966 20.999 2.89904 21.0114C2.99842 21.0238 3.09928 21.0163 3.19568 20.9891C3.29208 20.9619 3.38205 20.9157 3.4603 20.8532C3.53855 20.7907 3.60349 20.7131 3.65128 20.6251C5.41753 17.5726 8.53941 15.7501 12.0016 15.7501C15.4638 15.7501 18.5857 17.5726 20.3519 20.6251C20.3997 20.7131 20.4646 20.7907 20.5429 20.8532C20.6211 20.9157 20.7111 20.9619 20.8075 20.9891C20.9039 21.0163 21.0048 21.0238 21.1042 21.0114C21.2035 20.999 21.2994 20.9667 21.3861 20.9167C21.4729 20.8666 21.5487 20.7996 21.6091 20.7197C21.6695 20.6399 21.7134 20.5487 21.738 20.4516C21.7626 20.3545 21.7675 20.2535 21.7525 20.1545C21.7374 20.0555 21.7027 19.9605 21.6503 19.8751ZM6.7516 9.00011C6.7516 7.96176 7.0595 6.94672 7.63638 6.08337C8.21326 5.22001 9.0332 4.5471 9.99251 4.14974C10.9518 3.75238 12.0074 3.64841 13.0258 3.85099C14.0442 4.05356 14.9797 4.55357 15.7139 5.2878C16.4481 6.02202 16.9481 6.95748 17.1507 7.97589C17.3533 8.99429 17.2493 10.0499 16.852 11.0092C16.4546 11.9685 15.7817 12.7884 14.9183 13.3653C14.055 13.9422 13.0399 14.2501 12.0016 14.2501C10.6097 14.2486 9.27517 13.695 8.29093 12.7108C7.30669 11.7265 6.75309 10.392 6.7516 9.00011Z" fill="#92722A"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.6484 19.8751C20.2206 17.4067 18.0203 15.6367 15.4525 14.7976C16.7226 14.0415 17.7094 12.8893 18.2614 11.518C18.8134 10.1468 18.8999 8.63224 18.5078 7.20701C18.1157 5.78178 17.2666 4.52467 16.0909 3.62873C14.9151 2.73279 13.4778 2.24756 11.9996 2.24756C10.5215 2.24756 9.08414 2.73279 7.90842 3.62873C6.73269 4.52467 5.88358 5.78178 5.49146 7.20701C5.09935 8.63224 5.18592 10.1468 5.73788 11.518C6.28984 12.8893 7.27668 14.0415 8.54683 14.7976C5.97902 15.6357 3.77871 17.4057 2.35089 19.8751C2.29853 19.9605 2.2638 20.0555 2.24875 20.1545C2.2337 20.2535 2.23863 20.3545 2.26326 20.4516C2.28789 20.5487 2.33171 20.6399 2.39214 20.7197C2.45257 20.7996 2.52838 20.8666 2.6151 20.9167C2.70183 20.9667 2.79771 20.999 2.89709 21.0114C2.99647 21.0238 3.09733 21.0163 3.19373 20.9891C3.29012 20.9619 3.3801 20.9157 3.45835 20.8532C3.5366 20.7907 3.60154 20.7131 3.64933 20.6251C5.41558 17.5726 8.53746 15.7501 11.9996 15.7501C15.4618 15.7501 18.5837 17.5726 20.35 20.6251C20.3977 20.7131 20.4627 20.7907 20.5409 20.8532C20.6192 20.9157 20.7092 20.9619 20.8056 20.9891C20.902 21.0163 21.0028 21.0238 21.1022 21.0114C21.2016 20.999 21.2975 20.9667 21.3842 20.9167C21.4709 20.8666 21.5467 20.7996 21.6072 20.7197C21.6676 20.6399 21.7114 20.5487 21.736 20.4516C21.7607 20.3545 21.7656 20.2535 21.7505 20.1545C21.7355 20.0555 21.7008 19.9605 21.6484 19.8751ZM6.74964 9.00011C6.74964 7.96176 7.05755 6.94672 7.63443 6.08337C8.21131 5.22001 9.03124 4.5471 9.99056 4.14974C10.9499 3.75238 12.0055 3.64841 13.0239 3.85099C14.0423 4.05356 14.9777 4.55357 15.712 5.2878C16.4462 6.02202 16.9462 6.95748 17.1488 7.97589C17.3513 8.99429 17.2474 10.0499 16.85 11.0092C16.4527 11.9685 15.7797 12.7884 14.9164 13.3653C14.053 13.9422 13.038 14.2501 11.9996 14.2501C10.6077 14.2486 9.27322 13.695 8.28898 12.7108C7.30473 11.7265 6.75113 10.392 6.74964 9.00011Z" fill="#232528"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.5006 14.7826C14.6763 14.0503 15.5815 12.955 16.0793 11.6625C16.5771 10.3699 16.6404 8.95037 16.2596 7.61864C15.8788 6.2869 15.0746 5.11543 13.9687 4.28144C12.8628 3.44746 11.5154 2.99634 10.1303 2.99634C8.74516 2.99634 7.39773 3.44746 6.29183 4.28144C5.18594 5.11543 4.38175 6.2869 4.00094 7.61864C3.62013 8.95037 3.68341 10.3699 4.18121 11.6625C4.67901 12.955 5.58424 14.0503 6.75996 14.7826C4.82402 15.4163 3.08214 16.6004 1.68152 18.2673C1.61589 18.3423 1.56589 18.4297 1.53443 18.5243C1.50296 18.6189 1.49067 18.7188 1.49828 18.8182C1.50588 18.9176 1.53323 19.0145 1.57872 19.1032C1.6242 19.1919 1.68692 19.2707 1.76319 19.3348C1.83947 19.399 1.92778 19.4474 2.02296 19.477C2.11813 19.5067 2.21827 19.5171 2.3175 19.5076C2.41674 19.4981 2.51309 19.4689 2.60092 19.4217C2.68875 19.3746 2.76629 19.3104 2.82902 19.2329C4.71152 16.9867 7.30464 15.7501 10.1256 15.7501C12.9465 15.7501 15.5396 16.9867 17.4259 19.2329C17.5539 19.3853 17.7373 19.4806 17.9356 19.4979C18.1339 19.5151 18.331 19.4528 18.4834 19.3248C18.6358 19.1967 18.7311 19.0134 18.7483 18.8151C18.7656 18.6167 18.7033 18.4197 18.5753 18.2673C17.1737 16.6004 15.4318 15.4163 13.5006 14.7826ZM5.25058 9.37509C5.25058 8.4109 5.53649 7.46837 6.07217 6.66668C6.60784 5.86499 7.36921 5.24015 8.26 4.87117C9.15079 4.5022 10.131 4.40566 11.0766 4.59376C12.0223 4.78186 12.8909 5.24616 13.5727 5.92794C14.2545 6.60972 14.7188 7.47836 14.9069 8.42402C15.095 9.36968 14.9985 10.3499 14.6295 11.2407C14.2605 12.1315 13.6357 12.8928 12.834 13.4285C12.0323 13.9642 11.0898 14.2501 10.1256 14.2501C8.83311 14.2486 7.594 13.7345 6.68008 12.8206C5.76616 11.9067 5.25207 10.6676 5.25058 9.37509ZM22.899 13.4129L22.4621 13.1607C22.5134 12.8894 22.5134 12.6108 22.4621 12.3395L22.899 12.0873C23.0713 11.9878 23.1971 11.824 23.2486 11.6318C23.3001 11.4397 23.2732 11.2349 23.1737 11.0626C23.0742 10.8903 22.9104 10.7645 22.7183 10.713C22.5261 10.6615 22.3213 10.6884 22.149 10.7879L21.7112 11.041C21.5017 10.8613 21.2608 10.7217 21.0006 10.6295V10.1251C21.0006 9.92618 20.9216 9.73541 20.7809 9.59476C20.6403 9.45411 20.4495 9.37509 20.2506 9.37509C20.0517 9.37509 19.8609 9.45411 19.7203 9.59476C19.5796 9.73541 19.5006 9.92618 19.5006 10.1251V10.6295C19.2404 10.7217 18.9995 10.8613 18.79 11.041L18.3521 10.7879C18.2668 10.7387 18.1726 10.7067 18.075 10.6938C17.9773 10.681 17.8781 10.6875 17.7829 10.713C17.6878 10.7385 17.5986 10.7825 17.5204 10.8425C17.4423 10.9025 17.3767 10.9773 17.3275 11.0626C17.2782 11.1479 17.2463 11.2421 17.2334 11.3398C17.2206 11.4374 17.2271 11.5367 17.2526 11.6318C17.2781 11.727 17.3221 11.8162 17.3821 11.8943C17.442 11.9725 17.5168 12.038 17.6021 12.0873L18.039 12.3395C17.9878 12.6108 17.9878 12.8894 18.039 13.1607L17.6021 13.4129C17.4298 13.5124 17.3041 13.6762 17.2526 13.8684C17.2011 14.0605 17.228 14.2653 17.3275 14.4376C17.4269 14.6099 17.5907 14.7356 17.7829 14.7872C17.9751 14.8387 18.1798 14.8117 18.3521 14.7123L18.79 14.4592C18.9995 14.6389 19.2404 14.7784 19.5006 14.8707V15.3751C19.5006 15.574 19.5796 15.7648 19.7203 15.9054C19.8609 16.0461 20.0517 16.1251 20.2506 16.1251C20.4495 16.1251 20.6403 16.0461 20.7809 15.9054C20.9216 15.7648 21.0006 15.574 21.0006 15.3751V14.8707C21.2608 14.7784 21.5017 14.6389 21.7112 14.4592L22.149 14.7123C22.2629 14.7784 22.3923 14.813 22.524 14.8126C22.6892 14.8127 22.8497 14.7582 22.9808 14.6577C23.1118 14.5572 23.206 14.4162 23.2488 14.2567C23.2915 14.0972 23.2804 13.928 23.2172 13.7754C23.1539 13.6228 23.0421 13.4954 22.899 13.4129ZM19.5006 12.7501C19.5006 12.6018 19.5446 12.4567 19.627 12.3334C19.7094 12.2101 19.8265 12.1139 19.9636 12.0572C20.1006 12.0004 20.2514 11.9856 20.3969 12.0145C20.5424 12.0434 20.676 12.1149 20.7809 12.2198C20.8858 12.3246 20.9572 12.4583 20.9862 12.6038C21.0151 12.7493 21.0003 12.9001 20.9435 13.0371C20.8867 13.1741 20.7906 13.2913 20.6673 13.3737C20.5439 13.4561 20.3989 13.5001 20.2506 13.5001C20.0517 13.5001 19.8609 13.4211 19.7203 13.2804C19.5796 13.1398 19.5006 12.949 19.5006 12.7501Z" fill="#B68A35"/>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -0,0 +1,3 @@
<svg width="16" height="21" viewBox="0 0 16 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.48889 0.000853384C4.30999 0.0348791 4.14887 0.131035 4.03399 0.272336C3.91911 0.413637 3.85787 0.59099 3.86108 0.773069V1.54528H1.08573C0.467963 1.54528 0 2.01325 0 2.63102V18.9201C0 19.6151 0.467963 20.0785 1.08573 20.0785H14.286C14.9038 20.0785 15.3717 19.6105 15.3717 18.9927V2.63102C15.4489 2.01325 14.9763 1.54528 14.3586 1.54528H11.5832V0.773069C11.5832 0.568265 11.5019 0.371849 11.3571 0.22703C11.2122 0.0822116 11.0158 0.000853384 10.811 0.000853384H4.63329C4.60911 -0.000284461 4.58489 -0.000284461 4.5607 0.000853384C4.53652 -0.000284461 4.51307 -0.000284461 4.48889 0.000853384ZM5.40551 1.54528H10.0388V3.08972H5.40551V1.54528ZM1.54443 3.08972H3.86108V3.86193C3.86108 4.06674 3.94244 4.26315 4.08725 4.40797C4.23207 4.55279 4.42849 4.63415 4.63329 4.63415H10.811C11.0158 4.63415 11.2122 4.55279 11.3571 4.40797C11.5019 4.26315 11.5832 4.06674 11.5832 3.86193V3.08972H13.8999V18.534H1.54443V3.08972ZM3.08886 6.95079V10.0397H6.17772V6.95079H3.08886ZM3.86108 7.72301H5.40551V9.26744H3.86108V7.72301ZM7.72215 7.72301V9.26744H12.3554V7.72301H7.72215ZM3.08886 11.5841V14.6729H6.17772V11.5841H3.08886ZM7.72215 12.3563V13.9007H12.3554V12.3563H7.72215Z" fill="#92722A"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,3 @@
<svg width="16" height="21" viewBox="0 0 16 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.48889 0.000853384C4.30999 0.0348791 4.14887 0.131035 4.03399 0.272336C3.91911 0.413637 3.85787 0.59099 3.86108 0.773069V1.54528H1.08573C0.467963 1.54528 0 2.01325 0 2.63102V18.9201C0 19.6151 0.467963 20.0785 1.08573 20.0785H14.286C14.9038 20.0785 15.3717 19.6105 15.3717 18.9927V2.63102C15.4489 2.01325 14.9763 1.54528 14.3586 1.54528H11.5832V0.773069C11.5832 0.568265 11.5019 0.371849 11.3571 0.22703C11.2122 0.0822116 11.0158 0.000853384 10.811 0.000853384H4.63329C4.60911 -0.000284461 4.58489 -0.000284461 4.5607 0.000853384C4.53652 -0.000284461 4.51307 -0.000284461 4.48889 0.000853384ZM5.40551 1.54528H10.0388V3.08972H5.40551V1.54528ZM1.54443 3.08972H3.86108V3.86193C3.86108 4.06674 3.94244 4.26315 4.08725 4.40797C4.23207 4.55279 4.42849 4.63415 4.63329 4.63415H10.811C11.0158 4.63415 11.2122 4.55279 11.3571 4.40797C11.5019 4.26315 11.5832 4.06674 11.5832 3.86193V3.08972H13.8999V18.534H1.54443V3.08972ZM3.08886 6.95079V10.0397H6.17772V6.95079H3.08886ZM3.86108 7.72301H5.40551V9.26744H3.86108V7.72301ZM7.72215 7.72301V9.26744H12.3554V7.72301H7.72215ZM3.08886 11.5841V14.6729H6.17772V11.5841H3.08886ZM7.72215 12.3563V13.9007H12.3554V12.3563H7.72215Z" fill="#232528"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,10 @@
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_919_3426)">
<path d="M2.90118 0.483398L7.09473 4.67695L2.90118 8.87049" stroke="#C3C6CB" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_919_3426">
<rect width="10" height="10" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 392 B

View File

@ -0,0 +1,3 @@
<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.2002 2.25C10.2718 2.25 8.38677 2.82183 6.78339 3.89317C5.18001 4.96451 3.93033 6.48726 3.19237 8.26884C2.45442 10.0504 2.26134 12.0108 2.63754 13.9021C3.01375 15.7934 3.94235 17.5307 5.30591 18.8943C6.66947 20.2579 8.40675 21.1865 10.2981 21.5627C12.1894 21.9389 14.1498 21.7458 15.9314 21.0078C17.7129 20.2699 19.2357 19.0202 20.307 17.4168C21.3784 15.8134 21.9502 13.9284 21.9502 12C21.9475 9.41498 20.9194 6.93661 19.0915 5.10872C17.2636 3.28084 14.7852 2.25273 12.2002 2.25ZM16.4808 10.2806L11.2308 15.5306C11.1612 15.6004 11.0785 15.6557 10.9874 15.6934C10.8964 15.7312 10.7988 15.7506 10.7002 15.7506C10.6016 15.7506 10.504 15.7312 10.413 15.6934C10.3219 15.6557 10.2392 15.6004 10.1696 15.5306L7.91957 13.2806C7.77884 13.1399 7.69978 12.949 7.69978 12.75C7.69978 12.551 7.77884 12.3601 7.91957 12.2194C8.0603 12.0786 8.25118 11.9996 8.4502 11.9996C8.64922 11.9996 8.84009 12.0786 8.98082 12.2194L10.7002 13.9397L15.4196 9.21937C15.4893 9.14969 15.572 9.09442 15.663 9.0567C15.7541 9.01899 15.8517 8.99958 15.9502 8.99958C16.0487 8.99958 16.1463 9.01899 16.2374 9.0567C16.3284 9.09442 16.4111 9.14969 16.4808 9.21937C16.5505 9.28906 16.6058 9.37178 16.6435 9.46283C16.6812 9.55387 16.7006 9.65145 16.7006 9.75C16.7006 9.84855 16.6812 9.94613 16.6435 10.0372C16.6058 10.1282 16.5505 10.2109 16.4808 10.2806Z" fill="#4A9D5C"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 2.25C10.0716 2.25 8.18657 2.82183 6.58319 3.89317C4.97982 4.96451 3.73013 6.48726 2.99218 8.26884C2.25422 10.0504 2.06114 12.0108 2.43735 13.9021C2.81355 15.7934 3.74215 17.5307 5.10571 18.8943C6.46928 20.2579 8.20656 21.1865 10.0979 21.5627C11.9892 21.9389 13.9496 21.7458 15.7312 21.0078C17.5127 20.2699 19.0355 19.0202 20.1068 17.4168C21.1782 15.8134 21.75 13.9284 21.75 12C21.7473 9.41498 20.7192 6.93661 18.8913 5.10872C17.0634 3.28084 14.585 2.25273 12 2.25ZM16.2806 10.2806L11.0306 15.5306C10.961 15.6004 10.8783 15.6557 10.7872 15.6934C10.6962 15.7312 10.5986 15.7506 10.5 15.7506C10.4014 15.7506 10.3038 15.7312 10.2128 15.6934C10.1218 15.6557 10.039 15.6004 9.96938 15.5306L7.71938 13.2806C7.57865 13.1399 7.49959 12.949 7.49959 12.75C7.49959 12.551 7.57865 12.3601 7.71938 12.2194C7.86011 12.0786 8.05098 11.9996 8.25 11.9996C8.44903 11.9996 8.6399 12.0786 8.78063 12.2194L10.5 13.9397L15.2194 9.21937C15.2891 9.14969 15.3718 9.09442 15.4628 9.0567C15.5539 9.01899 15.6515 8.99958 15.75 8.99958C15.8486 8.99958 15.9461 9.01899 16.0372 9.0567C16.1282 9.09442 16.2109 9.14969 16.2806 9.21937C16.3503 9.28906 16.4056 9.37178 16.4433 9.46283C16.481 9.55387 16.5004 9.65145 16.5004 9.75C16.5004 9.84855 16.481 9.94613 16.4433 10.0372C16.4056 10.1282 16.3503 10.2109 16.2806 10.2806Z" fill="#286CFF"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,4 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="0.5" y="0.5" width="19" height="19" rx="3.5" fill="#CBA344" stroke="#CBA344"/>
<path d="M13.752 7.09326C13.9427 7.09336 14.1259 7.16934 14.2607 7.3042C14.3955 7.43912 14.4707 7.62227 14.4707 7.81299C14.4707 8.00372 14.3956 8.18688 14.2607 8.32178L14.084 8.49854L14.083 8.49756L9.25977 13.3208C9.19303 13.3877 9.11364 13.4408 9.02637 13.4771C8.93908 13.5133 8.84549 13.5317 8.75098 13.5317C8.65651 13.5317 8.56285 13.5132 8.47559 13.4771C8.38822 13.4408 8.30799 13.3878 8.24121 13.3208V13.3198L6.05469 11.1333C5.98787 11.0665 5.9346 10.9872 5.89844 10.8999C5.86229 10.8126 5.84375 10.719 5.84375 10.6245C5.84375 10.53 5.86228 10.4364 5.89844 10.3491C5.9346 10.2618 5.98787 10.1825 6.05469 10.1157C6.12148 10.049 6.20083 9.99562 6.28809 9.95947C6.37532 9.92337 6.46906 9.90479 6.56348 9.90479C6.65792 9.90481 6.75162 9.92333 6.83887 9.95947C6.92614 9.99563 7.00546 10.0489 7.07227 10.1157L8.75098 11.7944L13.2432 7.3042C13.3781 7.16932 13.5612 7.09326 13.752 7.09326Z" fill="white" stroke="white" stroke-width="0.5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -0,0 +1,3 @@
<svg width="32" height="36" viewBox="0 0 32 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M28.4137 12.0288L21.9713 5.58625C21.5951 5.21232 21.0867 5.00169 20.5562 5H11.4438C10.9133 5.00169 10.4049 5.21232 10.0288 5.58625L3.58625 12.0288C3.21232 12.4049 3.00169 12.9133 3 13.4438V22.5562C3.00169 23.0867 3.21232 23.5951 3.58625 23.9713L10.0288 30.4137C10.4049 30.7877 10.9133 30.9983 11.4438 31H20.5562C21.0867 30.9983 21.5951 30.7877 21.9713 30.4137L28.4137 23.9713C28.7877 23.5951 28.9983 23.0867 29 22.5562V13.4438C28.9983 12.9133 28.7877 12.4049 28.4137 12.0288ZM15 12C15 11.7348 15.1054 11.4804 15.2929 11.2929C15.4804 11.1054 15.7348 11 16 11C16.2652 11 16.5196 11.1054 16.7071 11.2929C16.8946 11.4804 17 11.7348 17 12V19C17 19.2652 16.8946 19.5196 16.7071 19.7071C16.5196 19.8946 16.2652 20 16 20C15.7348 20 15.4804 19.8946 15.2929 19.7071C15.1054 19.5196 15 19.2652 15 19V12ZM16 25C15.7033 25 15.4133 24.912 15.1666 24.7472C14.92 24.5824 14.7277 24.3481 14.6142 24.074C14.5006 23.7999 14.4709 23.4983 14.5288 23.2074C14.5867 22.9164 14.7296 22.6491 14.9393 22.4393C15.1491 22.2296 15.4164 22.0867 15.7074 22.0288C15.9983 21.9709 16.2999 22.0007 16.574 22.1142C16.8481 22.2277 17.0824 22.42 17.2472 22.6666C17.412 22.9133 17.5 23.2033 17.5 23.5C17.5 23.8978 17.342 24.2794 17.0607 24.5607C16.7794 24.842 16.3978 25 16 25Z" fill="#EA4F49"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,3 @@
<svg width="20" height="16" viewBox="0 0 20 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18 0H2C0.9 0 0.00999999 0.9 0.00999999 2L0 14C0 15.1 0.9 16 2 16H18C19.1 16 20 15.1 20 14V2C20 0.9 19.1 0 18 0ZM18 4L10 9L2 4V2L10 7L18 2V4Z" fill="#B68A35"/>
</svg>

After

Width:  |  Height:  |  Size: 272 B

View File

@ -0,0 +1,3 @@
<svg width="14" height="20" viewBox="0 0 14 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7 9.5C6.33696 9.5 5.70107 9.23661 5.23223 8.76777C4.76339 8.29893 4.5 7.66304 4.5 7C4.5 6.33696 4.76339 5.70107 5.23223 5.23223C5.70107 4.76339 6.33696 4.5 7 4.5C7.66304 4.5 8.29893 4.76339 8.76777 5.23223C9.23661 5.70107 9.5 6.33696 9.5 7C9.5 7.3283 9.43534 7.65339 9.3097 7.95671C9.18406 8.26002 8.99991 8.53562 8.76777 8.76777C8.53562 8.99991 8.26002 9.18406 7.95671 9.3097C7.65339 9.43534 7.3283 9.5 7 9.5ZM7 0C5.14348 0 3.36301 0.737498 2.05025 2.05025C0.737498 3.36301 0 5.14348 0 7C0 12.25 7 20 7 20C7 20 14 12.25 14 7C14 5.14348 13.2625 3.36301 11.9497 2.05025C10.637 0.737498 8.85652 0 7 0Z" fill="#B68A35"/>
</svg>

After

Width:  |  Height:  |  Size: 731 B

View File

@ -0,0 +1,10 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_996_32860)">
<path d="M11.9998 4C13.1044 4 13.9998 4.89544 13.9998 6C13.9998 7.10456 13.1044 8 11.9998 8C10.8953 8 9.99983 7.10456 9.99983 6C9.99983 4.89544 10.8953 4 11.9998 4ZM15.7274 15.0681L14.2274 9.06809C14.1869 8.90583 14.0932 8.76178 13.9614 8.65885C13.8295 8.55591 13.6671 8.5 13.4998 8.5H13.1448C12.4351 8.82634 11.5951 8.84044 10.8548 8.5H10.4998C10.3326 8.5 10.1701 8.55591 10.0383 8.65885C9.90644 8.76178 9.8128 8.90583 9.77223 9.06809L8.27223 15.0681C8.15405 15.5408 8.5118 16 8.99983 16H10.7498V19.25C10.7498 19.6642 11.0856 20 11.4998 20H12.4998C12.914 20 13.2498 19.6642 13.2498 19.25V16H14.9998C15.487 16 15.8458 15.5415 15.7274 15.0681Z" fill="#B68A35"/>
</g>
<defs>
<clipPath id="clip0_996_32860">
<rect width="8" height="16" fill="white" transform="translate(8 4)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 936 B

View File

@ -0,0 +1,3 @@
<svg width="21" height="18" viewBox="0 0 21 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.5 5H11V10L15.28 12.54L16 11.33L12.5 9.25V5ZM12 0C9.61305 0 7.32387 0.948211 5.63604 2.63604C3.94821 4.32387 3 6.61305 3 9H0L3.96 13.03L8 9H5C5 7.14348 5.7375 5.36301 7.05025 4.05025C8.36301 2.7375 10.1435 2 12 2C13.8565 2 15.637 2.7375 16.9497 4.05025C18.2625 5.36301 19 7.14348 19 9C19 10.8565 18.2625 12.637 16.9497 13.9497C15.637 15.2625 13.8565 16 12 16C10.07 16 8.32 15.21 7.06 13.94L5.64 15.36C6.47161 16.2004 7.46234 16.8668 8.55433 17.32C9.64632 17.7733 10.8177 18.0045 12 18C14.3869 18 16.6761 17.0518 18.364 15.364C20.0518 13.6761 21 11.3869 21 9C21 6.61305 20.0518 4.32387 18.364 2.63604C16.6761 0.948211 14.3869 0 12 0Z" fill="#232528"/>
</svg>

After

Width:  |  Height:  |  Size: 766 B

View File

@ -0,0 +1,4 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.9173 9.99992C17.9173 11.5657 17.453 13.0963 16.5831 14.3982C15.7132 15.7001 14.4768 16.7148 13.0302 17.314C11.5836 17.9132 9.99187 18.0699 8.45619 17.7645C6.92051 17.459 5.50989 16.705 4.40273 15.5978C3.29556 14.4907 2.54157 13.0801 2.2361 11.5444C1.93064 10.0087 2.08741 8.41692 2.68661 6.97034C3.2858 5.52376 4.3005 4.28735 5.60239 3.41745C6.90428 2.54756 8.43489 2.08325 10.0007 2.08325C11.5415 2.08275 13.049 2.53191 14.3383 3.37565C15.6276 4.2194 16.6427 5.42105 17.259 6.83325M17.9173 4.58325L17.5215 7.22909L15.0007 6.66659" stroke="#5F646D" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M8.33398 9.16667V7.91667C8.33398 7.47464 8.50958 7.05072 8.82214 6.73816C9.1347 6.4256 9.55862 6.25 10.0007 6.25C10.4427 6.25 10.8666 6.4256 11.1792 6.73816C11.4917 7.05072 11.6673 7.47464 11.6673 7.91667V9.16667M9.37565 13.75H10.6257C11.6032 13.75 12.0923 13.75 12.4282 13.4917C12.5149 13.4251 12.5925 13.3475 12.659 13.2608C12.9173 12.9242 12.9173 12.4358 12.9173 11.4583C12.9173 10.4808 12.9173 9.99167 12.659 9.65583C12.5925 9.56913 12.5149 9.49152 12.4282 9.425C12.0915 9.16667 11.6032 9.16667 10.6257 9.16667H9.37565C8.39815 9.16667 7.90898 9.16667 7.57315 9.425C7.48645 9.49152 7.40884 9.56913 7.34232 9.65583C7.08398 9.9925 7.08398 10.4808 7.08398 11.4583C7.08398 12.4358 7.08398 12.925 7.34232 13.2608C7.40884 13.3475 7.48645 13.4251 7.57315 13.4917C7.90982 13.75 8.39815 13.75 9.37565 13.75Z" stroke="#5F646D" stroke-width="1.5" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,4 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.9173 9.99992C17.9173 11.5657 17.453 13.0963 16.5831 14.3982C15.7132 15.7001 14.4768 16.7148 13.0302 17.314C11.5836 17.9132 9.99187 18.0699 8.45619 17.7645C6.92051 17.459 5.50989 16.705 4.40273 15.5978C3.29556 14.4907 2.54157 13.0801 2.2361 11.5444C1.93064 10.0087 2.08741 8.41692 2.68661 6.97034C3.2858 5.52376 4.3005 4.28735 5.60239 3.41745C6.90428 2.54756 8.43489 2.08325 10.0007 2.08325C11.5415 2.08275 13.049 2.53191 14.3383 3.37565C15.6276 4.2194 16.6427 5.42105 17.259 6.83325M17.9173 4.58325L17.5215 7.22909L15.0007 6.66659" stroke="#92722A" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M8.33398 9.16667V7.91667C8.33398 7.47464 8.50958 7.05072 8.82214 6.73816C9.1347 6.4256 9.55862 6.25 10.0007 6.25C10.4427 6.25 10.8666 6.4256 11.1792 6.73816C11.4917 7.05072 11.6673 7.47464 11.6673 7.91667V9.16667M9.37565 13.75H10.6257C11.6032 13.75 12.0923 13.75 12.4282 13.4917C12.5149 13.4251 12.5925 13.3475 12.659 13.2608C12.9173 12.9242 12.9173 12.4358 12.9173 11.4583C12.9173 10.4808 12.9173 9.99167 12.659 9.65583C12.5925 9.56913 12.5149 9.49152 12.4282 9.425C12.0915 9.16667 11.6032 9.16667 10.6257 9.16667H9.37565C8.39815 9.16667 7.90898 9.16667 7.57315 9.425C7.48645 9.49152 7.40884 9.56913 7.34232 9.65583C7.08398 9.9925 7.08398 10.4808 7.08398 11.4583C7.08398 12.4358 7.08398 12.925 7.34232 13.2608C7.40884 13.3475 7.48645 13.4251 7.57315 13.4917C7.90982 13.75 8.39815 13.75 9.37565 13.75Z" stroke="#92722A" stroke-width="1.5" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.8337 10.8307H10.8337V15.8307H9.16699V10.8307H4.16699V9.16406H9.16699V4.16406H10.8337V9.16406H15.8337V10.8307Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 242 B

View File

@ -0,0 +1,3 @@
<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.7998 2.25C10.8714 2.25 8.98638 2.82183 7.383 3.89317C5.77962 4.96451 4.52994 6.48726 3.79198 8.26884C3.05403 10.0504 2.86095 12.0108 3.23715 13.9021C3.61336 15.7934 4.54196 17.5307 5.90552 18.8943C7.26908 20.2579 9.00636 21.1865 10.8977 21.5627C12.789 21.9389 14.7494 21.7458 16.531 21.0078C18.3126 20.2699 19.8353 19.0202 20.9066 17.4168C21.978 15.8134 22.5498 13.9284 22.5498 12C22.5471 9.41498 21.519 6.93661 19.6911 5.10872C17.8632 3.28084 15.3848 2.25273 12.7998 2.25ZM12.4248 6.75C12.6473 6.75 12.8648 6.81598 13.0498 6.9396C13.2348 7.06321 13.379 7.23891 13.4642 7.44448C13.5493 7.65005 13.5716 7.87625 13.5282 8.09448C13.4848 8.31271 13.3776 8.51316 13.2203 8.6705C13.063 8.82783 12.8625 8.93498 12.6443 8.97838C12.4261 9.02179 12.1999 8.99951 11.9943 8.91436C11.7887 8.82922 11.613 8.68502 11.4894 8.50002C11.3658 8.31501 11.2998 8.0975 11.2998 7.875C11.2998 7.57663 11.4183 7.29048 11.6293 7.0795C11.8403 6.86853 12.1264 6.75 12.4248 6.75ZM13.5498 17.25C13.152 17.25 12.7705 17.092 12.4891 16.8107C12.2078 16.5294 12.0498 16.1478 12.0498 15.75V12C11.8509 12 11.6601 11.921 11.5195 11.7803C11.3788 11.6397 11.2998 11.4489 11.2998 11.25C11.2998 11.0511 11.3788 10.8603 11.5195 10.7197C11.6601 10.579 11.8509 10.5 12.0498 10.5C12.4476 10.5 12.8292 10.658 13.1105 10.9393C13.3918 11.2206 13.5498 11.6022 13.5498 12V15.75C13.7487 15.75 13.9395 15.829 14.0801 15.9697C14.2208 16.1103 14.2998 16.3011 14.2998 16.5C14.2998 16.6989 14.2208 16.8897 14.0801 17.0303C13.9395 17.171 13.7487 17.25 13.5498 17.25Z" fill="#FFC107"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,10 @@
<svg width="7" height="19" viewBox="0 0 7 19" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_996_32854)">
<path d="M3.5 0.666748C4.78866 0.666748 5.83333 1.71143 5.83333 3.00008C5.83333 4.28874 4.78866 5.33341 3.5 5.33341C2.21134 5.33341 1.16667 4.28874 1.16667 3.00008C1.16667 1.71143 2.21134 0.666748 3.5 0.666748ZM5.25 5.91675H4.83583C4.00783 6.29748 3.02786 6.31392 2.16417 5.91675H1.75C0.78349 5.91675 0 6.70024 0 7.66675V12.6251C0 13.1083 0.391745 13.5001 0.875 13.5001H1.45833V18.4584C1.45833 18.9417 1.85008 19.3334 2.33333 19.3334H4.66667C5.14992 19.3334 5.54167 18.9417 5.54167 18.4584V13.5001H6.125C6.60825 13.5001 7 13.1083 7 12.6251V7.66675C7 6.70024 6.21651 5.91675 5.25 5.91675Z" fill="#B68A35"/>
</g>
<defs>
<clipPath id="clip0_996_32854">
<rect width="7" height="19" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 852 B

View File

@ -0,0 +1,3 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.0306 6.96937C14.1004 7.03903 14.1557 7.12175 14.1934 7.21279C14.2312 7.30384 14.2506 7.40144 14.2506 7.5C14.2506 7.59856 14.2312 7.69616 14.1934 7.78721C14.1557 7.87825 14.1004 7.96097 14.0306 8.03063L8.78063 13.2806C8.71097 13.3504 8.62826 13.4057 8.53721 13.4434C8.44616 13.4812 8.34857 13.5006 8.25 13.5006C8.15144 13.5006 8.05385 13.4812 7.9628 13.4434C7.87175 13.4057 7.78903 13.3504 7.71938 13.2806L5.46938 11.0306C5.32865 10.8899 5.24959 10.699 5.24959 10.5C5.24959 10.301 5.32865 10.1101 5.46938 9.96937C5.61011 9.82864 5.80098 9.74958 6 9.74958C6.19903 9.74958 6.3899 9.82864 6.53063 9.96937L8.25 11.6897L12.9694 6.96937C13.039 6.89964 13.1218 6.84432 13.2128 6.80658C13.3038 6.76884 13.4014 6.74941 13.5 6.74941C13.5986 6.74941 13.6962 6.76884 13.7872 6.80658C13.8783 6.84432 13.961 6.89964 14.0306 6.96937ZM19.5 9.75C19.5 11.6784 18.9282 13.5634 17.8568 15.1668C16.7855 16.7702 15.2627 18.0199 13.4812 18.7578C11.6996 19.4958 9.73919 19.6889 7.84787 19.3127C5.95656 18.9365 4.21928 18.0079 2.85571 16.6443C1.49215 15.2807 0.563554 13.5434 0.187348 11.6521C-0.188858 9.76082 0.00422452 7.80042 0.742179 6.01884C1.48013 4.23726 2.72982 2.71451 4.33319 1.64317C5.93657 0.571828 7.82164 0 9.75 0C12.335 0.00272983 14.8134 1.03084 16.6413 2.85872C18.4692 4.68661 19.4973 7.16498 19.5 9.75ZM18 9.75C18 8.1183 17.5161 6.52325 16.6096 5.16655C15.7031 3.80984 14.4146 2.75242 12.9071 2.12799C11.3997 1.50357 9.74085 1.34019 8.14051 1.65852C6.54017 1.97685 5.07016 2.76259 3.91637 3.91637C2.76259 5.07015 1.97685 6.54016 1.65853 8.1405C1.3402 9.74085 1.50358 11.3996 2.128 12.9071C2.75242 14.4146 3.80984 15.7031 5.16655 16.6096C6.52326 17.5161 8.11831 18 9.75 18C11.9373 17.9975 14.0343 17.1275 15.5809 15.5809C17.1275 14.0343 17.9975 11.9373 18 9.75Z" fill="#232528"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.5 16C7.68333 16 6.146 15.3707 4.888 14.112C3.63 12.8533 3.00067 11.316 3 9.5C2.99933 7.684 3.62867 6.14667 4.888 4.888C6.14733 3.62933 7.68467 3 9.5 3C11.3153 3 12.853 3.62933 14.113 4.888C15.373 6.14667 16.002 7.684 16 9.5C16 10.2333 15.8833 10.925 15.65 11.575C15.4167 12.225 15.1 12.8 14.7 13.3L20.3 18.9C20.4833 19.0833 20.575 19.3167 20.575 19.6C20.575 19.8833 20.4833 20.1167 20.3 20.3C20.1167 20.4833 19.8833 20.575 19.6 20.575C19.3167 20.575 19.0833 20.4833 18.9 20.3L13.3 14.7C12.8 15.1 12.225 15.4167 11.575 15.65C10.925 15.8833 10.2333 16 9.5 16ZM9.5 14C10.75 14 11.8127 13.5627 12.688 12.688C13.5633 11.8133 14.0007 10.7507 14 9.5C13.9993 8.24933 13.562 7.187 12.688 6.313C11.814 5.439 10.7513 5.00133 9.5 5C8.24867 4.99867 7.18633 5.43633 6.313 6.313C5.43967 7.18967 5.002 8.252 5 9.5C4.998 10.748 5.43567 11.8107 6.313 12.688C7.19033 13.5653 8.25267 14.0027 9.5 14Z" fill="#9EA2A9"/>
</svg>

After

Width:  |  Height:  |  Size: 1013 B

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.5 8H12V13L16.28 15.54L17 14.33L13.5 12.25V8ZM13 3C10.6131 3 8.32387 3.94821 6.63604 5.63604C4.94821 7.32387 4 9.61305 4 12H1L4.96 16.03L9 12H6C6 10.1435 6.7375 8.36301 8.05025 7.05025C9.36301 5.7375 11.1435 5 13 5C14.8565 5 16.637 5.7375 17.9497 7.05025C19.2625 8.36301 20 10.1435 20 12C20 13.8565 19.2625 15.637 17.9497 16.9497C16.637 18.2625 14.8565 19 13 19C11.07 19 9.32 18.21 8.06 16.94L6.64 18.36C7.47161 19.2004 8.46234 19.8668 9.55433 20.32C10.6463 20.7733 11.8177 21.0045 13 21C15.3869 21 17.6761 20.0518 19.364 18.364C21.0518 16.6761 22 14.3869 22 12C22 9.61305 21.0518 7.32387 19.364 5.63604C17.6761 3.94821 15.3869 3 13 3Z" fill="#92722A"/>
</svg>

After

Width:  |  Height:  |  Size: 769 B

View File

@ -0,0 +1,3 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.00001 9C6.00001 7.9455 6.06601 6.9375 6.18751 6H11.8125C11.9325 6.9375 12 7.9455 12 9C12 10.0545 11.934 11.0625 11.8125 12H6.18751C6.06239 11.0049 5.99977 10.0029 6.00001 9ZM4.67551 12C4.55809 11.0043 4.49948 10.0026 4.50001 9C4.50001 7.9605 4.56001 6.9525 4.67551 6H0.51001C0.170959 6.9638 -0.00150581 7.9783 9.90426e-06 9C9.90426e-06 10.0515 0.18001 11.061 0.51151 12H4.67551ZM1.20451 13.5H4.90951C5.09701 14.4825 5.34751 15.381 5.64901 16.164C5.85001 16.6875 6.07801 17.172 6.33451 17.5995C4.17063 16.9252 2.33943 15.4619 1.20451 13.5ZM6.43801 13.5H11.562C11.417 14.224 11.2128 14.9349 10.9515 15.6255C10.632 16.4565 10.269 17.079 9.90451 17.4795C9.54001 17.88 9.23401 18 9.00001 18C8.76601 18 8.46001 17.88 8.09551 17.4795C7.73101 17.079 7.36801 16.4565 7.04851 15.6255C6.78723 14.9349 6.58304 14.224 6.43801 13.5ZM13.092 13.5C12.9236 14.408 12.6756 15.2994 12.351 16.164C12.1653 16.6618 11.9359 17.1422 11.6655 17.5995C13.8294 16.9252 15.6606 15.4619 16.7955 13.5H13.092ZM17.487 12C17.8271 11.0364 18.0006 10.0219 18 9C18.001 7.97821 17.8281 6.96371 17.4885 6H13.3245C13.4385 6.9525 13.5 7.9605 13.5 9C13.5 10.0395 13.44 11.0475 13.3245 12H17.487ZM10.953 2.3745C11.1915 2.9955 11.3985 3.7095 11.5635 4.5H6.43801C6.60301 3.7095 6.81001 2.9955 7.04851 2.3745C7.36801 1.5435 7.73101 0.921 8.09551 0.5205C8.46001 0.12 8.76601 0 9.00001 0C9.23401 0 9.54001 0.12 9.90451 0.5205C10.269 0.921 10.632 1.5435 10.9515 2.3745M13.092 4.5H16.797C15.6617 2.53783 13.83 1.07444 11.6655 0.4005C11.9205 0.828 12.15 1.3125 12.351 1.836C12.6525 2.619 12.903 3.516 13.092 4.5ZM1.20451 4.5H4.90951C5.07744 3.59204 5.3249 2.70061 5.64901 1.836C5.85001 1.3125 6.07801 0.828 6.33451 0.4005C4.17063 1.07477 2.33943 2.53812 1.20451 4.5Z" fill="#B68A35"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,11 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_471_1952)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.9998 5.71349C15.0134 5.61458 15.0031 5.51385 14.9698 5.41974L14.9535 5.34099C14.9075 5.14946 14.8315 4.96638 14.7285 4.79849C14.6135 4.61099 14.451 4.44849 14.126 4.12349L10.8885 0.884737C10.5648 0.559737 10.4023 0.397237 10.2135 0.280987C10.0229 0.164256 9.81291 0.0825532 9.59352 0.0397371C9.4994 0.00641848 9.39867 -0.00386859 9.29976 0.00973706C9.16101 0.00598706 8.99226 0.00598706 8.76851 0.00598706H6.00601C3.90602 0.00598706 2.85602 0.00598705 2.05602 0.414737C1.35211 0.775535 0.779314 1.34833 0.418516 2.05224C0.00976566 2.85474 0.00976562 3.90099 0.00976562 6.00099V14.001C0.00976562 16.101 0.00976566 17.151 0.418516 17.951C0.779314 18.6549 1.35211 19.2277 2.05602 19.5885C2.85852 19.9972 3.90602 19.9972 6.00601 19.9972H9.03477C9.53602 19.9972 9.78726 19.3435 9.46851 18.9572C9.41656 18.8926 9.35095 18.8403 9.2764 18.804C9.20184 18.7677 9.12018 18.7483 9.03726 18.7472H5.99977C4.92852 18.7472 4.19977 18.746 3.63727 18.6997C3.08977 18.6547 2.80852 18.5747 2.61352 18.4747C2.14313 18.2351 1.7607 17.8526 1.52102 17.3822C1.42102 17.1872 1.33977 16.9072 1.29602 16.3585C1.25102 15.796 1.24977 15.071 1.24977 13.996V5.99599C1.24977 4.92474 1.24977 4.19599 1.29602 3.63349C1.34102 3.08599 1.42227 2.80474 1.52102 2.60974C1.76102 2.13974 2.14352 1.75724 2.61352 1.51724C2.80852 1.41724 3.08977 1.33599 3.63852 1.29224C4.19977 1.24724 4.92477 1.24724 5.99977 1.24724H8.74977V5.62224C8.74977 5.788 8.81561 5.94697 8.93282 6.06418C9.05003 6.18139 9.209 6.24724 9.37476 6.24724H13.7498V6.93099C13.7498 7.24349 14.0085 7.49349 14.3198 7.52224C14.676 7.55349 14.9985 7.28724 14.9985 6.92974V6.23849C14.9985 6.01599 14.9985 5.84724 14.9923 5.70724L14.9998 5.71349ZM9.99976 1.76349L13.2373 5.00099H9.99976V1.76349Z" fill="#5F646D"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.7502 18.7512C14.7927 18.7512 15.7627 18.4325 16.5627 17.8875L18.4002 19.725C18.5759 19.9007 18.8142 19.9994 19.0627 19.9994C19.3112 19.9994 19.5495 19.9007 19.7252 19.725C19.9009 19.5493 19.9996 19.311 19.9996 19.0625C19.9996 18.814 19.9009 18.5757 19.7252 18.4L17.8877 16.5625C18.4327 15.7612 18.7515 14.8 18.7515 13.75C18.7515 10.9875 16.514 8.75 13.7515 8.75C10.989 8.75 8.75146 10.9875 8.75146 13.75C8.75146 16.5125 10.989 18.75 13.7515 18.75L13.7502 18.7512ZM13.7502 17.5013C15.8252 17.5013 17.5002 15.8263 17.5002 13.7512C17.5002 11.6762 15.8252 10.0012 13.7502 10.0012C11.6752 10.0012 10.0002 11.6762 10.0002 13.7512C10.0002 15.8263 11.6752 17.5013 13.7502 17.5013Z" fill="#5F646D"/>
</g>
<defs>
<clipPath id="clip0_471_1952">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,7 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 13C14.2091 13 16 11.2091 16 9C16 6.79086 14.2091 5 12 5C9.79086 5 8 6.79086 8 9C8 11.2091 9.79086 13 12 13Z" fill="#B68A35"/>
<path d="M17 12C18.6569 12 20 10.6569 20 9C20 7.34315 18.6569 6 17 6C15.3431 6 14 7.34315 14 9C14 10.6569 15.3431 12 17 12Z" fill="#B68A35"/>
<path d="M7 12C8.65685 12 10 10.6569 10 9C10 7.34315 8.65685 6 7 6C5.34315 6 4 7.34315 4 9C4 10.6569 5.34315 12 7 12Z" fill="#B68A35"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.5689 18.0001H19.8949C20.4869 18.0001 20.9399 17.4901 20.7969 16.9161C20.4279 15.4461 19.4479 13.0001 16.9999 13.0001C16.1139 13.0001 15.4199 13.3201 14.8779 13.8001C16.3859 14.7771 17.1659 16.4901 17.5689 18.0001ZM9.12185 13.8001C8.54095 13.275 7.78284 12.9891 6.99985 13.0001C4.55185 13.0001 3.57185 15.4461 3.20285 16.9161C3.05985 17.4901 3.51285 18.0001 4.10485 18.0001H6.43185C6.83485 16.4901 7.61385 14.7771 9.12185 13.8001Z" fill="#B68A35"/>
<path d="M11.9998 14C15.7088 14 16.6658 17.301 16.9138 19.006C16.9938 19.553 16.5518 20 15.9998 20H7.99985C7.44785 20 7.00685 19.553 7.08585 19.006C7.33385 17.301 8.29085 14 11.9998 14Z" fill="#B68A35"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,9 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect width="24" height="24" fill="url(#pattern0_996_32867)"/>
<defs>
<pattern id="pattern0_996_32867" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#image0_996_32867" transform="scale(0.0104167)"/>
</pattern>
<image id="image0_996_32867" width="96" height="96" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAF6ElEQVR4nO2dy48URRzHy8hLJGoQhSCPg3rhYEx6q7p3u9fa369mhyWyQYU5eFQTgwbfUY9cMWz3shHDI3ox0RgOxogmQMRo4sGYIBpc3iBE17CwzExP1W6CCG1mFkQRlp2Z7u3H1Cf5/gHz/UxV99RM/4YQjUaj0Wg0Go1Go0kQRh+fx7xONF3nRdN1Npue/ZXlOT9ZrnPC9JzzludcsDznkuk5Rct1zliufdB07V2WZ283Xedts8/utlxrbtyvIzVYrnVHe3/ncst1Npqus99yncuW5wRNx7WPmp7zLvM6Hze2GbPjfp2Jw+xzDMuzByzXGQml8Alies6Y6Tk7LM/u5ev5NNKqBJzPquToC9VtI+rSJ1oZltextrrySKsQ9Dw0Uwr6ukT2hxIsnuKvXxWufdbynNeWrV82g2SZUWzrVYIdrxZ/NVYCBFxbEc4J5jlrSNZQnC6QSD/7d/GJFOD9szV9wQb4IpIFJLCnlaDFG5Wvkipg/GJdNN3O1SStBJxPk4JtuFnxSRdgXduWtqXu2uALeq9C9t2tyldpEFBbDfY3vJ/fQ9LAGLQvVcgOTaZ8lRIB47EH7U32EpJk/Jz5sBT098mWr1IloHZdONW+sX0pSSJj+bbFUtBf6ylfpUzAFQnHLdd6gCSJCjfmKUGP1Vu+SqGA8diDxobc3SQJBIYxXQn6dSPlq9QKqN0d7U7EWZJEtr3R8lWaBYyvBDfW8ivCXN1M+SrtAmrH5XZvLOWP5YwlE33CbQkBXu2iPGxuMudPuQAp2OfNlq8yIOBKPpnS8ivI1oRRvsqOgMDst1dM2RcpUtDftADnuthHjG3G9MgFSKRvhFW+ypSA2jH2c5GWP8z5HIXsrBbg3DCm65zuGeiZGZkAKejLYZavMiagmvZ++9lIyg8IuU0JdlgLcG61CvZHIkBh24qwy1cZFFBNR39HewQC2EdRCBgp+dlL0d8aavnBSmO2ElRqAf6kcq5YPhcEQXgHdaPInoiifJVRATUJpVJXaAIUsve0AL/eVRDeSalCelQL8OtL0f8hlPJld/v9UZWvMizgXLF8cXh4eE7z7/4cXa4F+I1JKJWgeQHI3tIC/MZSLK9rWoBE+oEW4De2Aorl/uZXgKB7tAC/wZR3Ni8A6UEtwG9sBZTKB8IQMKwF+A0K8E81L0DQihbgNyagWB5pWoAU9KIW4Dcq4IIWUEq5AL0F+fFuQfoi7Md8Eda3oUGst6FS0N1agB/fBzEp6PtagB/jUYQ+jAtiPowzu7UAP77j6ErPo/dpAX795RfLfw4NDYUzGkchO6IF+PUK+D6U8msCBN2sBfjxfSk/KtgqLcCvK2eLlcdCfSZAIStrAf7kUiyfCYLgdhImUtAPtQB/stlCwkYBy0chABEzF865Fc3P0+sYwtGqAgDgRxIVEtk6LQBvJeCZyAQE3Y/cGfbxNCagtBBzqlAoRDvcSSJ7VQvAm737o3k86X+PqSI7rQXg9TnE+RQN76jk2p7SAvA/6erqEiSNowowAeWFkI9JHBOywhjWgfGX11QAYJhzvoDEQRhbESagxCZyWQixksSJFGxLqwoAgD6SkJFle1tQwK4pu+uZ3KDWxp4jw/iLbCQHenp67iJJYpSzRRLpyRYQcCyXyy0kSaQMxoP1zhLC+AuddADgZD6fX0ySzGiuY6ES9OcMCjiQ+PKvUs5bc5Vg32ZIwN5cLiGDWsMeX4/xlztRLiPigGFMwSiyqJDICgrZSNoEAMB5RHySZAGJ5nwp2KdpEQAAOxExWQO6w0CKtpwSdDCpAgDgaFdX1yqSZYLCshkSzVck0qGkCACAMwDwUqr3+kb+T2wU6VoAGIyx/MMA8DznfBZpZQDAqN5tAMDIFJQ+hog7ELG3UCiE++OptMM5n4WI3QDwDgDsA4BLId1KHqoKRsQVltVCf1vYLPl8fi4iAiKuvbJC9lR/dwMAJ6qrBQAuAMBfiFgEgCFE/AURvwSArQDwJgAg5yn59yONRqPRaDQajUZDWoW/Abuf1SiYxlZEAAAAAElFTkSuQmCC"/>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.6663 2.66659H11.333V1.99992C11.333 1.82311 11.2628 1.65354 11.1377 1.52851C11.0127 1.40349 10.8432 1.33325 10.6663 1.33325C10.4895 1.33325 10.32 1.40349 10.1949 1.52851C10.0699 1.65354 9.99967 1.82311 9.99967 1.99992V2.66659H5.99967V1.99992C5.99967 1.82311 5.92944 1.65354 5.80441 1.52851C5.67939 1.40349 5.50982 1.33325 5.33301 1.33325C5.1562 1.33325 4.98663 1.40349 4.8616 1.52851C4.73658 1.65354 4.66634 1.82311 4.66634 1.99992V2.66659H3.33301C2.80257 2.66659 2.29387 2.8773 1.91879 3.25237C1.54372 3.62744 1.33301 4.13615 1.33301 4.66658V12.6666C1.33301 13.197 1.54372 13.7057 1.91879 14.0808C2.29387 14.4559 2.80257 14.6666 3.33301 14.6666H12.6663C13.1968 14.6666 13.7055 14.4559 14.0806 14.0808C14.4556 13.7057 14.6663 13.197 14.6663 12.6666V4.66658C14.6663 4.13615 14.4556 3.62744 14.0806 3.25237C13.7055 2.8773 13.1968 2.66659 12.6663 2.66659ZM13.333 12.6666C13.333 12.8434 13.2628 13.013 13.1377 13.138C13.0127 13.263 12.8432 13.3333 12.6663 13.3333H3.33301C3.1562 13.3333 2.98663 13.263 2.8616 13.138C2.73658 13.013 2.66634 12.8434 2.66634 12.6666V7.99992H13.333V12.6666ZM13.333 6.66658H2.66634V4.66658C2.66634 4.48977 2.73658 4.3202 2.8616 4.19518C2.98663 4.07016 3.1562 3.99992 3.33301 3.99992H4.66634V4.66658C4.66634 4.8434 4.73658 5.01297 4.8616 5.13799C4.98663 5.26301 5.1562 5.33325 5.33301 5.33325C5.50982 5.33325 5.67939 5.26301 5.80441 5.13799C5.92944 5.01297 5.99967 4.8434 5.99967 4.66658V3.99992H9.99967V4.66658C9.99967 4.8434 10.0699 5.01297 10.1949 5.13799C10.32 5.26301 10.4895 5.33325 10.6663 5.33325C10.8432 5.33325 11.0127 5.26301 11.1377 5.13799C11.2628 5.01297 11.333 4.8434 11.333 4.66658V3.99992H12.6663C12.8432 3.99992 13.0127 4.07016 13.1377 4.19518C13.2628 4.3202 13.333 4.48977 13.333 4.66658V6.66658Z" fill="#92722A"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,3 @@
<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.3999 2.25C10.4715 2.25 8.58648 2.82183 6.9831 3.89317C5.37972 4.96451 4.13004 6.48726 3.39208 8.26884C2.65413 10.0504 2.46104 12.0108 2.83725 13.9021C3.21346 15.7934 4.14205 17.5307 5.50562 18.8943C6.86918 20.2579 8.60646 21.1865 10.4978 21.5627C12.3891 21.9389 14.3495 21.7458 16.1311 21.0078C17.9126 20.2699 19.4354 19.0202 20.5067 17.4168C21.5781 15.8134 22.1499 13.9284 22.1499 12C22.1472 9.41498 21.1191 6.93661 19.2912 5.10872C17.4633 3.28084 14.9849 2.25273 12.3999 2.25ZM11.6499 7.5C11.6499 7.30109 11.7289 7.11032 11.8696 6.96967C12.0102 6.82902 12.201 6.75 12.3999 6.75C12.5988 6.75 12.7896 6.82902 12.9302 6.96967C13.0709 7.11032 13.1499 7.30109 13.1499 7.5V12.75C13.1499 12.9489 13.0709 13.1397 12.9302 13.2803C12.7896 13.421 12.5988 13.5 12.3999 13.5C12.201 13.5 12.0102 13.421 11.8696 13.2803C11.7289 13.1397 11.6499 12.9489 11.6499 12.75V7.5ZM12.3999 17.25C12.1774 17.25 11.9599 17.184 11.7749 17.0604C11.5899 16.9368 11.4457 16.7611 11.3605 16.5555C11.2754 16.35 11.2531 16.1238 11.2965 15.9055C11.3399 15.6873 11.4471 15.4868 11.6044 15.3295C11.7617 15.1722 11.9622 15.065 12.1804 15.0216C12.3987 14.9782 12.6249 15.0005 12.8304 15.0856C13.036 15.1708 13.2117 15.315 13.3353 15.5C13.4589 15.685 13.5249 15.9025 13.5249 16.125C13.5249 16.4234 13.4064 16.7095 13.1954 16.9205C12.9844 17.1315 12.6983 17.25 12.3999 17.25Z" fill="#EA4F49"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,3 @@
<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M22.8001 17.6335L14.6017 3.39569C14.3968 3.04687 14.1043 2.75764 13.7533 2.55668C13.4022 2.35572 13.0047 2.25 12.6001 2.25C12.1956 2.25 11.7981 2.35572 11.447 2.55668C11.0959 2.75764 10.8034 3.04687 10.5986 3.39569L2.40013 17.6335C2.203 17.9709 2.09912 18.3546 2.09912 18.7454C2.09912 19.1361 2.203 19.5199 2.40013 19.8572C2.60237 20.2082 2.89435 20.499 3.24609 20.6998C3.59783 20.9006 3.99667 21.0043 4.40169 21.0001H20.7986C21.2033 21.0039 21.6017 20.9001 21.9531 20.6993C22.3045 20.4985 22.5962 20.2079 22.7983 19.8572C22.9957 19.52 23.0999 19.1364 23.1002 18.7456C23.1005 18.3549 22.997 17.9711 22.8001 17.6335ZM11.8501 9.75006C11.8501 9.55115 11.9291 9.36038 12.0698 9.21973C12.2104 9.07908 12.4012 9.00006 12.6001 9.00006C12.799 9.00006 12.9898 9.07908 13.1305 9.21973C13.2711 9.36038 13.3501 9.55115 13.3501 9.75006V13.5001C13.3501 13.699 13.2711 13.8897 13.1305 14.0304C12.9898 14.171 12.799 14.2501 12.6001 14.2501C12.4012 14.2501 12.2104 14.171 12.0698 14.0304C11.9291 13.8897 11.8501 13.699 11.8501 13.5001V9.75006ZM12.6001 18.0001C12.3776 18.0001 12.1601 17.9341 11.9751 17.8105C11.7901 17.6868 11.6459 17.5111 11.5608 17.3056C11.4756 17.1 11.4533 16.8738 11.4967 16.6556C11.5402 16.4374 11.6473 16.2369 11.8046 16.0796C11.962 15.9222 12.1624 15.8151 12.3806 15.7717C12.5989 15.7283 12.8251 15.7505 13.0306 15.8357C13.2362 15.9208 13.4119 16.065 13.5355 16.25C13.6591 16.4351 13.7251 16.6526 13.7251 16.8751C13.7251 17.1734 13.6066 17.4596 13.3956 17.6706C13.1846 17.8815 12.8985 18.0001 12.6001 18.0001Z" fill="#F29F0E"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.48889 2.00085C8.30999 2.03488 8.14887 2.13103 8.03399 2.27234C7.91911 2.41364 7.85787 2.59099 7.86108 2.77307V3.54528H5.08573C4.46796 3.54528 4 4.01325 4 4.63102V20.9201C4 21.6151 4.46796 22.0785 5.08573 22.0785H18.286C18.9038 22.0785 19.3717 21.6105 19.3717 20.9927V4.63102C19.4489 4.01325 18.9763 3.54528 18.3586 3.54528H15.5832V2.77307C15.5832 2.56826 15.5019 2.37185 15.3571 2.22703C15.2122 2.08221 15.0158 2.00085 14.811 2.00085H8.63329C8.60911 1.99972 8.58489 1.99972 8.5607 2.00085C8.53652 1.99972 8.51307 1.99972 8.48889 2.00085ZM9.40551 3.54528H14.0388V5.08972H9.40551V3.54528ZM5.54443 5.08972H7.86108V5.86193C7.86108 6.06674 7.94244 6.26315 8.08725 6.40797C8.23207 6.55279 8.42849 6.63415 8.63329 6.63415H14.811C15.0158 6.63415 15.2122 6.55279 15.3571 6.40797C15.5019 6.26315 15.5832 6.06674 15.5832 5.86193V5.08972H17.8999V20.534H5.54443V5.08972ZM7.08886 8.95079V12.0397H10.1777V8.95079H7.08886ZM7.86108 9.72301H9.40551V11.2674H7.86108V9.72301ZM11.7222 9.72301V11.2674H16.3554V9.72301H11.7222ZM7.08886 13.5841V16.6729H10.1777V13.5841H7.08886ZM11.7222 14.3563V15.9007H16.3554V14.3563H11.7222Z" fill="#B68A35"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

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="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -0,0 +1,19 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
body {
@apply font-sans text-gray-800 bg-gray-50;
}
}
@layer components {
.btn-primary {
@apply bg-primary-600 hover:bg-primary-700 text-white font-medium py-2 px-4 rounded-lg transition-colors duration-200;
}
.btn-secondary {
@apply bg-secondary-600 hover:bg-secondary-700 text-white font-medium py-2 px-4 rounded-lg transition-colors duration-200;
}
}

View File

@ -0,0 +1,155 @@
import React from 'react';
import { NavLink, useNavigate } from 'react-router-dom';
import Logo from '../../assets/images/FCSCLogo.svg';
import DashboardIconActive from '../../assets/images/cuida_dashboard-outline.svg';
import DashboardIconInactive from '../../assets/images/cuida_dashboard-outline-inactive.svg';
import CheckCircleActive from '../../assets/images/CheckCircle-active.svg';
import ConfigActive from '../../assets/images/configrationicon-active.svg';
import ConfigInactive from '../../assets/images/configrationicon-inactive.svg';
import UserActive from '../../assets/images/User-active.svg';
import UserInactive from '../../assets/images/User-inactive.svg';
import ManageSubmissionInactive from '../../assets/images/managesubmission - inactive.svg';
import BellIconAsset from '../../assets/images/Bell.svg';
const NavItem = ({ label, to, iconActive, iconInactive, end = false }) => (
<NavLink
to={to}
end={end}
className={({ isActive }) =>
`inline-flex items-center gap-2 pb-1 border-b-2 text-[14px] leading-5 ` +
(isActive ? 'text-[#92722A] font-medium border-[#92722A]' : 'text-[#232528] border-transparent hover:text-gray-900')
}
>
{({ isActive }) => (
<>
{iconActive && iconInactive ? (
<img src={isActive ? iconActive : iconInactive} alt={label} className="h-[18px] w-[18px]" />
) : (
<span className={`inline-block h-[18px] w-[18px] rounded ${isActive ? 'bg-[#92722A]' : 'bg-[#C9CDD1]'}`} />
)}
<span>{label}</span>
</>
)}
</NavLink>
);
const AdminHeader = () => {
const [open, setOpen] = React.useState(false);
const [profileOpen, setProfileOpen] = React.useState(false);
const [userName, setUserName] = React.useState('User');
const [userEmail, setUserEmail] = React.useState('user@example.com');
const navigate = useNavigate();
React.useEffect(() => {
try {
const stored = localStorage.getItem('user_profile');
if (stored) {
const parsed = JSON.parse(stored);
if (parsed?.name || parsed?.username) {
setUserName(parsed.name || parsed.username);
}
if (parsed?.email) {
setUserEmail(parsed.email);
}
}
} catch {
// ignore corrupt storage
}
}, []);
const handleLogout = () => {
try {
localStorage.removeItem('auth_token');
localStorage.removeItem('user_profile');
} catch {
// ignore storage errors
}
setProfileOpen(false);
navigate('/login');
};
return (
<header className="bg-white border-b border-[#E5E7EB] shadow-[0_6px_18px_rgba(15,23,42,0.04)]">
<div className="max-w-[1280px] mx-auto px-4">
<div className="flex items-center h-20 gap-6 ">
<img src={Logo} alt="FCSC" className="w-[140px] h-[44px] " />
<nav className="flex-1 flex justify-end items-center gap-6 xl:gap-8 text-[14px] leading-5 ml-auto ">
<NavItem to="/admin/dashboard" end label="Dashboard" iconActive={DashboardIconActive} iconInactive={DashboardIconInactive} />
<NavItem to="/admin/validations" label="Manage Submissions" iconActive={CheckCircleActive} iconInactive={ManageSubmissionInactive} />
<NavItem to="/admin/configuration" label="Configuration" iconActive={ConfigActive} iconInactive={ConfigInactive} />
<NavItem to="/admin/users" label="Users" iconActive={UserActive} iconInactive={UserInactive} />
</nav>
<div className="hidden lg:flex items-center gap-3 ml-auto">
<button
type="button"
aria-label="Notifications"
className="inline-flex h-9 w-9 items-center justify-center rounded-full border border-transparent hover:border-[#E5E7EB]"
>
<img src={BellIconAsset} alt="Notifications" className="h-[18px] w-[18px]" />
</button>
<div className="relative">
<button
type="button"
onClick={() => setProfileOpen((value) => !value)}
className="h-9 w-9 rounded-full bg-[#F2F2F2] grid place-items-center text-[13px] font-medium text-[#232528]"
aria-haspopup="menu"
aria-expanded={profileOpen}
>
{userName?.slice(0, 1)?.toUpperCase() || 'U'}
</button>
{profileOpen && (
<div className="absolute right-0 mt-3 w-64 rounded-[12px] border border-[#E5E7EB] bg-white shadow-[0_20px_30px_rgba(15,23,42,0.12)] z-50 text-center">
<div className="px-4 py-3 border-b border-[#F1F5F9]">
<p className="text-sm font-semibold text-[#232528] truncate" title={userName}>{userName}</p>
<p className="text-xs text-[#6B7280] truncate" title={userEmail}>{userEmail}</p>
</div>
<button
type="button"
className="w-full px-4 py-2.5 text-center text-sm text-[#232528] hover:bg-[#F2ECCF]"
onClick={() => {
setProfileOpen(false);
navigate('/change-password');
}}
>
Change Password
</button>
<button
type="button"
className="w-full px-4 py-2.5 text-center text-sm text-[#B52520] hover:bg-[#FEE2E2]"
onClick={handleLogout}
>
Logout
</button>
</div>
)}
</div>
</div>
<div className="ml-auto lg:hidden">
<button
type="button"
aria-label="Open Menu"
className="inline-flex items-center justify-center h-10 w-10 rounded-full border border-[#E5E7EB]"
onClick={() => setOpen((v) => !v)}
>
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 6h16M4 12h16M4 18h16" />
</svg>
</button>
</div>
</div>
{open && (
<div className="lg:hidden pb-6 border-t border-[#E5E7EB]">
<nav className="flex flex-col gap-3 pt-4 text-[14px] leading-5">
<NavItem to="/admin/dashboard" end label="Dashboard" iconActive={DashboardIconActive} iconInactive={DashboardIconInactive} />
<NavItem to="/admin/validations" label="Manage Submissions" iconActive={CheckCircleActive} iconInactive={ManageSubmissionInactive} />
<NavItem to="/admin/configuration" label="Configuration" iconActive={ConfigActive} iconInactive={ConfigInactive} />
<NavItem to="/admin/users" label="Users" iconActive={UserActive} iconInactive={UserInactive} />
</nav>
</div>
)}
</div>
</header>
);
};
export default AdminHeader;

View File

@ -0,0 +1,18 @@
import React from 'react';
const StatCard = ({ icon = null, label, value, width = 200.4 }) => {
const resolvedWidth = typeof width === 'number' ? `${width}px` : width;
return (
<div
className="flex h-14 items-center rounded-[8px] border border-[#E3E5E8] bg-white px-4 shadow-[0_8px_20px_rgba(42,47,66,0.06)]"
style={{ width: resolvedWidth, columnGap: '4px' }}
>
<span className="inline-flex h-6 w-6 items-center justify-start shrink-0">{icon}</span>
<span className="truncate text-[16px] leading-[24px] font-medium text-[#5F646D] ml-2">{label}</span>
<span className="text-[16px] leading-[24px] font-semibold text-[#232528] ml-2">{value}</span>
</div>
);
};
export default StatCard;

View File

@ -0,0 +1,189 @@
import React from 'react';
import Table from '../common/Table';
import SearchIcon from '../../assets/images/material-symbols_search-rounded.svg';
const submissions = [
{
establishment: 'CASCADE MARINE FOODS LLC',
emirate: 'Sharjah',
productCount: '5',
year: '2025',
quarter: 'Q4',
lastSubmission: '10/12/2024',
deadline: '20/12/2024',
},
{
establishment: 'Khazan meat factory',
emirate: 'Sharjah',
productCount: '8',
year: '2025',
quarter: 'Q3',
lastSubmission: '15/11/2024',
deadline: '15/12/2024',
},
{
establishment: 'SPINNEYS FRESH FOOD INDUSTRIES L.L.C',
emirate: 'Dubai',
productCount: '6',
year: '2025',
quarter: 'Q2',
lastSubmission: '12/12/2024',
deadline: '10/12/2024',
},
{
establishment: 'FRESHLY FROZEN FOODS FACTORY L.L.C',
emirate: 'Dubai',
productCount: '8',
year: '2025',
quarter: 'Q1',
lastSubmission: '08/12/2024',
deadline: '18/12/2024',
},
{
establishment: 'SAHAR FOOD INDUSTRY (L.L.C)',
emirate: 'Dubai',
productCount: '8',
year: '2025',
quarter: 'Q4',
lastSubmission: '08/12/2024',
deadline: '18/12/2024',
},
{
establishment: 'CONTINENTAL FOOD PROCESSING LLC',
emirate: 'Ajman',
productCount: '8',
year: '2025',
quarter: 'Q3',
lastSubmission: '08/12/2024',
deadline: '18/12/2024',
},
{
establishment: 'AL KHAZNA POULTRY FARM',
emirate: 'Abu Dhabi',
productCount: '8',
year: '2025',
quarter: 'Q2',
lastSubmission: '08/12/2024',
deadline: '18/12/2024',
},
{
establishment: 'DIAMOND MEAT PROCESSING L.L.C',
emirate: 'Abu Dhabi',
productCount: '8',
year: '2025',
quarter: 'Q2',
lastSubmission: '08/12/2024',
deadline: '18/12/2024',
},
{
establishment: 'ALLIANCE FOODS CO L.L.C',
emirate: 'Abu Dhabi',
productCount: '8',
year: '2025',
quarter: 'Q2',
lastSubmission: '08/12/2024',
deadline: '18/12/2024',
},
{
establishment: 'KRUSTASIA FOODS L.L.C',
emirate: 'Dubai',
productCount: '4',
year: '2025',
quarter: 'Q1',
lastSubmission: '14/12/2024',
deadline: '21/12/2024',
},
];
const SubmissionTable = () => {
const [search, setSearch] = React.useState('');
const filtered = React.useMemo(() => {
if (!search.trim()) return submissions;
const normalized = search.trim().toLowerCase();
return submissions.filter((item) =>
[
item.establishment,
item.emirate,
item.productCount,
item.year,
item.quarter,
item.lastSubmission,
item.deadline,
]
.join(' ')
.toLowerCase()
.includes(normalized)
);
}, [search]);
const headers = ['Establishment', 'Emirates', 'Product Count', 'Year', 'Quarter', 'Last Submission', 'Deadline'];
const tableRows = filtered.map((item) => [
item.establishment,
item.emirate,
item.productCount,
item.year,
item.quarter,
item.lastSubmission,
item.deadline,
]);
const columnWidths = React.useMemo(
() => [
317,
161,
140,
119,
98,
158,
150,
],
[]
);
const toolbar = (
<div className="px-6 pt-6 pb-4">
<div className="mx-auto flex h-10 w-full max-w-[1280px] items-center justify-between gap-4">
<h2 className="text-[18px] leading-[28px] font-medium text-[#232528]">
Recent Submissions <span className="text-[#7A7F87]">({submissions.length})</span>
</h2>
<div className="relative w-[280px]">
<img src={SearchIcon} alt="Search" className="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4" />
<input
type="text"
value={search}
onChange={(event) => setSearch(event.target.value)}
placeholder="Search Establishment"
className="h-10 w-full rounded-md border border-[#C3C6CB] pl-9 pr-3 text-sm focus:outline-none focus:ring-1 focus:ring-[#92722A]"
/>
</div>
</div>
</div>
);
return (
<div className="border border-[#E5E7EB] bg-white shadow-[0_16px_32px_rgba(15,23,42,0.06)]" style={{ width: '1250px', height: '706px', borderRadius: '8px' }}>
<div className="space-y-[1px]">
{toolbar}
<Table
headers={headers}
rows={tableRows}
separated
rowGapClass="border-spacing-y-1"
columnWidths={columnWidths}
disableHorizontalScroll
/>
</div>
<div className="flex justify-end px-6 pb-6">
<button
type="button"
className="inline-flex h-[44px] w-[168px] items-center justify-center gap-2 rounded-md bg-[#9E792B] text-sm font-medium text-white shadow-[0_8px_18px_rgba(146,114,42,0.35)] hover:bg-[#846522]"
>
View All Submissions
</button>
</div>
</div>
);
};
export default SubmissionTable;

View File

@ -0,0 +1,16 @@
import React from 'react';
const Button = ({ children, className, onClick, type = 'button', disabled = false }) => {
return (
<button
type={type}
className={`${className} ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}
onClick={onClick}
disabled={disabled}
>
{children}
</button>
);
};
export default Button;

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,11 @@
import React from 'react';
const Card = ({ children, className = '' }) => {
return (
<div className={`bg-white shadow rounded-lg ${className}`}>
{children}
</div>
);
};
export default Card;

View File

@ -0,0 +1,325 @@
import React from 'react';
import CaretDownActive from '../../assets/images/CaretDown - active.svg';
import CalendarIcon from '../../assets/images/uil_calender.svg';
const baseInputStyles = {
default: {
height: '40px',
border: '2px solid #CBA344',
borderRadius: '4px',
paddingLeft: '16px',
paddingRight: '16px',
transition: 'border-color 0.2s ease, color 0.2s ease',
backgroundColor: '#FFFFFF',
},
toolbar: {
height: '40px',
border: '1px solid #C3C6CB',
borderRadius: '8px',
paddingLeft: '16px',
paddingRight: '16px',
transition: 'border-color 0.2s ease, box-shadow 0.2s ease',
backgroundColor: '#FFFFFF',
color: '#5F646D',
},
};
const focusBorderColors = {
default: '#92722A',
toolbar: '#92722A',
};
const idleBorderColors = {
default: '#CBA344',
toolbar: '#C3C6CB',
};
export const TextField = ({
label,
placeholder,
value,
onChange,
type = 'text',
width = 'auto', // 'auto' | number | string
className = '',
style = {},
name,
id,
leftIcon,
onFocus,
onBlur,
variant = 'default',
}) => {
const wrapperStyle = {};
if (width !== 'auto') {
wrapperStyle.width = typeof width === 'number' ? `${width}px` : width;
}
const [focused, setFocused] = React.useState(false);
const handleFocus = (event) => {
setFocused(true);
onFocus?.(event);
};
const handleBlur = (event) => {
setFocused(false);
onBlur?.(event);
};
const baseStyle = baseInputStyles[variant] || baseInputStyles.default;
const inputStyle = { ...baseStyle, ...style };
if (leftIcon) {
inputStyle.paddingLeft = '40px';
}
inputStyle.borderColor = focused ? focusBorderColors[variant] : idleBorderColors[variant] || idleBorderColors.default;
if (variant !== 'toolbar') {
inputStyle.color = '#232528';
}
return (
<div style={wrapperStyle} className="w-full">
{label && (
<label htmlFor={id || name} className="block text-[14px] leading-[20px] font-medium text-[#232528] mb-1">
{label}
</label>
)}
<div className="relative">
<input
id={id || name}
name={name}
type={type}
value={value}
onChange={onChange}
placeholder={placeholder}
className={`w-full text-sm focus:outline-none ${className}`}
style={inputStyle}
onFocus={handleFocus}
onBlur={handleBlur}
/>
{leftIcon && (
<img src={leftIcon} alt="" className="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4" />
)}
</div>
</div>
);
};
export const SelectField = ({
label,
value,
onChange,
options = [],
width = 'auto',
className = '',
style = {},
name,
id,
rightIcon = CaretDownActive,
placeholder,
onFocus,
onBlur,
variant = 'default',
allowClear = false,
onClear,
clearValue = '',
}) => {
const wrapperStyle = {};
if (width !== 'auto') {
wrapperStyle.width = typeof width === 'number' ? `${width}px` : width;
}
const baseStyle = baseInputStyles[variant] || baseInputStyles.default;
const inputStyle = { ...baseStyle, ...style };
const [focused, setFocused] = React.useState(false);
const normalizedClear = clearValue ?? '';
const hasValue = value !== undefined && value !== null && value !== '' && value !== normalizedClear;
const showClear = allowClear && hasValue;
if (rightIcon) {
inputStyle.paddingRight = '40px';
}
const handleFocus = (event) => {
setFocused(true);
onFocus?.(event);
};
const handleBlur = (event) => {
setFocused(false);
onBlur?.(event);
};
inputStyle.borderColor = focused ? focusBorderColors[variant] : idleBorderColors[variant] || idleBorderColors.default;
if (variant === 'toolbar') {
inputStyle.color = hasValue && value !== 'All' && value !== 'Status' && value !== 'Year' && value !== 'Quarter' && value !== 'Emirates' ? '#232528' : '#5F646D';
} else {
inputStyle.color = hasValue ? '#232528' : '#232528';
}
const handleClear = (event) => {
event.preventDefault();
event.stopPropagation();
if (onClear) {
onClear();
} else if (onChange) {
onChange({ target: { value: normalizedClear } });
}
};
return (
<div style={wrapperStyle} className="w-full">
{label && (
<label htmlFor={id || name} className="block text-[14px] leading-[20px] font-medium text-[#232528] mb-1">
{label}
</label>
)}
<div className="relative" style={{ width: '100%' }}>
<select
id={id || name}
name={name}
value={value}
onChange={onChange}
className={`w-full appearance-none text-sm focus:outline-none ${className}`}
style={inputStyle}
onFocus={handleFocus}
onBlur={handleBlur}
>
{placeholder && (
<option value="" disabled hidden>
{placeholder}
</option>
)}
{options.map((opt) => (
<option key={opt.value} value={opt.value}>
{opt.label}
</option>
))}
</select>
{showClear ? (
<button
type="button"
className="absolute right-3 top-1/2 -translate-y-1/2 h-5 w-5 rounded-full text-[#9CA3AF] hover:text-[#4B5563]"
onClick={handleClear}
aria-label="Clear selection"
>
×
</button>
) : (
rightIcon && <img src={rightIcon} alt="" className="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4" />
)}
</div>
</div>
);
};
export const DateField = ({
label,
value,
onChange,
placeholder,
width = 'auto',
className = '',
style = {},
name,
id,
rightIcon = CalendarIcon,
onBlur,
onFocus,
...rest
}) => {
const inputRef = React.useRef(null);
const [isDateMode, setIsDateMode] = React.useState(Boolean(value));
const [focused, setFocused] = React.useState(false);
React.useEffect(() => {
if (typeof document === 'undefined') return;
if (document.getElementById('date-field-style')) return;
const styleElement = document.createElement('style');
styleElement.id = 'date-field-style';
styleElement.innerHTML = `
input.date-field::-webkit-calendar-picker-indicator {
opacity: 0;
position: absolute;
right: 0;
width: 40px;
height: 100%;
cursor: pointer;
}
input.date-field::-webkit-clear-button { display: none; }
input.date-field::-webkit-inner-spin-button { display: none; }
input.date-field { -webkit-appearance: none; }
input.date-field::placeholder { color: #9CA3AF; }
`;
document.head.appendChild(styleElement);
}, []);
const wrapperStyle = {};
if (width !== 'auto') {
wrapperStyle.width = typeof width === 'number' ? `${width}px` : width;
}
const inputStyle = {
...baseInputStyle,
...style,
color: value ? '#232528' : '#232528',
borderColor: focused ? '#92722A' : '#CBA344',
};
if (rightIcon) {
inputStyle.paddingRight = '40px';
}
React.useEffect(() => {
setIsDateMode(Boolean(value));
}, [value]);
const triggerPicker = () => {
setIsDateMode(true);
requestAnimationFrame(() => {
if (inputRef.current) {
inputRef.current.showPicker?.();
inputRef.current.focus?.();
}
});
};
const handleFocus = (event) => {
onFocus?.(event);
setFocused(true);
if (!isDateMode) {
triggerPicker();
}
};
const handleBlur = (event) => {
onBlur?.(event);
setFocused(false);
if (!value) {
setIsDateMode(false);
}
};
return (
<div style={wrapperStyle} className="w-full">
{label && (
<label htmlFor={id || name} className="block text-[14px] leading-[20px] font-medium text-[#232528] mb-1">
{label}
</label>
)}
<div className="relative">
<input
ref={inputRef}
id={id || name}
name={name}
type={isDateMode ? 'date' : 'text'}
value={value}
onChange={onChange}
placeholder={placeholder}
className={`date-field w-full text-sm focus:outline-none ${className}`}
style={inputStyle}
onFocus={handleFocus}
onBlur={handleBlur}
{...rest}
/>
{rightIcon && (
<button
type="button"
className="absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4 grid place-items-center text-transparent"
onClick={triggerPicker}
tabIndex={-1}
aria-hidden="true"
>
<img src={rightIcon} alt="" className="pointer-events-none h-4 w-4" />
</button>
)}
</div>
</div>
);
};

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,27 @@
import React from 'react';
const toneClasses = {
green: 'bg-[#F3FAF4] text-[#2F663C] ring-1 ring-[#C4E5CC]',
gray: 'bg-[#E9EDF3] text-[#232528] ring-1 ring-[#D6DBE4]',
};
const normalizeTone = (tone, status) => {
if (tone) return tone;
const normalizedStatus = String(status || '').toLowerCase();
if (normalizedStatus === 'active' || normalizedStatus === 'open') return 'green';
return 'gray';
};
const StatusBadge = ({ tone, status, children, className = '' }) => {
const resolvedTone = normalizeTone(tone, status);
const classes = toneClasses[resolvedTone] || toneClasses.green;
const label = children ?? status ?? '';
return (
<span className={`inline-flex items-center rounded-md px-2 py-0.5 text-xs font-medium ${classes} ${className}`}>
{label}
</span>
);
};
export default StatusBadge;

View File

@ -0,0 +1,293 @@
import React from 'react';
import CaretLeftIcon from '../../assets/images/CaretLeft.svg';
import CaretRightIcon from '../../assets/images/CaretRight.svg';
import CaretDoubleLeftIcon from '../../assets/images/CaretDoubleLeft.svg';
import CaretDoubleRightIcon from '../../assets/images/CaretDoubleRight.svg';
// Generic, reusable table
// Props:
// - headers: string[]
// - rows: any[][] (array of arrays matching header order)
// - beforeHeader: ReactNode (optional toolbar row above table header)
// - className: string (optional)
// - headerClassName: string (optional)
// - separated: boolean (optional) -> adds vertical gaps between rows
// - rowGapClass: string (optional) -> tailwind border-spacing classes, default: 'border-spacing-y-2'
// - getRowClass: (rowIndex) => string (optional)
// - getCellClass: (rowIndex, colIndex) => string (optional)
// - renderCell: (value, rowIndex, colIndex) => ReactNode (optional)
// - pagination: {
// currentPage?: number,
// onPageChange?: (page: number) => void,
// pageSize?: number,
// totalItems?: number,
// pageSizeOptions?: number[], // reserved for future use
// }
const Table = ({
headers = [],
rows = [],
beforeHeader = null,
className = '',
headerClassName = '',
separated = false,
rowGapClass = 'border-spacing-y-2',
getRowClass,
getCellClass,
renderCell,
pagination,
columnWidths = [],
disableHorizontalScroll = false,
}) => {
const enablePagination = Boolean(pagination);
const pageSize = enablePagination ? Math.max(1, pagination?.pageSize || 10) : rows.length || 1;
const totalItems = enablePagination ? pagination?.totalItems ?? rows.length : rows.length;
const totalPages = enablePagination ? Math.max(1, Math.ceil(totalItems / pageSize)) : 1;
const isControlled = enablePagination && typeof pagination?.currentPage === 'number' && typeof pagination?.onPageChange === 'function';
const [internalPage, setInternalPage] = React.useState(1);
React.useEffect(() => {
if (!enablePagination || isControlled) return;
const maxPage = Math.max(1, Math.ceil(rows.length / pageSize));
setInternalPage((prev) => {
if (prev > maxPage) return maxPage;
if (prev < 1) return 1;
return prev;
});
}, [enablePagination, isControlled, rows.length, pageSize]);
const currentPage = enablePagination
? isControlled
? pagination.currentPage || 1
: internalPage
: 1;
const safeCurrentPage = enablePagination ? Math.min(Math.max(currentPage, 1), totalPages) : 1;
const startIndex = enablePagination ? (safeCurrentPage - 1) * pageSize : 0;
const endIndex = enablePagination ? startIndex + pageSize : rows.length;
const rangeStart = totalItems === 0 ? 0 : startIndex + 1;
const rangeEnd = enablePagination ? Math.min(endIndex, totalItems) : rows.length;
const displayedRows = React.useMemo(() => {
if (!enablePagination) return rows;
return rows.slice(startIndex, endIndex);
}, [enablePagination, rows, startIndex, endIndex]);
const goToPage = React.useCallback(
(pageNumber) => {
if (!enablePagination) return;
const next = Math.min(Math.max(pageNumber, 1), totalPages);
if (isControlled) {
pagination.onPageChange?.(next);
} else {
setInternalPage(next);
}
},
[enablePagination, isControlled, pagination, totalPages]
);
const hasPrevious = enablePagination ? safeCurrentPage > 1 : false;
const hasNext = enablePagination ? safeCurrentPage < totalPages : false;
const pageItems = React.useMemo(() => {
if (!enablePagination) return [];
if (totalPages <= 7) {
return Array.from({ length: totalPages }, (_, index) => index + 1);
}
const items = [1];
const left = safeCurrentPage - 1;
const right = safeCurrentPage + 1;
if (left > 2) {
items.push('ellipsis-left');
}
const start = Math.max(2, left);
const end = Math.min(totalPages - 1, right);
for (let page = start; page <= end; page += 1) {
items.push(page);
}
if (right < totalPages - 1) {
items.push('ellipsis-right');
}
items.push(totalPages);
return items;
}, [enablePagination, safeCurrentPage, totalPages]);
const arrowButtonClass =
'h-8 w-8 flex items-center justify-center text-[#92722A] disabled:text-[#C3C6CB] disabled:cursor-not-allowed transition-colors hover:text-[#B68A35]';
const navButtonClass =
'h-9 px-2 text-sm text-[#232528] disabled:text-[#C3C6CB] disabled:cursor-not-allowed transition-colors flex items-center gap-2 hover:text-[#92722A]';
return (
<div className={`overflow-hidden rounded-lg bg-white ${className}`}>
{beforeHeader}
<div
className={`${disableHorizontalScroll ? 'overflow-x-hidden' : 'overflow-x-auto'} px-6 pt-2 pb-6`}
style={disableHorizontalScroll ? undefined : { scrollbarWidth: 'thin' }}
>
<table
className={`min-w-[720px] w-full table-fixed rounded-2xl px-4 py-4${
separated ? `border-separate ${rowGapClass}` : 'divide-y'
} border border-[#C3C6CB] rounded-2xl divide-[#C3C6CB]`}
>
<thead className={headerClassName || 'bg-[#F2ECCF] rounded-2xl'}>
<tr>
{headers.map((h, i) => {
const widthValue = columnWidths[i];
const widthStyle = widthValue
? {
width: typeof widthValue === 'number' ? `${widthValue}px` : widthValue,
minWidth: typeof widthValue === 'number' ? `${widthValue}px` : widthValue,
}
: undefined;
return (
<th
key={i}
className={`px-6 h-12 text-left text-xs font-medium text-[#1B1D21] align-middle ${
i === 0 ? 'first:rounded-tl-md' : ''
} ${i === headers.length - 1 ? 'last:rounded-tr-md' : ''}`}
style={widthStyle}
>
{h}
</th>
);
})}
</tr>
</thead>
<tbody className={`bg-white ${separated ? '' : 'divide-y divide-[#C3C6CB]'}`}>
{displayedRows.map((row, ri) => (
<tr
key={ri}
className={`${separated ? 'bg-white' : ''} ${getRowClass ? getRowClass(ri) : ''}`}
>
{row.map((cell, ci) => {
const widthValue = columnWidths[ci];
const widthStyle = widthValue
? {
width: typeof widthValue === 'number' ? `${widthValue}px` : widthValue,
minWidth: typeof widthValue === 'number' ? `${widthValue}px` : widthValue,
}
: undefined;
return (
<td
key={ci}
className={`px-6 h-12 text-sm text-[#232528] border-b border-[#C3C6CB] align-middle ${getCellClass ? getCellClass(ri, ci) : ''}`}
style={widthStyle}
>
{renderCell ? renderCell(cell, ri, ci) : cell}
</td>
);
})}
</tr>
))}
</tbody>
</table>
</div>
{enablePagination && (
<div className="px-6 pb-6">
<div className="flex flex-col gap-1 md:flex-row md:items-center md:justify-start">
<div className="flex items-centergap-3 text-sm text-[#4B5563]">
<button
type="button"
className={arrowButtonClass}
onClick={() => goToPage(safeCurrentPage - 1)}
disabled={!hasPrevious}
aria-label="Previous page"
>
<img src={CaretLeftIcon} alt="Previous" className="h-4 w-4" />
</button>
<div className="flex items-center gap-2 text-[#232528]">
<span className="font-medium">{rangeStart}</span>
<span className="text-[#6B7280]"></span>
<span className="font-medium">{rangeEnd}</span>
<span className="text-[#6B7280]">of</span>
<span className="font-medium">{totalItems}</span>
</div>
<button
type="button"
className={arrowButtonClass}
onClick={() => goToPage(safeCurrentPage + 1)}
disabled={!hasNext}
aria-label="Next page"
>
<img src={CaretRightIcon} alt="Next" className="h-4 w-4" />
</button>
</div>
<div className="flex pl-50 items-start justify-start gap-3 text-sm text-[#4B5563]">
<button
type="button"
className={navButtonClass}
onClick={() => goToPage(1)}
disabled={!hasPrevious}
>
<img src={CaretDoubleLeftIcon} alt="First" className="h-4 w-4" />
<span>First</span>
</button>
<button
type="button"
className={navButtonClass}
onClick={() => goToPage(safeCurrentPage - 1)}
disabled={!hasPrevious}
>
<img src={CaretLeftIcon} alt="Previous" className="h-4 w-4" />
<span>Previous</span>
</button>
{pageItems.map((item, index) => {
if (typeof item === 'string') {
return (
<span key={item + index} className="px-2 text-[#9CA3AF]">
</span>
);
}
const isActive = item === safeCurrentPage;
return (
<button
key={item}
type="button"
className={`h-9 min-w-[36px] rounded-full px-3 text-sm font-medium transition-colors ${
isActive
? 'bg-[#92722A] text-white'
: 'text-[#232528] hover:text-[#92722A]'
}`}
onClick={() => goToPage(item)}
>
{item}
</button>
);
})}
<button
type="button"
className={navButtonClass}
onClick={() => goToPage(safeCurrentPage + 1)}
disabled={!hasNext}
>
<span>Next</span>
<img src={CaretRightIcon} alt="Next" className="h-4 w-4" />
</button>
<button
type="button"
className={navButtonClass}
onClick={() => goToPage(totalPages)}
disabled={!hasNext}
>
<span>Last</span>
<img src={CaretDoubleRightIcon} alt="Last" className="h-4 w-4" />
</button>
</div>
</div>
</div>
)}
</div>
);
};
export default Table;

View File

@ -0,0 +1,191 @@
import React from 'react';
import { useNavigate } from 'react-router-dom';
import Table from '../common/Table';
import SearchIcon from '../../assets/images/material-symbols_search-rounded.svg';
import CaretDown from '../../assets/images/CaretDown.svg';
const getStatusClass = (status) => {
const normalized = String(status || '').toLowerCase();
if (normalized === 'approved') {
return 'inline-flex items-center rounded-md bg-green-100 px-2 py-1 text-xs font-medium text-green-800';
}
if (normalized === 'pending' || normalized === 'under review' || normalized === 'in-progress') {
return 'inline-flex items-center rounded-md bg-yellow-100 px-2 py-1 text-xs font-medium text-yellow-800';
}
if (normalized === 'rejected' || normalized === 'returned') {
return 'inline-flex items-center rounded-md bg-red-100 px-2 py-1 text-xs font-medium text-red-800';
}
return 'inline-flex items-center rounded-md bg-gray-100 px-2 py-1 text-xs font-medium text-gray-800';
};
const formatQuarter = (quarter, year) => {
if (!quarter && !year) return '—';
return [quarter || '', year || ''].filter(Boolean).join(' ');
};
const formatDate = (value) => {
if (!value) return '—';
const date = new Date(value);
if (Number.isNaN(date.getTime())) return '—';
return date.toLocaleDateString('en-GB');
};
const statusOptions = [
{ label: 'All Status', value: 'all' },
{ label: 'Approved', value: 'approved' },
{ label: 'Under Review', value: 'under review' },
{ label: 'Pending', value: 'pending' },
{ label: 'Returned', value: 'returned' },
{ label: 'Rejected', value: 'rejected' },
];
const normalizeStatus = (status) => String(status || '').toLowerCase();
const downloadCsv = (rows) => {
if (!rows.length) return;
const headers = ['Quarter', 'Status', 'Submission Date', 'Products'];
const csvRows = [headers.join(',')];
rows.forEach((row) => {
csvRows.push(row.slice(0, 4).map((cell) => `"${String(cell).replace(/"/g, '""')}"`).join(','));
});
const blob = new Blob([csvRows.join('\n')], { type: 'text/csv;charset=utf-8;' });
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', 'submission-history.csv');
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
};
export const SubmissionHistory = ({ history = [], loading = false, error = '' }) => {
const [searchTerm, setSearchTerm] = React.useState('');
const [statusFilter, setStatusFilter] = React.useState('all');
const navigate = useNavigate();
const normalizedHistory = React.useMemo(() => {
if (!Array.isArray(history)) return [];
return history.map((entry, index) => ({
id: entry?.id ?? index,
quarter: formatQuarter(entry?.quarter, entry?.year),
status: entry?.status || 'Pending',
date: formatDate(entry?.created_at || entry?.submitted_on),
products: entry?.product_count,
}));
}, [history]);
const filteredRows = normalizedHistory.filter((entry) => {
const term = searchTerm.trim().toLowerCase();
const matchesSearch =
!term ||
entry.quarter.toLowerCase().includes(term) ||
entry.status.toLowerCase().includes(term) ||
entry.date.toLowerCase().includes(term);
const matchesStatus =
statusFilter === 'all' || normalizeStatus(entry.status) === statusFilter;
return matchesSearch && matchesStatus;
});
const rowsData = filteredRows.map((s) => {
const count = Number.isFinite(Number(s.products)) ? Number(s.products) : null;
const display = count === null ? '—' : `${count} ${count === 1 ? 'product' : 'products'}`;
return [s.quarter, s.status, s.date, display, 'View'];
});
const handleViewSubmission = React.useCallback(() => {
navigate('/history');
}, [navigate]);
const toolbar = (
<div className="px-4 pt-6 pb-2 flex flex-col gap-3 md:flex-row md:items-center md:justify-between">
<div className="flex flex-col gap-1">
<h3 className="text-[18px] leading-[28px] font-medium text-[#232528]">Submission History</h3>
<div className="flex gap-3 text-sm text-gray-500">
{loading && <span>Loading</span>}
{error && <span className="text-red-600">{error}</span>}
</div>
</div>
<div className="flex flex-col md:flex-row gap-3 md:items-center">
<div className="relative w-full md:w-56">
<input
type="text"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
placeholder="Search submissions"
className="w-full h-10 rounded-md border border-[#E5E7EB] pl-10 pr-3 text-sm focus:outline-none"
/>
<img
src={SearchIcon}
alt="Search"
className="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 h-5 w-5"
/>
</div>
<div className="relative w-full md:w-40">
<select
value={statusFilter}
onChange={(e) => setStatusFilter(e.target.value)}
className="h-10 w-full appearance-none rounded-md border border-[#E5E7EB] bg-white pl-3 pr-9 text-sm text-[#232528] focus:outline-none cursor-pointer"
>
{statusOptions.map((option) => (
<option key={option.value} value={option.value}>
{option.label}
</option>
))}
</select>
<img
src={CaretDown}
alt="Open"
className="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4"
/>
</div>
<button
type="button"
onClick={() => downloadCsv(rowsData)}
disabled={!rowsData.length}
className={`inline-flex h-10 items-center gap-2 rounded-md border px-4 text-sm font-medium ${rowsData.length ? 'border-[#92722A] text-[#92722A] hover:bg-[#F2ECCF]' : 'border-gray-200 text-gray-400 cursor-not-allowed'}`}
>
<svg
xmlns="http://www.w3.org/2000/svg"
className="h-4 w-4"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2M7 10l5 5m0 0l5-5m-5 5V4" />
</svg>
<span>Export CSV</span>
</button>
</div>
</div>
);
return (
<section className="max-w-[1280px] mx-auto px-0">
<Table
headers={['Quarter', 'Status', 'Submission Date', 'Products', 'Actions']}
rows={rowsData}
beforeHeader={toolbar}
separated
rowGapClass="border-spacing-y-2"
renderCell={(value, ri, ci) => {
if (ci === 1) {
return <span className={getStatusClass(String(value))}>{value}</span>;
}
if (ci === 4) {
const disabled = !normalizedHistory[ri];
return (
<button
onClick={handleViewSubmission}
className={`text-amber-700 hover:text-amber-800 ${disabled ? 'cursor-not-allowed opacity-50 hover:text-amber-700' : ''}`}
disabled={disabled}
>
View
</button>
);
}
return value;
}}
/>
</section>
);
};

View File

@ -0,0 +1,121 @@
import React from 'react';
import { useNavigate } from 'react-router-dom';
const formatQuarterYear = (quarter, year) => {
if (!quarter || !year) return '—';
return `${quarter} ${year}`;
};
const formatDate = (value) => {
if (!value) return '—';
const date = new Date(value);
if (Number.isNaN(date.getTime())) return '—';
return date.toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' });
};
const formatRelativeDays = (value) => {
if (!value) return '—';
const deadline = new Date(value);
if (Number.isNaN(deadline.getTime())) return '—';
const now = new Date();
const diffMs = deadline.getTime() - now.getTime();
const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24));
if (!Number.isFinite(diffDays)) return '—';
if (diffDays < 0) return `${Math.abs(diffDays)} days overdue`;
if (diffDays === 0) return 'Due today';
return `${diffDays} day${diffDays === 1 ? '' : 's'}`;
};
export const SurveyStatus = ({ data = null, loading = false, error = '' }) => {
const navigate = useNavigate();
const handleStartSurvey = () => {
navigate('/survey');
};
const submissionStatus = data?.submission_status || '—';
const currentQuarter = formatQuarterYear(data?.current_quarter, data?.current_quarter_year);
const nextDeadlineDate = formatDate(data?.next_deadline);
const nextDeadlineRelative = formatRelativeDays(data?.next_deadline);
const lastSubmissionQuarter = formatQuarterYear(data?.last_submission?.quarter, data?.last_submission?.year);
const lastSubmissionDate = formatDate(data?.last_submission?.submitted_on);
const heroTitle = loading
? 'Loading survey status…'
: error
? 'Unable to load survey status'
: currentQuarter !== '—'
? `${currentQuarter} Survey`
: 'Survey status unavailable';
const heroSubtitle = loading
? 'Fetching the latest reporting information.'
: error
? error
: 'Complete your quarterly industrial production data submission';
return (
<section className="max-w-[1280px] mx-auto px-0">
<div className="bg-white rounded-lg shadow-sm ring-1 ring-gray-200 mb-8 overflow-hidden">
<div className="p-0">
<div className="rounded-none bg-[#F2ECCF] px-6 py-4 min-h-[148px] flex items-center justify-between">
<div className="flex-1">
<h3 className={`text-[18px] leading-[28px] font-medium ${error ? 'text-red-700' : 'text-[#232528]'}`}>{heroTitle}</h3>
<p className="mt-1 text-[16px] leading-[24px] font-medium text-[#232528]">{heroSubtitle}</p>
<div className="mt-2 flex items-center gap-6 text-[12px] leading-[16px] font-medium text-[#232528]">
<span>Due: {nextDeadlineDate}</span>
<span>{nextDeadlineRelative}</span>
</div>
</div>
<button
onClick={handleStartSurvey}
className="inline-flex items-center justify-center w-[196px] h-[52px] px-7 py-3 text-[18px] leading-[28px] font-medium rounded-lg text-white bg-[#92722A] hover:bg-[#7b5c1f] cursor-pointer whitespace-nowrap"
disabled={loading}
>
Start Survey Now
</button>
</div>
</div>
</div>
<div className="mb-8">
<div className="hidden sm:flex gap-5">
<div className="w-[413px] h-[134px] bg-white rounded-[8px] ring-1 ring-gray-200 px-6 py-5">
<p className="text-[16px] leading-[24px] font-medium text-[#232528]">Submission Status</p>
<p className="mt-2 text-[18px] leading-[28px] font-medium text-[#232528]">{loading ? 'Loading…' : submissionStatus}</p>
<p className="mt-2 text-[12px] leading-[16px] font-medium text-[#5F646D]">{currentQuarter !== '—' ? `${currentQuarter} submission required` : 'Awaiting reporting period data.'}</p>
</div>
<div className="w-[413px] h-[134px] bg-white rounded-[8px] ring-1 ring-gray-200 px-6 py-5">
<p className="text-[16px] leading-[24px] font-medium text-[#232528]">Next Deadline</p>
<p className="mt-2 text-[18px] leading-[28px] font-medium text-[#232528]">{loading ? 'Loading…' : nextDeadlineRelative}</p>
<p className="mt-2 text-[12px] leading-[16px] font-medium text-[#5F646D]">{`Due on ${nextDeadlineDate}`}</p>
</div>
<div className="w-[413px] h-[134px] bg-white rounded-[8px] ring-1 ring-gray-200 px-6 py-5">
<p className="text-[16px] leading-[24px] font-medium text-[#232528]">Last Submission</p>
<p className="mt-2 text-[18px] leading-[28px] font-medium text-[#232528]">{loading ? 'Loading…' : lastSubmissionQuarter}</p>
<p className="mt-2 text-[12px] leading-[16px] font-medium text-[#5F646D]">{`Submitted ${lastSubmissionDate}`}</p>
</div>
</div>
<div className="sm:hidden space-y-4">
<div className="bg-white rounded-[8px] ring-1 ring-gray-200 px-6 py-5">
<p className="text-[16px] leading-[24px] font-medium text-[#232528]">Submission Status</p>
<p className="mt-2 text-[18px] leading-[28px] font-medium text-[#232528]">{loading ? 'Loading…' : submissionStatus}</p>
<p className="mt-2 text-[12px] leading-[16px] font-medium text-[#5F646D]">{currentQuarter !== '—' ? `${currentQuarter} submission required` : 'Awaiting reporting period data.'}</p>
</div>
<div className="bg-white rounded-[8px] ring-1 ring-gray-200 px-6 py-5">
<p className="text-[16px] leading-[24px] font-medium text-[#232528]">Next Deadline</p>
<p className="mt-2 text-[18px] leading-[28px] font-medium text-[#232528]">{loading ? 'Loading…' : nextDeadlineRelative}</p>
<p className="mt-2 text-[12px] leading-[16px] font-medium text-[#5F646D]">{`Due on ${nextDeadlineDate}`}</p>
</div>
<div className="bg-white rounded-[8px] ring-1 ring-gray-200 px-6 py-5">
<p className="text-[16px] leading-[24px] font-medium text-[#232528]">Last Submission</p>
<p className="mt-2 text-[18px] leading-[28px] font-medium text-[#232528]">{loading ? 'Loading…' : lastSubmissionQuarter}</p>
<p className="mt-2 text-[12px] leading-[16px] font-medium text-[#5F646D]">{`Submitted ${lastSubmissionDate}`}</p>
</div>
</div>
</div>
</section>
);
};

View File

@ -0,0 +1,38 @@
import React from 'react';
import HeaderBar from '../../components/layout/HeaderBar';
const formatDate = (value) => {
if (!value) return '—';
const date = new Date(value);
if (Number.isNaN(date.getTime())) return '—';
return date.toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' });
};
export const WelcomeSection = ({ data = null, loading = false, error = '' }) => {
const currentQuarter = data?.current_quarter;
const currentYear = data?.current_quarter_year;
const deadline = data?.next_deadline;
let description = 'Current reporting information unavailable.';
if (loading) {
description = 'Loading dashboard information…';
} else if (error) {
description = error;
} else if (currentQuarter && currentYear) {
const formattedDeadline = formatDate(deadline);
description = `Current reporting period: ${currentQuarter} ${currentYear}${formattedDeadline !== '—' ? ` (Due: ${formattedDeadline})` : ''}`;
}
return (
<div className="min-h-[4rem] bg-gray-50">
<HeaderBar />
<div className="max-w-[1280px] mx-auto px-4 pt-4 pb-2">
<div className="space-y-1">
<h2 className="w-[360px] text-[18px] leading-[28px] font-medium text-[#232528]">Welcome Back</h2>
<p className={`w-[360px] text-[14px] leading-[24px] font-normal ${error ? 'text-red-600' : 'text-[#5F646D]'}`}>{description}</p>
</div>
</div>
</div>
);
};

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,186 @@
import React from 'react';
import { NavLink, useNavigate } from 'react-router-dom';
import Logo from '../../assets/images/FCSCLogo.svg';
import SurveyIconActive from '../../assets/images/Vector.svg';
import SurveyIconInactive from '../../assets/images/vectorblack.svg';
import DashboardIconActive from '../../assets/images/cuida_dashboard-outline.svg';
import DashboardIconInactive from '../../assets/images/cuida_dashboard-outline-inactive.svg';
import HistoryIconActive from '../../assets/images/mdi_history.svg';
import HistoryIconInactive from '../../assets/images/history.svg';
const HeaderBar = () => {
const [open, setOpen] = React.useState(false);
const [userOpen, setUserOpen] = React.useState(false);
const [userName, setUserName] = React.useState('User');
const [userEmail, setUserEmail] = React.useState('');
const navigate = useNavigate();
React.useEffect(() => {
let parsed;
try {
const stored = localStorage.getItem('user_profile');
if (stored) {
parsed = JSON.parse(stored);
}
} catch (error) {
parsed = undefined;
}
const name = parsed?.name || parsed?.username || parsed?.email || '';
const email = parsed?.email || '';
if (name) {
setUserName(name);
}
if (email) {
setUserEmail(email);
}
}, []);
const onLogout = () => {
try {
localStorage.removeItem('auth_token');
localStorage.removeItem('user_profile');
} catch {}
setUserOpen(false);
navigate('/login');
};
const onChangePassword = () => {
setUserOpen(false);
navigate('/change-password');
};
const initials = React.useMemo(() => {
const source = userName || userEmail;
if (!source) return 'U';
const parts = source.trim().split(' ');
const letters = parts.slice(0, 2).map((part) => part.charAt(0)).join('');
return letters ? letters.toUpperCase() : 'U';
}, [userEmail, userName]);
return (
<header className="bg-white border-b border-b-[#E2E8F0]">
<div className="max-w-[1280px] mx-auto px-4">
<div className="flex items-center justify-between h-16">
<img src={Logo} alt="FCSC" className="w-[131px] h-[40px] opacity-100 rotate-0" />
{/* Desktop nav */}
<nav className="hidden md:flex items-center gap-8 text-[14px] leading-5">
<NavLink
to="/dashboard"
className={({ isActive }) => `inline-flex items-center gap-2 pb-1 border-b-2 ${isActive ? 'text-[#92722A] font-medium border-[#92722A]' : 'text-[#232528] hover:text-gray-900 border-transparent'}`}
aria-current="page"
>
{({ isActive }) => (
<>
<img src={isActive ? DashboardIconActive : DashboardIconInactive} alt="Dashboard" className="h-[18px] w-[18px]" />
<span>Dashboard</span>
</>
)}
</NavLink>
<NavLink
to="/survey"
className={({ isActive }) => `inline-flex items-center gap-2 pb-1 border-b-2 ${isActive ? 'text-[#92722A] font-medium border-[#92722A]' : 'text-[#232528] hover:text-gray-900 border-transparent'}`}
>
{({ isActive }) => (
<>
<img src={isActive ? SurveyIconActive : SurveyIconInactive} alt="Survey" className="h-[18px] w-[18px]" />
<span>Survey</span>
</>
)}
</NavLink>
<NavLink
to="/history"
className={({ isActive }) => `inline-flex items-center gap-2 pb-1 border-b-2 ${isActive ? 'text-[#92722A] font-medium border-[#92722A]' : 'text-[#232528] hover:text-gray-900 border-transparent'}`}
>
{({ isActive }) => (
<>
<img src={isActive ? HistoryIconActive : HistoryIconInactive} alt="History" className="h-[18px] w-[18px]" />
<span>History</span>
</>
)}
</NavLink>
<div className="relative">
<button
type="button"
onClick={() => setUserOpen((v) => !v)}
className="h-8 w-8 rounded-full bg-gray-200 grid place-items-center text-[12px] text-gray-700 cursor-pointer"
aria-label="Profile"
>
{initials}
</button>
{userOpen && (
<div className="absolute right-0 mt-3 w-48 rounded-lg border border-[#E2E8F0] bg-white shadow-lg z-50">
<div className="px-4 py-3 border-b border-[#F1F5F9] text-center space-y-0.5">
<p className="text-sm font-semibold text-[#232528] truncate" title={userName}>{userName}</p>
{userEmail && <p className="text-xs text-[#64748B] truncate" title={userEmail}>{userEmail}</p>}
</div>
<button
type="button"
onClick={onChangePassword}
className="w-full px-4 py-2.5 text-center text-sm text-[#232528] hover:bg-[#F2ECCF] transition-colors"
>
Change Password
</button>
<button
type="button"
onClick={onLogout}
className="w-full px-4 py-2.5 text-center text-sm text-[#B91C1C] hover:bg-[#FEE2E2] transition-colors"
>
Logout
</button>
</div>
)}
</div>
</nav>
{/* Mobile toggle */}
<button
type="button"
aria-label="Open Menu"
className="md:hidden inline-flex items-center justify-center h-9 w-9 rounded hover:bg-gray-100"
onClick={() => setOpen((v) => !v)}
>
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 6h16M4 12h16M4 18h16" />
</svg>
</button>
</div>
{/* Mobile nav panel */}
{open && (
<div className="md:hidden pb-3">
<nav className="flex flex-col gap-2 text-[14px] leading-5">
<NavLink to="/dashboard" onClick={() => setOpen(false)} className={({ isActive }) => `inline-flex items-center gap-2 px-2 py-2 rounded border-b-2 ${isActive ? 'text-[#92722A] bg-[#F2ECCF] border-[#92722A]' : 'text-[#232528] hover:bg-gray-100 border-transparent'}`}>
<img src={DashboardIconInactive} alt="Dashboard" className="h-[18px] w-[18px]" />
<span>Dashboard</span>
</NavLink>
<NavLink to="/survey" onClick={() => setOpen(false)} className={({ isActive }) => `inline-flex items-center gap-2 px-2 py-2 rounded border-b-2 ${isActive ? 'text-[#92722A] bg-[#F2ECCF] border-[#92722A]' : 'text-[#232528] hover:bg-gray-100 border-transparent'}`}>
<img src={SurveyIconInactive} alt="Survey" className="h-[18px] w-[18px]" />
<span>Survey</span>
</NavLink>
<NavLink to="/history" onClick={() => setOpen(false)} className={({ isActive }) => `inline-flex items-center gap-2 px-2 py-2 rounded border-b-2 ${isActive ? 'text-[#92722A] bg-[#F2ECCF] border-[#92722A]' : 'text-[#232528] hover:bg-gray-100 border-transparent'}`}>
<img src={HistoryIconInactive} alt="History" className="h-[18px] w-[18px]" />
<span>History</span>
</NavLink>
<button
type="button"
onClick={() => {
setOpen(false);
navigate('/change-password');
}}
className="inline-flex items-center gap-2 px-2 py-2 rounded text-[#232528] hover:bg-gray-100 text-left"
>
<span>Change Password</span>
</button>
<button
type="button"
onClick={onLogout}
className="inline-flex items-center gap-2 px-2 py-2 rounded text-[#232528] hover:bg-gray-100 text-left"
>
<span>Logout</span>
</button>
</nav>
</div>
)}
</div>
</header>
);
};
export default HeaderBar;

View File

@ -0,0 +1,269 @@
import React from 'react';
import CaretDown from '../../../assets/images/caretdown.svg';
import PrimaryButton from '../../../assets/images/primarybutton.svg';
import BackVendor from '../../../assets/images/backvector.svg';
const Field = ({ label, placeholder = '', type = 'text', value = '', onChange = () => {}, disabled = false }) => (
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">{label}</label>
<input
type={type}
placeholder={placeholder}
value={value}
disabled={disabled}
onChange={onChange}
className={`block w-full h-10 rounded-md border-2 border-[#92722A] focus:border-[#92722A] focus:ring-0 px-4 text-sm bg-white ${disabled ? 'opacity-75 cursor-not-allowed' : ''}`}
/>
</div>
);
const Select = ({ label, options = [], value = '', placeholder = 'Select option', onChange = () => {}, disabled = false }) => (
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">{label}</label>
<div className="relative">
<select
value={value}
onChange={onChange}
disabled={disabled}
className="block w-full h-10 rounded-md border-2 border-[#92722A] focus:border-[#92722A] focus:ring-0 px-4 pr-10 text-sm bg-white appearance-none"
>
<option value="" disabled>{placeholder}</option>
{options.map((opt) => {
if (typeof opt === 'object' && opt !== null) {
return (
<option key={opt.value ?? opt.label} value={opt.value ?? opt.label}>
{opt.label ?? opt.value ?? ''}
</option>
);
}
return (
<option key={opt} value={opt}>{opt}</option>
);
})}
</select>
<img src={CaretDown} alt="open" className="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4" />
</div>
</div>
);
const Card = ({ children }) => (
<div className="bg-white rounded-md shadow-sm ring-1 ring-gray-200">
<div className="p-5">
{children}
</div>
</div>
);
const defaultEmployeeInfo = {
emiratiMale: '',
nonEmiratiMale: '',
emiratiFemale: '',
nonEmiratiFemale: '',
totalEmployees: '',
totalEmirati: '',
};
const EstablishmentInfo = ({
data = {},
onChange = () => {},
onNext = () => {},
onBack = () => {},
loading = false,
error = '',
}) => {
const info = React.useMemo(
() => ({
quarter: '',
year: '',
establishmentName: '',
permanentFactoryCode: '',
industryCode: '',
licenseNumber: '',
isicCode: '',
emirate: '',
employeeInfo: {
...defaultEmployeeInfo,
...(data.employeeInfo || {}),
},
...data,
}),
[data]
);
const handleFieldChange = (field) => (event) => {
onChange({
...info,
[field]: event.target.value,
});
};
const handleEmployeeChange = (field) => (event) => {
onChange({
...info,
employeeInfo: {
...info.employeeInfo,
[field]: event.target.value,
},
});
};
return (
<div className="space-y-2">
{/* Reporting Period */}
<Card>
<h3 className="text-sm font-semibold text-gray-900 mb-4">Reporting Period</h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<Select
label="Quarter"
placeholder="Select quarter"
options={["Q1", "Q2", "Q3", "Q4"]}
value={info.quarter}
onChange={handleFieldChange('quarter')}
disabled={loading}
/>
<Select
label="Year"
placeholder="Select year"
options={["2022", "2023", "2024", "2025"]}
value={info.year}
onChange={handleFieldChange('year')}
disabled={loading}
/>
</div>
</Card>
{/* Establishment Information */}
<Card>
<h3 className="text-sm font-semibold text-gray-900 mb-4">Establishment Information</h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<Field
label="Establishment Name"
placeholder="Al Masaood Industries LLC"
value={info.establishmentName}
onChange={handleFieldChange('establishmentName')}
disabled={loading}
/>
<Field
label="Permanent Factory Code"
placeholder="PFC-2024-001"
value={info.permanentFactoryCode}
onChange={handleFieldChange('permanentFactoryCode')}
disabled={loading}
/>
<Field
label="Industry Code (Business Register)"
placeholder="IND-2834"
value={info.industryCode}
onChange={handleFieldChange('industryCode')}
disabled={loading}
/>
<Field
label="License Number"
placeholder="CN-1234567"
value={info.licenseNumber}
onChange={handleFieldChange('licenseNumber')}
disabled={loading}
/>
<Field
label="ISIC Code"
placeholder="2410"
value={info.isicCode}
onChange={handleFieldChange('isicCode')}
disabled={loading}
/>
<Field
label="Emirate"
placeholder="Abu Dhabi"
value={info.emirate}
onChange={handleFieldChange('emirate')}
disabled={loading}
/>
</div>
</Card>
{/* Employee Information */}
<Card>
<h3 className="text-sm font-semibold text-gray-900 mb-4">Employee Information</h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<Field
label="Emirati Male"
placeholder="500"
type="number"
value={info.employeeInfo.emiratiMale}
onChange={handleEmployeeChange('emiratiMale')}
disabled={loading}
/>
<Field
label="Non-Emirati Male"
placeholder="500"
type="number"
value={info.employeeInfo.nonEmiratiMale}
onChange={handleEmployeeChange('nonEmiratiMale')}
disabled={loading}
/>
<Field
label="Emirati Female"
placeholder="500"
type="number"
value={info.employeeInfo.emiratiFemale}
onChange={handleEmployeeChange('emiratiFemale')}
disabled={loading}
/>
<Field
label="Non-Emirati Female"
placeholder="500"
type="number"
value={info.employeeInfo.nonEmiratiFemale}
onChange={handleEmployeeChange('nonEmiratiFemale')}
disabled={loading}
/>
<Field
label="Total Employees"
placeholder="2000"
type="number"
value={info.employeeInfo.totalEmployees}
onChange={handleEmployeeChange('totalEmployees')}
disabled={loading}
/>
<Field
label="Total Emirati"
placeholder="1000"
type="number"
value={info.employeeInfo.totalEmirati}
onChange={handleEmployeeChange('totalEmirati')}
disabled={loading}
/>
</div>
</Card>
{/* Footer actions */}
<div className="flex flex-col sm:flex-row justify-between gap-3">
<button
onClick={onBack}
className="inline-flex items-center gap-2 h-9 px-4 rounded-md border border-[#92722A] text-[#92722A] bg-transparent hover:bg-[#92722A]/10"
>
<img src={BackVendor} alt="" className="h-4 w-4" />
<span>Back</span>
</button>
<button
onClick={onNext}
className="inline-flex items-center gap-2 h-9 px-5 rounded-md bg-[#92722A] text-white hover:bg-[#7b5c1f] cursor-pointer"
disabled={loading}
>
<span>Next</span>
<svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
<path strokeLinecap="round" strokeLinejoin="round" d="M9 5l7 7-7 7" />
</svg>
</button>
</div>
{(loading || error) && (
<div className="mt-3">
{loading && <p className="text-sm text-[#5F646D]">Loading establishment information</p>}
{!loading && error && <p className="text-sm text-red-600">{error}</p>}
</div>
)}
</div>
);
};
export default EstablishmentInfo;

View File

@ -0,0 +1,454 @@
import React from 'react';
import {
fetchVariationReasons,
fetchZeroTargetReasons,
fetchProducts,
fetchUnits,
} from '../../../services/masters/masterService.js';
import CaretDown from '../../../assets/images/caretdown.svg';
const Input = ({ placeholder = '', type = 'text', value = '', onChange = () => {} }) => (
<input
type={type}
placeholder={placeholder}
value={value}
onChange={onChange}
className="block w-full h-10 rounded-md border-2 border-[#92722A] focus:border-[#92722A] focus:ring-0 px-4 text-sm bg-white"
/>
);
const Select = ({ placeholder = '', options = [], value = '', onChange }) => (
<div className="relative">
<select
className="block w-full h-10 rounded-md border-2 border-[#92722A] focus:border-[#92722A] focus:ring-0 px-4 pr-10 text-sm bg-white appearance-none"
value={value}
onChange={onChange}
>
<option value="" disabled>{placeholder}</option>
{options.map((opt) => {
if (opt && typeof opt === 'object') {
const optionValue = opt.value ?? '';
const optionLabel = opt.label ?? optionValue;
if (!optionValue && !optionLabel) return null;
return (
<option key={optionValue || optionLabel} value={optionValue}>
{optionLabel}
</option>
);
}
return (
<option key={opt} value={opt}>{opt}</option>
);
})}
</select>
<img src={CaretDown} alt="open" className="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4" />
</div>
);
const Textarea = ({ placeholder = '', value = '', onChange = () => {} }) => (
<textarea
placeholder={placeholder}
value={value}
onChange={onChange}
className="block w-full rounded-md border-2 border-[#92722A] focus:border-[#92722A] focus:ring-0 px-4 py-2 text-sm bg-white min-h-[96px]"
/>
);
const Card = ({ children }) => (
<div className="bg-white rounded-md ring-1 ring-gray-200">
<div className="p-5">
{children}
</div>
</div>
);
const SectionBox = ({ title, children, badgeBg = '#F3F4F6', badgeText = '#374151' }) => (
<div className="rounded-md ring-1 ring-gray-200 bg-white">
<div className="p-5">
<div className="mb-4">
<span
className="inline-flex items-center rounded text-xs font-medium px-2 py-1"
style={{ backgroundColor: badgeBg, color: badgeText }}
>
{title}
</span>
</div>
{children}
</div>
</div>
);
const ProductData = ({
products = [],
onProductsChange = () => {},
onNext = () => {},
onBack = () => {},
}) => {
const MAX_PRODUCTS = 10;
const nextId = React.useRef(products.length + 1);
const [variationReasons, setVariationReasons] = React.useState([]);
const [isLoadingReasons, setIsLoadingReasons] = React.useState(false);
const [reasonsError, setReasonsError] = React.useState('');
const [zeroTargetReasons, setZeroTargetReasons] = React.useState([]);
const [isLoadingZeroReasons, setIsLoadingZeroReasons] = React.useState(false);
const [zeroReasonsError, setZeroReasonsError] = React.useState('');
const [productOptions, setProductOptions] = React.useState([]);
const [isLoadingProducts, setIsLoadingProducts] = React.useState(false);
const [productsError, setProductsError] = React.useState('');
const [unitOptions, setUnitOptions] = React.useState([]);
const [isLoadingUnits, setIsLoadingUnits] = React.useState(false);
const [unitsError, setUnitsError] = React.useState('');
React.useEffect(() => {
const variationController = new AbortController();
const zeroController = new AbortController();
const productsController = new AbortController();
const unitsController = new AbortController();
const loadReasons = async () => {
console.log('Fetching variation reasons...');
setIsLoadingReasons(true);
setReasonsError('');
try {
const reasons = await fetchVariationReasons({ signal: variationController.signal });
console.log('Variation reasons fetched:', reasons);
setVariationReasons(reasons);
setReasonsError('');
} catch (error) {
if (error.name !== 'AbortError') {
console.error('Failed to fetch variation reasons', error);
setReasonsError('Failed to load variation reasons.');
}
} finally {
setIsLoadingReasons(false);
}
};
const loadZeroReasons = async () => {
setIsLoadingZeroReasons(true);
setZeroReasonsError('');
try {
const reasons = await fetchZeroTargetReasons({ signal: zeroController.signal });
setZeroTargetReasons(reasons);
setZeroReasonsError('');
} catch (error) {
if (error.name !== 'AbortError') {
console.error('Failed to fetch zero target reasons', error);
setZeroReasonsError('Failed to load zero target reasons.');
}
} finally {
setIsLoadingZeroReasons(false);
}
};
const loadProducts = async () => {
setIsLoadingProducts(true);
setProductsError('');
try {
const productsList = await fetchProducts({ signal: productsController.signal });
setProductOptions(productsList);
setProductsError('');
} catch (error) {
if (error.name !== 'AbortError') {
console.error('Failed to fetch products', error);
setProductsError('Failed to load products.');
}
} finally {
setIsLoadingProducts(false);
}
};
const loadUnits = async () => {
setIsLoadingUnits(true);
setUnitsError('');
try {
const unitsList = await fetchUnits({ signal: unitsController.signal });
setUnitOptions(unitsList);
setUnitsError('');
} catch (error) {
if (error.name !== 'AbortError') {
console.error('Failed to fetch units', error);
setUnitsError('Failed to load units.');
}
} finally {
setIsLoadingUnits(false);
}
};
loadReasons();
loadZeroReasons();
loadProducts();
loadUnits();
return () => {
variationController.abort();
zeroController.abort();
productsController.abort();
unitsController.abort();
};
}, []);
React.useEffect(() => {
const maxId = products.reduce((max, item) => (item && typeof item.id === 'number' ? Math.max(max, item.id) : max), 0);
if (maxId >= nextId.current) {
nextId.current = maxId + 1;
}
}, [products]);
const addProduct = () => {
if (products.length >= MAX_PRODUCTS) return;
const newProduct = {
id: nextId.current++,
product: '',
unit: '',
capacity: '',
previousQuantity: '',
previousCost: '',
currentQuantity: '',
currentCost: '',
variationReason: '',
otherVariationReason: '',
remarks: '',
forecastQuantity: '',
forecastCost: '',
zeroTargetReason: '',
otherZeroTargetReason: '',
};
onProductsChange([...products, newProduct]);
};
const removeProduct = (id) => {
if (products.length === 1) return;
onProductsChange(products.filter((p) => p.id !== id));
};
const updateProductField = (id, field, value) => {
onProductsChange(
products.map((product) =>
product.id === id ? { ...product, [field]: value } : product
)
);
};
const canAddMoreProducts = products.length < MAX_PRODUCTS;
return (
<div className="space-y-5 ">
<div className="flex items-center justify-between">
<div className="flex items-center gap-3">
<h2 className="text-lg font-semibold text-gray-900">Product Data</h2>
<span className="inline-flex items-center rounded text-xs font-medium px-2 py-0.5" style={{ backgroundColor: '#F3FAF4', color: '#2F663C' }}>Current Quarter: Q1 2025</span>
</div>
<div className="flex items-center gap-3">
<button
onClick={addProduct}
disabled={!canAddMoreProducts}
className={`inline-flex items-center gap-2 text-sm font-medium px-3 py-2 rounded ${canAddMoreProducts ? 'bg-[#B68A35] text-white cursor-pointer hover:bg-[#9e782f]' : 'bg-gray-200 text-gray-500 cursor-not-allowed'}`}
>
<span>+ Add Product</span>
</button>
{!canAddMoreProducts && (
<span className="text-xs text-gray-600">Maximum of {MAX_PRODUCTS} products reached.</span>
)}
</div>
</div>
{products.map((p, idx) => (
<Card key={p.id}>
<div className="space-y-5">
<div className="flex items-center justify-between">
<p className="text-sm font-semibold text-gray-900">Product #{idx + 1}</p>
{products.length > 1 && (
<button
type="button"
onClick={() => removeProduct(p.id)}
className="text-[#92722A] text-sm px-3 py-1 rounded hover:bg-[#92722A]/10 cursor-pointer"
>
Remove
</button>
)}
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">Product (HS Code - Name)</label>
<Select
placeholder={isLoadingProducts ? 'Loading products...' : 'Select product HS code'}
options={productOptions}
value={p.product || ''}
onChange={(e) => updateProductField(p.id, 'product', e.target.value)}
/>
{productsError && productOptions.length === 0 && (
<p className="mt-1 text-xs text-red-600">{productsError}</p>
)}
</div>
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">Unit</label>
<Select
placeholder={isLoadingUnits ? 'Loading units...' : 'Select unit'}
options={unitOptions}
value={p.unit || ''}
onChange={(e) => updateProductField(p.id, 'unit', e.target.value)}
/>
{unitsError && unitOptions.length === 0 && (
<p className="mt-1 text-xs text-red-600">{unitsError}</p>
)}
</div>
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">Annual installed capacity (in unit)</label>
<Input
placeholder="Enter capacity"
type="number"
value={p.capacity || ''}
onChange={(e) => updateProductField(p.id, 'capacity', e.target.value)}
/>
</div>
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
<SectionBox title="Q4 2024 Previous" badgeBg="#E7F5FF" badgeText="#003CFF">
<div className="grid grid-cols-1 gap-4">
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">Quantity (liter)</label>
<Input
placeholder="Enter quantity"
type="number"
value={p.previousQuantity || ''}
onChange={(e) => updateProductField(p.id, 'previousQuantity', e.target.value)}
/>
</div>
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">Cost (AED)</label>
<Input
placeholder="Enter cost"
type="number"
value={p.previousCost || ''}
onChange={(e) => updateProductField(p.id, 'previousCost', e.target.value)}
/>
</div>
</div>
</SectionBox>
<SectionBox title="Q1 2025 Current" badgeBg="#F3FAF4" badgeText="#2F663C">
<div className="grid grid-cols-1 gap-4">
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">Quantity (liter)</label>
<Input
placeholder="Enter quantity"
type="number"
value={p.currentQuantity || ''}
onChange={(e) => updateProductField(p.id, 'currentQuantity', e.target.value)}
/>
</div>
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">Cost (AED)</label>
<Input
placeholder="Enter cost"
type="number"
value={p.currentCost || ''}
onChange={(e) => updateProductField(p.id, 'currentCost', e.target.value)}
/>
</div>
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">Reason for Variation</label>
<Select
placeholder={isLoadingReasons ? 'Loading reasons...' : 'Select reason'}
options={variationReasons}
value={p.variationReason || ''}
onChange={(e) => updateProductField(p.id, 'variationReason', e.target.value)}
/>
{reasonsError && variationReasons.length === 0 && (
<p className="mt-1 text-xs text-red-600">{reasonsError}</p>
)}
</div>
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">Other reason for variation</label>
<Input
placeholder="Specify other reason"
value={p.otherVariationReason || ''}
onChange={(e) => updateProductField(p.id, 'otherVariationReason', e.target.value)}
/>
</div>
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">Remarks (optional)</label>
<Textarea
placeholder="Add short note.."
value={p.remarks || ''}
onChange={(e) => updateProductField(p.id, 'remarks', e.target.value)}
/>
</div>
</div>
</SectionBox>
<SectionBox title="Q2 2025 Forecast" badgeBg="#F9F7ED" badgeText="#7C5E24">
<div className="grid grid-cols-1 gap-4">
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">Expected quantity (liter)</label>
<Input
placeholder="Enter quantity"
type="number"
value={p.forecastQuantity || ''}
onChange={(e) => updateProductField(p.id, 'forecastQuantity', e.target.value)}
/>
</div>
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">Expected cost (AED)</label>
<Input
placeholder="Enter cost"
type="number"
value={p.forecastCost || ''}
onChange={(e) => updateProductField(p.id, 'forecastCost', e.target.value)}
/>
</div>
</div>
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">Reason for 0 Target</label>
<Select
placeholder={isLoadingZeroReasons ? 'Loading reasons...' : 'Select reason'}
options={zeroTargetReasons}
value={p.zeroTargetReason || ''}
onChange={(e) => updateProductField(p.id, 'zeroTargetReason', e.target.value)}
/>
{zeroReasonsError && zeroTargetReasons.length === 0 && (
<p className="mt-1 text-xs text-red-600">{zeroReasonsError}</p>
)}
</div>
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">Other reason for 0 target</label>
<Input
placeholder="Specify other reason"
value={p.otherZeroTargetReason || ''}
onChange={(e) => updateProductField(p.id, 'otherZeroTargetReason', e.target.value)}
/>
</div>
</div>
</SectionBox>
</div>
</div>
</Card>
))}
<div className="flex flex-col sm:flex-row justify-between gap-3">
<button
onClick={onBack}
className="inline-flex items-center gap-2 h-9 px-4 rounded-md border border-[#92722A] text-[#92722A] bg-transparent hover:bg-[#92722A]/10"
>
<svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
<path strokeLinecap="round" strokeLinejoin="round" d="M15 19l-7-7 7-7" />
</svg>
<span>Back</span>
</button>
<button
onClick={onNext}
className="inline-flex items-center gap-2 h-9 px-5 rounded-md bg-[#92722A] text-white hover:bg-[#7b5c1f] cursor-pointer"
>
<span>Next</span>
<svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
<path strokeLinecap="round" strokeLinejoin="round" d="M9 5l7 7-7 7" />
</svg>
</button>
</div>
</div>
);
};
export default ProductData;

View File

@ -0,0 +1,223 @@
import React from 'react';
import Table from '../../common/Table';
import BackVendor from '../../../assets/images/backvector.svg';
const Card = ({ title, children }) => (
<div className="bg-white w-full rounded-lg shadow-sm ring-1 ring-gray-200">
{title && (
<div className="px-5 pt-5">
<h3 className="text-sm font-semibold text-gray-900">{title}</h3>
</div>
)}
<div className="p-5">
{children}
</div>
</div>
);
const KeyValueTable = ({ rows = [] }) => (
<div className="overflow-hidden rounded-md ring-1 ring-[#C3C6CB]">
<div className="overflow-x-auto">
<table className="min-w-[720px] w-full table-fixed divide-y divide-[#C3C6CB]">
<tbody className="bg-white divide-y divide-[#C3C6CB]">
{rows.map(([label, value], idx) => (
<tr key={idx}>
<td
className="w-[628px] px-4 h-12 align-middle text-sm text-gray-900 bg-[#F2ECCF] font-medium"
style={{ borderTopLeftRadius: idx === 0 ? 4 : 0, borderBottomLeftRadius: idx === rows.length - 1 ? 4 : 0 }}
>
{label}
</td>
<td className="px-4 h-12 align-middle text-sm text-gray-900">{value}</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
);
// Reuse common Table for uniform styling across app
const formatNumber = (value) => {
if (value === null || value === undefined || value === '') return '';
const number = Number(value);
if (Number.isNaN(number)) return value;
return new Intl.NumberFormat('en-US').format(number);
};
const buildEstablishmentRows = (establishment) => {
if (!establishment) return [];
return [
['Establishment Name', establishment.establishmentName || '—'],
['Establishment ID', establishment.permanentFactoryCode || '—'],
['Industry Code', establishment.industryCode || '—'],
['License Number', establishment.licenseNumber || '—'],
['ISIC Code', establishment.isicCode || '—'],
['Emirate', establishment.emirate || '—'],
['Quarter', establishment.quarter || '—'],
['Year', establishment.year || '—'],
];
};
const buildEmploymentRows = (establishment) => {
const info = establishment?.employeeInfo || {};
return [
['Total Employees', formatNumber(info.totalEmployees) || '—'],
['Emirati Male', formatNumber(info.emiratiMale) || '—'],
['Emirati Female', formatNumber(info.emiratiFemale) || '—'],
['Non-Emirati Male', formatNumber(info.nonEmiratiMale) || '—'],
['Non-Emirati Female', formatNumber(info.nonEmiratiFemale) || '—'],
['Total Emirati', formatNumber(info.totalEmirati) || '—'],
];
};
const buildProductRows = (products = []) => {
if (!Array.isArray(products)) return [];
return products.map((product) => [
product.product || '—',
product.unit || '—',
formatNumber(product.currentQuantity) || '—',
formatNumber(product.currentCost) || '—',
formatNumber(product.forecastQuantity) || '—',
formatNumber(product.forecastCost) || '—',
]);
};
const ReviewSubmit = ({
establishment,
products = [],
onBack = () => {},
onSubmit = () => {},
toast = null,
onToastClose = () => {},
isSubmitting = false,
hasSubmitted = false,
}) => {
const [confirm, setConfirm] = React.useState(false);
const establishmentRows = React.useMemo(() => buildEstablishmentRows(establishment), [establishment]);
const employmentRows = React.useMemo(() => buildEmploymentRows(establishment), [establishment]);
const productRows = React.useMemo(() => buildProductRows(products), [products]);
const submitLabel = React.useMemo(() => {
if (hasSubmitted) return 'Submitted';
if (isSubmitting) return 'Submitting...';
return 'Submit';
}, [hasSubmitted, isSubmitting]);
return (
<div className="space-y-5">
{toast && (
<div
className={`flex items-start justify-between gap-3 rounded-md border px-4 py-3 text-sm ${
toast.type === 'success'
? 'bg-[#F3FAF4] border-[#C6E7D8] text-[#2F663C]'
: 'bg-[#FEF2F2] border-[#FECACA] text-[#B91C1C]'
}`}
>
<div className="flex items-start gap-2">
{toast.type === 'success' ? (
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" className="h-4 w-4 mt-0.5">
<path
fillRule="evenodd"
d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm4.28 7.28a.75.75 0 0 0-1.06-1.06l-4.22 4.22-1.22-1.22a.75.75 0 0 0-1.06 1.06l1.75 1.75c.293.293.767.293 1.06 0l4.75-4.75Z"
clipRule="evenodd"
/>
</svg>
) : (
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" className="h-4 w-4 mt-0.5">
<path
fillRule="evenodd"
d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-1.5 5.25a.75.75 0 0 1 1.5 0v4.5a.75.75 0 0 1-1.5 0v-4.5Zm.75 7.5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"
clipRule="evenodd"
/>
</svg>
)}
<span>{toast.message || toast.text || ''}</span>
</div>
<button
type="button"
aria-label="Close"
className="flex h-6 w-6 items-center justify-center rounded hover:bg-black/5"
onClick={onToastClose}
>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" className="h-4 w-4">
<path
fillRule="evenodd"
d="M5.47 5.47a.75.75 0 0 1 1.06 0L12 10.94l5.47-5.47a.75.75 0 1 1 1.06 1.06L13.06 12l5.47 5.47a.75.75 0 1 1-1.06 1.06L12 13.06l-5.47 5.47a.75.75 0 0 1-1.06-1.06L10.94 12 5.47 6.53a.75.75 0 0 1 0-1.06Z"
clipRule="evenodd"
/>
</svg>
</button>
</div>
)}
<h2 className="text-lg font-semibold text-gray-900">Review & Submit</h2>
<Card title="Establishment Information">
<KeyValueTable
rows={establishmentRows}
/>
</Card>
<Card title="Product Summary">
<Table
headers={["Product", "Unit", "Current Quarter Quantity", "Current Quarter Cost (AED)", "Next Quarter Quantity", "Next Quarter Cost (AED)"]}
rows={productRows}
/>
</Card>
<Card title="Employment Details">
<KeyValueTable
rows={employmentRows}
/>
</Card>
{/* Info note */}
{!hasSubmitted && (
<div className="rounded-md bg-[#E7F0FF] border border-[#C6DBFF] px-4 py-3 text-[13px] text-[#2563EB]">
Review your data carefully before submission. You can go back to previous steps to edit any details. Once submitted, changes will require admin approval.
</div>
)}
{/* Confirmation */}
<div className="bg-white rounded-md ring-1 ring-gray-200 px-4 py-3">
<label className="flex items-start gap-3 text-sm text-gray-700">
<input
type="checkbox"
className="mt-1 h-4 w-4 text-[#92722A] border-gray-300 rounded"
checked={confirm}
disabled={hasSubmitted}
onChange={(e) => setConfirm(e.target.checked)}
/>
<span>I hereby confirm that all data entered is accurate and complete to the best of my knowledge.</span>
</label>
</div>
{/* Footer actions */}
<div className="flex flex-col sm:flex-row justify-between gap-3">
<button
onClick={onBack}
className="inline-flex items-center gap-2 h-9 px-4 rounded-md border border-[#92722A] text-[#92722A] bg-transparent hover:bg-[#92722A]/10"
>
<img src={BackVendor} alt="" className="h-4 w-4" />
<span>Back</span>
</button>
<button
disabled={!confirm || isSubmitting || hasSubmitted}
onClick={onSubmit}
className={`inline-flex items-center h-9 px-5 rounded-md cursor-pointer ${
!confirm || isSubmitting || hasSubmitted
? 'bg-gray-200 text-gray-400 cursor-not-allowed'
: 'bg-[#92722A] text-white hover:bg-[#7b5c1f]'
}`}
>
<span>{submitLabel}</span>
</button>
</div>
</div>
);
};
export default ReviewSubmit;

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,16 @@
@import "tailwindcss";
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap');
@layer base {
html,
body {
font-family: 'Roboto', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Helvetica, Arial, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
}
* {
font-family: inherit;
}
button {
cursor: pointer;
}
}

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