1
0
Fork 0

Use Kiste

This commit is contained in:
Moritz Ruth 2019-12-08 17:45:22 +01:00
parent 925ecec652
commit 19b9bae0ee
25 changed files with 479 additions and 1054 deletions

View file

@ -1,5 +1,6 @@
# moritz-ruth.de # moritz-ruth.de
> The official website of Moritz Ruth > The official website of Moritz Ruth
## Build Setup ## Build Setup

View file

@ -1,11 +0,0 @@
@mixin mobile() {
@media (max-width: 800px) {
@content;
}
}
@mixin notMobile() {
@media (min-width: 801px) {
@content;
}
}

View file

@ -1,9 +0,0 @@
$content-width: 1000px;
$content-padding: 20px;
$small-gutter: 10px;
$black-brighter: #0e0e0e;
$blue: #3695d8;
$on-blue: black;
$blue-darker: #3289c7;

View file

@ -1,4 +0,0 @@
@import "content";
@import "link";
@import "heading";
@import "paragraph";

View file

@ -1,11 +0,0 @@
@import "../variables";
.content {
width: $content-width;
margin: 0 auto;
@media (max-width: #{$content-width + $content-padding * 2}) {
width: 100%;
padding: 0 #{$content-padding};
}
}

View file

@ -1,28 +0,0 @@
.heading--1, .heading--2, .heading--3, .heading--4, .heading--5, .heading--6 {
margin-top: 1rem;
margin-bottom: 1rem;
}
.heading--1 {
font-size: 3.8rem;
}
.heading--2 {
font-size: 3rem;
}
.heading--3 {
font-size: 2.6rem;
}
.heading--4 {
font-size: 2.2rem;
}
.heading--5 {
font-size: 1.8rem;
}
.heading--6 {
font-size: 1.4rem;
}

View file

@ -1,13 +0,0 @@
@import "../variables";
.link {
color: $blue;
text-decoration: none;
transition: 100ms linear opacity;
opacity: 1;
&:hover {
opacity: 0.8;
}
}

View file

@ -1,7 +0,0 @@
.paragraph {
margin: 20px 0;
li {
margin-left: 20px;
}
}

View file

@ -1,32 +0,0 @@
@import "elements/_all";
@import "mobile";
:root {
--navbar-height: 100px;
@include mobile {
--navbar-height: 80px;
}
}
*, ::before, ::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: "Alata", sans-serif;
font-size: 16px;
}
html, body, #__nuxt, #__layout, .fill-screen {
max-width: 100vw;
min-height: 100vh;
overflow-x: auto;
}
::selection {
background-color: #dddddd;
}

3
assets/global.scss Normal file
View file

@ -0,0 +1,3 @@
body {
font-family: "Alata", sans-serif;
}

View file

@ -1,4 +0,0 @@
export const footer = Object.freeze([
{ label: "Legal Notice", to: "/legal-notice" },
{ label: "Privacy Policy", to: "/privacy-policy" }
]);

View file

@ -7,6 +7,8 @@
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">
$logo-width: 270px;
.animated-logo { .animated-logo {
animation: logo-width 800ms 1s ease, logo-height 600ms 1.9s ease; animation: logo-width 800ms 1s ease, logo-height 600ms 1.9s ease;
animation-fill-mode: both; animation-fill-mode: both;
@ -27,7 +29,7 @@
} }
to { to {
width: 300px; width: $logo-width;
} }
} }
@ -71,7 +73,7 @@
} }
.animated-logo__logo { .animated-logo__logo {
width: 300px; width: $logo-width;
flex-shrink: 0; flex-shrink: 0;
} }
</style> </style>

View file

@ -1,42 +0,0 @@
<template>
<a
class="external-link link"
rel="noopener"
target="_blank"
:href="href"
>{{ label || href }}<ExternalIcon class="external-link__icon"/></a>
</template>
<style scoped lang="scss">
.external-link {
padding-right: 5px;
overflow-wrap: break-word;
}
.external-link__icon {
margin-left: 5px;
width: 15px;
position: relative;
top: 2px;
}
</style>
<script>
import ExternalIcon from "@/assets/icons/external.svg";
export default {
name: "ExternalLink",
components: { ExternalIcon },
props: {
href: {
type: String,
required: true
},
label: {
type: String,
default: null
}
}
};
</script>

View file

@ -1,117 +0,0 @@
<style scoped lang="scss">
@import "~@/assets/css/variables";
.button {
display: inline-flex;
justify-content: center;
align-items: center;
padding: 8px 15px;
border-radius: 4px;
height: 42px;
text-decoration: none;
color: $blue;
transition: 140ms ease background-color;
&:hover {
background: transparentize($blue, 0.9);
}
}
.button__text {
text-transform: uppercase;
font-weight: bold;
font-size: 1.2rem;
}
.button__prefix > * {
position: relative;
top: 2px;
margin-right: 6px;
width: 20px;
}
.button__suffix > * {
position: relative;
top: 2px;
margin-left: 6px;
width: 20px;
}
</style>
<script>
export default {
name: "GButton",
props: {
to: {
type: String,
default: ""
},
href: {
type: String,
default: ""
}
},
computed: {
isExternalLink: vm => Boolean(vm.href),
isInternalLink: vm => Boolean(vm.to)
},
methods: {
onClick(e) {
this.$emit("click", e);
}
},
render(h) {
const children = [
h("div", {
class: "button__prefix"
}, this.$slots.prefix),
h("div", {
class: "button__text"
}, this.$slots.default),
h("div", {
class: "button__suffix"
}, this.$slots.suffix)
];
const baseOptions = {
class: "button",
on: {
click: this.onClick
},
directives: [
{
name: "ripple",
value: "rgba(0, 0, 0, 0.2)"
}
]
};
if (this.isInternalLink) {
return h("nuxt-link", {
...baseOptions,
props: {
to: this.to
}
}, children);
} else if (this.isExternalLink) {
return h("a", {
...baseOptions,
attrs: {
href: this.href,
rel: "noopener"
}
}, children);
} else {
return h("div", {
...baseOptions,
attrs: {
role: "button"
}
}, children);
}
}
};
</script>

View file

