- 30 Nov, 2025 4 commits
-
-
Johnny authored
This commit refactors MemoView and MemoEditor components for better maintainability, introducing React Context, custom hooks, and improved folder structure. MemoView improvements: - Introduce MemoViewContext to eliminate prop drilling - Reduce MemoHeader props from 18 to 8 - Reduce MemoBody props from 9 to 4 - Extract custom hooks: useMemoViewDerivedState, useMemoEditor, useMemoHandlers for better separation of concerns - Fix React hooks ordering bug in edit mode MemoEditor improvements: - Extract state management into useMemoEditorState hook - Extract keyboard handling into useMemoEditorKeyboard hook - Extract event handlers into useMemoEditorHandlers hook - Extract initialization logic into useMemoEditorInit hook - Reduce main component from 461 to 317 lines (31% reduction) Folder structure cleanup: - Move SortableItem to memo-metadata (correct location) - Move ErrorBoundary to components folder - Flatten Toolbar/InsertMenu structure (remove unnecessary nesting) - Consolidate hooks in main hooks folder - Consolidate types in main types folder Benefits: - Better separation of concerns - Improved testability - Easier maintenance - Cleaner code organization - No functionality changes
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By:Claude <noreply@anthropic.com>
-
Johnny authored
- Remove enable_link_preview field from proto definitions - Remove setting UI from MemoRelatedSettings component - Remove translations from all 33 locale files - Regenerate proto files
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By:Claude <noreply@anthropic.com>
-
Johnny authored
- Remove disable_markdown_shortcuts field from proto definitions - Remove setting UI from MemoRelatedSettings component - Enable markdown shortcuts permanently in MemoEditor - Remove translations from all 32 locale files - Fix TypeScript error in useMemoSave hook by using typed translation function
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By:Claude <noreply@anthropic.com>
-
Johnny authored
-
- 29 Nov, 2025 1 commit
-
-
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.
-
- 28 Nov, 2025 1 commit
-
-
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.
-
- 27 Nov, 2025 1 commit
-
-
Chriss authored
-
- 26 Nov, 2025 7 commits
-
-
Steven authored
-
Steven authored
-
Steven authored
-
Steven authored
Tags were missing CSS styles, appearing as plain text. Added text-primary styling to Tag component and updated default theme primary color to match other themes (blue hue 250, chroma 0.08) for consistency. Fixes #5282
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By:Claude <noreply@anthropic.com>
-
Steven authored
Add remark-breaks plugin to render single newlines as <br> tags, matching GitHub Flavored Markdown behavior. Fixes https://github.com/usememos/memos/issues/5277
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By:Claude <noreply@anthropic.com>
-
김강현 authored
-
김강현 authored
-
- 25 Nov, 2025 7 commits
-
-
Steven authored
Resolves issue where tag filtering in PostgreSQL databases failed with "operator does not exist: jsonb ~~ unknown" error. The hierarchical tag filtering feature introduced in commit 5e47f25b generated SQL with implicit type placeholders that PostgreSQL couldn't infer. The fix explicitly casts the LIKE comparison placeholder to text (::text) in the PostgreSQL dialect, ensuring proper type resolution for the query parameter. Fixes #5275
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By:Claude <noreply@anthropic.com>
-
Steven authored
The truncateAtWord function was slicing strings by byte position instead of character position. When truncating text with multi-byte UTF-8 characters (like CJK), this could cut in the middle of a character, creating invalid UTF-8 and causing gRPC marshaling errors. Fixed by converting to runes before truncation to ensure we always cut at proper character boundaries. Added test cases for CJK characters. Fixes #5276
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By:Claude <noreply@anthropic.com>
-
Steven authored
-
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:Claude <noreply@anthropic.com>
-
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:Claude <noreply@anthropic.com>
-
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:Claude <noreply@anthropic.com>
-
Johnny authored
-
- 24 Nov, 2025 6 commits
- 23 Nov, 2025 2 commits
-
-
Johnny authored
-
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.
-
- 21 Nov, 2025 2 commits
- 19 Nov, 2025 4 commits
-
-
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
-
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
-
Steven authored
-
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
-
- 17 Nov, 2025 2 commits
-
-
Neo authored
-
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
-
- 16 Nov, 2025 1 commit
-
-
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.
-
- 14 Nov, 2025 2 commits
-
-
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
-
Johnny authored
Co-authored-by:Claude <noreply@anthropic.com>
-