merge dev to main#2
Merged
Merged
Conversation
…ctive workspace name
- Replace recursive container padding with level-based inline style padding in FileTreeItem.vue to prevent text squishing on deeply nested folders (e.g. 6+ levels).
- Add dynamic workspaceName computed property to CompilerTab.vue to display the active working directory in the sidebar header with graceful truncation.
Add draggable divider between code editor and PDF preview panel Add header button to toggle PDF preview panel visibility
Disable iframe pointer events during resizing to prevent mouse trapping Clamp preview pane width with Math bounds for smooth bidirectional dragging
Set 180px minimum width on file tree sidebar to preserve file label readability Add auto-snap collapse behavior when dragging resizer under 100px
…t menu Remove cluttering action buttons on file tree item hover Add teleported custom context menu for file creation, renaming, deletion, and main file selection
Set overflow-x auto on file tree container to allow horizontal panning on deep nesting Use width max-content and min-width 100% on tree rows to prevent label clipping
…heme tokens Capture and restore scrollLeft and scrollTop in refreshFileTree to maintain horizontal tree scroll state Remove background loading spinner toggle on compile to prevent DOM unmounting Refactor context menu CSS to consume pure global theme variables for customized theme support
Set iframe to display block and pdf-viewer to flex overflow hidden to eliminate baseline whitespace Update pdf-viewer background to use global theme var(--bg)
…space Unconstrain refinement bar from editor wrapper and attach drag bounds to main compiler container Elevate z-index and adjust drag physics to float smoothly over sidebar and PDF preview
…lorer reveal actions Add full directory path subtext and system explorer reveal buttons to sidebar header Add Open File and Switch Folder buttons to sidebar toolbar for seamless file management Add Reveal in System Explorer item to right-click context menu in FileTreeItem
… upgrade auto-compile button Stack workspace info on top layer and action tools on bottom layer to prevent label squishing Replace browser checkbox with Zap action button for Auto Compile with explicit active state styling
…ty workspace buttons Enforce fixed dimensions and flex-start alignment on sidebar header tool buttons Add 10px gap between Open Folder and Open File buttons in empty workspace view
Ensure standalone or previous cross-workspace files are unmounted when a new directory is selected Attempt to automatically load the workspace's main file into the editor upon open
…active Refactor compilePdf path resolution to dynamically detect if active file is outside workspace Use external file's parent directory as isolated workspace context during compilation
…RL execution Resolve regex validation failures on local file paths when opening the system explorer Implement revealItemInDir for local paths and openUrl for web links
…wer security exceptions Apply strict CSS to PDF object to remove 2-10px inline descender gap Use setTimeout when restoring file tree scroll coordinates after compilation to prevent UI shaking
- Replaced native iframe/object PDF embeds with vue-pdf-embed (pdf.js). - Bypassed WebKitGTK SecurityError caused by internal webkit-pdfjs-viewer during production. - Updated CompilerTab and JobDetailView templates and adjusted CSS for scaling/scrolling. - Added vue-pdf-embed dependency.
This prevents the webview from scaling the entire UI via trackpad or touch gestures, reserving zoo
…tions with auto-hide
…ting connection settings
There was a problem hiding this comment.
Pull request overview
This PR merges development changes into main, introducing a new PDF preview/streaming approach for LaTeX compilation, UI/UX improvements across the editor and job detail views, and updates to AI provider support and the browser extensions.
Changes:
- Switch PDF preview from blob/iframe to
vue-pdf-embedwith chunked HTTP range streaming from a local/static-pdf/output.pdfendpoint. - Add DeepSeek as an AI provider option (frontend + Rust backend provider wiring).
- Improve workspace/file explorer UX (open single file, reveal in system explorer, context menus, resizable preview panes) and enhance extension interactive extraction (exclude selector + toast updates).
Reviewed changes
Copilot reviewed 30 out of 33 changed files in this pull request and generated 13 comments.
Show a summary per file
| File | Description |
|---|---|
tectonic.compiler |
Adds prose documentation about compiler behavior (currently not aligned with new streaming/output behavior). |
src/style.css |
Adds touch-action behavior to reduce gesture zoom interference. |
src/main.ts |
Adds global wheel/touch handlers to prevent pinch-to-zoom. |
src/components/SettingsTab.vue |
Adds DeepSeek provider and model options in settings UI. |
src/components/JobDetailView.vue |
Adds split-pane editor/PDF preview with vue-pdf-embed, per-mode state separation, and opener-based URL handling. |
src/components/FileTreeItem.vue |
Reworks file tree interactions with a right-click context menu, indentation levels, and “reveal in explorer”. |
src/components/DiagramTab.vue |
Improves sidebar header/tools, adds open-file and reveal-in-explorer actions, and preview toggle. |
src/components/CompilerTab.vue |
Major IDE UX updates: resizable preview pane, vue-pdf-embed preview, open single file, reveal workspace, improved refresh behavior, and compilation path handling. |
src/components/AboutTab.vue |
Switches external link opening to @tauri-apps/plugin-opener. |
src/App.vue |
Switches external link opening to @tauri-apps/plugin-opener. |
src-tauri/test_deepseek.rs |
Adds a small DeepSeek client test file (appears to be ad-hoc). |
src-tauri/tauri.conf.json |
Disables zoom hotkeys; enables asset protocol broadly; disables CSP. |
src-tauri/src/server.rs |
Adds /static-pdf/output.pdf streaming endpoint (supports Range) and loosens CORS. |
src-tauri/src/lib.rs |
Adds tauri-plugin-localhost. |
src-tauri/src/commands/pdf.rs |
Writes compiled PDFs to Documents/RoleTect/output.pdf to support streaming preview endpoint. |
src-tauri/src/ai.rs |
Adds DeepSeek provider support via rig::providers::deepseek. |
src-tauri/Cargo.toml |
Enables tauri asset protocol feature and adds new dependencies (tauri-plugin-localhost, tokio-util). |
src-tauri/Cargo.lock |
Updates lockfile for new Rust dependencies. |
README.md |
Adds Firefox add-on badge and link to a local report PDF. |
package.json |
Adds vue-pdf-embed dependency. |
index.html |
Updates viewport to disable user scaling. |
extentions/firefox/popup.js |
Adds exclude selector support and improves status/toast behavior. |
extentions/firefox/popup.html |
Updates interactive button styling and adds fixed-position status toast container. |
extentions/firefox/manifest.json |
Bumps version, adds tabs permission, relaxes minimum Firefox version. |
extentions/firefox/content.js |
Adds injection guard and supports exclude selector during interactive extraction; improves noise filtering. |
extentions/firefox/background.js |
Passes exclude selector through interactive flow and relies on tabs API. |
extentions/chrome/popup.js |
Adds exclude selector support and improves status/toast behavior. |
extentions/chrome/popup.html |
Updates interactive button styling and adds fixed-position status toast container. |
extentions/chrome/manifest.json |
Bumps version. |
extentions/chrome/content.js |
Adds injection guard and supports exclude selector during interactive extraction; improves noise filtering. |
extentions/chrome/background.js |
Passes exclude selector through interactive flow. |
bun.lock |
Adds vue-pdf-embed and its transitive dependencies to the Bun lockfile. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
40
to
43
| let cors = CorsLayer::new() | ||
| .allow_origin([ | ||
| "http://localhost:1420".parse().unwrap(), | ||
| "tauri://localhost".parse().unwrap(), | ||
| ]) | ||
| .allow_origin(Any) | ||
| .allow_methods(Any) | ||
| .allow_headers(Any); |
Comment on lines
+146
to
+147
| let docs_dir = state.app_handle.path().document_dir().expect("Failed to locate Documents folder"); | ||
| let file_path = docs_dir.join("RoleTect").join("output.pdf"); |
Comment on lines
+165
to
+171
| let start = parts[0].parse::<u64>().unwrap_or(0); | ||
| let end_str = parts[1]; | ||
| let mut end = if end_str.is_empty() { file_len - 1 } else { end_str.parse::<u64>().unwrap_or(file_len - 1) }; | ||
| end = std::cmp::min(end, file_len - 1); | ||
|
|
||
| if start <= end { | ||
| let length = end - start + 1; |
Comment on lines
+152
to
+156
| // Copy it to Documents/RoleTect/output.pdf | ||
| let _ = std::fs::write(&output_pdf_path, &pdf_data); | ||
|
|
||
| // Clean up temp dir | ||
| let _ = std::fs::remove_dir_all(&temp_output_dir); |
Comment on lines
+243
to
+245
| // ALSO copy to Documents/RoleTect/output.pdf | ||
| let _ = std::fs::write(&output_pdf_path, &pdf_data); | ||
|
|
| const resumeInstruction = ref(''); | ||
| const resumeLatex = ref(''); | ||
| const resumePdfUrl = ref<string | null>(null); | ||
| const resumePdfUrl = ref<any>(null); |
| const clInstruction = ref(''); | ||
| const clLatex = ref(''); | ||
| const clPdfUrl = ref<string | null>(null); | ||
| const clPdfUrl = ref<any>(null); |
Comment on lines
+267
to
+268
| import { onUnmounted } from 'vue'; | ||
| onUnmounted(() => { |
Comment on lines
+1
to
+5
| use rig::providers::deepseek; | ||
|
|
||
| fn main() { | ||
| let client = deepseek::Client::new("key"); | ||
| } |
Comment on lines
+1
to
+13
| Here is exactly what the code in CompilerTab.vue and pdf.rs does for those three different scenarios. The frontend uses some clever logic to figure out which approach to take based on what you | ||
| have open! | ||
|
|
||
| ### Scenario 1: Unsaved .tex (Scratchpad Mode) | ||
|
|
||
| • Trigger: You haven't selected or saved any file to the disk yet, you just have raw code in the editor ( !compileTarget ). | ||
| • Frontend Action: It invokes the compile_resume_to_pdf command, passing the raw string from the editor ( latexCode.value ). | ||
| • Rust Backend Action: | ||
| 1. Tectonic is booted up with no physical root directory. | ||
| 2. The raw string is fed directly into Tectonic's virtual memory buffer. | ||
| 3. The compilation runs entirely in RAM. | ||
| 4. The generated PDF bytes are extracted from the virtual memory and sent back to the frontend. | ||
| 5. Nothing is written to your hard drive. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.