26 Commits

Author SHA1 Message Date
lashman 5abcc18a06 Update Cargo.lock for v1.1.0 2026-02-19 22:06:21 +02:00
lashman cf06ad8ad4 Bump version to 1.1.0 and update README 2026-02-19 22:02:21 +02:00
lashman a073149da5 Fix duplicate tabs on drag-and-drop and long URL overflow 2026-02-19 22:00:51 +02:00
lashman 323bd228c5 Add single-instance support and clean up scaffolding files 2026-02-19 22:00:43 +02:00
lashman 645397d202 Upgrade to pointer events for cancellation support, final a11y cleanup 2026-02-19 21:42:30 +02:00
lashman 3f6465fb40 Add light theme with full WCAG AAA contrast compliance 2026-02-19 21:41:04 +02:00
lashman 32bf5c3288 Add Content Zoom and Content Width controls to View menu 2026-02-19 21:38:29 +02:00
lashman afaaaab2a2 Add non-color indicators for active tab and search highlights 2026-02-19 21:37:51 +02:00
lashman 0c47285a15 Highlight active heading in sidebar table of contents 2026-02-19 21:36:59 +02:00
lashman 3e67307a8d Respect prefers-reduced-motion for Framer Motion animations 2026-02-19 21:35:22 +02:00
lashman c37cb83548 Add focus trap to modal dialogs 2026-02-19 21:33:39 +02:00
lashman f4c8f2801b Add Shift+F10 context menu trigger and keyboard navigation 2026-02-19 21:31:56 +02:00
lashman 1b4bc92c3e Add keyboard navigation for sidebar and resize handle 2026-02-19 21:29:11 +02:00
lashman f0899e5032 Add keyboard navigation for tab bar 2026-02-19 21:27:24 +02:00
lashman 78f1487890 Add full keyboard navigation for menu bar 2026-02-19 21:24:47 +02:00
lashman 2bdd028e09 Add ARIA roles, labels, and states to all interactive components 2026-02-19 21:20:27 +02:00
lashman dfd5de97bc Add skip link and semantic HTML landmarks 2026-02-19 21:16:58 +02:00
lashman 654f78dfd2 Add focus indicators, fix target sizes, show hidden controls 2026-02-19 21:15:03 +02:00
lashman 123fbef26f Extract markdown typography colors into CSS variables 2026-02-19 21:13:07 +02:00
lashman ab7788464e Update color contrast to meet WCAG 2.2 AAA requirements 2026-02-19 21:08:29 +02:00
lashman dcbb9211c7 Handle OS file association: open .md files passed as CLI args 2026-02-14 19:45:58 +02:00
lashman 4e89bcd68f Update README 2026-02-14 12:10:35 +02:00
lashman c07eb10640 Polish README with modern layout, emojis, and tables 2026-02-14 12:04:51 +02:00
lashman 4f60339240 Make app fully portable, remove installers 2026-02-14 12:01:26 +02:00
lashman 758a93c9f6 Add polished UX: tabs, kinetic scroll, animations, search, typography 2026-02-14 11:53:55 +02:00
lashman b977d224a5 Initial commit: Vesper markdown reader 2026-02-13 23:09:33 +02:00
9 changed files with 26 additions and 87 deletions
-51
View File
@@ -1,51 +0,0 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Tauri build artifacts
src-tauri/target/
# Dev tool files
icon-*.html
nul
# Portable data directory
data/
# Editor directories and files
.vscode/
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# AI/LLM tooling
.claude/
.cursor/
.copilot/
.codeium/
.tabnine/
.aider*
.continue/
# Trash
trash/
# Docs
docs/
# This file
.gitignore
-3
View File
@@ -1,3 +0,0 @@
{
"recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"]
}
+1 -1
View File
@@ -122,7 +122,7 @@ Vesper targets **WCAG 2.2 AAA** compliance across the entire interface.
| 🔗 Skip Link | "Skip to content" link as first focusable element for screen reader users |
| 🎯 Focus Management | Visible `:focus-visible` outlines on all interactive elements; focus traps in modals with restore on close |
| 🌗 High Contrast Themes | Dark and light themes both meet AAA contrast ratios (7:1+ for normal text) |
| 🎞️ Reduced Motion | Respects `prefers-reduced-motion` OS setting all animations disabled when active |
| 🎞️ Reduced Motion | Respects `prefers-reduced-motion` OS setting - all animations disabled when active |
| 📋 Active Heading Tracking | Current section highlighted in sidebar TOC via IntersectionObserver |
| 🔲 Target Sizes | All interactive targets meet 24x24px minimum (WCAG 2.5.8) |
| 📢 Status Messages | Search results counter uses `aria-live="polite"` for screen reader announcements |
-7
View File
@@ -1,7 +0,0 @@
# Generated by Cargo
# will have compiled files and executables
/target/
# Generated by Tauri
# will have schema files for capabilities auto-completion
/gen/schemas
+1 -1
View File
@@ -4296,7 +4296,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "vesper"
version = "1.0.1"
version = "1.1.0"
dependencies = [
"serde",
"serde_json",
+1 -1
View File
@@ -2,7 +2,7 @@
name = "vesper"
version = "1.1.0"
description = "A beautiful markdown reader"
authors = ["you"]
authors = ["lashman"]
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+1 -1
View File
@@ -77,7 +77,7 @@ pub fn run() {
tauri::Builder::default()
.plugin(tauri_plugin_single_instance::init(|app, args, _cwd| {
// Second instance launched with a file send it to the existing window
// Second instance launched with a file - send it to the existing window
if let Some(file_arg) = args.get(1) {
if let Some(cli_file) = read_md_file(file_arg) {
let _ = app.emit("open-file", cli_file);
+2 -2
View File
@@ -40,7 +40,7 @@ const md: MarkdownIt = new MarkdownIt({
const materialEase = [0.4, 0, 0.2, 1] as const;
// Saved selection range set in mousedown (before browser clears it), read in contextmenu handler
// Saved selection range - set in mousedown (before browser clears it), read in contextmenu handler
let _savedSelectionRange: Range | null = null;
// Reusable kinetic scroll + iOS overscroll setup for any scrollable area
@@ -500,7 +500,7 @@ function App() {
setHeadings(parsed);
}, []);
// Render markdown to HTML memoized so it only re-runs when content changes
// Render markdown to HTML - memoized so it only re-runs when content changes
const renderedHtml = useMemo(() => {
if (!activeTab) return '';
return md.render(activeTab.content);
+20 -20
View File
@@ -41,7 +41,7 @@
--color-error-content: #1E2128;
}
/* CSS Custom Properties - Premium Flat Design with #282C33 */
/* Custom properties */
:root {
/* Surface System - centered on #282C33 */
--color-bg-base: #282C33;
@@ -56,7 +56,7 @@
--color-text-primary: #E4E6EB;
--color-text-secondary: #BCC1C8; /* was #ABB0B8, now ~7.5:1 */
--color-text-tertiary: #8B919A; /* was #6B7280, now ~4.8:1 */
--color-text-disabled: #6B7280; /* was #4A5260, now ~2.9:1 (exempt inactive UI) */
--color-text-disabled: #6B7280; /* was #4A5260, now ~2.9:1 (exempt - inactive UI) */
/* Accent */
--color-accent: #6B8AFF;
@@ -153,7 +153,7 @@ html, body, #root {
overflow: visible;
}
/* Skip link WCAG 2.4.1 */
/* Skip link - WCAG 2.4.1 */
.skip-link {
position: fixed;
top: -100%;
@@ -318,7 +318,7 @@ html, body, #root {
color: var(--color-text-primary);
}
/* Menu backdrop invisible overlay to catch outside clicks */
/* Menu backdrop - invisible overlay to catch outside clicks */
.menu-backdrop {
position: fixed;
top: 0;
@@ -939,7 +939,7 @@ html, body, #root {
z-index: 10003 !important;
}
/* Shortcuts dialog uses its own class to avoid DaisyUI .modal conflicts */
/* Shortcuts dialog - uses its own class to avoid DaisyUI .modal conflicts */
.shortcuts-dialog {
background-color: var(--color-bg-elevated);
border: 1px solid var(--color-border);
@@ -1167,7 +1167,7 @@ html, body, #root {
color: var(--color-text-primary);
}
/* Markdown content - PREMIUM EDITORIAL TYPOGRAPHY */
/* Markdown content */
.markdown-content {
/* Optimal measure: ~65 characters for best readability */
max-width: 680px;
@@ -1176,7 +1176,7 @@ html, body, #root {
overflow-wrap: break-word;
word-break: break-word;
/* Premium typography settings */
/* Typography settings */
font-size: 17px;
line-height: 1.7;
font-family: 'Inter Variable', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
@@ -1191,7 +1191,7 @@ html, body, #root {
text-spacing-trim: trim-both;
}
/* Refined heading hierarchy — progressive color cascade */
/* Heading hierarchy */
.markdown-content h1,
.markdown-content h2,
.markdown-content h3,
@@ -1250,14 +1250,14 @@ html, body, #root {
color: var(--color-md-h6);
}
/* Paragraphs with refined spacing */
/* Paragraphs */
.markdown-content p {
margin-bottom: 1.65em;
color: var(--color-md-paragraph);
line-height: 1.7;
}
/* Links with subtle persistent underline */
/* Links */
.markdown-content a {
color: var(--color-md-link);
text-decoration: underline;
@@ -1502,7 +1502,7 @@ html, body, #root {
color: #FFCB6B;
}
/* Tables - elegant card style without gradients */
/* Tables */
.markdown-content table {
width: 100%;
border-collapse: separate;
@@ -1547,7 +1547,7 @@ html, body, #root {
background-color: var(--color-md-table-hover);
}
/* Horizontal rule gradient fade */
/* Horizontal rule - gradient fade */
.markdown-content hr {
border: none;
height: 1px;
@@ -1625,7 +1625,7 @@ html, body, #root {
border-radius: 8px;
}
/* Search highlights high specificity to override Tailwind reset */
/* Search highlights - high specificity to override Tailwind reset */
span.search-highlight {
background-color: var(--color-md-highlight-bg) !important;
color: inherit !important;
@@ -1663,7 +1663,7 @@ span.search-highlight.search-highlight-active {
transition: background-color 0.2s ease, opacity 0.2s ease;
}
/* Global focus indicator WCAG 2.4.7, 2.4.13 */
/* Global focus indicator - WCAG 2.4.7, 2.4.13 */
button:focus-visible,
a:focus-visible,
input:focus-visible,
@@ -1677,7 +1677,7 @@ input:focus-visible,
}
/* ============================================
Light theme overrides WCAG 1.4.8
Light theme overrides - WCAG 1.4.8
============================================ */
.theme-light {
--color-bg-base: #F5F6F8;
@@ -1702,7 +1702,7 @@ input:focus-visible,
--color-border: rgba(0, 0, 0, 0.10);
--color-border-strong: rgba(0, 0, 0, 0.16);
/* Markdown typography light variants */
/* Markdown typography - light variants */
--color-md-h1: #111318;
--color-md-h2: #1A1D24;
--color-md-h3: #252A31;
@@ -1739,26 +1739,26 @@ input:focus-visible,
--color-md-welcome-btn: #3B66E0;
}
/* Light theme noise overlay should be darker */
/* Light theme - noise overlay should be darker */
.theme-light.app-container::before {
opacity: 0.025;
mix-blend-mode: multiply;
}
/* Light theme title bar close button */
/* Light theme - title bar close button */
.theme-light .title-bar-button.close:hover {
background-color: #DC2626;
color: white;
}
/* Light theme scrollbar colors */
/* Light theme - scrollbar colors */
.theme-light .os-theme-dark {
--os-handle-bg: rgba(0, 0, 0, 0.15);
--os-handle-bg-hover: var(--color-accent);
--os-handle-bg-active: var(--color-accent-hover);
}
/* Light theme sidebar resize handle */
/* Light theme - sidebar resize handle */
.theme-light .sidebar-resize-handle {
background: rgba(0, 0, 0, 0.06);
}