Files
test-repo/docs/.vitepress/theme/components/appendix/terminal-intro/BufferSwitchDemo.vue
T
sanbuphy 73f4788d7e feat: comprehensive documentation and demo updates
- Update READMEs and docs across multiple languages
- Enhance interactive demos for Agent, LLM, VLM, Audio, Image Gen, Terminal, and Web Basics
- Add new appendix sections for Database and IDE intros
- Update VitePress config, theme, and utility scripts
- Clean up unused assets and components
2026-01-16 19:10:51 +08:00

319 lines
6.6 KiB
Vue

<template>
<div class="buffer-demo">
<div class="terminal-frame">
<div class="window-bar">
<span class="dot red"></span>
<span class="dot yellow"></span>
<span class="dot green"></span>
<span class="title">Terminal - Buffer Switching Demo</span>
</div>
<div class="screen-container">
<!-- Main Buffer (Layer 0) -->
<div class="buffer main-buffer">
<div class="line">
<span class="prompt"></span> <span class="cmd">ls -la</span>
</div>
<div class="line output">total 16</div>
<div class="line output">
drwxr-xr-x 2 user staff 64 Jan 15 10:00 .
</div>
<div class="line output">
drwxr-xr-x 4 user staff 128 Jan 15 09:55 ..
</div>
<div class="line output">
-rw-r--r-- 1 user staff 1024 Jan 15 10:00 notes.txt
</div>
<div class="line">
<span class="prompt"></span>
<span class="cmd">echo "Hello World"</span>
</div>
<div class="line output">Hello World</div>
<div class="line">
<span class="prompt"></span> <span class="cmd">vim notes.txt</span>
</div>
<!-- The cursor would be here if not in vim -->
</div>
<!-- Alternate Buffer (Layer 1) -->
<transition name="slide-up">
<div v-if="isAltBufferActive" class="buffer alt-buffer">
<div class="vim-header">
<span class="filename">notes.txt</span>
<span class="modified">[+]</span>
</div>
<div class="vim-body">
<div class="line-num">1</div>
<div class="code">This is a text file opened in Vim.</div>
<div class="line-num">2</div>
<div class="code"></div>
<div class="line-num">3</div>
<div class="code">Notice how this interface takes up</div>
<div class="line-num">4</div>
<div class="code">the entire screen?</div>
<div class="line-num">5</div>
<div class="code"></div>
<div class="line-num">6</div>
<div class="code">
It is running in the
<span class="highlight">Alternate Buffer</span>.
</div>
<div class="line-num">~</div>
<div class="line-num">~</div>
</div>
<div class="vim-status-bar">
<span class="mode">NORMAL</span>
<span class="file-info">notes.txt [unix] (10:24)</span>
</div>
<div class="vim-cmd-line">
<span v-if="showQuitCmd">:q</span>
</div>
</div>
</transition>
</div>
</div>
<div class="controls">
<div class="description">
<div v-if="!isAltBufferActive">
<p><strong>Current: Primary Buffer (主缓冲区)</strong></p>
<p>
This is the standard scrolling log. Commands are executed line by
line.
</p>
<button class="action-btn" @click="openVim">
Execute `vim notes.txt`
</button>
</div>
<div v-else>
<p><strong>Current: Alternate Buffer (备用缓冲区)</strong></p>
<p>
A separate "canvas" for full-screen apps. It hides the history but
doesn't delete it.
</p>
<button class="action-btn red" @click="quitVim">
Execute `:q` (Quit)
</button>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
const isAltBufferActive = ref(false)
const showQuitCmd = ref(false)
const openVim = () => {
isAltBufferActive.value = true
showQuitCmd.value = false
}
const quitVim = () => {
showQuitCmd.value = true
setTimeout(() => {
isAltBufferActive.value = false
}, 500)
}
</script>
<style scoped>
.buffer-demo {
margin: 20px 0;
font-family: 'Menlo', 'Monaco', monospace;
}
.terminal-frame {
background: #1e1e1e;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
border: 1px solid #333;
}
.window-bar {
background: #2d2d2d;
padding: 8px 12px;
display: flex;
align-items: center;
gap: 6px;
}
.dot {
width: 10px;
height: 10px;
border-radius: 50%;
}
.red {
background: #ff5f56;
}
.yellow {
background: #ffbd2e;
}
.green {
background: #27c93f;
}
.title {
margin-left: 10px;
font-size: 12px;
color: #999;
}
.screen-container {
position: relative;
height: 240px;
background: #000;
overflow: hidden;
}
.buffer {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
padding: 10px;
box-sizing: border-box;
}
/* Main Buffer Styles */
.main-buffer {
color: #ccc;
font-size: 13px;
line-height: 1.5;
}
.prompt {
color: #27c93f;
margin-right: 8px;
}
.cmd {
font-weight: bold;
color: #fff;
}
.output {
color: #888;
}
/* Alt Buffer Styles (Vim Look) */
.alt-buffer {
background: #282c34;
color: #abb2bf;
display: flex;
flex-direction: column;
z-index: 10;
}
.vim-header {
display: none; /* Vim doesn't usually have a top header like this, but helpful for context? Maybe skip */
}
.vim-body {
flex: 1;
font-size: 14px;
line-height: 1.6;
}
.line-num {
display: inline-block;
width: 30px;
color: #5c6370;
text-align: right;
margin-right: 10px;
}
.code {
display: inline-block;
}
.highlight {
color: #e5c07b;
font-weight: bold;
}
.vim-status-bar {
background: #3e4452;
color: #ccc;
padding: 4px 10px;
font-size: 12px;
display: flex;
justify-content: space-between;
}
.mode {
font-weight: bold;
background: #98c379;
color: #282c34;
padding: 0 5px;
margin-right: 10px;
}
.vim-cmd-line {
height: 24px;
display: flex;
align-items: center;
padding: 0 5px;
}
/* Transitions */
.slide-up-enter-active,
.slide-up-leave-active {
transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
}
.slide-up-enter-from,
.slide-up-leave-to {
transform: translateY(100%);
}
.controls {
margin-top: 15px;
background: #f6f6f7;
border-radius: 8px;
padding: 15px;
border: 1px solid #eee;
}
.dark .controls {
background: #252529;
border-color: #333;
}
.action-btn {
background: #27c93f;
color: #fff;
border: none;
padding: 8px 16px;
border-radius: 4px;
cursor: pointer;
font-weight: bold;
font-size: 14px;
transition: all 0.2s;
margin-top: 10px;
}
.action-btn:hover {
background: #22b036;
transform: translateY(-1px);
}
.action-btn.red {
background: #ff5f56;
}
.action-btn.red:hover {
background: #e0483e;
}
p {
margin: 5px 0;
font-size: 14px;
color: var(--vp-c-text-1);
}
</style>