Commit Graph
100 Commits
Author SHA1 Message Date
bruno a0768d7a76 fix: remove broken ES module const reassignment (openFile monkey-patch)
CI / lint (push) Successful in 13s
CI / security (push) Successful in 9s
CI / test (push) Successful in 19s
CI / build (push) Successful in 2s
2026-05-28 15:43:31 -04:00
bruno 83a5de2ed2 fix: add missing openFile import in ui.js
CI / lint (push) Successful in 13s
CI / security (push) Successful in 9s
CI / test (push) Successful in 16s
CI / build (push) Successful in 3s
2026-05-28 15:35:35 -04:00
bruno 1b9ba69c52 perf: O(T) stemming instead of O(S×T) — fixes 15min index freeze
CI / lint (push) Successful in 14s
CI / security (push) Successful in 9s
CI / test (push) Successful in 18s
CI / build (push) Successful in 4s
Replace double-nested stem loop (stems × tokens) with single-pass
stem frequency map. For 100 unique tokens per file: 10,000 iterations
→ 100 iterations per file. Critical for large vaults.
2026-05-28 15:23:51 -04:00
bruno 25cfd7cc56 fix: export DashboardSharedWidget from dashboard.js
CI / lint (push) Successful in 12s
CI / security (push) Successful in 9s
CI / test (push) Successful in 42s
CI / build (push) Successful in 3s
2026-05-28 14:58:42 -04:00
bruno e995f727bd docs: graph view — 15/16 done, marked complete
CI / lint (push) Successful in 11s
CI / security (push) Successful in 8s
CI / test (push) Successful in 39s
CI / build (push) Successful in 3s
2026-05-28 14:52:52 -04:00
bruno e9e954f36b feat(graph): Phase 4 — Barnes-Hut, cache, lazy loading
CI / lint (push) Successful in 13s
CI / test (push) Has been cancelled
CI / build (push) Has been cancelled
CI / security (push) Has been cancelled
Performance optimizations for large vaults:
- Barnes-Hut quadtree repulsion (O(n log n) for >200 nodes)
- Naive O(n²) preserved for small graphs (<200 nodes)
- Graph cache: reuse data when same (vault, path, depth, scope, tag)
- Cache key displayed in info bar: '(cache)' label
2026-05-28 14:52:31 -04:00
bruno 8c95899456 docs: Phase 3 graph view done
CI / lint (push) Successful in 12s
CI / security (push) Successful in 8s
CI / test (push) Successful in 36s
CI / build (push) Successful in 3s
2026-05-28 14:48:46 -04:00
bruno 0416266dde feat(graph): Phase 3 — type filter, export PNG, fullscreen, focus node
CI / lint (push) Has started running
CI / test (push) Has been cancelled
CI / security (push) Has been cancelled
CI / build (push) Has been cancelled
- Type filter checkboxes (dossier, .md, autre) in legend
- Export PNG button (canvas.toDataURL)
- Fullscreen button (Fullscreen API)
- Focus node function (center on specific node)
- Filter applied during _draw() to skip hidden nodes
2026-05-28 14:48:31 -04:00
bruno bf836caccc docs: mark Phase 1+2 graph view as done
CI / lint (push) Successful in 11s
CI / security (push) Successful in 9s
CI / test (push) Successful in 38s
CI / build (push) Successful in 3s
2026-05-28 14:46:40 -04:00
bruno a373279b08 feat(graph): Phase 1+2 — full-vault, tag filter, backlinks, tooltips, depth slider
CI / lint (push) Has been cancelled
CI / test (push) Has been cancelled
CI / security (push) Has been cancelled
CI / build (push) Has been cancelled
Backend (main.py):
- GraphNode: added tags, incoming_count, outgoing_count
- GraphEdge: added 'backlink' relation
- GraphResponse: added 'scope' field
- api_graph: scope=full|directory, tag= filter, backlinks
- Full-vault tree walk with configurable depth 0-3
- Tag index from in-memory file index for fast filtering
- Incoming/outgoing link count per node

