mirror of
https://github.com/IT4Change/IT4C.dev.git
synced 2025-12-12 17:05:50 +00:00
feat(other): eslint & prettier (#302)
* eslint * eslint fixes * fix footer * install prettier * fix prettier
This commit is contained in:
parent
cdb1944578
commit
d6be15ce0d
14
.prettierrc.json
Normal file
14
.prettierrc.json
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"printWidth": 100,
|
||||||
|
"tabWidth": 2,
|
||||||
|
"useTabs": false,
|
||||||
|
"semi": false,
|
||||||
|
"singleQuote": true,
|
||||||
|
"quoteProps": "as-needed",
|
||||||
|
"jsxSingleQuote": true,
|
||||||
|
"trailingComma": "all",
|
||||||
|
"bracketSpacing": true,
|
||||||
|
"bracketSameLine": false,
|
||||||
|
"arrowParens": "always",
|
||||||
|
"endOfLine": "auto"
|
||||||
|
}
|
||||||
@ -2,10 +2,10 @@ module.exports = {
|
|||||||
rules: {
|
rules: {
|
||||||
'no-todo': true,
|
'no-todo': true,
|
||||||
'no-start-duplicated-conjunction': {
|
'no-start-duplicated-conjunction': {
|
||||||
interval : 2, // interval of sentences
|
interval: 2, // interval of sentences
|
||||||
},
|
},
|
||||||
'max-comma': {
|
'max-comma': {
|
||||||
max : 4,
|
max: 4,
|
||||||
},
|
},
|
||||||
/*'no-dead-link': {
|
/*'no-dead-link': {
|
||||||
checkRelative: true,
|
checkRelative: true,
|
||||||
@ -30,9 +30,9 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
'write-good': {
|
'write-good': {
|
||||||
passive: false,
|
passive: false,
|
||||||
thereIs: false
|
thereIs: false,
|
||||||
},
|
},
|
||||||
'apostrophe': true,
|
apostrophe: true,
|
||||||
},
|
},
|
||||||
filters: {
|
filters: {
|
||||||
comments: true,
|
comments: true,
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { defineClientConfig } from 'vuepress/client'
|
import { defineClientConfig } from 'vuepress/client'
|
||||||
import { setupTransparentNavbar } from "vuepress-theme-hope/presets/transparentNavbar.js";
|
import { setupTransparentNavbar } from 'vuepress-theme-hope/presets/transparentNavbar.js'
|
||||||
import BlankLayout from './layouts/BlankLayout.vue'
|
import BlankLayout from './layouts/BlankLayout.vue'
|
||||||
import ContactForm from './components/ContactForm.vue'
|
import ContactForm from './components/ContactForm.vue'
|
||||||
import ContentSection from './components/ContentSection.vue'
|
import ContentSection from './components/ContentSection.vue'
|
||||||
import Footer from './components/Footer.vue'
|
import VPFooter from './components/VPFooter.vue'
|
||||||
import ProcessStep from './components/ProcessStep.vue'
|
import ProcessStep from './components/ProcessStep.vue'
|
||||||
import ProjectCard from './components/ProjectCard.vue'
|
import ProjectCard from './components/ProjectCard.vue'
|
||||||
import ServiceCard from './components/ServiceCard.vue'
|
import ServiceCard from './components/ServiceCard.vue'
|
||||||
@ -14,7 +14,7 @@ export default defineClientConfig({
|
|||||||
enhance({ app }) {
|
enhance({ app }) {
|
||||||
app.component('ContactForm', ContactForm)
|
app.component('ContactForm', ContactForm)
|
||||||
app.component('ContentSection', ContentSection)
|
app.component('ContentSection', ContentSection)
|
||||||
app.component('Footer', Footer)
|
app.component('VPFooter', VPFooter)
|
||||||
app.component('ProcessStep', ProcessStep)
|
app.component('ProcessStep', ProcessStep)
|
||||||
app.component('ProjectCard', ProjectCard)
|
app.component('ProjectCard', ProjectCard)
|
||||||
app.component('TeamMember', TeamMember)
|
app.component('TeamMember', TeamMember)
|
||||||
@ -22,11 +22,11 @@ export default defineClientConfig({
|
|||||||
app.component('CaptionedImage', CaptionedImage)
|
app.component('CaptionedImage', CaptionedImage)
|
||||||
},
|
},
|
||||||
setup() {
|
setup() {
|
||||||
setupTransparentNavbar({ type: "homepage" });
|
setupTransparentNavbar({ type: 'homepage' })
|
||||||
},
|
},
|
||||||
// You can override or add layouts here
|
// You can override or add layouts here
|
||||||
layouts: {
|
layouts: {
|
||||||
// For example, here we change the default layout of vuepress-theme-hope to layouts/Layout.vue
|
// For example, here we change the default layout of vuepress-theme-hope to layouts/Layout.vue
|
||||||
BlankLayout,
|
BlankLayout,
|
||||||
}
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,17 +1,20 @@
|
|||||||
<template>
|
<template>
|
||||||
<figure>
|
<figure>
|
||||||
<img :src="src" alt="" :width="width"/>
|
<img :src="src" alt="" :width="width" />
|
||||||
<figcaption>{{ caption }}</figcaption>
|
<figcaption>{{ caption }}</figcaption>
|
||||||
</figure>
|
</figure>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
|
||||||
export default {
|
<script setup lang="ts">
|
||||||
props: ['src', 'caption', 'width'],
|
defineProps<{
|
||||||
}
|
src: string
|
||||||
|
caption: string
|
||||||
|
width: string
|
||||||
|
}>()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
figcaption {
|
figcaption {
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -1,13 +1,16 @@
|
|||||||
<template>
|
<template>
|
||||||
<p class="text-gray-600 dark:text-gray-300 mb-8">Wir freuen uns auf Ihre Nachricht. Als Ansprechpartner steht Ihnen <strong>Ulf Gebhardt</strong> für Ihre Fragen gerne zur Verfügung.</p>
|
<p class="text-gray-600 dark:text-gray-300 mb-8">
|
||||||
|
Wir freuen uns auf Ihre Nachricht. Als Ansprechpartner steht Ihnen
|
||||||
|
<strong>Ulf Gebhardt</strong> für Ihre Fragen gerne zur Verfügung.
|
||||||
|
</p>
|
||||||
|
|
||||||
<div class="grid grid-cols-1 md:grid-cols-5 gap-8">
|
<div class="grid grid-cols-1 md:grid-cols-5 gap-8">
|
||||||
<!-- Left side: Portrait - takes 2/5 of space -->
|
<!-- Left side: Portrait - takes 2/5 of space -->
|
||||||
<div class="flex flex-col items-center md:items-start md:self-start md:col-span-2">
|
<div class="flex flex-col items-center md:items-start md:self-start md:col-span-2">
|
||||||
<img
|
<img
|
||||||
src="/images/portrait/ulf-gebhardt.jpg"
|
src="/images/portrait/ulf-gebhardt.jpg"
|
||||||
alt="Ulf Gebhardt"
|
alt="Ulf Gebhardt"
|
||||||
class="rounded-lg shadow-md w-97 h-auto mb-6"
|
class="rounded-lg shadow-md w-97 h-auto mb-6"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -16,8 +19,19 @@
|
|||||||
<h3 class="mb-4">Telefon</h3>
|
<h3 class="mb-4">Telefon</h3>
|
||||||
<div class="flex-col gap-2 mb-8">
|
<div class="flex-col gap-2 mb-8">
|
||||||
<p class="flex items-center">
|
<p class="flex items-center">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="phone-number h-5 w-5 mr-2" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
<svg
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z" />
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
class="phone-number h-5 w-5 mr-2"
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke="currentColor"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
stroke-width="2"
|
||||||
|
d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z"
|
||||||
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
<a href="tel:+4915784841600" class="phone-number hover:!underline">+49 15784841600</a>
|
<a href="tel:+4915784841600" class="phone-number hover:!underline">+49 15784841600</a>
|
||||||
</p>
|
</p>
|
||||||
@ -35,52 +49,52 @@
|
|||||||
|
|
||||||
<div class="my-4">
|
<div class="my-4">
|
||||||
<input
|
<input
|
||||||
type="text"
|
id="name"
|
||||||
id="name"
|
v-model="form.name"
|
||||||
v-model="form.name"
|
type="text"
|
||||||
placeholder="Name"
|
placeholder="Name"
|
||||||
required
|
required
|
||||||
minlength="2"
|
minlength="2"
|
||||||
maxlength="35"
|
maxlength="35"
|
||||||
class="w-full p-3 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:highlight focus:border-transparent"
|
class="w-full p-3 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:highlight focus:border-transparent"
|
||||||
>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="my-4">
|
<div class="my-4">
|
||||||
<input
|
<input
|
||||||
type="email"
|
id="email"
|
||||||
id="email"
|
v-model="form.email"
|
||||||
v-model="form.email"
|
type="email"
|
||||||
placeholder="E-Mail"
|
placeholder="E-Mail"
|
||||||
required
|
required
|
||||||
class="w-full p-3 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:highlight focus:border-transparent"
|
class="w-full p-3 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:highlight focus:border-transparent"
|
||||||
>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="my-4">
|
<div class="my-4">
|
||||||
<input
|
<input
|
||||||
type="tel"
|
id="phone"
|
||||||
id="phone"
|
v-model="form.phone"
|
||||||
v-model="form.phone"
|
type="tel"
|
||||||
placeholder="Telefon"
|
placeholder="Telefon"
|
||||||
minlength="8"
|
minlength="8"
|
||||||
class="w-full p-3 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:highlight focus:border-transparent"
|
class="w-full p-3 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:highlight focus:border-transparent"
|
||||||
>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="my-4">
|
<div class="my-4">
|
||||||
<textarea
|
<textarea
|
||||||
id="message"
|
id="message"
|
||||||
v-model="form.message"
|
v-model="form.message"
|
||||||
rows="4"
|
rows="4"
|
||||||
placeholder="Ihre Nachricht"
|
placeholder="Ihre Nachricht"
|
||||||
required
|
required
|
||||||
minlength="5"
|
minlength="5"
|
||||||
class="w-full p-3 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:highlight focus:border-transparent"
|
class="w-full p-3 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:highlight focus:border-transparent"
|
||||||
></textarea>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="my-4 flex justify-end">
|
<div class="my-4 flex justify-end">
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
:disabled="isSubmitting"
|
:disabled="isSubmitting"
|
||||||
class="text-white py-2 px-6 rounded-md transition-colors duration-200 focus:outline-none focus:ring-2 focus:highlight focus:ring-offset-2"
|
class="text-white py-2 px-6 rounded-md transition-colors duration-200 focus:outline-none focus:ring-2 focus:highlight focus:ring-offset-2"
|
||||||
>
|
>
|
||||||
<span v-if="isSubmitting">Wird gesendet...</span>
|
<span v-if="isSubmitting">Wird gesendet...</span>
|
||||||
<span v-else>Nachricht senden</span>
|
<span v-else>Nachricht senden</span>
|
||||||
@ -98,7 +112,7 @@ const form = reactive({
|
|||||||
name: '',
|
name: '',
|
||||||
email: '',
|
email: '',
|
||||||
phone: '',
|
phone: '',
|
||||||
message: ''
|
message: '',
|
||||||
})
|
})
|
||||||
|
|
||||||
const isSubmitting = ref(false)
|
const isSubmitting = ref(false)
|
||||||
@ -113,17 +127,17 @@ const handleSubmit = async () => {
|
|||||||
const response = await fetch('/api/mail', {
|
const response = await fetch('/api/mail', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json'
|
'Content-Type': 'application/json',
|
||||||
},
|
},
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
name: form.name,
|
name: form.name,
|
||||||
email: form.email,
|
email: form.email,
|
||||||
telephone: form.phone || undefined, // Send undefined if empty to match optional schema
|
telephone: form.phone || undefined, // Send undefined if empty to match optional schema
|
||||||
text: form.message
|
text: form.message,
|
||||||
})
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
if(response.status !== 200){
|
if (response.status !== 200) {
|
||||||
throw new Error('Bei der Kommunikation mit dem Server ist ein Fehler aufgetreten.')
|
throw new Error('Bei der Kommunikation mit dem Server ist ein Fehler aufgetreten.')
|
||||||
}
|
}
|
||||||
const result = await response.json()
|
const result = await response.json()
|
||||||
@ -142,9 +156,9 @@ const handleSubmit = async () => {
|
|||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
submitSuccess.value = false
|
submitSuccess.value = false
|
||||||
}, 5000) // Hide success message after 5 seconds
|
}, 5000) // Hide success message after 5 seconds
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
submitError.value = error instanceof Error ? error.message : 'Ein unbekannter Fehler ist aufgetreten'
|
submitError.value =
|
||||||
|
error instanceof Error ? error.message : 'Ein unbekannter Fehler ist aufgetreten'
|
||||||
} finally {
|
} finally {
|
||||||
isSubmitting.value = false
|
isSubmitting.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
<div class="content-width">
|
<div class="content-width">
|
||||||
<div class="py-16">
|
<div class="py-16">
|
||||||
<h1>{{ title }}</h1>
|
<h1>{{ title }}</h1>
|
||||||
<slot></slot>
|
<slot />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@ -15,16 +15,16 @@ export default {
|
|||||||
props: {
|
props: {
|
||||||
title: {
|
title: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true
|
required: true,
|
||||||
},
|
},
|
||||||
backgroundColor: {
|
backgroundColor: {
|
||||||
type: String,
|
type: String,
|
||||||
default: 'bg-white dark:bg-gray-900'
|
default: 'bg-white dark:bg-gray-900',
|
||||||
},
|
},
|
||||||
id: {
|
id: {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: '',
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -1,34 +0,0 @@
|
|||||||
<template>
|
|
||||||
<footer class="bg-[#22596c] text-white py-8">
|
|
||||||
<div class="content-width mx-auto px-4 md:px-6">
|
|
||||||
<div class="flex flex-col md:flex-row justify-between items-center">
|
|
||||||
<div class="mb-4 md:mb-0">
|
|
||||||
<p class="text-sm">© {{ currentYear }} CC BY IT4C.dev & Autoren</p>
|
|
||||||
</div>
|
|
||||||
<div class="flex flex-col sm:flex-row items-center gap-4 sm:gap-6">
|
|
||||||
<a href="/impressum.html" class="!text-white hover:!text-gray-300 hover:!underline text-sm transition-colors">
|
|
||||||
Impressum
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/IT4Change" target="_blank" rel="noopener noreferrer" class="!text-white hover:!text-gray-300 hover:!underline flex items-center gap-2 text-sm transition-colors">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-github">
|
|
||||||
<path d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4"></path>
|
|
||||||
<path d="M9 18c-4.51 2-5-2-7-2"></path>
|
|
||||||
</svg>
|
|
||||||
GitHub
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'FooterSection',
|
|
||||||
computed: {
|
|
||||||
currentYear() {
|
|
||||||
return new Date().getFullYear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@ -1,7 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="grid grid-cols-12 items-start mb-16">
|
<div class="grid grid-cols-12 items-start mb-16">
|
||||||
<div class="col-span-3 text-right pr-8">
|
<div class="col-span-3 text-right pr-8">
|
||||||
<span class="text-5xl sm:text-6xl font-bold highlight-number">{{ number.padStart(2, '0') }}</span>
|
<span class="text-5xl sm:text-6xl font-bold highlight-number">{{
|
||||||
|
number.padStart(2, '0')
|
||||||
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-span-9 pt-0 sm:pt-2">
|
<div class="col-span-9 pt-0 sm:pt-2">
|
||||||
<h3 class="text-xl font-semibold mb-2">{{ title }}</h3>
|
<h3 class="text-xl font-semibold mb-2">{{ title }}</h3>
|
||||||
|
|||||||
@ -1,15 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<a :href="href">
|
<a :href="href">
|
||||||
<div class="border border-gray-300 rounded-lg p-6">
|
<div class="border border-gray-300 rounded-lg p-6">
|
||||||
<img :src="image" :alt="title" class="rounded-lg mb-4 w-full h-auto object-contain">
|
<img :src="image" :alt="title" class="rounded-lg mb-4 w-full h-auto object-contain" />
|
||||||
<h3 class="text-xl font-semibold mb-2">{{ title }}</h3>
|
<h3 class="text-xl font-semibold mb-2">{{ title }}</h3>
|
||||||
<p class="text-gray-600 dark:text-gray-300 mb-4">{{ description }}</p>
|
<p class="text-gray-600 dark:text-gray-300 mb-4">{{ description }}</p>
|
||||||
<div class="flex flex-wrap gap-2">
|
<div class="flex flex-wrap gap-2">
|
||||||
<span
|
<span v-for="tag in tags" :key="tag" class="tag px-3 py-1 rounded-full text-sm">
|
||||||
v-for="tag in tags"
|
|
||||||
:key="tag"
|
|
||||||
class="tag px-3 py-1 rounded-full text-sm"
|
|
||||||
>
|
|
||||||
{{ tag }}
|
{{ tag }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -6,18 +6,19 @@
|
|||||||
<div class="relative w-48 h-48 mx-auto mb-4">
|
<div class="relative w-48 h-48 mx-auto mb-4">
|
||||||
<!-- Image container to control scaling bounds -->
|
<!-- Image container to control scaling bounds -->
|
||||||
<img
|
<img
|
||||||
:src="image"
|
:src="image"
|
||||||
:alt="name"
|
:alt="name"
|
||||||
class="rounded-full w-full h-full object-cover grayscale transition-all duration-200 transform
|
class="rounded-full w-full h-full object-cover grayscale transition-all duration-200 transform group-hover:scale-[1.05]"
|
||||||
group-hover:scale-[1.05]"
|
/>
|
||||||
>
|
|
||||||
<!-- Overlay mit highlight-color-light Variable -->
|
<!-- Overlay mit highlight-color-light Variable -->
|
||||||
<div class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[115%] h-[115%]
|
<div
|
||||||
rounded-full overlay-bg opacity-0 group-hover:opacity-25 transition-opacity duration-200">
|
class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[115%] h-[115%] rounded-full overlay-bg opacity-0 group-hover:opacity-25 transition-opacity duration-200"
|
||||||
</div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h4 class="font-semibold text-gray-900 dark:text-gray-50 transition-colors duration-200 group-hover:text-gray-600 group-hover:dark:text-gray-300">
|
<h4
|
||||||
|
class="font-semibold text-gray-900 dark:text-gray-50 transition-colors duration-200 group-hover:text-gray-600 group-hover:dark:text-gray-300"
|
||||||
|
>
|
||||||
{{ name }}
|
{{ name }}
|
||||||
</h4>
|
</h4>
|
||||||
<p class="text-sm text-gray-600 dark:text-gray-300">{{ role }}</p>
|
<p class="text-sm text-gray-600 dark:text-gray-300">{{ role }}</p>
|
||||||
@ -25,16 +26,16 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
defineProps<{
|
defineProps<{
|
||||||
name: string
|
name: string
|
||||||
role: string
|
role: string
|
||||||
image: string
|
image: string
|
||||||
profileUrl: string
|
profileUrl: string
|
||||||
}>()
|
}>()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.overlay-bg {
|
.overlay-bg {
|
||||||
background-color: var(--highlight-color-light);
|
background-color: var(--highlight-color-light);
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
55
docs/.vuepress/components/VPFooter.vue
Normal file
55
docs/.vuepress/components/VPFooter.vue
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<template>
|
||||||
|
<footer class="bg-[#22596c] text-white py-8">
|
||||||
|
<div class="content-width mx-auto px-4 md:px-6">
|
||||||
|
<div class="flex flex-col md:flex-row justify-between items-center">
|
||||||
|
<div class="mb-4 md:mb-0">
|
||||||
|
<p class="text-sm">© {{ currentYear }} CC BY IT4C.dev & Autoren</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col sm:flex-row items-center gap-4 sm:gap-6">
|
||||||
|
<a
|
||||||
|
href="/impressum.html"
|
||||||
|
class="!text-white hover:!text-gray-300 hover:!underline text-sm transition-colors"
|
||||||
|
>
|
||||||
|
Impressum
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="https://github.com/IT4Change"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
class="!text-white hover:!text-gray-300 hover:!underline flex items-center gap-2 text-sm transition-colors"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="20"
|
||||||
|
height="20"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="lucide lucide-github"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4"
|
||||||
|
/>
|
||||||
|
<path d="M9 18c-4.51 2-5-2-7-2" />
|
||||||
|
</svg>
|
||||||
|
GitHub
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'FooterSection',
|
||||||
|
computed: {
|
||||||
|
currentYear() {
|
||||||
|
return new Date().getFullYear()
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@ -11,10 +11,8 @@ export default defineUserConfig({
|
|||||||
theme,
|
theme,
|
||||||
bundler: viteBundler({
|
bundler: viteBundler({
|
||||||
viteOptions: {
|
viteOptions: {
|
||||||
plugins: [
|
plugins: [tailwindcss()],
|
||||||
tailwindcss(),
|
},
|
||||||
]
|
|
||||||
}
|
|
||||||
}),
|
}),
|
||||||
plugins: [
|
plugins: [
|
||||||
Imagemin({
|
Imagemin({
|
||||||
|
|||||||
@ -1,9 +1,10 @@
|
|||||||
import { HeadConfig } from "vuepress";
|
import { HeadConfig } from 'vuepress'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
title: 'IT4C',
|
title: 'IT4C',
|
||||||
description: 'IT4C.dev stellt das IT Team for Change, seine angewandte Philosophie und Projekte vor.',
|
description:
|
||||||
|
'IT4C.dev stellt das IT Team for Change, seine angewandte Philosophie und Projekte vor.',
|
||||||
head: [
|
head: [
|
||||||
['meta', {name: 'viewport', content: 'width=device-width,initial-scale=1'}]
|
['meta', { name: 'viewport', content: 'width=device-width,initial-scale=1' }],
|
||||||
] as HeadConfig[],
|
] as HeadConfig[],
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,7 +17,7 @@ export default hopeTheme({
|
|||||||
{ text: 'Kontakt', link: '/kontakt' },
|
{ text: 'Kontakt', link: '/kontakt' },
|
||||||
{
|
{
|
||||||
text: 'Github',
|
text: 'Github',
|
||||||
link: 'https://github.com/IT4Change'
|
link: 'https://github.com/IT4Change',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
sidebar: [
|
sidebar: [
|
||||||
@ -30,10 +30,7 @@ export default hopeTheme({
|
|||||||
text: 'IT4C',
|
text: 'IT4C',
|
||||||
link: '/it4c',
|
link: '/it4c',
|
||||||
collapsible: false,
|
collapsible: false,
|
||||||
children: [
|
children: ['/historie', '/kontakt'],
|
||||||
'/historie',
|
|
||||||
'/kontakt'
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: 'Projekte',
|
text: 'Projekte',
|
||||||
@ -41,21 +38,21 @@ export default hopeTheme({
|
|||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
text: 'DEMOCRACY App',
|
text: 'DEMOCRACY App',
|
||||||
link: '/projekte/democracy.app'
|
link: '/projekte/democracy.app',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: 'Ocelot.Social',
|
text: 'Ocelot.Social',
|
||||||
link: '/projekte/ocelot.social'
|
link: '/projekte/ocelot.social',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: 'Gradido Software',
|
text: 'Gradido Software',
|
||||||
link: '/projekte/gradido'
|
link: '/projekte/gradido',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: 'DreamMall.earth',
|
text: 'DreamMall.earth',
|
||||||
link: '/projekte/dreammall'
|
link: '/projekte/dreammall',
|
||||||
},
|
},
|
||||||
]
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: 'Team',
|
text: 'Team',
|
||||||
@ -68,13 +65,13 @@ export default hopeTheme({
|
|||||||
'/team/moriz-wahl',
|
'/team/moriz-wahl',
|
||||||
'/team/sebastian-stein',
|
'/team/sebastian-stein',
|
||||||
'/team/ulf-gebhardt',
|
'/team/ulf-gebhardt',
|
||||||
'/team/wolfgang-huss'
|
'/team/wolfgang-huss',
|
||||||
]
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
plugins: {
|
plugins: {
|
||||||
slimsearch: {
|
slimsearch: {
|
||||||
indexContent: true
|
indexContent: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,22 +1,22 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="theme-container blank-layout">
|
<div class="theme-container blank-layout">
|
||||||
<Content />
|
<Content />
|
||||||
<Footer />
|
<VPFooter />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
name: 'BlankLayout'
|
name: 'BlankLayout',
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
@layer theme, base, components, utilities;
|
@layer theme, base, components, utilities;
|
||||||
|
|
||||||
@import "tailwindcss/theme.css" layer(theme);
|
@import 'tailwindcss/theme.css' layer(theme);
|
||||||
@import "tailwindcss/preflight.css" layer(base);
|
@import 'tailwindcss/preflight.css' layer(base);
|
||||||
@import "tailwindcss/utilities.css" layer(utilities);
|
@import 'tailwindcss/utilities.css' layer(utilities);
|
||||||
|
|
||||||
@custom-variant dark (&:where([data-theme="dark"], [data-theme="dark"] *));
|
@custom-variant dark (&:where([data-theme="dark"], [data-theme="dark"] *));
|
||||||
|
|
||||||
@ -51,11 +51,17 @@ export default {
|
|||||||
--content-width: 1160px;
|
--content-width: 1160px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.blank-layout h1, .blank-layout h2, .blank-layout h3, .blank-layout h4, .blank-layout h5, .blank-layout h6 {
|
.blank-layout h1,
|
||||||
font-family: var(--font-family-heading);
|
.blank-layout h2,
|
||||||
}
|
.blank-layout h3,
|
||||||
|
.blank-layout h4,
|
||||||
|
.blank-layout h5,
|
||||||
|
.blank-layout h6 {
|
||||||
|
font-family: var(--font-family-heading);
|
||||||
|
}
|
||||||
|
|
||||||
.blank-layout h1, .blank-layout h2 {
|
.blank-layout h1,
|
||||||
|
.blank-layout h2 {
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
padding-bottom: 2rem;
|
padding-bottom: 2rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
|||||||
37
eslint.config.ts
Normal file
37
eslint.config.ts
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import eslint from '@eslint/js'
|
||||||
|
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'
|
||||||
|
import eslintPluginVue from 'eslint-plugin-vue'
|
||||||
|
import globals from 'globals'
|
||||||
|
import typescriptEslint from 'typescript-eslint'
|
||||||
|
|
||||||
|
export default typescriptEslint.config(
|
||||||
|
{
|
||||||
|
ignores: [
|
||||||
|
'coverage',
|
||||||
|
'backend',
|
||||||
|
'docs/.vuepress/.cache',
|
||||||
|
'docs/.vuepress/.temp',
|
||||||
|
'docs/.vuepress/dist',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
extends: [
|
||||||
|
eslint.configs.recommended,
|
||||||
|
...typescriptEslint.configs.recommended,
|
||||||
|
...eslintPluginVue.configs['flat/recommended'],
|
||||||
|
],
|
||||||
|
files: ['**/*.{ts,vue}'],
|
||||||
|
languageOptions: {
|
||||||
|
ecmaVersion: 'latest',
|
||||||
|
sourceType: 'module',
|
||||||
|
globals: globals.browser,
|
||||||
|
parserOptions: {
|
||||||
|
parser: typescriptEslint.parser,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
// your rules
|
||||||
|
},
|
||||||
|
},
|
||||||
|
eslintPluginPrettierRecommended,
|
||||||
|
)
|
||||||
1301
package-lock.json
generated
1301
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
11
package.json
11
package.json
@ -7,7 +7,9 @@
|
|||||||
"build": "vuepress build docs",
|
"build": "vuepress build docs",
|
||||||
"dev": "vuepress dev docs",
|
"dev": "vuepress dev docs",
|
||||||
"dev-prod": "npm run build && http-server ./docs/.vuepress/dist",
|
"dev-prod": "npm run build && http-server ./docs/.vuepress/dist",
|
||||||
"test": "textlint \"*.md\" \"docs/**/*.md\""
|
"test": "npm run test:lint:textlint && npm run test:lint:eslint",
|
||||||
|
"test:lint:eslint": "eslint",
|
||||||
|
"test:lint:textlint": "textlint \"*.md\" \"docs/**/*.md\""
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -24,7 +26,13 @@
|
|||||||
"@textlint-rule/textlint-rule-no-unmatched-pair": "^2.0.4",
|
"@textlint-rule/textlint-rule-no-unmatched-pair": "^2.0.4",
|
||||||
"@vuepress/bundler-vite": "^2.0.0-rc.20",
|
"@vuepress/bundler-vite": "^2.0.0-rc.20",
|
||||||
"@vuepress/plugin-slimsearch": "^2.0.0-rc.82",
|
"@vuepress/plugin-slimsearch": "^2.0.0-rc.82",
|
||||||
|
"eslint": "^9.22.0",
|
||||||
|
"eslint-config-prettier": "^10.1.1",
|
||||||
|
"eslint-plugin-prettier": "^5.2.3",
|
||||||
|
"eslint-plugin-vue": "^10.0.0",
|
||||||
|
"globals": "^16.0.0",
|
||||||
"http-server": "^14.1.1",
|
"http-server": "^14.1.1",
|
||||||
|
"prettier": "3.5.3",
|
||||||
"sass-embedded": "^1.86.0",
|
"sass-embedded": "^1.86.0",
|
||||||
"tailwindcss": "^4.0.5",
|
"tailwindcss": "^4.0.5",
|
||||||
"textlint": "^14.5.0",
|
"textlint": "^14.5.0",
|
||||||
@ -41,6 +49,7 @@
|
|||||||
"textlint-rule-no-zero-width-spaces": "^1.0.1",
|
"textlint-rule-no-zero-width-spaces": "^1.0.1",
|
||||||
"textlint-rule-period-in-list-item": "^1.0.1",
|
"textlint-rule-period-in-list-item": "^1.0.1",
|
||||||
"textlint-rule-write-good": "^2.0.0",
|
"textlint-rule-write-good": "^2.0.0",
|
||||||
|
"typescript-eslint": "^8.27.0",
|
||||||
"vuepress": "^2.0.0-rc.20",
|
"vuepress": "^2.0.0-rc.20",
|
||||||
"vuepress-plugin-imagemin": "^0.1.2",
|
"vuepress-plugin-imagemin": "^0.1.2",
|
||||||
"vuepress-theme-hope": "^2.0.0-rc.74"
|
"vuepress-theme-hope": "^2.0.0-rc.74"
|
||||||
|
|||||||
@ -1,11 +1,7 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
content: [
|
content: ['./docs/**/*.{vue,js,ts,jsx,tsx,md}', '!./**/cache', '!./**/.temp'],
|
||||||
'./docs/**/*.{vue,js,ts,jsx,tsx,md}',
|
theme: {
|
||||||
'!./**/cache',
|
extend: {},
|
||||||
'!./**/.temp',
|
},
|
||||||
],
|
plugins: [],
|
||||||
theme: {
|
|
||||||
extend: {},
|
|
||||||
},
|
|
||||||
plugins: [],
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user