create-vike 0.0.320 → 0.0.322
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.testRun.ts +32 -6
- package/boilerplate-react/package.json +3 -2
- package/boilerplate-react/pages/_error/+Page.jsx +27 -20
- package/boilerplate-react/pages/index/+Page.jsx +2 -2
- package/boilerplate-react/pages/index/Counter.jsx +2 -2
- package/boilerplate-react/pages/star-wars/@id/+Page.jsx +17 -0
- package/boilerplate-react/pages/star-wars/@id/+data.js +33 -0
- package/boilerplate-react/pages/star-wars/index/+Page.jsx +25 -0
- package/boilerplate-react/pages/star-wars/index/+data.js +35 -0
- package/boilerplate-react/renderer/+config.h.js +13 -5
- package/boilerplate-react/renderer/+onPageTransitionEnd.js +7 -0
- package/boilerplate-react/renderer/+onPageTransitionStart.js +7 -0
- package/boilerplate-react/renderer/+onRenderClient.jsx +24 -11
- package/boilerplate-react/renderer/+onRenderHtml.jsx +11 -8
- package/boilerplate-react/renderer/Link.jsx +4 -1
- package/boilerplate-react/renderer/PageShell.css +4 -16
- package/boilerplate-react/renderer/PageShell.jsx +24 -23
- package/boilerplate-react/renderer/css/code.css +6 -0
- package/boilerplate-react/renderer/css/index.css +4 -0
- package/boilerplate-react/renderer/css/links.css +3 -0
- package/boilerplate-react/renderer/css/page-transition-loading-animation/loading.svg +5 -0
- package/boilerplate-react/renderer/css/page-transition-loading-animation.css +26 -0
- package/boilerplate-react/renderer/css/reset.css +7 -0
- package/boilerplate-react/renderer/getPageTitle.js +12 -0
- package/boilerplate-react/renderer/useData.js +10 -0
- package/boilerplate-react/renderer/usePageContext.jsx +5 -6
- package/boilerplate-react/server/index.js +3 -0
- package/boilerplate-react-ts/package.json +3 -2
- package/boilerplate-react-ts/pages/_error/+Page.tsx +27 -15
- package/boilerplate-react-ts/pages/index/+Page.tsx +2 -2
- package/boilerplate-react-ts/pages/index/Counter.tsx +2 -2
- package/boilerplate-react-ts/pages/star-wars/@id/+Page.tsx +18 -0
- package/boilerplate-react-ts/pages/star-wars/@id/+data.ts +36 -0
- package/boilerplate-react-ts/pages/star-wars/index/+Page.tsx +26 -0
- package/boilerplate-react-ts/pages/star-wars/index/+data.ts +38 -0
- package/boilerplate-react-ts/pages/star-wars/types.ts +12 -0
- package/boilerplate-react-ts/renderer/+config.h.ts +13 -5
- package/boilerplate-react-ts/renderer/+onPageTransitionEnd.ts +9 -0
- package/boilerplate-react-ts/renderer/+onPageTransitionStart.ts +9 -0
- package/boilerplate-react-ts/renderer/+onRenderClient.tsx +23 -10
- package/boilerplate-react-ts/renderer/+onRenderHtml.tsx +10 -7
- package/boilerplate-react-ts/renderer/Link.tsx +5 -2
- package/boilerplate-react-ts/renderer/PageShell.css +4 -16
- package/boilerplate-react-ts/renderer/PageShell.tsx +23 -22
- package/boilerplate-react-ts/renderer/css/code.css +6 -0
- package/boilerplate-react-ts/renderer/css/index.css +4 -0
- package/boilerplate-react-ts/renderer/css/links.css +3 -0
- package/boilerplate-react-ts/renderer/css/page-transition-loading-animation/loading.svg +5 -0
- package/boilerplate-react-ts/renderer/css/page-transition-loading-animation.css +26 -0
- package/boilerplate-react-ts/renderer/css/reset.css +7 -0
- package/boilerplate-react-ts/renderer/getPageTitle.ts +14 -0
- package/boilerplate-react-ts/renderer/types.ts +16 -12
- package/boilerplate-react-ts/renderer/useData.ts +10 -0
- package/boilerplate-react-ts/renderer/usePageContext.tsx +5 -6
- package/boilerplate-react-ts/server/index.ts +3 -0
- package/boilerplate-vue/package.json +2 -1
- package/boilerplate-vue/pages/_error/+Page.vue +19 -8
- package/boilerplate-vue/pages/star-wars/@id/+Page.vue +13 -0
- package/boilerplate-vue/pages/star-wars/@id/+data.js +33 -0
- package/boilerplate-vue/pages/star-wars/index/+Page.vue +15 -0
- package/boilerplate-vue/pages/star-wars/index/+data.js +34 -0
- package/boilerplate-vue/renderer/+config.h.js +13 -5
- package/boilerplate-vue/renderer/+onPageTransitionEnd.js +7 -0
- package/boilerplate-vue/renderer/+onPageTransitionStart.js +7 -0
- package/boilerplate-vue/renderer/+onRenderClient.js +13 -6
- package/boilerplate-vue/renderer/+onRenderHtml.js +8 -8
- package/boilerplate-vue/renderer/Link.vue +10 -2
- package/boilerplate-vue/renderer/PageShell.vue +17 -19
- package/boilerplate-vue/renderer/app.js +31 -10
- package/boilerplate-vue/renderer/css/code.css +6 -0
- package/boilerplate-vue/renderer/css/index.css +4 -0
- package/boilerplate-vue/renderer/css/links.css +3 -0
- package/boilerplate-vue/renderer/css/page-transition-loading-animation/loading.svg +5 -0
- package/boilerplate-vue/renderer/css/page-transition-loading-animation.css +26 -0
- package/boilerplate-vue/renderer/css/reset.css +7 -0
- package/boilerplate-vue/renderer/getPageTitle.js +12 -0
- package/boilerplate-vue/renderer/useData.js +11 -0
- package/boilerplate-vue/renderer/usePageContext.js +5 -5
- package/boilerplate-vue/server/index.js +3 -0
- package/boilerplate-vue-ts/package.json +2 -1
- package/boilerplate-vue-ts/pages/_error/+Page.vue +19 -8
- package/boilerplate-vue-ts/pages/star-wars/@id/+Page.vue +14 -0
- package/boilerplate-vue-ts/pages/star-wars/@id/+data.ts +36 -0
- package/boilerplate-vue-ts/pages/star-wars/index/+Page.vue +16 -0
- package/boilerplate-vue-ts/pages/star-wars/index/+data.ts +37 -0
- package/boilerplate-vue-ts/pages/star-wars/types.ts +12 -0
- package/boilerplate-vue-ts/renderer/+config.h.ts +13 -5
- package/boilerplate-vue-ts/renderer/+onPageTransitionEnd.ts +9 -0
- package/boilerplate-vue-ts/renderer/+onPageTransitionStart.ts +9 -0
- package/boilerplate-vue-ts/renderer/+onRenderClient.ts +13 -6
- package/boilerplate-vue-ts/renderer/+onRenderHtml.ts +8 -8
- package/boilerplate-vue-ts/renderer/Link.vue +10 -2
- package/boilerplate-vue-ts/renderer/PageShell.vue +17 -19
- package/boilerplate-vue-ts/renderer/app.ts +38 -9
- package/boilerplate-vue-ts/renderer/css/code.css +6 -0
- package/boilerplate-vue-ts/renderer/css/index.css +4 -0
- package/boilerplate-vue-ts/renderer/css/links.css +3 -0
- package/boilerplate-vue-ts/renderer/css/page-transition-loading-animation/loading.svg +5 -0
- package/boilerplate-vue-ts/renderer/css/page-transition-loading-animation.css +26 -0
- package/boilerplate-vue-ts/renderer/css/reset.css +7 -0
- package/boilerplate-vue-ts/renderer/getPageTitle.ts +14 -0
- package/boilerplate-vue-ts/renderer/types.ts +18 -14
- package/boilerplate-vue-ts/renderer/useData.ts +11 -0
- package/boilerplate-vue-ts/renderer/usePageContext.ts +5 -6
- package/boilerplate-vue-ts/server/index.ts +3 -0
- package/package.json +1 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// https://vike.dev/data
|
|
2
|
+
export { data }
|
|
3
|
+
export type Data = Awaited<ReturnType<typeof data>>
|
|
4
|
+
|
|
5
|
+
// The node-fetch package (which only works on the server-side) can be used since
|
|
6
|
+
// this file always runs on the server-side, see https://vike.dev/data#server-side
|
|
7
|
+
import fetch from 'node-fetch'
|
|
8
|
+
import type { MovieDetails, Movie } from '../types'
|
|
9
|
+
import type { PageContextServer } from 'vike/types'
|
|
10
|
+
|
|
11
|
+
const data = async (pageContext: PageContextServer) => {
|
|
12
|
+
await sleep(700) // Simulate slow network
|
|
13
|
+
|
|
14
|
+
const response = await fetch('https://brillout.github.io/star-wars/api/films.json')
|
|
15
|
+
const moviesData = (await response.json()) as MovieDetails[]
|
|
16
|
+
|
|
17
|
+
// We remove data we don't need because the data is passed to the client; we should
|
|
18
|
+
// minimize what is sent over the network.
|
|
19
|
+
const movies = minimize(moviesData)
|
|
20
|
+
|
|
21
|
+
return {
|
|
22
|
+
movies,
|
|
23
|
+
// The page's <title>
|
|
24
|
+
title: `${movies.length} Star Wars Movies`
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function minimize(movies: MovieDetails[]): Movie[] {
|
|
29
|
+
return movies.map((movie) => {
|
|
30
|
+
const { title, release_date, id } = movie
|
|
31
|
+
return { title, release_date, id }
|
|
32
|
+
})
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function sleep(milliseconds: number) {
|
|
36
|
+
return new Promise((r) => setTimeout(r, milliseconds))
|
|
37
|
+
}
|
|
@@ -2,10 +2,18 @@ import type { Config } from 'vike/types'
|
|
|
2
2
|
|
|
3
3
|
// https://vike.dev/config
|
|
4
4
|
export default {
|
|
5
|
-
|
|
5
|
+
// https://vike.dev/clientRouting
|
|
6
6
|
clientRouting: true,
|
|
7
|
-
//
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
// https://vike.dev/meta
|
|
8
|
+
meta: {
|
|
9
|
+
// Define new setting 'title'
|
|
10
|
+
title: {
|
|
11
|
+
env: { server: true, client: true }
|
|
12
|
+
},
|
|
13
|
+
// Define new setting 'description'
|
|
14
|
+
description: {
|
|
15
|
+
env: { server: true }
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
hydrationCanBeAborted: true
|
|
11
19
|
} satisfies Config
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// https://vike.dev/onPageTransitionEnd
|
|
2
|
+
export { onPageTransitionEnd }
|
|
3
|
+
|
|
4
|
+
import type { OnPageTransitionEndAsync } from 'vike/types'
|
|
5
|
+
|
|
6
|
+
const onPageTransitionEnd: OnPageTransitionEndAsync = async (): ReturnType<OnPageTransitionEndAsync> => {
|
|
7
|
+
console.log('Page transition end')
|
|
8
|
+
document.querySelector('body')!.classList.remove('page-is-transitioning')
|
|
9
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// https://vike.dev/onPageTransitionStart
|
|
2
|
+
export { onPageTransitionStart }
|
|
3
|
+
|
|
4
|
+
import type { OnPageTransitionStartAsync } from 'vike/types'
|
|
5
|
+
|
|
6
|
+
const onPageTransitionStart: OnPageTransitionStartAsync = async (): ReturnType<OnPageTransitionStartAsync> => {
|
|
7
|
+
console.log('Page transition start')
|
|
8
|
+
document.querySelector('body')!.classList.add('page-is-transitioning')
|
|
9
|
+
}
|
|
@@ -2,13 +2,20 @@
|
|
|
2
2
|
export { onRenderClient }
|
|
3
3
|
|
|
4
4
|
import { createApp } from './app'
|
|
5
|
+
import { getPageTitle } from './getPageTitle'
|
|
5
6
|
import type { OnRenderClientAsync } from 'vike/types'
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
// to support SPA
|
|
8
|
+
let app: ReturnType<typeof createApp>
|
|
9
9
|
const onRenderClient: OnRenderClientAsync = async (pageContext): ReturnType<OnRenderClientAsync> => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
// This onRenderClient() hook only supports SSR, see https://vike.dev/render-modes for how to modify onRenderClient()
|
|
11
|
+
// to support SPA
|
|
12
|
+
if (!pageContext.Page) throw new Error('My onRenderClient() hook expects pageContext.Page to be defined')
|
|
13
|
+
|
|
14
|
+
if (!app) {
|
|
15
|
+
app = createApp(pageContext)
|
|
16
|
+
app.mount('#app')
|
|
17
|
+
} else {
|
|
18
|
+
app.changePage(pageContext)
|
|
19
|
+
}
|
|
20
|
+
document.title = getPageTitle(pageContext)
|
|
14
21
|
}
|
|
@@ -7,20 +7,20 @@ import { escapeInject, dangerouslySkipEscape } from 'vike/server'
|
|
|
7
7
|
import { createApp } from './app'
|
|
8
8
|
import logoUrl from './logo.svg'
|
|
9
9
|
import type { OnRenderHtmlAsync } from 'vike/types'
|
|
10
|
+
import { getPageTitle } from './getPageTitle'
|
|
10
11
|
|
|
11
12
|
const onRenderHtml: OnRenderHtmlAsync = async (pageContext): ReturnType<OnRenderHtmlAsync> => {
|
|
12
|
-
const { Page, pageProps } = pageContext
|
|
13
13
|
// This onRenderHtml() hook only supports SSR, see https://vike.dev/render-modes for how to modify
|
|
14
14
|
// onRenderHtml() to support SPA
|
|
15
|
-
if (!Page) throw new Error('My render() hook expects pageContext.Page to be defined')
|
|
16
|
-
|
|
15
|
+
if (!pageContext.Page) throw new Error('My render() hook expects pageContext.Page to be defined')
|
|
16
|
+
|
|
17
|
+
const app = createApp(pageContext)
|
|
17
18
|
|
|
18
19
|
const appHtml = await renderToString(app)
|
|
19
20
|
|
|
20
|
-
//
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
const desc = (documentProps && documentProps.description) || 'App using Vite + Vike'
|
|
21
|
+
// https://vike.dev/head
|
|
22
|
+
const title = getPageTitle(pageContext)
|
|
23
|
+
const desc = pageContext.data?.description || pageContext.config.description || 'Demo of using Vike'
|
|
24
24
|
|
|
25
25
|
const documentHtml = escapeInject`<!DOCTYPE html>
|
|
26
26
|
<html lang="en">
|
|
@@ -39,7 +39,7 @@ const onRenderHtml: OnRenderHtmlAsync = async (pageContext): ReturnType<OnRender
|
|
|
39
39
|
return {
|
|
40
40
|
documentHtml,
|
|
41
41
|
pageContext: {
|
|
42
|
-
// We can add
|
|
42
|
+
// We can add custom pageContext properties here, see https://vike.dev/pageContext#custom
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
}
|
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<a :class="{ active:
|
|
2
|
+
<a :class="{ active: isActive }">
|
|
3
3
|
<slot />
|
|
4
4
|
</a>
|
|
5
5
|
</template>
|
|
6
6
|
<style scoped>
|
|
7
7
|
a {
|
|
8
|
-
padding:
|
|
8
|
+
padding: 2px 10px;
|
|
9
|
+
margin-left: -10px;
|
|
9
10
|
}
|
|
10
11
|
a.active {
|
|
11
12
|
background-color: #eee;
|
|
12
13
|
}
|
|
13
14
|
</style>
|
|
14
15
|
<script lang="ts" setup>
|
|
16
|
+
import { useAttrs, computed } from 'vue'
|
|
15
17
|
import { usePageContext } from './usePageContext'
|
|
18
|
+
|
|
16
19
|
const pageContext = usePageContext()
|
|
20
|
+
const { href } = useAttrs() as { href: string }
|
|
21
|
+
const isActive = computed(() => {
|
|
22
|
+
const { urlPathname } = pageContext
|
|
23
|
+
return href === '/' ? urlPathname === href : urlPathname.startsWith(href)
|
|
24
|
+
})
|
|
17
25
|
</script>
|
|
@@ -1,54 +1,52 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div
|
|
3
|
-
<div
|
|
4
|
-
<a href="/"
|
|
2
|
+
<div id="page-container">
|
|
3
|
+
<div id="sidebar">
|
|
4
|
+
<a href="/" id="logo-container">
|
|
5
5
|
<img src="./logo.svg" height="64" width="64" alt="logo" />
|
|
6
6
|
</a>
|
|
7
|
-
<Link href="/">
|
|
7
|
+
<Link href="/">Welcome</Link>
|
|
8
8
|
<Link href="/about">About</Link>
|
|
9
|
+
<Link href="/star-wars">Data Fetching</Link>
|
|
9
10
|
</div>
|
|
10
|
-
<div
|
|
11
|
+
<div id="page-content"><slot /></div>
|
|
11
12
|
</div>
|
|
12
13
|
</template>
|
|
13
14
|
|
|
14
15
|
<script lang="ts" setup>
|
|
15
16
|
import Link from './Link.vue'
|
|
17
|
+
import './css/index.css'
|
|
16
18
|
</script>
|
|
17
19
|
|
|
18
20
|
<style>
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
#sidebar a {
|
|
22
|
+
padding: 2px 10px;
|
|
23
|
+
margin-left: -10px;
|
|
22
24
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
a {
|
|
27
|
-
text-decoration: none;
|
|
25
|
+
#sidebar a.is-active {
|
|
26
|
+
background-color: #eee;
|
|
28
27
|
}
|
|
29
28
|
</style>
|
|
30
29
|
|
|
31
30
|
<style scoped>
|
|
32
|
-
|
|
31
|
+
#page-container {
|
|
33
32
|
display: flex;
|
|
34
33
|
max-width: 900px;
|
|
35
34
|
margin: auto;
|
|
36
35
|
}
|
|
37
|
-
|
|
36
|
+
#page-content {
|
|
38
37
|
padding: 20px;
|
|
39
|
-
border-left: 2px solid #eee;
|
|
40
38
|
padding-bottom: 50px;
|
|
41
39
|
min-height: 100vh;
|
|
42
40
|
}
|
|
43
|
-
|
|
41
|
+
#sidebar {
|
|
44
42
|
padding: 20px;
|
|
45
43
|
flex-shrink: 0;
|
|
46
44
|
display: flex;
|
|
47
45
|
flex-direction: column;
|
|
48
|
-
align-items: center;
|
|
49
46
|
line-height: 1.8em;
|
|
47
|
+
border-right: 2px solid #eee;
|
|
50
48
|
}
|
|
51
|
-
|
|
49
|
+
#logo-container {
|
|
52
50
|
margin-top: 20px;
|
|
53
51
|
margin-bottom: 10px;
|
|
54
52
|
}
|
|
@@ -1,30 +1,59 @@
|
|
|
1
|
-
|
|
1
|
+
export { createApp }
|
|
2
|
+
|
|
3
|
+
import { createSSRApp, defineComponent, h, markRaw, reactive } from 'vue'
|
|
2
4
|
import PageShell from './PageShell.vue'
|
|
5
|
+
import type { Component } from './types'
|
|
3
6
|
import { setPageContext } from './usePageContext'
|
|
4
7
|
import type { PageContext } from 'vike/types'
|
|
5
|
-
import type { Component, PageProps } from './types'
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
function createApp(pageContext: PageContext) {
|
|
10
|
+
const { Page } = pageContext
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
const
|
|
12
|
+
let rootComponent: Component & { Page: Component }
|
|
13
|
+
const PageWithShell = defineComponent({
|
|
14
|
+
data: () => ({
|
|
15
|
+
Page: markRaw(Page)
|
|
16
|
+
}),
|
|
17
|
+
created() {
|
|
18
|
+
rootComponent = this
|
|
19
|
+
},
|
|
11
20
|
render() {
|
|
12
21
|
return h(
|
|
13
22
|
PageShell,
|
|
14
23
|
{},
|
|
15
24
|
{
|
|
16
|
-
default() {
|
|
17
|
-
return h(Page
|
|
25
|
+
default: () => {
|
|
26
|
+
return h(this.Page)
|
|
18
27
|
}
|
|
19
28
|
}
|
|
20
29
|
)
|
|
21
30
|
}
|
|
22
31
|
})
|
|
23
32
|
|
|
24
|
-
const app = createSSRApp(
|
|
33
|
+
const app = createSSRApp(PageWithShell)
|
|
34
|
+
|
|
35
|
+
// We use `app.changePage()` to do Client Routing, see `+onRenderClient.ts`
|
|
36
|
+
objectAssign(app, {
|
|
37
|
+
changePage: (pageContext: PageContext) => {
|
|
38
|
+
Object.assign(pageContextReactive, pageContext)
|
|
39
|
+
rootComponent.Page = markRaw(pageContext.Page)
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
// When doing Client Routing, we mutate pageContext (see usage of `app.changePage()` in `+onRenderClient.ts`).
|
|
44
|
+
// We therefore use a reactive pageContext.
|
|
45
|
+
const pageContextReactive = reactive(pageContext)
|
|
25
46
|
|
|
26
47
|
// Make pageContext available from any Vue component
|
|
27
|
-
setPageContext(app,
|
|
48
|
+
setPageContext(app, pageContextReactive)
|
|
28
49
|
|
|
29
50
|
return app
|
|
30
51
|
}
|
|
52
|
+
|
|
53
|
+
// Same as `Object.assign()` but with type inference
|
|
54
|
+
function objectAssign<Obj extends object, ObjAddendum>(
|
|
55
|
+
obj: Obj,
|
|
56
|
+
objAddendum: ObjAddendum
|
|
57
|
+
): asserts obj is Obj & ObjAddendum {
|
|
58
|
+
Object.assign(obj, objAddendum)
|
|
59
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg version="1.1" id="L9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 100 100" enable-background="new 0 0 0 0" xml:space="preserve">
|
|
2
|
+
<path fill="#aaa" d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50">
|
|
3
|
+
<animateTransform attributeName="transform" attributeType="XML" type="rotate" dur="1s" from="0 50 50" to="360 50 50" repeatCount="indefinite"></animateTransform>
|
|
4
|
+
</path>
|
|
5
|
+
</svg>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#page-container {
|
|
2
|
+
position: relative;
|
|
3
|
+
width: 100%;
|
|
4
|
+
}
|
|
5
|
+
#page-container::before {
|
|
6
|
+
content: '';
|
|
7
|
+
position: absolute;
|
|
8
|
+
width: 100%;
|
|
9
|
+
height: 100%;
|
|
10
|
+
z-index: 999;
|
|
11
|
+
background: no-repeat url('./page-transition-loading-animation/loading.svg');
|
|
12
|
+
background-size: 100px;
|
|
13
|
+
background-position: center center;
|
|
14
|
+
pointer-events: none;
|
|
15
|
+
opacity: 0;
|
|
16
|
+
}
|
|
17
|
+
body.page-is-transitioning #page-container::before {
|
|
18
|
+
opacity: 1;
|
|
19
|
+
}
|
|
20
|
+
#page-content,
|
|
21
|
+
#page-container::before {
|
|
22
|
+
transition: opacity 0.5s ease-in-out;
|
|
23
|
+
}
|
|
24
|
+
body.page-is-transitioning #page-content {
|
|
25
|
+
opacity: 0.17;
|
|
26
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { getPageTitle }
|
|
2
|
+
|
|
3
|
+
import type { PageContext } from 'vike/types'
|
|
4
|
+
|
|
5
|
+
function getPageTitle(pageContext: PageContext): string {
|
|
6
|
+
const title =
|
|
7
|
+
// Title defined dynamically by data()
|
|
8
|
+
pageContext.data?.title ||
|
|
9
|
+
// Title defined statically by /pages/some-page/+title.js (or by `export default { title }` in /pages/some-page/+config.js)
|
|
10
|
+
// The setting 'pageContext.config.title' is a custom setting we defined at ./+config.ts
|
|
11
|
+
pageContext.config.title ||
|
|
12
|
+
'Vike Demo'
|
|
13
|
+
return title
|
|
14
|
+
}
|
|
@@ -1,25 +1,29 @@
|
|
|
1
|
-
export type { PageProps }
|
|
2
1
|
export type { Component }
|
|
3
2
|
|
|
3
|
+
import type { ComponentPublicInstance } from 'vue'
|
|
4
|
+
|
|
5
|
+
type Component = ComponentPublicInstance // https://stackoverflow.com/questions/63985658/how-to-type-vue-instance-out-of-definecomponent-in-vue-3/63986086#63986086
|
|
6
|
+
type Page = Component
|
|
7
|
+
|
|
4
8
|
// https://vike.dev/pageContext#typescript
|
|
5
9
|
declare global {
|
|
6
10
|
namespace Vike {
|
|
7
11
|
interface PageContext {
|
|
8
12
|
Page: Page
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
data?: {
|
|
14
|
+
/** Value for <title> defined dynmically by by /pages/some-page/+data.js */
|
|
15
|
+
title?: string
|
|
16
|
+
/** Value for <meta name="description"> defined dynmically */
|
|
17
|
+
description?: string
|
|
18
|
+
}
|
|
19
|
+
config: {
|
|
20
|
+
/** Value for <title> defined statically by /pages/some-page/+title.js (or by `export default { title }` in /pages/some-page/+config.js) */
|
|
21
|
+
title?: string
|
|
22
|
+
/** Value for <meta name="description"> defined statically */
|
|
23
|
+
description?: string
|
|
16
24
|
}
|
|
25
|
+
/** https://vike.dev/render */
|
|
26
|
+
abortReason?: string
|
|
17
27
|
}
|
|
18
28
|
}
|
|
19
29
|
}
|
|
20
|
-
|
|
21
|
-
import type { ComponentPublicInstance } from 'vue'
|
|
22
|
-
|
|
23
|
-
type Component = ComponentPublicInstance // https://stackoverflow.com/questions/63985658/how-to-type-vue-instance-out-of-definecomponent-in-vue-3/63986086#63986086
|
|
24
|
-
type Page = Component
|
|
25
|
-
type PageProps = {}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// https://vike.dev/useData
|
|
2
|
+
export { useData }
|
|
3
|
+
|
|
4
|
+
import { type ComputedRef, computed } from 'vue'
|
|
5
|
+
import { usePageContext } from './usePageContext'
|
|
6
|
+
|
|
7
|
+
/** https://vike.dev/useData */
|
|
8
|
+
function useData<Data>(): ComputedRef<Data> {
|
|
9
|
+
const data = computed(() => (usePageContext() as { data: Data }).data)
|
|
10
|
+
return data
|
|
11
|
+
}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
//
|
|
2
|
-
|
|
1
|
+
// https://vike.dev/usePageContext
|
|
2
|
+
export { usePageContext }
|
|
3
|
+
export { setPageContext }
|
|
3
4
|
|
|
4
5
|
import { inject } from 'vue'
|
|
5
6
|
import type { App, InjectionKey } from 'vue'
|
|
6
|
-
import { PageContext } from 'vike/types'
|
|
7
|
-
|
|
8
|
-
export { usePageContext }
|
|
9
|
-
export { setPageContext }
|
|
7
|
+
import type { PageContext } from 'vike/types'
|
|
10
8
|
|
|
11
9
|
const key: InjectionKey<PageContext> = Symbol()
|
|
12
10
|
|
|
11
|
+
/** https://vike.dev/usePageContext */
|
|
13
12
|
function usePageContext() {
|
|
14
13
|
const pageContext = inject(key)
|
|
15
14
|
if (!pageContext) throw new Error('setPageContext() not called in parent')
|
|
@@ -55,6 +55,9 @@ async function startServer() {
|
|
|
55
55
|
urlOriginal: req.originalUrl
|
|
56
56
|
}
|
|
57
57
|
const pageContext = await renderPage(pageContextInit)
|
|
58
|
+
if (pageContext.errorWhileRendering) {
|
|
59
|
+
// Install error tracking here, see https://vike.dev/errors
|
|
60
|
+
}
|
|
58
61
|
const { httpResponse } = pageContext
|
|
59
62
|
if (!httpResponse) {
|
|
60
63
|
return next()
|