Frontend (graph.js + index.html):
- Theme-adaptive colors via CSS custom properties
- Depth slider (0-3) with live reload
- Full-vault toggle button (🌐 Tout / 📁 Dossier)
- Search input with tag filtering + visual highlighting
- Tooltip on hover (name, path, tags, link counts)
- Backlink edges rendered in red dashed
- Node size proportional to link count
- Larger modal (1000px, 85vh)
2026-05-28 14:46:22 -04:00
bruno c8e74bd39b docs: graph view improvements roadmap (4 phases)
CI / lint (push) Successful in 17s
CI / security (push) Successful in 9s
CI / test (push) Successful in 37s
CI / build (push) Successful in 3s
2026-05-28 14:41:58 -04:00
bruno f3e16e3c3d docs: ROADMAP + README v1.5.1 (ES module split)
CI / lint (push) Successful in 15s
CI / security (push) Successful in 8s
CI / test (push) Successful in 36s
CI / build (push) Successful in 1s
2026-05-28 14:05:38 -04:00
bruno 4836d6f1d0 refactor: split app.js (8875 lines) into 12 ES modules
CI / lint (push) Successful in 10s
CI / security (push) Successful in 8s
CI / build (push) Has been cancelled
CI / test (push) Has been cancelled
frontend/js/ structure:
  state.js      (55 lines)  — Shared mutable state, constants
  utils.js      (510 lines) — EXT_ICONS, getFileIcon, escapeHtml, safeCreateIcons
  auth.js       (547 lines) — api(), AuthManager, initLoginForm, AdminPanel
  search.js     (1106 lines)— SearchHistory, QueryParser, Autocomplete, performSearch
  sidebar.js    (1091 lines)— Vault tree, sidebar filter, TagFilterService, loadTags
  viewer.js     (1554 lines)— openFile, Outline, ScrollSpy, Frontmatter, Editor
  ui.js         (2250 lines)— Theme, Toast, Sidebar, Dropdowns, Tabs, ContextMenu
  dashboard.js  (461 lines) — Dashboard widgets (Recent, Stats, Bookmarks)
  config.js     (999 lines) — Config panel, Hidden files, About, Sidebar tabs
  sync.js       (436 lines) — SSE/IndexUpdateManager, PWA registration
  graph.js      (401 lines) — GraphViewManager (force-directed canvas graph)
  legacy.js     (550 lines) — Remaining bridge functions (goHome, showWelcome, initSearch)
  app.js        (80 lines)  — Thin orchestrator: imports all modules, calls init()

index.html: switched from <script src="app.js"> to <script type="module" src="js/app.js">
Original app.js preserved for backward compatibility.
All 14 modules pass node --check syntax validation.
2026-05-28 14:04:50 -04:00
bruno 58ce3181c9 docs: mark stemming as done in ROADMAP
CI / lint (push) Successful in 12s
CI / security (push) Successful in 9s
CI / test (push) Successful in 39s
CI / build (push) Successful in 36s
2026-05-28 13:15:55 -04:00
bruno 23fa003422 feat: French stemming (snowballstemmer) — 'recettes' matches 'recette', 'mangeons' matches 'manger'
CI / test (push) Has been cancelled
CI / security (push) Has been cancelled
CI / build (push) Has been cancelled
CI / lint (push) Has been cancelled
Add French snowball stemmer to tokenization pipeline:
- Index both original tokens AND their stems in InvertedIndex
- Query terms are also stemmed before lookup
- Stemmed forms accumulate TF from all original forms
- Lazy-init singleton pattern for stemmer
2026-05-28 13:15:37 -04:00
bruno 271a463d6d docs: ROADMAP.md + README v1.5.0 (CI/CD complet)
CI / lint (push) Successful in 11s
CI / security (push) Successful in 8s
CI / test (push) Successful in 15s
CI / build (push) Successful in 3s
2026-05-28 13:11:08 -04:00
bruno 7965139230 ci: re-enable coverage artifact upload via native Gitea runner (v3)
CI / lint (push) Successful in 13s
CI / security (push) Successful in 8s
CI / test (push) Successful in 28s
CI / build (push) Successful in 2s
2026-05-28 13:06:21 -04:00
bruno 1a14927f36 fix: resolve all 28 mypy type errors + re-enable coverage in CI
CI / lint (push) Successful in 11s
CI / security (push) Successful in 7s
CI / test (push) Successful in 13s
CI / build (push) Successful in 1s
2026-05-28 12:57:30 -04:00
bruno 7096050da5 fix: disable upload-artifact (not available on self-hosted runner)
CI / lint (push) Successful in 13s
CI / security (push) Successful in 10s
CI / test (push) Successful in 14s
CI / build (push) Successful in 43s
2026-05-28 12:47:41 -04:00
bruno a9a1730b8e fix: make mypy advisory (28 pre-existing type errors)
CI / lint (push) Successful in 12s
CI / security (push) Successful in 7s
CI / test (push) Failing after 30s
CI / build (push) Has been skipped
2026-05-28 12:43:07 -04:00
bruno 6fc43e2485 fix: ruff lint errors + bandit false positives + pip-audit non-blocking
CI / lint (push) Failing after 11s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / security (push) Successful in 7s
2026-05-28 12:41:31 -04:00
bruno 7b2da1ff6a feat: CI/CD pipeline + sortedcontainers for O(log n) index ops
CI / lint (push) Failing after 2m3s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / security (push) Failing after 10s
CI/CD (.gitea/workflows/ci.yml):
- Lint: ruff + mypy on every push/PR
- Test: pytest with coverage report (175 tests)
- Security: bandit SAST + pip-audit dependency scan
- Build: Docker image verification

