+
+
+
\ No newline at end of file
diff --git a/app/components/RichText/Plain.vue b/app/components/RichText/Plain.vue
new file mode 100755
index 0000000..162d9d3
--- /dev/null
+++ b/app/components/RichText/Plain.vue
@@ -0,0 +1,9 @@
+
+ {{ content }}
+
+
+
diff --git a/app/components/RichText/RichText.vue b/app/components/RichText/RichText.vue
new file mode 100755
index 0000000..ed64451
--- /dev/null
+++ b/app/components/RichText/RichText.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/RichText/String.vue b/app/components/RichText/String.vue
new file mode 100755
index 0000000..926b4e0
--- /dev/null
+++ b/app/components/RichText/String.vue
@@ -0,0 +1,11 @@
+
+
+ {{ content }}
+
+
+
+
diff --git a/app/components/RichText/Types.ts b/app/components/RichText/Types.ts
new file mode 100755
index 0000000..3372f88
--- /dev/null
+++ b/app/components/RichText/Types.ts
@@ -0,0 +1,30 @@
+type RichTextBasis = {
+ type: string
+ content: string
+ css ?: string
+}
+
+export type RichTextPlain = RichTextBasis & {
+ type: 'plain'
+}
+
+export type RichTextParagraph = Omit & {
+ type: 'p'
+ children ?: RichText[]
+}
+
+export type RichTextSpan = RichTextBasis & {
+ type: 'span'
+}
+
+export type RichTextLink = RichTextBasis & {
+ type: 'a'
+ href: string
+ target ?: string
+}
+
+export type RichTextNewLine = {
+ type: 'br'
+}
+
+export type RichText = RichTextPlain | RichTextParagraph | RichTextSpan | RichTextLink | RichTextNewLine
\ No newline at end of file
diff --git a/app/components/Section/Booking.vue b/app/components/Section/Booking.vue
index ca9d9fa..a715ed7 100755
--- a/app/components/Section/Booking.vue
+++ b/app/components/Section/Booking.vue
@@ -1,44 +1,33 @@
Projekt buchen
-
Paketpreise für
- feste Ergebnisse
- .
-
+
Du hast also beschlossen, dass du meine Hilfe brauchst. Cool!
Manchmal brauchen wir alle einfach nur eine Kleinigkeit und wollen uns nicht lange binden. Das ist natürlich
- völlig in Ordnung und genau deshalb biete ich dir die Möglichkeit mich gezielt für
- kleinere Projekte
- zu buchen.
-
-
Hinter diesen Angeboten gibt es
- keinerlei Abos oder versteckte Kosten
- .
- Aus Transparenzgründen sei aber gesagt, dass sich
- alle Preise zzgl. 19 % Umsatzsteuer
- verstehen.
-
+ völlig in Ordnung und genau deshalb biete ich dir die Möglichkeit mich gezielt für kleinere Projekte zu buchen.
+
Hinter diesen Angeboten gibt es keinerlei Abos oder versteckte Kosten.
+ Aus Transparenzgründen sei aber gesagt, dass sich alle Preise zzgl. 19 % Umsatzsteuer verstehen.
@@ -76,16 +65,15 @@ type Service = {
}
const intl = new Intl.NumberFormat(
- 'de-DE',
- {
- style: 'currency',
- currency: 'EUR',
- minimumFractionDigits: 0,
- maximumFractionDigits: 0,
- },
-)
+ 'de-DE',
+ {
+ style: 'currency',
+ currency: 'EUR',
+ minimumFractionDigits: 0,
+ maximumFractionDigits: 0,
+ })
-const oneOff: Service[] = [
+const oneOff : Service[] = [
{
title: 'Quick Check',
price: {
@@ -140,21 +128,36 @@ const oneOff: Service[] = [
},
]
-const { data: faq } = await useAsyncData('faq_booking', () => queryCollection('faq').path('/snippets/faq/booking').first())
-const texts = generatePlainText<['title']>(faq.value?.body.value)
+const faq = [
+ {
+ header: 'Warum machst du keine Stundensätze?',
+ content: [
+ 'Ich finde Stundensätze haben für beide Seiten nur Nachteile:',
+ 'Wenn ich schnell und gut arbeite, dann bekomme ich weniger Geld. Hab ich mal einen Knoten im Gehirn und brauche sehr lange, muss der Kunde mehr zahlen.',
+ 'Klar kann man sagen, dass sich das irgendwann ausgleichen könnte - aber so weit will ich es garnicht erst kommen lassen.'
+ ]
+ },
+ {
+ header: 'Welche Themen bietest du für deine Schulungen an?',
+ content: [
+ 'Sprachen: JavaScript, TypeScript, HTML, CSS',
+ 'Frameworks: Vue, Nuxt',
+ ]
+ },
+ {
+ header: 'Wo finden die Schulungen statt?',
+ content: [
+ 'Die Schulungen finden online statt. Normalerweise nutze ich dafür Google Meet, aber wenn du oder deine Firma eine andere Plattform wünschen und bereitstellen bin ich natürlich flexibel.',
+ 'Wenn sich deine Firma in der Nähe meines Wohnortes befindet - und damit meine ich "In einer Stunde mit der Straßenbahn zu erreichen", dann kann alles natürlich auch vor Ort stattfinden.',
+ ]
+ },
+ {
+ header: 'Ich hab ein cooles Projekt! Aber kein Geld...',
+ content: [
+ 'Tja.',
+ 'Ne, awas. Meld dich einfach trotzdem über meine E-Mail-Adresse und vielleicht finden wir eine Lösung.'
+ ]
+ }
+]
-if (faq) {
- useSchemaOrg({
- '@context': 'https://schema.org',
- '@type': 'FAQPage',
- 'mainEntity': texts.map(entity => ({
- '@type': 'Question',
- 'name': entity.meta.title,
- 'acceptedAnswer': {
- '@type': 'Answer',
- 'text': entity.text,
- },
- })),
- })
-}
diff --git a/app/components/Section/Contact.vue b/app/components/Section/Contact.vue
index 56f51da..15a187f 100644
--- a/app/components/Section/Contact.vue
+++ b/app/components/Section/Contact.vue
@@ -1,7 +1,7 @@
-
Kontakt & Social Media
-
Kannst ruhig in meine DMs sliden. Oder in's Postfach.
+
Kontakt & Social Media
+
Kannst ruhig in meine DMs sliden. Oder in's Postfach.
Du willst einfach nur 'ne Mail schreiben?
@@ -12,10 +12,10 @@
Ich auf Social Media
-
Falls du irgendwo einen anderen Social Media Account von mir findest, der nicht hier aufgelistet ist, aber aktiv postet, dann ist dieser höchstwahrscheinlich Fake.
+
Falls du irgendwo einen anderen Social Media Account von mir findest, der nicht hier aufgelistet ist, aber aktiv postet, dann ist dieser höchstwahrscheinlich Fake.
Meld' dich gerne bei mir, wenn du so einen findest.