Skip to content

Commit e6fc35e

Browse files
committed
feat: title and favicon
1 parent c0dd298 commit e6fc35e

File tree

6 files changed

+29
-11
lines changed

6 files changed

+29
-11
lines changed

packages/client/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<head>
44
<meta charset="UTF-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<link rel="icon" type="image/png" href="https://raw.githubusercontent.com/slidevjs/slidev/main/assets/favicon.png">
67
<!-- head -->
78
</head>
89
<body>

packages/client/internals/Presenter.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ import { showOverview } from '../state'
55
import SlideContainer from './SlideContainer.vue'
66
import NavControls from './NavControls.vue'
77
import SlidesOverview from './SlidesOverview.vue'
8+
// @ts-expect-error
9+
import configs from '/@slidev/configs'
810
911
useHead({
10-
title: 'Presenter Mode',
12+
title: configs.title ? `Presenter - ${configs.title} - Slidev` : 'Presenter - Slidev',
1113
})
1214
1315
const controls = useNavigateControls()
@@ -17,7 +19,7 @@ const controls = useNavigateControls()
1719
<div class="grid-container">
1820
<div class="grid-section top flex">
1921
<div class="px-6 my-auto">
20-
{{ controls.currentPage.value + 1}} / {{ controls.routes.length }}
22+
{{ controls.currentPage.value + 1 }} / {{ controls.routes.length }}
2123
</div>
2224
<div class="flex-auto" />
2325
<NavControls mode="persist" />

packages/client/routes.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,6 @@ export const routes: RouteRecordRaw[] = [
2020
...rawRoutes,
2121
],
2222
},
23+
{ path: '', redirect: { path: '/0' } },
24+
{ path: '/presenter', redirect: { path: '/presenter/0' } },
2325
]

packages/client/setup/app.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
/* __imports__ */
22
import { useHead } from '@vueuse/head'
3+
// @ts-expect-error
4+
import configs from '/@slidev/configs'
35

46
export default function setupApp() {
57
/* __injections__ */
68
useHead({
7-
title: 'Slidev',
9+
title: configs.title ? `${configs.title} - Slidev` : 'Slidev',
810
})
911
}

packages/slidev/node/parser.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,17 @@ export interface ParseOptions {
2020
enabledMonaco?: boolean
2121
}
2222

23+
export interface SlidevConfig {
24+
title: string
25+
theme: string
26+
}
27+
2328
export interface SlidesMarkdown {
2429
filepath?: string
2530
slides: SlidesMarkdownInfo[]
2631
options: ParseOptions
2732
raw: string
33+
config: SlidevConfig
2834
}
2935

3036
export async function load(
@@ -128,14 +134,17 @@ export function parse(
128134
})
129135
}
130136

131-
// make the first slide use cover layout by default
132-
if (slides[0])
133-
slides[0].frontmatter.layout ||= 'cover'
137+
const headmatter = slides?.[0].frontmatter || {}
138+
const config: SlidevConfig = Object.assign({}, headmatter.config || {})
139+
140+
config.theme ||= headmatter.theme || '@slidev/theme-default'
141+
config.title ||= headmatter.title || (markdown.match(/^# (.*)$/m)?.[1] || '').trim()
134142

135143
return {
136144
raw: markdown,
137145
filepath,
138146
slides,
139147
options,
148+
config,
140149
}
141150
}

packages/slidev/node/plugins/slides.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,6 @@ export function createSlidesLoader({ entry, clientRoot, themeRoot, userRoot }: R
8888
return res.end()
8989
}
9090

91-
// console.log(`Hello from ${req.url} ${req.method}`)
92-
9391
next()
9492
})
9593
},
@@ -104,6 +102,7 @@ export function createSlidesLoader({ entry, clientRoot, themeRoot, userRoot }: R
104102

105103
const moduleEntries = [
106104
'/@slidev/routes',
105+
'/@slidev/configs',
107106
...data.slides.map((i, idx) => `${entry}?id=${idx}.md`),
108107
...data.slides.map((i, idx) => `${entry}?id=${idx}.json`),
109108
]
@@ -126,10 +125,14 @@ export function createSlidesLoader({ entry, clientRoot, themeRoot, userRoot }: R
126125
if (id === '/@slidev/routes')
127126
return generateRoutes()
128127

129-
// routes
128+
// layouts
130129
if (id === '/@slidev/layouts')
131130
return generateLayouts()
132131

132+
// configs
133+
if (id === '/@slidev/configs')
134+
return `export default ${JSON.stringify(data.config)}`
135+
133136
// pages
134137
if (id.startsWith(entry)) {
135138
const remaning = id.slice(entry.length + 1)
@@ -160,7 +163,7 @@ export function createSlidesLoader({ entry, clientRoot, themeRoot, userRoot }: R
160163

161164
const layouts = await getLayouts()
162165
const pageNo = parseInt(no)
163-
const layoutName = data.slides[pageNo].frontmatter?.layout || 'default'
166+
const layoutName = data.slides[pageNo].frontmatter?.layout || (pageNo === 0 ? 'cover' : 'default')
164167
if (!layouts[layoutName])
165168
throw new Error(`Unknown layout "${layoutName}"`)
166169

@@ -229,7 +232,6 @@ export function createSlidesLoader({ entry, clientRoot, themeRoot, userRoot }: R
229232

230233
let no = 0
231234
const routes = [
232-
'{ path: "", redirect: { path: "/0" } }',
233235
...data.slides
234236
.map((i, idx) => {
235237
if (i.frontmatter?.disabled)

0 commit comments

Comments
 (0)