theme | background | title | info | class | highlighter | drawings | transition | mdc | |
---|---|---|---|---|---|---|---|---|---|
seriph |
Hono with database on browser playground |
## Slidev Starter Template
Presentation slides for developers.
Learn more at [Sli.dev](https://sli.dev)
|
text-center |
shiki |
|
slide-left |
true |
Hono,Web Standards,Web Assembly Possibilities
Build a REST API from natural language and screenshots using AI, deploy it on Cloudflare Workers, and immediately roll it out globally.
- 🏗️ Generate API - Create REST APIs from natural language and screenshots with AI.
- 🧪 Live Sandbox - Test APIs in a secure, live editor environment.
- 🌍 Web Standard & Edge - Generate Hono.js-based APIs, optimized for Edge Runtime.
- 🔄 Share & Fork - Share APIs via URL, allowing public forking and improvement.
- 📦 npm Package - Import the npm package, auto-download type definitions.
- 💻 CLI Dump - Dump APIs locally via CLI for development.
- 🛠️ System Integration - Design APIs with v0.dev, deploy to Cloudflare Workers easily.
Binding sqlite-wasm adjusted for D1 to Hono.
import { atom } from "jotai";
import { Hono } from "hono";
export const runtimeAtom = atom<null | Hono>(null);
export const fetchRuntimeAtom = atom(
null,
async (get, set, request: Request) => {
const [app, db] = [get(runtimeAtom), get(dbAtom)];
if (!(app && db)) throw new Error("No runtime found");
const response = await app.fetch(request, {
DB: new D1Wrapper(db),
});
set(runtimeResponseAtom, response);
set(databaseVersionAtom, (v) => v + 1);
return response;
}
);
You can get endpoints from the runtime using inspectRoutes used in the showRoutes() function from hono/dev
import { inspectRoutes } from "hono/dev";
const requestEndpointEffect = messaging.onMessageJotai(
"requestEndpoint",
async (get, _set, { data }) => {
const runtime = get(runtimeAtom);
if (!runtime) return;
messaging.sendEvent("updateEndpointEvent", {
endpoints: JSON.stringify(inspectRoutes(runtime as any)),
});
}
);
layout: image-right image: https://cover.sli.dev
Use code snippets and get the highlighting directly, and even types hover!1
// TwoSlash enables TypeScript hover information
// and errors in markdown code blocks
// More at https://shiki.style/packages/twoslash
import { computed, ref } from "vue";
const count = ref(0);
const doubled = computed(() => count.value * 2);
doubled.value = 2;
<<< @/snippets/external.ts#snippet
<style> .footnotes-sep { @apply mt-5 opacity-10; } .footnotes { @apply text-sm opacity-75; } .footnote-backref { display: none; } </style>Powered by shiki-magic-move, Slidev supports animations across multiple code snippets.
Add multiple code blocks and wrap them with ````md magic-move
(four backticks) to enable the magic move. For example:
```ts {*|2|*}
// step 1
const author = reactive({
name: "John Doe",
books: [
"Vue 2 - Advanced Guide",
"Vue 3 - Basic Guide",
"Vue 4 - The Mystery",
],
});
```
```ts {*|1-2|3-4|3-4,8}
// step 2
export default {
data() {
return {
author: {
name: "John Doe",
books: [
"Vue 2 - Advanced Guide",
"Vue 3 - Basic Guide",
"Vue 4 - The Mystery",
],
},
};
},
};
```
```ts
// step 3
export default {
data: () => ({
author: {
name: "John Doe",
books: [
"Vue 2 - Advanced Guide",
"Vue 3 - Basic Guide",
"Vue 4 - The Mystery",
],
},
}),
};
```
Non-code blocks are ignored.
```vue
<!-- step 4 -->
<script setup>
const author = {
name: "John Doe",
books: [
"Vue 2 - Advanced Guide",
"Vue 3 - Basic Guide",
"Vue 4 - The Mystery",
],
};
</script>
```
You can use Vue components directly inside your slides.
We have provided a few built-in components like <Tweet/>
and <Youtube/>
that you can use directly. And adding your custom components is also super easy.
<Counter :count="10" />
Check out the guides for more.
<Tweet id="1390115482657726468" />
Slidev comes with powerful theming support. Themes can provide styles, layouts, components, or even configurations for tools. Switching between themes by just one edit in your frontmatter:
Read more about How to use a theme and check out the Awesome Themes Gallery.
You can add v-click
to elements to add a click animation.
This shows up when you click the slide:
<div v-click>This shows up when you click the slide.</div>
The v-mark
directive
also allows you to add
inline marks
, powered by Rough Notation:
<span v-mark.underline.orange>inline markers</span>
Motion animations are powered by @vueuse/motion, triggered by v-motion
directive.
<div
v-motion
:initial="{ x: -80 }"
:enter="{ x: 0 }"
:click-3="{ x: 80 }"
:leave="{ x: 1000 }"
>
Slidev
</div>
LaTeX is supported out-of-box powered by KaTeX.
Inline
Block
$$ {1|3|all} \begin{array}{c}
\nabla \times \vec{\mathbf{B}} -, \frac1c, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \
\nabla \times \vec{\mathbf{E}}, +, \frac1c, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \
\nabla \cdot \vec{\mathbf{B}} & = 0
\end{array} $$
You can create diagrams / graphs from textual descriptions, directly in your Markdown.
sequenceDiagram
Alice->John: Hello John, how are you?
Note over Alice,John: A typical interaction
graph TD
B[Text] --> C{Decision}
C -->|One| D[Result 1]
C -->|Two| E[Result 2]
mindmap
root((mindmap))
Origins
Long history
::icon(fa fa-book)
Popularisation
British popular psychology author Tony Buzan
Research
On effectiveness<br/>and features
On Automatic creation
Uses
Creative techniques
Strategic planning
Argument mapping
Tools
Pen and paper
Mermaid
@startuml
package "Some Group" {
HTTP - [First Component]
[Another Component]
}
node "Other Groups" {
FTP - [Second Component]
[First Component] --> FTP
}
cloud {
[Example 1]
}
database "MySql" {
folder "This is my folder" {
[Folder 3]
}
frame "Foo" {
[Frame 4]
}
}
[Another Component] --> [Example 1]
[Example 1] --> [Folder 3]
[Folder 3] --> [Frame 4]
@enduml
foo: bar dragPos: square: 691,33,167,_,-16
Double-click on the draggable elements to edit their positions.
<img v-drag="'square'" src="https://sli.dev/logo.png">
<v-drag text-3xl>
<carbon:arrow-up />
Use the `v-drag` component to have a draggable container!
</v-drag>
src: ./pages/multiple-entries.md hide: false
Slidev provides built-in Monaco Editor support.
Add {monaco}
to the code block to turn it into an editor:
import { ref } from "vue";
import { emptyArray } from "./external";
const arr = ref(emptyArray(10));
Use {monaco-run}
to create an editor that can execute the code directly in the slide:
import { version } from "vue";
import { emptyArray, sayHello } from "./external";
sayHello();
console.log(`vue ${version}`);
console.log(
emptyArray<number>(10).reduce(
(fib) => [...fib, fib.at(-1)! + fib.at(-2)!],
[1, 1]
)
);
layout: center class: text-center
Documentations · GitHub · Showcases