Skip to content

Commit e31dd28

Browse files
committed
docs: demo!
1 parent 86c1a49 commit e31dd28

File tree

8 files changed

+199
-44
lines changed

8 files changed

+199
-44
lines changed

.vitepress/theme/Layout.vue

-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ import { ref, computed, watch, defineAsyncComponent } from 'vue'
5151
import {
5252
useRoute,
5353
useSiteData,
54-
usePageData,
5554
useSiteDataByRoute,
5655
} from 'vitepress'
5756
import type { DefaultTheme } from './config'

.vitepress/theme/components/HomeFeatures.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
<script setup lang="ts">
2121
import { computed } from 'vue'
22-
import { useSiteDataByRoute, useFrontmatter } from 'vitepress'
22+
import { useFrontmatter } from 'vitepress'
2323
2424
const data = useFrontmatter()
2525

.vitepress/theme/components/HomeHero.vue

+36-36
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,54 @@
11
<template>
22
<header v-if="showHero" class="home-hero">
3-
<p align="center">
4-
<a href="https://github.com/slidevjs/slidev">
5-
<img src="/logo-title.png" alt="Slidev" height="300" />
6-
</a>
7-
<br />
8-
</p>
9-
<div class="description !-mt-4">
10-
Presentation
11-
<b>Sli</b>des for
12-
<b>Dev</b>elopers
13-
</div>
3+
<div class="grid lg:grid-cols-[minmax(400px,600px),minmax(500px,1fr)] gap-4">
4+
<div>
5+
<p align="center">
6+
<a href="https://github.com/slidevjs/slidev">
7+
<img src="/logo-title.png" alt="Slidev" height="300" />
8+
</a>
9+
<br />
10+
</p>
11+
<div class="description !-mt-4">
12+
Presentation
13+
<b>Sli</b>des for
14+
<b>Dev</b>elopers
15+
</div>
1416

15-
<NavLink
16-
v-if="hasAction"
17-
:item="{ link: data.actionLink, text: data.actionText }"
18-
class="action mx-2 rounded-tr-4xl rounded-tl-2xl rounded-br-2xl rounded-bl-3xl"
19-
/>
20-
21-
<NavLink
22-
v-if="hasAltAction"
23-
:item="{ link: data.altActionLink, text: data.altActionText }"
24-
class="action alt mx-2 rounded-tr-2xl rounded-tl-3xl rounded-br-4xl rounded-bl-4xl"
25-
/>
26-
27-
<div class="mt-5 flex">
28-
<div class="mx-auto">
29-
<p>or try it now</p>
30-
<div class="language-bash mt-2">
31-
<pre><code><span class="opacity-50">$ </span><span class="token function">npm init</span> <span class="token text-[#408c9e] font-500">slidev</span></code></pre>
17+
<NavLink
18+
v-if="hasAction"
19+
:item="{ link: data.actionLink, text: data.actionText }"
20+
class="action mx-2 rounded-tr-4xl rounded-tl-2xl rounded-br-2xl rounded-bl-3xl"
21+
/>
22+
23+
<NavLink
24+
v-if="hasAltAction"
25+
:item="{ link: data.altActionLink, text: data.altActionText }"
26+
class="action alt mx-2 rounded-tr-2xl rounded-tl-3xl rounded-br-4xl rounded-bl-4xl"
27+
/>
28+
29+
<div class="mt-5 flex">
30+
<div class="mx-auto">
31+
<p>or try it now</p>
32+
<div class="language-bash mt-2">
33+
<pre><code><span class="opacity-50">$ </span><span class="token function">npm init</span> <span class="token text-[#408c9e] font-500">slidev</span></code></pre>
34+
</div>
35+
</div>
3236
</div>
3337
</div>
38+
<Demo />
3439
</div>
3540
</header>
3641
</template>
3742

