ADD: RichText
Added RichText system
This commit is contained in:
parent
311894d6d0
commit
b014d31577
9 changed files with 250 additions and 95 deletions
|
@ -8,26 +8,7 @@
|
|||
<div class="flex-col gap-default">
|
||||
<h3>{{skill.title}}</h3>
|
||||
<main class="flex-col gap-sm">
|
||||
<component v-for="({type, content, ...rest}) in skill.text" :is="type" v-bind="rest">
|
||||
{{ content}}
|
||||
<template v-if="'children' in rest && rest.children">
|
||||
<template v-for="({type, content, ...childRest}, childIndex) in rest.children" :key="childIndex">
|
||||
<template v-if="type === 'text'">
|
||||
{{ content }}
|
||||
</template>
|
||||
<template v-else-if="type === 'a'">
|
||||
<component :is="type" v-bind="childRest" class="inline-flex-row">
|
||||
{{ content}} <Icon v-if="'icon' in childRest && childRest.icon" :name="childRest.icon.name" mode="svg" :class="childRest.icon.position === 'end' && 'reverse'" />
|
||||
</component>
|
||||
</template>
|
||||
<template v-else>
|
||||
<component :is="type" v-bind="childRest">
|
||||
{{ content}}
|
||||
</component>
|
||||
</template>
|
||||
</template>
|
||||
</template>
|
||||
</component>
|
||||
<RichText v-for="(t, index) in skill.text" :key="`${t.type}-${index}`" :elements="t" />
|
||||
</main>
|
||||
</div>
|
||||
</article>
|
||||
|
@ -43,31 +24,8 @@
|
|||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
type RichTextBase = {
|
||||
type: 'text'
|
||||
content: string
|
||||
}
|
||||
|
||||
type RichTextSimple = {
|
||||
type: 'p' | 'span'
|
||||
content: string
|
||||
class ?: string
|
||||
children ?: RichText[]
|
||||
}
|
||||
|
||||
type RichTextLink = {
|
||||
type: 'a'
|
||||
content: string
|
||||
href: string
|
||||
icon ?: {
|
||||
name: string
|
||||
position : 'start' | 'end'
|
||||
}
|
||||
target ?: string
|
||||
class ?: string
|
||||
}
|
||||
|
||||
type RichText = RichTextBase | RichTextSimple | RichTextLink
|
||||
import type { RichText } from './RichText/Types'
|
||||
|
||||
type Skill = {
|
||||
img: string
|
||||
|
@ -82,27 +40,48 @@ const skills : Skill[] = [
|
|||
text: [
|
||||
{
|
||||
type: 'p',
|
||||
content: 'Die meisten Anwendungen haben eine grafische Benutzeroberfläche - die so genannte GUI. Wenn etwas graphisch ist, ' +
|
||||
'dann bedeutet das auch natürlich, dass es sinnvoll dargestellt werden muss. Dafür verwenden wir kleine Bausteine, die wir Komponenten nennen.',
|
||||
},
|
||||
{
|
||||
type: 'p',
|
||||
content: 'Grundsätzlich lassen sich komplette Anwendungen und auch einfache Webseiten ziemlich cool über Komponenten aufbauen, sodass wir wiederkehrende Elemente ' +
|
||||
'wie Buttons, Textabschnitte, Links oder Teaser immer wieder verwenden können - selbst wenn sich diese in ihren Details wie Farben oder Icons unterscheiden.',
|
||||
},
|
||||
{
|
||||
type: 'p',
|
||||
content: 'Diese Komponenten so zu entwickeln, dass sie wirklich flexibel sind und auch perfekt mit dem Design übereinstimmen ist gar nicht so einfach, denn oft sollten sie ' +
|
||||
'auch mehr können als im Design kurzfristig ersichtlich ist.',
|
||||
},
|
||||
{
|
||||
type: 'p',
|
||||
class: 'margin-top bold',
|
||||
content: 'Diese Voraussicht, für den Fall der Fälle vorzusorgen: Die gibt\'s bei mir dazu.',
|
||||
children: [
|
||||
{
|
||||
type: 'plain',
|
||||
content: 'Die meisten Anwendungen haben eine grafische Benutzeroberfläche - die so genannte GUI. Wenn etwas graphisch ist, ' +
|
||||
'dann bedeutet das auch natürlich, dass es sinnvoll dargestellt werden muss. Dafür verwenden wir kleine Bausteine, die wir Komponenten nennen.',
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'p',
|
||||
children: [
|
||||
{
|
||||
type: 'plain',
|
||||
content: 'Grundsätzlich lassen sich komplette Anwendungen und auch einfache Webseiten ziemlich cool über Komponenten aufbauen, sodass wir wiederkehrende Elemente ' +
|
||||
'wie Buttons, Textabschnitte, Links oder Teaser immer wieder verwenden können - selbst wenn sich diese in ihren Details wie Farben oder Icons unterscheiden.',
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'p',
|
||||
children: [
|
||||
{
|
||||
type: 'plain',
|
||||
content: 'Diese Komponenten so zu entwickeln, dass sie wirklich flexibel sind und auch perfekt mit dem Design übereinstimmen ist gar nicht so einfach, denn oft sollten sie ' +
|
||||
'auch mehr können als im Design kurzfristig ersichtlich ist.',
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'p',
|
||||
css: 'margin-top bold',
|
||||
children: [
|
||||
{
|
||||
type: 'plain',
|
||||
content: 'Diese Voraussicht, für den Fall der Fälle vorzusorgen: Die gibt\'s bei mir dazu. ',
|
||||
},
|
||||
{
|
||||
type: 'br',
|
||||
},
|
||||
{
|
||||
type: 'span',
|
||||
class: 'highlight',
|
||||
css: 'highlight',
|
||||
content: 'Fussel-Ehrenwort.'
|
||||
}
|
||||
]
|
||||
|
@ -114,47 +93,53 @@ const skills : Skill[] = [
|
|||
text: [
|
||||
{
|
||||
type: 'p',
|
||||
content: 'In vielen Fällen ist es natürlich praktisch, wenn du einfach Inhalte einer Seite auf das ändern kannst, was gerade aktuell ist, ohne auf andere angewiesen zu sein.'
|
||||
+ 'Damit das reibungslos möglich ist, entwickle ich dir gerne eine Anwendung oder Homepage, deren Inhalte du komplett selbst auf dem neuesten Stand halten kannst - und zwar ' +
|
||||
'mit einem sogenannten CMS - ein ',
|
||||
children: [
|
||||
{
|
||||
type: 'plain',
|
||||
content: 'In vielen Fällen ist es natürlich praktisch, wenn du einfach Inhalte einer Seite auf das ändern kannst, was gerade aktuell ist, ohne auf andere angewiesen zu sein.'
|
||||
+ 'Damit das reibungslos möglich ist, entwickle ich dir gerne eine Anwendung oder Homepage, deren Inhalte du komplett selbst auf dem neuesten Stand halten kannst - und zwar '
|
||||
+ 'mit einem sogenannten CMS - ein ',
|
||||
},
|
||||
{
|
||||
type: 'span',
|
||||
class: 'highlight',
|
||||
css: 'highlight',
|
||||
content: 'C'
|
||||
},
|
||||
{
|
||||
type: 'text',
|
||||
type: 'plain',
|
||||
content: 'ontent '
|
||||
},
|
||||
{
|
||||
type: 'span',
|
||||
class: 'highlight',
|
||||
css: 'highlight',
|
||||
content: 'M'
|
||||
},
|
||||
{
|
||||
type: 'text',
|
||||
type: 'plain',
|
||||
content: 'anagement '
|
||||
},
|
||||
{
|
||||
type: 'span',
|
||||
class: 'highlight',
|
||||
css: 'highlight',
|
||||
content: 'S'
|
||||
},
|
||||
{
|
||||
type: 'text',
|
||||
type: 'plain',
|
||||
content: 'ystem.'
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'p',
|
||||
content: 'Für CMS setze ich in erster Linie auf die cloudbasierte Lösung ',
|
||||
children: [
|
||||
{
|
||||
type: 'plain',
|
||||
content: 'Für CMS setze ich in erster Linie auf die cloudbasierte Lösung ',
|
||||
},
|
||||
{
|
||||
type: 'a',
|
||||
target: '_blank',
|
||||
class: 'text',
|
||||
css: 'text',
|
||||
href: 'https://www.storyblok.com',
|
||||
icon: {
|
||||
name: 'ph:arrow-square-out-duotone',
|
||||
|
@ -163,19 +148,22 @@ const skills : Skill[] = [
|
|||
content: 'Storyblok'
|
||||
},
|
||||
{
|
||||
type: 'text',
|
||||
type: 'plain',
|
||||
content: '. Dies stellt für die Meisten eine kostenlose bis kostengünstige Lösung dar ohne viel technisches Wissen mitbringen zu müssen.',
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'p',
|
||||
content: 'Falls du aber nicht möchtest, dass deine Daten auf irgendeinem Fremden server liegen - was ich durchaus verstehen kann! - dann gibt es auch die Möglichkeit mit ',
|
||||
children: [
|
||||
{
|
||||
type: 'plain',
|
||||
content: 'Falls du aber nicht möchtest, dass deine Daten auf irgendeinem Fremden server liegen - was ich durchaus verstehen kann! - dann gibt es auch die Möglichkeit mit ',
|
||||
},
|
||||
{
|
||||
type: 'a',
|
||||
target: '_blank',
|
||||
class: 'text',
|
||||
css: 'text',
|
||||
href: 'https://www.strapi.io',
|
||||
icon: {
|
||||
name: 'ph:arrow-square-out-duotone',
|
||||
|
@ -184,19 +172,25 @@ const skills : Skill[] = [
|
|||
content: 'Strapi'
|
||||
},
|
||||
{
|
||||
type: 'text',
|
||||
type: 'plain',
|
||||
content: ' selbst das eigene CMS zu hosten. Das musst du dann aber allerdings selbst erledigen oder ich erledige das für dich für einen Aufpreis.',
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'p',
|
||||
class: 'margin-top bold',
|
||||
content: 'Nie wieder jemand anderen Fragen zu müssen, um deine Website auf dem neuesten Stand zu halten.',
|
||||
css: 'margin-top bold',
|
||||
children: [
|
||||
{
|
||||
type: 'plain',
|
||||
content: 'Nie wieder jemand anderen Fragen zu müssen, um deine Website auf dem neuesten Stand zu halten.',
|
||||
},
|
||||
{
|
||||
type: 'br',
|
||||
},
|
||||
{
|
||||
type: 'span',
|
||||
class: 'highlight',
|
||||
css: 'highlight',
|
||||
content: 'Mit Fussel-Garantie.'
|
||||
}
|
||||
]
|
||||
|
@ -208,33 +202,52 @@ const skills : Skill[] = [
|
|||
text: [
|
||||
{
|
||||
type: 'p',
|
||||
content: 'Grundsätzlich lässt sich das ganz einfach zusammenfassen: ',
|
||||
children: [
|
||||
{
|
||||
type: 'plain',
|
||||
content: 'Grundsätzlich lässt sich das ganz einfach zusammenfassen: ',
|
||||
},
|
||||
{
|
||||
type: 'span',
|
||||
class: 'highlight',
|
||||
css: 'highlight',
|
||||
content: 'Dein persönlicher Webauftritt.',
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'p',
|
||||
content: 'Ob du nun etwas kleineres brauchst, um ein paar Hobbies zu zeigen. Oder vielleicht etwas größeres, weil du dir ein eigenes Business aufbauen willst. Eventuell ein eigener Blog, eine komplette Applikation oder ' +
|
||||
'die Möglichkeit für andere Leute deine Daten bereit zu stellen. All das, das kann ich dir mit meinen Fähigkeiten und meiner Erfahrung bieten.'
|
||||
},
|
||||
{
|
||||
type: 'p',
|
||||
content: 'Erkunde einfach meine Referenzen und dir wird auffallen, dass diese äußerst durchmischt und bunt sind. So individuell wie die Projekte meiner bisherigen Kunden wird auch dein Projekt behandelt. Und auch, wenn '
|
||||
+ 'du glaubst, dass die Referenzen nicht zu deinem Projekt passen, werden wir deine ganz individuelle Lösung gemeinsam erarbeiten.'
|
||||
},
|
||||
{
|
||||
type: 'p',
|
||||
class: 'margin-top bold',
|
||||
content: 'Denn jedes Projekt ist etwas eigenes und besonderes.',
|
||||
children: [
|
||||
{
|
||||
type: 'plain',
|
||||
content: 'Ob du nun etwas kleineres brauchst, um ein paar Hobbies zu zeigen. Oder vielleicht etwas größeres, weil du dir ein eigenes Business aufbauen willst. Eventuell ein eigener Blog, eine komplette Applikation oder '
|
||||
+ 'die Möglichkeit für andere Leute deine Daten bereit zu stellen. All das, das kann ich dir mit meinen Fähigkeiten und meiner Erfahrung bieten.'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'p',
|
||||
children: [
|
||||
{
|
||||
type: 'plain',
|
||||
content: 'Erkunde einfach meine Referenzen und dir wird auffallen, dass diese äußerst durchmischt und bunt sind. So individuell wie die Projekte meiner bisherigen Kunden wird auch dein Projekt behandelt. Und auch, wenn '
|
||||
+ 'du glaubst, dass die Referenzen nicht zu deinem Projekt passen, werden wir deine ganz individuelle Lösung gemeinsam erarbeiten.'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'p',
|
||||
css: 'margin-top bold',
|
||||
children: [
|
||||
{
|
||||
type: 'plain',
|
||||
content: 'Denn jedes Projekt ist etwas eigenes und besonderes.',
|
||||
},
|
||||
{
|
||||
type: 'br',
|
||||
},
|
||||
{
|
||||
type: 'span',
|
||||
class: 'highlight',
|
||||
css: 'highlight',
|
||||
content: 'Auch deins.'
|
||||
}
|
||||
]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue