From a3da56ee32550f255cd3c1b34787cf4e2dbb6207 Mon Sep 17 00:00:00 2001 From: AKHIL Date: Sat, 15 Aug 2026 00:04:14 +0530 Subject: [PATCH] Fix Markdown download notification --- apps/desktop-ui/messages/af.json | 3 +++ apps/desktop-ui/messages/ar.json | 3 +++ apps/desktop-ui/messages/ca.json | 3 +++ apps/desktop-ui/messages/cs.json | 3 +++ apps/desktop-ui/messages/da.json | 3 +++ apps/desktop-ui/messages/de.json | 3 +++ apps/desktop-ui/messages/el.json | 3 +++ apps/desktop-ui/messages/en.json | 3 +++ apps/desktop-ui/messages/es.json | 3 +++ apps/desktop-ui/messages/fa.json | 3 +++ apps/desktop-ui/messages/fr.json | 3 +++ apps/desktop-ui/messages/id.json | 3 +++ apps/desktop-ui/messages/it.json | 3 +++ apps/desktop-ui/messages/ja.json | 3 +++ apps/desktop-ui/messages/ko.json | 3 +++ apps/desktop-ui/messages/ms.json | 3 +++ apps/desktop-ui/messages/nb.json | 3 +++ apps/desktop-ui/messages/nl.json | 3 +++ apps/desktop-ui/messages/pl.json | 3 +++ apps/desktop-ui/messages/pt-BR.json | 3 +++ apps/desktop-ui/messages/pt.json | 3 +++ apps/desktop-ui/messages/ru.json | 3 +++ apps/desktop-ui/messages/sv.json | 3 +++ apps/desktop-ui/messages/tr.json | 3 +++ apps/desktop-ui/messages/uk.json | 3 +++ apps/desktop-ui/messages/vi.json | 3 +++ apps/desktop-ui/messages/zh.json | 3 +++ .../markdown-preview-html-layout.tsx | 22 +++++++++++++--- .../__tests__/markdown-preview-html.test.ts | 25 +++++++++++++++++++ .../src/lib/markdown-preview-html.ts | 10 ++++++++ 30 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 apps/desktop-ui/src/lib/__tests__/markdown-preview-html.test.ts create mode 100644 apps/desktop-ui/src/lib/markdown-preview-html.ts diff --git a/apps/desktop-ui/messages/af.json b/apps/desktop-ui/messages/af.json index 5a337a72..d2892f82 100644 --- a/apps/desktop-ui/messages/af.json +++ b/apps/desktop-ui/messages/af.json @@ -3912,6 +3912,9 @@ "copyHtml": "Kopieer HTML", "copyMarkdown": "Kopieer Markdown", "exportHtml": "Voer HTML uit", + "fileNameLabel": "Lêernaam", + "fileNamePlaceholder": "export", + "exportSuccess": "{name} gestoor", "copied": "Gekopieer", "charCount": "{count, plural, one {# karakter} other {# karakters}}", "emptyHint": "Begin Markdown tik om die lewendige voorskou en HTML-uitvoer te sien.", diff --git a/apps/desktop-ui/messages/ar.json b/apps/desktop-ui/messages/ar.json index af916e22..0c39d973 100644 --- a/apps/desktop-ui/messages/ar.json +++ b/apps/desktop-ui/messages/ar.json @@ -3901,6 +3901,9 @@ "copyHtml": "نسخ HTML", "copyMarkdown": "نسخ Markdown", "exportHtml": "تصدير HTML", + "fileNameLabel": "اسم الملف", + "fileNamePlaceholder": "export", + "exportSuccess": "تم حفظ {name}", "copied": "تم النسخ", "charCount": "{count, plural, one {# حرف} other {# أحرف}}", "emptyHint": "ابدأ بكتابة Markdown لرؤية المعاينة المباشرة وإخراج HTML.", diff --git a/apps/desktop-ui/messages/ca.json b/apps/desktop-ui/messages/ca.json index 3e2d13b7..b7e93eb6 100644 --- a/apps/desktop-ui/messages/ca.json +++ b/apps/desktop-ui/messages/ca.json @@ -3901,6 +3901,9 @@ "copyHtml": "Copia HTML", "copyMarkdown": "Copia Markdown", "exportHtml": "Exporta HTML", + "fileNameLabel": "Nom del fitxer", + "fileNamePlaceholder": "export", + "exportSuccess": "S'ha desat {name}", "copied": "Copiat", "charCount": "{count, plural, one {# caràcter} other {# caràcters}}", "emptyHint": "Comenceu a escriure Markdown per veure la previsualització i la sortida HTML.", diff --git a/apps/desktop-ui/messages/cs.json b/apps/desktop-ui/messages/cs.json index 1d9021db..ac626ac9 100644 --- a/apps/desktop-ui/messages/cs.json +++ b/apps/desktop-ui/messages/cs.json @@ -3901,6 +3901,9 @@ "copyHtml": "Kopírovat HTML", "copyMarkdown": "Kopírovat Markdown", "exportHtml": "Exportovat HTML", + "fileNameLabel": "Název souboru", + "fileNamePlaceholder": "export", + "exportSuccess": "Uloženo {name}", "copied": "Zkopírováno", "charCount": "{count, plural, one {# znak} few {# znaky} other {# znaků}}", "emptyHint": "Začněte psát Markdown pro zobrazení živého náhledu a HTML výstupu.", diff --git a/apps/desktop-ui/messages/da.json b/apps/desktop-ui/messages/da.json index 384a8985..5a1f8fb1 100644 --- a/apps/desktop-ui/messages/da.json +++ b/apps/desktop-ui/messages/da.json @@ -3901,6 +3901,9 @@ "copyHtml": "Kopiér HTML", "copyMarkdown": "Kopiér Markdown", "exportHtml": "Eksportér HTML", + "fileNameLabel": "Filnavn", + "fileNamePlaceholder": "export", + "exportSuccess": "Gemte {name}", "copied": "Kopieret", "charCount": "{count, plural, one {# tegn} other {# tegn}}", "emptyHint": "Begynd at skrive Markdown for at se live-forhåndsvisning og HTML-output.", diff --git a/apps/desktop-ui/messages/de.json b/apps/desktop-ui/messages/de.json index 904cf6cb..b5369cb6 100644 --- a/apps/desktop-ui/messages/de.json +++ b/apps/desktop-ui/messages/de.json @@ -3901,6 +3901,9 @@ "copyHtml": "HTML kopieren", "copyMarkdown": "Markdown kopieren", "exportHtml": "HTML exportieren", + "fileNameLabel": "Dateiname", + "fileNamePlaceholder": "export", + "exportSuccess": "{name} gespeichert", "copied": "Kopiert", "charCount": "{count, plural, one {# Zeichen} other {# Zeichen}}", "emptyHint": "Beginnen Sie mit der Eingabe von Markdown, um die Live-Vorschau und HTML-Ausgabe zu sehen.", diff --git a/apps/desktop-ui/messages/el.json b/apps/desktop-ui/messages/el.json index 3f083b32..c461a502 100644 --- a/apps/desktop-ui/messages/el.json +++ b/apps/desktop-ui/messages/el.json @@ -3901,6 +3901,9 @@ "copyHtml": "Αντιγραφή HTML", "copyMarkdown": "Αντιγραφή Markdown", "exportHtml": "Εξαγωγή HTML", + "fileNameLabel": "Όνομα αρχείου", + "fileNamePlaceholder": "export", + "exportSuccess": "Αποθηκεύτηκε το {name}", "copied": "Αντιγράφηκε", "charCount": "{count, plural, one {# χαρακτήρας} other {# χαρακτήρες}}", "emptyHint": "Ξεκινήστε να πληκτρολογείτε Markdown για να δείτε την προεπισκόπηση και την έξοδο HTML.", diff --git a/apps/desktop-ui/messages/en.json b/apps/desktop-ui/messages/en.json index b7172781..74be4c4f 100644 --- a/apps/desktop-ui/messages/en.json +++ b/apps/desktop-ui/messages/en.json @@ -3955,6 +3955,9 @@ "copyHtml": "Copy HTML", "copyMarkdown": "Copy Markdown", "exportHtml": "Export HTML", + "fileNameLabel": "File name", + "fileNamePlaceholder": "export", + "exportSuccess": "Saved {name}", "copied": "Copied", "charCount": "{count, plural, one {# character} other {# characters}}", "emptyHint": "Start typing Markdown to see the live preview and HTML output.", diff --git a/apps/desktop-ui/messages/es.json b/apps/desktop-ui/messages/es.json index e375ca3d..1d648af4 100644 --- a/apps/desktop-ui/messages/es.json +++ b/apps/desktop-ui/messages/es.json @@ -3912,6 +3912,9 @@ "copyHtml": "Copiar HTML", "copyMarkdown": "Copiar Markdown", "exportHtml": "Exportar HTML", + "fileNameLabel": "Nombre del archivo", + "fileNamePlaceholder": "export", + "exportSuccess": "Se guardó {name}", "copied": "Copiado", "charCount": "{count, plural, one {# carácter} other {# caracteres}}", "emptyHint": "Empieza a escribir Markdown para ver la vista previa y la salida HTML.", diff --git a/apps/desktop-ui/messages/fa.json b/apps/desktop-ui/messages/fa.json index b51051d3..ab5ea449 100644 --- a/apps/desktop-ui/messages/fa.json +++ b/apps/desktop-ui/messages/fa.json @@ -3912,6 +3912,9 @@ "copyHtml": "کپی HTML", "copyMarkdown": "کپی Markdown", "exportHtml": "خروجی HTML", + "fileNameLabel": "نام فایل", + "fileNamePlaceholder": "export", + "exportSuccess": "{name} ذخیره شد", "copied": "کپی شد", "charCount": "{count, plural, other {# کاراکتر}}", "emptyHint": "برای دیدن پیش‌نمایش زنده و خروجی HTML، Markdown تایپ کنید.", diff --git a/apps/desktop-ui/messages/fr.json b/apps/desktop-ui/messages/fr.json index d81dc1bd..3140255d 100644 --- a/apps/desktop-ui/messages/fr.json +++ b/apps/desktop-ui/messages/fr.json @@ -3912,6 +3912,9 @@ "copyHtml": "Copier le HTML", "copyMarkdown": "Copier le Markdown", "exportHtml": "Exporter le HTML", + "fileNameLabel": "Nom du fichier", + "fileNamePlaceholder": "export", + "exportSuccess": "{name} enregistré", "copied": "Copié", "charCount": "{count, plural, one {# caractère} other {# caractères}}", "emptyHint": "Commencez à taper du Markdown pour voir l'aperçu et la sortie HTML.", diff --git a/apps/desktop-ui/messages/id.json b/apps/desktop-ui/messages/id.json index e7bb6f71..038f002a 100644 --- a/apps/desktop-ui/messages/id.json +++ b/apps/desktop-ui/messages/id.json @@ -3901,6 +3901,9 @@ "copyHtml": "Salin HTML", "copyMarkdown": "Salin Markdown", "exportHtml": "Ekspor HTML", + "fileNameLabel": "Nama file", + "fileNamePlaceholder": "export", + "exportSuccess": "{name} disimpan", "copied": "Disalin", "charCount": "{count, plural, other {# karakter}}", "emptyHint": "Mulai mengetik Markdown untuk melihat pratinjau langsung dan output HTML.", diff --git a/apps/desktop-ui/messages/it.json b/apps/desktop-ui/messages/it.json index 628ee78c..d674c16e 100644 --- a/apps/desktop-ui/messages/it.json +++ b/apps/desktop-ui/messages/it.json @@ -3912,6 +3912,9 @@ "copyHtml": "Copia HTML", "copyMarkdown": "Copia Markdown", "exportHtml": "Esporta HTML", + "fileNameLabel": "Nome file", + "fileNamePlaceholder": "export", + "exportSuccess": "{name} salvato", "copied": "Copiato", "charCount": "{count, plural, one {# carattere} other {# caratteri}}", "emptyHint": "Inizia a digitare Markdown per vedere l'anteprima live e l'output HTML.", diff --git a/apps/desktop-ui/messages/ja.json b/apps/desktop-ui/messages/ja.json index 7e4e29dd..a113fd8a 100644 --- a/apps/desktop-ui/messages/ja.json +++ b/apps/desktop-ui/messages/ja.json @@ -3901,6 +3901,9 @@ "copyHtml": "HTMLをコピー", "copyMarkdown": "Markdownをコピー", "exportHtml": "HTMLをエクスポート", + "fileNameLabel": "ファイル名", + "fileNamePlaceholder": "export", + "exportSuccess": "{name} を保存しました", "copied": "コピーしました", "charCount": "{count, plural, other {# 文字}}", "emptyHint": "Markdownの入力を開始すると、ライブプレビューとHTML出力が表示されます。", diff --git a/apps/desktop-ui/messages/ko.json b/apps/desktop-ui/messages/ko.json index a457f19a..de039280 100644 --- a/apps/desktop-ui/messages/ko.json +++ b/apps/desktop-ui/messages/ko.json @@ -3901,6 +3901,9 @@ "copyHtml": "HTML 복사", "copyMarkdown": "Markdown 복사", "exportHtml": "HTML 내보내기", + "fileNameLabel": "파일 이름", + "fileNamePlaceholder": "export", + "exportSuccess": "{name} 저장됨", "copied": "복사됨", "charCount": "{count, plural, other {# 자}}", "emptyHint": "Markdown을 입력하면 실시간 미리보기와 HTML 출력을 볼 수 있습니다.", diff --git a/apps/desktop-ui/messages/ms.json b/apps/desktop-ui/messages/ms.json index c1fbc121..b67e2c33 100644 --- a/apps/desktop-ui/messages/ms.json +++ b/apps/desktop-ui/messages/ms.json @@ -3912,6 +3912,9 @@ "copyHtml": "Salin HTML", "copyMarkdown": "Salin Markdown", "exportHtml": "Eksport HTML", + "fileNameLabel": "Nama fail", + "fileNamePlaceholder": "export", + "exportSuccess": "{name} disimpan", "copied": "Disalin", "charCount": "{count, plural, other {# aksara}}", "emptyHint": "Mulakan menaip Markdown untuk melihat pratonton langsung dan output HTML.", diff --git a/apps/desktop-ui/messages/nb.json b/apps/desktop-ui/messages/nb.json index 0bd15dcf..0c821e07 100644 --- a/apps/desktop-ui/messages/nb.json +++ b/apps/desktop-ui/messages/nb.json @@ -3901,6 +3901,9 @@ "copyHtml": "Kopier HTML", "copyMarkdown": "Kopier Markdown", "exportHtml": "Eksporter HTML", + "fileNameLabel": "Filnavn", + "fileNamePlaceholder": "export", + "exportSuccess": "Lagret {name}", "copied": "Kopiert", "charCount": "{count, plural, one {# tegn} other {# tegn}}", "emptyHint": "Begynn å skrive Markdown for å se live-forhåndsvisning og HTML-utdata.", diff --git a/apps/desktop-ui/messages/nl.json b/apps/desktop-ui/messages/nl.json index 9f40ae87..924bf747 100644 --- a/apps/desktop-ui/messages/nl.json +++ b/apps/desktop-ui/messages/nl.json @@ -3901,6 +3901,9 @@ "copyHtml": "HTML kopiëren", "copyMarkdown": "Markdown kopiëren", "exportHtml": "HTML exporteren", + "fileNameLabel": "Bestandsnaam", + "fileNamePlaceholder": "export", + "exportSuccess": "{name} opgeslagen", "copied": "Gekopieerd", "charCount": "{count, plural, one {# teken} other {# tekens}}", "emptyHint": "Begin met het typen van Markdown om de live preview en HTML-uitvoer te zien.", diff --git a/apps/desktop-ui/messages/pl.json b/apps/desktop-ui/messages/pl.json index 7d290e31..608db375 100644 --- a/apps/desktop-ui/messages/pl.json +++ b/apps/desktop-ui/messages/pl.json @@ -3901,6 +3901,9 @@ "copyHtml": "Kopiuj HTML", "copyMarkdown": "Kopiuj Markdown", "exportHtml": "Eksportuj HTML", + "fileNameLabel": "Nazwa pliku", + "fileNamePlaceholder": "export", + "exportSuccess": "Zapisano {name}", "copied": "Skopiowano", "charCount": "{count, plural, one {# znak} few {# znaki} other {# znaków}}", "emptyHint": "Zacznij wpisywać Markdown, aby zobaczyć podgląd na żywo i wyjście HTML.", diff --git a/apps/desktop-ui/messages/pt-BR.json b/apps/desktop-ui/messages/pt-BR.json index 41b8a1bf..b83ce893 100644 --- a/apps/desktop-ui/messages/pt-BR.json +++ b/apps/desktop-ui/messages/pt-BR.json @@ -3901,6 +3901,9 @@ "copyHtml": "Copiar HTML", "copyMarkdown": "Copiar Markdown", "exportHtml": "Exportar HTML", + "fileNameLabel": "Nome do arquivo", + "fileNamePlaceholder": "export", + "exportSuccess": "{name} salvo", "copied": "Copiado", "charCount": "{count, plural, one {# caractere} other {# caracteres}}", "emptyHint": "Comece a digitar Markdown para ver a pré-visualização ao vivo e a saída HTML.", diff --git a/apps/desktop-ui/messages/pt.json b/apps/desktop-ui/messages/pt.json index d54101f6..c1209e4a 100644 --- a/apps/desktop-ui/messages/pt.json +++ b/apps/desktop-ui/messages/pt.json @@ -3901,6 +3901,9 @@ "copyHtml": "Copiar HTML", "copyMarkdown": "Copiar Markdown", "exportHtml": "Exportar HTML", + "fileNameLabel": "Nome do ficheiro", + "fileNamePlaceholder": "export", + "exportSuccess": "{name} guardado", "copied": "Copiado", "charCount": "{count, plural, one {# carácter} other {# caracteres}}", "emptyHint": "Comece a escrever Markdown para ver a pré-visualização em tempo real e a saída HTML.", diff --git a/apps/desktop-ui/messages/ru.json b/apps/desktop-ui/messages/ru.json index 75468f61..8f210ec8 100644 --- a/apps/desktop-ui/messages/ru.json +++ b/apps/desktop-ui/messages/ru.json @@ -3901,6 +3901,9 @@ "copyHtml": "Копировать HTML", "copyMarkdown": "Копировать Markdown", "exportHtml": "Экспорт HTML", + "fileNameLabel": "Имя файла", + "fileNamePlaceholder": "export", + "exportSuccess": "Сохранено: {name}", "copied": "Скопировано", "charCount": "{count, plural, one {# символ} few {# символа} other {# символов}}", "emptyHint": "Начните вводить Markdown, чтобы увидеть предпросмотр и HTML вывод.", diff --git a/apps/desktop-ui/messages/sv.json b/apps/desktop-ui/messages/sv.json index 84349c34..3e5f9d84 100644 --- a/apps/desktop-ui/messages/sv.json +++ b/apps/desktop-ui/messages/sv.json @@ -3912,6 +3912,9 @@ "copyHtml": "Kopiera HTML", "copyMarkdown": "Kopiera Markdown", "exportHtml": "Exportera HTML", + "fileNameLabel": "Filnamn", + "fileNamePlaceholder": "export", + "exportSuccess": "Sparade {name}", "copied": "Kopierat", "charCount": "{count, plural, one {# tecken} other {# tecken}}", "emptyHint": "Börja skriva Markdown för att se live-förhandsgranskning och HTML-utdata.", diff --git a/apps/desktop-ui/messages/tr.json b/apps/desktop-ui/messages/tr.json index 7eb13661..fb313431 100644 --- a/apps/desktop-ui/messages/tr.json +++ b/apps/desktop-ui/messages/tr.json @@ -3912,6 +3912,9 @@ "copyHtml": "HTML'yi Kopyala", "copyMarkdown": "Markdown'ı Kopyala", "exportHtml": "HTML'yi Dışa Aktar", + "fileNameLabel": "Dosya adı", + "fileNamePlaceholder": "export", + "exportSuccess": "{name} kaydedildi", "copied": "Kopyalandı", "charCount": "{count, plural, one {# karakter} other {# karakter}}", "emptyHint": "Canlı önizleme ve HTML çıktısını görmek için Markdown yazmaya başlayın.", diff --git a/apps/desktop-ui/messages/uk.json b/apps/desktop-ui/messages/uk.json index 39a67e43..7930c106 100644 --- a/apps/desktop-ui/messages/uk.json +++ b/apps/desktop-ui/messages/uk.json @@ -3912,6 +3912,9 @@ "copyHtml": "Копіювати HTML", "copyMarkdown": "Копіювати Markdown", "exportHtml": "Експортувати HTML", + "fileNameLabel": "Назва файлу", + "fileNamePlaceholder": "export", + "exportSuccess": "Збережено: {name}", "copied": "Скопійовано", "charCount": "{count, plural, one {# символ} few {# символи} other {# символів}}", "emptyHint": "Почніть вводити Markdown, щоб побачити попередній перегляд і HTML вивід.", diff --git a/apps/desktop-ui/messages/vi.json b/apps/desktop-ui/messages/vi.json index 225a33db..0c1a6c24 100644 --- a/apps/desktop-ui/messages/vi.json +++ b/apps/desktop-ui/messages/vi.json @@ -3901,6 +3901,9 @@ "copyHtml": "Sao chép HTML", "copyMarkdown": "Sao chép Markdown", "exportHtml": "Xuất HTML", + "fileNameLabel": "Tên tệp", + "fileNamePlaceholder": "export", + "exportSuccess": "Đã lưu {name}", "copied": "Đã sao chép", "charCount": "{count, plural, other {# ký tự}}", "emptyHint": "Bắt đầu nhập Markdown để xem bản xem trước trực tiếp và đầu ra HTML.", diff --git a/apps/desktop-ui/messages/zh.json b/apps/desktop-ui/messages/zh.json index aea85c0c..292ee13e 100644 --- a/apps/desktop-ui/messages/zh.json +++ b/apps/desktop-ui/messages/zh.json @@ -3901,6 +3901,9 @@ "copyHtml": "复制 HTML", "copyMarkdown": "复制 Markdown", "exportHtml": "导出 HTML", + "fileNameLabel": "文件名", + "fileNamePlaceholder": "export", + "exportSuccess": "已保存 {name}", "copied": "已复制", "charCount": "{count, plural, other {# 个字符}}", "emptyHint": "开始输入 Markdown 以查看实时预览和 HTML 输出。", diff --git a/apps/desktop-ui/src/components/markdown-preview-html/markdown-preview-html-layout.tsx b/apps/desktop-ui/src/components/markdown-preview-html/markdown-preview-html-layout.tsx index 92639879..f268f3c6 100644 --- a/apps/desktop-ui/src/components/markdown-preview-html/markdown-preview-html-layout.tsx +++ b/apps/desktop-ui/src/components/markdown-preview-html/markdown-preview-html-layout.tsx @@ -5,7 +5,10 @@ import { useCopyToClipboard } from '@/hooks/use-copy-to-clipboard'; import { useTranslations } from 'next-intl'; import { marked } from 'marked'; import TurndownService from 'turndown'; +import { toast } from 'sonner'; +import { safeFileName } from '@/lib/markdown-preview-html'; import { Card } from '@/components/ui/card'; +import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Button } from '@/components/ui/button'; @@ -76,6 +79,7 @@ export function MarkdownPreviewLayout() { // Markdown → HTML tab const [markdown, setMarkdown] = useState(''); const [outputTab, setOutputTab] = useState<'preview' | 'html'>('preview'); + const [fileName, setFileName] = useState('export'); const { isCopied: copiedHtml, copyToClipboard: copyHtml } = useCopyToClipboard(); // HTML → Markdown tab @@ -92,14 +96,16 @@ export function MarkdownPreviewLayout() { const handleExportHtml = useCallback(() => { if (!renderedHtml) return; + const name = `${safeFileName(fileName)}.html`; const blob = new Blob([buildFullHtml(renderedHtml)], { type: 'text/html' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; - a.download = 'export.html'; + a.download = name; a.click(); URL.revokeObjectURL(url); - }, [renderedHtml]); + toast.success(t('exportSuccess', { name })); + }, [renderedHtml, fileName, t]); const handleCopyMd = useCallback(() => { if (!convertedMarkdown) return; @@ -153,7 +159,17 @@ export function MarkdownPreviewLayout() { -
+
+
+ setFileName(e.target.value)} + aria-label={t('fileNameLabel')} + placeholder={t('fileNamePlaceholder')} + className="h-8 w-28 border-0 bg-transparent px-2 text-xs shadow-none focus-visible:ring-0" + /> + .html +