FEAT: switch to vite vue stack
25
src/App.vue
Normal file
@@ -0,0 +1,25 @@
|
||||
<template>
|
||||
<metainfo>
|
||||
<template v-slot:title="{ content }">
|
||||
{{ content ? `${content} | ${siteName}` : siteName }}
|
||||
</template>
|
||||
</metainfo>
|
||||
<router-view />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useMeta } from 'vue-meta'
|
||||
|
||||
const siteName = 'Pegaz.io'
|
||||
|
||||
useMeta({
|
||||
title: '',
|
||||
htmlAttrs: { lang: 'en', amp: true },
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="postcss">
|
||||
html {
|
||||
@apply bg-slate-100
|
||||
}
|
||||
</style>
|
BIN
src/assets/logo.png
Normal file
After Width: | Height: | Size: 6.7 KiB |
7
src/components/VButton.vue
Normal file
@@ -0,0 +1,7 @@
|
||||
<template>
|
||||
<button
|
||||
class="px-4 py-2 ml-2 text-white transition duration-200 bg-blue-500 rounded hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-offset-2"
|
||||
>
|
||||
<slot></slot>
|
||||
</button>
|
||||
</template>
|
@@ -1,61 +1,57 @@
|
||||
<script is:inline>
|
||||
import Nextcloud from '../svg/apps/nextcloud.vue'
|
||||
<script>
|
||||
import { onBeforeUnmount } from 'vue'
|
||||
import Nextcloud from '~/components/svg/apps/nextcloud.vue'
|
||||
|
||||
export default {
|
||||
components: { Nextcloud },
|
||||
data: () => ({
|
||||
terminalContent: '',
|
||||
subDomain: '',
|
||||
isLaunched: false,
|
||||
stories: [
|
||||
{
|
||||
terminal: ['pegaz up nextcloud', '[*] pre-install', 'Creating nextcloud ... done', '[*] post-install', '[√] https://cloud.domain.com'],
|
||||
terminal: ['pegaz up nextcloud', 'Creating nextcloud ... done', '[√] https://cloud.domain.com'],
|
||||
navigator: ['show', 'nextcloud', 'click', 'nextcloud', 'goto', 'cloud'],
|
||||
},
|
||||
{
|
||||
terminal: ['pegaz up jellyfin', '[*] pre-install', 'Creating jellyfin ... done', '[*] post-install', '[√] https://jellyfin.domain.com'],
|
||||
terminal: ['pegaz up jellyfin', 'Creating jellyfin ... done', '[√] https://jellyfin.domain.com'],
|
||||
navigator: ['show', 'jellyfin', 'click', 'jellyfin', 'goto', 'jellyfin'],
|
||||
},
|
||||
{
|
||||
terminal: ['pegaz down nextcloud', 'Stopping test ... done', 'Removing test ... done'],
|
||||
terminal: ['pegaz down nextcloud', 'Stopping nextcloud ... done', 'Removing nextcloud ... done'],
|
||||
navigator: ['goto', 'home', 'hide', 'jellyfin'],
|
||||
},
|
||||
],
|
||||
}),
|
||||
methods: {
|
||||
delay(milliseconds) {
|
||||
return new Promise(resolve => {
|
||||
setTimeout(resolve, milliseconds)
|
||||
})
|
||||
},
|
||||
},
|
||||
async created() {
|
||||
this.stories.map(story => {
|
||||
story.terminal.map(async cmd => {
|
||||
this.terminalContent += 'n'
|
||||
await this.delay(1000)
|
||||
this.terminalContent = 'NEW'
|
||||
console.log('each second')
|
||||
}
|
||||
)
|
||||
})
|
||||
},
|
||||
const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))
|
||||
let i = 0
|
||||
this.timer = await setInterval(() => {
|
||||
this.terminalContent += this.stories[0].terminal[i]+'\n'
|
||||
i += 1
|
||||
if (i == this.stories[0].terminal.length) {
|
||||
clearInterval(this.timer)
|
||||
this.isLaunched = true
|
||||
}
|
||||
}, 1000)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<section class="flex flex-col md:flex-row items-center justify-center mb-28">
|
||||
<div class="bg-slate-900 flex-row rounded-xl w-4/5 md:w-96 h-56 md:z-10 -mb-8 md:-mb-0 max-w-full">
|
||||
<code class="bg-slate-900 flex-row rounded-xl w-4/5 md:w-96 h-56 md:z-10 -mb-8 md:-mb-0 max-w-full md:min-w-max">
|
||||
<div class="p-3 flex justify-between w-20">
|
||||
<div class="bg-green-400 h-4 w-4 r-1 rounded-full"></div>
|
||||
<div class="bg-yellow-300 h-4 w-4 r-1 rounded-full"></div>
|
||||
<div class="bg-red-600 h-4 w-4 r-1 rounded-full"></div>
|
||||
</div>
|
||||
<div class="flex h-4/5">
|
||||
<code class="text-white font-mono p-4 pt-0 mr-0 overflow-scroll">
|
||||
<code class="w-full text-white font-mono p-4 pt-0 mr-0 overflow-scroll whitespace-pre">
|
||||
{{ terminalContent }}<span class="w-2 h-4 bg-white inline-block animate-blink relative" style="margin-bottom: -2px;" ref="terminal" />
|
||||
</code>
|
||||
</div>
|
||||
</div>
|
||||
</code>
|
||||
<div class="bg-slate-400 flex flex-col items-center rounded-2xl w-full md:w-2/4 md:min-w-fit h-80 md:-ml-8 md:z-0">
|
||||
<div class="bg-white inline-block rounded-2xl px-4 py-1 m-4 w-4/6">
|
||||
<span class="text-gray-400">
|
||||
@@ -66,7 +62,7 @@
|
||||
</span>domain.com
|
||||
</div>
|
||||
<div class="bg-white w-full h-full flex justify-center items-center group">
|
||||
<Nextcloud class="w-20 bg-black bg-opacity-10 inline-block rounded-xl p-4 cursor-pointer scale-0 group-hover:scale-100 transition-transform" />
|
||||
<Nextcloud class="w-20 bg-black bg-opacity-10 inline-block rounded-xl p-4 cursor-pointer scale-0 transition-transform" :class="isLaunched ? 'scale-100' : ''" />
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<script>
|
||||
import ClipBoard from '../svg/clipboard.vue'
|
||||
import ClipBoard from '~/components/svg/clipboard.vue'
|
||||
export default {
|
||||
components: { ClipBoard },
|
||||
data: () => {
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<script setup>
|
||||
import Logo from '../svg/logo.vue'
|
||||
import Logo from '~/components/svg/logo.vue'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
Before Width: | Height: | Size: 890 B After Width: | Height: | Size: 890 B |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 659 B After Width: | Height: | Size: 659 B |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 769 B After Width: | Height: | Size: 769 B |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
1
src/env.d.ts
vendored
@@ -1 +0,0 @@
|
||||
/// <reference types="astro/client" />
|
3
src/index.css
Normal file
@@ -0,0 +1,3 @@
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
19
src/layouts/404.vue
Normal file
@@ -0,0 +1,19 @@
|
||||
<template>
|
||||
<main class="max-w-5xl p-5 mx-auto my-10 text-center">
|
||||
<router-view />
|
||||
<div>
|
||||
<v-button @click="router.back()"> Go Back </v-button>
|
||||
</div>
|
||||
</main>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useRouter } from 'vue-router'
|
||||
import { useMeta } from 'vue-meta'
|
||||
|
||||
useMeta({
|
||||
title: '404 - Not found!',
|
||||
})
|
||||
|
||||
const router = useRouter()
|
||||
</script>
|
@@ -1,41 +0,0 @@
|
||||
---
|
||||
export interface Props {
|
||||
title: string;
|
||||
}
|
||||
|
||||
const { title } = Astro.props;
|
||||
---
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<link rel="icon" type="image/svg+xml" href="https://raw.githubusercontent.com/valerebron/pegaz/master/docs/pegaz.svg" />
|
||||
<meta name="generator" content={Astro.generator} />
|
||||
<title>{title}</title>
|
||||
<meta name="description" content="pegaz, deploy stack on the go with docker-compose">
|
||||
<link rel="canonical" href="https://pegaz.io">
|
||||
<meta property="og:title" content="pegaz, deploy stack on the go">
|
||||
<meta property="og:image" content="https://raw.githubusercontent.com/valerebron/pegaz/master/docs/pegaz.svg">
|
||||
<meta property="og:site_name" content="pegaz">
|
||||
<script defer data-domain="pegaz.io" src="https://plausible.erudi.fr/js/plausible.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<slot />
|
||||
</body>
|
||||
</html>
|
||||
<style is:global>
|
||||
:root {
|
||||
--accent: 124, 58, 237;
|
||||
--accent-gradient: linear-gradient(45deg, rgb(var(--accent)), #da62c4 30%, white 60%);
|
||||
}
|
||||
html {
|
||||
font-family: system-ui, sans-serif;
|
||||
background-color: #F6F6F6;
|
||||
}
|
||||
code {
|
||||
font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono,
|
||||
Bitstream Vera Sans Mono, Courier New, monospace;
|
||||
}
|
||||
</style>
|
3
src/layouts/default.vue
Normal file
@@ -0,0 +1,3 @@
|
||||
<template>
|
||||
<router-view />
|
||||
</template>
|
20
src/main.js
Normal file
@@ -0,0 +1,20 @@
|
||||
import { createApp } from 'vue'
|
||||
import { createMetaManager } from 'vue-meta'
|
||||
import { createRouter, createWebHistory } from 'vue-router'
|
||||
import { createPinia } from 'pinia'
|
||||
import { setupLayouts } from 'virtual:generated-layouts'
|
||||
import generatedRoutes from 'virtual:generated-pages'
|
||||
import App from './App.vue'
|
||||
import './index.css'
|
||||
|
||||
const routes = setupLayouts(generatedRoutes)
|
||||
|
||||
const router = createRouter({
|
||||
history: createWebHistory(),
|
||||
routes,
|
||||
})
|
||||
|
||||
const app = createApp(App).use(router).use(createPinia()).use(createMetaManager())
|
||||
|
||||
await router.isReady()
|
||||
app.mount('#app')
|
8
src/pages/[...all].vue
Normal file
@@ -0,0 +1,8 @@
|
||||
<template>
|
||||
<div class="py-4 text-2xl text-center">Page Not found!</div>
|
||||
</template>
|
||||
|
||||
<route lang="yaml">
|
||||
meta:
|
||||
layout: 404
|
||||
</route>
|
26
src/pages/about/[name].vue
Normal file
@@ -0,0 +1,26 @@
|
||||
<template>
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold">About {{ usersStore.name }}</h1>
|
||||
|
||||
<p class="my-8">
|
||||
Lorem ipsum dolor sit amet consectetur, adipisicing elit. Itaque
|
||||
voluptatem consequuntur molestiae cumque recusandae eos non,
|
||||
consectetur, repellat architecto illo nobis, voluptatum dolor!
|
||||
Reprehenderit, nam veniam quibusdam ab nulla rem.
|
||||
</p>
|
||||
<router-link to="/">
|
||||
<v-button>Back to home</v-button>
|
||||
</router-link>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useMeta } from 'vue-meta'
|
||||
import { useUsersStore } from '~/stores/useUsersStore'
|
||||
|
||||
useMeta({
|
||||
title: 'About Page',
|
||||
})
|
||||
|
||||
const usersStore = useUsersStore()
|
||||
</script>
|
@@ -1,28 +0,0 @@
|
||||
---
|
||||
import Layout from "../layouts/Layout.astro";
|
||||
import Github from "../svg/github.vue";
|
||||
import HeroTitle from "../components/hero-title.vue";
|
||||
import HeroButtons from "../components/hero-buttons.vue";
|
||||
import Demo from "../components/demo.vue";
|
||||
---
|
||||
|
||||
<Layout title="Welcome to Pegaz.io.">
|
||||
<div class="mx-6">
|
||||
<header class="h-screen flex flex-col justify-center">
|
||||
<nav class="fixed right-0 top-0 p-2">
|
||||
<a
|
||||
title="Go to Pegaz GitHub repo"
|
||||
href="https://github.com/valerebron/pegaz"
|
||||
target="_blank"
|
||||
>
|
||||
<Github class="bg-white rounded-full hover:scale-105" />
|
||||
</a>
|
||||
</nav>
|
||||
<HeroTitle client:visible />
|
||||
<HeroButtons client:visible />
|
||||
</header>
|
||||
<main class="-mt-20">
|
||||
<Demo />
|
||||
</main>
|
||||
</div>
|
||||
</Layout>
|
52
src/pages/index.vue
Normal file
@@ -0,0 +1,52 @@
|
||||
<template>
|
||||
<div class="mx-6">
|
||||
<header class="h-screen flex flex-col justify-center">
|
||||
<nav class="fixed right-0 top-0 p-2">
|
||||
<a
|
||||
title="Go to Pegaz GitHub repo"
|
||||
href="https://github.com/valerebron/pegaz"
|
||||
target="_blank"
|
||||
>
|
||||
<Github class="bg-white rounded-full hover:scale-105" />
|
||||
</a>
|
||||
</nav>
|
||||
<HeroTitle client:visible />
|
||||
<HeroButtons client:visible />
|
||||
</header>
|
||||
<main class="-mt-20">
|
||||
<Demo />
|
||||
</main>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useMeta } from 'vue-meta'
|
||||
import { ref } from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { useUsersStore } from '~/stores/useUsersStore'
|
||||
|
||||
import Github from "~/components/svg/github.vue";
|
||||
import HeroTitle from "~/components/hero-title.vue";
|
||||
import HeroButtons from "~/components/hero-buttons.vue";
|
||||
import Demo from "~/components/demo.vue";
|
||||
|
||||
useMeta({
|
||||
title: 'Deploy stack',
|
||||
})
|
||||
|
||||
const router = useRouter()
|
||||
|
||||
const usersStore = useUsersStore()
|
||||
|
||||
const newName = ref('')
|
||||
|
||||
function saveName() {
|
||||
if (newName.value === '') {
|
||||
return
|
||||
}
|
||||
|
||||
usersStore.saveName(newName.value)
|
||||
router.push(`/about/${newName.value}`)
|
||||
newName.value = ''
|
||||
}
|
||||
</script>
|
24
src/stores/useUsersStore.js
Normal file
@@ -0,0 +1,24 @@
|
||||
import { defineStore, acceptHMRUpdate } from 'pinia'
|
||||
|
||||
export const useUsersStore = defineStore('users', {
|
||||
state: () => {
|
||||
return {
|
||||
name: 'John Doe'
|
||||
}
|
||||
},
|
||||
|
||||
getters: {
|
||||
nameUppercased: (state) => state.name.toUpperCase()
|
||||
},
|
||||
|
||||
actions: {
|
||||
saveName(name) {
|
||||
this.name = name
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
if (import.meta.hot)
|
||||
import.meta.hot.accept(acceptHMRUpdate(useUsersStore, import.meta.hot))
|
||||
|