1. 30 Nov, 2025 2 commits
  2. 29 Nov, 2025 1 commit
    • Johnny's avatar
      refactor: implement MemoView component with subcomponents and hooks · 1ef11f74
      Johnny authored
      - Added MemoView component to display a single memo card with full functionality including creator info, memo content, attachments, reactions, and comments.
      - Created MemoBody and MemoHeader subcomponents to separate concerns and improve maintainability.
      - Introduced custom hooks for managing memo actions, keyboard shortcuts, NSFW content visibility, and image preview.
      - Implemented reaction handling with new ReactionSelector and ReactionView components.
      - Added TypeScript types for better type safety and clarity.
      - Established constants for memo card styling and keyboard shortcuts.
      - Removed legacy ReactionSelector and ReactionView components from the previous structure.
      1ef11f74
  3. 28 Nov, 2025 1 commit
    • Johnny's avatar
      feat: add LocationDialog and related hooks for location management in MemoEditor · 50199fe9
      Johnny authored
      - Implemented LocationDialog component for selecting and entering location coordinates.
      - Created useLocation hook to manage location state and updates.
      - Added LocationState type for managing location data.
      - Introduced useLinkMemo hook for linking memos with search functionality.
      - Added VisibilitySelector component for selecting memo visibility.
      - Refactored MemoEditor to integrate new hooks and components for improved functionality.
      - Removed obsolete handlers and streamlined memo save logic with useMemoSave hook.
      - Enhanced focus mode functionality with dedicated components for overlay and exit button.
      50199fe9
  4. 27 Nov, 2025 1 commit
  5. 26 Nov, 2025 7 commits
  6. 25 Nov, 2025 7 commits
  7. 24 Nov, 2025 6 commits
  8. 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
  9. 21 Nov, 2025 2 commits
  10. 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
  11. 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
  12. 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
  13. 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
  14. 11 Nov, 2025 1 commit
  15. 10 Nov, 2025 1 commit
    • Steven's avatar
      chore(web): unify metadata badge styling and fix event handling · dc398cf6
      Steven authored
      - Remove MetadataBadge component and inline styles consistently
      - Add pointer/mouse event handlers to prevent drag interference
      - Fix LocationDisplay mode handling and popover interaction
      - Clean up RelationList empty state logic
      dc398cf6