FIX: customer logos
Fixed HiDPI customer logos
|
@ -4,7 +4,18 @@
|
||||||
<h3>Meine bisherigen Geschäftpartner</h3>
|
<h3>Meine bisherigen Geschäftpartner</h3>
|
||||||
<div class="customer-list margin-top default-gap">
|
<div class="customer-list margin-top default-gap">
|
||||||
<a v-for="customer in customers" :href="customer.link" target="_blank" rel="noopener noreferrer">
|
<a v-for="customer in customers" :href="customer.link" target="_blank" rel="noopener noreferrer">
|
||||||
<img loading="lazy" height="50" :width="customer.logo.width" :alt="customer.name" :src="customer.logo.src" :class="[customer.logo.white ? 'white' : '']" />
|
<img
|
||||||
|
loading="lazy"
|
||||||
|
height="50"
|
||||||
|
:width="customer.logo.width"
|
||||||
|
:alt="customer.name"
|
||||||
|
:srcset="[
|
||||||
|
getCustomerImage(customer.logo.src)('1x', true),
|
||||||
|
getCustomerImage(customer.logo.src)('2x', true),
|
||||||
|
getCustomerImage(customer.logo.src)('3x', true),
|
||||||
|
].join(', ')"
|
||||||
|
:src="getCustomerImage(customer.logo.src)('1x', false)"
|
||||||
|
/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<h3 class="margin-top-big">Projektauswahl</h3>
|
<h3 class="margin-top-big">Projektauswahl</h3>
|
||||||
|
@ -34,21 +45,22 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { css, pcss, html, js, njs, nuxt, scss, ts, tw, vue, flutter, dart, android } from '~/Skills'
|
import { css, pcss, html, js, njs, nuxt, scss, ts, tw, vue, flutter, dart, android } from '~/Skills'
|
||||||
|
|
||||||
|
const getCustomerImage = (img : string) => getImage('/img/customers/', img)
|
||||||
|
|
||||||
const customers = [
|
const customers = [
|
||||||
{
|
{
|
||||||
name: 'Bounce Commerce',
|
name: 'Bounce Commerce',
|
||||||
link: 'https://bounce-commerce.de',
|
link: 'https://bounce-commerce.de',
|
||||||
logo: {
|
logo: {
|
||||||
src: '/img/customers/bounce.webp',
|
src: 'bounce',
|
||||||
width: 150,
|
width: 150,
|
||||||
white: true,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'GMX',
|
name: 'GMX',
|
||||||
link: 'https://gmx.net',
|
link: 'https://gmx.net',
|
||||||
logo: {
|
logo: {
|
||||||
src: '/img/customers/gmx.webp',
|
src: 'gmx',
|
||||||
width: 148,
|
width: 148,
|
||||||
white: true,
|
white: true,
|
||||||
},
|
},
|
||||||
|
@ -57,7 +69,7 @@ const customers = [
|
||||||
name: 'WEB.DE',
|
name: 'WEB.DE',
|
||||||
link: 'https://web.de',
|
link: 'https://web.de',
|
||||||
logo: {
|
logo: {
|
||||||
src: '/img/customers/webde.webp',
|
src: 'webde',
|
||||||
width: 50,
|
width: 50,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -65,7 +77,7 @@ const customers = [
|
||||||
name: '1&1',
|
name: '1&1',
|
||||||
link: 'https://1und1.de',
|
link: 'https://1und1.de',
|
||||||
logo: {
|
logo: {
|
||||||
src: '/img/customers/einsundeins.webp',
|
src: '1u1',
|
||||||
width: 50,
|
width: 50,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -73,7 +85,7 @@ const customers = [
|
||||||
name: 'Körrie',
|
name: 'Körrie',
|
||||||
link: 'https://körrie.de',
|
link: 'https://körrie.de',
|
||||||
logo: {
|
logo: {
|
||||||
src: '/img/customers/koerrie.webp',
|
src: 'koerrie',
|
||||||
width: 50,
|
width: 50,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -81,7 +93,7 @@ const customers = [
|
||||||
name: 'Pembe',
|
name: 'Pembe',
|
||||||
link: 'https://pembe.io',
|
link: 'https://pembe.io',
|
||||||
logo: {
|
logo: {
|
||||||
src: '/img/customers/pembe.webp',
|
src: 'pembe',
|
||||||
width: 48,
|
width: 48,
|
||||||
white: true,
|
white: true,
|
||||||
},
|
},
|
||||||
|
@ -90,7 +102,7 @@ const customers = [
|
||||||
name: 'SAE Institute Germany',
|
name: 'SAE Institute Germany',
|
||||||
link: 'https://www.sae.edu/deu/en/sae-home/',
|
link: 'https://www.sae.edu/deu/en/sae-home/',
|
||||||
logo: {
|
logo: {
|
||||||
src: '/img/customers/sae.webp',
|
src: 'sae',
|
||||||
width: 77,
|
width: 77,
|
||||||
white: true,
|
white: true,
|
||||||
},
|
},
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
width="150"
|
width="150"
|
||||||
height="150"
|
height="150"
|
||||||
:srcset="[getImage('1x', true), getImage('2x', true), getImage('3x', true)].join(', ')"
|
:srcset="[userImage('1x', true), userImage('2x', true), userImage('3x', true)].join(', ')"
|
||||||
:src="getImage('1x', false)"
|
:src="userImage('1x', false)"
|
||||||
:alt="`Bild von ${name}`"
|
:alt="`Bild von ${name}`"
|
||||||
/>
|
/>
|
||||||
<h3>{{name}}</h3>
|
<h3>{{name}}</h3>
|
||||||
|
@ -28,5 +28,5 @@ type Props = {
|
||||||
|
|
||||||
const { img } = defineProps<Props>()
|
const { img } = defineProps<Props>()
|
||||||
|
|
||||||
const getImage = (size : '1x' | '2x' | '3x', set : boolean) => `/img/network/${img}@${size}.webp${set ? ` ${size}` : ''}`
|
const userImage = getImage('/img/network/', img)
|
||||||
</script>
|
</script>
|
||||||
|
|
BIN
public/img/customers/1u1@1x.webp
Executable file
After Width: | Height: | Size: 1.4 KiB |
BIN
public/img/customers/1u1@2x.webp
Executable file
After Width: | Height: | Size: 2.3 KiB |
BIN
public/img/customers/1u1@3x.webp
Executable file
After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 4.1 KiB |
BIN
public/img/customers/bounce@1x.webp
Executable file
After Width: | Height: | Size: 1.9 KiB |
BIN
public/img/customers/bounce@2x.webp
Executable file
After Width: | Height: | Size: 4.1 KiB |
BIN
public/img/customers/bounce@3x.webp
Executable file
After Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 3.3 KiB |
BIN
public/img/customers/gmx@1x.webp
Executable file
After Width: | Height: | Size: 1.6 KiB |
BIN
public/img/customers/gmx@2x.webp
Executable file
After Width: | Height: | Size: 3.4 KiB |
BIN
public/img/customers/gmx@3x.webp
Executable file
After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 1.7 KiB |
BIN
public/img/customers/koerrie@1x.webp
Executable file
After Width: | Height: | Size: 1.5 KiB |
BIN
public/img/customers/koerrie@2x.webp
Executable file
After Width: | Height: | Size: 3.2 KiB |
BIN
public/img/customers/koerrie@3x.webp
Executable file
After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 720 B |
BIN
public/img/customers/pembe@1x.webp
Executable file
After Width: | Height: | Size: 434 B |
BIN
public/img/customers/pembe@2x.webp
Executable file
After Width: | Height: | Size: 682 B |
BIN
public/img/customers/pembe@3x.webp
Executable file
After Width: | Height: | Size: 980 B |
Before Width: | Height: | Size: 1.2 KiB |
BIN
public/img/customers/sae@1x.webp
Executable file
After Width: | Height: | Size: 956 B |
BIN
public/img/customers/sae@2x.webp
Executable file
After Width: | Height: | Size: 1.8 KiB |
BIN
public/img/customers/sae@3x.webp
Executable file
After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 1.8 KiB |
BIN
public/img/customers/webde@1x.webp
Executable file
After Width: | Height: | Size: 1.7 KiB |
BIN
public/img/customers/webde@2x.webp
Executable file
After Width: | Height: | Size: 4.1 KiB |
BIN
public/img/customers/webde@3x.webp
Executable file
After Width: | Height: | Size: 6.8 KiB |
1
utils/image.ts
Normal file
|
@ -0,0 +1 @@
|
||||||
|
export const getImage = (path : string, img : string) => (size : '1x' | '2x' | '3x', set : boolean) => `${path}${img}@${size}.webp${set ? ` ${size}` : ''}`
|