Files
zblade.dev/src/pages/changelog.astro
T

728 lines
23 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
import BaseLayout from '../layouts/BaseLayout.astro';
---
<BaseLayout title="Changelog - Zaguán Blade" description="Release history and changes for Zaguán Blade.">
<main>
<!-- Hero Section -->
<section class="changelog-hero">
<div class="container">
<div class="hero-content">
<div class="hero-label">// CHANGELOG.md</div>
<h1 class="hero-title">
<span class="title-line-1">CHANGELOG</span>
<span class="title-accent">RELEASE_HISTORY_</span>
</h1>
<p class="hero-description">
Track the evolution of Zaguán Blade. See what's new, what's fixed, and what's coming.
</p>
</div>
</div>
</section>
<!-- v0.2.0 Section -->
<section class="changelog-section">
<div class="container">
<div class="version-card">
<div class="version-header">
<div class="version-info">
<h2 class="version-number">v0.2.0</h2>
<span class="version-date">TBD</span>
</div>
<span class="version-badge badge-development">Development</span>
</div>
<div class="version-content">
<div class="changes-section">
<h3 class="changes-title">
<span class="changes-icon">✨</span>
Enhancements
</h3>
<ul class="changes-list">
<li>When selecting a screenshot, added a half-second delay before capturing to allow time for UI elements (like window selection boxes) to disappear.</li>
<li><strong>Git performance.</strong> Replaced most external <code>git</code> calls with <code>gix</code> for faster, more efficient Git operations.</li>
</ul>
</div>
<div class="changes-section">
<h3 class="changes-title">
<span class="changes-icon">✨</span>
New Features
</h3>
<ul class="changes-list">
<li><strong>Brand new App Icon.</strong> Redesigned app icon with a fresh, modern look.</li>
<li><strong>Git graph visualization.</strong> Implemented a Git graph of the 50 latest commits with a details popup for viewing commit information.</li>
<li><strong>Ollama Cloud support.</strong> Added support for Ollama Cloud. Requires an account at ollama.com.</li>
</ul>
</div>
</h3>
<ul class="changes-list">
<li>Fixed the Blade Terminal echo bug when the model is using the <code>run_command</code> tool call.</li>
<li>Fixed <code>run_command</code> tool calls in AI Chat appearing above already run (or failed) commands instead of below them.</li>
<li>Fixed bug in the Ollama and Ollama Cloud implementation that resulted in errors.</li>
<li><strong>Diff view showing up on wrong lines.</strong> Fixed issue where diff view would appear on incorrect lines due to stale data in the editor. Added proper cleanup and state invalidation when editor content changes. <em>Files: <code>DiffView.tsx</code>, <code>EditorPane.tsx</code></em></li>
<li><strong>Model selector sluggishness.</strong> Reduced avoidable work in the compact selector by memoizing derived lists and selected model. Removed delayed/smooth scroll on open (which can feel laggy) and switched to <code>requestAnimationFrame</code> + instant nearest scroll. <em>Files: <code>CompactModelSelector.tsx</code></em></li>
<li><strong>History titles missing.</strong> Added a resilient fallback title strategy: use <code>conversation.title</code> if present, else use <code>preview</code>, else synthesize from last active timestamp (<code>Conversation X ago</code>). <em>Files: <code>HistoryTab.tsx</code></em></li>
<li><strong>Natural chat autoscroll + user can interrupt with wheel.</strong> Reworked autoscroll to use the real scroll container ref. Split behavior: scroll on new message if user is at bottom / just sent; during streaming, only keep following while user remains at bottom. This preserves manual scroll interruption. <em>Files: <code>ChatPanel.tsx</code></em></li>
<li><strong>Settings save feels slow.</strong> Changed save flow to close modal immediately, then persist in background. Keeps UI responsive while save + model refresh continue asynchronously. <em>Files: <code>SettingsModal.tsx</code></em></li>
<li><strong>General snappiness + launch flicker.</strong> Removed duplicate no-tab editor rendering path that could cause visual churn. Tightened startup flow to show window after first frame and fade out loading overlay immediately (no extra nested delays). <em>Files: <code>Layout.tsx</code>, <code>main.tsx</code></em></li>
<li><strong>Modernized title bar buttons.</strong> Updated window controls to compact rounded buttons with tighter spacing and better active feedback. <em>Files: <code>TitleBar.tsx</code></em></li>
<li><strong>Terminal too close to sidebar shadow.</strong> Increased left padding in terminal content area. <em>Files: <code>TerminalPane.tsx</code></em></li>
<li><strong>Fixed crash in read_file_range on out-of-bounds slice.</strong> Added bounds clamping to prevent panic when requesting lines beyond EOF (e.g., start_line: 350 on a 259-line file). Now returns safe empty output for extreme or inverted ranges instead of crashing.</li>
</ul>
</div>
<div class="changes-section">
<h3 class="changes-title">
<span class="changes-icon">📦</span>
Dependencies Updated
</h3>
<p class="updates-intro">Comprehensive dependency upgrade across frontend and Rust ecosystem.</p>
<table class="updates-table">
<thead>
<tr>
<th>Package</th>
<th>From</th>
<th>To</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>@codemirror/commands</code></td>
<td>6.10.1</td>
<td>6.10.2</td>
</tr>
<tr>
<td><code>@codemirror/lint</code></td>
<td>6.9.2</td>
<td>6.9.3</td>
</tr>
<tr>
<td><code>@codemirror/view</code></td>
<td>6.39.11</td>
<td>6.39.13</td>
</tr>
<tr>
<td><code>@tauri-apps/api</code></td>
<td>2.9.1</td>
<td>2.10.1</td>
</tr>
<tr>
<td><code>@tauri-apps/cli</code></td>
<td>2.9.6</td>
<td>2.10.0</td>
</tr>
<tr>
<td><code>@tauri-apps/plugin-shell</code></td>
<td>2.3.4</td>
<td>2.3.5</td>
</tr>
<tr>
<td><code>i18next</code></td>
<td>25.8.0</td>
<td>25.8.4</td>
</tr>
<tr>
<td><code>pdfjs-dist</code></td>
<td>5.4.530</td>
<td>5.4.624</td>
</tr>
<tr>
<td><code>@types/react</code></td>
<td>19.2.10</td>
<td>19.2.13</td>
</tr>
<tr>
<td><code>@vitejs/plugin-react</code></td>
<td>5.1.2</td>
<td>5.1.4</td>
</tr>
</tbody>
</table>
<h4 class="subsection-title">Rust Crates - Safe Updates</h4>
<table class="updates-table">
<thead>
<tr>
<th>Crate</th>
<th>From</th>
<th>To</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>clap</code></td>
<td>4.5.54</td>
<td>4.5.57</td>
</tr>
<tr>
<td><code>regex</code></td>
<td>1.12.2</td>
<td>1.12.3</td>
</tr>
<tr>
<td><code>tempfile</code></td>
<td>3.24.0</td>
<td>3.25.0</td>
</tr>
<tr>
<td><code>uuid</code></td>
<td>1.19.0</td>
<td>1.20.0</td>
</tr>
</tbody>
</table>
<h4 class="subsection-title">Rust Crates - Breaking Updates</h4>
<ul class="breaking-updates-list">
<li>
<strong><code>tauri</code> (2.9.5 → 2.10.2)</strong>
<br><span class="update-detail">No code changes required. Unblocked plugin support and JavaScript improvements.</span>
</li>
<li>
<strong><code>tree-sitter</code> (0.24 → 0.26)</strong>
<br><span class="update-detail">Updated <code>node.child(i)</code> to <code>node.child(i as u32)</code> to match new API.</span>
</li>
<li>
<strong><code>notify</code> (6.1.1 → 8.2.0)</strong>
<br><span class="update-detail">No code changes required. API remains compatible.</span>
</li>
<li>
<strong><code>reqwest</code> (0.12.28 → 0.13.2)</strong>
<br><span class="update-detail">Removed <code>rustls-tls</code> feature (now default in new version).</span>
</li>
<li>
<strong><code>rusqlite</code> (0.32 → 0.38)</strong>
<br><span class="update-detail">No code changes required. API remains compatible.</span>
</li>
<li>
<strong><code>tokio-tungstenite</code> (0.21 → 0.28)</strong>
<br><span class="update-detail"><code>WebSocketConfig</code> now mutable default. <code>Message::Text</code> and <code>Message::Ping</code> take <code>Utf8Bytes</code> and <code>Bytes</code> respectively (converted using <code>.into()</code>).</span>
</li>
</ul>
</div>
</div>
</div>
</div>
</section>
<!-- v0.1.1 Section -->
<section class="changelog-section">
<div class="container">
<div class="version-card version-latest">
<div class="version-header">
<div class="version-info">
<h2 class="version-number">v0.1.1</h2>
<span class="version-date">February 9, 2026</span>
</div>
<span class="version-badge badge-latest">Latest</span>
</div>
<div class="version-content">
<div class="changes-section">
<h3 class="changes-title">
<span class="changes-icon">✨</span>
New Features
</h3>
<ul class="changes-list">
<li><strong>PDF support.</strong> The editor can now load PDFs natively.</li>
<li><strong>Screenshot support.</strong> Capture window or select region and attach to chat.</li>
<li><strong>Upload image.</strong> Upload images directly to chat.</li>
<li><strong>Paste image.</strong> Paste images from clipboard into chat.</li>
</ul>
</div>
<div class="changes-section">
<h3 class="changes-title">
<span class="changes-icon">✨</span>
Enhancements
</h3>
<ul class="changes-list">
<li><strong>Git implementation is now complete.</strong> Full Git integration ready for use.</li>
<li><strong>Added tooltips</strong> on the buttons in the sidebar.</li>
<li><strong>Adjustments in the status bar.</strong> Improved status bar layout and information.</li>
</ul>
</div>
<div class="changes-section">
<h3 class="changes-title">
<span class="changes-icon">🐛</span>
Bug Fixes
</h3>
<ul class="changes-list">
<li>Fixed the Blade Terminal input and output where it used to show escape characters.</li>
<li>Fixed issue where the chat would sometimes show garbled response.</li>
<li>Hide Search icon because functionality not yet implemented.</li>
<li>Open tab now shows the Close button.</li>
<li>After closing a tab, go to the previously open tab.</li>
<li>Plus many bug fixes.</li>
</ul>
</div>
</div>
</div>
</div>
</section>
<!-- v0.1.0 Section -->
<section class="changelog-section section-alt">
<div class="container">
<div class="version-card">
<div class="version-header">
<div class="version-info">
<h2 class="version-number">v0.1.0</h2>
<span class="version-date">February 4, 2026</span>
</div>
<span class="version-badge badge-initial">Initial</span>
</div>
<div class="version-content">
<div class="initial-release">
<div class="initial-icon">🚀</div>
<p class="initial-text">
The very first release of Zaguán Blade. This marks the beginning of our journey to create the ultimate AI-native code editor.
</p>
</div>
</div>
</div>
</div>
</section>
</main>
</BaseLayout>
<style>
/* Changelog Page Specific Styles */
/* Hero */
.changelog-hero {
min-height: 35vh;
display: flex;
align-items: center;
padding-top: calc(var(--space-2xl) + 60px);
padding-bottom: var(--space-lg);
background: linear-gradient(180deg, var(--color-bg) 0%, var(--color-bg-secondary) 100%);
border-bottom: 1px solid var(--color-border);
}
.changelog-hero .hero-content {
max-width: 800px;
}
.hero-label {
font-family: var(--font-mono);
font-size: 0.875rem;
color: var(--color-accent);
letter-spacing: 0.1em;
margin-bottom: var(--space-sm);
}
.hero-title {
margin-bottom: var(--space-md);
}
.title-line-1 {
display: block;
font-size: clamp(2rem, 6vw, 3.5rem);
font-weight: 900;
line-height: 0.95;
letter-spacing: -0.03em;
text-transform: uppercase;
}
.title-accent {
display: block;
font-size: clamp(1rem, 2.5vw, 1.25rem);
font-weight: 700;
color: var(--color-accent);
font-family: var(--font-mono);
margin-top: 0.25rem;
letter-spacing: 0.05em;
}
.hero-description {
font-size: 1rem;
color: var(--color-text-secondary);
line-height: 1.6;
max-width: 600px;
}
/* Changelog Sections */
.changelog-section {
padding: var(--space-xl) 0;
}
.section-alt {
background: var(--color-bg-secondary);
}
/* Version Cards */
.version-card {
background: var(--color-bg);
border: 1px solid var(--color-border);
padding: var(--space-lg);
position: relative;
}
.version-latest {
border-color: var(--color-accent);
background: linear-gradient(135deg, var(--color-bg-elevated) 0%, var(--color-bg) 100%);
}
.version-latest::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 4px;
height: 100%;
background: var(--color-accent);
}
/* Version Header */
.version-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: var(--space-lg);
padding-bottom: var(--space-md);
border-bottom: 1px solid var(--color-border);
flex-wrap: wrap;
gap: var(--space-sm);
}
.version-info {
display: flex;
align-items: baseline;
gap: var(--space-md);
flex-wrap: wrap;
}
.version-number {
font-size: 1.75rem;
font-weight: 900;
text-transform: uppercase;
letter-spacing: -0.02em;
color: var(--color-text);
}
.version-date {
font-family: var(--font-mono);
font-size: 1rem;
color: var(--color-text-secondary);
letter-spacing: 0.05em;
}
.version-badge {
font-family: var(--font-mono);
font-size: 0.7rem;
padding: 0.4rem 0.8rem;
font-weight: 700;
letter-spacing: 0.1em;
text-transform: uppercase;
}
.badge-latest {
background: var(--color-accent);
color: var(--color-bg);
}
.badge-initial {
background: var(--color-bg-elevated);
color: var(--color-text-secondary);
border: 1px solid var(--color-border);
}
.badge-previous {
background: var(--color-bg-elevated);
color: var(--color-text-secondary);
border: 1px solid var(--color-border);
}
.badge-development {
background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
color: var(--color-bg);
}
/* Version Content */
.version-content {
display: grid;
gap: var(--space-lg);
}
/* Changes Section */
.changes-section {
background: var(--color-bg);
border: 1px solid var(--color-border);
padding: var(--space-md);
}
.version-latest .changes-section {
background: var(--color-bg-secondary);
}
/* Updates Tables */
.updates-intro {
color: var(--color-text-secondary);
margin-bottom: var(--space-md);
font-size: 0.95rem;
}
.subsection-title {
font-size: 0.9rem;
font-weight: 700;
color: var(--color-text);
text-transform: uppercase;
letter-spacing: 0.05em;
margin-top: var(--space-md);
margin-bottom: var(--space-sm);
font-family: var(--font-mono);
}
.updates-table {
width: 100%;
border-collapse: collapse;
margin-bottom: var(--space-md);
font-size: 0.9rem;
}
.updates-table thead {
background: var(--color-bg-elevated);
border-bottom: 2px solid var(--color-border);
}
.updates-table th {
padding: var(--space-xs) var(--space-sm);
text-align: left;
font-weight: 700;
color: var(--color-text);
font-family: var(--font-mono);
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.updates-table td {
padding: var(--space-xs) var(--space-sm);
border-bottom: 1px solid var(--color-border);
color: var(--color-text-secondary);
}
.updates-table code {
background: var(--color-bg-elevated);
padding: 0.2rem 0.4rem;
border-radius: 0.25rem;
font-family: var(--font-mono);
color: var(--color-accent);
font-size: 0.9em;
}
.breaking-updates-list {
list-style: none;
margin-top: var(--space-md);
}
.breaking-updates-list li {
padding: var(--space-sm);
margin-bottom: var(--space-sm);
background: var(--color-bg-elevated);
border-left: 3px solid var(--color-accent);
border-radius: 0.25rem;
}
.breaking-updates-list strong {
color: var(--color-text);
font-family: var(--font-mono);
display: block;
margin-bottom: 0.25rem;
}
.breaking-updates-list code {
background: var(--color-bg);
padding: 0.2rem 0.4rem;
border-radius: 0.25rem;
font-family: var(--font-mono);
color: var(--color-accent);
font-size: 0.9em;
}
.update-detail {
font-size: 0.9rem;
color: var(--color-text-secondary);
}
.changes-title {
display: flex;
align-items: center;
gap: var(--space-xs);
font-size: 0.9rem;
font-weight: 700;
text-transform: uppercase;
margin-bottom: var(--space-sm);
color: var(--color-accent);
font-family: var(--font-mono);
letter-spacing: 0.05em;
}
.changes-icon {
font-size: 1rem;
}
.changes-list {
list-style: none;
}
.changes-list li {
padding: 0.35rem 0;
border-bottom: 1px solid var(--color-border);
color: var(--color-text-secondary);
line-height: 1.5;
padding-left: var(--space-md);
position: relative;
}
.changes-list li:last-child {
border-bottom: none;
}
.changes-list li::before {
content: '';
position: absolute;
left: 0;
color: var(--color-accent);
font-weight: 700;
}
.changes-list li strong {
color: var(--color-text);
}
/* Initial Release */
.initial-release {
text-align: center;
padding: var(--space-lg);
}
.initial-icon {
font-size: 3rem;
margin-bottom: var(--space-md);
}
.initial-text {
font-size: 1rem;
color: var(--color-text-secondary);
line-height: 1.6;
max-width: 600px;
margin: 0 auto;
}
/* Responsive */
@media (max-width: 768px) {
.changelog-hero {
min-height: auto;
padding-top: calc(var(--space-2xl) + 60px);
}
.version-header {
flex-direction: column;
align-items: flex-start;
}
.version-info {
flex-direction: column;
gap: var(--space-xs);
}
.version-number {
font-size: 1.75rem;
}
}
/* Screenshot Showcase */
.screenshot-showcase {
padding: var(--space-2xl) 0;
background: var(--color-bg-secondary);
border-top: 1px solid var(--color-border);
border-bottom: 1px solid var(--color-border);
}
.showcase-header {
text-align: center;
margin-bottom: var(--space-xl);
}
.showcase-label {
font-family: var(--font-mono);
font-size: 0.875rem;
color: var(--color-accent);
letter-spacing: 0.1em;
margin-bottom: var(--space-sm);
text-transform: uppercase;
}
.showcase-title {
font-size: clamp(1.75rem, 4vw, 2.5rem);
font-weight: 900;
text-transform: uppercase;
letter-spacing: -0.02em;
color: var(--color-text);
margin-bottom: var(--space-sm);
}
.showcase-subtitle {
font-size: 1rem;
color: var(--color-text-secondary);
line-height: 1.6;
max-width: 600px;
margin: 0 auto;
}
.showcase-grid {
display: flex;
justify-content: center;
}
.showcase-item {
width: 100%;
max-width: 1200px;
}
.showcase-image-wrapper {
position: relative;
border-radius: var(--radius-lg);
overflow: hidden;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
border: 1px solid var(--color-border);
}
.showcase-image {
display: block;
width: 100%;
height: auto;
max-width: 1400px;
margin: 0 auto;
}
.showcase-caption {
padding: var(--space-md) var(--space-lg);
font-family: var(--font-mono);
font-size: 0.85rem;
color: var(--color-text-secondary);
background: var(--color-bg);
border-top: 1px solid var(--color-border);
}
@media (max-width: 768px) {
.screenshot-showcase {
padding: var(--space-lg) 0;
}
.showcase-title {
font-size: 1.5rem;
}
.showcase-subtitle {
font-size: 0.95rem;
}
}
</style>