sortedcontainers (backend/search.py):
- Replace bisect with SortedList for _sorted_tokens
- O(log n) add() / discard() instead of O(n) insort/pop
- SortedList.bisect_left() for prefix search
- Add sortedcontainers>=2.4.0 to requirements.txt
2026-05-27 22:47:28 -04:00
bruno 8d1b766947 test: expand coverage to 49% (+78 new tests, 175 total)
Add 78 new tests targeting high-impact uncovered modules:
- tests/test_search_advanced.py (23 tests): InvertedIndex CRUD,
  search/advanced_search/suggest functions, tag/title indexing
- tests/test_indexer_advanced.py (15 tests): hooks, file CRUD,
  path index, lookup, generation counter
- tests/test_modules.py (40 tests): audit, history, rate limit,
  saved searches, vault settings, webhooks, share

Coverage improvements:
  ratelimit.py:  80% → 100%
  share.py:      24% →  97%
  saved_searches: 37% →  95%
  history.py:    26% →  86%
  audit.py:       0% →  85%
  search.py:     44% →  82%
  webhooks.py:   31% →  67%
  vault_settings: 31% →  69%
  indexer.py:    47% →  65%
  Overall:       35% →  49%
2026-05-27 22:32:10 -04:00
bruno edb9e98f81 test: add pytest suite - 97 tests, search + indexer + auth
Create comprehensive test suite with 97 passing tests:
- tests/conftest.py: fixtures (TestClient, temp vault dirs, index setup)
- tests/test_search.py (27 tests): tokenizer, snippets, highlight,
  tag filter, search API, advanced search, suggest, tags API
- tests/test_indexer.py (32 tests): frontmatter parsing, inline tags,
  title extraction, scan_vault, find_file_in_index, backlinks
- tests/test_auth.py (38 tests): password hashing, JWT create/decode,
  token revocation, user CRUD, login lockout, rate limiting, middleware

Also fix: lazy WeasyPrint import (graceful fallback when GTK missing),
add data/ to .gitignore (runtime files from test runs).
2026-05-27 22:06:27 -04:00
bruno a5afbb1dc1 fix: SSE sync indicator stuck on 'Connexion...' (3 fixes)
1. Move initSyncStatus() AFTER auth check — EventSource was connecting
   before the access_token cookie was available, causing 401 errors.

2. Reconnect SSE after login — Login form handler now calls
   IndexUpdateManager.connect() + showWelcome() after successful auth.

3. SSESafeGZipMiddleware — GZip buffering breaks Server-Sent Events
   streaming. Custom middleware subclass skips compression for
   /api/events endpoint (path-based bypass).
2026-05-27 21:40:32 -04:00
bruno 2469026c1d fix: login endpoint - request variable shadowing Starlette Request
The login() function used 'request: LoginRequest' which shadowed
FastAPI's Starlette Request object. Request.client was accessed on
the LoginRequest Pydantic model instead of the HTTP request, causing
AttributeError: 'LoginRequest' object has no attribute 'client'.

