Initial commit: PC Builder AdonisJS project

This commit is contained in:
Kevin
2026-06-28 10:41:51 +02:00
commit 648d0af538
144 changed files with 18570 additions and 0 deletions
+66
View File
@@ -0,0 +1,66 @@
import './css/app.css'
import 'vue-sonner/style.css'
import { client } from '~/client'
import Layout from '~/layouts/default.vue'
import { createInertiaApp } from '@inertiajs/vue3'
import { TuyauProvider } from '@adonisjs/inertia/vue'
import { createApp, type DefineComponent, h } from 'vue'
import { resolvePageComponent } from '@adonisjs/inertia/helpers'
import DefaultLayout from '~/pages/layout/defaultLayout.vue'
import EmptyLayout from '~/pages/layout/emptyLayout.vue'
// directives
// @ts-ignore
import validationErrorDirective from '~/directives/v_validation_error'
// @ts-ignore
import priceDirective from '~/directives/v-price'
// @ts-ignore
import deleteConfirmDirective from '~/directives/v-delete-confirm'
const appName = import.meta.env.VITE_APP_NAME || 'AdonisJS'
createInertiaApp({
title: (title) => (title ? `${title} - ${appName}` : appName),
resolve: async (name) => {
const page = await resolvePageComponent(
`./pages/${name}.vue`,
import.meta.glob<DefineComponent>('./pages/**/*.vue')
)
// Choix du layout
const layout =
name.startsWith('auth/') || name.startsWith('account')
? EmptyLayout
: DefaultLayout
page.default.layout = page.default.layout || layout
return page
},
setup({ el, App, props, plugin }) {
const vueApp = createApp({
render: () =>
h(
TuyauProvider,
{ client },
{
default: () => h(App, props),
}
),
})
vueApp
.use(plugin)
.directive('validation-error', validationErrorDirective)
.directive('price', priceDirective)
.directive('delete-confirm', deleteConfirmDirective)
.mount(el)
},
progress: {
color: '#4B5563',
},
})
File diff suppressed because one or more lines are too long
+36
View File
@@ -0,0 +1,36 @@
<?xml version="1.0" standalone="no"?>
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M627 5102 c-16 -17 -17 -165 -17 -1930 0 -1899 0 -1912 20 -1932 18
-18 33 -20 174 -20 l154 0 5 -342 c4 -364 6 -377 57 -478 12 -24 45 -68 73
-98 96 -101 218 -152 364 -152 79 0 81 0 92 -29 7 -15 27 -42 44 -59 67 -65
20 -62 967 -62 947 0 900 -3 967 62 17 17 37 44 44 59 11 29 13 29 92 29 224
0 403 128 474 339 13 37 17 112 20 389 l5 342 154 0 c141 0 156 2 174 20 20
20 20 33 20 1933 0 1841 -1 1915 -18 1930 -17 16 -166 17 -1934 17 -1842 0
-1916 -1 -1931 -18z m2165 -327 c246 -37 462 -119 663 -253 853 -567 974
-1772 250 -2497 -633 -633 -1657 -633 -2290 0 -305 306 -475 715 -475 1146 0
803 582 1479 1381 1604 118 18 349 18 471 0z m-1202 -3834 l0 -280 -27 -45
c-28 -45 -28 -45 -84 -46 -99 0 -94 -18 -97 339 l-3 311 106 0 105 0 0 -279z
m1510 29 l0 -250 -540 0 -540 0 0 250 0 250 540 0 540 0 0 -250z m638 -61 c-3
-357 2 -339 -97 -339 -56 1 -56 1 -83 46 l-28 45 0 280 0 279 105 0 106 0 -3
-311z"/>
<path d="M2415 4534 c-92 -14 -191 -35 -253 -54 l-71 -21 36 -82 c34 -80 164
-418 178 -466 7 -23 7 -23 -36 6 -77 53 -280 178 -417 257 l-134 77 -48 -41
c-120 -101 -259 -278 -333 -426 -41 -80 -90 -221 -111 -311 l-14 -62 31 -5
c18 -3 100 -14 182 -26 83 -11 203 -30 267 -42 l118 -21 -68 -37 c-37 -20
-134 -73 -217 -117 -82 -44 -189 -104 -236 -132 l-87 -51 20 -92 c40 -183 101
-327 208 -486 62 -93 225 -272 247 -272 7 0 25 19 42 43 35 51 227 291 292
365 l45 52 0 -347 -1 -347 88 -28 c255 -82 572 -84 815 -6 l70 23 -43 102
c-52 121 -178 454 -173 458 2 2 70 -40 152 -92 82 -52 214 -133 294 -179 l145
-83 65 57 c186 163 335 399 405 642 14 47 27 99 28 115 4 28 1 30 -31 33 -62
5 -372 52 -469 70 l-95 18 159 83 c87 45 224 120 305 167 l148 84 -19 88 c-60
277 -188 510 -387 706 l-70 68 -63 -83 c-52 -70 -209 -264 -294 -365 l-21 -24
1 346 0 346 -62 23 c-112 43 -256 67 -413 70 -80 2 -158 1 -175 -1z m226
-1018 c248 -58 355 -352 204 -558 -67 -92 -165 -140 -285 -140 -85 0 -139 17
-206 62 -168 116 -198 370 -63 524 49 56 114 95 183 112 67 16 100 16 167 0z"/>
</g>
</svg>
+48
View File
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg version="1.1" id="_x32_" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 512 512" xml:space="preserve">
<style type="text/css">
.st0{fill:#000000;}
</style>
<g>
<rect x="141.312" class="st0" width="32.771" height="71.683"/>
<rect x="206.853" class="st0" width="32.761" height="71.683"/>
<rect x="272.385" class="st0" width="32.761" height="71.683"/>
<rect x="337.917" class="st0" width="32.77" height="71.683"/>
<rect x="141.312" y="440.326" class="st0" width="32.771" height="71.674"/>
<rect x="206.853" y="440.326" class="st0" width="32.761" height="71.674"/>
<rect x="272.385" y="440.326" class="st0" width="32.761" height="71.674"/>
<rect x="337.917" y="440.326" class="st0" width="32.77" height="71.674"/>
<rect x="440.321" y="141.307" class="st0" width="71.674" height="32.771"/>
<rect x="440.321" y="206.849" class="st0" width="71.674" height="32.77"/>
<rect x="440.321" y="272.39" class="st0" width="71.674" height="32.761"/>
<rect x="440.321" y="337.922" class="st0" width="71.674" height="32.77"/>
<rect x="0.005" y="141.307" class="st0" width="71.674" height="32.771"/>
<rect x="0.005" y="206.849" class="st0" width="71.674" height="32.77"/>
<rect x="0.005" y="272.39" class="st0" width="71.674" height="32.761"/>
<rect x="0.005" y="337.922" class="st0" width="71.674" height="32.77"/>
<path class="st0" d="M255.246,252.209c6.171,0,9.862-3.586,9.862-9.06c0-5.485-3.69-9.176-9.862-9.176h-11.16
c-0.4,0-0.6,0.21-0.6,0.61v17.025c0,0.4,0.2,0.601,0.6,0.601H255.246z"/>
<path class="st0" d="M92.165,419.84h327.67V92.17H92.165V419.84z M367.359,130.568c8.479,0,15.356,6.867,15.356,15.356
c0,8.488-6.876,15.355-15.356,15.355c-8.479,0-15.356-6.867-15.356-15.355C352.004,137.434,358.88,130.568,367.359,130.568z
M367.359,353.287c8.479,0,15.356,6.867,15.356,15.356c0,8.488-6.876,15.355-15.356,15.355c-8.479,0-15.356-6.867-15.356-15.355
C352.004,360.154,358.88,353.287,367.359,353.287z M290.821,222.318c0-0.591,0.4-0.991,1.001-0.991h12.648
c0.6,0,1.001,0.4,1.001,0.991v42.242c0,8.069,4.483,12.648,11.35,12.648c6.772,0,11.264-4.578,11.264-12.648v-42.242
c0-0.591,0.4-0.991,0.992-0.991h12.646c0.601,0,0.992,0.4,0.992,0.991v41.851c0,16.825-10.749,25.99-25.895,25.99
c-15.232,0-25.999-9.165-25.999-25.99V222.318z M228.846,222.318c0-0.591,0.4-0.991,1.001-0.991h26.295
c14.745,0,23.605,8.87,23.605,21.822c0,12.741-8.966,21.707-23.605,21.707h-12.056c-0.4,0-0.6,0.2-0.6,0.6v22.614
c0,0.591-0.391,0.991-0.991,0.991h-12.648c-0.601,0-1.001-0.4-1.001-0.991V222.318z M167.673,236.872
c3.586-11.063,12.256-16.633,24.112-16.633c11.454,0,19.819,5.57,23.605,15.03c0.295,0.496,0.095,0.992-0.496,1.202l-10.863,4.874
c-0.592,0.296-1.097,0.104-1.393-0.486c-1.889-4.387-5.084-7.678-10.759-7.678c-5.274,0-8.66,2.795-10.157,7.468
c-0.801,2.499-1.097,4.883-1.097,14.554c0,9.652,0.296,12.046,1.097,14.535c1.497,4.673,4.883,7.468,10.157,7.468
c5.675,0,8.87-3.291,10.759-7.669c0.296-0.6,0.801-0.791,1.393-0.496l10.863,4.874c0.591,0.21,0.791,0.706,0.496,1.202
c-3.786,9.461-12.152,15.04-23.605,15.04c-11.856,0-20.525-5.58-24.112-16.643c-1.487-4.368-1.888-7.859-1.888-18.312
C165.785,244.732,166.186,241.26,167.673,236.872z M144.64,130.568c8.489,0,15.365,6.876,15.365,15.356
c0,8.478-6.876,15.355-15.365,15.355c-8.488,0-15.355-6.876-15.355-15.355C129.285,137.444,136.152,130.568,144.64,130.568z
M144.64,353.287c8.489,0,15.365,6.876,15.365,15.356c0,8.478-6.876,15.355-15.365,15.355c-8.488,0-15.355-6.877-15.355-15.355
C129.285,360.163,136.152,353.287,144.64,353.287z"/>
</g>
</svg>
+5
View File
@@ -0,0 +1,5 @@
<svg fill="#000000" height="800px" width="800px" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 490 490" xml:space="preserve">
<polygon points="456.851,0 245,212.564 33.149,0 0.708,32.337 212.669,245.004 0.708,457.678 33.149,490 245,277.443 456.851,490
489.292,457.678 277.331,245.004 489.292,32.337 "/>
</svg>
+30
View File
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg fill="#000000" height="800px" width="800px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 512 512" xml:space="preserve">
<g>
<g>
<path d="M256,120.457c-74.739,0-135.543,60.804-135.543,135.543c0,74.739,60.804,135.543,135.543,135.543
S391.543,330.739,391.543,256C391.543,181.261,330.74,120.457,256,120.457z M256,357.391
c-55.908,0-101.391-45.484-101.391-101.391c0-55.907,45.483-101.391,101.391-101.391S357.391,200.093,357.391,256
C357.391,311.907,311.907,357.391,256,357.391z"/>
</g>
</g>
<g>
<g>
<path d="M256,185.027c-39.135,0-70.973,31.839-70.973,70.973c0,39.135,31.839,70.973,70.973,70.973
c39.135,0,70.973-31.839,70.973-70.973C326.974,216.865,295.134,185.027,256,185.027z"/>
</g>
</g>
<g>
<g>
<path d="M511.999,315.659V196.341h-47.416c-4.534-15.894-10.867-31.172-18.918-45.636l33.539-33.539l-84.37-84.37l-33.539,33.54
c-14.467-8.053-29.741-14.385-45.636-18.919V0H196.341v47.416c-15.895,4.534-31.168,10.866-45.636,18.919l-33.539-33.54
l-84.37,84.37l33.539,33.539c-8.051,14.464-14.385,29.741-18.918,45.636H0.001v119.318h47.416
c4.534,15.894,10.867,31.172,18.918,45.636l-33.539,33.539l84.37,84.37l33.539-33.54c14.467,8.053,29.741,14.385,45.636,18.919
V512H315.66v-47.416c15.895-4.534,31.169-10.866,45.636-18.919l33.539,33.54l84.37-84.37l-33.539-33.539
c8.051-14.464,14.385-29.741,18.918-45.636H511.999z M256,421.959c-91.511,0-165.96-74.449-165.96-165.96S164.489,90.04,256,90.04
s165.96,74.449,165.96,165.96S347.512,421.959,256,421.959z"/>
</g>
</g>
</svg>
+20
View File
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg fill="#000000" width="800px" height="800px" viewBox="-0.01 0 122.89 122.89" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="enable-background:new 0 0 122.88 122.89" xml:space="preserve">
<style type="text/css">
<![CDATA[
.st0{fill-rule:evenodd;clip-rule:evenodd;}
]]>
</style>
<g>
<path class="st0" d="M11.56,0h99.75c3.18,0,6.07,1.3,8.17,3.4c2.1,2.1,3.4,4.99,3.4,8.17v99.75c0,3.18-1.3,6.07-3.4,8.17 c-2.09,2.09-4.99,3.4-8.17,3.4H11.56c-3.18,0-6.07-1.3-8.17-3.4C1.3,117.39,0,114.5,0,111.32V11.56C0,8.38,1.3,5.49,3.4,3.4 C5.49,1.3,8.38,0,11.56,0L11.56,0z M57.23,72.48c-1.52-0.48-2.91-1.24-4.19-2.3c-1.36-1.13-2.58-2.57-3.66-4.36 c-0.5,0.03-0.97,0.04-1.43,0.04c-0.8,0.01-1.63-0.03-2.5-0.09c-3.42-0.25-6-1.19-8.57-2.12c-1.67-0.61-3.34-1.21-5.15-1.58 c-0.65-0.13-1.23-0.14-1.74-0.08c-0.87,0.13-1.55,0.56-2.06,1.19c-0.58,0.7-0.97,1.66-1.18,2.7c-0.23,1.15-0.25,2.41-0.07,3.59 c0.16,1.05,0.46,2.12,0.84,3.16c0.39,1.08,0.87,2.12,1.38,3.09c0.46,0.9,0.98,1.75,1.55,2.56c0.57,0.82,1.2,1.61,1.86,2.36 c2.23,2.54,4.54,4.26,6.82,5.21c2.08,0.87,4.15,1.08,6.12,0.72c1.99-0.37,3.9-1.35,5.65-2.89c2.25-1.97,4.22-4.84,5.75-8.54 c0.26-0.62,0.41-1.25,0.49-1.89C57.21,73.02,57.23,72.75,57.23,72.48L57.23,72.48L57.23,72.48z M73.98,65.82 c-0.6,1.47-1.48,2.79-2.65,3.98c-1.24,1.26-2.78,2.35-4.66,3.27c-0.02,0.5-0.04,0.97-0.09,1.43c-0.06,0.8-0.16,1.63-0.3,2.48 c-0.54,3.38-1.69,5.88-2.84,8.36c-0.75,1.62-1.49,3.22-2.01,4.99c-0.19,0.64-0.25,1.21-0.22,1.73c0.06,0.88,0.43,1.59,1.01,2.15 c0.65,0.64,1.57,1.11,2.59,1.41c1.13,0.33,2.38,0.46,3.57,0.38c1.06-0.07,2.15-0.28,3.22-0.57c1.11-0.3,2.18-0.69,3.2-1.12 c0.94-0.39,1.83-0.83,2.68-1.33c0.87-0.5,1.7-1.06,2.51-1.65c2.72-2,4.62-4.16,5.77-6.35c1.04-2,1.44-4.05,1.24-6.04 c-0.2-2.01-1.02-4-2.4-5.88c-1.77-2.41-4.47-4.62-8.02-6.45c-0.59-0.31-1.21-0.52-1.84-0.64C74.51,65.89,74.25,65.85,73.98,65.82 L73.98,65.82L73.98,65.82z M65.86,50.31c1.49,0.54,2.85,1.36,4.09,2.47c1.32,1.19,2.48,2.68,3.48,4.51c0.47,0,0.95,0.01,1.43,0.03 c0.86,0.03,1.68,0.09,2.49,0.18c3.38,0.39,5.93,1.43,8.47,2.48c1.63,0.66,3.25,1.33,5.09,1.78c0.02,0.01,0.03,0.01,0.06,0.02 c0.62,0.15,1.18,0.18,1.67,0.13c0.88-0.09,1.57-0.5,2.11-1.1c0.6-0.68,1.03-1.62,1.29-2.66c0.28-1.14,0.34-2.4,0.22-3.58 c-0.11-1.07-0.37-2.14-0.7-3.2c-0.35-1.09-0.78-2.15-1.26-3.15c-0.43-0.91-0.92-1.79-1.45-2.62c-0.53-0.82-1.12-1.63-1.76-2.43 c-2.12-2.63-4.36-4.43-6.6-5.47c-2.04-0.94-4.11-1.25-6.09-0.97c-2,0.29-3.95,1.19-5.77,2.65c-2.33,1.87-4.42,4.67-6.09,8.29 c-0.28,0.61-0.46,1.24-0.57,1.87C65.91,49.78,65.88,50.04,65.86,50.31L65.86,50.31L65.86,50.31z M68.08,55.6 c-1.54-1.54-3.67-2.49-6.02-2.49c-2.35,0-4.48,0.95-6.02,2.49c-1.54,1.54-2.49,3.67-2.49,6.02s0.95,4.48,2.49,6.01 c1.54,1.54,3.67,2.49,6.02,2.49c2.35,0,4.48-0.96,6.02-2.49c1.54-1.54,2.49-3.67,2.49-6.01S69.61,57.13,68.08,55.6L68.08,55.6 L68.08,55.6z M50.36,57.33c0.53-1.5,1.35-2.86,2.45-4.1c1.17-1.31,2.67-2.47,4.5-3.48c0-0.48,0-0.95,0.02-1.43 c0.03-0.85,0.09-1.68,0.18-2.49c0.38-3.4,1.42-5.95,2.45-8.48c0.67-1.65,1.34-3.3,1.78-5.09c0.16-0.64,0.2-1.22,0.14-1.73 c-0.09-0.87-0.51-1.57-1.11-2.11c-0.69-0.61-1.62-1.03-2.66-1.28c-1.14-0.27-2.4-0.34-3.58-0.21c-1.07,0.12-2.15,0.37-3.2,0.71 c-1.07,0.34-2.13,0.78-3.15,1.26c-0.91,0.43-1.78,0.92-2.62,1.46c-0.85,0.55-1.66,1.13-2.42,1.76c-2.63,2.13-4.43,4.37-5.47,6.63 c-0.94,2.04-1.25,4.11-0.95,6.08c0.29,2,1.19,3.95,2.66,5.76c1.88,2.32,4.68,4.41,8.31,6.08c0.61,0.28,1.24,0.46,1.86,0.56 C49.82,57.28,50.09,57.31,50.36,57.33L50.36,57.33L50.36,57.33z M61.44,15.39c25.44,0,46.06,20.62,46.06,46.06 c0,25.44-20.62,46.06-46.06,46.06c-25.44,0-46.06-20.62-46.06-46.06C15.38,36.01,36,15.39,61.44,15.39L61.44,15.39z M108.06,9.56 c3.23,0,5.84,2.62,5.84,5.84c0,3.23-2.62,5.84-5.84,5.84c-3.22,0-5.84-2.62-5.84-5.84C102.22,12.17,104.84,9.56,108.06,9.56 L108.06,9.56z M14.81,9.56c3.23,0,5.84,2.62,5.84,5.84c0,3.23-2.62,5.84-5.84,5.84c-3.23,0-5.84-2.62-5.84-5.84 C8.97,12.17,11.59,9.56,14.81,9.56L14.81,9.56z M108.06,101.73c3.23,0,5.84,2.62,5.84,5.84s-2.62,5.84-5.84,5.84 c-3.22,0-5.84-2.62-5.84-5.84S104.84,101.73,108.06,101.73L108.06,101.73z M20.66,107.57c0,3.23-2.62,5.84-5.84,5.84 c-3.23,0-5.84-2.62-5.84-5.84s2.62-5.84,5.84-5.84C18.04,101.73,20.66,104.35,20.66,107.57L20.66,107.57z"/>
</g>
</svg>
+63
View File
@@ -0,0 +1,63 @@
<?xml version="1.0" standalone="no"?>
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="923.000000pt" height="923.000000pt" viewBox="0 0 923.000000 923.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,923.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M110 7235 l0 -95 293 -2 292 -3 3 -2482 2 -2483 95 0 95 0 0 2580 0
2580 -390 0 -390 0 0 -95z"/>
<path d="M1010 4750 l0 -2100 3853 0 c4175 0 3902 -3 4009 51 105 53 203 184
228 302 7 36 10 571 8 1782 l-3 1730 -33 69 c-61 129 -147 208 -271 246 -62
20 -108 20 -3927 20 l-3864 0 0 -2100z m2739 1605 c800 -165 1351 -903 1290
-1728 -58 -767 -641 -1394 -1392 -1496 -101 -14 -343 -14 -444 0 -598 81
-1118 516 -1312 1096 -264 788 98 1648 841 2003 166 79 328 126 518 150 127
15 358 4 499 -25z m3373 24 c670 -72 1232 -564 1398 -1223 40 -157 54 -294 47
-466 -9 -247 -59 -446 -167 -665 -230 -469 -669 -799 -1178 -886 -156 -26
-389 -26 -545 1 -660 112 -1172 614 -1319 1290 -19 91 -22 134 -22 325 0 190
3 234 22 322 73 334 216 598 451 834 354 353 823 521 1313 468z"/>
<path d="M3290 6081 c-34 -6 -35 -8 -47 -66 -48 -237 -39 -537 23 -798 9 -37
15 -69 13 -70 -2 -2 -27 -17 -56 -34 l-51 -31 -69 71 c-189 197 -327 419 -384
622 -13 44 -24 82 -25 83 -5 8 -95 -61 -168 -129 -96 -89 -187 -206 -255 -324
-75 -130 -75 -130 -11 -187 156 -139 411 -283 635 -357 l120 -40 3 -65 3 -64
-108 -25 c-171 -41 -257 -51 -418 -50 -139 0 -248 15 -371 49 -18 5 -20 2 -17
-28 27 -239 94 -430 215 -620 55 -86 42 -84 168 -36 206 79 443 231 606 390
l60 59 56 -33 c66 -38 66 -21 3 -214 -73 -224 -181 -416 -313 -555 -75 -80
-78 -73 43 -120 164 -64 306 -89 504 -89 94 0 132 4 139 13 36 43 62 385 43
572 -11 109 -44 306 -57 339 -4 11 85 76 105 76 14 0 154 -159 231 -261 84
-112 191 -320 222 -436 13 -46 26 -82 30 -80 4 1 45 33 92 70 97 77 208 198
271 296 45 70 115 204 115 221 0 14 -80 86 -169 151 -151 111 -336 203 -537
269 l-102 34 5 60 c3 34 8 64 12 67 10 11 175 49 284 65 141 22 399 14 515
-15 46 -12 86 -21 89 -21 12 0 -7 148 -31 242 -42 165 -131 360 -205 449 l-26
31 -65 -22 c-212 -70 -464 -225 -658 -405 -33 -30 -62 -55 -65 -55 -3 0 -28
14 -55 31 l-50 31 24 88 c66 249 189 482 340 648 36 40 65 74 63 76 -14 12
-198 78 -264 95 -145 36 -349 51 -455 32z m190 -1197 c98 -39 119 -164 39
-240 -27 -26 -37 -29 -94 -29 -57 0 -67 3 -94 29 -78 75 -61 194 34 237 50 23
64 23 115 3z"/>
<path d="M6819 6083 l-37 -4 -18 -92 c-30 -145 -27 -498 5 -667 13 -69 26
-137 28 -151 4 -21 -1 -29 -24 -41 -15 -8 -39 -22 -53 -31 -26 -17 -26 -16
-82 41 -130 134 -239 284 -311 427 -39 78 -97 237 -97 265 0 34 -17 30 -81
-17 -142 -104 -296 -290 -378 -457 l-42 -84 43 -40 c182 -167 434 -305 718
-394 l45 -15 3 -65 3 -66 -108 -25 c-276 -65 -509 -70 -719 -17 -42 11 -79 18
-82 16 -8 -9 27 -213 53 -301 29 -102 126 -306 180 -377 l35 -48 77 29 c229
85 423 204 628 386 l83 75 51 -33 c49 -31 51 -34 46 -67 -11 -65 -85 -275
-130 -366 -56 -115 -145 -249 -226 -337 -34 -37 -60 -69 -58 -71 29 -25 200
-87 314 -112 77 -17 403 -30 422 -17 43 31 68 453 39 663 -9 63 -25 150 -35
192 l-18 78 55 30 56 30 54 -52 c173 -170 327 -415 388 -618 14 -47 28 -91 30
-98 10 -35 246 179 337 306 31 44 80 124 109 178 l52 98 -55 48 c-159 144
-417 289 -643 363 l-117 39 3 65 3 66 115 27 c173 41 280 51 458 45 111 -4
182 -11 241 -26 46 -12 86 -19 89 -16 8 8 -16 165 -39 252 -38 143 -137 353
-209 441 l-20 24 -67 -22 c-210 -68 -463 -225 -646 -399 l-68 -65 -55 30 -55
29 6 40 c10 67 73 244 126 354 64 134 145 257 232 348 l68 72 -38 19 c-59 30
-212 79 -304 97 -83 16 -309 27 -380 18z m210 -1210 c65 -49 83 -122 47 -191
-46 -89 -185 -98 -244 -15 -56 79 -23 184 68 222 34 15 98 6 129 -16z"/>
<path d="M348 6231 l-33 -29 -3 -539 c-3 -477 -1 -541 13 -568 25 -48 51 -59
158 -63 l97 -4 0 616 0 616 -100 0 c-96 0 -101 -1 -132 -29z"/>
<path d="M362 4454 c-52 -36 -52 -33 -52 -594 0 -571 0 -574 59 -604 21 -11
58 -16 121 -16 l90 0 0 615 0 615 -98 0 c-72 0 -103 -4 -120 -16z"/>
<path d="M1652 2309 l3 -221 33 -29 32 -29 1661 0 c1532 0 1663 1 1689 17 16
9 33 27 39 40 7 15 11 104 11 233 l0 210 -1736 0 -1735 0 3 -221z"/>
<path d="M5310 2323 c0 -190 2 -211 20 -241 11 -18 32 -37 46 -42 14 -6 169
-10 366 -10 l340 0 34 34 34 34 0 216 0 216 -420 0 -420 0 0 -207z"/>
</g>
</svg>
+52
View File
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg fill="#000000" height="800px" width="800px" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 502.664 502.664" xml:space="preserve">
<g>
<g>
<g>
<path d="M70.364,0v502.664H432.3V0H70.364z M243.966,457.732H109.536V316.185l46.981,43.53
c-15.509,6.795-26.381,22.239-26.381,40.251c0,24.202,19.673,43.897,43.94,43.897s43.918-19.673,43.918-43.897
c0-1.208-0.259-2.33-0.367-3.538c0.043-0.043,0.086-0.065,0.129-0.108l26.208,0.453
C243.966,396.773,243.966,457.732,243.966,457.732z M198.537,396.557c0.086,1.165,0.626,2.222,0.626,3.408
c0,13.848-11.238,25.065-25.087,25.065c-13.892,0-25.13-11.238-25.13-25.065c0-13.935,11.238-25.13,25.13-25.13
c2.243,0,4.228,0.733,6.32,1.273c39.755-30.415,114.778-86.52,116.267-84.903C297.936,292.672,233.223,360.728,198.537,396.557z
M272.87,339.308c47.779-52.201,42.645-58.392,39.237-62.145c-8.499-9.405-8.499-9.405-86.089,48.577l-13.331,10.181
c-63.677-16.998-110.723-74.915-110.723-143.985c0-82.422,66.826-149.248,149.162-149.248
c82.465,0,149.227,66.848,149.227,149.248C400.354,266.895,345.003,328.782,272.87,339.308z"/>
<path d="M251.127,147.544c-24.461,0-44.328,19.91-44.328,44.393c0,24.504,19.888,44.306,44.328,44.306
c24.591,0,44.393-19.824,44.393-44.306C295.498,167.476,275.653,147.566,251.127,147.544z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</g>
</svg>
+35
View File
@@ -0,0 +1,35 @@
import motherboard from './motherboard.svg'
import pcCase from './case.svg'
import cooler from './cooler.svg'
import cpu from './cpu.svg'
import fan from './fan.svg'
import ssd from './mvne.svg'
import graphicCard from './graphic-card.svg'
import hardDrive from './hard-drive.svg'
import memory from './memory.svg'
import defaultIcon from './default-icon.svg'
import powerSupply from './power-supply.svg'
import wiFiCard from './wifi-card.svg'
import siteIcon from './site-icon.svg'
import trashIcon from './trash-icon.svg'
import crossIcon from './cross-icon.svg'
import userProfileIcon from './user-profile-icon.svg'
export {
motherboard,
defaultIcon,
pcCase,
cooler,
cpu,
fan,
graphicCard,
hardDrive,
memory,
powerSupply,
wiFiCard,
siteIcon,
trashIcon,
crossIcon,
userProfileIcon,
ssd,
}
+43
View File
@@ -0,0 +1,43 @@
<?xml version="1.0" standalone="no"?>
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="1300.000000pt" height="1300.000000pt" viewBox="0 0 1300.000000 1300.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,1300.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M0 8101 l0 -499 233 -4 c227 -3 233 -4 289 -30 182 -84 266 -308 183
-486 -33 -71 -106 -146 -174 -179 -51 -25 -68 -28 -193 -31 l-138 -4 0 -177 0
-178 124 -6 c154 -8 214 -28 291 -98 201 -184 148 -494 -105 -612 -41 -19 -67
-22 -277 -25 l-233 -4 0 -944 0 -944 6500 0 6500 0 0 945 0 945 -209 0 c-241
0 -296 11 -381 76 -96 73 -144 169 -144 289 1 103 28 176 94 247 82 91 188
127 368 128 l72 0 0 179 0 179 -137 4 c-123 3 -143 6 -187 28 -281 144 -282
526 -1 665 l60 30 233 3 232 4 0 499 0 499 -6500 0 -6500 0 0 -499z m2790
-1046 l0 -1145 -685 0 -685 0 0 1145 0 1145 685 0 685 0 0 -1145z m1760 0 l0
-1145 -685 0 -685 0 0 1145 0 1145 685 0 685 0 0 -1145z m1760 0 l0 -1145
-685 0 -685 0 0 1145 0 1145 685 0 685 0 0 -1145z m1755 0 l0 -1140 -687 -3
-688 -2 0 1145 0 1145 688 -2 687 -3 0 -1140z m1755 0 l0 -1145 -685 0 -685 0
0 1145 0 1145 685 0 685 0 0 -1145z m1760 0 l0 -1145 -685 0 -685 0 0 1145 0
1145 685 0 685 0 0 -1145z m-10512 -1817 l-3 -243 -162 -3 -163 -2 0 245 0
245 165 0 165 0 -2 -242z m510 0 l-3 -243 -162 -3 -163 -2 0 245 0 245 165 0
165 0 -2 -242z m507 -3 l0 -240 -162 -3 -163 -2 0 245 0 245 163 -2 162 -3 0
-240z m505 0 l0 -245 -160 0 -160 0 0 245 0 245 160 0 160 0 0 -245z m510 0
l0 -245 -160 0 -160 0 0 245 0 245 160 0 160 0 0 -245z m510 0 l0 -245 -160 0
-160 0 0 245 0 245 160 0 160 0 0 -245z m510 0 l0 -245 -162 2 -163 3 -3 230
c-1 126 0 235 2 242 4 10 45 13 166 13 l160 0 0 -245z m510 0 l0 -245 -162 2
-163 3 -3 230 c-1 126 0 235 2 242 4 10 45 13 166 13 l160 0 0 -245z m505 0
l0 -240 -162 -3 -163 -2 0 245 0 245 163 -2 162 -3 0 -240z m510 0 l0 -240
-162 -3 -163 -2 0 245 0 245 163 -2 162 -3 0 -240z m2035 0 l0 -245 -160 0
-160 0 0 245 0 245 160 0 160 0 0 -245z m505 0 l0 -240 -162 -3 -163 -2 0 245
0 245 163 -2 162 -3 0 -240z m515 0 l0 -245 -162 2 -163 3 -3 230 c-1 126 0
235 2 242 4 10 45 13 166 13 l160 0 0 -245z m508 3 l-3 -243 -162 -3 -163 -2
0 245 0 245 165 0 165 0 -2 -242z m505 215 c0 -13 -1 -122 -2 -243 l-1 -220
-160 0 -160 0 0 245 0 245 162 -2 c161 -3 162 -3 161 -25z m507 -218 l0 -245
-160 0 -160 0 0 245 0 245 160 0 160 0 0 -245z m510 0 l0 -245 -160 0 -160 0
0 245 0 245 160 0 160 0 0 -245z m510 0 l0 -245 -160 0 -160 0 0 245 0 245
160 0 160 0 0 -245z m510 0 l0 -245 -162 2 -163 3 -3 230 c-1 126 0 235 2 242
4 10 45 13 166 13 l160 0 0 -245z m510 0 l0 -245 -162 2 -163 3 -3 230 c-1
126 0 235 2 242 4 10 45 13 166 13 l160 0 0 -245z m-5627 142 c24 -14 58 -42
76 -62 60 -69 65 -89 69 -327 l4 -218 -281 0 -281 0 0 185 c0 101 5 206 11
234 19 92 90 175 176 207 60 23 171 13 226 -19z"/>
</g>
</svg>
File diff suppressed because one or more lines are too long
+271
View File
@@ -0,0 +1,271 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="1013.000000pt" height="1013.000000pt" viewBox="0 0 1013.000000 1013.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,1013.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M167 6653 c-4 -3 -7 -262 -7 -575 l0 -568 28 0 c16 0 57 -14 91 -31
96 -48 141 -122 141 -233 0 -121 -78 -218 -201 -249 l-54 -14 0 -569 0 -569
4690 0 4690 0 3 21 c2 12 17 34 33 50 l30 29 220 3 219 3 0 205 0 204 -221 0
-221 0 -29 29 c-35 36 -41 80 -16 129 23 47 50 52 277 52 l210 0 0 989 c0 892
-2 989 -16 995 -9 3 -109 6 -223 6 l-207 0 -26 28 c-14 15 -28 36 -30 47 -3
20 -12 20 -4689 23 -2577 1 -4689 -1 -4692 -5z m9059 -199 c19 -9 44 -31 57
-48 l22 -31 0 -1085 0 -1085 -22 -31 c-49 -69 82 -64 -1703 -64 -1785 0 -1654
-5 -1703 64 l-22 31 0 1085 0 1085 22 31 c49 68 -84 64 1701 64 1469 0 1617
-1 1648 -16z m759 -19 l0 -30 -130 0 c-117 0 -130 2 -133 18 -9 45 0 48 135
45 l128 -3 0 -30z m-9115 -61 c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3
37 -1 42 17 42 18 0 21 -6 21 -46z m110 0 c0 -38 -3 -45 -17 -42 -13 2 -19 15
-21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 0 c0 -38 -3 -45 -17 -42
-13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 1 c0 -38 -3
-45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m108 3
c-2 -31 -8 -44 -20 -46 -15 -3 -18 4 -18 42 0 40 3 46 21 46 18 0 20 -5 17
-42z m110 0 c-2 -30 -8 -44 -19 -46 -13 -2 -18 7 -21 35 -6 46 -3 53 23 53 17
0 20 -6 17 -42z m110 0 c-2 -35 -7 -43 -23 -43 -16 0 -21 8 -23 43 -3 39 -2
42 23 42 25 0 26 -3 23 -42z m107 -3 c0 -33 -3 -40 -20 -40 -16 0 -21 8 -23
43 -3 40 -2 43 20 40 20 -3 23 -9 23 -43z m105 -1 c0 -38 -3 -45 -17 -42 -13
2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 1 c0 -38 -3 -45
-20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m110 -1 c0
-38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z
m650 0 c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21
-6 21 -46z m110 0 c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17
42 18 0 21 -6 21 -46z m108 4 c-2 -31 -8 -44 -20 -46 -15 -3 -18 4 -18 42 0
40 3 46 21 46 18 0 20 -5 17 -42z m112 -3 c0 -38 -3 -45 -20 -45 -17 0 -20 7
-20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m108 3 c-2 -31 -8 -44 -20 -46 -15
-3 -18 4 -18 42 0 40 3 46 21 46 18 0 20 -5 17 -42z m110 0 c-2 -31 -8 -44
-20 -46 -15 -3 -18 4 -18 42 0 40 3 46 21 46 18 0 20 -5 17 -42z m110 0 c-2
-31 -8 -44 -20 -46 -15 -3 -18 4 -18 42 0 40 3 46 21 46 18 0 20 -5 17 -42z
m110 0 c-2 -31 -8 -44 -20 -46 -15 -3 -18 4 -18 42 0 40 3 46 21 46 18 0 20
-5 17 -42z m107 -3 c0 -33 -3 -40 -20 -40 -15 0 -21 8 -23 28 -5 39 5 59 25
55 14 -2 18 -13 18 -43z m105 -1 c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46
-3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 0 c0 -38 -3 -45 -17 -42 -13 2 -19
15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m650 0 c0 -38 -3 -45 -17 -42
-13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 0 c0 -38 -3
-45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 0
c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21
-46z m110 0 c0 -38 -3 -45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18
0 21 -6 21 -46z m110 1 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45
20 45 17 0 20 -7 20 -45z m108 3 c-2 -31 -8 -44 -20 -46 -15 -3 -18 4 -18 42
0 40 3 46 21 46 18 0 20 -5 17 -42z m110 0 c-2 -35 -7 -43 -23 -43 -15 0 -21
8 -23 28 -5 40 4 57 28 57 19 0 21 -5 18 -42z m107 -3 c0 -33 -3 -40 -20 -40
-16 0 -21 8 -23 43 -3 40 -2 43 20 40 20 -3 23 -9 23 -43z m105 -1 c0 -38 -3
-45 -17 -42 -13 2 -19 15 -21 46 -3 37 -1 42 17 42 18 0 21 -6 21 -46z m110 1
c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z
m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7
20 -45z m4546 -50 c13 -52 5 -55 -131 -55 -136 0 -144 3 -131 55 6 25 6 25
131 25 125 0 125 0 131 -25z m-7958 -31 l22 -6 0 -999 0 -999 -652 2 -653 3
-3 1003 -2 1002 632 0 c348 0 643 -3 656 -6z m1764 -22 c9 -32 8 -1957 -1
-1970 -6 -9 -149 -12 -657 -10 l-649 3 -3 985 c-1 542 0 991 3 998 3 9 143 12
654 12 622 0 649 -1 653 -18z m1738 -982 l0 -1000 -652 2 -653 3 -3 985 c-1
542 0 991 3 998 3 9 144 12 655 12 l650 0 0 -1000z m4451 923 c6 -6 9 -21 7
-34 -3 -24 -4 -24 -133 -24 l-130 0 0 30 c0 30 1 30 65 36 92 8 179 4 191 -8z
m-9281 -33 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45
-3 45 -20z m1480 0 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20
38 0 45 -3 45 -20z m260 -1 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4
17 42 17 40 0 46 -3 46 -21z m1480 0 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46
21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m260 0 c0 -18 -5 -20 -42 -17 -31 2
-44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1480 0 c0 -18 -5 -20 -42
-17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m-4962 -97 c3
-22 0 -23 -40 -20 -31 2 -44 8 -46 20 -2 12 5 18 25 21 46 7 58 3 61 -21z
m1475 19 c4 -1 7 -10 7 -21 0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 19 0 11 8
21 18 23 15 3 26 3 65 -1z m265 -18 c3 -21 -1 -23 -37 -23 -42 0 -57 11 -47
36 4 11 17 14 43 12 31 -2 39 -7 41 -25z m1480 -1 c3 -19 -1 -22 -37 -22 -41
0 -57 11 -48 34 3 7 20 12 43 11 32 -2 40 -6 42 -23z m246 22 c9 -3 16 -15 16
-25 0 -16 -7 -19 -40 -19 -28 0 -43 5 -47 16 -10 26 32 43 71 28z m1494 -23
c3 -20 0 -22 -40 -19 -30 2 -44 8 -46 20 -2 11 5 18 20 21 43 7 63 1 66 -22z
m4327 -21 l0 -35 -130 0 c-128 0 -130 0 -133 23 -7 51 -2 53 135 50 l128 -3 0
-35z m-9285 -75 c0 -22 -4 -25 -39 -25 -42 0 -57 11 -47 35 3 10 20 15 46 15
36 0 40 -2 40 -25z m1480 0 c0 -22 -4 -25 -39 -25 -42 0 -57 11 -47 35 3 10
20 15 46 15 36 0 40 -2 40 -25z m260 0 c0 -22 -4 -25 -39 -25 -42 0 -57 11
-47 35 3 10 20 15 46 15 36 0 40 -2 40 -25z m1480 0 c0 -22 -4 -25 -39 -25
-42 0 -57 11 -47 35 3 10 20 15 46 15 36 0 40 -2 40 -25z m260 0 c0 -22 -4
-25 -39 -25 -42 0 -57 11 -47 35 3 10 20 15 46 15 36 0 40 -2 40 -25z m1480 0
c0 -22 -4 -25 -39 -25 -42 0 -57 11 -47 35 3 10 20 15 46 15 36 0 40 -2 40
-25z m4325 -50 l0 -30 -130 0 c-117 0 -130 2 -133 18 -9 45 0 48 135 45 l128
-3 0 -30z m-9287 -47 c-2 -17 -10 -24 -33 -26 -37 -3 -60 11 -52 32 4 11 19
16 47 16 37 0 41 -2 38 -22z m1480 0 c-2 -18 -11 -24 -37 -26 -38 -4 -57 9
-48 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m260 0 c-2 -18 -11 -24 -37 -26
-38 -4 -57 9 -48 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m1477 -3 c0 -15 -8
-21 -34 -23 -38 -4 -57 9 -47 33 4 12 16 15 43 13 30 -2 38 -7 38 -23z m263 3
c-2 -17 -10 -24 -33 -26 -37 -3 -60 11 -52 32 4 11 19 16 47 16 37 0 41 -2 38
-22z m1477 -3 c0 -15 -8 -21 -34 -23 -38 -4 -57 9 -47 33 4 12 16 15 43 13 30
-2 38 -7 38 -23z m4331 -60 c13 -53 6 -56 -133 -53 -125 3 -128 3 -131 26 -7
50 -1 52 132 52 126 0 126 0 132 -25z m-9291 -40 c0 -15 -8 -21 -34 -23 -38
-4 -57 9 -47 33 4 12 16 15 43 13 30 -2 38 -7 38 -23z m1480 0 c0 -15 -8 -21
-34 -23 -38 -4 -57 9 -47 33 4 12 16 15 43 13 30 -2 38 -7 38 -23z m265 0 c0
-22 -4 -25 -39 -25 -42 0 -57 11 -47 35 3 10 20 15 46 15 36 0 40 -2 40 -25z
m1475 0 c0 -15 -8 -21 -34 -23 -38 -4 -57 9 -47 33 4 12 16 15 43 13 30 -2 38
-7 38 -23z m260 0 c0 -15 -8 -21 -34 -23 -38 -4 -57 9 -47 33 4 12 16 15 43
13 30 -2 38 -7 38 -23z m1480 0 c0 -15 -8 -21 -34 -23 -38 -4 -57 9 -47 33 4
12 16 15 43 13 30 -2 38 -7 38 -23z m4325 -69 c6 -8 10 -25 8 -38 -3 -23 -5
-23 -133 -23 l-130 0 -3 24 c-6 41 20 51 139 51 81 0 109 -3 119 -14z m-9280
-26 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38
-20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0
38 -3 38 -20z m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52
27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21
11 27 52 27 31 0 38 -3 38 -20z m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45
13 0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0
-45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m-4960 -100 c0 -17 -7 -20
-45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0
-17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z
m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3
38 -20z m1478 -2 c3 -15 -4 -18 -42 -18 -32 0 -46 4 -46 13 0 22 12 28 50 25
24 -2 36 -9 38 -20z m262 2 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11
27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45
13 0 21 11 27 52 27 31 0 38 -3 38 -20z m4328 -18 c6 -42 -11 -49 -123 -51
-59 -1 -113 3 -125 9 -19 10 -27 49 -13 64 4 3 63 5 132 4 123 -3 126 -4 129
-26z m-9288 -82 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38
0 45 -3 45 -20z m1480 0 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20
45 20 38 0 45 -3 45 -20z m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0
21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -39 -20 -40 0 -57
11 -46 30 3 6 24 10 46 10 32 0 39 -3 39 -20z m260 0 c0 -17 -7 -20 -45 -20
-31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7
-20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m4325
-55 l0 -30 -130 0 c-117 0 -130 2 -133 18 -9 45 0 48 135 45 l128 -3 0 -30z
m-9285 -45 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45
-3 45 -20z m1480 0 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20
38 0 45 -3 45 -20z m260 -1 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4
17 42 17 40 0 46 -3 46 -21z m1480 1 c0 -17 -7 -20 -39 -20 -40 0 -57 11 -46
30 3 6 24 10 46 10 32 0 39 -3 39 -20z m260 0 c0 -17 -7 -20 -45 -20 -38 0
-45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m1480 0 c0 -17 -7 -20 -45
-20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m4328 -68 c7 -45
-12 -52 -128 -52 -60 0 -115 3 -124 6 -16 6 -22 54 -9 68 4 3 63 5 132 4 123
-3 126 -4 129 -26z m-9288 -33 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3
14 4 17 42 17 40 0 46 -3 46 -21z m1480 1 c0 -17 -7 -20 -45 -20 -38 0 -45 3
-45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m260 -1 c0 -18 -5 -20 -42 -17 -31
2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1480 0 c0 -18 -5 -20
-42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m260 0 c0
-18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z
m1480 0 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46
-3 46 -21z m4320 -73 c6 -8 10 -25 8 -38 -3 -23 -5 -23 -133 -23 -128 0 -130
0 -133 23 -7 45 12 52 133 52 86 0 115 -3 125 -14z m-9280 -27 c0 -18 -5 -20
-42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1480 1 c0
-17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z
m260 -1 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46
-3 46 -21z m1480 0 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42
17 40 0 46 -3 46 -21z m260 0 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14
4 17 42 17 40 0 46 -3 46 -21z m1480 1 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45
20 0 17 7 20 45 20 38 0 45 -3 45 -20z m-4960 -100 c0 -17 -7 -20 -45 -20 -38
0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m1480 0 c0 -17 -7 -20 -45
-20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m260 0 c0 -17 -7
-20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m1480 0
c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z
m260 0 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3
45 -20z m1480 0 c0 -17 -7 -20 -45 -20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38
0 45 -3 45 -20z m4325 -25 l0 -30 -130 0 c-117 0 -130 2 -133 18 -9 45 0 48
135 45 l128 -3 0 -30z m-6065 -76 c0 -15 -7 -19 -39 -19 -41 0 -57 11 -48 33
3 8 19 11 46 9 32 -3 41 -8 41 -23z m-3220 0 c0 -18 -5 -20 -42 -17 -31 2 -44
8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1480 1 c0 -17 -7 -20 -45 -20
-38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m260 -1 c0 -18 -5 -20
-42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1740 0 c0
-18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z
m1480 0 c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46
-3 46 -21z m4325 -54 l0 -30 -130 0 c-117 0 -130 2 -133 18 -9 45 0 48 135 45
l128 -3 0 -30z m-6065 -46 c0 -15 -7 -19 -39 -19 -41 0 -57 11 -48 33 3 8 19
11 46 9 32 -3 41 -8 41 -23z m1740 0 c0 -17 -6 -20 -42 -17 -31 2 -44 8 -46
20 -2 13 5 17 35 20 47 4 53 2 53 -23z m-4960 0 c0 -18 -5 -20 -42 -17 -31 2
-44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1480 0 c0 -18 -5 -20 -42
-17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m260 0 c0 -18 -5
-20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z m1740 0
c0 -18 -5 -20 -42 -17 -31 2 -44 8 -46 21 -3 14 4 17 42 17 40 0 46 -3 46 -21z
m5808 -67 c7 -45 -12 -52 -132 -52 -74 0 -116 4 -124 12 -13 13 -16 51 -5 62
4 3 63 5 132 4 123 -3 126 -4 129 -26z m-9290 -24 c-2 -18 -11 -24 -37 -26
-38 -4 -57 9 -48 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m1480 0 c-2 -18 -11
-24 -37 -26 -38 -4 -57 9 -48 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m262 -3
c0 -22 -4 -25 -39 -25 -42 0 -57 11 -47 35 3 10 20 15 46 15 36 0 40 -2 40
-25z m1478 3 c-2 -18 -11 -24 -37 -26 -38 -4 -57 9 -48 32 4 11 19 16 47 16
37 0 41 -2 38 -22z m260 0 c-2 -17 -10 -24 -33 -26 -37 -3 -60 11 -52 32 4 11
19 16 47 16 37 0 41 -2 38 -22z m1480 0 c-2 -18 -11 -24 -37 -26 -38 -4 -57 9
-48 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m4328 -83 c4 -8 3 -26 0 -40 l-7
-26 -127 3 -127 3 -3 29 c-2 16 2 32 10 37 7 5 66 9 131 9 95 0 119 -3 123
-15z m-9286 -14 c0 -12 -9 -20 -26 -24 -34 -6 -64 2 -64 17 0 20 11 26 52 26
31 0 38 -4 38 -19z m1478 -3 c-2 -18 -11 -24 -37 -26 -38 -4 -57 9 -48 32 4
11 19 16 47 16 37 0 41 -2 38 -22z m260 0 c-2 -17 -10 -24 -33 -26 -37 -3 -60
11 -52 32 4 11 19 16 47 16 37 0 41 -2 38 -22z m1480 0 c2 -12 -6 -19 -33 -24
-40 -7 -61 5 -51 31 8 23 80 17 84 -7z m260 0 c-2 -16 -11 -23 -33 -25 -37 -4
-60 10 -52 31 4 11 19 16 47 16 37 0 41 -2 38 -22z m1477 -3 c0 -16 -7 -20
-37 -22 -40 -2 -53 8 -44 33 4 11 17 14 43 12 30 -2 38 -7 38 -23z m-4955 -95
c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z
m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38
-3 38 -20z m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27
31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11
27 52 27 31 0 38 -3 38 -20z m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13
0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45
4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m-4960 -100 c0 -17 -7 -20 -45
-20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0 c0 -17
-7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m260
0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38
-20z m1478 -2 c3 -15 -4 -18 -42 -18 -32 0 -46 4 -46 13 0 22 12 28 50 25 24
-2 36 -9 38 -20z m262 2 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27
52 27 31 0 38 -3 38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0
21 11 27 52 27 31 0 38 -3 38 -20z m-4960 -100 c0 -17 -7 -20 -45 -20 -38 0
-45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m1480 0 c0 -17 -7 -20 -45
-20 -38 0 -45 3 -45 20 0 17 7 20 45 20 38 0 45 -3 45 -20z m260 0 c0 -17 -7
-20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3 38 -20z m1480 0
c0 -17 -7 -20 -39 -20 -40 0 -57 11 -46 30 3 6 24 10 46 10 32 0 39 -3 39 -20z
m260 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27 31 0 38 -3
38 -20z m1480 0 c0 -17 -7 -20 -45 -20 -31 0 -45 4 -45 13 0 21 11 27 52 27
31 0 38 -3 38 -20z m4320 -94 c6 -8 10 -25 8 -38 -3 -23 -5 -23 -133 -23 -128
0 -130 0 -133 23 -7 45 12 52 133 52 86 0 115 -3 125 -14z m-9110 -101 c0 -38
-3 -45 -20 -45 -17 0 -20 7 -20 38 0 41 6 52 27 52 9 0 13 -14 13 -45z m110 0
c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z
m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7
20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17
0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45
20 45 17 0 20 -7 20 -45z m108 -3 c3 -36 0 -42 -16 -42 -15 0 -21 9 -25 37 -7
42 -2 55 21 51 12 -2 18 -16 20 -46z m107 3 c0 -33 -3 -40 -20 -40 -15 0 -21
8 -23 28 -5 39 5 59 25 55 14 -2 18 -13 18 -43z m110 0 c0 -34 -3 -40 -22 -43
-21 -3 -23 1 -23 36 0 43 7 54 30 50 10 -2 15 -15 15 -43z m105 0 c0 -38 -3
-45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m110 0 c0
-38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z
m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7
20 -45z m650 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17
0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45
20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0
38 3 45 20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7
-20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17
0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20
-45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m105 0 c0 -30 -4
-41 -17 -43 -15 -3 -18 4 -18 43 0 39 3 46 18 43 13 -2 17 -13 17 -43z m110 0
c0 -30 -4 -41 -17 -43 -15 -3 -18 4 -18 43 0 39 3 46 18 43 13 -2 17 -13 17
-43z m110 0 c0 -33 -3 -40 -20 -40 -15 0 -21 8 -23 28 -5 39 5 59 25 55 14 -2
18 -13 18 -43z m105 -1 c0 -38 -3 -45 -17 -42 -32 6 -30 88 2 88 11 0 15 -11
15 -46z m110 1 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17
0 20 -7 20 -45z m650 -1 c0 -38 -3 -45 -17 -42 -32 6 -30 88 2 88 11 0 15 -11
15 -46z m110 1 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 38 0 41 6 52 27 52 9 0
13 -14 13 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20
45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38
3 45 20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20
45 0 38 3 45 20 45 17 0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0
-20 7 -20 45 0 38 3 45 20 45 17 0 20 -7 20 -45z m105 0 c0 -33 -3 -40 -20
-40 -15 0 -21 8 -23 28 -5 39 5 59 25 55 14 -2 18 -13 18 -43z m110 0 c0 -33
-3 -40 -20 -40 -15 0 -21 8 -23 28 -5 39 5 59 25 55 14 -2 18 -13 18 -43z
m105 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 38 0 41 6 52 27 52 9 0 13 -14
13 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45 20 45 17
0 20 -7 20 -45z m110 0 c0 -38 -3 -45 -20 -45 -17 0 -20 7 -20 45 0 38 3 45
20 45 17 0 20 -7 20 -45z m4548 -46 c5 -43 -15 -50 -144 -47 -116 3 -119 4
-122 26 -7 51 -2 53 135 50 l128 -3 3 -26z m-2 -114 c13 -53 6 -56 -133 -53
-125 3 -128 3 -131 26 -7 50 -1 52 132 52 126 0 126 0 132 -25z"/>
<path d="M6090 5300 l0 -480 85 0 85 0 0 332 c0 188 4 328 9 323 8 -9 107
-286 198 -552 l35 -103 109 0 109 0 0 480 0 480 -85 0 -85 0 0 -315 c0 -173
-4 -315 -8 -315 -8 0 -55 125 -177 475 l-53 150 -111 3 -111 3 0 -481z"/>
<path d="M6800 5772 c0 -4 23 -106 50 -227 28 -121 76 -330 106 -465 31 -135
58 -248 61 -252 2 -5 59 -8 127 -8 l123 0 51 228 c28 125 76 337 107 471 30
134 55 247 55 252 0 5 -44 9 -99 9 l-98 0 -68 -345 c-38 -190 -71 -345 -75
-345 -3 0 -34 152 -69 338 -35 185 -65 340 -68 345 -6 10 -203 9 -203 -1z"/>
<path d="M7560 5300 l0 -480 90 0 90 0 1 368 c0 225 4 359 9 347 5 -11 25 -96
45 -190 20 -93 54 -248 76 -343 21 -96 39 -176 39 -178 0 -2 35 -4 78 -4 l77
0 79 358 c43 196 82 364 87 372 5 8 9 -151 9 -357 l0 -373 90 0 90 0 -2 478
-3 477 -142 3 c-128 2 -142 1 -147 -15 -8 -27 -62 -289 -96 -468 -18 -88 -36
-164 -41 -169 -5 -6 -9 -7 -9 -3 0 10 -120 619 -126 640 -5 15 -21 17 -150 17
l-144 0 0 -480z"/>
<path d="M8683 5544 c-57 -21 -118 -89 -138 -156 -9 -29 -19 -102 -22 -163
-10 -199 27 -328 111 -384 35 -23 52 -26 139 -29 54 -2 114 -1 133 3 72 13
140 101 151 196 l6 49 -87 0 -86 0 0 -27 c0 -40 -35 -91 -66 -99 -70 -18 -114
40 -114 148 l0 68 178 2 177 3 0 100 c-1 164 -52 263 -151 293 -55 16 -179 14
-231 -4z m184 -140 c9 -15 19 -53 21 -85 l4 -59 -92 0 -92 0 4 60 c6 79 33
110 95 110 35 0 46 -5 60 -26z"/>
</g>
</svg>
+52
View File
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1080" height="1080" viewBox="0 0 1080 1080" xml:space="preserve">
<desc>Created with Fabric.js 5.2.4</desc>
<defs>
</defs>
<g transform="matrix(1 0 0 1 540 540)" id="67f78da0-5e9d-4333-b8b9-8faaa9c6791d" >
<rect style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: nonzero; opacity: 1; visibility: hidden;" vector-effect="non-scaling-stroke" x="-540" y="-540" rx="0" ry="0" width="1080" height="1080" />
</g>
<g transform="matrix(1 0 0 1 540 540)" id="6fd75371-cd76-47c5-a752-7df1f9cbc828" >
</g>
<g transform="matrix(1 0 0 1 540 540)" >
<g style="" vector-effect="non-scaling-stroke" >
<g transform="matrix(0.13 0 0 -0.13 -179.33 0)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-3655, -5802.99)" d="M 3650 9084 C 2360 8868 1304 8691 1303 8691 C 1301 8690 1300 7435 1300 5900 L 1300 3110 L 1348 3110 C 1374 3110 2253 3074 3303 3030 C 4818 2967 5216 2947 5238 2936 C 5346 2879 5367 2745 5279 2665 C 5258 2646 5228 2627 5213 2624 C 5188 2617 1547 2762 1373 2776 L 1300 2782 L 1300 2611 C 1300 2517 1301 2440 1303 2439 C 1317 2435 5997 2124 6003 2127 C 6007 2129 6010 3785 6010 5806 C 6010 7827 6007 9479 6003 9479 C 5998 9478 4940 9301 3650 9084 z M 5715 8659 C 5798 8636 5852 8550 5836 8465 C 5828 8422 5777 8362 5733 8344 C 5682 8322 5485 8326 5434 8349 C 5298 8411 5314 8617 5459 8660 C 5499 8672 5670 8671 5715 8659 z M 3976 8296 C 4317 8225 4608 8066 4884 7800 C 5296 7402 5556 6854 5646 6195 C 5673 5996 5671 5562 5643 5380 C 5563 4868 5398 4457 5128 4092 C 5049 3985 4857 3784 4755 3700 C 4587 3563 4353 3433 4161 3371 C 3979 3312 3867 3295 3650 3296 C 3436 3296 3345 3310 3151 3371 C 2722 3507 2309 3856 2038 4312 C 1842 4644 1721 5006 1664 5435 C 1639 5619 1639 6028 1663 6200 C 1715 6568 1804 6861 1956 7160 C 2073 7391 2199 7567 2380 7754 C 2685 8068 3033 8254 3434 8315 C 3572 8337 3822 8327 3976 8296 z M 2066 8134 C 2120 8094 2135 8064 2135 7995 C 2135 7924 2118 7892 2060 7853 C 2030 7832 2015 7830 1898 7830 C 1750 7830 1717 7840 1675 7894 C 1609 7981 1646 8112 1750 8153 C 1758 8156 1827 8158 1902 8157 C 2022 8155 2042 8153 2066 8134 z M 2066 3764 C 2120 3724 2135 3694 2135 3625 C 2135 3556 2120 3526 2066 3486 C 2041 3467 2024 3465 1892 3465 C 1754 3465 1743 3466 1712 3488 C 1672 3517 1640 3577 1640 3625 C 1640 3689 1689 3759 1750 3783 C 1758 3786 1827 3788 1902 3787 C 2022 3785 2042 3783 2066 3764 z M 5752 3604 C 5767 3596 5791 3574 5806 3555 C 5866 3476 5839 3359 5750 3312 C 5708 3290 5695 3289 5574 3292 C 5448 3295 5442 3296 5406 3324 C 5291 3411 5334 3592 5477 3621 C 5531 3631 5720 3620 5752 3604 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -124.6 -197.7)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-4065.48, -7285.68)" d="M 3707 7883 C 3582 7585 3519 7276 3518 6965 C 3517 6800 3536 6594 3552 6584 C 3557 6580 3585 6581 3613 6584 L 3665 6591 L 3722 6708 C 3893 7060 4179 7362 4519 7552 L 4613 7604 L 4569 7642 C 4364 7821 4072 7951 3804 7984 L 3752 7990 L 3707 7883 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -272.27 -179.3)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-2958, -7147.72)" d="M 3241 7924 C 3028 7854 2842 7737 2656 7559 L 2546 7453 L 2559 7374 C 2588 7199 2676 6939 2767 6755 C 2825 6639 2943 6455 3008 6381 L 3047 6337 L 3104 6383 C 3135 6409 3174 6437 3190 6445 C 3225 6463 3225 6465 3203 6601 C 3182 6734 3179 7131 3198 7270 C 3227 7471 3288 7726 3346 7879 C 3359 7914 3370 7946 3370 7951 C 3370 7965 3352 7961 3241 7924 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -46.09 -131.01)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-4654.36, -6785.5)" d="M 4749 7299 C 4496 7177 4248 6948 4098 6700 C 4032 6590 3996 6516 4008 6512 C 4029 6505 4137 6437 4185 6400 L 4235 6362 L 4325 6383 C 4459 6413 4736 6412 4876 6382 C 4991 6357 5151 6304 5242 6260 L 5303 6231 L 5296 6283 C 5276 6437 5194 6713 5114 6895 C 5042 7059 4873 7340 4845 7340 C 4839 7340 4796 7322 4749 7299 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -344.4 -67.06)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-2417, -6305.89)" d="M 2222 6940 C 2072 6629 1987 6268 1978 5910 L 1976 5805 L 2029 5768 C 2158 5678 2358 5594 2515 5565 C 2595 5550 2794 5541 2805 5551 C 2807 5554 2805 5594 2800 5640 C 2788 5744 2801 5871 2834 5974 L 2858 6049 L 2832 6072 C 2784 6117 2656 6276 2597 6365 C 2511 6496 2398 6732 2336 6910 L 2282 7065 L 2222 6940 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -179.05 10.2)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-3657.14, -5726.48)" d="M 3543 6240 C 3382 6208 3224 6067 3163 5900 C 3139 5835 3135 5812 3136 5720 C 3138 5569 3180 5464 3280 5361 C 3483 5152 3820 5150 4026 5356 C 4135 5465 4188 5604 4177 5755 C 4167 5895 4118 6002 4021 6099 C 3899 6221 3718 6274 3543 6240 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -13.2 65.1)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-4901, -5314.68)" d="M 4464 6064 C 4456 6061 4460 6036 4476 5985 C 4511 5873 4524 5749 4510 5638 C 4504 5587 4497 5544 4495 5541 C 4492 5539 4514 5509 4543 5476 C 4729 5262 4879 4995 4977 4703 C 5003 4624 5028 4560 5031 4560 C 5039 4560 5127 4755 5170 4865 C 5260 5101 5317 5389 5335 5697 L 5342 5809 L 5293 5844 C 5172 5934 4929 6034 4767 6060 C 4705 6070 4485 6073 4464 6064 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -316.67 129.85)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-2625, -4829.11)" d="M 2010 5372 C 2010 5364 2021 5303 2035 5236 C 2078 5023 2175 4750 2272 4570 C 2333 4458 2452 4280 2467 4280 C 2490 4280 2671 4375 2747 4426 C 2859 4503 2976 4607 3058 4705 C 3131 4791 3240 4949 3240 4967 C 3240 4971 3213 4992 3181 5013 C 3122 5051 3024 5140 2978 5197 L 2952 5229 L 2889 5220 C 2647 5185 2321 5239 2080 5354 C 2026 5379 2010 5384 2010 5372 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -85.99 183.36)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-4355.05, -4427.75)" d="M 4292 5151 C 4270 5125 4220 5079 4181 5049 L 4110 4996 L 4118 4955 C 4122 4933 4125 4803 4125 4665 C 4125 4331 4093 4131 3989 3816 C 3962 3734 3942 3664 3945 3662 C 3954 3653 4147 3720 4240 3765 C 4390 3838 4522 3932 4652 4058 C 4744 4147 4769 4177 4765 4194 C 4693 4548 4575 4851 4421 5083 C 4381 5141 4346 5192 4341 5194 C 4336 5197 4314 5178 4292 5151 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 -233.78 206.39)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-3246.68, -4255.03)" d="M 3768 4874 C 3765 4871 3719 4868 3666 4868 L 3571 4868 L 3510 4768 C 3354 4510 3154 4301 2905 4137 C 2856 4105 2788 4064 2755 4048 L 2696 4018 L 2740 3979 C 2873 3864 3070 3753 3244 3695 C 3341 3663 3545 3622 3556 3633 C 3567 3644 3639 3820 3670 3910 C 3760 4180 3809 4513 3795 4763 C 3788 4870 3784 4890 3768 4874 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 336 0.6)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-7520, -5798.45)" d="M 6340 5801 C 6340 3782 6343 2129 6348 2127 C 6352 2125 6877 2156 7515 2196 C 8153 2236 8681 2269 8688 2270 C 8697 2270 8700 2953 8700 5649 C 8700 8859 8699 9029 8683 9034 C 8658 9041 6366 9470 6352 9470 C 6343 9470 6340 8580 6340 5801 z M 6929 8979 C 6978 8949 6998 8922 7010 8865 C 7018 8829 7020 7955 7018 5774 L 7015 2734 L 6990 2697 C 6915 2588 6752 2597 6699 2714 C 6681 2754 6680 2852 6680 5810 L 6680 8866 L 6703 8910 C 6744 8993 6853 9026 6929 8979 z M 7906 8744 C 8258 8655 8292 8643 8334 8587 C 8355 8559 8355 8554 8358 7671 L 8360 6784 L 8337 6740 C 8321 6710 8300 6689 8270 6673 C 8227 6650 8224 6650 7858 6650 C 7569 6650 7482 6653 7457 6664 C 7414 6681 7373 6731 7360 6780 C 7353 6806 7350 7130 7352 7768 L 7355 8716 L 7381 8756 C 7413 8804 7460 8829 7518 8830 C 7541 8830 7716 8791 7906 8744 z M 7619 6280 C 7637 6268 7661 6239 7671 6216 C 7689 6177 7690 6111 7690 4466 L 7690 2756 L 7669 2713 C 7641 2656 7600 2627 7534 2622 C 7470 2617 7410 2646 7377 2700 L 7355 2735 L 7355 4466 L 7355 6196 L 7381 6236 C 7396 6259 7423 6284 7441 6294 C 7489 6318 7576 6311 7619 6280 z M 8270 6295 C 8286 6287 8312 6263 8327 6243 L 8355 6207 L 8355 4465 L 8355 2723 L 8326 2686 C 8249 2585 8101 2601 8041 2717 C 8033 2733 8030 3205 8030 4465 C 8030 6331 8026 6216 8082 6266 C 8094 6278 8114 6292 8125 6298 C 8154 6314 8236 6312 8270 6295 z" stroke-linecap="round" />
</g>
<g transform="matrix(0.13 0 0 -0.13 381.27 -255.61)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-7859.5, -7720)" d="M 7690 7720 L 7690 6990 L 7860 6990 L 8029 6990 L 8027 7674 C 8026 8050 8022 8361 8018 8365 C 8012 8371 7717 8449 7698 8450 C 7693 8450 7690 8122 7690 7720 z" stroke-linecap="round" />
</g>
</g>
</g>
</svg>
@@ -0,0 +1,262 @@
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="494.000000pt" height="555.000000pt" viewBox="0 0 494.000000 555.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,555.000000) scale(0.100000,-0.100000)">
<path d="M3090 3400 l0 -1950 -1190 0 -1190 0 0 234 c0 190 3 236 14 245 23
19 164 30 606 46 228 9 485 20 570 25 134 9 895 40 965 40 23 0 25 -4 25 -44
l0 -44 -82 -6 c-46 -3 -146 -8 -223 -11 -77 -3 -239 -12 -360 -20 -121 -8
-335 -19 -475 -25 -387 -15 -650 -32 -650 -41 0 -12 196 -11 515 1 257 10
1267 32 1271 27 7 -9 12 -74 6 -84 -7 -11 -190 -21 -777 -43 -437 -16 -748
-30 -777 -36 -16 -3 -28 -10 -28 -15 0 -13 837 -11 1237 2 360 12 343 15 343
-53 0 -36 -1 -37 -42 -42 -24 -3 -182 -8 -353 -11 -501 -10 -923 -31 -907 -47
4 -4 315 -7 690 -6 l682 3 -1 1445 c-1 795 -3 1488 -3 1540 -1 52 -2 249 -4
437 l-2 343 -23 5 c-23 6 -39 -1 -417 -200 -107 -56 -242 -127 -300 -157 -151
-80 -311 -164 -415 -218 -49 -26 -133 -70 -185 -97 -99 -53 -146 -77 -450
-238 -378 -199 -494 -265 -467 -265 3 0 134 64 293 143 159 79 381 188 494
243 113 54 440 216 727 360 494 248 613 303 613 285 0 -7 -59 -49 -135 -96
-66 -42 -219 -120 -875 -449 -377 -188 -741 -375 -810 -413 -69 -39 -150 -83
-180 -99 -32 -16 -48 -29 -39 -31 8 -2 57 17 107 42 51 25 94 45 96 45 2 0 95
44 207 99 346 167 404 190 404 162 0 -20 -55 -51 -385 -219 -304 -155 -360
-187 -360 -202 0 -14 22 -12 92 6 33 8 62 13 64 11 8 -8 -8 -37 -21 -37 -17 0
-95 -58 -95 -71 0 -14 52 -2 117 27 28 13 55 24 60 24 4 0 96 40 203 89 107
49 198 87 203 84 4 -2 7 -14 7 -27 0 -19 -16 -31 -97 -69 -67 -32 -87 -45 -64
-42 18 3 84 5 146 5 l112 0 17 45 c21 53 56 85 149 131 136 69 42 42 -156 -45
-62 -27 -67 -27 -67 7 0 23 8 31 63 56 34 17 148 72 254 123 106 51 194 93
198 93 3 0 5 -7 5 -16 0 -8 5 -24 11 -35 15 -28 39 -7 39 35 0 17 4 36 8 42 4
6 54 32 112 59 58 26 152 70 210 97 217 104 220 104 220 53 0 -42 -4 -45 -177
-121 -73 -32 -131 -59 -129 -61 2 -2 46 6 97 17 128 29 306 29 402 1 38 -11
75 -25 83 -32 11 -9 14 -43 14 -150 l0 -138 -27 -18 c-77 -52 -150 -70 -353
-84 l-155 -10 -45 -49 c-80 -86 -204 -129 -390 -136 l-125 -4 -17 -35 c-24
-45 -70 -79 -138 -101 -58 -18 -85 -34 -58 -34 9 0 18 -4 20 -9 4 -11 271 68
523 154 36 12 97 29 150 41 63 14 -125 -59 -495 -192 -173 -61 -71 -56 125 6
56 18 222 69 410 125 44 13 135 42 203 65 68 22 127 38 133 35 9 -6 4 -254 -7
-302 -2 -12 -13 -27 -23 -32 -17 -9 -19 -2 -31 94 -6 58 -16 105 -21 105 -5 0
-9 -58 -9 -128 0 -121 -1 -130 -23 -150 -34 -32 -47 -28 -47 16 -1 57 -11 196
-15 208 -4 14 -134 59 -143 49 -4 -3 -5 -92 -3 -196 3 -191 -1 -219 -34 -219
-9 0 -14 49 -19 183 -4 106 -11 186 -18 192 -7 7 -9 -49 -5 -192 3 -157 2
-203 -8 -203 -16 0 -25 88 -25 241 0 68 -4 120 -10 124 -12 7 -12 10 -10 -212
1 -143 -1 -173 -13 -173 -19 0 -27 69 -27 233 0 78 -4 127 -10 127 -6 0 -10
-42 -10 -105 0 -58 -2 -105 -5 -105 -2 0 -36 17 -75 37 -117 61 -220 50 -305
-33 -25 -24 -48 -44 -50 -44 -3 0 -5 29 -5 65 0 78 -11 87 -112 89 l-68 1 0
30 c0 17 -4 36 -9 43 -5 8 -48 22 -97 32 -49 10 -163 34 -254 53 -173 37 -338
63 -346 54 -5 -5 8 -8 246 -67 291 -71 324 -80 376 -95 l51 -15 5 -348 c3
-191 2 -351 -2 -355 -8 -9 -114 -1 -487 40 l-253 27 -30 -29 c-22 -21 -31 -25
-34 -14 -2 8 -7 199 -10 424 -5 396 -5 411 14 440 16 24 20 47 20 112 l0 81
-54 46 c-29 25 -56 46 -60 46 -3 0 -6 -609 -6 -1354 0 -1225 2 -1354 16 -1360
9 -3 37 -6 62 -6 59 0 65 -4 87 -63 10 -26 22 -50 26 -53 5 -3 9 -14 9 -25 0
-16 -7 -19 -55 -19 -59 0 -125 -21 -125 -40 0 -9 435 -11 1693 -8 1641 3 1694
4 1722 22 l29 19 -22 18 -22 18 40 54 c40 54 61 67 108 67 l22 0 -2 1718 -3
1717 -51 26 c-27 14 -208 102 -402 194 -193 92 -417 203 -498 246 -81 44 -153
79 -160 79 -12 0 -14 -307 -14 -1950z m338 1624 c106 -52 196 -94 200 -94 17
0 353 -174 381 -198 l32 -27 3 -1140 c3 -1319 1 -1584 -16 -1567 -22 22 -44
800 -48 1687 -1 363 -5 738 -9 834 l-6 174 -125 70 c-69 38 -174 94 -235 125
-181 91 -379 202 -400 224 l-20 20 25 -7 c14 -4 112 -50 218 -101z m-788 -93
c0 -12 -288 -151 -313 -151 -19 0 -19 2 -7 14 13 13 232 126 270 139 24 9 50
8 50 -2z m100 -141 c44 -16 93 -37 108 -45 27 -16 26 -16 -23 -10 -27 3 -79
14 -113 25 -76 24 -82 24 -82 5 0 -8 -31 -29 -72 -49 -40 -18 -158 -75 -261
-125 -103 -50 -192 -91 -198 -91 -5 0 -9 14 -9 31 0 30 4 32 263 159 144 71
272 129 284 129 12 1 58 -12 103 -29z m-530 -70 c0 -11 -73 -50 -95 -50 -25 0
-17 19 18 40 34 21 77 27 77 10z m1381 -26 c248 -133 381 -551 260 -811 -108
-229 -397 -283 -583 -108 -47 44 -26 65 25 25 14 -11 56 -32 94 -46 56 -21 81
-25 143 -22 90 4 141 32 190 103 79 115 101 272 60 429 -19 70 -54 156 -64
156 -2 0 -34 -40 -70 -90 -45 -59 -74 -90 -87 -90 -39 0 -19 40 62 125 69 71
79 86 70 103 -19 36 -130 130 -185 157 -49 24 -64 27 -123 22 -38 -3 -79 -8
-93 -12 -21 -5 -18 0 19 34 53 50 87 61 167 57 44 -3 77 -12 115 -32z m-1581
-70 c0 -16 -56 -44 -90 -44 -31 0 -24 18 18 39 45 24 72 26 72 5z m-200 -105
c0 -12 -77 -48 -102 -49 -31 0 -8 27 40 48 46 20 62 20 62 1z m228 -21 c-4
-39 44 -13 -416 -229 -45 -21 -87 -39 -93 -39 -6 0 -9 12 -7 27 3 24 27 38
248 149 135 68 251 123 258 123 9 1 12 -9 10 -31z m1421 -121 c1 -53 -2 -69
-15 -74 -32 -12 -38 12 -25 102 6 47 15 93 19 103 9 24 21 -45 21 -131z
m-1979 -152 c0 -22 -23 -36 -202 -124 -206 -101 -228 -107 -228 -60 0 19 10
25 315 169 55 26 103 46 108 43 4 -2 7 -15 7 -28z m2260 -44 c0 -6 -25 -30
-56 -55 -54 -44 -86 -56 -98 -37 -13 20 8 40 72 69 74 34 82 36 82 23z m-934
-237 c16 -65 -19 -211 -53 -222 -10 -3 -13 24 -13 112 0 112 1 117 23 126 33
13 36 12 43 -16z m855 6 l24 -20 -45 2 c-33 2 -46 7 -48 21 -5 24 39 23 69 -3z
m-781 -113 c0 -1 -9 -33 -19 -70 -65 -226 -274 -413 -573 -511 -40 -13 -90
-27 -111 -30 -36 -7 -38 -6 -35 16 2 14 12 25 28 29 114 32 184 55 235 81 185
92 341 245 425 416 19 39 38 72 43 72 4 0 7 -1 7 -3z m-29 -272 c-62 -139
-328 -322 -573 -394 -86 -25 -163 -25 -163 -1 0 9 11 16 25 18 48 6 191 43
243 63 164 64 278 148 420 309 34 39 63 66 65 61 2 -6 -6 -31 -17 -56z m777
-36 c95 -42 179 -132 221 -234 29 -68 34 -96 39 -185 4 -94 2 -112 -21 -179
-14 -40 -38 -91 -54 -114 -61 -88 -209 -167 -315 -167 -54 0 -163 33 -191 58
-28 25 -4 37 40 19 140 -56 285 -14 368 107 83 121 107 292 60 427 -58 167
-180 263 -332 263 -40 -1 -73 2 -73 6 0 16 28 29 70 32 73 5 121 -3 188 -33z
m-2013 -9 c7 -11 -42 -37 -51 -27 -9 9 15 37 32 37 7 0 16 -4 19 -10z m414
-21 c40 -24 35 -36 -10 -20 -53 18 -93 13 -136 -18 -167 -121 -105 -387 77
-332 36 11 110 79 110 101 0 6 7 10 16 10 33 0 -6 -74 -62 -116 -29 -22 -50
-29 -100 -32 -57 -4 -69 -1 -105 22 -128 85 -92 313 61 388 47 24 108 22 149
-3z m-409 -69 c0 -16 -38 -32 -46 -19 -7 12 12 29 34 29 6 0 12 -4 12 -10z
m485 -31 c8 -23 1 -34 -14 -24 -13 8 -15 45 -2 45 5 0 13 -9 16 -21z m-71 -21
c3 -18 7 -59 10 -91 4 -55 3 -58 -21 -68 -31 -12 -54 4 -35 23 18 18 15 95 -4
102 -14 5 -13 9 3 36 23 39 41 38 47 -2z m1586 15 c0 -31 -84 -163 -104 -163
-15 0 -17 5 -11 28 11 45 86 152 107 152 4 0 8 -7 8 -17z m-1706 -9 c10 -4 16
-18 16 -39 0 -19 5 -37 10 -40 17 -11 11 -64 -11 -86 -27 -27 -84 -23 -84 6 0
16 7 20 30 20 20 0 31 6 33 18 3 13 -3 17 -22 17 -29 0 -37 27 -11 36 23 9 19
37 -5 31 -26 -7 -34 7 -14 27 16 17 33 20 58 10z m-290 -69 c-6 -15 -42 -30
-51 -21 -12 12 8 36 31 36 18 0 24 -4 20 -15z m1216 -211 c0 -210 -1 -215 -41
-194 -17 10 -19 22 -19 123 0 157 25 297 50 282 6 -4 10 -85 10 -211z m-120
150 c9 -10 15 -65 18 -171 l5 -155 -34 7 c-19 3 -60 13 -92 21 -32 8 -61 14
-63 14 -2 0 -4 61 -4 135 0 126 1 135 21 145 11 7 22 10 23 8 2 -2 7 -60 12
-130 9 -117 16 -149 29 -136 3 2 9 55 14 117 11 137 36 188 71 145z m-1102
-46 c-5 -15 -48 -24 -48 -10 0 14 12 22 33 22 10 0 17 -5 15 -12z m750 -121
c2 -53 0 -67 -11 -67 -10 0 -16 17 -19 58 -6 63 -1 85 16 79 6 -2 12 -32 14
-70z m1342 60 c0 -17 -94 -62 -110 -52 -17 10 1 26 53 47 52 21 57 21 57 5z
m-1402 -69 c-2 -35 -7 -63 -13 -63 -5 0 -11 28 -13 63 -2 51 0 62 13 62 13 0
15 -11 13 -62z m-443 -13 c53 -9 127 8 167 36 35 26 37 8 2 -20 l-26 -20 41
-7 c65 -10 48 -23 -36 -27 -68 -3 -66 -4 14 -3 78 2 97 5 122 24 17 12 33 22
36 22 3 0 5 -17 5 -39 0 -38 -1 -39 -42 -45 -45 -7 -243 -48 -340 -70 l-58
-14 0 115 0 115 35 -30 c22 -20 50 -33 80 -37z m-245 41 c0 -17 -34 -31 -50
-21 -16 10 8 35 31 35 11 0 19 -6 19 -14z m624 -36 c7 -51 3 -70 -15 -70 -5 0
-9 27 -9 60 0 73 15 79 24 10z m-626 -58 c5 -17 -27 -27 -41 -13 -9 9 -8 14 3
21 18 11 32 8 38 -8z m883 -76 c120 -24 313 -72 333 -84 5 -3 0 -9 -12 -13
-14 -5 -57 0 -119 16 -309 76 -353 84 -353 65 0 -5 7 -10 15 -10 13 0 15 -19
13 -127 l-3 -128 -26 -3 c-22 -3 -27 2 -33 29 -3 17 -6 59 -7 93 -2 116 -17
116 -18 0 -1 -76 -5 -115 -13 -121 -7 -5 -51 -17 -98 -26 -47 -9 -95 -20 -107
-23 -21 -6 -23 -3 -23 34 0 23 5 44 10 47 13 8 13 122 0 130 -10 6 -215 -30
-256 -45 -21 -8 -24 -16 -24 -62 0 -62 8 -77 35 -75 18 2 21 -6 26 -98 5 -75
14 -118 34 -170 35 -88 123 -223 174 -267 l39 -33 -187 0 c-197 -1 -241 -6
-241 -30 0 -10 -11 -15 -34 -15 l-34 0 -7 103 c-13 196 -12 261 5 264 8 1 60
7 116 13 113 13 107 7 98 102 l-6 58 -38 -6 c-36 -6 -37 -5 -44 26 -3 18 -6
83 -6 145 l0 113 28 10 c15 6 104 24 197 41 94 18 213 40 265 50 128 25 155
25 301 -3z m-887 5 c3 -5 -1 -14 -10 -21 -11 -10 -18 -10 -27 -1 -9 9 -9 14 3
21 19 12 27 12 34 1z m2040 -6 c45 -19 46 -35 2 -35 -35 0 -71 24 -61 41 8 12
17 11 59 -6z m-2769 -94 l40 -6 6 -60 c4 -33 7 -225 8 -427 l1 -368 -33 0 -34
0 -6 113 c-4 61 -7 207 -7 322 0 116 -3 240 -7 278 -12 132 -23 63 -23 -147 0
-121 -4 -217 -9 -221 -5 -3 -21 0 -35 6 l-26 12 -1 209 c-2 233 -1 224 -11
234 -5 4 -8 -13 -9 -37 0 -34 -2 -39 -9 -24 -11 25 -13 119 -3 129 7 7 70 1
158 -13z m1603 9 c6 0 12 -9 12 -19 0 -17 -4 -18 -40 -9 -22 6 -40 14 -40 18
0 14 15 21 35 16 11 -3 26 -6 33 -6z m110 -20 c6 0 12 -10 12 -21 0 -19 -4
-21 -32 -15 -18 3 -36 10 -41 15 -15 15 4 33 27 27 11 -3 27 -6 34 -6z m-1562
-136 c-4 -76 -10 -143 -15 -151 -7 -14 -21 142 -21 244 0 37 3 43 22 43 21 0
21 -1 14 -136z m628 94 c13 -83 15 -221 5 -240 -9 -17 -13 -18 -19 -7 -7 12
-14 192 -11 262 2 30 20 19 25 -15z m1057 22 c22 -12 25 -36 7 -42 -7 -3 -28
-1 -45 4 -23 6 -33 14 -33 28 0 23 37 28 71 10z m-1117 -32 c9 -35 7 -258 -3
-258 -10 0 -21 107 -21 208 0 70 12 95 24 50z m-114 -122 l0 -134 -72 -12
c-198 -31 -233 -40 -247 -60 -7 -11 -17 -20 -22 -20 -12 0 -11 247 1 270 15
29 211 87 303 89 l37 1 0 -134z m53 120 c9 -22 11 -245 3 -253 -17 -17 -26 30
-26 145 0 110 8 148 23 108z m955 -35 c3 -10 -3 -11 -29 -6 -42 9 -51 14 -44
24 7 13 68 -3 73 -18z m90 -7 c27 -8 29 -24 3 -24 -26 0 -51 10 -51 21 0 10
16 11 48 3z m111 -20 c18 -4 31 -13 31 -21 0 -11 -7 -14 -22 -9 -13 3 -31 6
-40 6 -10 0 -18 7 -18 15 0 17 4 18 49 9z m-673 -131 c24 -122 65 -224 135
-333 55 -86 85 -118 149 -155 l45 -27 -40 7 c-82 14 -139 59 -216 174 -65 95
-122 247 -135 356 -8 63 -2 85 24 85 15 0 21 -18 38 -107z m-108 -3 c28 -200
77 -314 187 -427 41 -43 72 -79 70 -81 -9 -9 -71 24 -108 57 -76 68 -136 178
-172 314 -27 98 -33 205 -13 225 18 18 23 5 36 -88z m572 90 c24 -15 -2 -31
-38 -24 -40 8 -43 34 -4 34 15 0 34 -5 42 -10z m117 -25 c8 -22 1 -26 -35 -19
-18 4 -32 13 -32 20 0 20 59 18 67 -1z m167 -25 c78 -25 89 -46 19 -35 -100
14 -143 27 -143 41 0 20 46 18 124 -6z m881 -120 c72 -36 165 -132 204 -211
112 -229 26 -517 -186 -625 -53 -26 -67 -29 -158 -29 -107 0 -144 12 -223 72
-47 36 -26 52 23 19 74 -51 184 -69 270 -45 60 17 153 116 189 204 47 113 48
317 3 379 -13 17 -19 15 -112 -48 -98 -65 -115 -74 -115 -57 0 9 77 76 152
131 26 19 48 40 48 45 0 20 -57 80 -98 103 l-41 23 -16 -38 c-63 -154 -89
-202 -101 -190 -8 8 5 59 42 160 25 67 27 79 14 88 -19 13 -151 5 -180 -11
-30 -16 -51 3 -28 26 24 25 74 33 173 31 72 -2 100 -8 140 -27z m-845 -19 c0
-13 -38 -19 -250 -36 -107 -8 -244 -20 -304 -25 -112 -10 -136 -5 -136 26 0
10 14 14 43 15 23 1 146 7 272 14 296 16 375 17 375 6z m35 -100 c-10 -17
-103 -30 -375 -56 -247 -23 -266 -23 -278 -8 -6 9 -9 20 -5 24 11 11 426 47
556 48 65 1 106 -3 102 -8z m-1600 -16 c241 -29 255 -32 255 -50 0 -20 -39
-19 -199 5 -142 21 -151 23 -151 47 0 11 7 14 23 10 12 -3 45 -8 72 -12z m0
-100 c58 -7 175 -23 223 -31 34 -5 46 -34 15 -34 -21 0 -277 30 -310 36 -15 3
-23 12 -23 25 0 17 5 20 23 16 12 -3 45 -8 72 -12z m1602 1 c-21 -17 -116 -30
-357 -51 -96 -9 -182 -18 -191 -21 -16 -4 -49 19 -49 35 0 4 73 14 163 20 89
7 203 16 252 21 50 4 115 8 145 8 49 1 53 0 37 -12z m1 -113 c-3 -16 -22 -19
-183 -24 -170 -5 -245 1 -185 15 43 11 191 23 283 25 79 1 88 -1 85 -16z
m-1538 -19 c165 -21 180 -24 180 -34 0 -24 -316 -2 -332 22 -16 25 -9 41 15
33 12 -3 74 -13 137 -21z m2369 -137 c48 -24 65 -47 34 -47 -37 0 -143 42
-143 56 0 21 58 17 109 -9z m-70 -153 c33 -28 39 -44 17 -44 -20 0 -66 39 -66
56 0 21 15 17 49 -12z m335 -80 c13 -99 0 -290 -17 -244 -8 22 -16 245 -10
270 9 33 20 23 27 -26z m-2795 -383 c19 -12 7 -41 -33 -80 -46 -45 -60 -37
-33 19 37 76 39 78 66 61z m461 -26 c12 -14 43 -106 37 -111 -1 -2 -108 -6
-236 -10 l-234 -7 39 71 38 72 172 0 c138 0 174 -3 184 -15z m93 -47 c22 -69
7 -83 -27 -26 -31 53 -33 78 -8 78 13 0 23 -15 35 -52z m912 6 c15 -25 23 -50
19 -54 -11 -10 -633 -19 -639 -10 -3 4 2 31 11 59 l15 51 283 0 284 0 27 -46z
m205 36 c0 -20 -50 -90 -65 -90 -22 0 -85 60 -85 81 0 17 8 19 75 19 44 0 75
-4 75 -10z m839 -32 c17 -23 31 -48 31 -55 0 -10 -59 -13 -295 -13 -215 0
-295 3 -295 11 0 7 12 31 28 55 l27 44 237 0 236 0 31 -42z m341 27 c0 -22
-12 -24 -143 -28 -99 -3 -119 -1 -132 13 -8 9 -12 20 -8 23 3 4 69 7 145 7
117 0 138 -2 138 -15z"/>
<path d="M1713 2370 c-76 -11 -103 -19 -103 -30 0 -14 63 -23 144 -18 82 4 96
10 80 36 -13 20 -48 23 -121 12z"/>
<path d="M1825 2275 c-5 -2 -44 -6 -85 -10 -85 -7 -115 -19 -90 -35 33 -22
228 -7 237 17 9 23 -28 40 -62 28z"/>
<path d="M1720 2156 c-46 -8 -65 -15 -65 -26 0 -12 23 -15 139 -18 152 -3 181
5 150 39 -14 15 -31 19 -88 18 -39 -1 -100 -6 -136 -13z"/>
<path d="M2515 4414 c-178 -26 -270 -62 -301 -119 -16 -31 -16 -35 -2 -58 33
-50 79 -62 251 -65 182 -4 271 8 342 46 78 43 97 111 39 148 -49 33 -242 60
-329 48z m275 -118 c0 -22 -24 -26 -215 -41 -208 -16 -197 -15 -165 -25 14 -4
91 -8 173 -9 213 -1 192 -25 -34 -38 -164 -9 -299 25 -299 76 0 17 10 20 68
27 147 16 232 21 350 23 98 1 122 -2 122 -13z"/>
<path d="M2140 4363 c-19 -9 -87 -41 -150 -72 l-115 -55 120 -8 c66 -4 126 -6
133 -3 6 2 12 16 12 30 0 14 11 48 25 75 28 55 26 56 -25 33z"/>
<path d="M1810 4137 c-134 -26 -203 -94 -131 -132 34 -17 42 -10 14 11 -91 67
339 137 456 74 38 -20 12 -30 -77 -30 -129 0 -282 -12 -282 -22 0 -4 64 -8
143 -8 113 -1 138 -3 122 -12 -11 -7 -49 -17 -85 -23 -75 -12 -82 -29 -13 -33
102 -7 261 41 277 84 9 25 -20 63 -62 81 -49 21 -273 27 -362 10z"/>
<path d="M1250 3929 c-61 -12 -95 -39 -95 -75 0 -23 5 -30 25 -33 24 -3 25 -3
7 17 -18 20 -18 21 5 36 30 19 176 31 264 21 l69 -8 -45 -7 c-25 -4 -89 -11
-142 -15 -161 -12 -120 -28 104 -41 96 -6 108 -9 93 -21 -11 -7 -27 -13 -37
-13 -10 0 -18 -5 -18 -11 0 -19 119 -1 165 24 80 44 33 103 -100 126 -72 13
-230 13 -295 0z"/>
<path d="M1013 3912 c-39 -19 -42 -32 -9 -32 34 0 56 10 56 25 0 22 -13 24
-47 7z"/>
<path d="M997 3696 c-46 -14 -132 -64 -123 -73 2 -3 26 7 52 21 27 14 61 26
75 26 22 0 28 -7 39 -42 15 -52 54 -127 45 -88 -3 14 -8 51 -12 83 l-6 59 49
-7 c27 -4 52 -9 57 -12 4 -2 4 -43 1 -91 -6 -94 4 -96 26 -5 17 75 28 80 85
40 75 -51 75 -54 4 -125 -46 -46 -60 -65 -51 -74 8 -8 31 -1 86 25 l76 36 11
-22 c7 -12 16 -37 20 -55 6 -29 4 -34 -18 -43 -13 -5 -46 -9 -73 -9 -52 0 -80
-7 -80 -21 0 -9 88 -36 135 -41 36 -4 45 -36 20 -74 -18 -28 -20 -28 -123 39
-46 31 -61 46 -57 58 7 21 -20 89 -34 89 -6 0 -8 -19 -4 -49 5 -43 3 -50 -18
-65 -67 -46 -166 26 -123 91 18 28 12 42 -10 23 -22 -18 -30 -73 -16 -112 11
-30 8 -40 -29 -120 -22 -49 -44 -88 -48 -88 -5 0 -19 7 -32 16 -15 11 -26 13
-32 7 -14 -14 72 -68 147 -94 177 -62 380 30 444 201 63 170 -32 381 -213 470
-78 38 -190 49 -270 26z m224 -478 c9 -7 38 -39 64 -72 l49 -58 -28 -25 c-44
-38 -57 -28 -93 72 -18 50 -33 91 -33 93 0 7 28 0 41 -10z m-90 -118 c6 -40 7
-76 2 -81 -8 -8 -73 2 -76 12 -5 14 49 157 56 150 5 -5 13 -41 18 -81z"/>
<path d="M892 3538 c6 -18 57 -53 65 -45 9 9 -37 57 -55 57 -7 0 -12 -5 -10
-12z"/>
<path d="M840 3361 c0 -20 34 -31 96 -31 50 0 41 14 -19 33 -68 21 -77 21 -77
-2z"/>
<path d="M929 3218 c-65 -44 -72 -55 -45 -73 11 -7 20 -2 38 20 12 17 35 43
51 59 15 16 26 30 24 33 -2 2 -33 -16 -68 -39z"/>
<path d="M1200 1030 c-42 -10 -75 -47 -89 -98 -14 -47 -14 -385 -1 -433 23
-81 106 -119 194 -88 59 21 80 56 84 145 l4 74 -46 0 -46 0 0 -57 c0 -71 -9
-86 -50 -86 -17 0 -36 6 -41 14 -14 22 -11 423 3 437 16 16 63 15 76 -1 6 -7
12 -35 14 -62 l3 -50 40 0 40 0 3 49 c4 57 -19 118 -52 140 -29 18 -93 26
-136 16z"/>
<path d="M1706 1030 c-41 -13 -74 -48 -86 -89 -5 -20 -10 -124 -10 -231 0
-263 14 -295 133 -306 102 -10 157 48 157 163 l0 63 -45 0 -45 0 0 -60 c0 -51
-3 -62 -23 -74 -29 -20 -66 -10 -78 21 -14 38 -11 373 4 403 14 27 61 40 80
21 7 -7 14 -35 17 -64 l5 -52 43 -3 42 -3 0 53 c0 60 -23 113 -60 140 -31 21
-95 30 -134 18z"/>
<path d="M3510 1030 c-43 -10 -76 -47 -90 -102 -7 -25 -10 -113 -8 -232 2
-160 6 -197 21 -228 43 -86 201 -90 253 -5 17 29 19 52 19 257 0 219 -1 226
-23 258 -13 17 -31 36 -40 41 -28 14 -95 20 -132 11z m88 -92 c13 -13 17 -415
4 -434 -12 -18 -41 -24 -67 -14 l-25 10 0 213 c0 152 3 216 12 225 15 15 61
15 76 0z"/>
<path d="M757 1023 c-4 -3 -7 -143 -7 -310 l0 -303 50 0 50 0 0 114 0 113 48
5 c111 11 142 53 142 196 0 156 -35 192 -186 192 -50 0 -94 -3 -97 -7z m173
-93 c16 -16 20 -33 20 -91 0 -92 -10 -109 -60 -109 l-40 0 0 104 c0 91 2 105
18 109 33 9 42 7 62 -13z"/>
<path d="M1987 1023 c-4 -3 -7 -143 -7 -310 l0 -303 45 0 44 0 3 123 3 122 36
3 c54 5 63 -14 69 -137 l5 -106 45 -3 45 -3 -5 125 c-6 120 -7 127 -34 154
-23 25 -25 30 -11 36 26 9 45 70 45 141 0 132 -38 165 -187 165 -49 0 -93 -3
-96 -7z m181 -101 c6 -9 12 -43 12 -77 0 -66 -11 -85 -58 -100 -42 -12 -52 9
-52 105 0 76 2 89 18 92 29 6 66 -3 80 -20z"/>
<path d="M2360 720 l0 -310 130 0 130 0 0 40 0 40 -85 0 -85 0 0 95 0 94 68 3
67 3 3 34 c4 38 -11 53 -45 44 -13 -3 -39 -2 -58 1 l-35 7 0 84 c0 81 1 85 23
86 12 0 49 1 82 2 l60 2 3 43 3 42 -130 0 -131 0 0 -310z"/>
<path d="M2777 1017 c-3 -8 -12 -59 -21 -113 -19 -120 -64 -404 -72 -456 l-6
-38 40 0 40 0 9 53 8 52 65 0 65 0 8 -52 9 -53 44 0 c52 0 52 0 29 125 -8 44
-24 139 -35 210 -11 72 -26 164 -33 205 l-13 75 -66 3 c-49 2 -67 -1 -71 -11z
m113 -399 c0 -15 -9 -18 -44 -18 -25 0 -47 3 -49 8 -6 10 30 270 40 285 6 10
51 -226 53 -275z"/>
<path d="M3062 988 l3 -43 45 -1 45 -1 3 -266 2 -267 45 0 45 0 0 264 c0 225
2 265 15 270 8 3 22 3 30 0 8 -4 26 -3 40 0 21 5 25 12 25 46 l0 40 -151 0
-150 0 3 -42z"/>
<path d="M3790 720 l0 -310 45 0 44 0 3 123 3 122 40 0 c54 0 65 -24 65 -147
l0 -98 48 0 47 0 -3 83 c-4 126 -11 165 -36 194 l-22 26 22 24 c27 29 39 94
31 162 -13 107 -48 131 -192 131 l-95 0 0 -310z m188 203 c17 -24 15 -124 -3
-150 -19 -27 -74 -41 -86 -22 -10 16 -12 182 -3 192 12 12 79 -3 92 -20z"/>
</g>
</svg>
+225
View File
@@ -0,0 +1,225 @@
<svg xmlns="http://www.w3.org/2000/svg"
width="494.000000pt" height="555.000000pt" viewBox="0 0 494.000000 555.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,555.000000) scale(0.100000,-0.100000)" fill="white">
<path d="M3090 3400 l0 -1950 -1190 0 -1190 0 0 234 c0 190 3 236 14 245 23
19 164 30 606 46 228 9 485 20 570 25 134 9 895 40 965 40 23 0 25 -4 25 -44
l0 -44 -82 -6 c-46 -3 -146 -8 -223 -11 -77 -3 -239 -12 -360 -20 -121 -8
-335 -19 -475 -25 -387 -15 -650 -32 -650 -41 0 -12 196 -11 515 1 257 10
1267 32 1271 27 7 -9 12 -74 6 -84 -7 -11 -190 -21 -777 -43 -437 -16 -748
-30 -777 -36 -16 -3 -28 -10 -28 -15 0 -13 837 -11 1237 2 360 12 343 15 343
-53 0 -36 -1 -37 -42 -42 -24 -3 -182 -8 -353 -11 -501 -10 -923 -31 -907 -47
4 -4 315 -7 690 -6 l682 3 -1 1445 c-1 795 -3 1488 -3 1540 -1 52 -2 249 -4
437 l-2 343 -23 5 c-23 6 -39 -1 -417 -200 -107 -56 -242 -127 -300 -157 -151
-80 -311 -164 -415 -218 -49 -26 -133 -70 -185 -97 -99 -53 -146 -77 -450
-238 -378 -199 -494 -265 -467 -265 3 0 134 64 293 143 159 79 381 188 494
243 113 54 440 216 727 360 494 248 613 303 613 285 0 -7 -59 -49 -135 -96
-66 -42 -219 -120 -875 -449 -377 -188 -741 -375 -810 -413 -69 -39 -150 -83
-180 -99 -32 -16 -48 -29 -39 -31 8 -2 57 17 107 42 51 25 94 45 96 45 2 0 95
44 207 99 346 167 404 190 404 162 0 -20 -55 -51 -385 -219 -304 -155 -360
-187 -360 -202 0 -14 22 -12 92 6 33 8 62 13 64 11 8 -8 -8 -37 -21 -37 -17 0
-95 -58 -95 -71 0 -14 52 -2 117 27 28 13 55 24 60 24 4 0 96 40 203 89 107
49 198 87 203 84 4 -2 7 -14 7 -27 0 -19 -16 -31 -97 -69 -67 -32 -87 -45 -64
-42 18 3 84 5 146 5 l112 0 17 45 c21 53 56 85 149 131 136 69 42 42 -156 -45
-62 -27 -67 -27 -67 7 0 23 8 31 63 56 34 17 148 72 254 123 106 51 194 93
198 93 3 0 5 -7 5 -16 0 -8 5 -24 11 -35 15 -28 39 -7 39 35 0 17 4 36 8 42 4
6 54 32 112 59 58 26 152 70 210 97 217 104 220 104 220 53 0 -42 -4 -45 -177
-121 -73 -32 -131 -59 -129 -61 2 -2 46 6 97 17 128 29 306 29 402 1 38 -11
75 -25 83 -32 11 -9 14 -43 14 -150 l0 -138 -27 -18 c-77 -52 -150 -70 -353
-84 l-155 -10 -45 -49 c-80 -86 -204 -129 -390 -136 l-125 -4 -17 -35 c-24
-45 -70 -79 -138 -101 -58 -18 -85 -34 -58 -34 9 0 18 -4 20 -9 4 -11 271 68
523 154 36 12 97 29 150 41 63 14 -125 -59 -495 -192 -173 -61 -71 -56 125 6
56 18 222 69 410 125 44 13 135 42 203 65 68 22 127 38 133 35 9 -6 4 -254 -7
-302 -2 -12 -13 -27 -23 -32 -17 -9 -19 -2 -31 94 -6 58 -16 105 -21 105 -5 0
-9 -58 -9 -128 0 -121 -1 -130 -23 -150 -34 -32 -47 -28 -47 16 -1 57 -11 196
-15 208 -4 14 -134 59 -143 49 -4 -3 -5 -92 -3 -196 3 -191 -1 -219 -34 -219
-9 0 -14 49 -19 183 -4 106 -11 186 -18 192 -7 7 -9 -49 -5 -192 3 -157 2
-203 -8 -203 -16 0 -25 88 -25 241 0 68 -4 120 -10 124 -12 7 -12 10 -10 -212
1 -143 -1 -173 -13 -173 -19 0 -27 69 -27 233 0 78 -4 127 -10 127 -6 0 -10
-42 -10 -105 0 -58 -2 -105 -5 -105 -2 0 -36 17 -75 37 -117 61 -220 50 -305
-33 -25 -24 -48 -44 -50 -44 -3 0 -5 29 -5 65 0 78 -11 87 -112 89 l-68 1 0
30 c0 17 -4 36 -9 43 -5 8 -48 22 -97 32 -49 10 -163 34 -254 53 -173 37 -338
63 -346 54 -5 -5 8 -8 246 -67 291 -71 324 -80 376 -95 l51 -15 5 -348 c3
-191 2 -351 -2 -355 -8 -9 -114 -1 -487 40 l-253 27 -30 -29 c-22 -21 -31 -25
-34 -14 -2 8 -7 199 -10 424 -5 396 -5 411 14 440 16 24 20 47 20 112 l0 81
-54 46 c-29 25 -56 46 -60 46 -3 0 -6 -609 -6 -1354 0 -1225 2 -1354 16 -1360
9 -3 37 -6 62 -6 59 0 65 -4 87 -63 10 -26 22 -50 26 -53 5 -3 9 -14 9 -25 0
-16 -7 -19 -55 -19 -59 0 -125 -21 -125 -40 0 -9 435 -11 1693 -8 1641 3 1694
4 1722 22 l29 19 -22 18 -22 18 40 54 c40 54 61 67 108 67 l22 0 -2 1718 -3
1717 -51 26 c-27 14 -208 102 -402 194 -193 92 -417 203 -498 246 -81 44 -153
79 -160 79 -12 0 -14 -307 -14 -1950z m338 1624 c106 -52 196 -94 200 -94 17
0 353 -174 381 -198 l32 -27 3 -1140 c3 -1319 1 -1584 -16 -1567 -22 22 -44
800 -48 1687 -1 363 -5 738 -9 834 l-6 174 -125 70 c-69 38 -174 94 -235 125
-181 91 -379 202 -400 224 l-20 20 25 -7 c14 -4 112 -50 218 -101z m-788 -93
c0 -12 -288 -151 -313 -151 -19 0 -19 2 -7 14 13 13 232 126 270 139 24 9 50
8 50 -2z m100 -141 c44 -16 93 -37 108 -45 27 -16 26 -16 -23 -10 -27 3 -79
14 -113 25 -76 24 -82 24 -82 5 0 -8 -31 -29 -72 -49 -40 -18 -158 -75 -261
-125 -103 -50 -192 -91 -198 -91 -5 0 -9 14 -9 31 0 30 4 32 263 159 144 71
272 129 284 129 12 1 58 -12 103 -29z m-530 -70 c0 -11 -73 -50 -95 -50 -25 0
-17 19 18 40 34 21 77 27 77 10z m1381 -26 c248 -133 381 -551 260 -811 -108
-229 -397 -283 -583 -108 -47 44 -26 65 25 25 14 -11 56 -32 94 -46 56 -21 81
-25 143 -22 90 4 141 32 190 103 79 115 101 272 60 429 -19 70 -54 156 -64
156 -2 0 -34 -40 -70 -90 -45 -59 -74 -90 -87 -90 -39 0 -19 40 62 125 69 71
79 86 70 103 -19 36 -130 130 -185 157 -49 24 -64 27 -123 22 -38 -3 -79 -8
-93 -12 -21 -5 -18 0 19 34 53 50 87 61 167 57 44 -3 77 -12 115 -32z m-1581
-70 c0 -16 -56 -44 -90 -44 -31 0 -24 18 18 39 45 24 72 26 72 5z m-200 -105
c0 -12 -77 -48 -102 -49 -31 0 -8 27 40 48 46 20 62 20 62 1z m228 -21 c-4
-39 44 -13 -416 -229 -45 -21 -87 -39 -93 -39 -6 0 -9 12 -7 27 3 24 27 38
248 149 135 68 251 123 258 123 9 1 12 -9 10 -31z m1421 -121 c1 -53 -2 -69
-15 -74 -32 -12 -38 12 -25 102 6 47 15 93 19 103 9 24 21 -45 21 -131z
m-1979 -152 c0 -22 -23 -36 -202 -124 -206 -101 -228 -107 -228 -60 0 19 10
25 315 169 55 26 103 46 108 43 4 -2 7 -15 7 -28z m2260 -44 c0 -6 -25 -30
-56 -55 -54 -44 -86 -56 -98 -37 -13 20 8 40 72 69 74 34 82 36 82 23z m-934
-237 c16 -65 -19 -211 -53 -222 -10 -3 -13 24 -13 112 0 112 1 117 23 126 33
13 36 12 43 -16z m855 6 l24 -20 -45 2 c-33 2 -46 7 -48 21 -5 24 39 23 69 -3z
m-781 -113 c0 -1 -9 -33 -19 -70 -65 -226 -274 -413 -573 -511 -40 -13 -90
-27 -111 -30 -36 -7 -38 -6 -35 16 2 14 12 25 28 29 114 32 184 55 235 81 185
92 341 245 425 416 19 39 38 72 43 72 4 0 7 -1 7 -3z m-29 -272 c-62 -139
-328 -322 -573 -394 -86 -25 -163 -25 -163 -1 0 9 11 16 25 18 48 6 191 43
243 63 164 64 278 148 420 309 34 39 63 66 65 61 2 -6 -6 -31 -17 -56z m777
-36 c95 -42 179 -132 221 -234 29 -68 34 -96 39 -185 4 -94 2 -112 -21 -179
-14 -40 -38 -91 -54 -114 -61 -88 -209 -167 -315 -167 -54 0 -163 33 -191 58
-28 25 -4 37 40 19 140 -56 285 -14 368 107 83 121 107 292 60 427 -58 167
-180 263 -332 263 -40 -1 -73 2 -73 6 0 16 28 29 70 32 73 5 121 -3 188 -33z
m-2013 -9 c7 -11 -42 -37 -51 -27 -9 9 15 37 32 37 7 0 16 -4 19 -10z m414
-21 c40 -24 35 -36 -10 -20 -53 18 -93 13 -136 -18 -167 -121 -105 -387 77
-332 36 11 110 79 110 101 0 6 7 10 16 10 33 0 -6 -74 -62 -116 -29 -22 -50
-29 -100 -32 -57 -4 -69 -1 -105 22 -128 85 -92 313 61 388 47 24 108 22 149
-3z m-409 -69 c0 -16 -38 -32 -46 -19 -7 12 12 29 34 29 6 0 12 -4 12 -10z
m485 -31 c8 -23 1 -34 -14 -24 -13 8 -15 45 -2 45 5 0 13 -9 16 -21z m-71 -21
c3 -18 7 -59 10 -91 4 -55 3 -58 -21 -68 -31 -12 -54 4 -35 23 18 18 15 95 -4
102 -14 5 -13 9 3 36 23 39 41 38 47 -2z m1586 15 c0 -31 -84 -163 -104 -163
-15 0 -17 5 -11 28 11 45 86 152 107 152 4 0 8 -7 8 -17z m-1706 -9 c10 -4 16
-18 16 -39 0 -19 5 -37 10 -40 17 -11 11 -64 -11 -86 -27 -27 -84 -23 -84 6 0
16 7 20 30 20 20 0 31 6 33 18 3 13 -3 17 -22 17 -29 0 -37 27 -11 36 23 9 19
37 -5 31 -26 -7 -34 7 -14 27 16 17 33 20 58 10z m-290 -69 c-6 -15 -42 -30
-51 -21 -12 12 8 36 31 36 18 0 24 -4 20 -15z m1216 -211 c0 -210 -1 -215 -41
-194 -17 10 -19 22 -19 123 0 157 25 297 50 282 6 -4 10 -85 10 -211z m-120
150 c9 -10 15 -65 18 -171 l5 -155 -34 7 c-19 3 -60 13 -92 21 -32 8 -61 14
-63 14 -2 0 -4 61 -4 135 0 126 1 135 21 145 11 7 22 10 23 8 2 -2 7 -60 12
-130 9 -117 16 -149 29 -136 3 2 9 55 14 117 11 137 36 188 71 145z m-1102
-46 c-5 -15 -48 -24 -48 -10 0 14 12 22 33 22 10 0 17 -5 15 -12z m750 -121
c2 -53 0 -67 -11 -67 -10 0 -16 17 -19 58 -6 63 -1 85 16 79 6 -2 12 -32 14
-70z m1342 60 c0 -17 -94 -62 -110 -52 -17 10 1 26 53 47 52 21 57 21 57 5z
m-1402 -69 c-2 -35 -7 -63 -13 -63 -5 0 -11 28 -13 63 -2 51 0 62 13 62 13 0
15 -11 13 -62z m-443 -13 c53 -9 127 8 167 36 35 26 37 8 2 -20 l-26 -20 41
-7 c65 -10 48 -23 -36 -27 -68 -3 -66 -4 14 -3 78 2 97 5 122 24 17 12 33 22
36 22 3 0 5 -17 5 -39 0 -38 -1 -39 -42 -45 -45 -7 -243 -48 -340 -70 l-58
-14 0 115 0 115 35 -30 c22 -20 50 -33 80 -37z m-245 41 c0 -17 -34 -31 -50
-21 -16 10 8 35 31 35 11 0 19 -6 19 -14z m624 -36 c7 -51 3 -70 -15 -70 -5 0
-9 27 -9 60 0 73 15 79 24 10z m-626 -58 c5 -17 -27 -27 -41 -13 -9 9 -8 14 3
21 18 11 32 8 38 -8z m883 -76 c120 -24 313 -72 333 -84 5 -3 0 -9 -12 -13
-14 -5 -57 0 -119 16 -309 76 -353 84 -353 65 0 -5 7 -10 15 -10 13 0 15 -19
13 -127 l-3 -128 -26 -3 c-22 -3 -27 2 -33 29 -3 17 -6 59 -7 93 -2 116 -17
116 -18 0 -1 -76 -5 -115 -13 -121 -7 -5 -51 -17 -98 -26 -47 -9 -95 -20 -107
-23 -21 -6 -23 -3 -23 34 0 23 5 44 10 47 13 8 13 122 0 130 -10 6 -215 -30
-256 -45 -21 -8 -24 -16 -24 -62 0 -62 8 -77 35 -75 18 2 21 -6 26 -98 5 -75
14 -118 34 -170 35 -88 123 -223 174 -267 l39 -33 -187 0 c-197 -1 -241 -6
-241 -30 0 -10 -11 -15 -34 -15 l-34 0 -7 103 c-13 196 -12 261 5 264 8 1 60
7 116 13 113 13 107 7 98 102 l-6 58 -38 -6 c-36 -6 -37 -5 -44 26 -3 18 -6
83 -6 145 l0 113 28 10 c15 6 104 24 197 41 94 18 213 40 265 50 128 25 155
25 301 -3z m-887 5 c3 -5 -1 -14 -10 -21 -11 -10 -18 -10 -27 -1 -9 9 -9 14 3
21 19 12 27 12 34 1z m2040 -6 c45 -19 46 -35 2 -35 -35 0 -71 24 -61 41 8 12
17 11 59 -6z m-2769 -94 l40 -6 6 -60 c4 -33 7 -225 8 -427 l1 -368 -33 0 -34
0 -6 113 c-4 61 -7 207 -7 322 0 116 -3 240 -7 278 -12 132 -23 63 -23 -147 0
-121 -4 -217 -9 -221 -5 -3 -21 0 -35 6 l-26 12 -1 209 c-2 233 -1 224 -11
234 -5 4 -8 -13 -9 -37 0 -34 -2 -39 -9 -24 -11 25 -13 119 -3 129 7 7 70 1
158 -13z m1603 9 c6 0 12 -9 12 -19 0 -17 -4 -18 -40 -9 -22 6 -40 14 -40 18
0 14 15 21 35 16 11 -3 26 -6 33 -6z m110 -20 c6 0 12 -10 12 -21 0 -19 -4
-21 -32 -15 -18 3 -36 10 -41 15 -15 15 4 33 27 27 11 -3 27 -6 34 -6z m-1562
-136 c-4 -76 -10 -143 -15 -151 -7 -14 -21 142 -21 244 0 37 3 43 22 43 21 0
21 -1 14 -136z m628 94 c13 -83 15 -221 5 -240 -9 -17 -13 -18 -19 -7 -7 12
-14 192 -11 262 2 30 20 19 25 -15z m1057 22 c22 -12 25 -36 7 -42 -7 -3 -28
-1 -45 4 -23 6 -33 14 -33 28 0 23 37 28 71 10z m-1117 -32 c9 -35 7 -258 -3
-258 -10 0 -21 107 -21 208 0 70 12 95 24 50z m-114 -122 l0 -134 -72 -12
c-198 -31 -233 -40 -247 -60 -7 -11 -17 -20 -22 -20 -12 0 -11 247 1 270 15
29 211 87 303 89 l37 1 0 -134z m53 120 c9 -22 11 -245 3 -253 -17 -17 -26 30
-26 145 0 110 8 148 23 108z m955 -35 c3 -10 -3 -11 -29 -6 -42 9 -51 14 -44
24 7 13 68 -3 73 -18z m90 -7 c27 -8 29 -24 3 -24 -26 0 -51 10 -51 21 0 10
16 11 48 3z m111 -20 c18 -4 31 -13 31 -21 0 -11 -7 -14 -22 -9 -13 3 -31 6
-40 6 -10 0 -18 7 -18 15 0 17 4 18 49 9z m-673 -131 c24 -122 65 -224 135
-333 55 -86 85 -118 149 -155 l45 -27 -40 7 c-82 14 -139 59 -216 174 -65 95
-122 247 -135 356 -8 63 -2 85 24 85 15 0 21 -18 38 -107z m-108 -3 c28 -200
77 -314 187 -427 41 -43 72 -79 70 -81 -9 -9 -71 24 -108 57 -76 68 -136 178
-172 314 -27 98 -33 205 -13 225 18 18 23 5 36 -88z m572 90 c24 -15 -2 -31
-38 -24 -40 8 -43 34 -4 34 15 0 34 -5 42 -10z m117 -25 c8 -22 1 -26 -35 -19
-18 4 -32 13 -32 20 0 20 59 18 67 -1z m167 -25 c78 -25 89 -46 19 -35 -100
14 -143 27 -143 41 0 20 46 18 124 -6z m881 -120 c72 -36 165 -132 204 -211
112 -229 26 -517 -186 -625 -53 -26 -67 -29 -158 -29 -107 0 -144 12 -223 72
-47 36 -26 52 23 19 74 -51 184 -69 270 -45 60 17 153 116 189 204 47 113 48
317 3 379 -13 17 -19 15 -112 -48 -98 -65 -115 -74 -115 -57 0 9 77 76 152
131 26 19 48 40 48 45 0 20 -57 80 -98 103 l-41 23 -16 -38 c-63 -154 -89
-202 -101 -190 -8 8 5 59 42 160 25 67 27 79 14 88 -19 13 -151 5 -180 -11
-30 -16 -51 3 -28 26 24 25 74 33 173 31 72 -2 100 -8 140 -27z m-845 -19 c0
-13 -38 -19 -250 -36 -107 -8 -244 -20 -304 -25 -112 -10 -136 -5 -136 26 0
10 14 14 43 15 23 1 146 7 272 14 296 16 375 17 375 6z m35 -100 c-10 -17
-103 -30 -375 -56 -247 -23 -266 -23 -278 -8 -6 9 -9 20 -5 24 11 11 426 47
556 48 65 1 106 -3 102 -8z m-1600 -16 c241 -29 255 -32 255 -50 0 -20 -39
-19 -199 5 -142 21 -151 23 -151 47 0 11 7 14 23 10 12 -3 45 -8 72 -12z m0
-100 c58 -7 175 -23 223 -31 34 -5 46 -34 15 -34 -21 0 -277 30 -310 36 -15 3
-23 12 -23 25 0 17 5 20 23 16 12 -3 45 -8 72 -12z m1602 1 c-21 -17 -116 -30
-357 -51 -96 -9 -182 -18 -191 -21 -16 -4 -49 19 -49 35 0 4 73 14 163 20 89
7 203 16 252 21 50 4 115 8 145 8 49 1 53 0 37 -12z m1 -113 c-3 -16 -22 -19
-183 -24 -170 -5 -245 1 -185 15 43 11 191 23 283 25 79 1 88 -1 85 -16z
m-1538 -19 c165 -21 180 -24 180 -34 0 -24 -316 -2 -332 22 -16 25 -9 41 15
33 12 -3 74 -13 137 -21z m2369 -137 c48 -24 65 -47 34 -47 -37 0 -143 42
-143 56 0 21 58 17 109 -9z m-70 -153 c33 -28 39 -44 17 -44 -20 0 -66 39 -66
56 0 21 15 17 49 -12z m335 -80 c13 -99 0 -290 -17 -244 -8 22 -16 245 -10
270 9 33 20 23 27 -26z m-2795 -383 c19 -12 7 -41 -33 -80 -46 -45 -60 -37
-33 19 37 76 39 78 66 61z m461 -26 c12 -14 43 -106 37 -111 -1 -2 -108 -6
-236 -10 l-234 -7 39 71 38 72 172 0 c138 0 174 -3 184 -15z m93 -47 c22 -69
7 -83 -27 -26 -31 53 -33 78 -8 78 13 0 23 -15 35 -52z m912 6 c15 -25 23 -50
19 -54 -11 -10 -633 -19 -639 -10 -3 4 2 31 11 59 l15 51 283 0 284 0 27 -46z
m205 36 c0 -20 -50 -90 -65 -90 -22 0 -85 60 -85 81 0 17 8 19 75 19 44 0 75
-4 75 -10z m839 -32 c17 -23 31 -48 31 -55 0 -10 -59 -13 -295 -13 -215 0
-295 3 -295 11 0 7 12 31 28 55 l27 44 237 0 236 0 31 -42z m341 27 c0 -22
-12 -24 -143 -28 -99 -3 -119 -1 -132 13 -8 9 -12 20 -8 23 3 4 69 7 145 7
117 0 138 -2 138 -15z"/>
<path d="M1713 2370 c-76 -11 -103 -19 -103 -30 0 -14 63 -23 144 -18 82 4 96
10 80 36 -13 20 -48 23 -121 12z"/>
<path d="M1825 2275 c-5 -2 -44 -6 -85 -10 -85 -7 -115 -19 -90 -35 33 -22
228 -7 237 17 9 23 -28 40 -62 28z"/>
<path d="M1720 2156 c-46 -8 -65 -15 -65 -26 0 -12 23 -15 139 -18 152 -3 181
5 150 39 -14 15 -31 19 -88 18 -39 -1 -100 -6 -136 -13z"/>
<path d="M2515 4414 c-178 -26 -270 -62 -301 -119 -16 -31 -16 -35 -2 -58 33
-50 79 -62 251 -65 182 -4 271 8 342 46 78 43 97 111 39 148 -49 33 -242 60
-329 48z m275 -118 c0 -22 -24 -26 -215 -41 -208 -16 -197 -15 -165 -25 14 -4
91 -8 173 -9 213 -1 192 -25 -34 -38 -164 -9 -299 25 -299 76 0 17 10 20 68
27 147 16 232 21 350 23 98 1 122 -2 122 -13z"/>
<path d="M2140 4363 c-19 -9 -87 -41 -150 -72 l-115 -55 120 -8 c66 -4 126 -6
133 -3 6 2 12 16 12 30 0 14 11 48 25 75 28 55 26 56 -25 33z"/>
<path d="M1810 4137 c-134 -26 -203 -94 -131 -132 34 -17 42 -10 14 11 -91 67
339 137 456 74 38 -20 12 -30 -77 -30 -129 0 -282 -12 -282 -22 0 -4 64 -8
143 -8 113 -1 138 -3 122 -12 -11 -7 -49 -17 -85 -23 -75 -12 -82 -29 -13 -33
102 -7 261 41 277 84 9 25 -20 63 -62 81 -49 21 -273 27 -362 10z"/>
<path d="M1250 3929 c-61 -12 -95 -39 -95 -75 0 -23 5 -30 25 -33 24 -3 25 -3
7 17 -18 20 -18 21 5 36 30 19 176 31 264 21 l69 -8 -45 -7 c-25 -4 -89 -11
-142 -15 -161 -12 -120 -28 104 -41 96 -6 108 -9 93 -21 -11 -7 -27 -13 -37
-13 -10 0 -18 -5 -18 -11 0 -19 119 -1 165 24 80 44 33 103 -100 126 -72 13
-230 13 -295 0z"/>
<path d="M1013 3912 c-39 -19 -42 -32 -9 -32 34 0 56 10 56 25 0 22 -13 24
-47 7z"/>
<path d="M997 3696 c-46 -14 -132 -64 -123 -73 2 -3 26 7 52 21 27 14 61 26
75 26 22 0 28 -7 39 -42 15 -52 54 -127 45 -88 -3 14 -8 51 -12 83 l-6 59 49
-7 c27 -4 52 -9 57 -12 4 -2 4 -43 1 -91 -6 -94 4 -96 26 -5 17 75 28 80 85
40 75 -51 75 -54 4 -125 -46 -46 -60 -65 -51 -74 8 -8 31 -1 86 25 l76 36 11
-22 c7 -12 16 -37 20 -55 6 -29 4 -34 -18 -43 -13 -5 -46 -9 -73 -9 -52 0 -80
-7 -80 -21 0 -9 88 -36 135 -41 36 -4 45 -36 20 -74 -18 -28 -20 -28 -123 39
-46 31 -61 46 -57 58 7 21 -20 89 -34 89 -6 0 -8 -19 -4 -49 5 -43 3 -50 -18
-65 -67 -46 -166 26 -123 91 18 28 12 42 -10 23 -22 -18 -30 -73 -16 -112 11
-30 8 -40 -29 -120 -22 -49 -44 -88 -48 -88 -5 0 -19 7 -32 16 -15 11 -26 13
-32 7 -14 -14 72 -68 147 -94 177 -62 380 30 444 201 63 170 -32 381 -213 470
-78 38 -190 49 -270 26z m224 -478 c9 -7 38 -39 64 -72 l49 -58 -28 -25 c-44
-38 -57 -28 -93 72 -18 50 -33 91 -33 93 0 7 28 0 41 -10z m-90 -118 c6 -40 7
-76 2 -81 -8 -8 -73 2 -76 12 -5 14 49 157 56 150 5 -5 13 -41 18 -81z"/>
<path d="M892 3538 c6 -18 57 -53 65 -45 9 9 -37 57 -55 57 -7 0 -12 -5 -10
-12z"/>
<path d="M840 3361 c0 -20 34 -31 96 -31 50 0 41 14 -19 33 -68 21 -77 21 -77
-2z"/>
<path d="M929 3218 c-65 -44 -72 -55 -45 -73 11 -7 20 -2 38 20 12 17 35 43
51 59 15 16 26 30 24 33 -2 2 -33 -16 -68 -39z"/>
</g>
</svg>
+5
View File
@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="462px" height="512px" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" xmlns:xlink="http://www.w3.org/1999/xlink">
<g><path style="opacity:0.984" fill="#000000" d="M 170.5,-0.5 C 210.5,-0.5 250.5,-0.5 290.5,-0.5C 314.491,5.66058 328.657,20.9939 333,45.5C 333.5,64.1637 333.667,82.8304 333.5,101.5C 368.835,101.333 404.168,101.5 439.5,102C 452.678,105.007 460.012,113.174 461.5,126.5C 461.5,127.5 461.5,128.5 461.5,129.5C 458.719,144.937 449.385,152.937 433.5,153.5C 425.386,253.203 416.886,352.87 408,452.5C 398.365,485.308 376.865,504.974 343.5,511.5C 268.167,511.5 192.833,511.5 117.5,511.5C 84.1349,504.974 62.6349,485.308 53,452.5C 44.1142,352.87 35.6142,253.203 27.5,153.5C 11.6146,152.937 2.28123,144.937 -0.5,129.5C -0.5,128.167 -0.5,126.833 -0.5,125.5C 1.4512,112.713 8.78453,104.88 21.5,102C 56.8318,101.5 92.1651,101.333 127.5,101.5C 127.333,82.8304 127.5,64.1637 128,45.5C 132.343,20.9939 146.509,5.66058 170.5,-0.5 Z M 179.5,51.5 C 213.5,51.5 247.5,51.5 281.5,51.5C 281.5,68.1667 281.5,84.8333 281.5,101.5C 247.5,101.5 213.5,101.5 179.5,101.5C 179.5,84.8333 179.5,68.1667 179.5,51.5 Z M 79.5,153.5 C 180.167,153.5 280.833,153.5 381.5,153.5C 373.502,247.142 365.669,340.808 358,434.5C 357.095,447.076 350.595,455.243 338.5,459C 266.5,459.667 194.5,459.667 122.5,459C 110.405,455.243 103.905,447.076 103,434.5C 95.3313,340.808 87.4979,247.142 79.5,153.5 Z"/></g>
<g><path style="opacity:0.981" fill="#000000" d="M 178.5,203.5 C 190.763,204.276 199.263,210.276 204,221.5C 205.146,249.795 205.646,278.128 205.5,306.5C 205.646,334.872 205.146,363.205 204,391.5C 199.733,402.725 191.566,408.725 179.5,409.5C 166.457,408.624 157.957,401.957 154,389.5C 153.333,334.5 153.333,279.5 154,224.5C 157.476,211.846 165.643,204.846 178.5,203.5 Z"/></g>
<g><path style="opacity:0.981" fill="#000000" d="M 280.5,203.5 C 292.434,204.048 300.934,209.715 306,220.5C 307.151,249.287 307.651,278.12 307.5,307C 307.333,334.5 307.167,362 307,389.5C 303.043,401.957 294.543,408.624 281.5,409.5C 269.209,409.034 261.042,403.034 257,391.5C 255.854,363.205 255.354,334.872 255.5,306.5C 255.354,278.128 255.854,249.795 257,221.5C 261.488,211.018 269.322,205.018 280.5,203.5 Z"/></g>
</svg>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8"?><svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 122.88 122.88" style="enable-background:new 0 0 122.88 122.88" xml:space="preserve"><g><path d="M61.44,0c8.32,0,16.25,1.66,23.5,4.66l0.11,0.05c7.47,3.11,14.2,7.66,19.83,13.3l0,0c5.66,5.65,10.22,12.42,13.34,19.95 c3.01,7.24,4.66,15.18,4.66,23.49c0,8.32-1.66,16.25-4.66,23.5l-0.05,0.11c-3.12,7.47-7.66,14.2-13.3,19.83l0,0 c-5.65,5.66-12.42,10.22-19.95,13.34c-7.24,3.01-15.18,4.66-23.49,4.66c-8.31,0-16.25-1.66-23.5-4.66l-0.11-0.05 c-7.47-3.11-14.2-7.66-19.83-13.29L18,104.87C12.34,99.21,7.78,92.45,4.66,84.94C1.66,77.69,0,69.76,0,61.44s1.66-16.25,4.66-23.5 l0.05-0.11c3.11-7.47,7.66-14.2,13.29-19.83L18.01,18c5.66-5.66,12.42-10.22,19.94-13.34C45.19,1.66,53.12,0,61.44,0L61.44,0z M16.99,94.47l0.24-0.14c5.9-3.29,21.26-4.38,27.64-8.83c0.47-0.7,0.97-1.72,1.46-2.83c0.73-1.67,1.4-3.5,1.82-4.74 c-1.78-2.1-3.31-4.47-4.77-6.8l-4.83-7.69c-1.76-2.64-2.68-5.04-2.74-7.02c-0.03-0.93,0.13-1.77,0.48-2.52 c0.36-0.78,0.91-1.43,1.66-1.93c0.35-0.24,0.74-0.44,1.17-0.59c-0.32-4.17-0.43-9.42-0.23-13.82c0.1-1.04,0.31-2.09,0.59-3.13 c1.24-4.41,4.33-7.96,8.16-10.4c2.11-1.35,4.43-2.36,6.84-3.04c1.54-0.44-1.31-5.34,0.28-5.51c7.67-0.79,20.08,6.22,25.44,12.01 c2.68,2.9,4.37,6.75,4.73,11.84l-0.3,12.54l0,0c1.34,0.41,2.2,1.26,2.54,2.63c0.39,1.53-0.03,3.67-1.33,6.6l0,0 c-0.02,0.05-0.05,0.11-0.08,0.16l-5.51,9.07c-2.02,3.33-4.08,6.68-6.75,9.31C73.75,80,74,80.35,74.24,80.7 c1.09,1.6,2.19,3.2,3.6,4.63c0.05,0.05,0.09,0.1,0.12,0.15c6.34,4.48,21.77,5.57,27.69,8.87l0.24,0.14 c6.87-9.22,10.93-20.65,10.93-33.03c0-15.29-6.2-29.14-16.22-39.15c-10-10.03-23.85-16.23-39.14-16.23 c-15.29,0-29.14,6.2-39.15,16.22C12.27,32.3,6.07,46.15,6.07,61.44C6.07,73.82,10.13,85.25,16.99,94.47L16.99,94.47L16.99,94.47z"/></g></svg>
+48
View File
@@ -0,0 +1,48 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="761.000000pt" height="684.000000pt" viewBox="0 0 761.000000 684.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,684.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M765 6608 c-52 -18 -93 -56 -118 -110 -24 -49 -26 -68 -31 -243 -4
-104 -9 -245 -12 -312 l-6 -123 221 0 221 0 0 313 0 313 -26 52 c-49 98 -152
144 -249 110z"/>
<path d="M596 5393 c-8 -271 -21 -809 -41 -1668 -8 -346 -17 -714 -21 -817
l-6 -188 301 0 301 0 0 50 0 50 100 0 100 0 0 -50 0 -50 200 0 200 0 0 -1050
0 -1050 100 0 100 0 0 2250 0 2250 -300 0 -300 0 0 -100 0 -100 200 0 200 0 0
-900 0 -900 -200 0 -200 0 0 -50 0 -50 -104 0 -104 0 -6 188 c-4 103 -13 491
-21 862 -9 371 -20 853 -25 1070 -5 217 -10 414 -10 438 l0 42 -229 0 -229 0
-6 -227z"/>
<path d="M2130 2870 l0 -1250 400 0 400 0 0 -100 0 -100 550 0 550 0 0 100 0
100 150 0 150 0 0 -350 0 -350 700 0 700 0 0 350 0 350 100 0 100 0 0 -350 0
-350 300 0 300 0 0 1600 0 1600 -2200 0 -2200 0 0 -1250z m1598 990 c166 -164
277 -381 329 -638 25 -124 24 -403 -1 -527 -56 -270 -193 -521 -367 -674 l-46
-40 -25 27 c-13 15 -43 50 -66 79 l-43 52 52 48 c406 379 408 1148 6 1542
l-55 54 61 78 c34 43 65 78 68 78 4 1 43 -35 87 -79z m-307 -258 c20 -24 55
-77 79 -118 183 -320 170 -760 -33 -1076 -42 -67 -166 -200 -178 -193 -5 3
-35 39 -68 79 l-60 73 52 55 c138 147 215 369 203 588 -7 133 -26 211 -82 328
-32 67 -62 111 -110 162 l-66 70 43 52 c23 29 54 65 67 80 l25 28 46 -43 c25
-23 62 -61 82 -85z m1709 -32 l0 -50 50 0 50 0 0 50 0 50 100 0 100 0 0 -50 0
-50 50 0 50 0 0 50 0 50 100 0 100 0 0 -50 0 -50 50 0 50 0 0 -50 0 -50 50 0
50 0 0 -100 0 -100 -50 0 -50 0 0 -50 0 -50 50 0 50 0 0 -100 0 -100 -50 0
-50 0 0 -50 0 -50 50 0 50 0 0 -100 0 -100 -50 0 -50 0 0 -50 0 -50 -50 0 -50
0 0 -50 0 -50 -100 0 -100 0 0 50 0 50 -50 0 -50 0 0 -50 0 -50 -100 0 -100 0
0 50 0 50 -50 0 -50 0 0 -50 0 -50 -100 0 -100 0 0 50 0 50 -50 0 -50 0 0 50
0 50 -50 0 -50 0 0 100 0 100 50 0 50 0 0 50 0 50 -50 0 -50 0 0 100 0 100 50
0 50 0 0 50 0 50 -50 0 -50 0 0 100 0 100 50 0 50 0 0 50 0 50 50 0 50 0 0 50
0 50 100 0 100 0 0 -50z m-2122 -130 c201 -202 228 -609 56 -868 -45 -69 -104
-133 -115 -127 -4 3 -36 39 -69 80 l-61 74 30 28 c74 68 131 214 131 335 0
117 -48 244 -121 323 l-41 44 64 80 c35 44 66 80 69 80 3 1 29 -22 57 -49z
m-369 -216 c63 -71 85 -139 85 -259 0 -80 -5 -111 -23 -157 -20 -52 -103 -160
-113 -148 -124 150 -130 159 -110 180 22 24 42 84 42 129 0 36 -23 97 -46 122
-15 16 -11 24 48 98 34 44 66 80 70 80 3 1 25 -20 47 -45z m2091 -1904 l0
-200 -100 0 -100 0 0 200 0 200 100 0 100 0 0 -200z m400 0 l0 -200 -100 0
-100 0 0 200 0 200 100 0 100 0 0 -200z m400 0 l0 -200 -100 0 -100 0 0 200 0
200 100 0 100 0 0 -200z m800 0 l0 -200 -100 0 -100 0 0 200 0 200 100 0 100
0 0 -200z"/>
<path d="M5030 3020 l0 -300 300 0 300 0 0 300 0 300 -300 0 -300 0 0 -300z"/>
</g>
</svg>
+3
View File
@@ -0,0 +1,3 @@
import noImagePlaceholder from './no-Image-placeholder.svg'
export { noImagePlaceholder }
@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" sodipodi:docname="No-Image-Placeholder.svg" inkscape:version="1.0 (4035a4fb49, 2020-05-01)" version="1.1" id="svg2" viewBox="0 0 329.77792 406.00738" height="406.00739" width="329.77792">
<defs id="defs4">
<linearGradient id="linearGradient967" inkscape:collect="always">
<stop id="stop963" offset="0" style="stop-color:#c2c2c2;stop-opacity:1"/>
<stop id="stop965" offset="1" style="stop-color:#9f9f9f;stop-opacity:1"/>
</linearGradient>
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3414" effect="spiro"/>
<inkscape:path-effect lpeversion="0" effect="spiro" id="path-effect3410" is_visible="true"/>
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3406" effect="spiro"/>
<inkscape:path-effect lpeversion="0" effect="spiro" id="path-effect3402" is_visible="true"/>
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3398" effect="spiro"/>
<inkscape:path-effect lpeversion="0" effect="spiro" id="path-effect3392" is_visible="true"/>
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3388" effect="spiro"/>
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3372" effect="spiro"/>
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3368" effect="spiro"/>
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3364" effect="spiro"/>
<inkscape:path-effect lpeversion="0" effect="spiro" id="path-effect3360" is_visible="true"/>
<inkscape:path-effect lpeversion="0" is_visible="true" id="path-effect3346" effect="spiro"/>
<inkscape:path-effect lpeversion="0" effect="spiro" id="path-effect3392-8" is_visible="true"/>
<linearGradient gradientTransform="translate(-45.254833,0.35355338)" gradientUnits="userSpaceOnUse" y2="108.77648" x2="658.45801" y1="6.5995569" x1="660.06653" id="linearGradient969" xlink:href="#linearGradient967" inkscape:collect="always"/>
</defs>
<sodipodi:namedview inkscape:document-rotation="0" inkscape:window-maximized="1" inkscape:window-y="42" inkscape:window-x="0" inkscape:window-height="1004" inkscape:window-width="1920" units="px" fit-margin-bottom="0" fit-margin-right="0" fit-margin-left="0" fit-margin-top="0" inkscape:guide-bbox="true" inkscape:snap-smooth-nodes="true" showguides="false" inkscape:object-nodes="true" showgrid="false" inkscape:current-layer="layer1" inkscape:document-units="px" inkscape:cy="109.10202" inkscape:cx="148.40044" inkscape:zoom="0.7071068" inkscape:pageshadow="2" inkscape:pageopacity="0.0" borderopacity="1.0" bordercolor="#666666" pagecolor="#ffffff" id="base">
<inkscape:grid originy="-510.42818" originx="-399.13435" id="grid3336" type="xygrid"/>
<sodipodi:guide id="guide3375" orientation="0,1" position="-117.13437,-25.564321"/>
<sodipodi:guide id="guide3377" orientation="0,1" position="-114.13437,-23.564321"/>
<sodipodi:guide id="guide3380" orientation="0,1" position="-121.13437,-27.564321"/>
<sodipodi:guide id="guide3382" orientation="0,1" position="-114.13437,-22.564321"/>
<sodipodi:guide id="guide3384" orientation="0,1" position="-114.13437,-21.564321"/>
<sodipodi:guide id="guide3416" orientation="-2,0.5" position="-115.13437,-25.564311"/>
<sodipodi:guide id="guide3420" orientation="-2,0.5" position="-115.13437,-25.564311"/>
<sodipodi:guide id="guide4180" orientation="0.24382204,-0.96981999" position="206.80442,220.41193"/>
<sodipodi:guide id="guide4182" orientation="1,0" position="86.804424,280.52227"/>
<sodipodi:guide id="guide4186" orientation="1,0" position="206.80442,250.52231"/>
<sodipodi:guide id="guide4188" orientation="-0.24382199,0.96982" position="206.80442,190.30156"/>
</sodipodi:namedview>
<metadata id="metadata7">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g transform="translate(-399.13437,-122.79051)" id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1">
<rect ry="7.0136137" y="122.79051" x="399.13437" height="406.00739" width="329.77792" id="rect1017" style="fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.59331;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
<g transform="translate(43.778173,191.04163)" id="g1015">
<rect style="fill:#9f9f9f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.2995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="rect1002" width="82.489967" height="90.470001" x="398.75827" y="178.74706" ry="8.3970251" transform="rotate(-16.342822)"/>
<g id="g1000" transform="rotate(16.320529,538.13563,-184.89727)">
<rect ry="4.5961938" y="1.6498091" x="547.18585" height="115.96551" width="107.83378" id="rect961" style="fill:url(#linearGradient969);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:5.398;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"/>
<g style="stroke:#ffffff;stroke-width:13.0708;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="matrix(0.17265471,0,0,0.17265471,512.49324,-6.3296456)" id="g875">
<rect style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="rect3338" width="491.10556" height="449.99814" x="270" y="107.36227"/>
<rect style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" id="rect3342" width="491.10559" height="209.99976" x="270" y="107.36227"/>
<path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 300,317.36255 38.46147,-53.53818 60.53097,-45.16084 15.88277,18.57394 13.61285,-38.68356 8.20133,-2.98188 13.3106,-28.2093 180,179.99979" id="path3344" inkscape:path-effect="#path-effect3346" inkscape:original-d="m 300,317.36255 38.46147,-53.53818 60.53097,-45.16084 15.88277,18.57394 13.61285,-38.68356 8.20133,-2.98188 13.3106,-28.2093 180,179.99979" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc"/>
<path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 180,60 c 4.09311,16.474688 7.71219,33.067277 10.85156,49.75 2.38256,12.66097 4.48857,25.37408 6.31641,38.12695 l -22.06445,-7.16015 -46.11133,-29.41602 5.32422,46.42578 -1.61524,24.78711 10.05274,30.37695 73.18554,-11.75585 L 300,180 252.19922,102.56641 242.5,117.5 215.375,95.375 Z" transform="translate(270,107.36227)" id="path3390-0" inkscape:connector-curvature="0" sodipodi:nodetypes="cscccccccccccc"/>
<path inkscape:connector-curvature="0" inkscape:original-d="m 419.99999,347.36252 81.89918,-74.42959 18.50574,-9.68009 23.6512,-44.18894 25.94388,-21.70121 179.99999,179.99979" inkscape:path-effect="#path-effect3360" id="path3358" d="m 419.99999,347.36252 81.89918,-74.42959 18.50574,-9.68009 23.6512,-44.18894 25.94388,-21.70121 179.99999,179.99979" style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cccccc;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" sodipodi:nodetypes="cccccc"/>
<path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 569.99999,197.36269 35.9388,80.91289 v 30.11038 30.11038 l 22.45864,19.46652 c 6.52453,-6.45031 14.14893,-11.78526 22.44431,-15.70477 14.8245,-7.00447 31.33823,-9.35959 47.17057,-13.6217 6.42776,-1.73037 12.90672,-3.85419 18.21343,-7.87277 1.35174,-1.02362 2.61592,-2.16281 3.77424,-3.40107 h -30 l -40.52149,-40.55006 -29.85645,-48.91972 -10.25307,8.83886 z" id="path3386" inkscape:path-effect="#path-effect3388" inkscape:original-d="m 569.99999,197.36269 35.9388,80.91289 v 30.11038 30.11038 l 22.45864,19.46652 c 5.77311,-6.36416 13.54339,-11.40815 22.44431,-15.70477 13.00316,-6.27685 32.0432,-8.74899 47.17057,-13.6217 6.8762,-2.21491 12.68001,-4.81998 18.21343,-7.87277 1.55883,-0.86001 1.99765,-2.671 3.77424,-3.40107 h -30 l -40.52149,-40.55006 -29.85645,-48.91972 -10.25307,8.83886 z" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccssscccccc"/>
<path style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:13.0708;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="m 419.99999,557.36227 c -0.41699,-9.60089 -8.81759,-17.60878 17.1252,-30.66806 31.8318,-16.02389 125.895,-35.88836 152.1537,-59.98434 19.42709,-17.82687 -70.4154,-37.66945 -55.0191,-59.07323 6.981,-9.70528 59.037,-19.96947 82.1463,-30.27386 21.90569,-9.76799 15.14129,-19.80328 31.4046,-29.97507 15.7092,-9.82558 68.3499,-19.77358 72.18929,-30.02516 -10.41359,10.52188 -68.83379,20.40327 -89.99999,30.00026 -22.3377,10.128 -21.4689,19.93018 -49.4313,29.48367 -30.1245,10.29239 -89.142,20.55268 -102.7077,30.51626 -28.4133,20.86858 46.863,42.59995 16.2024,59.99993 C 452.54309,490.92554 344.7219,510.65712 300,527.3626 c -30.9039,11.54369 -28.4079,17.74799 -30,29.99967" id="path3370" inkscape:connector-curvature="0" sodipodi:nodetypes="cssssscsssssc"/>
</g>
</g>
</g>
<text id="text1021" y="412.12527" x="562.00677" style="font-style:normal;font-weight:normal;font-size:32px;line-height:1.25;font-family:sans-serif;fill:#767676;fill-opacity:1;stroke:none" xml:space="preserve"><tspan style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:32px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle" y="412.12527" x="562.00677" id="tspan1019" sodipodi:role="line">NO IMAGE</tspan><tspan style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:32px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';text-align:center;text-anchor:middle" id="tspan1023" y="452.12527" x="562.00677" sodipodi:role="line">AVAILABLE</tspan></text>
</g>
</svg>
+9
View File
@@ -0,0 +1,9 @@
import { registry } from '@generated/registry'
import { createTuyau } from '@tuyau/core/client'
export const client = createTuyau({
baseUrl: '/',
registry,
})
export const urlFor = client.urlFor
+14
View File
@@ -0,0 +1,14 @@
import { ref, watch } from 'vue'
// Cr├®er une r├®f├®rence pour isAdminActive
const isAdminActive = ref(JSON.parse(localStorage.getItem('isAdminActive') || 'false'))
// Surveiller les changements de isAdminActive et mettre à jour localStorage
watch(isAdminActive, (newValue) => {
localStorage.setItem('isAdminActive', JSON.stringify(newValue))
})
// Exporter une fonction pour utiliser isAdminActive
export function useAdminMode() {
return { isAdminActive }
}
+9
View File
@@ -0,0 +1,9 @@
import { ref } from 'vue'
const isOpen = ref(false)
export function useSidebar() {
return {
isOpen,
}
}
+240
View File
@@ -0,0 +1,240 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
:root {
--gray-1: oklch(98.5% 0 0);
--gray-2: oklch(97% 0 0);
--gray-3: oklch(92.2% 0 0);
--gray-4: oklch(87% 0 0);
--gray-6: oklch(55.6% 0 0);
--gray-7: oklch(43.9% 0 0);
--gray-8: oklch(37.1% 0 0);
--gray-10: oklch(26.9% 0 0);
--gray-12: oklch(14.5% 0 0);
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html,
body {
height: 100%;
font-family: system-ui, sans-serif;
-webkit-font-smoothing: antialiased;
background: var(--gray-2);
color: var(--gray-10);
font-size: 16px;
line-height: 1.5;
}
a {
color: inherit;
text-decoration: none;
}
[x-cloak] {
display: none;
}
h1,
h2,
h3,
h4,
h5,
h6 {
color: var(--gray-12);
}
/* Header */
header {
max-width: 1440px;
margin: auto;
padding: 0 30px;
}
header > div {
display: flex;
justify-content: space-between;
align-items: center;
height: 64px;
}
header nav {
display: flex;
align-items: center;
gap: 26px;
}
header nav a {
font-weight: 500;
color: var(--gray-8);
}
header nav a:hover,
header nav a.current {
color: var(--gray-12);
}
/* Main */
main {
max-width: 1440px;
margin: 0 30px;
display: flex;
flex-direction: column;
justify-content: space-between;
min-height: calc(100vh - 65px);
background: #fff;
border: 1px solid var(--gray-3);
}
.hero {
padding: 100px 50px;
max-width: 880px;
}
.hero h1 {
margin-bottom: 15px;
font-size: 52px;
font-weight: 600;
letter-spacing: -1px;
line-height: 1.05;
}
.hero p {
font-size: 22px;
color: var(--gray-7);
}
.hero .button {
margin-top: 30px;
display: inline-block;
padding: 10px 16px;
}
.cards {
display: grid;
grid-template-columns: repeat(3, 1fr);
padding: 0 50px;
border-top: 1px solid var(--gray-3);
}
.cards a {
padding: 30px 40px;
border-right: 1px solid var(--gray-3);
}
.cards a:first-child {
border-left: 1px solid var(--gray-3);
}
.cards a:hover {
background: var(--gray-1);
}
.cards h3 {
margin-bottom: 10px;
font-size: 20px;
font-weight: 600;
letter-spacing: -0.4px;
}
.cards p {
color: var(--gray-6);
}
/* Form */
.form-container {
display: flex;
flex-direction: column;
justify-content: center;
max-width: 400px;
margin: auto;
}
.form-container h1 {
font-size: 32px;
letter-spacing: -0.5px;
margin-bottom: 5px;
}
.form-container p {
font-size: 18px;
margin-bottom: 48px;
color: var(--gray-6);
}
form {
display: flex;
flex-direction: column;
gap: 24px;
}
label {
margin-bottom: 4px;
display: block;
font-size: 14px;
font-weight: 500;
}
input,
textarea,
button {
width: 100%;
border-radius: 4px;
font: inherit;
}
input {
height: 40px;
border: 1px solid var(--gray-4);
padding: 0 16px;
}
input[data-invalid='true'],
textarea[data-invalid='true'] {
border-color: #fb2c36;
}
input[data-invalid='true'] + div,
textarea[data-invalid='true'] + div {
color: #fb2c36;
font-size: 14px;
font-weight: 500;
margin-top: 2px;
}
button {
background: var(--gray-12);
color: #fff;
border: none;
padding: 10px;
font-weight: 500;
}
button:hover {
background: var(--gray-10);
}
/* Alerts */
.alert {
background: #fff;
position: relative;
padding: 12px 16px;
font-size: 14px;
min-width: 380px;
font-weight: 500;
border: 1px solid var(--gray-3);
border-radius: 10px;
animation: scale-up 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) both;
}
.alert-destructive {
color: #fb2c36;
background: #fb2c361a;
border-color: #fb2c36;
}
.alert-success {
color: #00a63e;
background: #00a63e1a;
border-color: #00a63e;
}
.flash-container {
position: fixed;
top: 80px;
left: 0;
right: 0;
display: flex;
flex-direction: column;
align-items: center;
}
@keyframes scale-up {
from {
transform: scale(0.7);
}
to {
transform: scale(1);
}
}
+54
View File
@@ -0,0 +1,54 @@
import { createApp, DirectiveBinding, h, ObjectDirective } from 'vue'
import DeleteConfirmationModal from '~/pages/widgets/DeleteConfirmationModal.vue'
// Interface pour ├®tendre HTMLElement avec _handleClick
interface HTMLElementWithHandleClick extends HTMLElement {
_handleClick?: (event: Event) => void
}
const deleteConfirmDirective: ObjectDirective<HTMLElementWithHandleClick> = {
mounted(el: HTMLElementWithHandleClick, binding: DirectiveBinding) {
const handleClick = (event: Event) => {
event.stopPropagation() // Emp├¬cher la propagation de l'├®v├®nement
event.preventDefault() // Emp├¬cher l'action par d├®faut
const modalApp = createApp({
data() {
return { show: true }
},
methods: {
confirm() {
this.show = false
document.body.removeChild(modalContainer)
binding.value() // Ex├®cuter la fonction de suppression
},
cancel() {
this.show = false
document.body.removeChild(modalContainer)
},
},
render() {
return h(DeleteConfirmationModal, {
show: this.show,
onConfirm: this.confirm,
onCancel: this.cancel,
})
},
})
const modalContainer = document.createElement('div')
document.body.appendChild(modalContainer)
modalApp.mount(modalContainer)
}
el.addEventListener('click', handleClick)
el._handleClick = handleClick // Stocker la r├®f├®rence pour la suppression ult├®rieure
},
unmounted(el: HTMLElementWithHandleClick) {
if (el._handleClick) {
el.removeEventListener('click', el._handleClick)
}
},
}
export default deleteConfirmDirective
+30
View File
@@ -0,0 +1,30 @@
import { ObjectDirective } from 'vue'
// Fonction pour formater le prix
const formatPrice = (value: string): string => {
const numberValue = Number.parseFloat(value)
return Number.isNaN(numberValue) ? '' : numberValue.toFixed(2).replace('.', ',')
}
// Interface pour ├®tendre HTMLInputElement avec _handleBlur
interface HTMLInputElementWithHandleBlur extends HTMLInputElement {
_handleBlur?: () => void
}
const priceDirective: ObjectDirective<HTMLInputElementWithHandleBlur> = {
mounted(el: HTMLInputElementWithHandleBlur) {
const handleBlur = () => {
el.value = formatPrice(el.value)
el.dispatchEvent(new Event('input')) // Pour mettre à jour le v-model
}
el.addEventListener('blur', handleBlur)
el._handleBlur = handleBlur // Stocker la r├®f├®rence pour la suppression ult├®rieure
},
unmounted(el: HTMLInputElementWithHandleBlur) {
if (el._handleBlur) {
el.removeEventListener('blur', el._handleBlur)
}
},
}
export default priceDirective
+111
View File
@@ -0,0 +1,111 @@
import { createVNode, DirectiveBinding, ObjectDirective, render } from 'vue'
import ValidationError from '~/pages/widgets/ValidationError.vue'
interface ValidationErrorBinding extends DirectiveBinding {
value: string | null
}
const validationErrorDirective: ObjectDirective<HTMLElement, string | null> = {
mounted(el: HTMLElement, binding: ValidationErrorBinding) {
const errorMessage = binding.value
const fieldName = el.getAttribute('name')
if (errorMessage && fieldName) {
const container = document.createElement('div')
container.classList.add(`validation-error-container-${fieldName}`)
container.classList.add(
'transition-all',
'duration-2500',
'ease-in-out',
'w-0',
'opacity-0'
) // Ajout des classes Tailwind pour la transition
container.style.position = 'absolute'
container.style.bottom = '-17px'
container.style.right = '0px'
container.style.whiteSpace = 'nowrap'
container.style.textAlign = 'right'
if (el.parentNode && el.parentNode instanceof HTMLElement) {
el.parentNode.style.position = 'relative'
el.parentNode.appendChild(container)
const vnode = createVNode(ValidationError, { message: errorMessage })
render(vnode, container)
// Force reflow pour d├®clencher la transition
void container.offsetWidth
container.classList.remove('w-0', 'opacity-0')
container.classList.add('w-full', 'opacity-100')
// Attach the container to the element for future reference
;(el as any)._validationErrorContainer = container
} else {
console.error('Parent node is null or not an HTMLElement during mounted')
}
}
},
updated(el: HTMLElement, binding: ValidationErrorBinding) {
const errorMessage = binding.value
const fieldName = el.getAttribute('name')
let container = (el as any)._validationErrorContainer
if (errorMessage && fieldName) {
if (container) {
const vnode = createVNode(ValidationError, { message: errorMessage })
render(vnode, container)
} else {
const newContainer = document.createElement('div')
newContainer.classList.add(`validation-error-container-${fieldName}`)
newContainer.classList.add(
'transition-all',
'duration-2500',
'ease-in-out',
'w-0',
'opacity-0'
) // Ajout des classes Tailwind pour la transition
newContainer.style.position = 'absolute'
newContainer.style.bottom = '-17px'
newContainer.style.right = '0px'
newContainer.style.whiteSpace = 'nowrap'
newContainer.style.textAlign = 'right'
if (el.parentNode && el.parentNode instanceof HTMLElement) {
el.parentNode.style.position = 'relative'
el.parentNode.appendChild(newContainer)
const vnode = createVNode(ValidationError, { message: errorMessage })
render(vnode, newContainer)
// Force reflow pour d├®clencher la transition
void newContainer.offsetWidth
newContainer.classList.remove('w-0', 'opacity-0')
newContainer.classList.add('w-100', 'opacity-100')
// Attach the container to the element for future reference
;(el as any)._validationErrorContainer = newContainer
} else {
console.error('Parent node is null or not an HTMLElement during updated')
}
}
} else if (container) {
container.classList.remove('w-100', 'opacity-100')
container.classList.remove('transition-all', 'duration-2500', 'ease-in-out') // Supprimez les classes de transition pour la disparition
container.classList.add('w-0', 'opacity-0')
// Supprimez le conteneur imm├®diatement sans d├®lai
render(null, container)
container.remove()
;(el as any)._validationErrorContainer = null
}
},
unmounted(el: HTMLElement) {
// Clean up the error container when the element is unmounted
const container = (el as any)._validationErrorContainer
if (container) {
render(null, container)
container.remove()
}
},
}
export default validationErrorDirective
+70
View File
@@ -0,0 +1,70 @@
<script setup lang="ts">
import { watch } from 'vue'
import { usePage } from '@inertiajs/vue3'
import { toast, Toaster } from 'vue-sonner'
import type { Data } from '@generated/data'
import { Link, Form } from '@adonisjs/inertia/vue'
const page = usePage<Data.SharedProps>()
watch(
() => page.url,
() => toast.dismiss()
)
watch(
() => page.props.flash,
(flashMessages) => {
if (flashMessages.error) {
toast.error(flashMessages.error)
}
if (flashMessages.success) {
toast.success(flashMessages.success)
}
},
{ immediate: true }
)
</script>
<template>
<header>
<div>
<div>
<Link route="home">
<svg
width="66"
height="24"
viewBox="0 0 105 38"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M0 0h7.5v15H0ZM7.5 15h7.5v15H7.5ZM15 30h7.5v7.5H15ZM22.5 15h7.5v15H22.5ZM30 0h7.5v15H30ZM45 0h7.5v30h15v-30h7.5v37.5h-30v-37.5ZM82.5 37.5V0H105v7.5H90V15h15v7.5H90V30h15v7.5H82.5Z"
fill="currentColor"
/>
</svg>
</Link>
</div>
<div>
<nav>
<template v-if="page.props.user">
<span>{{ page.props.user.initials }}</span>
<Form route="session.destroy">
<button type="submit">Logout</button>
</Form>
</template>
<template v-else>
<Link route="new_account.create">Signup</Link>
<Link route="session.create">Login</Link>
</template>
</nav>
</div>
</div>
</header>
<main>
<slot />
</main>
<Toaster position="top-center" rich-colors />
</template>
+98
View File
@@ -0,0 +1,98 @@
<script setup lang="ts">
import { Form, Link } from '@adonisjs/inertia/vue'
import { useForm } from '@inertiajs/vue3'
import EmptyLayout from '~/pages/layout/emptyLayout.vue'
defineOptions({ layout: EmptyLayout })
const form = useForm({
fullName: '',
email: '',
password: '',
passwordConfirmation: '',
})
</script>
<template>
<div class="flex items-center justify-center min-h-screen px-4 py-8 bg-gradient-to-br from-gray-100 to-gray-200">
<div class="w-full max-w-md p-6 sm:p-8 bg-white rounded-lg shadow-lg">
<div class="flex flex-col items-center justify-center mb-8">
<h1 class="text-2xl sm:text-3xl font-bold text-gray-800">Create Account</h1>
<p class="text-sm text-gray-600 mt-2">Join PC Creator today</p>
</div>
<Form route="account.signup" #default="{ processing, errors }">
<div class="space-y-4 sm:space-y-6">
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Full Name</span>
<input
v-model="form.fullName"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="fullName"
type="text"
placeholder="Enter your full name"
/>
</label>
</div>
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Email</span>
<input
v-model="form.email"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="email"
type="email"
placeholder="Enter your email"
/>
</label>
</div>
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Password</span>
<input
v-model="form.password"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="password"
type="password"
placeholder="Enter your password"
/>
</label>
</div>
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Confirm Password</span>
<input
v-model="form.passwordConfirmation"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="passwordConfirmation"
type="password"
placeholder="Confirm your password"
/>
</label>
</div>
<button
type="submit"
:disabled="processing"
class="w-full px-3 sm:px-4 py-2 sm:py-3 mt-6 sm:mt-8 text-base font-semibold text-white bg-indigo-600 rounded-lg hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500/40 transition disabled:opacity-50 disabled:cursor-not-allowed"
>
{{ processing ? 'Creating account...' : 'Sign Up' }}
</button>
<div class="text-center mt-4">
<p class="text-sm text-gray-600">
Already have an account?
<Link route="auth.show_login" class="text-indigo-600 hover:text-indigo-700 font-semibold">
Login
</Link>
</p>
</div>
</div>
</Form>
</div>
</div>
</template>
+124
View File
@@ -0,0 +1,124 @@
<script lang="ts" setup>
import { Link, useForm } from '@inertiajs/vue3'
import { computed } from 'vue'
import EmptyLayout from '~/pages/layout/emptyLayout.vue'
defineOptions({ layout: EmptyLayout })
const props = defineProps<{ errors?: any[] | any }>()
const vineErrors = computed(() => {
if (Array.isArray(props.errors)) {
return props.errors as any[]
}
return []
})
const authError = computed(() => {
if (!Array.isArray(props.errors) && props.errors) {
return props.errors as any
}
return null
})
const form = useForm({
email: '',
password: '',
})
function getErrorMessage(field: string): string | null {
const error = vineErrors.value.find((error) => error.field === field)
return error ? error.message : null
}
console.log(authError)
console.log(vineErrors)
console.log(props)
</script>
<template>
<div class="flex items-center justify-center min-h-screen px-4 py-8 bg-gradient-to-br from-gray-100 to-gray-200">
<div class="w-full max-w-md p-6 sm:p-8 bg-white rounded-lg shadow-lg">
<div class="flex flex-col items-center justify-center mb-8">
<div class="mb-4">
<svg
class="w-12 h-12 sm:w-14 sm:h-14 text-indigo-600"
fill="currentColor"
preserveAspectRatio="xMidYMid meet"
viewBox="0 0 494.000000 555.000000"
xmlns="http://www.w3.org/2000/svg"
>
<g transform="translate(0.000000,555.000000) scale(0.100000,-0.100000)">
<path
d="M3090 3400 l0 -1950 -1190 0 -1190 0 0 234 c0 190 3 236 14 245 23 19 164 30 606 46 228 9 485 20 570 25 134 9 895 40 965 40 23 0 25 -4 25 -44 l0 -44 -82 -6 c-46 -3 -146 -8 -223 -11 -77 -3 -239 -12 -360 -20 -121 -8 -335 -19 -475 -25 -387 -15 -650 -32 -650 -41 0 -12 196 -11 515 1 257 10 1267 32 1271 27 7 -9 12 -74 6 -84 -7 -11 -190 -21 -777 -43 -437 -16 -748 -30 -777 -36 -16 -3 -28 -10 -28 -15 0 -13 837 -11 1237 2 360 12 343 15 343 -53 0 -36 -1 -37 -42 -42 -24 -3 -182 -8 -353 -11 -501 -10 -923 -31 -907 -47 4 -4 315 -7 690 -6 l682 3 -1 1445 c-1 795 -3 1488 -3 1540 -1 52 -2 249 -4 437 l-2 343 -23 5 c-23 6 -39 -1 -417 -200 -107 -56 -242 -127 -300 -157 -151 -80 -311 -164 -415 -218 -49 -26 -133 -70 -185 -97 -99 -53 -146 -77 -450 -238 -378 -199 -494 -265 -467 -265 3 0 134 64 293 143 159 79 381 188 494 243 113 54 440 216 727 360 494 248 613 303 613 285 0 -7 -59 -49 -135 -96 -66 -42 -219 -120 -875 -449 -377 -188 -741 -375 -810 -413 -69 -39 -150 -83 -180 -99 -32 -16 -48 -29 -39 -31 8 -2 57 17 107 42 51 25 94 45 96 45 2 0 95 44 207 99 346 167 404 190 404 162 0 -20 -55 -51 -385 -219 -304 -155 -360 -187 -360 -202 0 -14 22 -12 92 6 33 8 62 13 64 11 8 -8 -8 -37 -21 -37 -17 0 -95 -58 -95 -71 0 -14 52 -2 117 27 28 13 55 24 60 24 4 0 96 40 203 89 107 49 198 87 203 84 4 -2 7 -14 7 -27 0 -19 -16 -31 -97 -69 -67 -32 -87 -45 -64 -42 18 3 84 5 146 5 l112 0 17 45 c21 53 56 85 149 131 136 69 42 42 -156 -45 -62 -27 -67 -27 -67 7 0 23 8 31 63 56 34 17 148 72 254 123 106 51 194 93 198 93 3 0 5 -7 5 -16 0 -8 5 -24 11 -35 15 -28 39 -7 39 35 0 17 4 36 8 42 4 6 54 32 112 59 58 26 152 70 210 97 217 104 220 104 220 53 0 -42 -4 -45 -177 -121 -73 -32 -131 -59 -129 -61 2 -2 46 6 97 17 128 29 306 29 402 1 38 -11 75 -25 83 -32 11 -9 14 -43 14 -150 l0 -138 -27 -18 c-77 -52 -150 -70 -353 -84 l-155 -10 -45 -49 c-80 -86 -204 -129 -390 -136 l-125 -4 -17 -35 c-24 -45 -70 -79 -138 -101 -58 -18 -85 -34 -58 -34 9 0 18 -4 20 -9 4 -11 271 68 523 154 36 12 97 29 150 41 63 14 -125 -59 -495 -192 -173 -61 -71 -56 125 6 56 18 222 69 410 125 44 13 135 42 203 65 68 22 127 38 133 35 9 -6 4 -254 -7 -302 -2 -12 -13 -27 -23 -32 -17 -9 -19 -2 -31 94 -6 58 -16 105 -21 105 -5 0 -9 -58 -9 -128 0 -121 -1 -130 -23 -150 -34 -32 -47 -28 -47 16 -1 57 -11 196 -15 208 -4 14 -134 59 -143 49 -4 -3 -5 -92 -3 -196 3 -191 -1 -219 -34 -219 -9 0 -14 49 -19 183 -4 106 -11 186 -18 192 -7 7 -9 -49 -5 -192 3 -157 2 -203 -8 -203 -16 0 -25 88 -25 241 0 68 -4 120 -10 124 -12 7 -12 10 -10 -212 1 -143 -1 -173 -13 -173 -19 0 -27 69 -27 233 0 78 -4 127 -10 127 -6 0 -10 -42 -10 -105 0 -58 -2 -105 -5 -105 -2 0 -36 17 -75 37 -117 61 -220 50 -305 -33 -25 -24 -48 -44 -50 -44 -3 0 -5 29 -5 65 0 78 -11 87 -112 89 l-68 1 0 30 c0 17 -4 36 -9 43 -5 8 -48 22 -97 32 -49 10 -163 34 -254 53 -173 37 -338 63 -346 54 -5 -5 8 -8 246 -67 291 -71 324 -80 376 -95 l51 -15 5 -348 c3 -191 2 -351 -2 -355 -8 -9 -114 -1 -487 40 l-253 27 -30 -29 c-22 -21 -31 -25 -34 -14 -2 8 -7 199 -10 424 -5 396 -5 411 14 440 16 24 20 47 20 112 l0 81 -54 46 c-29 25 -56 46 -60 46 -3 0 -6 -609 -6 -1354 0 -1225 2 -1354 16 -1360 9 -3 37 -6 62 -6 59 0 65 -4 87 -63 10 -26 22 -50 26 -53 5 -3 9 -14 9 -25 0 -16 -7 -19 -55 -19 -59 0 -125 -21 -125 -40 0 -9 435 -11 1693 -8 1641 3 1694 4 1722 22 l29 19 -22 18 -22 18 40 54 c40 54 61 67 108 67 l22 0 -2 1718 -3 1717 -51 26 c-27 14 -208 102 -402 194 -193 92 -417 203 -498 246 -81 44 -153 79 -160 79 -12 0 -14 -307 -14 -1950z m338 1624 c106 -52 196 -94 200 -94 17 0 353 -174 381 -198 l32 -27 3 -1140 c3 -1319 1 -1584 -16 -1567 -22 22 -44 800 -48 1687 -1 363 -5 738 -9 834 l-6 174 -125 70 c-69 38 -174 94 -235 125 -181 91 -379 202 -400 224 l-20 20 25 -7 c14 -4 112 -50 218 -101z m-788 -93 c0 -12 -288 -151 -313 -151 -19 0 -19 2 -7 14 13 13 232 126 270 139 24 9 50 8 50 -2z"
/>
</g>
</svg>
</div>
<h1 class="text-2xl sm:text-3xl font-bold text-gray-800">PC Creator</h1>
</div>
<form class="space-y-4 sm:space-y-6">
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Email</span>
<input
v-model="form.email"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="email"
type="email"
placeholder="Enter your email"
/>
</label>
</div>
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Password</span>
<input
v-model="form.password"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="password"
type="password"
placeholder="Enter your password"
/>
</label>
</div>
<div class="flex items-center justify-between pt-2">
<label class="flex items-center cursor-pointer">
<input
class="w-4 h-4 text-indigo-600 border-gray-300 rounded focus:ring-2 focus:ring-indigo-500/40"
type="checkbox"
/>
<span class="ml-2 text-sm text-gray-600">Remember me</span>
</label>
</div>
<Link
:data="form"
as="button"
class="w-full px-3 sm:px-4 py-2 sm:py-3 mt-6 sm:mt-8 text-base font-semibold text-white bg-indigo-600 rounded-lg hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500/40 transition"
href="/auth/login"
method="post"
type="button"
>
Login
</Link>
<Link
as="button"
class="w-full px-3 sm:px-4 py-2 sm:py-3 mt-3 sm:mt-4 text-base font-semibold text-indigo-600 bg-gray-100 rounded-lg hover:bg-gray-200 focus:outline-none focus:ring-2 focus:ring-indigo-500/40 transition"
href="/account/signup"
type="button"
>
Create an account
</Link>
</form>
</div>
</div>
</template>
<style scoped>
/* No inline styles - using Tailwind classes only */
</style>
+98
View File
@@ -0,0 +1,98 @@
<script setup lang="ts">
import { Form, Link } from '@adonisjs/inertia/vue'
import { useForm } from '@inertiajs/vue3'
import EmptyLayout from '~/pages/layout/emptyLayout.vue'
defineOptions({ layout: EmptyLayout })
const form = useForm({
fullName: '',
email: '',
password: '',
passwordConfirmation: '',
})
</script>
<template>
<div class="flex items-center justify-center min-h-screen px-4 py-8 bg-gradient-to-br from-gray-100 to-gray-200">
<div class="w-full max-w-md p-6 sm:p-8 bg-white rounded-lg shadow-lg">
<div class="flex flex-col items-center justify-center mb-8">
<h1 class="text-2xl sm:text-3xl font-bold text-gray-800">Create Account</h1>
<p class="text-sm text-gray-600 mt-2">Join PC Creator today</p>
</div>
<Form route="account.signup" #default="{ processing, errors }">
<div class="space-y-4 sm:space-y-6">
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Full Name</span>
<input
v-model="form.fullName"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="fullName"
type="text"
placeholder="Enter your full name"
/>
</label>
</div>
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Email</span>
<input
v-model="form.email"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="email"
type="email"
placeholder="Enter your email"
/>
</label>
</div>
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Password</span>
<input
v-model="form.password"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="password"
type="password"
placeholder="Enter your password"
/>
</label>
</div>
<div>
<label class="block">
<span class="text-sm font-medium text-gray-700 mb-2 block">Confirm Password</span>
<input
v-model="form.passwordConfirmation"
class="w-full px-3 sm:px-4 py-2 sm:py-3 border-2 border-gray-300 rounded-lg focus:border-indigo-600 focus:ring-2 focus:ring-indigo-500/40 transition text-base"
name="passwordConfirmation"
type="password"
placeholder="Confirm your password"
/>
</label>
</div>
<button
type="submit"
:disabled="processing"
class="w-full px-3 sm:px-4 py-2 sm:py-3 mt-6 sm:mt-8 text-base font-semibold text-white bg-indigo-600 rounded-lg hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500/40 transition disabled:opacity-50 disabled:cursor-not-allowed"
>
{{ processing ? 'Creating account...' : 'Sign Up' }}
</button>
<div class="text-center mt-4">
<p class="text-sm text-gray-600">
Already have an account?
<Link route="auth.show_login" class="text-indigo-600 hover:text-indigo-700 font-semibold">
Login
</Link>
</p>
</div>
</div>
</Form>
</div>
</div>
</template>
+116
View File
@@ -0,0 +1,116 @@
<script setup lang="ts">
import { computed, reactive } from 'vue'
import { Link, useForm } from '@inertiajs/vue3'
const props = defineProps<{ types: any[]; errors?: any[] }>()
const errors = computed(() => props.errors || [])
const form = reactive({
name: '',
price: 0,
type_id: null,
purchase_date: new Date().toISOString().split('T')[0],
quantity: 1,
})
function getErrorMessage(field: string): string | null {
const error = errors.value.find((error) => error.field === field)
return error ? error.message : null
}
function formatDateForMySQL(date: string) {
const d = new Date(date)
const year = d.getFullYear()
const month = String(d.getMonth() + 1).padStart(2, '0')
const day = String(d.getDate()).padStart(2, '0')
form.purchase_date = `${year}-${month}-${day}`
}
function submitForm() {
const inertiaForm = useForm(form)
inertiaForm.post('/components')
}
</script>
<template>
<div class="max-w-2xl mx-auto p-8 bg-white shadow-lg rounded-lg">
<h1 class="text-2xl font-semibold mb-8 text-gray-800">Create New Component</h1>
<form @submit.prevent="submitForm" class="space-y-6">
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="name">Name</label>
<input
name="name"
v-model="form.name"
class="w-full mt-2 border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 px-3 py-2 border rounded text-gray-700"
type="text"
/>
</div>
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="price">Price</label>
<input
name="price"
v-model.number="form.price"
class="w-full mt-2 border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 px-3 py-2 border rounded text-gray-700"
type="number"
step="0.01"
min="0"
/>
</div>
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="type">Type</label>
<select
name="type_id"
v-model.number="form.type_id"
id="type"
class="w-full mt-2 border-gray-200 focus:border-indigo-600 focus:ring-indigo-500 px-3 py-2 focus:ring-1 border rounded text-gray-700 bg-white"
>
<option disabled :value="null">Choose a type</option>
<option v-for="type in types" :key="type.id" :value="type.id">
{{ type.name }}
</option>
</select>
</div>
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="purchaseDate"
>Purchase Date</label
>
<input
name="purchase_date"
v-model="form.purchase_date"
class="w-full mt-2 border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 border rounded text-gray-700 px-3 py-2"
type="date"
/>
</div>
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="quantity">Quantity</label>
<input
name="quantity"
v-model.number="form.quantity"
class="w-full mt-2 border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 px-3 py-2 border rounded text-gray-700"
type="number"
min="1"
/>
</div>
<div class="flex gap-4">
<button
type="submit"
class="px-4 py-2 bg-indigo-600 text-white rounded hover:bg-indigo-700 transition"
>
Create
</button>
<Link
href="/components"
class="px-4 py-2 bg-gray-300 text-gray-800 rounded hover:bg-gray-400 transition"
>
Cancel
</Link>
</div>
</form>
</div>
</template>
<style scoped></style>
+101
View File
@@ -0,0 +1,101 @@
<script setup lang="ts">
import { computed, reactive } from 'vue'
import { Link, usePage } from '@inertiajs/vue3'
const { props } = usePage<{
component: any
types: any[]
origin: string
errors?: any[]
}>()
const { component, types, origin } = props
const errors = computed(() => props.errors || [])
const form = reactive({
id: component.id,
name: component.name,
price: component.price,
type_id: component.type.id,
purchase_date: component.purchaseDate,
origin: origin,
})
function getErrorMessage(field: string): string | null {
const error = errors.value.find((error) => error.field === field)
return error ? error.message : null
}
function formatDateForMySQL(date: string) {
const d = new Date(date)
const year = d.getFullYear()
const month = String(d.getMonth() + 1).padStart(2, '0')
const day = String(d.getDate()).padStart(2, '0')
form.purchase_date = `${year}-${month}-${day}`
}
</script>
<template>
<div class="max-w-2xl mx-auto p-8 bg-white shadow-lg rounded-lg">
<h1 class="text-2xl font-semibold mb-8 text-gray-800">Edit Component</h1>
<form class="space-y-6">
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="name">Name</label>
<input
name="name"
v-model="form.name"
class="w-full mt-2 border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 px-3 py-2 border rounded text-gray-700"
type="text"
/>
</div>
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="price">Price</label>
<input
name="price"
v-model="form.price"
class="w-full mt-2 border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 px-3 py-2 border rounded text-gray-700"
type="number"
step="0.01"
/>
</div>
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="type">Type</label>
<select
v-model="form.type_id"
id="type"
class="w-full mt-2 border-gray-200 focus:border-indigo-600 focus:ring-indigo-500 px-3 py-2 focus:ring-1 border rounded text-gray-700 bg-white"
>
<option disabled :value="null">Choose a type</option>
<option v-for="type in types" :key="type.id" :value="type.id">
{{ type.name }}
</option>
</select>
</div>
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="purchaseDate"
>Purchase Date</label
>
<input
name="purchase_date"
v-model="form.purchase_date"
class="w-full mt-2 border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 border rounded text-gray-700 px-3 py-2"
type="date"
/>
</div>
<Link
:href="`/components/${form.id}`"
method="put"
:data="form"
as="button"
class="w-full md:w-auto px-4 py-2 bg-indigo-600 text-white rounded hover:bg-blue-700 transition text-center"
>
Save
</Link>
</form>
</div>
</template>
<style scoped></style>
+43
View File
@@ -0,0 +1,43 @@
<script setup lang="ts">
import { Link } from '@inertiajs/vue3'
defineProps<{ components: any[] }>()
</script>
<template>
<div>
<div class="flex justify-between items-center">
<h3 class="text-3xl font-semibold text-gray-700">Components</h3>
<Link
href="/components/create"
type="button"
class="px-4 py-2 bg-indigo-600 text-white rounded hover:bg-blue-700 transition"
>
Add
</Link>
</div>
<div class="mt-6 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
<template v-if="components.length > 0">
<div
v-for="component in components"
:key="component.id"
class="p-4 border rounded-lg shadow hover:shadow-lg transition"
>
<h4 class="font-semibold text-lg text-gray-800">{{ component.name }}</h4>
<p class="text-gray-600">Type: {{ component.type?.name }}</p>
<p class="text-indigo-600 font-semibold">Price: ${{ component.price }}</p>
<Link
:href="`/components/${component.id}`"
class="mt-2 inline-block text-indigo-600 hover:text-indigo-700"
>
View Details
</Link>
</div>
</template>
<template v-else>
<p class="text-gray-500">No components yet. Create one to get started!</p>
</template>
</div>
</div>
</template>
+53
View File
@@ -0,0 +1,53 @@
<script setup lang="ts">
import { Link, usePage } from '@inertiajs/vue3'
const { props } = usePage<{ component: any }>()
const { component } = props
const originHeader = { 'X-Inertia-Origin': 'components' }
</script>
<template>
<div class="max-w-2xl mx-auto p-8 bg-white shadow-lg rounded-lg">
<h1 class="text-2xl font-semibold mb-8 text-gray-800">Component Details</h1>
<div class="mb-6">
<label class="block text-gray-700 text-sm font-bold mb-2" for="name">Name</label>
<div class="px-3 py-2 border rounded text-gray-700" id="name">
{{ component.name }}
</div>
</div>
<div class="mb-6">
<label class="block text-gray-700 text-sm font-bold mb-2" for="price">Price</label>
<div class="px-3 py-2 border rounded text-gray-700" id="price">${{ component.price }}</div>
</div>
<div class="mb-6">
<label class="block text-gray-700 text-sm font-bold mb-2" for="type">Type</label>
<div class="px-3 py-2 border rounded text-gray-700" id="type">
{{ component.type.name }}
</div>
</div>
<div class="mb-6">
<label class="block text-gray-700 text-sm font-bold mb-2" for="purchaseDate"
>Purchase Date</label
>
<div class="px-3 py-2 border rounded text-gray-700" id="purchaseDate">
{{ component.purchaseDate }}
</div>
</div>
<Link
:href="`/components/${component.id}/edit`"
type="button"
as="button"
class="w-full md:w-auto px-4 py-2 bg-indigo-600 text-white rounded hover:bg-blue-700 transition text-center"
:headers="originHeader"
>
Edit
</Link>
</div>
</template>
<style scoped></style>
+171
View File
@@ -0,0 +1,171 @@
<script setup lang="ts">
import { computed, reactive } from 'vue'
import { Link, usePage } from '@inertiajs/vue3'
const { props } = usePage<{
components: any[]
states: any[]
errors: any[]
}>()
const { components, states } = props
const errors = computed(() => props.errors || [])
const componentTypeOrder = [
'Processor',
'Motherboard',
'Graphic Card',
'Memory',
'SSD',
'Storage',
'Cooler',
'Power Supply',
'Case',
'WiFi-Card',
'Fan',
'Other',
]
const componentsByType = computed(() => {
const groups = new Map<string, any[]>()
components.forEach((component) => {
if (!groups.has(component.type.name)) {
groups.set(component.type.name, [])
}
groups.get(component.type.name)!.push(component)
})
return Array.from(groups)
.map(([type, components]) => ({ type, components }))
.sort((a, b) => componentTypeOrder.indexOf(a.type) - componentTypeOrder.indexOf(b.type))
})
const form = reactive({
title: '',
sellPrice: 0,
gpuScore: 0,
cpuScore: 0,
stateId: 1,
globalScore: 0,
componentsId: [] as number[],
})
function getErrorMessage(field: string): string | null {
const error = errors.value.find((error) => error.field === field)
return error ? error.message : null
}
</script>
<template>
<div class="max-w-4xl mx-auto p-8 bg-white shadow-lg rounded-lg">
<h1 class="text-2xl font-semibold mb-8 text-gray-800">Create New Computer</h1>
<form class="space-y-6">
<div class="mt-2">
<label class="block text-gray-700 text-sm font-bold mb-2" for="title">Title</label>
<input
name="title"
v-model="form.title"
class="w-full mt-2 border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 px-3 py-2 border rounded text-gray-700"
type="text"
/>
</div>
<div class="mt-2 grid grid-cols-3 gap-4">
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="gpuScore">GPU Score</label>
<input
name="gpuScore"
v-model="form.gpuScore"
class="w-full border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 px-3 py-2 border rounded text-gray-700"
type="number"
/>
</div>
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="cpuScore">CPU Score</label>
<input
name="cpuScore"
v-model="form.cpuScore"
class="w-full border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 px-3 py-2 border rounded text-gray-700"
type="number"
/>
</div>
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="globalScore"
>Global Score</label
>
<input
name="globalScore"
v-model="form.globalScore"
class="w-full border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 px-3 py-2 border rounded text-gray-700"
type="number"
/>
</div>
</div>
<div class="mt-2">
<label class="block text-gray-700 text-sm font-bold mb-2" for="components"
>Components</label
>
<div v-for="{ type, components } in componentsByType" :key="type">
<label :for="`select-${type}`" class="block text-gray-700 text-sm font-bold mb-1 mt-2">
{{ type }}
</label>
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4">
<div
v-for="component in components"
:key="component.id"
class="flex items-center mt-1"
>
<input
type="checkbox"
:id="`checkbox-${component.id}`"
:value="component.id"
v-model="form.componentsId"
class="mr-2"
/>
<label :for="`checkbox-${component.id}`" class="text-sm text-gray-700">
{{ component.name }}
</label>
</div>
</div>
</div>
</div>
<div class="mt-2 grid grid-cols-3 gap-4">
<div class="pt-2">
<label class="block text-gray-700 text-sm font-bold mb-2" for="components">State</label>
<select
v-model="form.stateId"
class="w-full mt-2 border-gray-200 focus:border-indigo-600 focus:ring-indigo-500 px-3 py-2.5 focus:ring-1 border rounded text-gray-700 bg-white"
>
<option disabled value="">Please select one</option>
<option v-for="state in states" :key="state.id" :value="state.id">
{{ state.name }}
</option>
</select>
</div>
<div />
<div class="mt-2">
<label class="block text-gray-700 text-sm font-bold mb-2" for="sellPrice"
>Sell Price</label
>
<input
v-model="form.sellPrice"
class="w-full mt-2 border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 px-3 py-2 border rounded text-gray-700"
type="number"
step="0.01"
/>
</div>
</div>
<Link
href="/computers"
type="button"
as="button"
method="post"
:data="form"
class="px-4 py-2 bg-indigo-600 text-white rounded hover:bg-blue-700 transition"
>
Create
</Link>
</form>
</div>
</template>
<style scoped></style>
+127
View File
@@ -0,0 +1,127 @@
<script setup lang="ts">
import { computed, reactive } from 'vue'
import { Link, router, usePage } from '@inertiajs/vue3'
const { props } = usePage<{
computer: any
availableComponents: any[]
states: any[]
errors?: any[]
}>()
const { computer, availableComponents, states } = props
const errors = computed(() => props.errors || [])
const form = reactive({
id: computer.id,
title: computer.title,
sellPrice: computer.sellPrice,
gpuScore: computer.gpuScore,
cpuScore: computer.cpuScore,
globalScore: computer.globalScore,
stateId: computer.state.id,
componentsId: computer.components.map((c: any) => c.id),
})
function updateComponents(componentsId: number[]) {
form.componentsId = componentsId
}
function deleteComputer(id: number) {
router.delete(`/computers/${id}`)
}
function getErrorMessage(field: string): string | null {
const error = errors.value.find((error) => error.field === field)
return error ? error.message : null
}
</script>
<template>
<div class="max-w-4xl mx-auto p-8 bg-white shadow-lg rounded-lg">
<h1 class="text-2xl font-semibold mb-8 text-gray-800">Edit Computer</h1>
<form class="space-y-6">
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="title">Title</label>
<input
v-model="form.title"
class="w-full mt-2 border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 px-3 py-2 border rounded text-gray-700"
type="text"
/>
</div>
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="sellPrice">Sell Price</label>
<input
name="sell_price"
v-model="form.sellPrice"
class="w-full mt-2 border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 px-3 py-2 border rounded text-gray-700"
type="number"
step="0.01"
/>
</div>
<div class="grid grid-cols-3 gap-4">
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="gpuScore">GPU Score</label>
<input
v-model="form.gpuScore"
class="w-full border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 px-3 py-2 border rounded text-gray-700"
type="number"
/>
</div>
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="cpuScore">CPU Score</label>
<input
v-model="form.cpuScore"
class="w-full border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 px-3 py-2 border rounded text-gray-700"
type="number"
/>
</div>
<div>
<label class="block text-gray-700 text-sm font-bold mb-2" for="globalScore"
>Global Score</label
>
<input
v-model="form.globalScore"
class="w-full border-gray-200 focus:border-indigo-600 focus:ring focus:ring-indigo-500/40 px-3 py-2 border rounded text-gray-700"
type="number"
/>
</div>
</div>
<div class="pt-2">
<label class="block text-gray-700 text-sm font-bold mb-2" for="components">State</label>
<select
v-model="form.stateId"
class="w-full mt-2 border-gray-200 focus:border-indigo-600 focus:ring-indigo-500 px-3 py-2.5 focus:ring-1 border rounded text-gray-700 bg-white"
>
<option disabled value="">Please select one</option>
<option v-for="state in states" :key="state.id" :value="state.id">
{{ state.name }}
</option>
</select>
</div>
<div
class="flex flex-col md:flex-row items-stretch justify-between space-y-2 md:space-y-0 md:space-x-2"
>
<Link
:href="`/computers/${form.id}`"
method="put"
:data="form"
as="button"
class="w-full md:w-auto px-4 py-2 bg-indigo-600 text-white rounded hover:bg-blue-700 transition flex justify-center"
>
Save
</Link>
<button
@click="deleteComputer(computer.id)"
class="w-full md:w-auto px-4 py-2 bg-gray-300 text-white rounded hover:bg-red-500 transition flex items-center justify-center"
>
Delete
</button>
</div>
</form>
</div>
</template>
<style scoped></style>
+128
View File
@@ -0,0 +1,128 @@
<script setup lang="ts">
import { Link } from '@inertiajs/vue3'
defineProps<{ computers: any[] }>()
</script>
<template>
<div>
<div class="flex justify-between items-center">
<h3 class="text-3xl font-semibold text-gray-700">Computers</h3>
<Link
href="/computers/create"
type="button"
as="button"
class="px-4 py-2 bg-indigo-600 text-white rounded hover:bg-blue-700 transition"
>
Add
</Link>
</div>
<div class="mt-6 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
<template v-if="computers.length > 0">
<div
v-for="computer in computers"
:key="computer.id"
class="p-4 border rounded-lg shadow hover:shadow-lg transition"
>
<h4 class="font-semibold text-lg text-gray-800">{{ computer.title }}</h4>
<p class="text-gray-600">State: {{ computer.state?.name }}</p>
<p class="text-indigo-600 font-semibold">Price: ${{ computer.sellPrice }}</p>
<p class="text-gray-500 text-sm">{{ computer.components.length }} components</p>
<Link
:href="`/computers/${computer.id}`"
class="mt-2 inline-block text-indigo-600 hover:text-indigo-700"
>
View Details
</Link>
</div>
</template>
<template v-else>
<p class="text-gray-500">No computers yet. Create one to get started!</p>
</template>
</div>
</div>
</template>
<style scoped>
.computers-container {
max-width: 1200px;
margin: 0 auto;
padding: 2rem;
}
.header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 2rem;
}
.computers-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 2rem;
}
.computer-card {
border: 1px solid #e5e7eb;
border-radius: 0.5rem;
overflow: hidden;
display: flex;
flex-direction: column;
}
.card-image {
width: 100%;
height: 200px;
background-color: #f3f4f6;
display: flex;
align-items: center;
justify-content: center;
}
.card-image img {
width: 100%;
height: 100%;
object-fit: cover;
}
.no-image {
display: flex;
align-items: center;
justify-content: center;
color: #9ca3af;
}
.card-content {
padding: 1rem;
flex: 1;
display: flex;
flex-direction: column;
}
.card-content h3 {
margin: 0 0 0.5rem 0;
font-size: 1.125rem;
}
.card-content p {
color: #6b7280;
margin: 0 0 1rem 0;
flex: 1;
}
.card-meta {
display: flex;
justify-content: space-between;
margin-bottom: 1rem;
font-size: 0.875rem;
color: #6b7280;
}
.empty-state {
text-align: center;
padding: 4rem 2rem;
}
</style>
+87
View File
@@ -0,0 +1,87 @@
<script setup lang="ts">
import { Link } from '@inertiajs/vue3'
const { props } = defineProps<{ computer: any }>()
</script>
<template>
<div class="max-w-4xl mx-auto p-4 md:p-8 bg-white shadow-lg rounded-lg">
<h1 class="text-xl md:text-2xl font-semibold mb-4 md:mb-8 text-gray-800">
{{ computer.title }}
</h1>
<div class="mt-2">
<label class="block text-gray-700 text-sm font-bold mb-2">Components</label>
<div class="overflow-x-auto">
<table class="w-full border-collapse">
<thead class="bg-gray-200">
<tr>
<th class="border px-4 py-2 text-left">Name</th>
<th class="border px-4 py-2 text-left">Type</th>
<th class="border px-4 py-2 text-right">Price</th>
</tr>
</thead>
<tbody>
<tr
v-for="component in computer.components"
:key="component.id"
class="hover:bg-gray-50"
>
<td class="border px-4 py-2">{{ component.name }}</td>
<td class="border px-4 py-2">{{ component.type?.name }}</td>
<td class="border px-4 py-2 text-right">${{ component.price }}</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="mt-6 flex flex-wrap gap-4">
<div class="flex-1 min-w-[100px]">
<label class="block text-gray-700 text-sm font-bold mb-2">GPU Score</label>
<p class="w-full border-gray-200 px-3 py-2 border rounded text-gray-700">
{{ computer.gpuScore }}
</p>
</div>
<div class="flex-1 min-w-[100px]">
<label class="block text-gray-700 text-sm font-bold mb-2">CPU Score</label>
<p class="w-full border-gray-200 px-3 py-2 border rounded text-gray-700">
{{ computer.cpuScore }}
</p>
</div>
<div class="flex-1 min-w-[100px]">
<label class="block text-gray-700 text-sm font-bold mb-2">Global Score</label>
<p class="w-full border-gray-200 px-3 py-2 border rounded text-gray-700">
{{ computer.globalScore }}
</p>
</div>
</div>
<div class="mt-4 grid grid-cols-1 md:grid-cols-3 gap-4 mb-6">
<div class="pt-2">
<label class="block text-gray-700 text-sm font-bold mb-2">State</label>
<p class="w-full mt-2 border-gray-200 px-3 py-2.5 border rounded text-gray-700">
{{ computer.state.name }}
</p>
</div>
<div></div>
<div class="mt-2">
<label class="block text-gray-700 text-sm font-bold mb-2">Sell Price</label>
<p class="w-full mt-2 border-gray-200 px-3 py-2 border rounded text-gray-700">
${{ computer.sellPrice.toFixed(2) }}
</p>
</div>
</div>
<Link
:href="`/computers/${computer.id}/edit`"
type="button"
as="button"
class="w-full md:w-auto px-4 py-2 bg-indigo-600 text-white rounded hover:bg-blue-700 transition"
>
Edit
</Link>
</div>
</template>
<style scoped></style>
+14
View File
@@ -0,0 +1,14 @@
<script setup lang="ts"></script>
<template>
<div class="flex items-center justify-center min-h-screen bg-gray-100">
<div class="text-center">
<h1 class="text-6xl font-bold text-indigo-600 mb-4">404</h1>
<h2 class="text-3xl font-semibold text-gray-800 mb-2">Page not found</h2>
<p class="text-gray-600 mb-6">This page does not exist.</p>
<a href="/" class="px-6 py-3 bg-indigo-600 text-white rounded-lg hover:bg-indigo-700">
Go Home
</a>
</div>
</div>
</template>
+16
View File
@@ -0,0 +1,16 @@
<script setup lang="ts">
defineProps<{ error?: any }>()
</script>
<template>
<div class="flex items-center justify-center min-h-screen bg-gray-100">
<div class="text-center">
<h1 class="text-6xl font-bold text-red-600 mb-4">500</h1>
<h2 class="text-3xl font-semibold text-gray-800 mb-2">Server Error</h2>
<p class="text-gray-600 mb-6">{{ error?.message || 'Something went wrong. Please try again later.' }}</p>
<a href="/" class="px-6 py-3 bg-indigo-600 text-white rounded-lg hover:bg-indigo-700">
Go Home
</a>
</div>
</div>
</template>
+55
View File
@@ -0,0 +1,55 @@
<script setup lang="ts">
import { computed } from 'vue'
import { Link, usePage } from '@inertiajs/vue3'
const page = usePage()
// Redirect to computers if user is authenticated
const isAuthenticated = computed(() => (page.props as any).auth?.user)
</script>
<template>
<div v-if="isAuthenticated" class="container mx-auto px-6 py-8">
<div class="bg-white rounded-lg shadow-lg p-8">
<h1 class="text-3xl font-bold text-gray-800 mb-4">Welcome to PC Creator</h1>
<p class="text-gray-600 mb-6">
Manage your computer components and builds efficiently.
</p>
<div class="flex gap-4">
<Link
href="/computers"
class="px-6 py-3 bg-indigo-600 text-white rounded-lg hover:bg-indigo-700"
>
View My Computers
</Link>
<Link
href="/components"
class="px-6 py-3 bg-gray-200 text-gray-800 rounded-lg hover:bg-gray-300"
>
Manage Components
</Link>
</div>
</div>
</div>
<div v-else class="flex items-center justify-center min-h-screen bg-gradient-to-br from-gray-100 to-gray-200">
<div class="text-center">
<h1 class="text-4xl font-bold text-gray-800 mb-4">PC Creator</h1>
<p class="text-xl text-gray-600 mb-8">Build and manage your perfect computer setup</p>
<div class="flex gap-4 justify-center">
<Link
href="/auth/login"
class="px-6 py-3 bg-indigo-600 text-white rounded-lg hover:bg-indigo-700"
>
Login
</Link>
<Link
href="/account/signup"
class="px-6 py-3 bg-gray-200 text-gray-800 rounded-lg hover:bg-gray-300"
>
Sign Up
</Link>
</div>
</div>
</div>
</template>
+20
View File
@@ -0,0 +1,20 @@
<script setup lang="ts">
import Sidebar from './sidebar.vue'
import Header from './header.vue'
</script>
<template>
<div class="flex h-screen bg-gray-200 font-roboto">
<Sidebar />
<div class="flex-1 flex flex-col overflow-hidden">
<Header />
<main class="flex-1 overflow-x-hidden overflow-y-auto bg-gray-200">
<div class="container mx-auto px-6 py-8">
<slot />
</div>
</main>
</div>
</div>
</template>
+5
View File
@@ -0,0 +1,5 @@
<template>
<div>
<slot />
</div>
</template>
+99
View File
@@ -0,0 +1,99 @@
<script setup lang="ts">
import { computed, ref } from 'vue'
import { useSidebar } from '~/composables/useSidebar'
import { Link, usePage } from '@inertiajs/vue3'
import { userProfileIcon } from '~/assets/icons'
import { useAdminMode } from '~/composables/isAdminMode'
const dropdownOpen = ref(false)
const { isOpen } = useSidebar()
const { isAdminActive } = useAdminMode()
function toggleActive() {
isAdminActive.value = !isAdminActive.value
}
const page = usePage()
const user = computed(() => {
const userData = (page.props as any).auth?.user || (page.props as any).user
return userData || { name: 'Guest', email: 'guest@example.com' }
})
</script>
<template>
<header class="flex items-center justify-between px-6 py-4 bg-white border-b-4 border-indigo-600">
<div class="flex items-center">
<button class="text-gray-500 focus:outline-none lg:hidden" @click="isOpen = true">
<svg class="w-6 h-6" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M4 6H20M4 12H20M4 18H11"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
</button>
</div>
<div class="flex items-center">
<div class="relative">
<button
class="relative z-10 block w-8 h-8 overflow-hidden rounded-full shadow focus:outline-none"
@click="dropdownOpen = !dropdownOpen"
>
<img class="object-cover w-full h-full" :src="userProfileIcon" alt="Your avatar" />
</button>
<div
v-show="dropdownOpen"
class="fixed inset-0 z-10 w-full h-full"
@click="dropdownOpen = false"
/>
<transition
enter-active-class="transition duration-150 ease-out transform"
enter-from-class="scale-95 opacity-0"
enter-to-class="scale-100 opacity-100"
leave-active-class="transition duration-150 ease-in transform"
leave-from-class="scale-100 opacity-100"
leave-to-class="scale-95 opacity-0"
>
<div
v-show="dropdownOpen"
class="absolute right-0 z-20 w-48 py-2 mt-2 bg-white rounded-md shadow-xl"
>
<div class="flex items-center justify-between px-4 py-2 text-sm text-indigo-600">
<strong>{{ user.name }}</strong>
</div>
<hr />
<div
class="flex items-center justify-between px-4 py-2 text-sm text-gray-700 hover:bg-indigo-600 hover:text-white cursor-pointer"
@click="toggleActive"
>
<span>{{ isAdminActive ? 'Admin' : 'Classic' }}</span>
<button
:class="{ 'bg-indigo-800': isAdminActive, 'bg-gray-200': !isAdminActive }"
class="w-10 h-5 rounded-full focus:outline-none relative"
>
<span
:class="{ 'translate-x-5': isAdminActive, 'translate-x-0': !isAdminActive }"
class="block w-4 h-4 bg-white rounded-full shadow transform transition duration-300"
></span>
</button>
</div>
<Link
href="/auth/logout"
class="block px-4 py-2 text-sm text-gray-700 hover:bg-indigo-600 hover:text-white"
>
Logout
</Link>
</div>
</transition>
</div>
</div>
</header>
</template>
+99
View File
@@ -0,0 +1,99 @@
<script lang="ts" setup>
import { ref, useAttrs } from 'vue'
import { useSidebar } from '~/composables/useSidebar'
import { Link } from '@inertiajs/vue3'
import { siteIcon } from '~/assets/icons'
const { isOpen } = useSidebar()
const activeClass = ref('bg-gray-600/25 text-gray-100 border-gray-100')
const inactiveClass = ref(
'border-gray-900 text-gray-500 hover:bg-gray-600/25 hover:text-gray-100'
)
const route = useAttrs()
console.log(route)
</script>
<template>
<div class="flex">
<!-- Backdrop -->
<div
:class="isOpen ? 'block' : 'hidden'"
class="fixed inset-0 z-20 transition-opacity bg-black opacity-50 lg:hidden"
@click="isOpen = false"
/>
<!-- End Backdrop -->
<div
:class="isOpen ? 'translate-x-0 ease-out' : '-translate-x-full ease-in'"
class="fixed inset-y-0 left-0 z-30 w-64 overflow-y-auto transition duration-300 transform bg-gray-900 lg:translate-x-0 lg:static lg:inset-0"
>
<div class="flex items-center justify-center mt-8">
<div class="flex items-center">
<img :src="siteIcon" style="width: 64px; height: 64px; fill: aliceblue" />
<span class="mx-2 text-2xl font-semibold text-white">PC CREATOR</span>
</div>
</div>
<nav class="mt-10">
<Link
:class="[$page.url.startsWith('/computers') ? activeClass : inactiveClass]"
class="flex items-center px-6 py-2 mt-4 duration-200 border-l-4"
href="/computers"
>
<svg
class="h-5 w-5"
fill="currentColor"
viewBox="0 0 512.000000 512.000000"
xmlns="http://www.w3.org/2000/svg"
>
<g stroke="none" transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)">
<path
d="M660 5089 c-116 -59 -216 -180 -257 -314 -17 -57 -18 -120 -18 -1140 0 -1014 1 -1082 18 -1112 31 -58 53 -63 287 -63 l210 0 0 1090 0 1090 1660 0 1660 0 0 -1090 0 -1090 210 0 c234 0 256 5 287 63 17 30 18 98 18 1112 0 1020 -1 1083 -18 1140 -41 134 -141 255 -257 314 l-63 31 -1837 0 -1837 0 -63 -31z m1948 -157 c17 -22 15 -62 -5 -84 -34 -38 -103 -11 -103 42 0 61 70 89 108 42z"
/>
<path
d="M2055 3549 c-38 -5 -92 -15 -119 -22 l-49 -13 386 -334 c430 -372 439 -382 438 -489 0 -33 -7 -76 -16 -98 -11 -25 -100 -122 -272 -295 -290 -290 -308 -303 -419 -296 -46 3 -72 11 -102 31 -23 15 -188 197 -369 406 -180 209 -331 380 -334 380 -16 2 -40 -178 -40 -289 2 -395 212 -734 566 -912 167 -85 319 -113 545 -104 125 6 166 4 214 -9 72 -19 145 -55 198 -96 21 -17 261 -304 533 -637 271 -334 510 -620 530 -636 143 -112 323 -132 487 -55 87 42 351 304 395 394 67 133 70 263 10 389 -56 119 8 61 -852 760 -425 345 -497 411 -535 486 -48 97 -54 135 -55 370 -1 197 -4 234 -22 302 -52 185 -134 330 -262 462 -168 174 -374 275 -616 305 -101 12 -139 12 -240 0z m2116 -2684 c102 -35 169 -130 169 -239 -1 -177 -161 -295 -332 -244 -48 14 -123 78 -147 127 -72 141 5 315 159 362 42 12 104 10 151 -6z"
/>
<path
d="M380 2259 c-19 -12 -112 -115 -208 -231 l-173 -210 3 -161 c3 -183 12 -212 80 -278 74 -71 41 -69 917 -69 l786 1 -92 38 c-371 154 -651 476 -749 859 l-18 72 -256 0 c-240 0 -257 -2 -290 -21z m92 -606 c79 -79 25 -213 -87 -213 -127 0 -174 164 -66 234 41 26 115 16 153 -21z"
/>
<path
d="M3465 2258 c15 -51 63 -95 383 -355 l335 -273 316 0 c354 0 361 -1 361 -64 0 -63 -9 -65 -274 -68 l-237 -3 114 -92 114 -93 165 0 c190 0 236 11 296 69 68 66 77 95 80 278 l3 162 -178 215 c-137 165 -187 218 -216 230 -33 14 -116 16 -653 16 l-615 0 6 -22z"
/>
</g>
</svg>
<span class="mx-4">Computers</span>
</Link>
<Link
:class="[$page.url.startsWith('/components') ? activeClass : inactiveClass]"
class="flex items-center px-6 py-2 mt-4 duration-200 border-l-4"
href="/components"
>
<svg
class="w-5 h-5"
fill="currentColor"
viewBox="0 0 20 20"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M5 3C3.89543 3 3 3.89543 3 5V7C3 8.10457 3.89543 9 5 9H7C8.10457 9 9 8.10457 9 7V5C9 3.89543 8.10457 3 7 3H5Z"
/>
<path
d="M5 11C3.89543 11 3 11.8954 3 13V15C3 16.1046 3.89543 17 5 17H7C8.10457 17 9 16.1046 9 15V13C9 11.8954 8.10457 11 7 11H5Z"
/>
<path
d="M11 5C11 3.89543 11.8954 3 13 3H15C16.1046 3 17 3.89543 17 5V7C17 8.10457 16.1046 9 15 9H13C11.8954 9 11 8.10457 11 7V5Z"
/>
<path
d="M11 13C11 11.8954 11.8954 11 13 11H15C16.1046 11 17 11.8954 17 13V15C17 16.1046 16.1046 17 15 17H13C11.8954 17 11 16.1046 11 15V13Z"
/>
</svg>
<span class="mx-4">Components</span>
</Link>
</nav>
</div>
</div>
</template>
+77
View File
@@ -0,0 +1,77 @@
import { PageProps } from '@adonisjs/inertia/types'
import { InertiaAppProps } from '@inertiajs/vue3/types/app'
interface ComponentType {
id: number
name: string
unique: boolean
}
interface ComputerState {
id: number
name: string
}
export type Computer = {
id: number
title: string
sellPrice: number
gpuScore: number
cpuScore: number
globalScore: number
state: ComputerState
cost: number
pictures: { link: string; order: number }[]
components: Component[]
}
export type Component = {
id: number
name: string
price: string
componentTypeId: number
computerId: number | null
userId: number
componentStateId: number
purchaseDate: string
createdAt: string
updatedAt: string
type: ComponentType
}
interface ServerImage {
id: number
link: string
order: number
}
interface NewImage {
file: File
order: number
}
export type UIVineValidationError = {
message: string
rule: string
field: string
meta?: any
}
export type UIAuthError = {
status: number
code: string
message: string
}
interface SharedProps extends PageProps {
auth: {
user: {
id: number
name: string
email: string
}
}
}
export type PageWithSharedProps = InertiaAppProps<SharedProps>
export type Image = ServerImage | NewImage
+35
View File
@@ -0,0 +1,35 @@
<script setup lang="ts">
defineProps<{
authError?: UIAuthError
}>()
</script>
<template>
<div
v-if="authError"
class="bg-red-100 border border-red-400 text-red-700 text-center text-sm rounded relative px-4 py-1 mt-1 w-full flex items-center justify-center space-x-2"
>
<div class="h-4 w-4 shrink-0">
<svg
id="Capa_1"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 554.2 554.199"
xml:space="preserve"
fill="currentColor"
>
<g>
<path
d="M538.5,386.199L356.5,70.8c-16.4-28.4-46.7-45.9-79.501-45.9c-32.8,0-63.1,17.5-79.5,45.9L12.3,391.6
c-16.4,28.4-16.4,63.4,0,91.8C28.7,511.8,59,529.3,91.8,529.3H462.2c0.101,0,0.2,0,0.2,0c50.7,0,91.8-41.101,91.8-91.8
C554.2,418.5,548.4,400.8,538.5,386.199z M316.3,416.899c0,21.7-16.7,38.3-39.2,38.3s-39.2-16.6-39.2-38.3V416
c0-21.601,16.7-38.301,39.2-38.301S316.3,394.3,316.3,416V416.899z M317.2,158.7L297.8,328.1c-1.3,12.2-9.4,19.8-20.7,19.8
s-19.4-7.7-20.7-19.8L237,158.6c-1.3-13.1,5.801-23,18-23H299.1C311.3,135.7,318.5,145.6,317.2,158.7z"
/>
</g>
</svg>
</div>
<span class="block sm:inline whitespace-nowrap">{{ authError.message }}</span>
</div>
</template>
<style scoped></style>
+156
View File
@@ -0,0 +1,156 @@
<script setup lang="ts">
import { computed, defineEmits, defineProps, onMounted, ref, watch } from 'vue'
import { Component } from '~/pages/types/UITypes'
interface ComponentsByType {
type: string
components: Component[]
}
const props = defineProps<{
availableComponents: Component[]
selectedComponents: number[]
initialSelectedComponents?: Component[]
}>()
const emit = defineEmits(['update:components'])
const componentTypeOrder = [
'Processor',
'Motherboard',
'Graphic Card',
'Memory',
'HDD',
'SSD',
'Cooler',
'Power Supply',
'Case',
'WiFi-Card',
'Fan',
'Other',
]
// Fusionner les composants disponibles et initialement s├®lectionn├®s
const allComponents = computed(() => {
const mergedComponents = [...props.availableComponents]
if (props.initialSelectedComponents) {
props.initialSelectedComponents.forEach((component) => {
if (!mergedComponents.find((c) => c.id === component.id)) {
mergedComponents.push(component)
}
})
}
return mergedComponents
})
// Trier les composants par type
const componentsByType = computed(() => {
const groupedComponents: Record<string, Component[]> = {}
allComponents.value.forEach((component) => {
const type = component.type.name
if (!groupedComponents[type]) {
groupedComponents[type] = []
}
groupedComponents[type].push(component)
})
const sortedComponentsByType: ComponentsByType[] = componentTypeOrder.map((type) => ({
type,
components: groupedComponents[type] || [],
}))
return sortedComponentsByType.filter((group) => group.components.length > 0)
})
// Initialisation de selectedComponents
let selectedComponents = ref<number[]>(
props.initialSelectedComponents?.map((c) => c.id) || props.selectedComponents || []
)
// Synchroniser les props avec le composant
watch(
() => props.selectedComponents,
(newVal) => {
selectedComponents.value = newVal
}
)
onMounted(() => {
if (props.initialSelectedComponents) {
emit(
'update:components',
props.initialSelectedComponents.map((c) => c.id)
)
}
})
function updateComponents(event: Event, type: string) {
const selectedComponentId = Number((event.target as HTMLSelectElement).value)
const updatedComponents = [...selectedComponents.value]
const alreadyInListComponentIndex = updatedComponents.findIndex((id) => {
return selectedComponentId === id
})
if (alreadyInListComponentIndex !== -1) {
updatedComponents.splice(alreadyInListComponentIndex, 1)
} else {
const typeIndex = componentsByType.value.findIndex((item) => item.type === type)
const existingComponentIndex = updatedComponents.findIndex((id) => {
const component = componentsByType.value[typeIndex].components.find((c) => c.id === id)
return component && component.type.unique
})
if (existingComponentIndex !== -1) updatedComponents.splice(existingComponentIndex, 1)
if (selectedComponentId != 0) updatedComponents.push(Number(selectedComponentId))
}
selectedComponents.value = updatedComponents
emit('update:components', updatedComponents)
}
</script>
<template>
<div v-for="{ type, components } in componentsByType" :key="type">
<label :for="`select-${type}`" class="block text-gray-700 text-sm font-bold mb-1 mt-2">
{{ type }}
</label>
<div v-if="components[0]?.type.unique">
<!-- Utilisation d'un select pour les composants uniques -->
<select
@change="updateComponents($event, type)"
:id="`select-${type}`"
class="w-full mt-2 border-gray-200 focus:border-indigo-600 focus:ring-indigo-500 px-3 py-2 focus:ring-1 border rounded text-gray-700 bg-white"
>
<option value="" selected>Select a component</option>
<option
v-for="component in components"
:key="component.id"
:value="component.id"
:selected="selectedComponents.includes(component.id)"
>
{{ component.name }}
</option>
</select>
</div>
<div v-else>
<!-- Utilisation de cases á cocher pour les composants non uniques avec grille responsive -->
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4">
<div v-for="component in components" :key="component.id" class="flex items-center mt-1">
<input
type="checkbox"
@click="updateComponents($event, type)"
:id="`checkbox-${component.id}`"
:value="component.id"
v-model="selectedComponents"
class="mr-2"
:checked="selectedComponents.includes(component.id)"
/>
<label :for="`checkbox-${component.id}`" class="text-sm text-gray-700">
{{ component.name }}
</label>
</div>
</div>
</div>
</div>
</template>
+182
View File
@@ -0,0 +1,182 @@
<script setup lang="ts">
import { computed, reactive, ref } from 'vue'
import TableComponent from '~/pages/widgets/TableComponent.vue'
import Component from '#models/component'
import ComponentType from '#models/component_type'
import { usePage } from '@inertiajs/vue3'
const { props } = usePage<{ components: Component[] }>()
const { components } = props
const usageDropdownOpen = ref(false)
const typeDropdownOpen = ref(false)
function toggleDropdown(dropdown: any) {
if (dropdown === 'usage') {
usageDropdownOpen.value = !usageDropdownOpen.value
typeDropdownOpen.value = false
} else if (dropdown === 'type') {
typeDropdownOpen.value = !typeDropdownOpen.value
usageDropdownOpen.value = false
}
}
const componentTypes = computed(() => {
const types = new Map<number, ComponentType>()
components.forEach((component) => {
if (!types.has(component.type.id)) {
types.set(component.type.id, component.type)
}
})
return Array.from(types.values())
})
// D├®finir le type de l'objet filters
interface Filters {
showUsed: boolean
showUnused: boolean
types: { [key: number]: boolean }
}
const filters = reactive<Filters>({
showUsed: false,
showUnused: true,
types: componentTypes.value.reduce(
(acc, type) => {
acc[type.id] = true
return acc
},
{} as { [key: number]: boolean }
),
})
const filteredComponents = computed(() => {
return components.filter((component) => {
const isUsed = filters.showUsed && component.computerId !== null
const isUnused = filters.showUnused && component.computerId === null
const isTypeSelected = filters.types[component.type.id]
return (isUsed || isUnused) && isTypeSelected
})
})
</script>
<template>
<div>
<!-- Dropdown pour les filtres -->
<div class="relative">
<h4 class="text-xl underline">Filters</h4>
<div class="flex gap-2">
<!-- Usage Dropdown -->
<div id="usage-selector" class="relative" style="width: fit-content">
<button
@click="toggleDropdown('usage')"
class="px-4 py-2 bg-indigo-600 text-white rounded hover:bg-blue-700 transition text-center inline-flex items-center"
type="button"
>
Usage
<svg
class="w-4 h-4 ml-2"
aria-hidden="true"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M19 9l-7 7-7-7"
></path>
</svg>
</button>
<!-- Dropdown menu -->
<div
v-show="usageDropdownOpen"
class="absolute right-0 z-20 py-2 mt-2 bg-white rounded-md shadow-xl"
>
<ul class="space-y-2 text-sm px-4 py-2">
<li class="flex items-center">
<input
id="unused"
type="checkbox"
v-model="filters.showUnused"
class="w-4 h-4 bg-gray-100 border-gray-300 rounded text-primary-600 focus:ring-primary-500 dark:focus:ring-primary-600 dark:ring-offset-gray-700 focus:ring-2 dark:bg-gray-600 dark:border-gray-500"
/>
<label
for="unused"
class="ml-2 text-sm font-medium text-gray-900 dark:text-gray-100"
>
Unused
</label>
</li>
<li class="flex items-center">
<input
id="used"
type="checkbox"
v-model="filters.showUsed"
class="w-4 h-4 bg-gray-100 border-gray-300 rounded text-primary-600 focus:ring-primary-500 dark:focus:ring-primary-600 dark:ring-offset-gray-700 focus:ring-2 dark:bg-gray-600 dark:border-gray-500"
/>
<label for="used" class="ml-2 text-sm font-medium text-gray-900 dark:text-gray-100">
Used
</label>
</li>
</ul>
</div>
</div>
<!-- Type Dropdown -->
<div id="type-selector" class="relative" style="width: fit-content">
<button
@click="toggleDropdown('type')"
class="px-4 py-2 bg-indigo-600 text-white rounded hover:bg-blue-700 transition text-center inline-flex items-center"
type="button"
>
Types
<svg
class="w-4 h-4 ml-2"
aria-hidden="true"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M19 9l-7 7-7-7"
></path>
</svg>
</button>
<!-- Dropdown menu -->
<div
v-show="typeDropdownOpen"
class="absolute right-0 z-20 py-2 mt-2 bg-white rounded-md shadow-xl"
>
<ul class="space-y-2 text-sm px-4 py-2">
<li class="flex items-center" v-for="type in componentTypes" :key="type.id">
<input
:id="`type-${type.id}`"
type="checkbox"
v-model="filters.types[type.id]"
class="w-4 h-4 bg-gray-100 border-gray-300 rounded text-primary-600 focus:ring-primary-500 dark:focus:ring-primary-600 dark:ring-offset-gray-700 focus:ring-2 dark:bg-gray-600 dark:border-gray-500"
/>
<label
:for="`type-${type.id}`"
class="ml-2 text-sm font-medium text-gray-900 dark:text-gray-100"
>
{{ type.name }}
</label>
</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Tableau des composants filtr®s -->
<TableComponent :components="filteredComponents" />
</div>
</template>
+57
View File
@@ -0,0 +1,57 @@
<script setup lang="ts">
import { router } from '@inertiajs/vue3'
import { useAdminMode } from '~/composables/isAdminMode'
const props = defineProps({
computerId: Number,
imageSrc: String,
imageAlt: String,
title: String,
description: String,
cost: Number,
price: Number,
})
const { isAdminActive } = useAdminMode()
function goToShow() {
router.get(`/computers/${props.computerId}`)
}
</script>
<template>
<div
class="rounded-lg bg-white shadow-secondary-1 dark:bg-surface-dark h-full flex flex-col hover:cursor-pointer"
@click="goToShow"
>
<img class="w-full h-2/3 object-cover" :src="imageSrc" :alt="imageAlt" />
<div class="flex flex-col justify-between grow px-6 py-2">
<div class="text-xl font-bold text-gray-900 line-clamp-4">
{{ props.title }}
</div>
<div class="flex justify-end mt-auto">
<span
v-if="isAdminActive"
class="inline-block px-3 py-1 mb-2 mr-2 text-sm font-semibold text-gray-700 bg-gray-200 rounded-full"
>
{{ props.cost?.toFixed(2) }}
</span>
<span
class="inline-block px-3 py-1 mb-2 mr-2 text-sm font-semibold text-gray-700 bg-gray-200 rounded-full"
>
{{ props.price?.toFixed(2) }}
</span>
</div>
</div>
</div>
</template>
<style scoped>
.line-clamp-4 {
display: -webkit-box;
-webkit-line-clamp: 4;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
</style>
@@ -0,0 +1,136 @@
<script setup lang="ts">
import { computed, onBeforeMount } from 'vue'
import {
cooler,
cpu,
defaultIcon,
fan,
graphicCard,
hardDrive,
memory,
motherboard,
pcCase,
powerSupply,
ssd,
wiFiCard,
} from '~/assets/icons'
import Component from '#models/component'
import { Link } from '@inertiajs/vue3'
const props = defineProps<{
components: Component[]
isAdminActive: boolean
}>()
const components = props.components
const originHeader = { 'X-Inertia-Origin': 'computer' }
let cost = 0
onBeforeMount(() => {
components.forEach((component: Component) => {
cost += parseFloat(String(component.price))
})
})
const componentTypeOrder = [
'Processor',
'Motherboard',
'Graphic Card',
'Memory',
'SSD',
'Storage',
'Cooler',
'Power Supply',
'Case',
'WiFi-Card',
'Fan',
'Other',
]
// Trier les composants selon l'ordre sp├®cifi├®
const sortedComponents = computed(() => {
return components.slice().sort((a, b) => {
return componentTypeOrder.indexOf(a.type.name) - componentTypeOrder.indexOf(b.type.name)
})
})
function getIconPath(typeName: string): string {
const typeToIconMap: Record<string, string> = {
'Motherboard': motherboard,
'Processor': cpu,
'Memory': memory,
'HDD': hardDrive,
'SSD': ssd,
'Cooler': cooler,
'Graphic Card': graphicCard,
'Power Supply': powerSupply,
'Fan': fan,
'WiFi-Card': wiFiCard,
'Case': pcCase,
}
return typeToIconMap[typeName] || defaultIcon // Utilisez une ic├┤ne par d├®faut si n├®cessaire
}
</script>
<template>
<div class="w-full">
<table class="w-full mb-4 text-sm">
<thead>
<tr
class="px-4 py-2 text-xs font-medium leading-4 tracking-wider text-left text-gray-500 uppercase border-b border-gray-400 bg-gray-50"
>
<td v-if="isAdminActive" colspan="5"></td>
<td v-else colspan="4"></td>
</tr>
</thead>
<tbody>
<tr
v-for="(component, index) in sortedComponents"
:key="component.id"
:class="{ 'bg-gray-200': index % 2 !== 0 }"
>
<td class="px-4 py-2 border-b border-gray-400">
<img
:src="getIconPath(component.type.name)"
:alt="`${component.type.name} Icon`"
class="w-6 h-6"
/>
</td>
<td class="px-4 py-2 border-b border-gray-400">
{{ component.type.name }}
</td>
<td
class="px-4 py-2 border-b border-gray-400"
:class="[isAdminActive ? '' : 'text-right']"
>
{{ component.name }}
</td>
<td v-if="isAdminActive" class="px-4 py-2 border-b border-gray-400 text-right">
Ôé¼{{ component.price }}
</td>
<td class="px-4 py-2 border-b border-gray-400 flex justify-center items-center">
<Link
:href="`/components/${component.id}/edit`"
method="get"
as="button"
class="px-3 py-1 bg-indigo-600 text-white rounded hover:bg-blue-700 transition text-sm"
:headers="originHeader"
>
Edit
</Link>
</td>
</tr>
</tbody>
<tfoot v-if="isAdminActive">
<tr class="bg-gray-800 text-white">
<td class="px-4 py-2 border-b border-gray-400 whitespace-nowrap" colspan="3">Total</td>
<td class="px-4 py-2 border-b border-gray-400 whitespace-nowrap text-right">
Ôé¼{{ cost.toFixed(2) }}
</td>
</tr>
</tfoot>
</table>
</div>
</template>
<style scoped></style>
+123
View File
@@ -0,0 +1,123 @@
<script setup lang="ts">
import { noImagePlaceholder } from '~/assets/images'
import { usePage } from '@inertiajs/vue3'
import Computer from '#models/computer'
import ComputerCard from '~/pages/widgets/ComputerCard.vue'
import { computed, reactive, ref } from 'vue'
const { computers } = usePage<{ computers: Computer[] }>().props
const stateDropdownOpen = ref(false)
function toggleDropdown() {
stateDropdownOpen.value = !stateDropdownOpen.value
}
const filters = reactive({
onGoing: true,
finished: true,
sold: false,
})
const filteredComputers = computed(() => {
return computers.filter((computer) => {
const isOnGoing = filters.onGoing && computer.state.name == 'ON_GOING'
const isFinished = filters.finished && computer.state.name == 'FINISHED'
const isSold = filters.sold && computer.state.name == 'SOLD'
return isOnGoing || isFinished || isSold
})
})
</script>
<template>
<div>
<!-- Dropdown pour les filtres -->
<div class="relative">
<h4 class="text-xl underline">Filters</h4>
<div class="flex gap-2">
<!-- Usage Dropdown -->
<div id="usage-selector" class="relative" style="width: fit-content">
<button
@click="toggleDropdown()"
class="px-4 py-2 bg-indigo-600 text-white rounded hover:bg-blue-700 transition text-center inline-flex items-center"
type="button"
>
Usage
<svg
class="w-4 h-4 ml-2"
aria-hidden="true"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M19 9l-7 7-7-7"
></path>
</svg>
</button>
<!-- Dropdown menu -->
<div
v-show="stateDropdownOpen"
class="absolute right-0 z-20 py-2 mt-2 bg-white rounded-md shadow-xl"
>
<ul class="space-y-2 text-sm px-4 py-2">
<li class="flex items-center">
<input
id="unused"
type="checkbox"
v-model="filters.onGoing"
class="w-4 h-4 bg-gray-100 border-gray-300 rounded text-primary-600 focus:ring-primary-500 dark:focus:ring-primary-600 dark:ring-offset-gray-700 focus:ring-2 dark:bg-gray-600 dark:border-gray-500"
/>
<label
for="unused"
class="ml-2 text-sm font-medium text-gray-900 dark:text-gray-100"
>
On Going
</label>
</li>
<li class="flex items-center">
<input
id="used"
type="checkbox"
v-model="filters.finished"
class="w-4 h-4 bg-gray-100 border-gray-300 rounded text-primary-600 focus:ring-primary-500 dark:focus:ring-primary-600 dark:ring-offset-gray-700 focus:ring-2 dark:bg-gray-600 dark:border-gray-500"
/>
<label for="used" class="ml-2 text-sm font-medium text-gray-900 dark:text-gray-100">
Finished
</label>
</li>
<li class="flex items-center">
<input
id="used"
type="checkbox"
v-model="filters.sold"
class="w-4 h-4 bg-gray-100 border-gray-300 rounded text-primary-600 focus:ring-primary-500 dark:focus:ring-primary-600 dark:ring-offset-gray-700 focus:ring-2 dark:bg-gray-600 dark:border-gray-500"
/>
<label for="used" class="ml-2 text-sm font-medium text-gray-900 dark:text-gray-100">
Sold
</label>
</li>
</ul>
</div>
</div>
</div>
<div class="mt-4 mb-3 grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 xl:grid-cols-4 gap-4">
<ComputerCard
v-for="computer in filteredComputers"
:key="computer.id"
:computerId="computer.id"
:image-src="computer.pictures.find((p) => p.order === 1)?.link || noImagePlaceholder"
image-alt="Computer Image"
:title="computer.title"
:cost="computer.cost"
:price="computer.sellPrice"
/>
</div>
</div>
</div>
</template>
<style scoped></style>
@@ -0,0 +1,39 @@
<script setup lang="ts">
import { defineEmits, defineProps } from 'vue'
defineProps<{ show: boolean }>()
const emit = defineEmits(['confirm', 'cancel'])
const confirm = () => {
emit('confirm')
}
const cancel = () => {
emit('cancel')
}
</script>
<template>
<div v-if="show" class="fixed inset-0 flex items-center justify-center z-50">
<div class="fixed inset-0 bg-black opacity-50"></div>
<div class="bg-white rounded-lg p-6 z-10">
<h2 class="text-lg font-semibold mb-4">Confirmation</h2>
<p class="mb-4">Are you sure to delete this item ?</p>
<div class="flex justify-end space-x-2">
<button @click="confirm" class="px-4 py-2 bg-red-500 text-white rounded hover:bg-red-700">
Ok
</button>
<button
@click="cancel"
class="px-4 py-2 bg-gray-300 text-gray-700 rounded hover:bg-gray-400"
>
Cancel
</button>
</div>
</div>
</div>
</template>
<style scoped>
/* Styles pour le modal */
</style>
+299
View File
@@ -0,0 +1,299 @@
<template>
<div class="relative w-full" :id="props.galleryId">
<div v-if="editMode" class="grid grid-cols-3 gap-4 w-full min-h-10">
<div
v-for="image in combinedImages"
:key="getKeyForImage(image)"
class="relative cursor-move group"
draggable="true"
@dragstart="(event) => dragStart(event, combinedImages.indexOf(image))"
@dragover.prevent
@dragenter.stop.prevent="handleDragEnter(combinedImages.indexOf(image))"
@drop.stop.prevent="drop"
>
<img :src="getImageSrc(image)" class="w-full h-66 object-cover rounded-lg" />
<button
v-if="editMode"
class="absolute top-2 right-2 bg-white text-gray-800 w-6 h-6 flex items-center justify-center p-0 rounded-full hover:bg-gray-300 transition-opacity opacity-0 group-hover:opacity-100"
@click.stop.prevent="removeImage(image)"
>
<img :src="crossIcon" alt="Delete" class="h-4 w-4" />
</button>
</div>
</div>
<div v-else>
<Carousel v-bind="adjustedSettings" v-if="combinedImages.length != 0" ref="carousel">
<Slide v-for="image in combinedImages" :key="getKeyForImage(image)">
<div class="carousel__item">
<img :src="getImageSrc(image)" alt="" class="carousel-image" />
</div>
</Slide>
<template #addons>
<Navigation />
<Pagination />
</template>
</Carousel>
</div>
<button
v-if="editMode"
@click.stop.prevent="showModal = true"
class="py-2 px-4 bg-indigo-600 text-white font-semibold rounded hover:bg-blue-700 absolute bottom-0 right-0 z-50"
>
+
</button>
<div
v-if="showModal"
class="fixed inset-0 bg-black/50 flex justify-center items-center z-50"
>
<div class="bg-white p-6 rounded shadow-lg relative w-1/4">
<button
@click.prevent="resetModal"
class="absolute top-2 right-2 text-gray-600 hover:text-gray-900"
>
&times;
</button>
<h3 class="text-lg font-semibold mb-4">Add a New Image</h3>
<div class="flex items-center">
<input type="file" ref="fileInput" @change="handleFileUpload" class="hidden" />
<button
@click.prevent="triggerFileInput"
class="bg-blue-500 text-white rounded hover:bg-blue-700 h-10 px-4"
>
Browse
</button>
<div
v-if="fileName"
class="ml-4 p-2 border border-gray-300 rounded flex items-center h-10 w-full overflow-hidden whitespace-nowrap text-ellipsis"
>
{{ formatFileName(fileName) }}
</div>
</div>
<button
@click.prevent="addImage"
class="w-full mt-4 bg-blue-500 text-white p-2 rounded hover:bg-blue-700"
>
Add Image
</button>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { computed, ref, watch } from 'vue'
import { crossIcon } from '~/assets/icons'
import { Navigation, Pagination } from 'vue3-carousel'
import { NewImage, ServerImage } from '../../../app/types/UItypes'
import { Image } from '~/pages/types/UITypes'
const props = defineProps<{
galleryId: string
serverImages: ServerImage[]
editMode?: boolean
}>()
const emit = defineEmits(['update:modelValue'])
const fileInput = ref<null | HTMLInputElement>(null)
const serverImages = ref<ServerImage[]>([...props.serverImages])
const newImages = ref<NewImage[]>([])
const showModal = ref(false)
const newImageFile = ref<File | null>(null)
const dragIndex = ref<number | null>(null)
const fileName = ref('')
const editMode = props.editMode ?? false
const combinedImages = computed(() => [...serverImages.value, ...newImages.value])
watch(
[serverImages, newImages],
() => {
reassignOrder()
emit('update:modelValue', combinedImages.value)
},
{ deep: true }
)
function handleFileUpload(event: Event) {
const file = (event.target as HTMLInputElement).files?.[0]
if (file) {
fileName.value = file.name
newImageFile.value = file
}
}
function addImage() {
if (newImageFile.value) {
newImages.value.push({
file: newImageFile.value,
order: combinedImages.value.length + 1,
})
resetModal()
}
}
function removeImage(image: Image) {
if ('id' in image) {
const index = serverImages.value.findIndex((img) => img.id === image.id)
if (index !== -1) {
serverImages.value.splice(index, 1)
}
} else {
const index = newImages.value.findIndex((img) => img.file === image.file)
if (index !== -1) {
newImages.value.splice(index, 1)
}
}
}
function resetModal() {
newImageFile.value = null
fileName.value = ''
showModal.value = false
}
function triggerFileInput() {
fileInput.value?.click()
}
function dragStart(event: DragEvent, index: number) {
dragIndex.value = index
event.dataTransfer!.effectAllowed = 'move'
}
function handleDragEnter(index: number) {
if (dragIndex.value !== null && index !== dragIndex.value) {
const sourceArray =
dragIndex.value < serverImages.value.length ? serverImages.value : newImages.value
const draggedItem = sourceArray.splice(dragIndex.value, 1)[0]
sourceArray.splice(index, 0, draggedItem as any) // Utilisation de 'as any' pour r├®soudre le probl├¿me de typage
dragIndex.value = index
}
}
function drop() {
dragIndex.value = null
reassignOrder()
}
function reassignOrder() {
combinedImages.value.forEach((image, index) => {
image.order = index + 1
})
}
function getImageSrc(image: Image): string {
return 'link' in image ? image.link : URL.createObjectURL(image.file)
}
function getKeyForImage(image: Image): string {
return 'id' in image ? `server-${image.id}` : `new-${image.file.name}`
}
function formatFileName(fileName: string): string {
const maxLength = 39 // Ajustez cette valeur selon vos besoins
const extension = fileName.split('.').pop()
const nameWithoutExtension = fileName.slice(0, -(extension!.length + 1))
if (fileName.length <= maxLength) {
return fileName
}
const truncatedName = nameWithoutExtension.slice(-maxLength + extension!.length + 3)
return `...${truncatedName}.${extension}`
}
// Carousel settings
// Carousel settings
const settings = {
itemsToShow: 2.5,
snapAlign: 'center',
wrapAround: true,
transition: 500,
}
const adjustedSettings = computed(() => {
const imageCount = combinedImages.value.length
if (imageCount === 1) {
return { ...settings, itemsToShow: 1, wrapAround: false }
} else {
return settings
}
})
</script>
<style scoped>
.carousel__item {
min-height: 310px;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
overflow: hidden;
}
.carousel-image {
height: 310px;
object-fit: cover;
object-position: center;
}
.carousel__slide {
padding: 5px;
}
.carousel__viewport {
perspective: 2000px;
}
.carousel__track {
transform-style: preserve-3d;
}
.carousel__slide--sliding {
transition: 0.5s;
}
.carousel__slide {
opacity: 0.9;
transform: rotateY(-20deg) scale(0.9);
}
.carousel__slide--active ~ .carousel__slide {
transform: rotateY(20deg) scale(0.9);
}
.carousel__slide--active {
opacity: 1;
transform: rotateY(0) scale(1.1);
}
.carousel-nav-button {
background-color: var(--color-gray-50);
border-radius: var(--radius-full);
padding: 10px;
box-shadow: var(--shadow-sm);
transition: background-color var(--duration-base) var(--ease-in-out);
position: absolute;
top: 50%;
transform: translateY(-50%);
}
.carousel-nav-button:hover {
background-color: var(--color-gray-100);
}
.carousel-nav-button svg {
width: 24px;
height: 24px;
}
.carousel-nav-button-prev {
left: -30px; /* Adjust as needed */
}
.carousel-nav-button-next {
right: -30px; /* Adjust as needed */
}
</style>
+128
View File
@@ -0,0 +1,128 @@
<script setup lang="ts">
import {
cooler,
cpu,
defaultIcon,
fan,
graphicCard,
hardDrive,
memory,
motherboard,
pcCase,
powerSupply,
ssd,
trashIcon,
wiFiCard,
} from '~/assets/icons'
import { router } from '@inertiajs/vue3'
import { useAdminMode } from '~/composables/isAdminMode'
import Component from '#models/component'
const props = defineProps<{
components: Component[]
}>()
const { isAdminActive } = useAdminMode()
function getIconPath(typeName: string): string {
const typeToIconMap: Record<string, string> = {
'Motherboard': motherboard,
'Processor': cpu,
'Memory': memory,
'HDD': hardDrive,
'SSD': ssd,
'Cooler': cooler,
'Graphic Card': graphicCard,
'Power Supply': powerSupply,
'Fan': fan,
'WiFi-Card': wiFiCard,
'Case': pcCase,
}
return typeToIconMap[typeName] || defaultIcon // Utilisez une ic├┤ne par d├®faut si n├®cessaire
}
function goToDetail(id: number) {
router.get(`/components/${id}`)
}
function deleteComponent(id: number) {
router.delete(`/components/${id}`)
}
</script>
<template>
<div class="flex flex-col mt-8">
<div class="py-2 -my-2 overflow-x-auto sm:-mx-6 sm:px-6 lg:-mx-8 lg:px-8">
<div
class="inline-block min-w-full overflow-hidden align-middle border-b border-gray-200 shadow sm:rounded-lg"
>
<table class="min-w-full">
<thead>
<tr>
<th
class="px-6 py-3 text-xs font-medium leading-4 tracking-wider text-left text-gray-500 uppercase border-b border-gray-200 bg-gray-50"
>
Type
</th>
<th
class="px-6 py-3 text-xs font-medium leading-4 tracking-wider text-left text-gray-500 uppercase border-b border-gray-200 bg-gray-50"
>
Name
</th>
<th
v-if="isAdminActive"
class="px-6 py-3 text-xs font-medium leading-4 tracking-wider text-left text-gray-500 uppercase border-b border-gray-200 bg-gray-50"
>
Price
</th>
<th
class="px-6 py-3 text-xs font-medium leading-4 tracking-wider text-left text-gray-500 uppercase border-b border-gray-200 bg-gray-50"
>
Purchase Date
</th>
<th
class="px-6 py-3 text-xs font-medium leading-4 tracking-wider text-left text-gray-500 uppercase border-b border-gray-200 bg-gray-50"
>
Action
</th>
</tr>
</thead>
<tbody class="bg-white">
<tr
v-for="component in components"
:key="component.id"
@click.stop.prevent="goToDetail(component.id)"
class="cursor-pointer hover:bg-indigo-600/50"
:class="[component.computerId !== null ? 'used bg-gray-400' : 'bg-white']"
>
<td class="px-6 py-4 border-b border-gray-200 whitespace-nowrap">
<img
:src="getIconPath(component.type.name)"
:alt="`${component.type.name} Icon`"
style="width: 32px; height: 32px"
/>
</td>
<td class="px-6 py-4 border-b border-gray-200 whitespace-nowrap">
{{ component.name }}
</td>
<td v-if="isAdminActive" class="px-6 py-4 border-b border-gray-200 whitespace-nowrap">
Ôé¼{{ component.price }}
</td>
<td class="px-6 py-4 border-b border-gray-200 whitespace-nowrap">
{{ component.purchaseDate }}
</td>
<td class="px-6 py-4 border-b border-gray-200 whitespace-nowrap">
<button
v-delete-confirm="() => deleteComponent(component.id)"
class="px-4 py-2 bg-gray-300 text-white rounded hover:bg-red-500 transition inline-flex items-center justify-center"
>
<img :src="trashIcon" alt="Delete" class="h-5 w-5" />
</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</template>
<style scoped></style>
+14
View File
@@ -0,0 +1,14 @@
<script setup lang="ts">
defineProps<{
message: string
}>()
</script>
<template>
<div class="bg-red-100 border border-red-400 text-red-700 text-xs rounded relative px-1">
<strong class="me-0.5">!</strong>
<span class="block sm:inline whitespace-nowrap">{{ message }}</span>
</div>
</template>
<style scoped></style>
+5
View File
@@ -0,0 +1,5 @@
declare module '*.vue' {
import type { DefineComponent } from 'vue'
const component: DefineComponent<object, object, unknown>
export default component
}
+26
View File
@@ -0,0 +1,26 @@
import { client } from '~/client'
import Layout from '~/layouts/default.vue'
import { createInertiaApp } from '@inertiajs/vue3'
import { TuyauProvider } from '@adonisjs/inertia/vue'
import { renderToString } from '@vue/server-renderer'
import { createSSRApp, h, type DefineComponent } from 'vue'
import { resolvePageComponent } from '@adonisjs/inertia/helpers'
export default function render(page: any) {
return createInertiaApp({
page,
render: renderToString,
resolve: (name) => {
return resolvePageComponent(
`./pages/${name}.vue`,
import.meta.glob<DefineComponent>('./pages/**/*.vue', { eager: true }),
Layout
)
},
setup: ({ App, props, plugin }) => {
return createSSRApp({
render: () => h(TuyauProvider, { client }, { default: () => h(App, props) }),
}).use(plugin)
},
})
}
+18
View File
@@ -0,0 +1,18 @@
{
"extends": "@adonisjs/tsconfig/tsconfig.client.json",
"compilerOptions": {
"jsx": "preserve",
"module": "ESNext",
"jsxImportSource": "vue",
"paths": {
"~/*": ["./*"],
"@generated/*": ["../.adonisjs/client/*"]
}
},
"include": [
"./**/*.ts",
"./**/*.vue",
"../.adonisjs/client/**/*.ts",
"../.adonisjs/server/**/*.ts"
]
}