@ -1,290 +0,0 @@
<template>
<nav class="navigation-bar" :class="{ 'show-background': showBackground, open, scrolled }">
<div class="navigation-bar__toggle" @click="open = !open">
<span></span>
<span></span>
<span></span>
</div>
<div class="navigation-bar__container-1 content">
<span class="navigation-bar__title">{{ title }}</span>
<div class="navigation-bar__container-2">
<div class="navigation-bar__links">
<template v-for="item in $options.navigationItems">
<nuxt-link
v-if="item.to"
:key="item.to"
:to="item.to"
@click.native.passive="open = false"
>
{{ item.label }}
</nuxt-link>
<a
v-else
:key="item.to"
rel="noopener"
:href="item.href"
@click.native.passive="open = false"
>
{{ item.label }}
</a>
</template>
</div>
</div>
</div>
</nav>
</template>
<style scoped lang="scss">
@import "~@/assets/css/mobile";
@import "~@/assets/css/variables";
.navigation-bar {
height: var(--navbar-height);
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 2;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 1.1rem;
text-transform: uppercase;
background-color: transparent;
&.show-background {
background-color: white;
}
&.scrolled {
.navigation-bar__title {
opacity: 1;
transform: translateY(0);
}
}
}
.navigation-bar__toggle {
display: none;
}
.navigation-bar__title {
font-size: 1.5rem;
font-weight: bold;
text-overflow: ellipsis;
overflow: hidden;
flex-shrink: 0;
max-width: calc(100% - 10px);
transition: 200ms ease;
transition-property: opacity, transform;
opacity: 0;
transform: translateY(10px);
@include notMobile {
font-size: 2rem;
}
}
.navigation-bar__container-1 {
max-width: 100%;
height: 100%;
overflow: hidden;
display: flex;
align-items: center;
justify-content: space-between;
}
.navigation-bar__container-2 {
width: 100%;
}
.navigation-bar__links {
float: right;
a {
display: inline-block;
margin-left: 40px;
position: relative;
text-decoration: none;
color: black;
&::after {
content: "";
position: absolute;
top: 30px;
left: 0;
background-color: black;
height: 2px;
width: 100%;
opacity: 0;
transition: 200ms linear opacity;
}
&:hover {
&::after {
opacity: 1;
}
}
}
}
@include mobile {
.navigation-bar__toggle {
display: block;
position: relative;
left: 30px;
z-index: 2;
& > span {
display: block;
background-color: black;
width: 30px;
height: 2px;
transition: 200ms linear;
transition-property: opacity, transform;
&:nth-child(2) {
margin-top: 8px;
}
&:nth-child(3) {
margin-top: 8px;
}
}
}
.navigation-bar__container-1 {
margin-left: 30px;
}
.navigation-bar__container-2 {
pointer-events: none;
background-color: white;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 100%;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
padding-top: var(--navbar-height);
opacity: 0;
transition: 200ms ease-out opacity;
}
.navigation-bar__links {
float: none;
& > a {
display: block;
width: fit-content;
margin: 0 auto 20px;
font-size: 1.5rem;
transform: translateX(-100%);
opacity: 0;
transition: 400ms ease-out;
transition-property: opacity, transform;
&:after {
top: 35px;
}
}
}
.navigation-bar.open {
.navigation-bar__toggle > span {
&:nth-child(1) {
transform: translateY(10px) rotate(45deg);
}
&:nth-child(2) {
opacity: 0;
}
&:nth-child(3) {
transform: translateY(-10px) rotate(-45deg);
}
}
.navigation-bar__container-2 {
pointer-events: auto;
opacity: 1;
}
.navigation-bar__links > a {
transform: translateX(0);
opacity: 1;
}
}
}
</style>
<script>
const NAVIGATION_ITEMS = [
{
label: "Home",
to: "/"
},
{
label: "Projects",
to: "/projects"
}
];
export default {
name: "NavigationBar",
navigationItems: NAVIGATION_ITEMS,
props: {
showBackground: {
type: Boolean,
default: false
},
title: {
type: String,
default: ""
}
},
data: () => ({
open: false,
scrollPosition: 0
}),
computed: {
scrolled: vm => vm.scrollPosition > 50
},
mounted() {
const scrollListener = () => {
this.scrollPosition = window.scrollY;
};
window.addEventListener("scroll", scrollListener, { passive: true });
this.$on("hook:beforeDestroy", () => {
window.removeEventListener("scroll", scrollListener);
});
scrollListener();
}
};
</script>

View file

