mirror of https://github.com/YunYouJun/valaxy
chore: add demo/custom to custom theme in local, close #344
This commit is contained in:
parent
90630037c1
commit
0ecc5b3094
|
@ -0,0 +1,20 @@
|
|||
# valaxy
|
||||
|
||||
valaxy-fuse-list.json
|
||||
|
||||
# vite-ssg
|
||||
|
||||
.vite-ssg-dist
|
||||
.vite-ssg-temp
|
||||
|
||||
temp/
|
||||
|
||||
.DS_Store
|
||||
*.local
|
||||
dist
|
||||
dist-ssr
|
||||
node_modules
|
||||
.idea/
|
||||
*.log
|
||||
|
||||
components.d.ts
|
|
@ -0,0 +1,3 @@
|
|||
# for pnpm
|
||||
shamefully-hoist=true
|
||||
strict-peer-dependencies=false
|
|
@ -0,0 +1,150 @@
|
|||
/* eslint-disable */
|
||||
/* prettier-ignore */
|
||||
// @ts-nocheck
|
||||
// Generated by unplugin-vue-router. ‼️ DO NOT MODIFY THIS FILE ‼️
|
||||
// It's recommended to commit this file.
|
||||
// Make sure to add this file to your tsconfig.json file as an "includes" or "files" entry.
|
||||
|
||||
/// <reference types="unplugin-vue-router/client" />
|
||||
|
||||
import type {
|
||||
// type safe route locations
|
||||
RouteLocationTypedList,
|
||||
RouteLocationResolvedTypedList,
|
||||
RouteLocationNormalizedTypedList,
|
||||
RouteLocationNormalizedLoadedTypedList,
|
||||
RouteLocationAsString,
|
||||
RouteLocationAsRelativeTypedList,
|
||||
RouteLocationAsPathTypedList,
|
||||
|
||||
// helper types
|
||||
// route definitions
|
||||
RouteRecordInfo,
|
||||
ParamValue,
|
||||
ParamValueOneOrMore,
|
||||
ParamValueZeroOrMore,
|
||||
ParamValueZeroOrOne,
|
||||
|
||||
// vue-router extensions
|
||||
_RouterTyped,
|
||||
RouterLinkTyped,
|
||||
RouterLinkPropsTyped,
|
||||
NavigationGuard,
|
||||
UseLinkFnTyped,
|
||||
|
||||
// data fetching
|
||||
_DataLoader,
|
||||
_DefineLoaderOptions,
|
||||
} from 'unplugin-vue-router/types'
|
||||
|
||||
declare module 'vue-router/auto/routes' {
|
||||
export interface RouteNamedMap {
|
||||
'/': RouteRecordInfo<'/', '/', Record<never, never>, Record<never, never>>,
|
||||
'/[...path]': RouteRecordInfo<'/[...path]', '/:path(.*)', { path: ParamValue<true> }, { path: ParamValue<false> }>,
|
||||
'/404': RouteRecordInfo<'/404', '/404', Record<never, never>, Record<never, never>>,
|
||||
'/about/': RouteRecordInfo<'/about/', '/about', Record<never, never>, Record<never, never>>,
|
||||
'/about/site': RouteRecordInfo<'/about/site', '/about/site', Record<never, never>, Record<never, never>>,
|
||||
'/archives/': RouteRecordInfo<'/archives/', '/archives', Record<never, never>, Record<never, never>>,
|
||||
'/categories/': RouteRecordInfo<'/categories/', '/categories', Record<never, never>, Record<never, never>>,
|
||||
'/links/': RouteRecordInfo<'/links/', '/links', Record<never, never>, Record<never, never>>,
|
||||
'/posts/hello-valaxy': RouteRecordInfo<'/posts/hello-valaxy', '/posts/hello-valaxy', Record<never, never>, Record<never, never>>,
|
||||
'/tags/': RouteRecordInfo<'/tags/', '/tags', Record<never, never>, Record<never, never>>,
|
||||
}
|
||||
}
|
||||
|
||||
declare module 'vue-router/auto' {
|
||||
import type { RouteNamedMap } from 'vue-router/auto/routes'
|
||||
|
||||
export type RouterTyped = _RouterTyped<RouteNamedMap>
|
||||
|
||||
/**
|
||||
* Type safe version of `RouteLocationNormalized` (the type of `to` and `from` in navigation guards).
|
||||
* Allows passing the name of the route to be passed as a generic.
|
||||
*/
|
||||
export type RouteLocationNormalized<Name extends keyof RouteNamedMap = keyof RouteNamedMap> = RouteLocationNormalizedTypedList<RouteNamedMap>[Name]
|
||||
|
||||
/**
|
||||
* Type safe version of `RouteLocationNormalizedLoaded` (the return type of `useRoute()`).
|
||||
* Allows passing the name of the route to be passed as a generic.
|
||||
*/
|
||||
export type RouteLocationNormalizedLoaded<Name extends keyof RouteNamedMap = keyof RouteNamedMap> = RouteLocationNormalizedLoadedTypedList<RouteNamedMap>[Name]
|
||||
|
||||
/**
|
||||
* Type safe version of `RouteLocationResolved` (the returned route of `router.resolve()`).
|
||||
* Allows passing the name of the route to be passed as a generic.
|
||||
*/
|
||||
export type RouteLocationResolved<Name extends keyof RouteNamedMap = keyof RouteNamedMap> = RouteLocationResolvedTypedList<RouteNamedMap>[Name]
|
||||
|
||||
/**
|
||||
* Type safe version of `RouteLocation` . Allows passing the name of the route to be passed as a generic.
|
||||
*/
|
||||
export type RouteLocation<Name extends keyof RouteNamedMap = keyof RouteNamedMap> = RouteLocationTypedList<RouteNamedMap>[Name]
|
||||
|
||||
/**
|
||||
* Type safe version of `RouteLocationRaw` . Allows passing the name of the route to be passed as a generic.
|
||||
*/
|
||||
export type RouteLocationRaw<Name extends keyof RouteNamedMap = keyof RouteNamedMap> =
|
||||
| RouteLocationAsString<RouteNamedMap>
|
||||
| RouteLocationAsRelativeTypedList<RouteNamedMap>[Name]
|
||||
| RouteLocationAsPathTypedList<RouteNamedMap>[Name]
|
||||
|
||||
/**
|
||||
* Generate a type safe params for a route location. Requires the name of the route to be passed as a generic.
|
||||
*/
|
||||
export type RouteParams<Name extends keyof RouteNamedMap> = RouteNamedMap[Name]['params']
|
||||
/**
|
||||
* Generate a type safe raw params for a route location. Requires the name of the route to be passed as a generic.
|
||||
*/
|
||||
export type RouteParamsRaw<Name extends keyof RouteNamedMap> = RouteNamedMap[Name]['paramsRaw']
|
||||
|
||||
export function useRouter(): RouterTyped
|
||||
export function useRoute<Name extends keyof RouteNamedMap = keyof RouteNamedMap>(name?: Name): RouteLocationNormalizedLoadedTypedList<RouteNamedMap>[Name]
|
||||
|
||||
export const useLink: UseLinkFnTyped<RouteNamedMap>
|
||||
|
||||
export function onBeforeRouteLeave(guard: NavigationGuard<RouteNamedMap>): void
|
||||
export function onBeforeRouteUpdate(guard: NavigationGuard<RouteNamedMap>): void
|
||||
|
||||
export const RouterLink: RouterLinkTyped<RouteNamedMap>
|
||||
export const RouterLinkProps: RouterLinkPropsTyped<RouteNamedMap>
|
||||
|
||||
// Experimental Data Fetching
|
||||
|
||||
export function defineLoader<
|
||||
P extends Promise<any>,
|
||||
Name extends keyof RouteNamedMap = keyof RouteNamedMap,
|
||||
isLazy extends boolean = false,
|
||||
>(
|
||||
name: Name,
|
||||
loader: (route: RouteLocationNormalizedLoaded<Name>) => P,
|
||||
options?: _DefineLoaderOptions<isLazy>,
|
||||
): _DataLoader<Awaited<P>, isLazy>
|
||||
export function defineLoader<
|
||||
P extends Promise<any>,
|
||||
isLazy extends boolean = false,
|
||||
>(
|
||||
loader: (route: RouteLocationNormalizedLoaded) => P,
|
||||
options?: _DefineLoaderOptions<isLazy>,
|
||||
): _DataLoader<Awaited<P>, isLazy>
|
||||
|
||||
export {
|
||||
_definePage as definePage,
|
||||
_HasDataLoaderMeta as HasDataLoaderMeta,
|
||||
_setupDataFetchingGuard as setupDataFetchingGuard,
|
||||
_stopDataFetchingScope as stopDataFetchingScope,
|
||||
} from 'unplugin-vue-router/runtime'
|
||||
}
|
||||
|
||||
declare module 'vue-router' {
|
||||
import type { RouteNamedMap } from 'vue-router/auto/routes'
|
||||
|
||||
export interface TypesConfig {
|
||||
beforeRouteUpdate: NavigationGuard<RouteNamedMap>
|
||||
beforeRouteLeave: NavigationGuard<RouteNamedMap>
|
||||
|
||||
$route: RouteLocationNormalizedLoadedTypedList<RouteNamedMap>[keyof RouteNamedMap]
|
||||
$router: _RouterTyped<RouteNamedMap>
|
||||
|
||||
RouterLink: RouterLinkTyped<RouteNamedMap>
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
# Custom Theme Demo
|
||||
|
||||
This is a demo for custom theme in local.
|
||||
|
||||
```bash
|
||||
pnpm i
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
## Custom
|
||||
|
||||
## Ref
|
||||
|
||||
- [valaxy-theme-starter](https://github.com/valaxyjs/valaxy-theme-starter/): If you want to create a new theme and publish it, you can start from here.
|
|
@ -0,0 +1,7 @@
|
|||
# Components
|
||||
|
||||
Components in this dir will be auto-registered and on-demand, powered by [`unplugin-vue-components`](https://github.com/antfu/unplugin-vue-components).
|
||||
|
||||
## Icons
|
||||
|
||||
You can use icons from almost any icon sets by the power of [Iconify](https://iconify.design/).
|
|
@ -0,0 +1,3 @@
|
|||
# layouts
|
||||
|
||||
You can override valaxy/theme layouts here.
|
|
@ -0,0 +1,3 @@
|
|||
# locales
|
||||
|
||||
You can custom i18n here.
|
|
@ -0,0 +1,4 @@
|
|||
# you can custom locale
|
||||
intro:
|
||||
desc: Valaxy Template
|
||||
hi: Hello, Valaxy!
|
|
@ -0,0 +1,4 @@
|
|||
# 你可以像这样自定义 i18n
|
||||
intro:
|
||||
desc: Valaxy 模版
|
||||
hi: 你好,Valaxy
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"name": "valaxy-blog",
|
||||
"type": "module",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "npm run build:ssg",
|
||||
"build:spa": "valaxy build",
|
||||
"build:ssg": "valaxy build --ssg",
|
||||
"dev": "valaxy",
|
||||
"rss": "valaxy rss",
|
||||
"serve": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"valaxy": "0.18.0-beta.0",
|
||||
"valaxy-theme-custom": "./valaxy-theme-custom"
|
||||
},
|
||||
"devDependencies": {
|
||||
"typescript": "^5.3.3"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
layout: 404
|
||||
---
|
|
@ -0,0 +1,15 @@
|
|||
---
|
||||
title: 关于我
|
||||
---
|
||||
|
||||
I am developing [Valaxy](https://github.com/YunYouJun/valaxy) - Next Generation Static Blog Framework.
|
||||
|
||||
If you like it, you can sponsor me in [GitHub](https://github.com/sponsors/YunYouJun) or [sponsors.yunyoujun.cn](https://sponsors.yunyoujun.cn).
|
||||
|
||||
---
|
||||
|
||||
我正在开发 [Valaxy](https://github.com/YunYouJun/valaxy) - 下一代静态博客框架。
|
||||
|
||||
如果你喜欢它,你可以在 [GitHub](https://github.com/sponsors/YunYouJun) 或 [sponsors.yunyoujun.cn](https://sponsors.yunyoujun.cn) 赞助我。
|
||||
|
||||
Check out the [Valaxy | GitHub](https://github.com/YunYouJun/valaxy) for more details.
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
title: 关于站点
|
||||
---
|
||||
|
||||
Valaxy + valaxy-theme-yun Demo Site
|
||||
|
||||
- Default Theme: [valaxy-theme-yun](https://github.com/YunYouJun/valaxy/blob/main/packages/valaxy-theme-yun/)
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
layout: archives
|
||||
nav: false
|
||||
comment: false
|
||||
---
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
layout: categories
|
||||
nav: false
|
||||
toc: false
|
||||
icon: i-ri-folder-2-line
|
||||
# You can custom title
|
||||
# title: 云游的小分类
|
||||
# comment: false
|
||||
---
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
title: 我的小伙伴们
|
||||
keywords: 链接
|
||||
description: 云游的小伙伴们
|
||||
links: https://www.yunyoujun.cn/friends/links.json
|
||||
random: true
|
||||
---
|
||||
|
||||
<YunLinks :links="frontmatter.links" :random="frontmatter.random" />
|
|
@ -0,0 +1,20 @@
|
|||
---
|
||||
title: Hello, Valaxy!
|
||||
date: 2022-04-01
|
||||
updated: 2022-04-01
|
||||
categories: Valaxy 笔记
|
||||
tags:
|
||||
- valaxy
|
||||
- 笔记
|
||||
top: 1
|
||||
---
|
||||
|
||||
## Valaxy
|
||||
|
||||
Next Generation Static Blog Framework.
|
||||
|
||||
Write your first post!
|
||||
|
||||
## Usage
|
||||
|
||||
Modify `valaxy.config.ts` to custom your blog.
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
layout: tags
|
||||
# title: 云游的小标签
|
||||
icon: i-ri-price-tag-3-line
|
||||
nav: false
|
||||
# comment: false
|
||||
---
|
|
@ -0,0 +1,3 @@
|
|||
/assets/*
|
||||
cache-control: max-age=31536000
|
||||
cache-control: immutable
|
|
@ -0,0 +1,33 @@
|
|||
<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<mask id="mask0_757_102259" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="97" y="222" width="830" height="647">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M729.48 756.469C729.478 756.471 729.475 756.473 729.472 756.475C729.606 756.361 729.625 756.36 729.48 756.469ZM690.046 767.723C685.618 766.845 680.868 765.982 675.803 765.143C634.63 758.32 576.843 753.701 512.383 753.12C447.923 752.538 390.063 756.114 348.774 762.193C343.694 762.941 338.929 763.717 334.486 764.515C338.914 765.394 343.664 766.256 348.729 767.095C389.902 773.918 447.689 778.537 512.149 779.119C576.609 779.7 634.469 776.124 675.758 770.045C680.838 769.298 685.603 768.521 690.046 767.723ZM295.261 752.552C295.118 752.441 295.137 752.442 295.269 752.558C295.266 752.556 295.264 752.554 295.261 752.552ZM295.052 775.769C295.054 775.768 295.057 775.766 295.06 775.764C294.926 775.877 294.907 775.878 295.052 775.769ZM729.263 779.68C729.266 779.682 729.268 779.684 729.271 779.686C729.413 779.798 729.395 779.796 729.263 779.68ZM511.932 803.118C642.542 804.296 748.572 788.686 748.756 768.252C748.941 747.819 643.21 730.299 512.6 729.121C381.99 727.942 275.96 743.552 275.776 763.986C275.591 784.42 381.322 801.939 511.932 803.118Z" fill="url(#paint0_linear_757_102259)"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M729.48 756.469C729.478 756.471 729.475 756.473 729.472 756.475C729.606 756.361 729.625 756.36 729.48 756.469ZM690.046 767.723C685.618 766.845 680.868 765.982 675.803 765.143C634.63 758.32 576.843 753.701 512.383 753.12C447.923 752.538 390.063 756.114 348.774 762.193C343.694 762.941 338.929 763.717 334.486 764.515C338.914 765.394 343.664 766.256 348.729 767.095C389.902 773.918 447.689 778.537 512.149 779.119C576.609 779.7 634.469 776.124 675.758 770.045C680.838 769.298 685.603 768.521 690.046 767.723ZM295.261 752.552C295.118 752.441 295.137 752.442 295.269 752.558C295.266 752.556 295.264 752.554 295.261 752.552ZM295.052 775.769C295.054 775.768 295.057 775.766 295.06 775.764C294.926 775.877 294.907 775.878 295.052 775.769ZM729.263 779.68C729.266 779.682 729.268 779.684 729.271 779.686C729.413 779.798 729.395 779.796 729.263 779.68ZM511.932 803.118C642.542 804.296 748.572 788.686 748.756 768.252C748.941 747.819 643.21 730.299 512.6 729.121C381.99 727.942 275.96 743.552 275.776 763.986C275.591 784.42 381.322 801.939 511.932 803.118Z" fill="url(#paint1_linear_757_102259)"/>
|
||||
<mask id="mask1_757_102259" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="97" y="121" width="830" height="748">
|
||||
<g style="mix-blend-mode:darken">
|
||||
<ellipse cx="512" cy="766" rx="102.062" ry="102.062" transform="rotate(-15 512 766)" fill="#9038FF"/>
|
||||
</g>
|
||||
<rect x="-0.183013" y="-0.683013" width="579" height="159" transform="matrix(0.5 -0.866025 -0.866025 -0.5 635.881 702.112)" fill="#D9D9D9" stroke="black" stroke-linejoin="round"/>
|
||||
<rect x="387.183" y="702.612" width="579" height="159" transform="rotate(-120 387.183 702.612)" fill="#D9D9D9" stroke="black" stroke-linejoin="round"/>
|
||||
</mask>
|
||||
<g mask="url(#mask1_757_102259)">
|
||||
<rect x="-15" y="222" width="1071" height="979" fill="#D9D9D9"/>
|
||||
</g>
|
||||
</mask>
|
||||
<g mask="url(#mask0_757_102259)">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M1024 0H0V1024H1024V0ZM666 766C666 851.052 597.052 920 512 920C426.948 920 358 851.052 358 766C358 680.949 426.948 612 512 612C597.052 612 666 680.949 666 766ZM610.584 739.585C625.173 794.031 592.862 849.996 538.416 864.585C483.969 879.174 428.005 846.863 413.416 792.416C398.827 737.969 431.138 682.005 485.584 667.416C540.031 652.827 595.995 685.138 610.584 739.585Z" fill="url(#paint2_diamond_757_102259)"/>
|
||||
</g>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_757_102259" x1="472.734" y1="695.005" x2="499.213" y2="841.207" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#9444FB"/>
|
||||
<stop offset="1" stop-color="#4D08A4"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_757_102259" x1="543.866" y1="836.077" x2="534.684" y2="776.831" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-opacity="0.19"/>
|
||||
<stop offset="1" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="paint2_diamond_757_102259" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(510 767) rotate(-90) scale(1452.5)">
|
||||
<stop stop-color="#8300EF"/>
|
||||
<stop offset="1" stop-color="#3B82F6"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 4.3 KiB |
Binary file not shown.
After Width: | Height: | Size: 6.9 KiB |
Binary file not shown.
After Width: | Height: | Size: 20 KiB |
|
@ -0,0 +1,41 @@
|
|||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||
width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
<metadata>
|
||||
Created by potrace 1.11, written by Peter Selinger 2001-2013
|
||||
</metadata>
|
||||
<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
|
||||
fill="#000000" stroke="none">
|
||||
<path d="M2916 6015 c-93 -57 -173 -108 -178 -113 -6 -6 7 -36 33 -78 23 -38
|
||||
86 -141 139 -229 54 -88 135 -221 180 -295 46 -74 94 -155 108 -180 14 -25 29
|
||||
-52 35 -60 7 -12 -9 -45 -62 -130 -39 -63 -85 -140 -103 -170 -18 -30 -117
|
||||
-194 -222 -365 -104 -170 -199 -326 -210 -346 -12 -19 -61 -102 -111 -183 -49
|
||||
-81 -101 -166 -115 -189 -14 -23 -39 -64 -55 -90 -17 -27 -77 -126 -134 -220
|
||||
-57 -95 -127 -210 -156 -257 -194 -315 -325 -533 -325 -541 0 -5 -4 -9 -10 -9
|
||||
-5 0 -10 -4 -10 -9 0 -5 -55 -98 -121 -207 -247 -404 -403 -660 -416 -684 -8
|
||||
-14 -58 -97 -112 -185 l-98 -160 -189 -2 c-104 -1 -225 -2 -269 -2 l-80 -1 1
|
||||
-210 c0 -116 4 -213 8 -218 11 -11 6107 -9 6114 2 8 13 8 406 0 419 -4 7 -88
|
||||
10 -265 9 l-259 -2 -50 77 c-27 43 -54 87 -60 98 -6 11 -62 103 -124 205 -62
|
||||
102 -120 197 -129 212 -9 16 -85 142 -170 280 -85 139 -160 262 -165 273 -6
|
||||
11 -13 22 -16 25 -3 3 -30 46 -59 95 -30 50 -102 169 -161 265 -59 96 -240
|
||||
393 -402 660 -163 267 -371 609 -463 760 -92 151 -194 318 -225 370 -31 52
|
||||
-101 167 -155 255 l-97 160 27 50 c16 27 32 55 36 61 5 5 38 59 74 120 36 60
|
||||
69 116 74 124 5 8 75 122 155 253 81 131 144 242 141 247 -4 7 -114 76 -183
|
||||
115 -10 6 -52 32 -95 58 -42 27 -81 46 -87 42 -8 -5 -94 -140 -140 -219 -19
|
||||
-33 -221 -365 -246 -404 -15 -22 -18 -18 -111 135 -52 87 -123 203 -157 258
|
||||
-67 108 -67 110 -111 184 -16 28 -34 51 -40 50 -5 0 -86 -47 -179 -104z m739
|
||||
-1642 c319 -526 519 -854 637 -1046 43 -70 78 -130 78 -133 0 -2 5 -10 10 -17
|
||||
6 -7 69 -109 140 -227 72 -118 134 -222 139 -230 5 -8 55 -89 111 -180 56 -91
|
||||
105 -172 110 -180 9 -14 52 -84 270 -445 54 -88 135 -221 180 -295 46 -74 91
|
||||
-148 100 -165 9 -16 31 -53 48 -81 18 -28 32 -54 32 -57 0 -3 -403 -6 -895 -5
|
||||
l-895 0 0 81 c-1 45 -1 439 -1 875 l0 792 -37 1 c-57 1 -344 1 -374 0 l-27 -1
|
||||
0 -832 c0 -458 0 -852 0 -875 l-1 -42 -895 1 c-492 0 -895 3 -895 5 0 9 115
|
||||
198 122 201 5 2 8 7 8 12 0 5 23 46 51 92 28 46 78 128 112 183 33 55 70 116
|
||||
82 135 12 19 132 215 265 435 133 220 266 438 295 485 65 105 206 338 220 362
|
||||
6 10 172 284 370 608 198 325 387 635 420 690 33 55 62 100 65 100 3 0 73
|
||||
-111 155 -247z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
|
@ -0,0 +1,120 @@
|
|||
import { defineSiteConfig } from 'valaxy'
|
||||
|
||||
export default defineSiteConfig({
|
||||
url: 'https://valaxy.site/',
|
||||
lang: 'zh-CN',
|
||||
title: 'Valaxy Theme Yun',
|
||||
author: {
|
||||
name: '云游君',
|
||||
},
|
||||
description: 'Valaxy Theme Yun Preview.',
|
||||
social: [
|
||||
{
|
||||
name: 'RSS',
|
||||
link: '/atom.xml',
|
||||
icon: 'i-ri-rss-line',
|
||||
color: 'orange',
|
||||
},
|
||||
{
|
||||
name: 'QQ 群 1050458482',
|
||||
link: 'https://qm.qq.com/cgi-bin/qm/qr?k=kZJzggTTCf4SpvEQ8lXWoi5ZjhAx0ILZ&jump_from=webapi',
|
||||
icon: 'i-ri-qq-line',
|
||||
color: '#12B7F5',
|
||||
},
|
||||
{
|
||||
name: 'GitHub',
|
||||
link: 'https://github.com/YunYouJun',
|
||||
icon: 'i-ri-github-line',
|
||||
color: '#6e5494',
|
||||
},
|
||||
{
|
||||
name: '微博',
|
||||
link: 'https://weibo.com/jizhideyunyoujun',
|
||||
icon: 'i-ri-weibo-line',
|
||||
color: '#E6162D',
|
||||
},
|
||||
{
|
||||
name: '豆瓣',
|
||||
link: 'https://www.douban.com/people/yunyoujun/',
|
||||
icon: 'i-ri-douban-line',
|
||||
color: '#007722',
|
||||
},
|
||||
{
|
||||
name: '网易云音乐',
|
||||
link: 'https://music.163.com/#/user/home?id=247102977',
|
||||
icon: 'i-ri-netease-cloud-music-line',
|
||||
color: '#C20C0C',
|
||||
},
|
||||
{
|
||||
name: '知乎',
|
||||
link: 'https://www.zhihu.com/people/yunyoujun/',
|
||||
icon: 'i-ri-zhihu-line',
|
||||
color: '#0084FF',
|
||||
},
|
||||
{
|
||||
name: '哔哩哔哩',
|
||||
link: 'https://space.bilibili.com/1579790',
|
||||
icon: 'i-ri-bilibili-line',
|
||||
color: '#FF8EB3',
|
||||
},
|
||||
{
|
||||
name: '微信公众号',
|
||||
link: 'https://cdn.yunyoujun.cn/img/about/white-qrcode-and-search.jpg',
|
||||
icon: 'i-ri-wechat-2-line',
|
||||
color: '#1AAD19',
|
||||
},
|
||||
{
|
||||
name: 'Twitter',
|
||||
link: 'https://twitter.com/YunYouJun',
|
||||
icon: 'i-ri-twitter-line',
|
||||
color: '#1da1f2',
|
||||
},
|
||||
{
|
||||
name: 'Telegram Channel',
|
||||
link: 'https://t.me/elpsycn',
|
||||
icon: 'i-ri-telegram-line',
|
||||
color: '#0088CC',
|
||||
},
|
||||
{
|
||||
name: 'E-Mail',
|
||||
link: 'mailto:me@yunyoujun.cn',
|
||||
icon: 'i-ri-mail-line',
|
||||
color: '#8E71C1',
|
||||
},
|
||||
{
|
||||
name: 'Travelling',
|
||||
link: 'https://www.travellings.cn/go.html',
|
||||
icon: 'i-ri-train-line',
|
||||
color: 'var(--va-c-text)',
|
||||
},
|
||||
],
|
||||
|
||||
search: {
|
||||
enable: false,
|
||||
},
|
||||
|
||||
sponsor: {
|
||||
enable: true,
|
||||
title: '我很可爱,请给我钱!',
|
||||
methods: [
|
||||
{
|
||||
name: '支付宝',
|
||||
url: 'https://cdn.yunyoujun.cn/img/donate/alipay-qrcode.jpg',
|
||||
color: '#00A3EE',
|
||||
icon: 'i-ri-alipay-line',
|
||||
},
|
||||
{
|
||||
name: 'QQ 支付',
|
||||
url: 'https://cdn.yunyoujun.cn/img/donate/qqpay-qrcode.png',
|
||||
color: '#12B7F5',
|
||||
icon: 'i-ri-qq-line',
|
||||
},
|
||||
{
|
||||
name: '微信支付',
|
||||
url: 'https://cdn.yunyoujun.cn/img/donate/wechatpay-qrcode.jpg',
|
||||
color: '#2DC100',
|
||||
icon: 'i-ri-wechat-pay-line',
|
||||
},
|
||||
],
|
||||
},
|
||||
})
|
|
@ -0,0 +1,8 @@
|
|||
# styles
|
||||
|
||||
You can override styles here.
|
||||
|
||||
- New file `index.scss` to write global css.
|
||||
- New file `css-vars.scss` to set css vars.
|
||||
|
||||
More info see <https://valaxy.site/guide/custom/styles>.
|
|
@ -0,0 +1 @@
|
|||
// you can custom css vars here
|
|
@ -0,0 +1 @@
|
|||
// you can custom css here
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"target": "ESNext",
|
||||
"jsx": "preserve",
|
||||
"lib": ["DOM", "ESNext"],
|
||||
"baseUrl": ".",
|
||||
"module": "ESNext",
|
||||
"moduleResolution": "node",
|
||||
"paths": {
|
||||
"~/*": ["./*"]
|
||||
},
|
||||
"resolveJsonModule": true,
|
||||
"strict": true,
|
||||
"strictNullChecks": true,
|
||||
"noUnusedLocals": true,
|
||||
"esModuleInterop": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"skipLibCheck": true
|
||||
},
|
||||
"exclude": ["dist", "node_modules"]
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
export * from '../composables'
|
|
@ -0,0 +1,92 @@
|
|||
<script setup lang="ts">
|
||||
import { computed } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
|
||||
import { useFrontmatter, usePostList } from 'valaxy'
|
||||
|
||||
const frontmatter = useFrontmatter()
|
||||
|
||||
const route = useRoute()
|
||||
const posts = usePostList()
|
||||
|
||||
function findCurrentIndex() {
|
||||
return posts.value.findIndex(p => p.path === route.path)
|
||||
}
|
||||
|
||||
const nextPost = computed(() => posts.value[findCurrentIndex() - 1])
|
||||
const prevPost = computed(() => posts.value[findCurrentIndex() + 1])
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<article class="xl:divide-y xl:divide-gray-200 xl:dark:divide-gray-700">
|
||||
<header class="pt-6 xl:pb-10 space-y-1 text-center">
|
||||
<StarterDate :date="frontmatter.date" />
|
||||
<h1
|
||||
class="
|
||||
st-text
|
||||
text-3xl
|
||||
leading-9
|
||||
font-extrabold
|
||||
tracking-tight
|
||||
sm:text-4xl sm:leading-10
|
||||
md:text-5xl md:leading-14
|
||||
"
|
||||
>
|
||||
{{ frontmatter.title }}
|
||||
</h1>
|
||||
</header>
|
||||
|
||||
<div
|
||||
class="
|
||||
divide-y
|
||||
xl:divide-y-0
|
||||
divide-gray-200 dark:divide-gray-700
|
||||
xl:grid xl:grid-cols-4 xl:gap-x-10
|
||||
pb-16
|
||||
xl:pb-20
|
||||
"
|
||||
style="grid-template-rows: auto 1fr"
|
||||
>
|
||||
<StarterAuthor v-if="frontmatter.author" :frontmatter="frontmatter" />
|
||||
<div class="divide-y divide-gray-200 dark:divide-gray-700 xl:pb-0 xl:col-span-3 xl:row-span-2">
|
||||
<slot />
|
||||
</div>
|
||||
|
||||
<footer
|
||||
class="
|
||||
text-sm
|
||||
font-medium
|
||||
leading-5
|
||||
divide-y divide-gray-200 dark:divide-gray-700
|
||||
xl:col-start-1 xl:row-start-2
|
||||
"
|
||||
>
|
||||
<div v-if="nextPost && nextPost.path" class="py-8">
|
||||
<h2 class="text-xs tracking-wide uppercase text-gray-500">
|
||||
Next Article
|
||||
</h2>
|
||||
<div class="link">
|
||||
<RouterLink :to="nextPost.path">
|
||||
{{ nextPost.title }}
|
||||
</RouterLink>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="prevPost && prevPost.path" class="py-8">
|
||||
<h2 class="text-xs tracking-wide uppercase text-gray-500">
|
||||
Previous Article
|
||||
</h2>
|
||||
<div class="link">
|
||||
<RouterLink :to="prevPost.path">
|
||||
{{ prevPost.title }}
|
||||
</RouterLink>
|
||||
</div>
|
||||
</div>
|
||||
<div class="pt-8">
|
||||
<RouterLink class="link" to="/">
|
||||
← Back to the blog
|
||||
</RouterLink>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
</article>
|
||||
</template>
|
|
@ -0,0 +1,32 @@
|
|||
<script lang="ts" setup>
|
||||
import type { Post } from 'valaxy'
|
||||
|
||||
defineProps<{
|
||||
post: Post
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<article class="space-y-2 xl:grid xl:grid-cols-4 xl:space-y-0 xl:items-baseline">
|
||||
<StarterDate :date="post.date" />
|
||||
<div class="space-y-5 xl:col-span-3">
|
||||
<div class="space-y-6">
|
||||
<h2 class="text-2xl leading-8 font-bold tracking-tight">
|
||||
<RouterLink class="st-text" :to="post.path || ''">
|
||||
{{ post.title }}
|
||||
</RouterLink>
|
||||
</h2>
|
||||
<div
|
||||
v-if="post.excerpt"
|
||||
class="prose max-w-none text-gray-500"
|
||||
v-html="post.excerpt"
|
||||
/>
|
||||
</div>
|
||||
<div class="text-base leading-6 font-medium">
|
||||
<RouterLink class="link" aria-label="read more" :to="post.path || ''">
|
||||
Read more →
|
||||
</RouterLink>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
</template>
|
|
@ -0,0 +1,55 @@
|
|||
<script setup lang="ts">
|
||||
import type { Post } from 'valaxy'
|
||||
|
||||
defineProps<{
|
||||
frontmatter: Post
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<dl class="pt-6 pb-10 xl:pt-11 xl:border-b xl:border-gray-200">
|
||||
<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.gravatar"
|
||||
:src="`https://gravatar.com/avatar/${frontmatter.gravatar}`"
|
||||
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="st-text">
|
||||
{{ frontmatter.author }}
|
||||
</dd>
|
||||
<dt v-if="frontmatter.twitter" class="sr-only">
|
||||
Twitter
|
||||
</dt>
|
||||
<dd v-if="frontmatter.twitter">
|
||||
<a
|
||||
:href="`https://twitter.com/${frontmatter.twitter}`"
|
||||
target="_blank"
|
||||
rel="noopnener noreferrer"
|
||||
class="link"
|
||||
>{{ frontmatter.twitter }}</a>
|
||||
</dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
</dd>
|
||||
</dl>
|
||||
</template>
|
|
@ -0,0 +1,21 @@
|
|||
<script lang="ts" setup>
|
||||
import { formatDate } from 'valaxy'
|
||||
import { computed } from 'vue'
|
||||
|
||||
const props = defineProps<{
|
||||
date?: Date | number | string
|
||||
}>()
|
||||
|
||||
const datetime = computed(() => formatDate(props.date || ''))
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<dl>
|
||||
<dt class="sr-only">
|
||||
Published on
|
||||
</dt>
|
||||
<dd class="text-base leading-6 font-medium text-gray-500">
|
||||
<time :datetime="datetime">{{ datetime }}</time>
|
||||
</dd>
|
||||
</dl>
|
||||
</template>
|
|
@ -0,0 +1,55 @@
|
|||
<script lang="ts" setup>
|
||||
import { capitalize, computed } from 'vue'
|
||||
import { useSiteConfig, useValaxyConfig } from 'valaxy'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
import pkg from 'valaxy/package.json'
|
||||
import { useThemeConfig } from '../composables'
|
||||
|
||||
const { t } = useI18n()
|
||||
|
||||
const config = useValaxyConfig()
|
||||
const siteConfig = useSiteConfig()
|
||||
const themeConfig = useThemeConfig()
|
||||
|
||||
const year = new Date().getFullYear()
|
||||
|
||||
const isThisYear = computed(() => {
|
||||
return year === themeConfig.value.footer.since
|
||||
})
|
||||
|
||||
const poweredHtml = computed(() => t('footer.powered', [`<a href="${pkg.repository}" target="_blank" rel="noopener">Valaxy</a> v${pkg.version}`]))
|
||||
const footerIcon = computed(() => themeConfig.value.footer.icon!)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<footer class="va-footer p-4" text="center sm" style="color:var(--va-c-text-light)">
|
||||
<div v-if="themeConfig.footer.beian?.enable && themeConfig.footer.beian.icp" class="beian" m="y-2">
|
||||
<a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener">
|
||||
{{ themeConfig.footer.beian.icp }}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="copyright flex justify-center items-center" p="1">
|
||||
<span>
|
||||
©
|
||||
<template v-if="!isThisYear">
|
||||
{{ themeConfig.footer.since }} -
|
||||
</template>
|
||||
{{ year }}
|
||||
</span>
|
||||
|
||||
<a m="x-2" class="inline-flex animate-pulse" :href="footerIcon.url" target="_blank" :title="footerIcon.title">
|
||||
<div :class="footerIcon.name" />
|
||||
</a>
|
||||
|
||||
<span>{{ siteConfig.author.name }}</span>
|
||||
</div>
|
||||
|
||||
<div v-if="themeConfig.footer.powered" class="powered" m="2">
|
||||
<span v-html="poweredHtml" /> | <span>{{ t('footer.theme') }} - <a :href="themeConfig.pkg.homepage" :title="`valaxy-theme-${config.theme}`" target="_blank">{{ capitalize(config.theme) }}</a> v{{ themeConfig.pkg.version }}</span>
|
||||
</div>
|
||||
|
||||
<slot />
|
||||
</footer>
|
||||
</template>
|
|
@ -0,0 +1,26 @@
|
|||
<script lang="ts" setup>
|
||||
import { useSiteConfig } from 'valaxy'
|
||||
|
||||
const siteConfig = useSiteConfig()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="pt-6 pb-8 space-y-2 md:space-y-5">
|
||||
<h1
|
||||
class="
|
||||
st-text
|
||||
text-3xl
|
||||
leading-9
|
||||
font-extrabold
|
||||
tracking-tight
|
||||
sm:text-4xl sm:leading-10
|
||||
md:text-6xl md:leading-14
|
||||
"
|
||||
>
|
||||
{{ siteConfig.title }}
|
||||
</h1>
|
||||
<p class="text-lg leading-7 text-gray-500">
|
||||
{{ siteConfig.subtitle }}
|
||||
</p>
|
||||
</div>
|
||||
</template>
|
|
@ -0,0 +1,26 @@
|
|||
<script lang="ts" setup>
|
||||
import { isClient, useWindowScroll } from '@vueuse/core'
|
||||
import { computed } from 'vue'
|
||||
|
||||
const { y } = useWindowScroll()
|
||||
const showBackToTop = computed(() => y.value > 50)
|
||||
|
||||
function backToTop() {
|
||||
if (!isClient)
|
||||
return
|
||||
window.scrollTo({ top: 0 })
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="fixed right-8 bottom-8 hidden flex-col gap-3 md:flex">
|
||||
<Transition>
|
||||
<button
|
||||
v-if="showBackToTop" class="rounded-full bg-gray-200 p-2 text-gray-500 transition-all hover:bg-gray-300 dark:bg-gray-700 dark:text-gray-400 dark:hover:bg-gray-600"
|
||||
@click="backToTop"
|
||||
>
|
||||
<div i-ri-arrow-up-line />
|
||||
</button>
|
||||
</Transition>
|
||||
</div>
|
||||
</template>
|
|
@ -0,0 +1,43 @@
|
|||
<script lang="ts" setup>
|
||||
import { isDark, toggleDark, useSiteConfig } from 'valaxy'
|
||||
|
||||
// import { computed } from 'vue'
|
||||
// import { useRoute } from 'vue-router'
|
||||
import { useThemeConfig } from '../composables'
|
||||
|
||||
// const route = useRoute()
|
||||
// const isIndex = computed(() => route.path.replace(/index.html$/, '') === '/')
|
||||
|
||||
const siteConfig = useSiteConfig()
|
||||
const themeConfig = useThemeConfig()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<nav w="full" class="flex justify-between items-center py-10 font-bold">
|
||||
<RouterLink class="text-xl" to="/" :aria-label="siteConfig.title">
|
||||
<img
|
||||
class="inline-block mr-2"
|
||||
style="width: 50px; height: 35px"
|
||||
alt="logo"
|
||||
:src="siteConfig.favicon"
|
||||
>
|
||||
<span class="hidden md:inline">{{ siteConfig.title }}</span>
|
||||
</RouterLink>
|
||||
<div class="text-sm text-gray-500 leading-5">
|
||||
<template v-for="(item, i) in themeConfig.nav" :key="i">
|
||||
<AppLink
|
||||
:to="item.link"
|
||||
rel="noopener"
|
||||
>
|
||||
{{ item.text }}
|
||||
</AppLink>
|
||||
<span v-if="i !== themeConfig.nav.length - 1" class="mr-2 ml-2">·</span>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
<button type="button" aria-label="Toggle Dark Mode" @click="toggleDark()">
|
||||
<div v-if="!isDark" i-ri-sun-line />
|
||||
<div v-else i-ri-moon-line />
|
||||
</button>
|
||||
</nav>
|
||||
</template>
|
|
@ -0,0 +1,28 @@
|
|||
<script setup lang="ts">
|
||||
import { computed } from 'vue'
|
||||
import type { Post } from 'valaxy'
|
||||
import { usePostList } from 'valaxy'
|
||||
|
||||
const props = withDefaults(defineProps<{
|
||||
type?: string
|
||||
posts?: Post[]
|
||||
curPage?: number
|
||||
}>(), {
|
||||
curPage: 1,
|
||||
})
|
||||
|
||||
const routes = usePostList({ type: props.type || '' })
|
||||
const posts = computed(() => props.posts || routes.value)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<ul class="divide-y divide-gray-200 dark:divide-gray-700">
|
||||
<template v-for="post in posts" :key="post.path">
|
||||
<Transition name="fade">
|
||||
<li v-if="post" class="py-12">
|
||||
<StarterArticleCard :post="post" />
|
||||
</li>
|
||||
</Transition>
|
||||
</template>
|
||||
</ul>
|
||||
</template>
|
|
@ -0,0 +1,13 @@
|
|||
<script lang="ts" setup>
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { useLocale } from 'valaxy'
|
||||
|
||||
const { t, locale } = useI18n()
|
||||
const { toggleLocales } = useLocale()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<button class="yun-icon-btn" :title="t('button.toggle_langs')" style="color:var(--va-c-text)" @click="toggleLocales">
|
||||
<div i-ri-translate class="transition transform" :class="locale === 'en' ? 'rotate-y-180' : ''" />
|
||||
</button>
|
||||
</template>
|
|
@ -0,0 +1,45 @@
|
|||
<script lang="ts" setup>
|
||||
import type { PageData, Post } from 'valaxy'
|
||||
import { useSiteConfig } from 'valaxy'
|
||||
|
||||
defineProps<{
|
||||
frontmatter: Post
|
||||
data?: PageData
|
||||
}>()
|
||||
const siteConfig = useSiteConfig()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<main>
|
||||
<div w="full" flex="~">
|
||||
<slot name="main">
|
||||
<div class="content" flex="~ col grow" w="full" p="l-4 lt-md:0">
|
||||
<slot name="main-header" />
|
||||
<slot name="main-header-after" />
|
||||
|
||||
<slot name="main-content">
|
||||
<div class="markdown-body prose max-w-none pb-8">
|
||||
<ValaxyMd :frontmatter="frontmatter">
|
||||
<slot name="main-content-md" />
|
||||
<slot />
|
||||
</ValaxyMd>
|
||||
</div>
|
||||
<slot name="main-content-after" />
|
||||
</slot>
|
||||
</div>
|
||||
|
||||
<slot name="main-nav-before" />
|
||||
|
||||
<slot name="main-nav" />
|
||||
|
||||
<slot name="main-nav-after" />
|
||||
|
||||
<slot v-if="siteConfig.comment.enable && frontmatter.comment !== false" name="comment" />
|
||||
|
||||
<slot name="footer" />
|
||||
</slot>
|
||||
</div>
|
||||
|
||||
<slot name="aside" />
|
||||
</main>
|
||||
</template>
|
|
@ -0,0 +1,50 @@
|
|||
<template>
|
||||
<div class="antialiased">
|
||||
<div class="max-w-3xl mx-auto px-4 sm:px-6 xl:max-w-5xl xl:px-0">
|
||||
<StarterNav />
|
||||
</div>
|
||||
|
||||
<main class="max-w-3xl mx-auto px-4 sm:px-6 xl:max-w-5xl xl:px-0">
|
||||
<slot>
|
||||
<RouterView v-slot="{ Component }">
|
||||
<component :is="Component">
|
||||
<template #main-header>
|
||||
<slot name="main-header" />
|
||||
</template>
|
||||
|
||||
<template #main-header-after>
|
||||
<slot name="main-header-after" />
|
||||
</template>
|
||||
<template #main>
|
||||
<slot name="main" />
|
||||
</template>
|
||||
<template #main-content>
|
||||
<slot name="main-content" />
|
||||
</template>
|
||||
<template #main-content-after>
|
||||
<slot name="main-content-after" />
|
||||
</template>
|
||||
<template #main-nav-before>
|
||||
<slot name="main-nav-before" />
|
||||
</template>
|
||||
<template #main-nav-after>
|
||||
<slot name="main-nav-after" />
|
||||
</template>
|
||||
<template #aside-custom>
|
||||
<slot name="aside-custom" />
|
||||
</template>
|
||||
<template #footer>
|
||||
<slot name="footer" />
|
||||
</template>
|
||||
</component>
|
||||
</RouterView>
|
||||
</slot>
|
||||
</main>
|
||||
|
||||
<StarterHelper />
|
||||
|
||||
<StarterFooter>
|
||||
<slot name="footer" />
|
||||
</StarterFooter>
|
||||
</div>
|
||||
</template>
|
|
@ -0,0 +1,11 @@
|
|||
import { computed } from 'vue'
|
||||
import { useConfig } from 'valaxy'
|
||||
import type { ThemeConfig } from '../types'
|
||||
|
||||
/**
|
||||
* getThemeConfig
|
||||
*/
|
||||
export function useThemeConfig<T = ThemeConfig>() {
|
||||
const config = useConfig<T>()
|
||||
return computed(() => config!.value.themeConfig)
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
export * from './config'
|
|
@ -0,0 +1,25 @@
|
|||
<script lang="ts" setup>
|
||||
import { useRouter } from 'vue-router'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
const router = useRouter()
|
||||
const { t } = useI18n()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Layout>
|
||||
<template #content>
|
||||
<div text="center">
|
||||
<div text-4xl>
|
||||
<div i-ri-alarm-warning-line inline-block />
|
||||
</div>
|
||||
<RouterView />
|
||||
<div>
|
||||
<button btn text-sm m="3 t8" @click="router.back()">
|
||||
{{ t('button.back') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</Layout>
|
||||
</template>
|
|
@ -0,0 +1,5 @@
|
|||
<template>
|
||||
<Layout>
|
||||
<RouterView />
|
||||
</Layout>
|
||||
</template>
|
|
@ -0,0 +1,11 @@
|
|||
<template>
|
||||
<Layout>
|
||||
<div class="divide-y divide-gray-200 dark:divide-gray-700">
|
||||
<StarterHeader />
|
||||
|
||||
<slot>
|
||||
<RouterView />
|
||||
</slot>
|
||||
</div>
|
||||
</Layout>
|
||||
</template>
|
|
@ -0,0 +1,5 @@
|
|||
<template>
|
||||
<StarterArticle>
|
||||
<RouterView />
|
||||
</StarterArticle>
|
||||
</template>
|
|
@ -0,0 +1 @@
|
|||
valaxy_theme_starter: Valaxy Theme Starter
|
|
@ -0,0 +1 @@
|
|||
valaxy_theme_starter: Valaxy 主题 Starter
|
|
@ -0,0 +1,70 @@
|
|||
import type { Plugin } from 'vite'
|
||||
import type { ResolvedValaxyOptions } from 'valaxy'
|
||||
import type { ThemeConfig } from '../types'
|
||||
|
||||
/**
|
||||
* Default Config
|
||||
*/
|
||||
export const defaultThemeConfig: ThemeConfig = {
|
||||
colors: {
|
||||
primary: '#0078E7',
|
||||
},
|
||||
|
||||
footer: {
|
||||
since: 2022,
|
||||
icon: {
|
||||
name: 'i-ri-cloud-line',
|
||||
animated: true,
|
||||
color: 'var(--va-c-primary)',
|
||||
url: 'https://sponsors.yunyoujun.cn',
|
||||
title: 'Sponsor YunYouJun',
|
||||
},
|
||||
|
||||
powered: true,
|
||||
|
||||
beian: {
|
||||
enable: false,
|
||||
icp: '',
|
||||
},
|
||||
},
|
||||
|
||||
nav: [],
|
||||
}
|
||||
|
||||
// write a vite plugin
|
||||
// https://vitejs.dev/guide/api-plugin.html
|
||||
export function themePlugin(options: ResolvedValaxyOptions<ThemeConfig>): Plugin {
|
||||
const themeConfig = options.config.themeConfig || {}
|
||||
|
||||
return {
|
||||
name: 'valaxy-theme-starter',
|
||||
|
||||
config() {
|
||||
return {
|
||||
css: {
|
||||
preprocessorOptions: {
|
||||
scss: {
|
||||
additionalData: `$c-primary: ${themeConfig.colors?.primary || '#0078E7'} !default;`,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
valaxy: {},
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* generateSafelist by config
|
||||
* @param themeConfig
|
||||
*/
|
||||
export function generateSafelist(themeConfig: ThemeConfig) {
|
||||
const safelist: string[] = []
|
||||
|
||||
const footerIcon = themeConfig.footer?.icon?.name
|
||||
if (footerIcon)
|
||||
safelist.push(footerIcon)
|
||||
|
||||
return safelist
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
{
|
||||
"name": "valaxy-theme-custom",
|
||||
"version": "0.0.0",
|
||||
"packageManager": "pnpm@8.15.1",
|
||||
"author": {
|
||||
"email": "me@yunyoujun.cn",
|
||||
"name": "YunYouJun",
|
||||
"url": "https://www.yunyoujun.cn"
|
||||
},
|
||||
"homepage": "https://starter.valaxy.site",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/YunYouJun/valaxy-theme-starter"
|
||||
},
|
||||
"keywords": [
|
||||
"valaxy",
|
||||
"theme",
|
||||
"starter",
|
||||
"vue"
|
||||
],
|
||||
"main": "client/index.ts",
|
||||
"types": "types/index.d.ts",
|
||||
"dependencies": {
|
||||
"@iconify-json/ant-design": "^1.1.15",
|
||||
"@iconify-json/simple-icons": "^1.1.91"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
<template>
|
||||
<StarterPostList />
|
||||
</template>
|
||||
|
||||
<route lang="yaml">
|
||||
# default is home
|
||||
meta:
|
||||
layout: home
|
||||
</route>
|
|
@ -0,0 +1,21 @@
|
|||
@use "./vars" as *;
|
||||
@use "valaxy/client/styles/mixins/index.scss" as * with ($namespace: "st");
|
||||
|
||||
:root {
|
||||
--un-prose-links: var(--st-c-link);
|
||||
|
||||
@include set-css-var-from-map($common);
|
||||
@include set-css-var-from-map($z-index, "z");
|
||||
}
|
||||
|
||||
:root {
|
||||
@include set-css-var-from-map($light);
|
||||
}
|
||||
|
||||
html.dark {
|
||||
@include set-css-var-from-map($dark);
|
||||
}
|
||||
|
||||
:root {
|
||||
--va-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
@use './layout' as *;
|
||||
@use './markdown' as *;
|
|
@ -0,0 +1,11 @@
|
|||
.link {
|
||||
color: var(--st-c-brand);
|
||||
}
|
||||
|
||||
html {
|
||||
color: var(--st-c-text);
|
||||
}
|
||||
|
||||
.st-text {
|
||||
color: var(--st-c-text);
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
@use "valaxy/client/styles/mixins/index.scss" as *;
|
||||
|
||||
@use "valaxy/client/styles/components/code-group.scss" as *;
|
||||
@use "valaxy/client/styles/components/custom-block.scss" as *;
|
||||
|
||||
.markdown-body {
|
||||
--c-toc-link: var(--va-c-text-light);
|
||||
}
|
||||
|
||||
html.dark {
|
||||
.markdown-body {
|
||||
--c-toc-link: var(--va-c-text-dark);
|
||||
}
|
||||
}
|
||||
|
||||
.markdown-body {
|
||||
word-wrap: break-word;
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
font-family: var(--va-font-family-base);
|
||||
font-weight: 900;
|
||||
}
|
||||
|
||||
ul {
|
||||
li>p {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 16px 0;
|
||||
border-left: 4px solid var(--va-c-divider);
|
||||
padding-left: 12px;
|
||||
transition: border-color .5s
|
||||
|
||||
p {
|
||||
margin: 0;
|
||||
font-size: 16px;
|
||||
color: var(--vp-c-text-2);
|
||||
transition: color .5s;
|
||||
}
|
||||
}
|
||||
|
||||
code:not(pre > code) {
|
||||
color: var(--va-c-text-code);
|
||||
background-color: var(--va-c-bg-mute);
|
||||
padding: 3px 6px;
|
||||
border-radius: 4px;
|
||||
font-weight: 500;
|
||||
|
||||
&::before {
|
||||
content: none;
|
||||
}
|
||||
|
||||
&::after {
|
||||
content: none;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
@use "sass:map";
|
||||
|
||||
// common
|
||||
$common: () !default;
|
||||
$common: map.merge((), $common);
|
||||
|
||||
// palette
|
||||
$light: (
|
||||
"c-brand": #3e88f6,
|
||||
"c-link": "var(--st-c-brand)",
|
||||
|
||||
"c-text": #101820,
|
||||
) !default;
|
||||
$light: map.merge((), $light);
|
||||
|
||||
$dark: (
|
||||
"c-text": #f0f8ff,
|
||||
) !default;
|
||||
$dark: map.merge((), $dark);
|
||||
|
||||
$z-index: () !default;
|
||||
$z-index: map.merge((), $z-index);
|
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
// we need tsconfig.json to compile without
|
||||
// error: This is likely not portable. A type annotation is necessary.
|
||||
"compilerOptions": {
|
||||
"target": "ESNext",
|
||||
"jsx": "preserve",
|
||||
"lib": ["DOM", "ESNext"],
|
||||
"baseUrl": ".",
|
||||
"module": "ESNext",
|
||||
"moduleResolution": "node",
|
||||
"resolveJsonModule": true,
|
||||
"types": [
|
||||
"vite/client",
|
||||
"vite-plugin-vue-layouts/client"
|
||||
],
|
||||
"allowJs": true,
|
||||
"strict": true,
|
||||
"strictNullChecks": true,
|
||||
"noUnusedLocals": true,
|
||||
"esModuleInterop": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"skipLibCheck": true
|
||||
},
|
||||
"exclude": ["**/dist/**", "node_modules"]
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
export namespace StarterTheme {
|
||||
export type Config = ThemeConfig
|
||||
export type Sidebar = any
|
||||
}
|
||||
|
||||
/**
|
||||
* Theme Config
|
||||
*/
|
||||
export interface ThemeConfig {
|
||||
colors: {
|
||||
/**
|
||||
* primary color
|
||||
* @default '#0078E7'
|
||||
*/
|
||||
primary: string
|
||||
}
|
||||
|
||||
/**
|
||||
* footer
|
||||
*/
|
||||
footer: Partial<{
|
||||
/**
|
||||
* 建站于
|
||||
*/
|
||||
since: number
|
||||
|
||||
/**
|
||||
* Icon between year and copyright info.
|
||||
*/
|
||||
icon: {
|
||||
/**
|
||||
* icon name, i-xxx
|
||||
*/
|
||||
name: string
|
||||
animated: boolean
|
||||
color: string
|
||||
url: string
|
||||
title: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Powered by valaxy & valaxy-theme-${name}, default is yun
|
||||
*/
|
||||
powered: boolean
|
||||
|
||||
/**
|
||||
* Chinese Users | 中国用户
|
||||
* 备案 ICP
|
||||
* 国内用户需要在网站页脚展示备案 ICP 号
|
||||
* https://beian.miit.gov.cn/
|
||||
*/
|
||||
beian: {
|
||||
enable: boolean
|
||||
/**
|
||||
* 苏ICP备xxxxxxxx号
|
||||
*/
|
||||
icp: string
|
||||
}
|
||||
}>
|
||||
|
||||
/**
|
||||
* navbar
|
||||
*/
|
||||
nav: NavItem[]
|
||||
}
|
||||
|
||||
export interface NavItem {
|
||||
text: string
|
||||
link: string
|
||||
icon?: string
|
||||
}
|
||||
|
||||
export type ThemeUserConfig = Partial<ThemeConfig>
|
|
@ -0,0 +1,15 @@
|
|||
import { defineTheme } from 'valaxy'
|
||||
import { defaultThemeConfig, generateSafelist, themePlugin } from './node'
|
||||
import type { ThemeConfig } from './types'
|
||||
|
||||
export default defineTheme<ThemeConfig>((options) => {
|
||||
return {
|
||||
themeConfig: defaultThemeConfig,
|
||||
vite: {
|
||||
plugins: [themePlugin(options)],
|
||||
},
|
||||
unocss: {
|
||||
safelist: generateSafelist(options.config.themeConfig as ThemeConfig),
|
||||
},
|
||||
}
|
||||
})
|
|
@ -0,0 +1,51 @@
|
|||
import { defineValaxyConfig } from 'valaxy'
|
||||
import type { UserThemeConfig } from 'valaxy-theme-yun'
|
||||
|
||||
// add icons what you will need
|
||||
const safelist = [
|
||||
'i-ri-home-line',
|
||||
]
|
||||
|
||||
/**
|
||||
* User Config
|
||||
*/
|
||||
export default defineValaxyConfig<UserThemeConfig>({
|
||||
// site config see site.config.ts
|
||||
|
||||
theme: 'custom',
|
||||
|
||||
themeConfig: {
|
||||
banner: {
|
||||
enable: true,
|
||||
title: '云游君的小站',
|
||||
cloud: {
|
||||
enable: true,
|
||||
},
|
||||
},
|
||||
|
||||
pages: [
|
||||
{
|
||||
name: '我的小伙伴们',
|
||||
url: '/links/',
|
||||
icon: 'i-ri-genderless-line',
|
||||
color: 'dodgerblue',
|
||||
},
|
||||
{
|
||||
name: '喜欢的女孩子',
|
||||
url: '/girls/',
|
||||
icon: 'i-ri-women-line',
|
||||
color: 'hotpink',
|
||||
},
|
||||
],
|
||||
|
||||
footer: {
|
||||
since: 2016,
|
||||
beian: {
|
||||
enable: true,
|
||||
icp: '苏ICP备17038157号',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
unocss: { safelist },
|
||||
})
|
|
@ -20,7 +20,7 @@
|
|||
"valaxy-theme-press": "link:../packages/valaxy-theme-press"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@iconify-json/simple-icons": "^1.1.90",
|
||||
"@iconify-json/simple-icons": "^1.1.91",
|
||||
"nodemon": "^3.0.3",
|
||||
"vite": "^5.1.1",
|
||||
"vitepress": "1.0.0-rc.42"
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
"build:devtools": "pnpm -C packages/devtools run build",
|
||||
"ci": "pnpm run build && pnpm -C demo/yun run fuse && pnpm build:create-valaxy && node packages/create-valaxy/dist/index.mjs -y",
|
||||
"ci:publish": "pnpm -r publish --access public --no-git-checks",
|
||||
"custom": "pnpm -C demo/custom run dev",
|
||||
"demo": "pnpm run demo:yun",
|
||||
"demo:build": "pnpm -C demo/yun run build",
|
||||
"demo:serve": "pnpm -C demo/yun run serve",
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
"dependencies": {
|
||||
"@explosions/fireworks": "^0.0.2",
|
||||
"@iconify-json/ant-design": "^1.1.15",
|
||||
"@iconify-json/simple-icons": "^1.1.90",
|
||||
"@iconify-json/simple-icons": "^1.1.91",
|
||||
"animejs": "^3.2.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
|
@ -65,7 +65,7 @@
|
|||
"dependencies": {
|
||||
"@antfu/utils": "^0.7.7",
|
||||
"@ctrl/tinycolor": "^4.0.3",
|
||||
"@iconify-json/carbon": "^1.1.29",
|
||||
"@iconify-json/carbon": "^1.1.30",
|
||||
"@iconify-json/ri": "^1.1.19",
|
||||
"@intlify/unplugin-vue-i18n": "^2.0.0",
|
||||
"@types/body-scroll-lock": "^3.1.2",
|
||||
|
|
|
@ -139,6 +139,19 @@ importers:
|
|||
specifier: ^7.2.3
|
||||
version: 7.2.3
|
||||
|
||||
demo/custom:
|
||||
dependencies:
|
||||
valaxy:
|
||||
specifier: 0.18.0-beta.0
|
||||
version: link:../../packages/valaxy
|
||||
valaxy-theme-custom:
|
||||
specifier: ./valaxy-theme-custom
|
||||
version: link:valaxy-theme-custom
|
||||
devDependencies:
|
||||
typescript:
|
||||
specifier: ^5.3.3
|
||||
version: 5.3.3
|
||||
|
||||
demo/yun:
|
||||
dependencies:
|
||||
valaxy:
|
||||
|
@ -189,8 +202,8 @@ importers:
|
|||
version: link:../packages/valaxy-theme-press
|
||||
devDependencies:
|
||||
'@iconify-json/simple-icons':
|
||||
specifier: ^1.1.90
|
||||
version: 1.1.90
|
||||
specifier: ^1.1.91
|
||||
version: 1.1.91
|
||||
nodemon:
|
||||
specifier: ^3.0.3
|
||||
version: 3.0.3
|
||||
|
@ -247,8 +260,8 @@ importers:
|
|||
specifier: ^4.0.3
|
||||
version: 4.0.3
|
||||
'@iconify-json/carbon':
|
||||
specifier: ^1.1.29
|
||||
version: 1.1.29
|
||||
specifier: ^1.1.30
|
||||
version: 1.1.30
|
||||
'@iconify-json/ri':
|
||||
specifier: ^1.1.19
|
||||
version: 1.1.19
|
||||
|
@ -576,8 +589,8 @@ importers:
|
|||
specifier: ^1.1.15
|
||||
version: 1.1.15
|
||||
'@iconify-json/simple-icons':
|
||||
specifier: ^1.1.90
|
||||
version: 1.1.90
|
||||
specifier: ^1.1.91
|
||||
version: 1.1.91
|
||||
animejs:
|
||||
specifier: ^3.2.2
|
||||
version: 3.2.2
|
||||
|
@ -1728,8 +1741,8 @@ packages:
|
|||
'@iconify/types': 2.0.0
|
||||
dev: false
|
||||
|
||||
/@iconify-json/carbon@1.1.29:
|
||||
resolution: {integrity: sha512-zfyvX/kPItpBEU0fV0FhMW8Ln8PJX6is/L/GX7z9OOoVWEz1k8IlbK3KoBBH6ODZ8HHKG7HQ9FZ4nNl6RDe0Lw==}
|
||||
/@iconify-json/carbon@1.1.30:
|
||||
resolution: {integrity: sha512-tEvEmxCO0J0t0p2NT2IvJ+iiSNqqnabygSo/S8wkeh2Guhc4tQOgl9dxvDMpy6RqwtKRTKsaROPtnRfu/bl+Tg==}
|
||||
dependencies:
|
||||
'@iconify/types': 2.0.0
|
||||
dev: false
|
||||
|
@ -1746,8 +1759,8 @@ packages:
|
|||
'@iconify/types': 2.0.0
|
||||
dev: false
|
||||
|
||||
/@iconify-json/simple-icons@1.1.90:
|
||||
resolution: {integrity: sha512-IYDCQD3VJ5verAwWwMgnbJ6SvPzEqH0SG6JsI2ySuI64d7qVbcJMFycc0kGPfSsi2yAPYHk+tD6Iln17y1MuNA==}
|
||||
/@iconify-json/simple-icons@1.1.91:
|
||||
resolution: {integrity: sha512-hFWxeQWjCh26nObKnEm+AMB5W+bh4pXtmT3PnecS7rP2Crh0AHi5QBHPtH+6L8R6xZtBk5I2TLoA0TRzCgrF8A==}
|
||||
dependencies:
|
||||
'@iconify/types': 2.0.0
|
||||
|
||||
|
|
Loading…
Reference in New Issue