3843
<script setup lang="ts">
3944
import { computed } from 'vue'
40-
import { useSiteDataByRoute, useFrontmatter } from 'vitepress'
41-
import { isDark } from '../composables/dark'
45+
import { useFrontmatter } from 'vitepress'
4246
import NavLink from './NavLink.vue'
4347
44-
const site = useSiteDataByRoute()
4548
const data = useFrontmatter()
4649
4750
const hasHeroText = computed(() => data.value.heroText !== null)
48-
const heroText = computed(() => data.value.heroText || site.value.title)
49-
5051
const hasTagline = computed(() => data.value.tagline !== null)
51-
const tagline = computed(() => data.value.tagline || site.value.description)
5252
5353
const hasAction = computed(() => data.value.actionLink && data.value.actionText)
5454
const hasAltAction = computed(() => data.value.altActionLink && data.value.altActionText)
@@ -70,13 +70,13 @@ const showHero = computed(() => {
7070
7171
@media (min-width: 420px) {
7272
.home-hero {
73-
margin: 0rem 0;
73+
margin: 0;
7474
}
7575
}
7676
7777
@media (min-width: 720px) {
7878
.home-hero {
79-
margin: 0rem 0 4.25rem;
79+
margin: 0 3rem;
8080
}
8181
}
8282
+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
<script setup lang="ts">
2+
import { ref, onMounted, watch, shallowRef } from 'vue'
3+
// @ts-ignore
4+
import TypeIt from 'typeit'
5+
import Markdown from 'markdown-it'
6+
import type { SlidevMarkdown } from '@slidev/types'
7+
import { parse } from '../../../../../packages/parser/src/core'
8+
import Default from '../../../../../packages/client/layouts/default.vue'
9+
import Center from '../../../../../packages/client/layouts/center.vue'
10+
import SlideContainer from '../../../../../packages/client/internals/SlideContainer.vue'
11+
import Cover from '../../../../../packages/theme-default/layouts/cover.vue'
12+
import '../../../../../packages/theme-default/styles/layout.css'
13+
14+
const paused = ref(false)
15+
const code = ref('')
16+
const html = ref('')
17+
let info: SlidevMarkdown
18+
const block = ref<HTMLPreElement>()
19+
const layout = shallowRef<any>(Default)
20+
21+
const markdown = new Markdown()
22+
23+
watch([code, paused], () => {
24+
if (paused.value)
25+
return
26+
try {
27+
info = parse(code.value)
28+
html.value = markdown.render(info.slides[0].content)
29+
const name = info?.slides?.[0]?.frontmatter?.layout || 'default'
30+
layout.value = name === 'cover'
31+
? Cover
32+
: name === 'center'
33+
? Center
34+
: Default
35+
}
36+
catch (e) {
37+
38+
}
39+
})
40+
41+
onMounted(() => {
42+
new TypeIt(block.value, {
43+
speed: 50,
44+
startDelay: 900,
45+
afterStep: () => {
46+
code.value = JSON.parse(JSON.stringify(block.value!.innerText.replace('|', '')))
47+
},
48+
})
49+
.type('<br><span class="token title"># Welcome to Slidev!</span><br><br>', { delay: 400 })
50+
.type('Presentation Slides for Developers', { delay: 400 })
51+
.move('START', { speed: 0 })
52+
.type('<br>')
53+
.move('START')
54+
.exec(() => paused.value = true)
55+
.type('<span class="token punctuation">---<br><br>---</span>')
56+
.move(-4)
57+
.type('<span class="token tag">layout:</span> center')
58+
.exec(() => paused.value = false)
59+
.pause(1000)
60+
.exec(() => paused.value = true)
61+
.delete(6, { delay: 100, speed: 50 })
62+
.type('cover')
63+
.exec(() => paused.value = false)
64+
.pause(1000)
65+
.type('<br>')
66+
.type('<span class="token tag">background:</span> ', { delay: 500 })
67+
.type('https://slidev.antfu.me/demo-cover.png', { speed: 0, delay: 1000 })
68+
.move('END', { speed: 0 })
69+
.type('<br><br><span class="token punctuation">---</span><br><br>', { delay: 400 })
70+
.type('<span class="token title"># Page 2</span><br><br>', { delay: 400 })
71+
.type('- 📄 Write sldies in a simple Markdown file<br>', { delay: 800 })
72+
.type('- 🌈 Themes, code blocks, interactive components<br>', { delay: 800 })
73+
.type('- 😎 Read the docs to learn more!', { delay: 800 })
74+
.go()
75+
})
76+
</script>
77+
78+
<template>
79+
<div>
80+
<DemoEditor>
81+
<div class="text-sm opacity-50">
82+
./slides.md
83+
</div>
84+
85+
<div class="language-md !bg-transparent">
86+
<pre
87+
ref="block"
88+
class="text-left whitespace-normal font-mono bg-transparent"
89+
></pre>
90+
</div>
91+
</DemoEditor>
92+
93+
<DemoSlide class="text-left">
94+
<SlideContainer class="w-full h-full">
95+
<component :is="layout" v-bind="info?.slides?.[0]?.frontmatter">
96+
<div v-html="html"></div>
97+
</component>
98+
</SlideContainer>
99+
</DemoSlide>
100+
</div>
101+
</template>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<template>
2+
<div class="terminal">
3+
<slot/>
4+
</div>
5+
</template>
6+
7+
<style lang="postcss" scoped>
8+
.terminal {
9+
font-size: 1em;
10+
line-height: 1.2em;
11+
min-height: 450px;
12+
margin-top: 25px;
13+
padding: 10px;
14+
border-radius: 7px;
15+
position: relative;
16+
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05), 0 0 30px 1px rgba(0, 0, 0, 0.15);
17+
@apply dark:(bg-gray-400 bg-opacity-5);
18+
}
19+
.terminal::after {
20+
content: "";
21+
position: absolute;
22+
top: 12px;
23+
left: 10px;
24+
width: 12px;
25+
height: 12px;
26+
background: #f95c5b;
27+
border-radius: 100%;
28+
box-shadow: 0 0 0 1px #da3d42, 22px 0 0 0 #fabe3b, 22px 0 0 1px #ecb03e, 44px 0 0 0 #38cd46, 44px 0 0 1px #2eae32;
29+
}
30+
</style>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<template>
2+
<div class="slide">
3+
<div class="aspect-9/16"></div>
4+
<div class="absolute top-0 left-0 right-0 bottom-0">
5+
<slot />
6+
</div>
7+
</div>
8+
</template>
9+
10+
<style lang="postcss" scoped>
11+
.slide {
12+
background: var(--c-bg);
13+
font-size: 1em;
14+
line-height: 1.2em;
15+
border-radius: 7px;
16+
position: relative;
17+
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05), 0 0 30px 1px rgba(0, 0, 0, 0.15);
18+
@apply mt-4 transform translate-x-20 -translate-y-20;
19+
@apply dark:(bg-gray-400 bg-opacity-5);
20+
}
21+
</style>

