chore: components base

This commit is contained in:
Corentin Thomasset 2022-04-04 00:24:45 +02:00
parent 64c92a661c
commit 25a8659786
No known key found for this signature in database
GPG key ID: DBD997E935996158
13 changed files with 821 additions and 19 deletions

View file

@ -1,19 +1,85 @@
<script lang="ts">
export default {
name: 'base-layout'
}
<script lang="ts" setup>
import { NIcon } from 'naive-ui';
import { h, ref, type Component } from 'vue';
import { RouterLink, useRoute } from 'vue-router';
import { User } from '@vicons/tabler'
import { tools } from '@/tools';
const collapsed = ref(false)
const activeKey = ref(null)
const route = useRoute()
const makeLabel = (text: string, to: string) => () => h(RouterLink, { to }, { default: () => text })
const makeIcon = (icon: Component) => () => h(NIcon, null, { default: () => h(icon) })
const menuOptions = tools.map(({ name, path, icon }) => ({
label: makeLabel(name, path),
key: name,
icon: makeIcon(icon)
}))
</script>
<template>
<div class="base-layout">
<slot />
</div>
<n-layout has-sider>
<n-layout-sider
bordered
collapse-mode="width"
:collapsed-width="64"
:width="240"
:collapsed="collapsed"
show-trigger
@collapse="collapsed = true"
@expand="collapsed = false"
>
<router-link
to="/"
style="text-decoration: none; color: grey; display: block; text-align: center; margin:25px 0; font-size: 25px;"
>
<strong>IT-Tools</strong>
</router-link>
<n-menu
:value="route.name"
class="menu"
:collapsed="collapsed"
:collapsed-width="64"
:collapsed-icon-size="22"
:options="menuOptions"
v-model:value="activeKey"
/>
</n-layout-sider>
<n-layout class="content">
<div class="bar-wrapper">
<n-input />
<n-button secondary circle>
<n-icon size="large">
<user />
</n-icon>
</n-button>
</div>
<slot />
</n-layout>
</n-layout>
</template>
<style lang="less" scoped>
.base-layout {
width: 100%;
min-height: 100vh;
background-color: #f4f6fa;
.bar-wrapper {
display: flex;
& > *:not(:first-child) {
margin-left: 15px;
}
& > :first-child {
flex-grow: 1;
}
}
.content {
background-color: #f1f5f9;
::v-deep(.n-layout-scroll-container) {
padding: 26px;
}
}
.n-layout {
height: 100vh;
}
</style>

View file

@ -1,5 +1,7 @@
import BaseLayout from './base.layout.vue';
import ToolLayout from './tool.layout.vue';
export const layouts = {
base: BaseLayout,
toolLayout: ToolLayout,
};

View file

@ -0,0 +1,68 @@
<script lang="ts" setup>
import { useRoute } from 'vue-router';
import BaseLayout from './base.layout.vue';
import { useHead } from '@vueuse/head'
import type { HeadObject } from '@vueuse/head'
import { reactive } from 'vue';
const route = useRoute()
const head = reactive<HeadObject>({
title: `${route.meta.name} - IT Tools`,
meta: [
{
name: 'description',
content: route.meta.description
},
{
name: 'keywords',
content: route.meta.keywords
}
]
})
useHead(head)
</script>
<template>
<base-layout>
<div class="tool-layout">
<div class="tool-header">
<n-h1>{{ route.meta.name }}</n-h1>
<div class="separator" />
<div class="description">{{ route.meta.description }}</div>
</div>
<slot />
</div>
</base-layout>
</template>
<style lang="less" scoped>
.tool-layout {
max-width: 700px;
margin: 0 auto;
box-sizing: border-box;
.tool-header {
padding: 40px 0;
.n-h1 {
opacity: 0.9;
font-size: 40px;
font-weight: 400;
margin: 0;
}
.separator {
width: 200px;
height: 2px;
background: rgb(161, 161, 161);
margin-bottom: 10px;
}
.description {
margin: 0;
opacity: 0.7;
}
}
}
</style>