fix: fit wide tables when printing, keep editor panes from collapsing, rename Upload to Select in Markdown to PDF

This commit is contained in:
alam00000
2026-10-22 13:34:35 +05:30
parent 5a5e155cc2
commit 4d3e8b964f
26 changed files with 91 additions and 36 deletions
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "اكتب أو الصق Markdown وصدّره كـ PDF منسق بشكل جميل.",
"paneMarkdown": "Markdown",
"panePreview": "معاينة",
"btnUpload": "رفع",
"btnUpload": "اختيار",
"btnSyncScroll": "مزامنة التمرير",
"btnSettings": "الإعدادات",
"btnExportPdf": "تصدير PDF",
+1 -1
View File
@@ -842,7 +842,7 @@
"subtitle": "Напісаць або ўставіць Markdown і экспартаваць яго ў прыгожа аформлены PDF.",
"paneMarkdown": "Markdown",
"panePreview": "Папярэдні прагляд",
"btnUpload": "Запампаваць",
"btnUpload": "Выбраць",
"btnSyncScroll": "Сінхранізацыя пракруткі",
"btnSettings": "Налады",
"btnExportPdf": "Экспартаваць PDF",
+1 -1
View File
@@ -864,7 +864,7 @@
"subtitle": "Escriu o enganxa Markdown i exporta'l com un PDF amb un format acurat.",
"paneMarkdown": "Markdown",
"panePreview": "Previsualització",
"btnUpload": "Puja",
"btnUpload": "Selecciona",
"btnSyncScroll": "Sincronitza el desplaçament",
"btnSettings": "Configuració",
"btnExportPdf": "Exporta el PDF",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "Skriv eller indsæt Markdown og eksportér som en flot formateret PDF.",
"paneMarkdown": "Markdown",
"panePreview": "Forhåndsvisning",
"btnUpload": "Upload",
"btnUpload": "Vælg",
"btnSyncScroll": "Synkron rulning",
"btnSettings": "Indstillinger",
"btnExportPdf": "Eksportér PDF",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "Schreiben oder fügen Sie Markdown ein und exportieren Sie es als schön formatiertes PDF.",
"paneMarkdown": "Markdown",
"panePreview": "Vorschau",
"btnUpload": "Hochladen",
"btnUpload": "Auswählen",
"btnSyncScroll": "Sync-Scrollen",
"btnSettings": "Einstellungen",
"btnExportPdf": "PDF exportieren",
+1 -1
View File
@@ -856,7 +856,7 @@
"subtitle": "Write or paste Markdown and export it as a beautifully formatted PDF.",
"paneMarkdown": "Markdown",
"panePreview": "Preview",
"btnUpload": "Upload",
"btnUpload": "Select",
"btnSyncScroll": "Sync Scroll",
"btnSettings": "Settings",
"btnExportPdf": "Export PDF",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "Escribe o pega Markdown y expórtalo como un PDF bellamente formateado.",
"paneMarkdown": "Markdown",
"panePreview": "Vista Previa",
"btnUpload": "Cargar",
"btnUpload": "Seleccionar",
"btnSyncScroll": "Sincronizar Desplazamiento",
"btnSettings": "Configuración",
"btnExportPdf": "Exportar PDF",
+1 -1
View File
@@ -856,7 +856,7 @@
"subtitle": "Markdown بنویسید یا بچسبانید و آن را به‌صورت یک PDF زیبا برون‌ریزی کنید.",
"paneMarkdown": "Markdown",
"panePreview": "پیش‌نمایش",
"btnUpload": "بارگذاری",
"btnUpload": "انتخاب",
"btnSyncScroll": "پیمایش هم‌زمان",
"btnSettings": "تنظیمات",
"btnExportPdf": "برون‌ریزی PDF",
+1 -1
View File
@@ -855,7 +855,7 @@
"subtitle": "Écrire ou coller du Markdown et l’exporter en PDF avec une mise en forme soignée.",
"paneMarkdown": "Markdown",
"panePreview": "Aperçu",
"btnUpload": "Téléverser",
"btnUpload": "Sélectionner",
"btnSyncScroll": "Synchroniser le défilement",
"btnSettings": "Paramètres",
"btnExportPdf": "Exporter en PDF",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "Tulis atau tempel Markdown dan ekspor sebagai PDF yang diformat dengan indah.",
"paneMarkdown": "Markdown",
"panePreview": "Pratinjau",
"btnUpload": "Unggah",
"btnUpload": "Pilih",
"btnSyncScroll": "Sinkron Gulir",
"btnSettings": "Pengaturan",
"btnExportPdf": "Ekspor PDF",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "Scrivi o incolla Markdown ed esportalo come un PDF ben formattato.",
"paneMarkdown": "Markdown",
"panePreview": "Anteprima",
"btnUpload": "Carica",
"btnUpload": "Seleziona",
"btnSyncScroll": "Sincronizza scorrimento",
"btnSettings": "Impostazioni",
"btnExportPdf": "Esporta PDF",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "Markdownを記述または貼り付けて、見栄えの良いPDFとしてエクスポートします。",
"paneMarkdown": "マークダウン",
"panePreview": "プレビュー",
"btnUpload": "アップロード",
"btnUpload": "選択",
"btnSyncScroll": "同期スクロール",
"btnSettings": "設定",
"btnExportPdf": "PDFをエクスポート",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "Markdown을 작성하거나 붙여넣고 깔끔하게 서식이 적용된 PDF로 내보냅니다.",
"paneMarkdown": "Markdown",
"panePreview": "미리보기",
"btnUpload": "업로드",
"btnUpload": "선택",
"btnSyncScroll": "스크롤 동기화",
"btnSettings": "설정",
"btnExportPdf": "PDF 내보내기",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "Schrijf of plak Markdown en zet het om in een opgemaakte PDF.",
"paneMarkdown": "Markdown",
"panePreview": "Voorbeeld",
"btnUpload": "Laden",
"btnUpload": "Selecteren",
"btnSyncScroll": "Synchroon bladeren",
"btnSettings": "Instellingen",
"btnExportPdf": "PDF exporteren",
+1 -1
View File
@@ -677,7 +677,7 @@
"subtitle": "Napisz lub wklej Markdown i wyeksportuj jako pięknie sformatowany PDF.",
"paneMarkdown": "Markdown",
"panePreview": "Podgląd",
"btnUpload": "Prześlij",
"btnUpload": "Wybierz",
"btnSyncScroll": "Zsynchronizowane przewijanie",
"btnSettings": "Ustawienia",
"btnExportPdf": "Eksportuj PDF",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "Escreva ou cole Markdown e exporte como um belo formato PDF.",
"paneMarkdown": "Markdown",
"panePreview": "Pré-visualizar",
"btnUpload": "Upload",
"btnUpload": "Selecionar",
"btnSyncScroll": "Sincronizar Scroll",
"btnSettings": "Configurações",
"btnExportPdf": "Exportar PDF",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "Написать или вставить Markdown, чтобы экспортировать его в виде отформатированного PDF.",
"paneMarkdown": "Markdown",
"panePreview": "Предварительный просмотр",
"btnUpload": "Загрузить",
"btnUpload": "Выбрать",
"btnSyncScroll": "Синхронизировать прокрутку",
"btnSettings": "Настройки",
"btnExportPdf": "Экспортировать PDF",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "Napíšte alebo vložte Markdown a exportujte ho ako krásne naformátované PDF.",
"paneMarkdown": "Markdown",
"panePreview": "Náhľad",
"btnUpload": "Nahrať",
"btnUpload": "Vybrať",
"btnSyncScroll": "Synchrónne posúvanie",
"btnSettings": "Nastavenia",
"btnExportPdf": "Exportovať PDF",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "Skriv eller klistra in Markdown och exportera som en vackert formaterad PDF.",
"paneMarkdown": "Markdown",
"panePreview": "Förhandsvisning",
"btnUpload": "Ladda upp",
"btnUpload": "Välj",
"btnSyncScroll": "Synkronisera scroll",
"btnSettings": "Inställningar",
"btnExportPdf": "Exportera PDF",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "Write or paste Markdown and export it as a beautifully formatted PDF.",
"paneMarkdown": "Markdown",
"panePreview": "Preview",
"btnUpload": "Upload",
"btnUpload": "Seç",
"btnSyncScroll": "Sync Scroll",
"btnSettings": "Settings",
"btnExportPdf": "Export PDF",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "Напишіть або вставте Markdown і експортуйте його у красиво оформлений PDF.",
"paneMarkdown": "Markdown",
"panePreview": "Попередній перегляд",
"btnUpload": "Завантажити",
"btnUpload": "Вибрати",
"btnSyncScroll": "Синхронізувати прокрутку",
"btnSettings": "Налаштування",
"btnExportPdf": "Експортувати у PDF",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "Viết hoặc dán Markdown và xuất nó thành PDF được định dạng đẹp.",
"paneMarkdown": "Markdown",
"panePreview": "Xem trước",
"btnUpload": "Tải lên",
"btnUpload": "Chọn",
"btnSyncScroll": "Cuộn đồng bộ",
"btnSettings": "Cài đặt",
"btnExportPdf": "Xuất PDF",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "編寫或貼上 Markdown 並匯出為精美格式的 PDF。",
"paneMarkdown": "Markdown",
"panePreview": "預覽",
"btnUpload": "上傳",
"btnUpload": "選擇",
"btnSyncScroll": "同步捲動",
"btnSettings": "設定",
"btnExportPdf": "匯出 PDF",
+1 -1
View File
@@ -840,7 +840,7 @@
"subtitle": "编写或粘贴 Markdown 并将其导出为精美格式的 PDF。",
"paneMarkdown": "Markdown",
"panePreview": "预览",
"btnUpload": "上传",
"btnUpload": "选择",
"btnSyncScroll": "同步滚动",
"btnSettings": "设置",
"btnExportPdf": "导出 PDF",
+36 -11
View File
@@ -115,7 +115,7 @@
/* Split View Container */
.md-editor-main {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
gap: 1rem;
height: 600px;
border: 1px solid rgb(55, 65, 81);
@@ -127,6 +127,7 @@
display: flex;
flex-direction: column;
min-height: 0;
min-width: 0;
background: rgb(31, 41, 55);
}
@@ -284,6 +285,22 @@
padding-left: 2em;
}
.md-editor-preview ul {
list-style-type: disc;
}
.md-editor-preview ul ul {
list-style-type: circle;
}
.md-editor-preview ul ul ul {
list-style-type: square;
}
.md-editor-preview ol {
list-style-type: decimal;
}
.md-editor-preview li {
margin: 0.25em 0;
}
@@ -559,7 +576,6 @@
/* Print Styles */
@media print {
/* Reset all backgrounds, margins, and padding */
html,
body {
@@ -584,10 +600,10 @@
nav,
footer,
#back-to-tools,
.bg-gray-800>h1.text-2xl,
.bg-gray-800>p.text-gray-400,
#markdown-editor-container~h1,
#markdown-editor-container~p {
.bg-gray-800 > h1.text-2xl,
.bg-gray-800 > p.text-gray-400,
#markdown-editor-container ~ h1,
#markdown-editor-container ~ p {
display: none !important;
}
@@ -600,7 +616,7 @@
.py-8,
.px-4,
#markdown-editor-container,
[class*="container"] {
[class*='container'] {
padding: 0 !important;
margin: 0 !important;
background: white !important;
@@ -646,6 +662,7 @@
background: white !important;
color: black !important;
padding: 0 !important;
overflow-wrap: break-word;
}
.md-editor-preview h1,
@@ -658,8 +675,8 @@
page-break-after: avoid;
}
.md-editor-preview>h1:first-child,
.md-editor-preview>*:first-child {
.md-editor-preview > h1:first-child,
.md-editor-preview > *:first-child {
margin-top: 0 !important;
}
@@ -682,10 +699,13 @@
background: #f6f8fa !important;
border: 1px solid #e1e4e8 !important;
page-break-inside: avoid;
white-space: pre-wrap !important;
overflow-wrap: anywhere;
}
.md-editor-preview pre code {
color: #24292e !important;
white-space: pre-wrap !important;
}
.md-editor-preview blockquote {
@@ -697,6 +717,11 @@
page-break-inside: avoid;
}
.md-editor-preview table.md-table-break-anywhere th,
.md-editor-preview table.md-table-break-anywhere td {
overflow-wrap: anywhere;
}
.md-editor-preview th,
.md-editor-preview td {
border-color: #e1e4e8 !important;
@@ -750,7 +775,7 @@
}
.md-editor-main {
grid-template-columns: 1fr;
grid-template-columns: minmax(0, 1fr);
height: auto;
gap: 0;
}
@@ -814,4 +839,4 @@
.md-editor-actions {
gap: 0.375rem;
}
}
}
+31 -1
View File
@@ -75,6 +75,9 @@ export interface MarkdownEditorOptions {
export type { MarkdownItOptions } from '@/types';
const MIN_TABLE_ZOOM = 0.6;
const TABLE_BREAK_CLASS = 'md-table-break-anywhere';
const DEFAULT_MARKDOWN = `# Welcome to BentoPDF Markdown Editor
This is a **live preview** markdown editor with full plugin support.
@@ -342,7 +345,7 @@ export class MarkdownEditor {
<input type="file" accept=".md,.markdown,.txt" id="mdFileInput" style="display: none;" />
<button class="md-editor-btn md-editor-btn-secondary" id="mdUpload">
<i data-lucide="upload"></i>
<span data-i18n="tools:markdownToPdf.btnUpload">Upload</span>
<span data-i18n="tools:markdownToPdf.btnUpload">Select</span>
</button>
<div class="theme-toggle">
<i data-lucide="moon" width="16" height="16"></i>
@@ -439,6 +442,13 @@ export class MarkdownEditor {
this.updatePreview();
});
window
.matchMedia('print')
.addEventListener('change', (event) =>
this.fitTablesToPage(event.matches)
);
window.addEventListener('afterprint', () => this.fitTablesToPage(false));
// Sync scroll
const syncScrollBtn = document.getElementById('mdSyncScroll');
syncScrollBtn?.addEventListener('click', () => {
@@ -752,6 +762,26 @@ export class MarkdownEditor {
});
}
private fitTablesToPage(printing: boolean): void {
if (!this.preview) return;
const available = this.preview.clientWidth;
for (const table of this.preview.querySelectorAll('table')) {
table.style.zoom = '';
table.classList.remove(TABLE_BREAK_CLASS);
if (!printing || table.scrollWidth <= available) continue;
if (available / table.scrollWidth < MIN_TABLE_ZOOM) {
table.classList.add(TABLE_BREAK_CLASS);
}
let zoom = 1;
for (let attempt = 0; attempt < 5; attempt++) {
const width = table.getBoundingClientRect().width;
if (width <= available) break;
zoom = Math.floor(((zoom * available) / width) * 100) / 100;
table.style.zoom = String(zoom);
}
}
}
private exportPdf(): void {
// Use browser's native print functionality
window.print();