Fix: rename the Pydantic parameter to 'body' and add explicit
'request: Request' for IP extraction and rate limiting.
2026-05-27 21:16:11 -04:00
bruno 17eea0559d docs: update README with quick wins, security features, .env workflow
- Add GZip + Cache-Control + .dockerignore to Features & Performance
- Update installation: add .env creation step
- Update docker-compose example: include env_file + data volume
- Rewrite auth activation: use .env instead of docker-compose.yml
- Expand auth env vars table: TTL, rate limiting
- Expand Security section: rate limiting, audit, backup, secret redaction
- Update Stack technique: security, PDF, compression, .dockerignore
2026-05-27 21:12:13 -04:00
bruno 58a0ffc76c feat: quick wins - dockerignore, env secrets, gzip, cache-control
- Add .dockerignore to exclude .git, __pycache__, docs, etc. from Docker context
- Create .env.example template with documented env vars
- Move OBSIGATE_ADMIN_PASSWORD from docker-compose.yml to env_file: .env
- Add .env.* to .gitignore (excluding .env.example)
- Enable GZipMiddleware for ~70% bandwidth reduction on text responses
- Add Cache-Control: immutable for /static/ assets
- Update ROADMAP: mark all 4 quick wins as done, add audit findings
- Add comprehensive technical audit report (AUDIT_TECHNIQUE_2026-05-27.md)
2026-05-27 20:35:08 -04:00
bruno d6cf2a1a7f Remove vault filter dropdown from dashboard 2026-05-27 15:57:59 -04:00
bruno 6e742bfa2c Adjust dashboard tab styling for responsive layout 2026-05-27 15:23:50 -04:00
bruno b5aae2b2fd Reduce dashboard tab padding and font, enlarge icons 2026-05-27 15:09:08 -04:00
bruno b879163052 Refine mobile styles and improve search, sidebar, and layout 2026-05-27 12:55:46 -04:00
bruno a7c719afb1 Prioritize autocomplete dropdown over search results on Enter keypress 2026-05-27 12:25:25 -04:00
bruno 8055b20e5f Fix tag filtering to preserve "all" vault filter 2026-05-27 12:08:59 -04:00
bruno fcf134d37e Always show tags section with placeholder or error message 2026-05-27 12:01:23 -04:00
bruno 73593f5e89 Remove duplicate _collectItems call 2026-05-27 11:54:24 -04:00
bruno c3d583177a Handle aborted requests by returning early 2026-05-27 11:51:10 -04:00
bruno 96218f872e Avoid flashing loading state on fast search queries 2026-05-27 11:39:37 -04:00
bruno 56b2a004f9 Show loading state while fetching suggestions 2026-05-27 10:56:44 -04:00
bruno e5b5f2d4f4 Limit search history to 5 items and isolate suggestion fetches 2026-05-27 09:59:35 -04:00
bruno 586acbe9a1 Keep the dropdown hidden after search execution 2026-05-27 09:45:22 -04:00
bruno 0d3de28967 Simplify sidebar tabs, improve saved search display, and refactor
suggestions
2026-05-27 09:27:26 -04:00
bruno 1c59300f11 Remove stray extra closing brace 2026-05-27 08:44:18 -04:00
bruno e3c25b5b09 Add saved searches with CRUD API and UI sidebar
Add extension field to search results and display it
Add active filter badges and save button to search header
2026-05-27 08:39:52 -04:00
bruno aa2c05b05f Add regex search with highlighted snippet support 2026-05-27 08:15:39 -04:00
bruno 0630aeba77 Remove case-sensitive toggle and reset search options on clear 2026-05-27 08:01:57 -04:00
bruno ff06d89eda Support non-Markdown files in public share and add raw download endpoint 2026-05-26 22:34:45 -04:00
bruno 7c4f2964eb Render frontmatter as styled cards in public share view
Split search query tokens on word boundaries for accurate inverted-index
matching
2026-05-26 22:16:21 -04:00
bruno dc9684e56c Remove deprecated PDF endpoint and update frontend download actions
Remove the old HTML-based PDF download endpoint in favor of the new
WeasyPrint-based one, and replace the generic "Télécharger" button
in popout.html with a dedicated .md download and a new PDF button.
Also remove the unused generic download button from the main file view.
2026-05-26 21:55:42 -04:00
bruno 4929ff7beb Remove unnecessary libgdk-pixbuf2.0-0 dependency 2026-05-26 21:32:07 -04:00
bruno c79202716c Add WeasyPrint PDF export for markdown files 2026-05-26 21:22:02 -04:00
bruno 9776311c20 Add public share PDF download endpoint 2026-05-26 20:56:59 -04:00
bruno b0b5541bc5 Style shared page with SVG icons and theme-aware banner 2026-05-26 20:43:15 -04:00
bruno 9752b18529 Add dark theme support and bookmark status to share view
- Implement dark/light theme toggle with persistent preference via
  localStorage
