1. 25 Nov, 2025 4 commits
    • Steven's avatar
      fix(web): resolve tag sidebar filtering and reactivity issues · eb541d04
      Steven authored
      This fixes multiple issues with the tag sidebar and activity calendar:
      
      1. Tag disappearing bug: When filtering by a tag, the sidebar now shows all tags instead of only the selected tag
      2. Activity calendar filtering: Calendar now shows full activity history instead of filtered results
      3. Auto-update on memo changes: Sidebar tags and calendar now update automatically when creating/editing memos without requiring manual page refresh
      
      Technical changes:
      - Modified useFilteredMemoStats to fetch unfiltered UserStats from backend API for Home/Profile pages
      - Fixed key mismatch bug in userStore where stats were stored with inconsistent keys
      - Added statsStateId update in fetchUserStats to trigger reactivity
      - Updated MainLayout to pass appropriate userName based on page context
      - Archived/Explore pages continue to compute from cached memos (correct behavior)
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
      eb541d04
    • Steven's avatar
      fix(web): update time locale when language is changed · 8ec4c9ab
      Steven authored
      Pass i18n.language to time display components to ensure locale updates
      when the user switches languages in UserMenu. Changes:
      
      - MemoView: Pass i18n.language to toLocaleString() and <relative-time> lang attribute
      - MonthNavigator: Wrap with observer to make component reactive to i18n.language changes
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
      8ec4c9ab
    • Steven's avatar
      refactor(web): restructure MemoEditor with custom hooks and improved error handling · ef6456a4
      Steven authored
      Extract reusable logic into custom hooks (useLocalFileManager, useDragAndDrop, useDebounce, useAbortController), add ErrorBoundary for resilience, and centralize constants. Fix cursor positioning bugs, useEffect dependency issues, and add geocoding request cancellation. Improve performance with debounced localStorage writes and ref-based flags.
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code)
      Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
      ef6456a4
    • Johnny's avatar
  2. 24 Nov, 2025 6 commits
  3. 23 Nov, 2025 2 commits
    • Johnny's avatar
      60d977c0
    • Johnny's avatar
      refactor(markdown): use Unicode categories for tag validation · b78d4c25
      Johnny authored
      Replace custom character whitelist with Unicode standards-based validation:
      
      - Use unicode.IsLetter/IsNumber/IsSymbol instead of hardcoded lists
      - Remove manual UTF-8 byte checking for CJK punctuation
      - Add proper rune-based length limiting (MAX_TAG_LENGTH = 100)
      - Improve international character support (CJK, Arabic, Cyrillic, etc.)
      - Add emoji support via unicode.IsSymbol
      
      Benefits:
      - Cleaner, more maintainable code (~50 lines removed)
      - Standards-based approach following Unicode categories
      - Better UTF-8 safety with utf8.DecodeRune
      - Consistent validation between Go backend and TypeScript frontend
      
      All existing tests pass with improved Unicode handling.
      b78d4c25
  4. 21 Nov, 2025 2 commits
  5. 19 Nov, 2025 4 commits
    • Steven's avatar
      fix(web): refresh sidebar tags when creating/updating memos · edfbd6b0
      Steven authored
      The sidebar tag list wasn't updating when users created new memos with tags
      or modified existing memo tags. This was because useFilteredMemoStats hook
      only refetched when filter/state/orderBy changed.
      
      Now the hook observes memoStore.state.stateId, which changes whenever memos
      are created, updated, or deleted. This triggers automatic refetch and the
      sidebar updates immediately with the latest tag counts.
      
      Fixes tag refresh issue in sidebar
      edfbd6b0
    • Steven's avatar
      fix(web): resolve Leaflet DOM cleanup error causing app crashes · cabd0d61
      Steven authored
      - Add MapCleanup component to properly remove Leaflet map instances on unmount
      - Fix LocationMarker initialization with useRef to prevent re-initialization
      - Remove problematic key prop in LocationDialog that caused unnecessary remounts
      - Fix goimports formatting in tag parser
      
      Fixes #5260
      cabd0d61
    • Steven's avatar
    • Steven's avatar
      fix(parser): support Unicode characters in tags · 64e9d82d
      Steven authored
      Fixes #5264
      
      Chinese, Japanese, Korean, and other Unicode characters are now
      properly recognized in hashtags, following the standard hashtag
      parsing conventions used by Twitter, Instagram, and GitHub.
      
      Changes:
      - Updated tag parser to allow Unicode letters and digits
      - Tags stop at whitespace and punctuation (both ASCII and CJK)
      - Allow dash, underscore, forward slash in tags
      - Added comprehensive tests for CJK characters and emoji
      
      Examples:
      - #测试 → recognized as tag '测试'
      - #日本語 → recognized as tag '日本語'
      - #한국어 → recognized as tag '한국어'
      - #测试。→ recognized as tag '测试' (stops at punctuation)
      - #work/测试/项目 → hierarchical tag with Unicode
      64e9d82d
  6. 17 Nov, 2025 2 commits
    • Neo's avatar
      fix: keyboard shortcuts (#5250) · 4de8712c
      Neo authored
      4de8712c
    • Johnny's avatar
      feat(web): add Focus Mode UI entry in Insert Menu · 35711880
      Johnny authored
      Add discoverable UI entry point for Focus Mode via Insert Menu submenu:
      
      UI Changes:
      - Add "View" submenu to Insert Menu (+ button dropdown)
      - Nested menu with Focus Mode option (ChatGPT-style pattern)
      - Display keyboard shortcut hint (⌘⇧F) next to menu item
      - Uses DropdownMenuSub components from Radix UI
      
      User Access Methods:
      1. Keyboard: Cmd/Ctrl+Shift+F (primary, power users)
      2. Mouse: + menu → View → Focus Mode (discoverable)
      3. Mobile: Touch-friendly menu access
      
      Benefits:
      - Improves discoverability for new users
      - Doesn't clutter main editor UI
      - Educates users about keyboard shortcut
      - Extensible for future view options (typewriter, reading mode, etc.)
      - Follows familiar UI patterns (ChatGPT, Notion)
      
      Files Modified:
      - web/src/components/MemoEditor/ActionButton/InsertMenu.tsx
        * Add DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent
        * Add View submenu with Focus Mode entry
        * Add onToggleFocusMode prop
      - web/src/components/MemoEditor/index.tsx
        * Pass toggleFocusMode to InsertMenu component
      - web/src/locales/en.json
        * Add "editor.view" translation key
      35711880
  7. 16 Nov, 2025 1 commit
    • Johnny's avatar
      feat(web): add Focus Mode for distraction-free writing · c8162ff3
      Johnny authored
      Add keyboard-activated Focus Mode to provide an immersive writing experience:
      
      Features:
      - Toggle with Cmd/Ctrl+Shift+F (matches GitHub, Google Docs)
      - Exit with Escape, toggle shortcut, button click, or backdrop click
      - Expands editor to ~80-90% of viewport with centered layout
      - Semi-transparent backdrop with blur effect
      - Maintains all editor functionality (attachments, shortcuts, etc.)
      - Smooth 300ms transitions
      
      Responsive Design:
      - Mobile (< 640px): 8px margins, 50vh min-height
      - Tablet (640-768px): 16px margins
      - Desktop (> 768px): 32px margins, 60vh min-height, 1024px max-width
      
      Implementation:
      - Centralized constants for easy maintenance (FOCUS_MODE_STYLES)
      - Extracted keyboard shortcuts and heights to named constants
      - JSDoc documentation for all new functions and interfaces
      - TypeScript type safety with 'as const'
      - Explicit positioning (top/left/right/bottom) to avoid width overflow
      
      Files Modified:
      - web/src/components/MemoEditor/index.tsx - Main Focus Mode logic
      - web/src/components/MemoEditor/Editor/index.tsx - Height adjustments
      - web/src/locales/en.json - Translation keys
      
      Design follows industry standards (GitHub Focus Mode, Notion, Obsidian)
      and maintains code quality with single source of truth pattern.
      c8162ff3
  8. 14 Nov, 2025 2 commits
    • Steven's avatar
      chore(web): migrate from ESLint+Prettier to Biome · 156908c7
      Steven authored
      - Install @biomejs/biome@2.3.5 as unified linter and formatter
      - Remove ESLint, Prettier and all related plugins (221 packages removed)
      - Migrate linting rules from ESLint to Biome configuration
      - Migrate formatting rules from Prettier to Biome configuration
      - Exclude auto-generated proto files from linting (src/types/proto/**)
      - Exclude CSS files from Biome (Tailwind syntax not yet supported)
      - Update package.json scripts:
        - lint: tsc + biome check
        - lint:fix: biome check --write
        - format: biome format --write
      - Auto-fix import organization across 60+ files
      - Fix duplicate key in Russian locale (ru.json)
      - Update CLAUDE.md documentation to reflect Biome usage
      
      Benefits:
      - 10-100x faster linting performance
      - Simplified toolchain with single configuration file
      - 221 fewer npm dependencies
      - Unified linting, formatting, and import organization
      156908c7
    • Johnny's avatar
  9. 11 Nov, 2025 1 commit
  10. 10 Nov, 2025 4 commits
  11. 09 Nov, 2025 4 commits
  12. 08 Nov, 2025 8 commits