Skip to content

Commit 3c1eddd

Browse files
committed
feat: add scrollable preview in TUI
1 parent 2a3aee7 commit 3c1eddd

File tree

1 file changed

+25
-2
lines changed

1 file changed

+25
-2
lines changed

src/tui.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
type KeyEvent,
66
MarkdownRenderable,
77
RGBA,
8+
ScrollBoxRenderable,
89
type SelectOption,
910
SelectRenderable,
1011
SelectRenderableEvents,
@@ -72,6 +73,7 @@ export async function runTui(): Promise<void> {
7273
const listBox = new BoxRenderable(renderer, {
7374
id: 'openmemo-list',
7475
flexGrow: 1,
76+
flexBasis: 0,
7577
marginRight: 1,
7678
border: true,
7779
borderStyle: 'single',
@@ -85,6 +87,8 @@ export async function runTui(): Promise<void> {
8587
const previewBox = new BoxRenderable(renderer, {
8688
id: 'openmemo-preview',
8789
flexGrow: 2,
90+
flexBasis: 0,
91+
overflow: 'hidden',
8892
border: true,
8993
borderStyle: 'single',
9094
borderColor: '#334155',
@@ -94,18 +98,26 @@ export async function runTui(): Promise<void> {
9498
shouldFill: true,
9599
});
96100

101+
const previewScroll = new ScrollBoxRenderable(renderer, {
102+
id: 'openmemo-preview-scroll',
103+
width: '100%',
104+
height: '100%',
105+
scrollY: true,
106+
scrollX: false,
107+
});
108+
97109
container.add(listBox);
98110
container.add(previewBox);
111+
previewBox.add(previewScroll);
99112

100113
const previewMarkdown = new MarkdownRenderable(renderer, {
101114
id: 'openmemo-preview-text',
102115
width: '100%',
103-
height: '100%',
104116
content: '',
105117
syntaxStyle: markdownStyle,
106118
conceal: true,
107119
});
108-
previewBox.add(previewMarkdown);
120+
previewScroll.add(previewMarkdown);
109121

110122
if (memos.length === 0) {
111123
previewMarkdown.content = EMPTY_MESSAGE;
@@ -145,6 +157,7 @@ export async function runTui(): Promise<void> {
145157
return;
146158
}
147159
previewMarkdown.content = stripFrontmatter(memo.content);
160+
previewScroll.scrollTo(0);
148161
};
149162

150163
updatePreview(memos[0]);
@@ -163,6 +176,16 @@ export async function runTui(): Promise<void> {
163176
renderer.keyInput.on('keypress', (key: KeyEvent) => {
164177
if (key.name === 'q' || key.name === 'escape') {
165178
renderer.destroy();
179+
} else if (key.name === 'j') {
180+
previewScroll.scrollBy(1);
181+
} else if (key.name === 'k') {
182+
previewScroll.scrollBy(-1);
183+
} else if (key.name === 'd') {
184+
const halfPage = Math.floor(previewScroll.viewport.height / 2);
185+
previewScroll.scrollBy(halfPage);
186+
} else if (key.name === 'u') {
187+
const halfPage = Math.floor(previewScroll.viewport.height / 2);
188+
previewScroll.scrollBy(-halfPage);
166189
}
167190
});
168191

0 commit comments

Comments
 (0)