@@ -1748,10 +1507,8 @@ const selectionToolbarPosition = useMemo(() => {
gap="lg"
className="flex-1"
style={{
- gridColumn: '1 / 2',
- gridRow: 1,
minHeight: 0,
- height: 'calc(100vh - 3rem)',
+ flex: 1,
overflow: 'hidden',
}}
>
@@ -1788,65 +1545,208 @@ const selectionToolbarPosition = useMemo(() => {
title={
- {t('pdfTextEditor.welcomeBanner.title', 'Welcome to PDF Text Editor (Early Access)')}
+
+ {t(
+ 'pdfTextEditor.welcomeBanner.title',
+ 'Welcome to PDF Text Editor (Early Access)',
+ )}
+
}
centered
size="lg"
+ scrollAreaComponent={Box}
>
-
-
+
+ {/* Header (fixed) */}
+
- {t('pdfTextEditor.welcomeBanner.experimental', 'This is an experimental feature in active development. Expect some instability and issues during use.')}
+ {t(
+ 'pdfTextEditor.welcomeBanner.experimental',
+ 'This is an experimental feature in active development. Expect some instability and issues during use.',
+ )}
- {t('pdfTextEditor.welcomeBanner.howItWorks', 'This tool converts your PDF to an editable format where you can modify text content and reposition images. Changes are saved back as a new PDF.')}
+ {t(
+ 'pdfTextEditor.welcomeBanner.howItWorks',
+ 'This tool converts your PDF to an editable format where you can modify text content and reposition images. Changes are saved back as a new PDF.',
+ )}
+
+
+ {/* Body (scrollable) */}
+
+
+
+
+ {t('pdfTextEditor.welcomeBanner.bestFor', 'Works Best With:')}
+
+
+
+ {t(
+ 'pdfTextEditor.welcomeBanner.bestFor1',
+ 'Simple PDFs containing primarily text and images',
+ )}
+
+
+ {t(
+ 'pdfTextEditor.welcomeBanner.bestFor2',
+ 'Documents with standard paragraph formatting',
+ )}
+
+
+ {t(
+ 'pdfTextEditor.welcomeBanner.bestFor3',
+ 'Letters, essays, reports, and basic documents',
+ )}
+
+
+
+
+ {t('pdfTextEditor.welcomeBanner.notIdealFor', 'Not Ideal For:')}
+
+
+
+ {t(
+ 'pdfTextEditor.welcomeBanner.notIdealFor1',
+ 'PDFs with special formatting like bullet points, tables, or multi-column layouts',
+ )}
+
+
+ {t(
+ 'pdfTextEditor.welcomeBanner.notIdealFor2',
+ 'Magazines, brochures, or heavily designed documents',
+ )}
+
+
+ {t(
+ 'pdfTextEditor.welcomeBanner.notIdealFor3',
+ 'Instruction manuals with complex layouts',
+ )}
+
+
+
+
+ {t('pdfTextEditor.welcomeBanner.limitations', 'Current Limitations:')}
+
+
+
+ {t(
+ 'pdfTextEditor.welcomeBanner.limitation1',
+ 'Font rendering may differ slightly from the original PDF',
+ )}
+
+
+ {t(
+ 'pdfTextEditor.welcomeBanner.limitation2',
+ 'Complex graphics, form fields, and annotations are preserved but not editable',
+ )}
+
+
+ {t(
+ 'pdfTextEditor.welcomeBanner.limitation3',
+ 'Large files may take time to convert and process',
+ )}
+
+
+
+
+ {t('pdfTextEditor.welcomeBanner.knownIssues', 'Known Issues (Being Fixed):')}
+
+
+
+ {t(
+ 'pdfTextEditor.welcomeBanner.issue1',
+ 'Text colour is not currently preserved (will be added soon)',
+ )}
+
+
+ {t(
+ 'pdfTextEditor.welcomeBanner.issue2',
+ 'Paragraph mode has more alignment and spacing issues - Single Line mode recommended',
+ )}
+
+
+ {t(
+ 'pdfTextEditor.welcomeBanner.issue3',
+ 'The preview display differs from the exported PDF - exported PDFs are closer to the original',
+ )}
+
+
+ {t(
+ 'pdfTextEditor.welcomeBanner.issue4',
+ 'Rotated text alignment may need manual adjustment',
+ )}
+
+
+ {t(
+ 'pdfTextEditor.welcomeBanner.issue5',
+ 'Transparency and layering effects may vary from original',
+ )}
+
+
+
+
+
+ {/* Footer (fixed) */}
+
-
- {t('pdfTextEditor.welcomeBanner.bestFor', 'Works Best With:')}
+
+ {t(
+ 'pdfTextEditor.welcomeBanner.feedback',
+ 'This is an early access feature. Please report any issues you encounter to help us improve!',
+ )}
-
- {t('pdfTextEditor.welcomeBanner.bestFor1', 'Simple PDFs containing primarily text and images')}
- {t('pdfTextEditor.welcomeBanner.bestFor2', 'Documents with standard paragraph formatting')}
- {t('pdfTextEditor.welcomeBanner.bestFor3', 'Letters, essays, reports, and basic documents')}
-
-
-
- {t('pdfTextEditor.welcomeBanner.notIdealFor', 'Not Ideal For:')}
-
-
- {t('pdfTextEditor.welcomeBanner.notIdealFor1', 'PDFs with special formatting like bullet points, tables, or multi-column layouts')}
- {t('pdfTextEditor.welcomeBanner.notIdealFor2', 'Magazines, brochures, or heavily designed documents')}
- {t('pdfTextEditor.welcomeBanner.notIdealFor3', 'Instruction manuals with complex layouts')}
-
-
-
- {t('pdfTextEditor.welcomeBanner.limitations', 'Current Limitations:')}
-
-
- {t('pdfTextEditor.welcomeBanner.limitation1', 'Font rendering may differ slightly from the original PDF')}
- {t('pdfTextEditor.welcomeBanner.limitation2', 'Complex graphics, form fields, and annotations are preserved but not editable')}
- {t('pdfTextEditor.welcomeBanner.limitation3', 'Large files may take time to convert and process')}
-
-
-
- {t('pdfTextEditor.welcomeBanner.knownIssues', 'Known Issues (Being Fixed):')}
-
-
- {t('pdfTextEditor.welcomeBanner.issue1', 'Text colour is not currently preserved (will be added soon)')}
- {t('pdfTextEditor.welcomeBanner.issue2', 'Paragraph mode has more alignment and spacing issues - Single Line mode recommended')}
- {t('pdfTextEditor.welcomeBanner.issue3', 'The preview display differs from the exported PDF - exported PDFs are closer to the original')}
- {t('pdfTextEditor.welcomeBanner.issue4', 'Rotated text alignment may need manual adjustment')}
- {t('pdfTextEditor.welcomeBanner.issue5', 'Transparency and layering effects may vary from original')}
-
-
-
- {t('pdfTextEditor.welcomeBanner.feedback', 'This is an early access feature. Please report any issues you encounter to help us improve!')}
-
-
+
@@ -1854,8 +1754,8 @@ const selectionToolbarPosition = useMemo(() => {
{t('pdfTextEditor.welcomeBanner.dontShowAgain', "Don't show again")}
-
-
+
+
{
)}
- {/* Mode Change Confirmation Modal */}
-
-
-
- {t(
- 'pdfTextEditor.modeChange.warning',
- 'Changing the text grouping mode will reset all unsaved changes. Are you sure you want to continue?'
- )}
-
-
-
-
-
-
-
-
{/* Navigation Warning Modal */}
{
+ const { t } = useTranslation();
+
+ return {
+ header: {
+ title: t('pdfTextEditor.tooltip.header.title', 'Preview Limitations'),
+ },
+ tips: [
+ {
+ title: t('pdfTextEditor.tooltip.textFocus.title', 'Text and Image Focus'),
+ description: t(
+ 'pdfTextEditor.tooltip.textFocus.text',
+ 'This workspace focuses on editing text and repositioning embedded images. Complex page artwork, form widgets, and layered graphics are preserved for export but are not fully editable here.'
+ ),
+ },
+ {
+ title: t('pdfTextEditor.tooltip.previewVariance.title', 'Preview Variance'),
+ description: t(
+ 'pdfTextEditor.tooltip.previewVariance.text',
+ 'Some visuals (such as table borders, shapes, or annotation appearances) may not display exactly in the preview. The exported PDF keeps the original drawing commands whenever possible.'
+ ),
+ },
+ {
+ title: t('pdfTextEditor.tooltip.alpha.title', 'Alpha Viewer'),
+ description: t(
+ 'pdfTextEditor.tooltip.alpha.text',
+ 'This alpha viewer is still evolving—certain fonts, colours, transparency effects, and layout details may shift slightly. Please double-check the generated PDF before sharing.'
+ ),
+ },
+ ],
+ };
+};
+
diff --git a/frontend/src/core/tools/pdfTextEditor/PdfTextEditor.tsx b/frontend/src/core/tools/pdfTextEditor/PdfTextEditor.tsx
index 422b06603..25309c0cf 100644
--- a/frontend/src/core/tools/pdfTextEditor/PdfTextEditor.tsx
+++ b/frontend/src/core/tools/pdfTextEditor/PdfTextEditor.tsx
@@ -34,6 +34,7 @@ import {
valueOr,
} from '@app/tools/pdfTextEditor/pdfTextEditorUtils';
import PdfTextEditorView from '@app/components/tools/pdfTextEditor/PdfTextEditorView';
+import PdfTextEditorSidebar from '@app/components/tools/pdfTextEditor/PdfTextEditorSidebar';
import type { PDFDocumentProxy } from 'pdfjs-dist';
const WORKBENCH_VIEW_ID = 'pdfTextEditorWorkbench';
@@ -228,6 +229,7 @@ const PdfTextEditor = ({ onComplete, onError }: BaseToolProps) => {
const [groupingMode, setGroupingMode] = useState<'auto' | 'paragraph' | 'singleLine'>('auto');
const [hasVectorPreview, setHasVectorPreview] = useState(false);
const [pagePreviews, setPagePreviews] = useState