diff --git a/packages/app/src/i18n/ar.ts b/packages/app/src/i18n/ar.ts index 6c3f3bb55ef4..dcdf4ab4486b 100644 --- a/packages/app/src/i18n/ar.ts +++ b/packages/app/src/i18n/ar.ts @@ -458,6 +458,8 @@ export const dict = { "session.files.all": "كل الملفات", "session.files.empty": "لا توجد ملفات", "session.files.binaryContent": "ملف ثنائي (لا يمكن عرض المحتوى)", + "session.files.viewPreview": "معاينة", + "session.files.viewSource": "مصدر", "session.messages.renderEarlier": "عرض الرسائل السابقة", "session.messages.loadingEarlier": "جارٍ تحميل الرسائل السابقة...", "session.messages.loadEarlier": "تحميل الرسائل السابقة", diff --git a/packages/app/src/i18n/br.ts b/packages/app/src/i18n/br.ts index 63880462a467..561d5ba3c0af 100644 --- a/packages/app/src/i18n/br.ts +++ b/packages/app/src/i18n/br.ts @@ -462,6 +462,8 @@ export const dict = { "session.files.all": "Todos os arquivos", "session.files.empty": "Nenhum arquivo", "session.files.binaryContent": "Arquivo binário (conteúdo não pode ser exibido)", + "session.files.viewPreview": "Pré-visualização", + "session.files.viewSource": "Código-fonte", "session.messages.renderEarlier": "Renderizar mensagens anteriores", "session.messages.loadingEarlier": "Carregando mensagens anteriores...", "session.messages.loadEarlier": "Carregar mensagens anteriores", diff --git a/packages/app/src/i18n/bs.ts b/packages/app/src/i18n/bs.ts index 2b589eb35f62..f408d06d86e6 100644 --- a/packages/app/src/i18n/bs.ts +++ b/packages/app/src/i18n/bs.ts @@ -515,6 +515,8 @@ export const dict = { "session.files.all": "Sve datoteke", "session.files.empty": "Nema datoteka", "session.files.binaryContent": "Binarna datoteka (sadržaj se ne može prikazati)", + "session.files.viewPreview": "Pregled", + "session.files.viewSource": "Izvor", "session.messages.renderEarlier": "Prikaži ranije poruke", "session.messages.loadingEarlier": "Učitavanje ranijih poruka...", diff --git a/packages/app/src/i18n/da.ts b/packages/app/src/i18n/da.ts index b096d87b4b7b..4d393e56bf0f 100644 --- a/packages/app/src/i18n/da.ts +++ b/packages/app/src/i18n/da.ts @@ -511,6 +511,8 @@ export const dict = { "session.files.all": "Alle filer", "session.files.empty": "Ingen filer", "session.files.binaryContent": "Binær fil (indhold kan ikke vises)", + "session.files.viewPreview": "Forhåndsvisning", + "session.files.viewSource": "Kilde", "session.messages.renderEarlier": "Vis tidligere beskeder", "session.messages.loadingEarlier": "Indlæser tidligere beskeder...", "session.messages.loadEarlier": "Indlæs tidligere beskeder", diff --git a/packages/app/src/i18n/de.ts b/packages/app/src/i18n/de.ts index 6dc0b0497245..f83859a70201 100644 --- a/packages/app/src/i18n/de.ts +++ b/packages/app/src/i18n/de.ts @@ -470,6 +470,8 @@ export const dict = { "session.files.all": "Alle Dateien", "session.files.empty": "Keine Dateien", "session.files.binaryContent": "Binärdatei (Inhalt kann nicht angezeigt werden)", + "session.files.viewPreview": "Vorschau", + "session.files.viewSource": "Quelle", "session.messages.renderEarlier": "Frühere Nachrichten rendern", "session.messages.loadingEarlier": "Lade frühere Nachrichten...", "session.messages.loadEarlier": "Frühere Nachrichten laden", diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts index c6bcc37b116f..6e62f018d50d 100644 --- a/packages/app/src/i18n/en.ts +++ b/packages/app/src/i18n/en.ts @@ -544,6 +544,8 @@ export const dict = { "session.files.all": "All files", "session.files.empty": "No files", "session.files.binaryContent": "Binary file (content cannot be displayed)", + "session.files.viewPreview": "Preview", + "session.files.viewSource": "Source", "session.messages.renderEarlier": "Render earlier messages", "session.messages.loadingEarlier": "Loading earlier messages...", diff --git a/packages/app/src/i18n/es.ts b/packages/app/src/i18n/es.ts index c600232ef613..c6ce6aeeb57f 100644 --- a/packages/app/src/i18n/es.ts +++ b/packages/app/src/i18n/es.ts @@ -516,6 +516,8 @@ export const dict = { "session.files.all": "Todos los archivos", "session.files.empty": "Sin archivos", "session.files.binaryContent": "Archivo binario (el contenido no puede ser mostrado)", + "session.files.viewPreview": "Vista previa", + "session.files.viewSource": "Fuente", "session.messages.renderEarlier": "Renderizar mensajes anteriores", "session.messages.loadingEarlier": "Cargando mensajes anteriores...", diff --git a/packages/app/src/i18n/fr.ts b/packages/app/src/i18n/fr.ts index a140c1e3a123..43125dcd5c99 100644 --- a/packages/app/src/i18n/fr.ts +++ b/packages/app/src/i18n/fr.ts @@ -467,6 +467,8 @@ export const dict = { "session.files.all": "Tous les fichiers", "session.files.empty": "Aucun fichier", "session.files.binaryContent": "Fichier binaire (le contenu ne peut pas être affiché)", + "session.files.viewPreview": "Aperçu", + "session.files.viewSource": "Source", "session.messages.renderEarlier": "Afficher les messages précédents", "session.messages.loadingEarlier": "Chargement des messages précédents...", "session.messages.loadEarlier": "Charger les messages précédents", diff --git a/packages/app/src/i18n/ja.ts b/packages/app/src/i18n/ja.ts index 3da1c4b43b58..9034f4c4b081 100644 --- a/packages/app/src/i18n/ja.ts +++ b/packages/app/src/i18n/ja.ts @@ -459,6 +459,8 @@ export const dict = { "session.files.all": "すべてのファイル", "session.files.empty": "ファイルなし", "session.files.binaryContent": "バイナリファイル(内容を表示できません)", + "session.files.viewPreview": "プレビュー", + "session.files.viewSource": "ソース", "session.messages.renderEarlier": "以前のメッセージを表示", "session.messages.loadingEarlier": "以前のメッセージを読み込み中...", "session.messages.loadEarlier": "以前のメッセージを読み込む", diff --git a/packages/app/src/i18n/ko.ts b/packages/app/src/i18n/ko.ts index 0f2f7647abf5..7b7024eb53db 100644 --- a/packages/app/src/i18n/ko.ts +++ b/packages/app/src/i18n/ko.ts @@ -461,6 +461,8 @@ export const dict = { "session.files.all": "모든 파일", "session.files.empty": "파일 없음", "session.files.binaryContent": "바이너리 파일 (내용을 표시할 수 없음)", + "session.files.viewPreview": "미리보기", + "session.files.viewSource": "소스", "session.messages.renderEarlier": "이전 메시지 렌더링", "session.messages.loadingEarlier": "이전 메시지 로드 중...", "session.messages.loadEarlier": "이전 메시지 로드", diff --git a/packages/app/src/i18n/no.ts b/packages/app/src/i18n/no.ts index a0a968179cd0..e70153be233a 100644 --- a/packages/app/src/i18n/no.ts +++ b/packages/app/src/i18n/no.ts @@ -516,6 +516,8 @@ export const dict = { "session.files.all": "Alle filer", "session.files.empty": "Ingen filer", "session.files.binaryContent": "Binær fil (innhold kan ikke vises)", + "session.files.viewPreview": "Forhåndsvisning", + "session.files.viewSource": "Kilde", "session.messages.renderEarlier": "Vis tidligere meldinger", "session.messages.loadingEarlier": "Laster inn tidligere meldinger...", diff --git a/packages/app/src/i18n/pl.ts b/packages/app/src/i18n/pl.ts index 88d209f11ff2..380ee953f262 100644 --- a/packages/app/src/i18n/pl.ts +++ b/packages/app/src/i18n/pl.ts @@ -460,6 +460,8 @@ export const dict = { "session.files.all": "Wszystkie pliki", "session.files.empty": "Brak plików", "session.files.binaryContent": "Plik binarny (zawartość nie może być wyświetlona)", + "session.files.viewPreview": "Podgląd", + "session.files.viewSource": "Źródło", "session.messages.renderEarlier": "Renderuj wcześniejsze wiadomości", "session.messages.loadingEarlier": "Ładowanie wcześniejszych wiadomości...", "session.messages.loadEarlier": "Załaduj wcześniejsze wiadomości", diff --git a/packages/app/src/i18n/ru.ts b/packages/app/src/i18n/ru.ts index 688289b7e812..a066b0cacd65 100644 --- a/packages/app/src/i18n/ru.ts +++ b/packages/app/src/i18n/ru.ts @@ -514,6 +514,8 @@ export const dict = { "session.files.all": "Все файлы", "session.files.empty": "Нет файлов", "session.files.binaryContent": "Двоичный файл (содержимое не может быть отображено)", + "session.files.viewPreview": "Предпросмотр", + "session.files.viewSource": "Исходный код", "session.messages.renderEarlier": "Показать предыдущие сообщения", "session.messages.loadingEarlier": "Загрузка предыдущих сообщений...", "session.messages.loadEarlier": "Загрузить предыдущие сообщения", diff --git a/packages/app/src/i18n/th.ts b/packages/app/src/i18n/th.ts index 5decf3adb531..15fbfff2276f 100644 --- a/packages/app/src/i18n/th.ts +++ b/packages/app/src/i18n/th.ts @@ -510,6 +510,8 @@ export const dict = { "session.files.empty": "ไม่มีไฟล์", "session.files.all": "ไฟล์ทั้งหมด", "session.files.binaryContent": "ไฟล์ไบนารี (ไม่สามารถแสดงเนื้อหาได้)", + "session.files.viewPreview": "ดูตัวอย่าง", + "session.files.viewSource": "ซอร์สโค้ด", "session.messages.renderEarlier": "แสดงข้อความก่อนหน้า", "session.messages.loadingEarlier": "กำลังโหลดข้อความก่อนหน้า...", diff --git a/packages/app/src/i18n/tr.ts b/packages/app/src/i18n/tr.ts index 6a3ade0d0b07..439e748e737f 100644 --- a/packages/app/src/i18n/tr.ts +++ b/packages/app/src/i18n/tr.ts @@ -520,6 +520,8 @@ export const dict = { "session.files.all": "Tüm dosyalar", "session.files.empty": "Dosya yok", "session.files.binaryContent": "İkili dosya (içerik görüntülenemiyor)", + "session.files.viewPreview": "Önizleme", + "session.files.viewSource": "Kaynak", "session.messages.renderEarlier": "Önceki mesajları göster", "session.messages.loadingEarlier": "Önceki mesajlar yükleniyor...", diff --git a/packages/app/src/i18n/zh.ts b/packages/app/src/i18n/zh.ts index 28231733eaba..659d2d004c3b 100644 --- a/packages/app/src/i18n/zh.ts +++ b/packages/app/src/i18n/zh.ts @@ -512,6 +512,8 @@ export const dict = { "session.files.all": "所有文件", "session.files.empty": "无文件", "session.files.binaryContent": "二进制文件(无法显示内容)", + "session.files.viewPreview": "预览", + "session.files.viewSource": "源代码", "session.messages.renderEarlier": "显示更早的消息", "session.messages.loadingEarlier": "正在加载更早的消息...", "session.messages.loadEarlier": "加载更早的消息", diff --git a/packages/app/src/i18n/zht.ts b/packages/app/src/i18n/zht.ts index 4abdf5db574d..3523e5ebbf14 100644 --- a/packages/app/src/i18n/zht.ts +++ b/packages/app/src/i18n/zht.ts @@ -507,6 +507,8 @@ export const dict = { "session.files.all": "所有檔案", "session.files.empty": "沒有檔案", "session.files.binaryContent": "二進位檔案(無法顯示內容)", + "session.files.viewPreview": "預覽", + "session.files.viewSource": "原始碼", "session.messages.renderEarlier": "顯示更早的訊息", "session.messages.loadingEarlier": "正在載入更早的訊息...", "session.messages.loadEarlier": "載入更早的訊息", diff --git a/packages/app/src/pages/session/file-tabs.tsx b/packages/app/src/pages/session/file-tabs.tsx index cb7617523611..a57119c72846 100644 --- a/packages/app/src/pages/session/file-tabs.tsx +++ b/packages/app/src/pages/session/file-tabs.tsx @@ -1,4 +1,4 @@ -import { createEffect, createMemo, createSignal, Match, on, onCleanup, Switch } from "solid-js" +import { createEffect, createMemo, createSignal, Match, on, onCleanup, Show, Switch } from "solid-js" import { createStore } from "solid-js/store" import { Dynamic } from "solid-js/web" import { makeEventListener } from "@solid-primitives/event-listener" @@ -12,6 +12,7 @@ import { IconButton } from "@opencode-ai/ui/icon-button" import { Tabs } from "@opencode-ai/ui/tabs" import { ScrollView } from "@opencode-ai/ui/scroll-view" import { showToast } from "@opencode-ai/ui/toast" +import { Markdown } from "@opencode-ai/ui/markdown" import { selectionFromLines, useFile, type FileSelection, type SelectedLineRange } from "@/context/file" import { useComments } from "@/context/comments" import { useLanguage } from "@/context/language" @@ -211,6 +212,12 @@ export function FileTabContent(props: { tab: string }) { view, }) + const isMarkdown = createMemo(() => { + const p = path() + return p ? /\.(?:md|markdown)$/i.test(p) : false + }) + const [preview, setPreview] = createSignal(true) + const selectionPreview = (source: string, selection: FileSelection) => { return previewSelectedLines(source, { start: selection.startLine, @@ -359,11 +366,21 @@ export function FileTabContent(props: { tab: string }) { path, () => { commentsUi.note.reset() + setPreview(true) }, { defer: true }, ), ) + createEffect(() => { + const focus = comments.focus() + const p = path() + if (!focus || !p) return + if (focus.file !== p) return + if (activeFileTab() !== props.tab) return + if (preview()) setPreview(false) + }) + createEffect(() => { const focus = comments.focus() const p = path() @@ -449,7 +466,28 @@ export function FileTabContent(props: { tab: string }) { return ( + +
+ + +
+
+ +
+ +
+
{renderFile(contents())}
{language.t("common.loading")}...