feat(other): eslint & prettier (#302)

* eslint

* eslint fixes

* fix footer

* install prettier

* fix prettier
This commit is contained in:
Ulf Gebhardt 2025-03-20 20:11:16 +01:00 committed by GitHub
parent cdb1944578
commit d6be15ce0d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
19 changed files with 1564 additions and 168 deletions

14
.prettierrc.json Normal file
View 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"
}

View File

@ -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,

View File

@ -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,
} },
}) })

View File

@ -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>

View File

@ -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
} }

View File

@ -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>

View File

@ -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">&copy; {{ 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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View 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">&copy; {{ 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>

View File

@ -11,10 +11,8 @@ export default defineUserConfig({
theme, theme,
bundler: viteBundler({ bundler: viteBundler({
viteOptions: { viteOptions: {
plugins: [ plugins: [tailwindcss()],
tailwindcss(), },
]
}
}), }),
plugins: [ plugins: [
Imagemin({ Imagemin({

View File

@ -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[],
} }

View File

@ -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,
}, },
}, },
}) })

View File

@ -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
View 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

File diff suppressed because it is too large Load Diff

View File

@ -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"

View File

@ -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: [],
} }