- Add a sticky toolbar with theme toggle, Markdown export, and PDF
  export buttons
- Update bookmark button to reflect current state with visual feedback
- Introduce CSS custom properties for theming and responsive layout
  improvements
2026-05-26 20:19:58 -04:00
bruno d4896a5df1 Sync YAML frontmatter with share and bookmark actions 2026-05-26 20:02:37 -04:00
bruno 32a41532ba Auto-set Content-Type for JSON HTTP requests
- Add automatic Content-Type header injection for JSON string bodies
- Explicitly set Content-Type on bookmark toggle and share creation
  calls
- Add escapeHtml helper function for safe string handling
2026-05-26 15:46:26 -04:00
bruno b1fcc080e5 Add bookmark support and enhance share dialog
- Add bookmark button to file header and context menu
- Implement toggle bookmark API call with toast notification
- Redesign share dialog to show existing shares with revocation
- Add expiration options when creating a new share
- Add CSS styles for share action buttons
2026-05-26 15:40:02 -04:00
bruno 20f9bad9c0 Replace replace UI with search result navigation 2026-05-26 15:25:20 -04:00
bruno 6cd981f9bc Move search state variables to module scope 2026-05-26 14:37:44 -04:00
bruno f2170e9ac8 Guard against missing search elements and restyle search layout 2026-05-26 14:05:26 -04:00
bruno 8fdcdaf412 Add search toggles, path filters, and find/replace functionality 2026-05-26 13:35:38 -04:00
bruno 6c282ac77f Add index change hook for incremental updates 2026-05-26 12:43:38 -04:00
bruno 775722f5d4 Switch inverted index from stale check to incremental updates
Register a hook with the indexer so that file add/remove events
incrementally maintain the inverted index, removing the need for
periodic staleness checks and cooldowns. Rebuild the index once on
startup via init_inverted_index().
2026-05-26 12:37:59 -04:00
bruno 872a3e56dd Refactor file opening to use TabManager and add dashboard tab system 2026-05-26 12:14:47 -04:00
bruno b38f3f16e4 Coalesce index generation increments and add rebuild cooldown 2026-05-26 11:42:47 -04:00
bruno 0b611a8735 Add share, webhook, and conflict management features 2026-05-26 11:00:48 -04:00
bruno ed2bb4f7fb Add missing imports and clear backlink index
Resolve build index regression causing stale backlink data on reindex.
2026-05-26 10:35:22 -04:00
bruno 482937fb30 Add audit logging, rate limiting, secret redactor, and backlinks
Implement several security and feature improvements across the backend
and frontend:
- New IP-based rate limiter for authentication endpoints
- New audit logging system for sensitive operations
- New secret redactor to mask sensitive patterns in rendered content
- Configurable token TTL and IGNORED_DIRS via environment variables
- Add backlink index and API endpoint
- Add preview tab support with single/double-click behavior in tree
- Add file backup before write/delete operations
2026-05-26 10:27:00 -04:00
bruno 5280dc7a50 Add comprehensive documentation and analysis files
Add extensive project documentation including analysis review, image
rendering changelog and guide,
contributing guidelines, hidden files configuration guide, PWA
documentation suite, roadmap, and
dashboard specification.
2026-05-26 08:35:58 -04:00
bruno 456b308af6 Remove obsolete changelog, guides, specs and TODO files 2026-05-26 08:34:35 -04:00
bruno c65063fbca Update README docker-compose syntax and add incremental sidebar refresh
Implement `incrementalLoadDirectory` to update tree items without full
DOM
rebuild. Modify `refreshSidebarTreePreservingState` to use incremental
updates for expanded vaults and directories, preserving existing DOM
state.
2026-05-25 22:05:40 -04:00
bruno 9ce95eda2d Remove toast notification for silent auto-indexing
Replace `loadVaults()` and `loadTags()` calls with state-preserving
sidebar and tag refresh functions after silent indexing
2026-05-25 21:54:25 -04:00
bruno e84b66a257 Add fallback clipboard copy and wrap content in layout container 2026-05-25 21:21:41 -04:00
bruno 370420aa00 ajout de fonctionnalités 2026-05-25 20:21:42 -04:00
bruno e1fcbe9ce7 feat: expand CSP connect-src directive and add async loading guard for highlight.js in popout view
- Add cdnjs.cloudflare.com, fonts.googleapis.com, and fonts.gstatic.com to connect-src CSP directive
- Add waitForHljs helper function with 50 attempt limit and 100ms polling interval
- Check if hljs is defined before highlighting code blocks in popout view
- Fall back to async waiting if hljs not immediately available to prevent undefined reference errors
2026-04-12 17:06:35 -04:00
bruno ddb73461da feat: extract expandDirectoryInSidebar helper and add debouncing to breadcrumb navigation clicks
- Extract expandDirectoryInSidebar function to handle directory expansion logic with loading and chevron icon updates
- Replace inline directory expansion code in focusPathInSidebar with calls to new helper function
- Add busy state tracking to breadcrumb click handlers to prevent rapid successive clicks
- Disable pointer events during breadcrumb navigation execution
- Make breadcrumb onClick handlers async to support
2026-03-31 22:22:45 -04:00
bruno 0362d4dfeb feat: add center alignment option to scrollToElement and update breadcrumb navigation to center focused items
- Add "center" alignment option to scrollToElement function alongside existing top/default alignment
- Calculate centered scroll position by centering element vertically in viewport
- Update all breadcrumb navigation calls to use center alignment instead of top/false alignment
- Refactor targetTop calculation with ternary operator for cleaner conditional logic
2026-03-31 21:59:51 -04:00
bruno 78f7fd6a53 feat: improve dashboard navigation to files by focusing parent directory and syncing active state
- Extract getParentDirectoryPath helper to get parent directory from file path
- Extract syncActiveFileTreeItem helper to manage active tree item highlighting
- Update dashboard file navigation to focus parent directory with expansion instead of file itself
- Manually sync active state after navigation to ensure file is highlighted in tree
- Refactor openFile to use new syncActiveFileTreeItem helper
2026-03-31 21:26:45 -04:00
bruno 30b1d5fc93 feat: auto-expand collapsed directories when focusing path in sidebar from dashboard navigation
- Add expandTarget option to focusPathInSidebar function to control directory expansion behavior
- Check if target directory is collapsed and click to expand before highlighting
- Pass expandTarget: true when navigating to directories from dashboard to ensure visibility
- Add async delay after expansion to allow DOM update before path highlighting
2026-03-31 21:03:39 -04:00
bruno 89c6889f42 feat: add matched_path field to tree search results for consistency with advanced search response format 2026-03-31 14:35:16 -04:00
bruno 84d3ad0e90 feat: add ext: operator for file extension filtering in advanced search
- Add ext: operator support to query parser in backend and frontend
- Update search documentation in README and help modal with ext: examples
- Parse ext: operator to extract file extension filter (strips leading dot, converts to lowercase)
- Filter search candidates by file extension in advanced_search function
- Add ext chip display in search UI alongside existing tag/vault/title/path chips
- Update API documentation and function
2026-03-31 13:41:07 -04:00
bruno 4c4b8be215 feat: redesign help modal with enhanced hero section, improved navigation styling, and card-based layout
- Increase help container max-width from 960px to 1320px for wider layout
- Add overflow-y auto and scroll-behavior smooth to help-body
- Redesign help navigation with wider sidebar (260px), softer background colors, and rounded pill-style links
- Add emoji icons to all navigation menu items for better visual hierarchy
- Transform navigation links with rounded borders, gradient backgrounds on
2026-03-31 13:15:25 -04:00
bruno 7dc7e9932b feat: hide vault filter dropdown menu item by adding hidden class to label element 2026-03-31 11:54:19 -04:00
bruno 309f945751 feat: add CodeMirror-based file editor with modal interface and syntax highlighting
- Import CodeMirror 6 modules via ESM with importmap for @codemirror/state
- Add editor modal UI with header, cancel/save buttons, and editor body container
- Implement openEditor function to load file content and initialize CodeMirror with language-specific syntax highlighting
- Support 20+ file extensions including markdown, python, javascript, html, css, json, xml, sql, php, cpp, java, rust, and shell scripts
2026-03-31 11:48:14 -04:00
bruno f2de0d9456 feat: redesign dashboard card icons with outlined style and larger size
- Increase icon container size from 28px to 40px
- Change from solid accent background to transparent with 2px accent border
- Update border-radius from 6px to 8px
- Change icon color from white to accent color
- Increase SVG icon size from 20px to 24px
- Add flexbox centering for better icon alignment
2026-03-31 07:38:13 -04:00
bruno 1c2e867585 fix: rename icon variable to iconContainer to avoid shadowing Lucide icon function 2026-03-30 23:14:42 -04:00
bruno f539d02bcd fix: add error handling for dashboard card icon creation with fallback to default file icon 2026-03-30 23:10:52 -04:00
bruno 01841b8abe feat: expand file extension icon mappings and use dynamic icons in dashboard cards
- Add comprehensive file extension mappings organized by category (text, web, programming, data, config, shell, documents, images, audio, video, archives, fonts)
- Add support for 100+ file extensions including modern languages (Rust, Go, Swift, Kotlin, Zig, etc.)
- Add media file support (images, audio, video) with appropriate icons
- Add archive and font file type mappings
- Replace hardcoded SVG in dashboard cards with dynamic icon
2026-03-30 23:00:35 -04:00
bruno 4ede1a4fb1 feat: update tree item and action button icons to use accent color instead of secondary/muted colors 2026-03-30 22:44:22 -04:00
bruno 10a312ae89 feat: wrap tree item text in span elements and improve text overflow handling with flexbox
- Wrap vault, directory, and file names in span.tree-item-text elements
- Add flex: 1 to tree-item-text to enable proper text truncation
- Set min-width: 0 on tree-item and tree-item-text to allow flex shrinking
- Move overflow and text-overflow styles from tree-item to tree-item-text
- Update icon colors: use text-secondary for default, accent for active/vault items
2026-03-30 21:50:29 -04:00
bruno f51c4e848d feat: update action button icon from ellipsis to more-vertical and fix icon rendering scope
- Change action button icon from 'ellipsis' to 'more-vertical' for better visual consistency
- Update safeCreateIcons call to render all icons globally instead of scoping to button element
2026-03-30 21:19:06 -04:00
bruno 1a575020e6 feat: improve action button visibility with explicit styling and icon rendering
- Add explicit border and background colors to action buttons for better visibility
- Ensure Lucide icons are properly rendered in action buttons with deferred safeCreateIcons call
- Adjust badge margin to prevent overlap with action buttons
- Add z-index to action buttons to ensure proper layering
2026-03-30 21:12:22 -04:00
bruno 9a812eb34a feat: make action buttons always visible on all tree items
- Remove hover-based opacity transitions for action buttons
- Set action buttons to always visible (opacity: 1, pointer-events: auto)
- Remove desktop hover states and mobile/touch device media queries
- Simplify CSS by eliminating conditional visibility logic
2026-03-30 21:08:18 -04:00
bruno db812a6176 feat: add action buttons and long-press support for vault tree items with mobile-friendly context menus
- Add action buttons (ellipsis icon) to vault, directory, and file tree items
- Implement long-press gesture detection for mobile devices with 550ms delay and 10px movement threshold
- Show action buttons on hover for desktop and always visible on mobile/touch devices
- Position context menus near action buttons to prevent off-screen rendering
- Prevent click events from firing after long-press ges
2026-03-30 20:56:34 -04:00
bruno 628a664c59 feat: implement inline rename for files and directories with state preservation
- Replace placeholder inline rename with full implementation
- Add input validation for file/directory names with character restrictions
- Handle file extensions separately during rename operations
- Update current path when renaming open files or parent directories
- Replace refreshVaultTree calls with refreshSidebarTreePreservingState to maintain tree expansion state
- Add keyboard shortcuts (Enter to submit, Escape to cancel)
2026-03-30 15:53:42 -04:00
bruno 32c1bad1a1 feat: add context menu support for vault items with create file/directory operations 2026-03-30 15:44:16 -04:00
bruno eb2d21dbe8 feat: remove read-only mount flags from vault volumes to enable file and directory management operations 2026-03-30 15:37:32 -04:00
bruno d3b9298dfa feat: add file and directory management endpoints with context menu support
- Add POST/PATCH/DELETE endpoints for directory operations (create, rename, delete)
- Add POST/PATCH endpoints for file operations (create, rename)
- Implement writable vault check to prevent modifications on read-only vaults
- Update file delete endpoint to broadcast SSE events and update index
- Add Pydantic models for all new request/response schemas
- Integrate context menu support in frontend for files and directories
- Broadcast real
2026-03-30 15:26:44 -04:00
bruno d26a40a99d feat: initialize frontend structure with login screen, search interface, and CodeMirror integration 2026-03-27 23:13:59 -04:00
bruno 6fc1c59664 feat: initialize ObsiGate frontend with SPA structure, search history, and autocomplete functionality 2026-03-27 23:09:47 -04:00