Skip to content

Commit

Permalink
add blog page
Browse files Browse the repository at this point in the history
  • Loading branch information
robinbraemer committed Apr 12, 2024
1 parent 390d152 commit 63c78e6
Show file tree
Hide file tree
Showing 20 changed files with 778 additions and 8 deletions.
12 changes: 7 additions & 5 deletions .web/docs/.vitepress/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ import {defineConfig} from 'vitepress'

import {discordLink, editLink, gitHubLink, projects} from '../shared'
import {additionalTitle, commitRef} from "../shared/cloudflare";
import {genFeed} from "./theme/components/posts/genFeed";

const ogUrl = 'https://connect.minekube.com'
export const ogUrl = 'https://connect.minekube.com'
const ogImage = `${ogUrl}/og-image.png`
const ogTitle = 'Minekube Connect'
const ogDescription = 'The Ingress Tunnel for Minecraft Servers'
Expand Down Expand Up @@ -46,6 +47,8 @@ export default defineConfig({
reactivityTransform: true
},

buildEnd: genFeed,

themeConfig: {
logo: '/minekube-logo.png',

Expand Down Expand Up @@ -85,10 +88,9 @@ export default defineConfig({

nav: [
{text: 'Quick Start', link: '/guide/quick-start'},
{text: 'Connectors', link: '/guide/connectors/'},
{text: 'Downloads', link: '/guide/connectors/plugin#downloading-the-connect-plugin'},
{text: 'Pricing', link: '/plans'},
{text: 'Changelog', link: '/guide/changelog'},
{text: 'Connectors', link: '/guide/connectors/', activeMatch: '^/guide/connectors/'},
{text: 'Blog', link: '/blog/', activeMatch: '^/blog/'},
{text: 'Plans', link: '/plans'},
...projects,
],

Expand Down
4 changes: 2 additions & 2 deletions .web/docs/.vitepress/theme/components/MeetTeam.vue
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const teamSvg = `
</svg>
`
const core = [
const core: DefaultTheme.TeamMember[] = [
{
avatar: 'https://www.github.com/minekube.png',
name: 'Join the Core Team!',
Expand All @@ -39,7 +39,7 @@ const core = [
{icon: 'github', link: 'https://github.com/robinbraemer'},
],
},
] satisfies DefaultTheme.TeamMember[]
]
</script>

Expand Down
125 changes: 125 additions & 0 deletions .web/docs/.vitepress/theme/components/positions/JoinUs.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
<template>
<div class="py-32">
<div class="mx-auto max-w-7xl px-6 lg:px-8">
<div class="mx-auto flex max-w-2xl flex-col items-end justify-between gap-16 lg:mx-0 lg:max-w-none lg:flex-row">
<div class="w-full lg:max-w-lg lg:flex-auto">
<h2 class="text-3xl font-bold tracking-tight text-[--vp-c-text-1] sm:text-4xl">We’re always looking for awesome people to join us</h2>
<p class="mt-6 text-xl leading-8 text-[--vp-c-text-2]">We are interested in passionate builders that are excited for innovating the Minecraft space through Minekube's Vision.</p>
<img src="https://storage.googleapis.com/pai-images/e2f08836cd574c47a19adcbb7b8949de.jpeg" alt="" class="mt-16 aspect-[6/5] w-full rounded-2xl bg-gray-50 object-cover lg:aspect-auto lg:h-[34.5rem]" />
</div>
<div class="w-full lg:max-w-xl lg:flex-auto">
<h3 class="sr-only">Job openings</h3>
<ul class="-my-8 divide-y divide-gray-100">
<li v-for="(opening, index) in jobOpenings.slice(0, 3)" :key="index" class="py-8">
<PositionItem :opening="opening"/>
</li>
</ul>
<div class="mt-8 flex border-t border-gray-100 pt-8">
<a :href="discordLink" class="text-sm font-semibold leading-6 text-[--vp-c-brand-2] hover:text-[--vp-c-brand-1]">Talk to us <span aria-hidden="true">&rarr;</span></a>
</div>
</div>
</div>
<ThreeColumns :openings="jobOpenings.slice(3)"/>
</div>
</div>
</template>

<script setup lang="ts">
import {discordLink} from "../../../../shared";
import ThreeColumns from "./ThreeColumns.vue";
import PositionItem from "./PositionItem.vue";
import {Position} from "./types";
const jobOpenings = [
{
role: "Full-Stack Engineer",
description: "Develop and maintain high-quality software. Collaborate with team to design and launch features.",
salary: "Senior",
location: "Remote (anywhere)",
},
{
role: "Infrastructure Engineer",
description: "Design, build and maintain infrastructure. Ensure scalability, security, reliability of systems.",
salary: "Senior",
location: "Remote (anywhere)",
},
{
role: "Backend Engineer",
description: "Design and implement scalable backend systems and APIs. Collaborate with team to design and launch features.",
salary: "Level 2",
location: "Remote (anywhere)",
},
{
role: "Frontend Engineer",
description: "Develop and maintain user-friendly web applications. Collaborate with team to design and launch features.",
salary: "Level 2",
location: "Remote (anywhere)",
},
{
role: "Engineering Manager",
description: "Lead and manage engineering team, set goals and priorities. Collaborate with cross-functional teams on technical and product strategies.",
salary: "Senior",
location: "Remote (anywhere)",
},
{
role: "Marketing Manager",
description: "Lead and execute marketing strategies across channels to increase brand awareness and drive customer acquisition. Collaborate with cross-functional teams on campaigns.",
salary: "Level 1",
location: "Remote (anywhere)",
},
{
role: "Customer Success Manager",
description: "Build and maintain customer relationships, ensuring value from platform. Collaborate with cross-functional teams to address customer needs and drive success.",
salary: "Senior",
location: "Remote (anywhere)",
},
{
role: "Developer Relations Engineer",
description: "Engage with and support developer community, providing technical guidance and resources. Collaborate on improving developer experience and adoption.",
salary: "Level 2",
location: "Remote (anywhere)",
},
{
role: "Platform Product Engineer",
description: "Design and implement platform features and integrations for customer applications. Collaborate with team to design and launch new features.",
salary: "Level 2",
location: "Remote (anywhere)",
},
{
role: "Go Developer",
description: "Develop and maintain high-quality, high-performance software in Go. Collaborate with team to design and launch features.",
salary: "Level 2",
location: "Remote (anywhere)",
},
{
role: "Site Reliability Engineer",
description: "Ensure reliability and performance of platform and services. Design and implement monitoring, alerting, and incident response systems.",
salary: "Senior",
location: "Remote (anywhere)",
},
{
role: "Support Engineer",
description: "Provide technical support and guidance to customers, troubleshoot and resolve issues. Collaborate with cross-functional teams to drive success.",
salary: "Intern",
location: "Remote (anywhere)",
},
{
role: "Technical Writer",
description: "Create and maintain technical documentation, guides, and tutorials. Collaborate with cross-functional teams to ensure accuracy and completeness.",
salary: "Level 1",
location: "Remote (anywhere)",
},
{
role: "Community Moderator",
description: "Manage and moderate online communities, ensuring positive and respectful environment. Collaborate on community engagement and growth.",
salary: "Intern",
location: "Remote (anywhere)",
},
{
role: "Content Creator",
description: "Create and publish engaging content across channels to increase brand awareness and drive engagement. Collaborate on content strategies.",
salary: "Level 1",
location: "Remote (anywhere)",
},
];
</script>
35 changes: 35 additions & 0 deletions .web/docs/.vitepress/theme/components/positions/PositionItem.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<script setup lang="ts">
import { defineProps } from 'vue'
import {discordLink} from "../../../../shared/index";
import {Position} from "./types";
const props = defineProps({
opening: Object as () => Position,
})
</script>

<template>
<dl class="relative flex flex-wrap gap-x-3">
<dt class="sr-only">Role</dt>
<dd class="w-full flex-none text-lg font-semibold tracking-tight text-[--vp-c-text-1]">
<a :href="opening.href || discordLink" class="text-[--vp-c-brand-2] hover:text-[--vp-c-brand-1]">
{{ opening.role }}
<span class="absolute inset-0" aria-hidden="true"/>
</a>
</dd>
<dt class="sr-only">Description</dt>
<dd class="mt-2 w-full flex-none text-base leading-7 text-[--vp-c-text-2]">{{ opening.description }}</dd>
<dt class="sr-only" v-if="opening.salary">Salary</dt>
<dd class="mt-4 text-base font-semibold leading-7 text-[--vp-c-text-1]" v-if="opening.salary">{{
opening.salary
}}
</dd>
<dt class="sr-only">Location</dt>
<dd class="mt-4 flex items-center gap-x-3 text-base leading-7 text-[--vp-c-text-3]">
<svg viewBox="0 0 2 2" class="h-0.5 w-0.5 flex-none fill-gray-300" aria-hidden="true" v-if="opening.salary">
<circle cx="1" cy="1" r="1"/>
</svg>
{{ opening.location }}
</dd>
</dl>
</template>
30 changes: 30 additions & 0 deletions .web/docs/.vitepress/theme/components/positions/ThreeColumns.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<template>
<div>
<div class="mx-auto max-w-7xl px-6 py-16 sm:py-24 lg:px-8">
<h2 class="text-2xl font-bold leading-10 tracking-tight text-[--vp-c-text-1]">Do you see a position you like?</h2>
<p class="mt-6 max-w-2xl text-base leading-7 text-[--vp-c-text-1]">
If you are interested in any of the positions below,
<a :href="discordLink" class="font-semibold text-[--vp-c-brand-2] hover:text-[--vp-c-brand-2]">send us a message on Discord</a>
with your short bio and what you would like to build for the Minkube community.
</p>
<div class="mt-20">
<dl class="space-y-16 sm:grid sm:grid-cols-2 sm:gap-x-6 sm:gap-y-16 sm:space-y-0 lg:grid-cols-3 lg:gap-x-10">
<div v-for="(opening, index) in openings" :key="index">
<PositionItem :opening="opening"/>
</div>
</dl>
</div>
</div>
</div>
</template>

<script setup lang="ts">
import { defineProps } from 'vue'
import {Position} from "./types.js";
import PositionItem from "./PositionItem.vue";
import {discordLink} from "../../../../shared";
const props = defineProps({
openings: Array as () => Position[] // not working
})
</script>
7 changes: 7 additions & 0 deletions .web/docs/.vitepress/theme/components/positions/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export type Position = {
role: string;
description: string;
salary?: string;
location: string;
href?: string;
}
73 changes: 73 additions & 0 deletions .web/docs/.vitepress/theme/components/posts/Article.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<script setup lang="ts">
import Date from './Date.vue'
import Author from './Author.vue'
import { computed } from 'vue'
import {Content, useData, useRoute} from 'vitepress'
import { data as posts } from './posts.data.js'
const { frontmatter: data } = useData()
const route = useRoute()
function findCurrentIndex() {
return posts.findIndex((p) => p.url === route.path)
}
// use the customData date which contains pre-resolved date info
const date = computed(() => posts[findCurrentIndex()].date)
const nextPost = computed(() => posts[findCurrentIndex() - 1])
const prevPost = computed(() => posts[findCurrentIndex() + 1])
</script>

<template>
<article class="xl:divide-y xl:divide-gray-200 dark:xl:divide-slate-200/5">
<header class="pt-6 xl:pb-10 space-y-1 text-center">
<Date :date="date" />
<h1
class="text-3xl leading-9 font-extrabold text-gray-900 dark:text-white tracking-tight sm:text-4xl sm:leading-10 md:text-5xl md:leading-14"
>
{{ data.title }}
</h1>
</header>

<div
class="divide-y xl:divide-y-0 divide-gray-200 dark:divide-slate-200/5 xl:grid xl:grid-cols-4 xl:gap-x-10 pb-16 xl:pb-20"
style="grid-template-rows: auto 1fr"
>
<Author />
<div
class="divide-y divide-gray-200 dark:divide-slate-200/5 xl:pb-0 xl:col-span-3 xl:row-span-2"
>
<Content class="vp-doc prose dark:prose-invert max-w-none pt-10 pb-8" />
</div>

<footer
class="text-sm font-medium leading-5 divide-y divide-gray-200 dark:divide-slate-200/5 xl:col-start-1 xl:row-start-2"
>
<div v-if="nextPost" class="py-8">
<h2
class="text-xs tracking-wide uppercase text-gray-500 dark:text-white"
>
Next Article
</h2>
<div class="link">
<a :href="nextPost.url">{{ nextPost.title }}</a>
</div>
</div>
<div v-if="prevPost" class="py-8">
<h2
class="text-xs tracking-wide uppercase text-gray-500 dark:text-white"
>
Previous Article
</h2>
<div class="link">
<a :href="prevPost.url">{{ prevPost.title }}</a>
</div>
</div>
<div class="pt-8">
<a class="link" href="/blog/">← Back to the blog</a>
</div>
</footer>
</div>
</article>
</template>
41 changes: 41 additions & 0 deletions .web/docs/.vitepress/theme/components/posts/Author.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<script setup lang="ts">
import {useData} from 'vitepress'
import {Post} from "./posts.data";
const {frontmatter}: { frontmatter: Post } = useData()
</script>

<template>
<dl class="pt-6 pb-10 xl:pt-11 xl:border-b xl:border-gray-200 dark:xl:border-slate-200/5">
<dt class="sr-only">Authors</dt>
<dd>
<ul
class="flex justify-center xl:block space-x-8 sm:space-x-12 xl:space-x-0 xl:space-y-8"
>
<li class="flex items-center space-x-2">
<img
v-if="frontmatter.author.imageUrl"
:src="frontmatter.author.imageUrl"
alt="author image"
class="w-10 h-10 rounded-full"
/>
<dl class="text-sm font-medium leading-5 whitespace-nowrap">
<dt class="sr-only">Name</dt>
<dd class="text-[--vp-c-text-1]">
<a
v-if="frontmatter.author.href"
:href="frontmatter.author.href"
target="_blank"
rel="noopnener noreferrer"
:class="{ 'underline': frontmatter.author.href }"
>
{{ frontmatter.author.name }}
</a>
<span v-else>{{ frontmatter.author.name }}</span>
</dd>
</dl>
</li>
</ul>
</dd>
</dl>
</template>
18 changes: 18 additions & 0 deletions .web/docs/.vitepress/theme/components/posts/Date.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<script setup lang="ts">
import type { Post } from './posts.data.js'
const props = defineProps<{ date: Post['date'] }>()
function getDateTime() {
return new Date(props.date.time).toISOString()
}
</script>

<template>
<dl>
<dt class="sr-only">Published on</dt>
<dd class="text-base leading-6 font-medium text-gray-500 dark:text-gray-300">
<time :datetime="getDateTime()">{{ date.string }}</time>
</dd>
</dl>
</template>
Loading

0 comments on commit 63c78e6

Please sign in to comment.