index.md

-6
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,3 @@ altActionLink: /guide/why
99

1010
footer: MIT Licensed | Copyright © 2021-PRESENT Anthony Fu
1111
---
12-
13-
or directly try it yourself:
14-
15-
```bash
16-
npm init slidev
17-
```

windi.config.ts

+10
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
import { defineConfig } from 'vite-plugin-windicss'
2+
import aspectRatio from 'windicss/plugin/aspect-ratio'
23

34
export default defineConfig({
45
extract: {
56
include: [
67
'**/*.{md,vue}',
78
'.vitepress/**/*.{ts,md,vue}',
9+
'../packages/client/internals/SlideContainer.vue',
10+
'../packages/client/layouts/*.vue',
11+
'../packages/@theme-default/layouts/*.vue',
812
],
913
},
14+
plugins: [
15+
aspectRatio,
16+
],
1017
theme: {
1118
extend: {
1219
colors: {
@@ -15,6 +22,9 @@ export default defineConfig({
1522
deep: '#2082A6',
1623
},
1724
},
25+
fontFamily: {
26+
mono: '\'IBM Plex Mono\', source-code-pro, Menlo, Monaco, Consolas, \'Courier New\', monospace',
27+
},
1828
},
1929
},
2030
})

0 commit comments

Comments
 (0)