@ -8,32 +8,30 @@
<slot/> <slot/>
</div> </div>
<hr class="project__divider"/> <hr class="project__divider"/>
<div class="project__buttons"> <div class="project__buttons flex-with-gutter">
<GButton v-if="link" class="project__button" :href="link"> <KButton v-if="link" :href="link">
Open Open
<template v-slot:suffix> <template v-slot:suffix>
<ArrowRightIcon/> <ArrowRightIcon/>
</template> </template>
</GButton> </KButton>
<GButton v-if="github" class="project__button" :href="`https://github.com/${github}`"> <KButton v-if="github" :href="`https://github.com/${github}`">
GitHub GitHub
<template v-slot:prefix> <template v-slot:prefix>
<GitHubIcon/> <GitHubIcon/>
</template> </template>
</GButton> </KButton>
<GButton v-if="npm" class="project__button" :href="`https://www.npmjs.com/package/${npm}`"> <KButton v-if="npm" :href="`https://www.npmjs.com/package/${npm}`">
NPM NPM
<template v-slot:prefix> <template v-slot:prefix>
<NPMIcon style="width: 30px; top: 4px"/> <NPMIcon style="width: 30px; top: 4px"/>
</template> </template>
</GButton> </KButton>
</div> </div>
</div> </div>
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">
@import "~@/assets/css/variables";
.project__type { .project__type {
margin-top: -1rem; margin-top: -1rem;
margin-bottom: 1rem; margin-bottom: 1rem;
@ -55,30 +53,21 @@
} }
.project__buttons { .project__buttons {
display: flex; & > *:not(:last-child) {
} margin-right: 5px;
.project__button {
&:not(:last-child) {
margin-right: $small-gutter;
} }
} }
.project__button-icon {
width: 10px;
display: inline;
}
</style> </style>
<script> <script>
import KButton from "kiste/components/KButton";
import ArrowRightIcon from "@/assets/icons/arrow_right.svg"; import ArrowRightIcon from "@/assets/icons/arrow_right.svg";
import GitHubIcon from "@/assets/icons/github.svg"; import GitHubIcon from "@/assets/icons/github.svg";
import NPMIcon from "@/assets/icons/npm.svg"; import NPMIcon from "@/assets/icons/npm.svg";
import GButton from "@/components/GButton";
export default { export default {
name: "GProject", name: "GProject",
components: { GButton, ArrowRightIcon, GitHubIcon, NPMIcon }, components: { KButton, ArrowRightIcon, GitHubIcon, NPMIcon },
props: { props: {
title: { title: {
type: String, type: String,

View file

@ -1,63 +1,22 @@
<template> <template>
<div class="default-layout fill-screen"> <div class="default-layout fill-screen">
<div class="content default-layout__content"> <KApp>
<nuxt/> <nuxt/>
</div> <KFooter/>
<footer class="content default-layout__footer"> </KApp>
<nuxt-link
v-for="link in $options.footer"
:key="link.to"
class="default-layout__footer-link"
:to="link.to"
>
{{ link.label }}
</nuxt-link>
</footer>
</div> </div>
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">
@import "~@/assets/css/variables";
@import "~@/assets/css/mobile";
.default-layout__content {
margin-top: var(--navbar-height);
margin-bottom: 50px;
}
.default-layout__footer {
margin-bottom: 40px;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
@include mobile {
flex-direction: column;
}
}
.default-layout__footer-link {
color: #606060;
text-decoration: none;
flex-shrink: 0;
margin: 10px;
transition: 100ms linear color;
&:hover {
color: $blue;
}
}
</style> </style>
<script> <script>
import { footer } from "@/assets/js/footer"; import KApp from "kiste/components/KApp";
import KFooter from "kiste/components/KFooter";
export default { export default {
name: "DefaultLayout", name: "DefaultLayout",
components: {}, components: { KApp, KFooter }
footer
}; };
</script> </script>

View file

@ -1,5 +1,7 @@
<template> <template>
<nuxt/> <KApp>
<nuxt/>
</KApp>
</template> </template>
<style> <style>
@ -7,7 +9,10 @@
</style> </style>
<script> <script>
import KApp from "kiste/components/KApp";
export default { export default {
name: "NoneLayout" name: "WithoutFooterLayout",
components: { KApp }
}; };
</script> </script>

View file

@ -17,7 +17,7 @@ export default {
** Global CSS ** Global CSS
*/ */
css: [ css: [
"@/assets/css/global.scss" "@/assets/global.scss"
], ],
/* /*
** Plugins to load before mounting the App ** Plugins to load before mounting the App
@ -30,7 +30,8 @@ export default {
*/ */
buildModules: [ buildModules: [
// Doc: https://github.com/nuxt-community/eslint-module // Doc: https://github.com/nuxt-community/eslint-module
"@nuxtjs/eslint-module" "@nuxtjs/eslint-module",
"kiste/nuxt"
], ],
/* /*
** Nuxt.js modules ** Nuxt.js modules
@ -40,6 +41,32 @@ export default {
"@nuxtjs/pwa" "@nuxtjs/pwa"
], ],
kiste: {
theme: {
contentPadding: "10px"
},
navigationItems: [
{
label: "Home",
to: "/"
},
{
label: "Projects",
to: "/projects"
}
],
footerItems: [
{
label: "Legal Notice",
to: "/legal-notice"
},
{
label: "Privacy Policy",
to: "/privacy-policy"
}
]
},
// https://pwa.nuxtjs.org/modules/workbox.html // https://pwa.nuxtjs.org/modules/workbox.html
workbox: { workbox: {
workboxExtensions: [ workboxExtensions: [

View file

@ -23,6 +23,7 @@
"eslint-plugin-nuxt": ">=0.4.2", "eslint-plugin-nuxt": ">=0.4.2",
"eslint-plugin-vue": "^6.0.1", "eslint-plugin-vue": "^6.0.1",
"fibers": "^4.0.2", "fibers": "^4.0.2",
"kiste": "^1.2.0",
"sass": "^1.23.7", "sass": "^1.23.7",
"sass-loader": "^8.0.0", "sass-loader": "^8.0.0",
"serve": "^11.2.0", "serve": "^11.2.0",

View file

@ -1,6 +1,6 @@
<template> <template>
<div class="index-page"> <div class="index-page">
<NavigationBar show-background/> <KNavigationBar/>
<AnimatedLogo/> <AnimatedLogo/>
<main class="index-page__content"> <main class="index-page__content">
<div class="index-page__name"> <div class="index-page__name">
@ -21,22 +21,12 @@
</a> </a>
</div> </div>
</main> </main>
<footer class="index-page__footer"> <KFooter class="index-page__footer"/>
<nuxt-link
v-for="link in $options.footer"
:key="link.to"
class="index-page__footer-link"
:to="link.to"
>
{{ link.label }}
</nuxt-link>
</footer>
</div> </div>
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">
@import "~@/assets/css/variables"; @use "~kiste/css/mixins/screenSize";
@import "~@/assets/css/mobile";
.index-page { .index-page {
display: flex; display: flex;
@ -44,7 +34,7 @@
align-items: center; align-items: center;
flex-direction: column; flex-direction: column;
height: 100vh; height: calc(100vh - var(--x-navbar-height));
} }
.index-page__name { .index-page__name {
@ -93,56 +83,36 @@
.index-page__footer { .index-page__footer {
position: absolute; position: absolute;
top: 100vh;
left: 0;
right: 0;
padding: 20px 0; padding: 20px 0;
display: flex; margin-bottom: 10px;
flex-direction: column;
justify-content: center;
align-items: center;
@include notMobile { @include screenSize.notMobile {
top: unset; top: unset;
bottom: 0; bottom: 0;
right: 0; right: 0;
width: fit-content; width: fit-content;
padding: 20px; padding: 20px;
margin: 0;
flex-direction: row; flex-direction: row;
} }
} }
.index-page__footer-link {
color: #606060;
text-decoration: none;
flex-shrink: 0;
margin: 0 10px;
transition: 100ms linear color;
&:hover {
color: $blue;
}
}
</style> </style>
<script> <script>
import KNavigationBar from "kiste/components/KNavigationBar";
import KFooter from "kiste/components/KFooter";
import AnimatedLogo from "../components/AnimatedLogo"; import AnimatedLogo from "../components/AnimatedLogo";
import GitHubIcon from "@/assets/icons/github.svg"; import GitHubIcon from "@/assets/icons/github.svg";
import TwitterIcon from "@/assets/icons/twitter.svg"; import TwitterIcon from "@/assets/icons/twitter.svg";
import InstagramIcon from "@/assets/icons/instagram.svg"; import InstagramIcon from "@/assets/icons/instagram.svg";
import EmailIcon from "@/assets/icons/email.svg"; import EmailIcon from "@/assets/icons/email.svg";
import NavigationBar from "@/components/NavigationBar";
import { footer } from "@/assets/js/footer";
export default { export default {
name: "IndexPage", name: "IndexPage",
layout: "none", layout: "none",
components: { NavigationBar, AnimatedLogo, GitHubIcon, TwitterIcon, InstagramIcon, EmailIcon }, components: { AnimatedLogo, GitHubIcon, TwitterIcon, InstagramIcon, EmailIcon, KNavigationBar, KFooter }
footer
}; };
</script> </script>

View file

@ -1,79 +1,77 @@
<template> <template>
<div class="legal-notice-page"> <div class="legal-notice-page">
<NavigationBar show-background title="Legal Notice"/> <KNavigationBar title="Legal Notice"/>
<h1 class="heading--1"> <div class="content">
Legal Notice <h1 class="heading--1">
</h1> Legal Notice
<h2 class="heading--3"> </h1>
Diensteanbieter <h2 class="heading--3">
</h2> Diensteanbieter
<p class="paragraph"> </h2>
Moritz Ruth<br> <p class="paragraph">
Zum Galgenberg 19<br> Moritz Ruth<br>
66539 Neunkirchen<br> Zum Galgenberg 19<br>
Deutschland 66539 Neunkirchen<br>
</p> Deutschland
<h2 class="heading--3"> </p>
Kontaktmöglichkeiten <h2 class="heading--3">
</h2> Kontaktmöglichkeiten
<p class="paragraph"> </h2>
<b>Telefon</b>: +49 176 46146329 <p class="paragraph">
</p> <b>Telefon</b>: +49 176 46146329
<p class="paragraph"> </p>
<b>E-Mail</b>: <a class="link" href="mailto:legal@moritz-ruth.de">legal@moritz-ruth.de</a> <p class="paragraph">
</p> <b>E-Mail</b>: <a class="link" href="mailto:legal@moritz-ruth.de">legal@moritz-ruth.de</a>
<h2 class="heading--3"> </p>
Haftungs- und Urheberrechtshinweise <h2 class="heading--3">
</h2> Haftungs- und Urheberrechtshinweise
<p class="paragraph"> </h2>
<b>Haftungsausschluss</b>: <p class="paragraph">
Die Inhalte dieses Onlineangebotes wurden sorgfältig und nach unserem aktuellen Kenntnisstand <b>Haftungsausschluss</b>:
erstellt, dienen jedoch nur der Information und entfalten keine rechtlich bindende Wirkung, sofern es sich nicht Die Inhalte dieses Onlineangebotes wurden sorgfältig und nach unserem aktuellen Kenntnisstand
um gesetzlich verpflichtende Informationen (z.B. das Impressum, die Datenschutzerklärung, AGB oder erstellt, dienen jedoch nur der Information und entfalten keine rechtlich bindende Wirkung, sofern es sich nicht
Widerrufsbelehrungen für Verbraucher) handelt. Wir behalten uns vor, die Inhalte vollständig oder teilweise zu um gesetzlich verpflichtende Informationen (z.B. das Impressum, die Datenschutzerklärung, AGB oder
ändern oder zu löschen, soweit vertragliche Verpflichtungen unberührt bleiben. Alle Angebote sind freibleibend und Widerrufsbelehrungen für Verbraucher) handelt. Wir behalten uns vor, die Inhalte vollständig oder teilweise zu
unverbindlich. ändern oder zu löschen, soweit vertragliche Verpflichtungen unberührt bleiben. Alle Angebote sind freibleibend und
</p> unverbindlich.
<p class="paragraph"> </p>
<b>Links auf fremde Webseiten</b>: <p class="paragraph">
Inhalte fremder Webseiten, auf die wir direkt oder indirekt verweisen, liegen <b>Links auf fremde Webseiten</b>:
außerhalb unseres Verantwortungsbereiches und machen wir uns nicht zu Eigen. Für alle Inhalte und insbesondere für Inhalte fremder Webseiten, auf die wir direkt oder indirekt verweisen, liegen
Schäden, die aus der Nutzung der in den verlinkten Webseiten aufrufbaren Informationen entstehen, haftet allein außerhalb unseres Verantwortungsbereiches und machen wir uns nicht zu Eigen. Für alle Inhalte und insbesondere für
der Anbieter der verlinkten Webseiten. Schäden, die aus der Nutzung der in den verlinkten Webseiten aufrufbaren Informationen entstehen, haftet allein
</p> der Anbieter der verlinkten Webseiten.
<p class="paragraph"> </p>
<b>Urheberrechte und Markenrechte</b>: <p class="paragraph">
Alle auf dieser Website dargestellten Inhalte, wie Texte, Fotografien, Grafiken, <b>Urheberrechte und Markenrechte</b>:
Marken und Warenzeichen sind durch die jeweiligen Schutzrechte (Urheberrechte, Markenrechte) geschützt. Die Alle auf dieser Website dargestellten Inhalte, wie Texte, Fotografien, Grafiken,
Verwendung, Vervielfältigung usw. unterliegen unseren Rechten oder den Rechten der jeweiligen Urheber bzw. Marken und Warenzeichen sind durch die jeweiligen Schutzrechte (Urheberrechte, Markenrechte) geschützt. Die
Rechteverwalter. Verwendung, Vervielfältigung usw. unterliegen unseren Rechten oder den Rechten der jeweiligen Urheber bzw.
</p> Rechteverwalter.
<p class="paragraph"> </p>
<b>Hinweise auf Rechtsverstöße</b>: <p class="paragraph">
Sollten Sie innerhalb unseres Internetauftritts Rechtsverstöße bemerken, bitten wir <b>Hinweise auf Rechtsverstöße</b>:
Sie uns auf diese hinzuweisen. Wir werden rechtswidrige Inhalte und Links nach Kenntnisnahme unverzüglich Sollten Sie innerhalb unseres Internetauftritts Rechtsverstöße bemerken, bitten wir
entfernen. Sie uns auf diese hinzuweisen. Wir werden rechtswidrige Inhalte und Links nach Kenntnisnahme unverzüglich
</p> entfernen.
<a </p>
class="link" <a
href="https://datenschutz-generator.de/?l=de" class="link"
rel="noopener" href="https://datenschutz-generator.de/?l=de"
title="Rechtstext von Dr. Schwenke - für weitere Informationen bitte anklicken." rel="noopener"
target="_blank" title="Rechtstext von Dr. Schwenke - für weitere Informationen bitte anklicken."
>Erstellt mit kostenlosem Datenschutz-Generator.de von Dr. Thomas Schwenke</a> target="_blank"
>Erstellt mit kostenlosem Datenschutz-Generator.de von Dr. Thomas Schwenke</a>
</div>
</div> </div>
</template> </template>
<style scoped lang="scss">
</style>
<script> <script>
import NavigationBar from "@/components/NavigationBar"; import KNavigationBar from "kiste/components/KNavigationBar";
export default { export default {
name: "LegalNoticePage", name: "LegalNoticePage",
components: { NavigationBar }, components: { KNavigationBar },
head: { head: {
htmlAttrs: { htmlAttrs: {
lang: "de" lang: "de"

View file

@ -1,273 +1,279 @@
<template> <template>
<div class="privacy-policy-page"> <div class="privacy-policy-page">
<NavigationBar show-background title="Datenschutzerklärung"/> <KNavigationBar title="Datenschutzerklärung"/>
<h1 class="heading--1"> <div class="content">
Datenschutzerklärung <h1 class="heading--1">
</h1> Datenschutzerklärung
<p class="paragraph"> </h1>
Verantwortlicher im Sinne der Datenschutzgesetze, insbesondere der EU-Datenschutzgrundverordnung (DSGVO), ist: <p class="paragraph">
</p> Verantwortlicher im Sinne der Datenschutzgesetze, insbesondere der EU-Datenschutzgrundverordnung (DSGVO), ist:
<p class="paragraph"> </p>
Moritz Ruth<br> <p class="paragraph">
Zum Galgenberg 19<br> Moritz Ruth<br>
66539 Neunkirchen<br> Zum Galgenberg 19<br>
Deutschland 66539 Neunkirchen<br>
</p> Deutschland
<h2 class="heading--2"> </p>
Ihre Betroffenenrechte <h2 class="heading--2">
</h2> Ihre Betroffenenrechte
<p class="paragraph"> </h2>
Unter den angegebenen Kontaktdaten unseres Datenschutzbeauftragten können Sie jederzeit folgende Rechte ausüben: <p class="paragraph">
</p> Unter den angegebenen Kontaktdaten unseres Datenschutzbeauftragten können Sie jederzeit folgende Rechte ausüben:
<ul class="paragraph"> </p>
<li>Auskunft über Ihre bei uns gespeicherten Daten und deren Verarbeitung (Art. 15 DSGVO),</li> <ul class="paragraph">
<li>Berichtigung unrichtiger personenbezogener Daten (Art. 16 DSGVO),</li> <li>Auskunft über Ihre bei uns gespeicherten Daten und deren Verarbeitung (Art. 15 DSGVO),</li>
<li>Löschung Ihrer bei uns gespeicherten Daten (Art. 17 DSGVO),</li> <li>Berichtigung unrichtiger personenbezogener Daten (Art. 16 DSGVO),</li>
<li> <li>Löschung Ihrer bei uns gespeicherten Daten (Art. 17 DSGVO),</li>
Einschränkung der Datenverarbeitung, sofern wir Ihre Daten aufgrund gesetzlicher Pflichten noch nicht löschen <li>
dürfen (Art. 18 DSGVO), Einschränkung der Datenverarbeitung, sofern wir Ihre Daten aufgrund gesetzlicher Pflichten noch nicht löschen
</li> dürfen (Art. 18 DSGVO),
<li>Widerspruch gegen die Verarbeitung Ihrer Daten bei uns (Art. 21 DSGVO) und</li> </li>
<li> <li>Widerspruch gegen die Verarbeitung Ihrer Daten bei uns (Art. 21 DSGVO) und</li>
Datenübertragbarkeit, sofern Sie in die Datenverarbeitung eingewilligt haben oder einen Vertrag mit uns <li>
abgeschlossen haben (Art. 20 DSGVO). Datenübertragbarkeit, sofern Sie in die Datenverarbeitung eingewilligt haben oder einen Vertrag mit uns
</li> abgeschlossen haben (Art. 20 DSGVO).
</ul> </li>
<p class="paragraph"> </ul>
Sofern Sie uns eine Einwilligung erteilt haben, können Sie diese jederzeit mit Wirkung für die Zukunft widerrufen. <p class="paragraph">
</p> Sofern Sie uns eine Einwilligung erteilt haben, können Sie diese jederzeit mit Wirkung für die Zukunft
<p class="paragraph"> widerrufen.
Sie können sich jederzeit mit einer Beschwerde an eine Aufsichtsbehörde wenden, z. B. an die zuständige </p>
Aufsichtsbehörde des Bundeslands Ihres Wohnsitzes oder an die für uns als verantwortliche Stelle zuständige <p class="paragraph">
Behörde. Sie können sich jederzeit mit einer Beschwerde an eine Aufsichtsbehörde wenden, z. B. an die zuständige
</p> Aufsichtsbehörde des Bundeslands Ihres Wohnsitzes oder an die für uns als verantwortliche Stelle zuständige
<p class="paragraph"> Behörde.
Eine Liste der Aufsichtsbehörden (für den nichtöffentlichen Bereich) mit Anschrift finden Sie unter: </p>
<ExternalLink href="https://www.bfdi.bund.de/DE/Infothek/Anschriften_Links/anschriften_links-node.html"/>. <p class="paragraph">
</p> Eine Liste der Aufsichtsbehörden (für den nichtöffentlichen Bereich) mit Anschrift finden Sie unter:
<h2 class="heading--2"> <KExternalLink href="https://www.bfdi.bund.de/DE/Infothek/Anschriften_Links/anschriften_links-node.html"/>.
Erfassung allgemeiner Informationen beim Besuch unserer Website </p>
</h2> <h2 class="heading--2">
<h3 class="heading--3"> Erfassung allgemeiner Informationen beim Besuch unserer Website
Art und Zweck der Verarbeitung </h2>
</h3> <h3 class="heading--3">
<p class="paragraph"> Art und Zweck der Verarbeitung
Wenn Sie auf unsere Website zugreifen, d.h., wenn Sie sich nicht registrieren oder anderweitig Informationen </h3>
übermitteln, werden automatisch Informationen allgemeiner Natur erfasst. Diese Informationen (Server-Logfiles) <p class="paragraph">
beinhalten etwa die Art des Webbrowsers, das verwendete Betriebssystem, den Domainnamen Ihres Wenn Sie auf unsere Website zugreifen, d.h., wenn Sie sich nicht registrieren oder anderweitig Informationen
Internet-Service-Providers, Ihre IP-Adresse und ähnliches. übermitteln, werden automatisch Informationen allgemeiner Natur erfasst. Diese Informationen (Server-Logfiles)
</p> beinhalten etwa die Art des Webbrowsers, das verwendete Betriebssystem, den Domainnamen Ihres
<p class="paragraph"> Internet-Service-Providers, Ihre IP-Adresse und ähnliches.
Sie werden insbesondere zu folgenden Zwecken verarbeitet </p>
</p> <p class="paragraph">
<ul class="paragraph"> Sie werden insbesondere zu folgenden Zwecken verarbeitet
<li>Sicherstellung eines problemlosen Verbindungsaufbaus der Website,</li> </p>
<li>Sicherstellung einer reibungslosen Nutzung unserer Website,</li> <ul class="paragraph">
<li>Auswertung der Systemsicherheit und -stabilität sowie</li> <li>Sicherstellung eines problemlosen Verbindungsaufbaus der Website,</li>
<li>zu weiteren administrativen Zwecken.</li> <li>Sicherstellung einer reibungslosen Nutzung unserer Website,</li>
</ul> <li>Auswertung der Systemsicherheit und -stabilität sowie</li>
<p class="paragraph"> <li>zu weiteren administrativen Zwecken.</li>
Wir verwenden Ihre Daten nicht, um Rückschlüsse auf Ihre Person zu ziehen. Informationen dieser Art werden von uns </ul>
ggfs. statistisch ausgewertet, um unseren Internetauftritt und die dahinterstehende Technik zu optimieren. <p class="paragraph">
</p> Wir verwenden Ihre Daten nicht, um Rückschlüsse auf Ihre Person zu ziehen. Informationen dieser Art werden von
<h3 class="heading--3"> uns ggfs. statistisch ausgewertet, um unseren Internetauftritt und die dahinterstehende Technik zu
Rechtsgrundlage optimieren.
</h3> </p>
<p class="paragraph"> <h3 class="heading--3">
Die Verarbeitung erfolgt gemäß Art. 6 Abs. 1 lit. f DSGVO auf Basis unseres berechtigten Interesses an der Rechtsgrundlage
Verbesserung der Stabilität und Funktionalität unserer Website. </h3>
</p> <p class="paragraph">
<h3 class="heading--3"> Die Verarbeitung erfolgt gemäß Art. 6 Abs. 1 lit. f DSGVO auf Basis unseres berechtigten Interesses an der
Empfänger Verbesserung der Stabilität und Funktionalität unserer Website.
</h3> </p>
<p class="paragraph"> <h3 class="heading--3">
Empfänger der Daten sind ggf. technische Dienstleister, die für den Betrieb und die Wartung unserer Webseite als Empfänger
Auftragsverarbeiter tätig werden. </h3>
</p> <p class="paragraph">
<h3 class="heading--3"> Empfänger der Daten sind ggf. technische Dienstleister, die für den Betrieb und die Wartung unserer Webseite als
Speicherdauer Auftragsverarbeiter tätig werden.
</h3> </p>
<p class="paragraph"> <h3 class="heading--3">
Die Daten werden gelöscht, sobald diese für den Zweck der Erhebung nicht mehr erforderlich sind. Dies ist für die Speicherdauer
Daten, die der Bereitstellung der Webseite dienen, grundsätzlich der Fall, wenn die jeweilige Sitzung beendet ist. </h3>
</p> <p class="paragraph">
<h3 class="heading--3"> Die Daten werden gelöscht, sobald diese für den Zweck der Erhebung nicht mehr erforderlich sind. Dies ist für
Bereitstellung vorgeschrieben oder erforderlich die Daten, die der Bereitstellung der Webseite dienen, grundsätzlich der Fall, wenn die jeweilige Sitzung
</h3> beendet ist.
<p class="paragraph"> </p>
Die Bereitstellung der vorgenannten personenbezogenen Daten ist weder gesetzlich noch vertraglich vorgeschrieben. <h3 class="heading--3">
Ohne die IP-Adresse ist jedoch der Dienst und die Funktionsfähigkeit unserer Website nicht gewährleistet. Zudem Bereitstellung vorgeschrieben oder erforderlich
können einzelne Dienste und Services nicht verfügbar oder eingeschränkt sein. Aus diesem Grund ist ein Widerspruch </h3>
ausgeschlossen. <p class="paragraph">
</p> Die Bereitstellung der vorgenannten personenbezogenen Daten ist weder gesetzlich noch vertraglich
<h2 class="heading--2"> vorgeschrieben. Ohne die IP-Adresse ist jedoch der Dienst und die Funktionsfähigkeit unserer Website nicht
Verwendung von Scriptbibliotheken (Google Webfonts) gewährleistet. Zudem können einzelne Dienste und Services nicht verfügbar oder eingeschränkt sein. Aus diesem
</h2> Grund ist ein Widerspruch ausgeschlossen.
<h3 class="heading--3"> </p>
Art und Zweck der Verarbeitung <h2 class="heading--2">
</h3> Verwendung von Scriptbibliotheken (Google Webfonts)
<p class="paragraph"> </h2>
Um unsere Inhalte browserübergreifend korrekt und grafisch ansprechend darzustellen, verwenden wir auf dieser <h3 class="heading--3">
Website Google Web Fonts der Google LLC (1600 Amphitheatre Parkway, Mountain View, CA 94043, USA; nachfolgend Art und Zweck der Verarbeitung
Google) zur Darstellung von Schriften. </h3>
</p> <p class="paragraph">
<p class="paragraph"> Um unsere Inhalte browserübergreifend korrekt und grafisch ansprechend darzustellen, verwenden wir auf dieser
Die Datenschutzrichtlinie des Bibliothekbetreibers Google finden Sie hier: Website Google Web Fonts der Google LLC (1600 Amphitheatre Parkway, Mountain View, CA 94043, USA; nachfolgend
<ExternalLink href="https://www.google.com/policies/privacy/"/> Google) zur Darstellung von Schriften.
</p> </p>
<h3 class="heading--3"> <p class="paragraph">
Rechtsgrundlage Die Datenschutzrichtlinie des Bibliothekbetreibers Google finden Sie hier:
</h3> <KExternalLink href="https://www.google.com/policies/privacy/"/>
<p class="paragraph"> </p>
Rechtsgrundlage für die Einbindung von Google Webfonts und dem damit verbundenen Datentransfer zu Google ist Ihre <h3 class="heading--3">
Einwilligung (Art. 6 Abs. 1 lit. a DSGVO). Rechtsgrundlage
</p> </h3>
<h3 class="heading--3"> <p class="paragraph">
Empfänger Rechtsgrundlage für die Einbindung von Google Webfonts und dem damit verbundenen Datentransfer zu Google ist
</h3> Ihre Einwilligung (Art. 6 Abs. 1 lit. a DSGVO).
<p class="paragraph"> </p>
Der Aufruf von Scriptbibliotheken oder Schriftbibliotheken löst automatisch eine Verbindung zum Betreiber der <h3 class="heading--3">
Bibliothek aus. Dabei ist es theoretisch möglich aktuell allerdings auch unklar ob und ggf. zu welchen Zwecken Empfänger
dass der Betreiber in diesem Fall Google Daten erhebt. </h3>
</p> <p class="paragraph">
<h3 class="heading--3"> Der Aufruf von Scriptbibliotheken oder Schriftbibliotheken löst automatisch eine Verbindung zum Betreiber der
Speicherdauer Bibliothek aus. Dabei ist es theoretisch möglich aktuell allerdings auch unklar ob und ggf. zu welchen Zwecken
</h3> dass der Betreiber in diesem Fall Google Daten erhebt.
<p class="paragraph"> </p>
Wir erheben keine personenbezogenen Daten, durch die Einbindung von Google Webfonts. <h3 class="heading--3">
</p> Speicherdauer
<p class="paragraph"> </h3>
Weitere Informationen zu Google Web Fonts finden Sie unter <p class="paragraph">
<ExternalLink href="https://developers.google.com/fonts/faq"/> und in der Datenschutzerklärung von Google: Wir erheben keine personenbezogenen Daten, durch die Einbindung von Google Webfonts.
<ExternalLink href="https://www.google.com/policies/privacy/"/>. </p>
</p> <p class="paragraph">
<h3 class="heading--3"> Weitere Informationen zu Google Web Fonts finden Sie unter
Drittlandtransfer <KExternalLink href="https://developers.google.com/fonts/faq"/> und in der Datenschutzerklärung von Google:
</h3> <KExternalLink href="https://www.google.com/policies/privacy/"/>.
<p class="paragraph"> </p>
Google verarbeitet Ihre Daten in den USA und hat sich dem EU_US Privacy Shield unterworfen <h3 class="heading--3">
<ExternalLink href="https://www.privacyshield.gov/EU-US-Framework"/>. Drittlandtransfer
</p> </h3>
<h3 class="heading--3"> <p class="paragraph">
Bereitstellung vorgeschrieben oder erforderlich Google verarbeitet Ihre Daten in den USA und hat sich dem EU_US Privacy Shield unterworfen
</h3> <KExternalLink href="https://www.privacyshield.gov/EU-US-Framework"/>.
<p class="paragraph"> </p>
Die Bereitstellung der personenbezogenen Daten ist weder gesetzlich, noch vertraglich vorgeschrieben. Allerdings <h3 class="heading--3">
kann ggfs. die korrekte Darstellung der Inhalte durch Standardschriften nicht möglich sein. Bereitstellung vorgeschrieben oder erforderlich
</p> </h3>
<h3 class="heading--3"> <p class="paragraph">
Widerruf der Einwilligung Die Bereitstellung der personenbezogenen Daten ist weder gesetzlich, noch vertraglich vorgeschrieben. Allerdings
</h3> kann ggfs. die korrekte Darstellung der Inhalte durch Standardschriften nicht möglich sein.
<p class="paragraph"> </p>
Zur Darstellung der Inhalte wird regelmäßig die Programmiersprache JavaScript verwendet. Sie können der <h3 class="heading--3">
Datenverarbeitung daher widersprechen, indem Sie die Ausführung von JavaScript in Ihrem Browser deaktivieren oder Widerruf der Einwilligung
einen JavaScript-Blocker installieren. Bitte beachten Sie, dass es hierdurch zu Funktionseinschränkungen auf der </h3>
Website kommen kann. <p class="paragraph">
</p> Zur Darstellung der Inhalte wird regelmäßig die Programmiersprache JavaScript verwendet. Sie können der
<h2 class="heading--2"> Datenverarbeitung daher widersprechen, indem Sie die Ausführung von JavaScript in Ihrem Browser deaktivieren
Eingebettete YouTube-Videos oder einen JavaScript-Blocker installieren. Bitte beachten Sie, dass es hierdurch zu Funktionseinschränkungen
</h2> auf der Website kommen kann.
<h3 class="heading--3"> </p>
Art und Zweck der Verarbeitung <h2 class="heading--2">
</h3> Eingebettete YouTube-Videos
<p class="paragraph"> </h2>
Auf einigen unserer Webseiten betten wir YouTube-Videos ein. Betreiber der entsprechenden Plugins ist die YouTube, <h3 class="heading--3">
LLC, 901 Cherry Ave., San Bruno, CA 94066, USA (nachfolgend YouTube). Wenn Sie eine Seite mit dem YouTube-Plugin Art und Zweck der Verarbeitung
besuchen, wird eine Verbindung zu Servern von YouTube hergestellt. Dabei wird YouTube mitgeteilt, welche Seiten </h3>
Sie besuchen. Wenn Sie in Ihrem YouTube-Account eingeloggt sind, kann YouTube Ihr Surfverhalten Ihnen persönlich <p class="paragraph">
zuzuordnen. Dies verhindern Sie, indem Sie sich vorher aus Ihrem YouTube-Account ausloggen. Auf einigen unserer Webseiten betten wir YouTube-Videos ein. Betreiber der entsprechenden Plugins ist die
</p> YouTube, LLC, 901 Cherry Ave., San Bruno, CA 94066, USA (nachfolgend YouTube). Wenn Sie eine Seite mit dem
<p class="paragraph"> YouTube-Plugin besuchen, wird eine Verbindung zu Servern von YouTube hergestellt. Dabei wird YouTube mitgeteilt,
Wird ein YouTube-Video gestartet, setzt der Anbieter Cookies ein, die Hinweise über das Nutzerverhalten sammeln. welche Seiten Sie besuchen. Wenn Sie in Ihrem YouTube-Account eingeloggt sind, kann YouTube Ihr Surfverhalten
</p> Ihnen persönlich zuzuordnen. Dies verhindern Sie, indem Sie sich vorher aus Ihrem YouTube-Account ausloggen.
<p class="paragraph"> </p>
Weitere Informationen zu Zweck und Umfang der Datenerhebung und ihrer Verarbeitung durch YouTube erhalten Sie in <p class="paragraph">
den Datenschutzerklärungen des Anbieters, Dort erhalten Sie auch weitere Informationen zu Ihren diesbezüglichen Wird ein YouTube-Video gestartet, setzt der Anbieter Cookies ein, die Hinweise über das Nutzerverhalten sammeln.
Rechten und Einstellungsmöglichkeiten zum Schutze Ihrer Privatsphäre </p>
(<ExternalLink href="https://policies.google.com/privacy"/>). Google verarbeitet Ihre Daten in den USA und hat <p class="paragraph">
sich dem EU-US Privacy Shield unterworfen <ExternalLink href="https://www.privacyshield.gov/EU-US-Framework"/>. Weitere Informationen zu Zweck und Umfang der Datenerhebung und ihrer Verarbeitung durch YouTube erhalten Sie in
</p> den Datenschutzerklärungen des Anbieters, Dort erhalten Sie auch weitere Informationen zu Ihren diesbezüglichen
<h3 class="heading--3"> Rechten und Einstellungsmöglichkeiten zum Schutze Ihrer Privatsphäre
Rechtsgrundlage (<KExternalLink href="https://policies.google.com/privacy"/>). Google verarbeitet Ihre Daten in den USA und hat
</h3> sich dem EU-US Privacy Shield unterworfen <KExternalLink href="https://www.privacyshield.gov/EU-US-Framework"/>.
<p class="paragraph"> </p>
Rechtsgrundlage für die Einbindung von YouTube und dem damit verbundenen Datentransfer zu Google ist Ihre <h3 class="heading--3">
Einwilligung (Art. 6 Abs. 1 lit. a DSGVO). Rechtsgrundlage
</p> </h3>
<h3 class="heading--3"> <p class="paragraph">
Empfänger Rechtsgrundlage für die Einbindung von YouTube und dem damit verbundenen Datentransfer zu Google ist Ihre
</h3> Einwilligung (Art. 6 Abs. 1 lit. a DSGVO).
<p class="paragraph"> </p>
Der Aufruf von YouTube löst automatisch eine Verbindung zu Google aus. <h3 class="heading--3">
</p> Empfänger
<h3 class="heading--3"> </h3>
Speicherdauer und Widerruf der Einwilligung: <p class="paragraph">
</h3> Der Aufruf von YouTube löst automatisch eine Verbindung zu Google aus.
<p class="paragraph"> </p>
Wer das Speichern von Cookies für das Google-Ad-Programm deaktiviert hat, wird auch beim Anschauen von <h3 class="heading--3">
YouTube-Videos mit keinen solchen Cookies rechnen müssen. YouTube legt aber auch in anderen Cookies Speicherdauer und Widerruf der Einwilligung:
nicht-personenbezogene Nutzungsinformationen ab. Möchten Sie dies verhindern, so müssen Sie das Speichern von </h3>
Cookies im Browser blockieren. <p class="paragraph">
</p> Wer das Speichern von Cookies für das Google-Ad-Programm deaktiviert hat, wird auch beim Anschauen von
<p class="paragraph"> YouTube-Videos mit keinen solchen Cookies rechnen müssen. YouTube legt aber auch in anderen Cookies
Weitere Informationen zum Datenschutz bei YouTube finden Sie in der Datenschutzerklärung des Anbieters unter: nicht-personenbezogene Nutzungsinformationen ab. Möchten Sie dies verhindern, so müssen Sie das Speichern von
<ExternalLink href="https://www.google.de/intl/de/policies/privacy/"/> Cookies im Browser blockieren.
</p> </p>
<h3 class="heading--3"> <p class="paragraph">
Drittlandtransfer Weitere Informationen zum Datenschutz bei YouTube finden Sie in der Datenschutzerklärung des Anbieters unter:
</h3> <KExternalLink href="https://www.google.de/intl/de/policies/privacy/"/>
<p class="paragraph"> </p>
Google verarbeitet Ihre Daten in den USA und hat sich dem EU_US Privacy Shield unterworfen <h3 class="heading--3">
<ExternalLink href="https://www.privacyshield.gov/EU-US-Framework"/>. Drittlandtransfer
</p> </h3>
<h3 class="heading--3"> <p class="paragraph">
Bereitstellung vorgeschrieben oder erforderlich Google verarbeitet Ihre Daten in den USA und hat sich dem EU_US Privacy Shield unterworfen
</h3> <KExternalLink href="https://www.privacyshield.gov/EU-US-Framework"/>.
<p class="paragraph"> </p>
Die Bereitstellung Ihrer personenbezogenen Daten erfolgt freiwillig, allein auf Basis Ihrer Einwilligung. Sofern <h3 class="heading--3">
Sie den Zugriff unterbinden, kann es hierdurch zu Funktionseinschränkungen auf der Website kommen. Bereitstellung vorgeschrieben oder erforderlich
</p> </h3>
<h2 class="heading--2"> <p class="paragraph">
SSL-Verschlüsselung Die Bereitstellung Ihrer personenbezogenen Daten erfolgt freiwillig, allein auf Basis Ihrer Einwilligung. Sofern
</h2> Sie den Zugriff unterbinden, kann es hierdurch zu Funktionseinschränkungen auf der Website kommen.
<p class="paragraph"> </p>
Um die Sicherheit Ihrer Daten bei der Übertragung zu schützen, verwenden wir dem aktuellen Stand der Technik <h2 class="heading--2">
entsprechende Verschlüsselungsverfahren (z. B. SSL) über HTTPS. SSL-Verschlüsselung
</p> </h2>
<h2 class="heading--2"> <p class="paragraph">
Änderung unserer Datenschutzbestimmungen Um die Sicherheit Ihrer Daten bei der Übertragung zu schützen, verwenden wir dem aktuellen Stand der Technik
</h2> entsprechende Verschlüsselungsverfahren (z. B. SSL) über HTTPS.
<p class="paragraph"> </p>
Wir behalten uns vor, diese Datenschutzerklärung anzupassen, damit sie stets den aktuellen rechtlichen <h2 class="heading--2">
Anforderungen entspricht oder um Änderungen unserer Leistungen in der Datenschutzerklärung umzusetzen, z.B. bei Änderung unserer Datenschutzbestimmungen
der Einführung neuer Services. Für Ihren erneuten Besuch gilt dann die neue Datenschutzerklärung. </h2>
</p> <p class="paragraph">
<h2 class="heading--2"> Wir behalten uns vor, diese Datenschutzerklärung anzupassen, damit sie stets den aktuellen rechtlichen
Fragen an den Datenschutzbeauftragten Anforderungen entspricht oder um Änderungen unserer Leistungen in der Datenschutzerklärung umzusetzen, z.B. bei
</h2> der Einführung neuer Services. Für Ihren erneuten Besuch gilt dann die neue Datenschutzerklärung.
<p class="paragraph"> </p>
Wenn Sie Fragen zum Datenschutz haben, schreiben Sie uns bitte eine E-Mail oder wenden Sie sich direkt an die für <h2 class="heading--2">
den Datenschutz verantwortliche Person: Fragen an den Datenschutzbeauftragten
</p> </h2>
<p class="paragraph"> <p class="paragraph">
Moritz Ruth<br> Wenn Sie Fragen zum Datenschutz haben, schreiben Sie uns bitte eine E-Mail oder wenden Sie sich direkt an die
Zum Galgenberg 19<br> für den Datenschutz verantwortliche Person:
66539 Neunkirchen<br> </p>
Deutschland <p class="paragraph">
</p> Moritz Ruth<br>
<p class="paragraph"> Zum Galgenberg 19<br>
<b>Telefon</b>: +49 176 46146329 66539 Neunkirchen<br>
</p> Deutschland
<p class="paragraph"> </p>
<b>E-Mail</b>: <a class="link" href="mailto:legal@moritz-ruth.de">legal@moritz-ruth.de</a> <p class="paragraph">
</p> <b>Telefon</b>: +49 176 46146329
<p class="paragraph"> </p>
Die Datenschutzerklärung wurde mithilfe der activeMind AG erstellt, den Experten für <p class="paragraph">
<ExternalLink <b>E-Mail</b>: <a class="link" href="mailto:legal@moritz-ruth.de">legal@moritz-ruth.de</a>
href="https://www.activemind.de/datenschutz/datenschutzhinweis-generator/" </p>
label="externe Datenschutzbeauftragte" <p class="paragraph">
/> (Version #2019-04-10). Die Datenschutzerklärung wurde mithilfe der activeMind AG erstellt, den Experten für
</p> <KExternalLink
href="https://www.activemind.de/datenschutz/datenschutzhinweis-generator/"
>
externe Datenschutzbeauftragte
</KExternalLink> (Version #2019-04-10).
</p>
</div>
</div> </div>
</template> </template>
@ -276,12 +282,12 @@
</style> </style>
<script> <script>
import NavigationBar from "@/components/NavigationBar"; import KNavigationBar from "kiste/components/KNavigationBar";
import ExternalLink from "@/components/ExternalLink"; import KExternalLink from "kiste/components/KExternalLink";
export default { export default {
name: "PrivacyPolicyPage", name: "PrivacyPolicyPage",
components: { ExternalLink, NavigationBar }, components: { KNavigationBar, KExternalLink },
head: { head: {
htmlAttrs: { htmlAttrs: {
lang: "de" lang: "de"

View file

@ -1,35 +1,37 @@
<template> <template>
<div class="projects-page"> <div class="projects-page">
<NavigationBar show-background title="Projects"/> <KNavigationBar title="Projects"/>
<h1 class="heading--1"> <div class="content">
Projects <h1 class="heading--1">
</h1> Projects
<GProject </h1>
type="App" <GProject
title="RelaxYourEyes" type="App"
link="https://relaxyoureyes.moritz-ruth.de" title="RelaxYourEyes"
github="moritzruth/relaxyoureyes" link="https://relaxyoureyes.moritz-ruth.de"
> github="moritzruth/relaxyoureyes"
A timer which reminds you to relax your eyes every 20 minutes. >
</GProject> A timer which reminds you to relax your eyes every 20 minutes.
<GProject </GProject>
type="Website" <GProject
title="cryptic-game.net" type="Website"
link="https://test.cryptic-game.net" title="cryptic-game.net"
github="cryptic-game/website/tree/vueWebsite" link="https://test.cryptic-game.net"
> github="cryptic-game/website/tree/vueWebsite"
I am responsible for the new (not yet released) website of the >
<a class="link" href="https://github.com/cryptic-game">Cryptic game</a>. I am responsible for the new (not yet released) website of the
(Just the website, not the game itself) <a class="link" href="https://github.com/cryptic-game">Cryptic game</a>.
</GProject> (Just the website, not the game itself)
<GProject </GProject>
type="Node.js Library" <GProject
title="log-groups" type="Node.js Library"
github="moritzruth/log-groups" title="log-groups"
npm="log-groups" github="moritzruth/log-groups"
> npm="log-groups"
A pretty console logging library for printing grouped messages with Node.js. >
</GProject> A pretty console logging library for printing grouped messages with Node.js.
</GProject>
</div>
</div> </div>
</template> </template>
@ -38,11 +40,11 @@
</style> </style>
<script> <script>
import NavigationBar from "@/components/NavigationBar"; import KNavigationBar from "kiste/components/KNavigationBar";
import GProject from "@/components/pages/projects/GProject"; import GProject from "@/components/pages/projects/GProject";
export default { export default {
name: "ProjectsPage", name: "ProjectsPage",
components: { GProject, NavigationBar } components: { GProject, KNavigationBar }
}; };
</script> </script>

View file

@ -2043,6 +2043,13 @@ chownr@^1.1.1, chownr@^1.1.2:
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142"
integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==
chroma-js@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/chroma-js/-/chroma-js-2.1.0.tgz#c0be48a21fe797ef8965608c1c4f911ef2da49d5"
integrity sha512-uiRdh4ZZy+UTPSrAdp8hqEdVb1EllLtTHOt5TMaOjJUvi+O54/83Fc5K2ld1P+TJX+dw5B+8/sCgzI6eaur/lg==
dependencies:
cross-env "^6.0.3"
chrome-trace-event@^1.0.2: chrome-trace-event@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
@ -2434,6 +2441,13 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
safe-buffer "^5.0.1" safe-buffer "^5.0.1"
sha.js "^2.4.8" sha.js "^2.4.8"
cross-env@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-6.0.3.tgz#4256b71e49b3a40637a0ce70768a6ef5c72ae941"
integrity sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==
dependencies:
cross-spawn "^7.0.0"
cross-spawn@^5.0.1: cross-spawn@^5.0.1:
version "5.1.0" version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
@ -4640,6 +4654,17 @@ kind-of@^6.0.0, kind-of@^6.0.2:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
kiste@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/kiste/-/kiste-1.2.0.tgz#d3c78fa9e3135d97e7a5fb760c8b491f08653efe"
integrity sha512-/K5hIpQaa9bOI6Z3oYxkBz1hJyjRn7Pv2j5BTE7gDYPnurCmskmceBPZTb/BvicnEWnwh0c07JPydAK+vJv+UQ==
dependencies:
chroma-js "^2.1.0"
lodash.defaultsdeep "^4.6.1"
lodash.kebabcase "^4.1.1"
lodash.mapvalues "^4.6.0"
vue-ripple-directive "^2.0.1"
last-call-webpack-plugin@^3.0.0: last-call-webpack-plugin@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555"
@ -4761,7 +4786,7 @@ lodash.camelcase@^4.1.1:
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
lodash.defaultsdeep@^4.6.0: lodash.defaultsdeep@^4.6.0, lodash.defaultsdeep@^4.6.1:
version "4.6.1" version "4.6.1"
resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6"
integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA== integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==
@ -4776,6 +4801,11 @@ lodash.kebabcase@^4.0.1, lodash.kebabcase@^4.1.1:
resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY=
lodash.mapvalues@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c"
integrity sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=
lodash.memoize@^4.1.2: lodash.memoize@^4.1.2:
version "4.1.2" version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"