ObsiViewer/CODE_BLOCK_FIXES.md
Bruno Charest 914515efe4 ```
docs: restructure README with concise overview and improved organization

- Condensed README from 715 to 113 lines with streamlined feature descriptions
- Replaced verbose documentation with quick-start focused content
- Reorganized sections: removed detailed architecture, API endpoints, and Meilisearch implementation details
- Added version badges and simplified feature categories (Navigation, Markdown, Graph)
- Streamlined installation instructions with Docker-first approach and simplified local
2025-11-19 15:56:56 -05:00

5.5 KiB

Code Block Component - Fixes Applied

Issues Fixed

1. Line Numbers Not Working

Problem: Line numbers were displayed but the code content overlapped them because there was no padding.

Solution:

  • Added dynamic padding to the <pre> element based on props.showLineNumbers
  • When line numbers are shown: padding: 12px 12px 12px 48px (48px left padding for line numbers)
  • When line numbers are hidden: padding: 12px
  • Applied the same font family to line numbers to ensure proper alignment

2. Font Selection Menu Missing

Problem: There was no way to change the font of the code block.

Solution:

  • Added availableFonts array with popular monospace fonts:
    • JetBrains Mono
    • Fira Code
    • Consolas
    • Monaco
    • Courier New
    • Monospace
  • Added font selection menu in the "More" dropdown
  • Implemented onFontChange() method to update the font
  • Implemented getFontFamily() method to apply the selected font
  • Font is applied via [style.font-family]="getFontFamily()"

3. Language Detection Not Working

Problem: There was no automatic language detection feature.

Solution:

  • Implemented detectLanguageInternal() method with pattern matching for 16+ languages
  • Auto-detection runs on component initialization if no language is set
  • Added "Auto-detect Language" button in the menu
  • Detection patterns include:
    • JavaScript, TypeScript, Python, Java, C#, C++, C, Go, Rust
    • PHP, Ruby, HTML, CSS, JSON, XML, YAML
    • SQL, Bash, Dockerfile, Markdown

4. Theme Selection Doesn't Change Text Color

Problem: Theme selection menu was missing.

Solution:

  • Added theme selection menu in the "More" dropdown
  • Lists all available themes from CodeThemeService
  • Implemented onThemeChange() method
  • Fixed getThemeClass() to use 'darcula' as default theme
  • Theme CSS class is properly applied to the code container

5. Preview/Collapse Option Missing

Problem: The header didn't have a collapse/preview toggle like the file block.

Solution:

  • Complete UI restructure following the file block pattern
  • Added header button with:
    • 💻 emoji icon
    • Language label
    • Line count display
    • "More" menu (⋮ button)
    • Collapse/Preview label
  • Implemented toggleCollapse(), isCollapsed() methods
  • Code editor is conditionally rendered based on !isCollapsed()
  • Uses props.collapsed to track state

New Features Added 🎁

Enhanced Menu System

  • Created comprehensive dropdown menu with sections:
    • Language Selection: All supported languages with visual checkmarks
    • Theme Selection: All available themes
    • Font Selection: Multiple monospace font options
    • Options: Toggle line numbers and word wrap
    • Actions: Copy to clipboard and auto-detect language

Better UX

  • Menu closes automatically after selection
  • Menu positioning follows cursor
  • Escape key closes menu
  • Click outside closes menu
  • Visual feedback (checkmarks) for selected options

Keyboard Accessibility

  • Header button supports Enter and Space keys
  • ARIA attributes for screen readers
  • Focus management

Additional Utilities

  • getLineCount(): Shows number of lines in the header
  • getLanguageLabel(): Displays friendly language name
  • copyToClipboard(): One-click code copying
  • onBlur(): Updates line numbers after editing

Architecture Improvements

Consistent with File Block

The component now follows the same pattern as the file block:

  • Same header structure
  • Same menu positioning logic
  • Same collapse/expand behavior
  • Better visual consistency across the app

Better State Management

  • All props updates go through this.update.emit()
  • Menu state managed with menuOpen and menuPos
  • Proper cleanup with @HostListener decorators

Testing Recommendations

  1. Test Line Numbers:

    • Toggle line numbers on/off
    • Add/remove lines and verify numbers update
    • Check alignment with different fonts
  2. Test Themes:

    • Switch between all available themes
    • Verify text color changes properly
    • Check that default theme (Darcula) loads correctly
  3. Test Fonts:

    • Try each font option
    • Verify line numbers align correctly with each font
    • Check that font persists after editing
  4. Test Language Detection:

    • Paste code in different languages
    • Click "Auto-detect Language"
    • Verify correct language is detected
  5. Test Collapse/Expand:

    • Click header to collapse
    • Verify content hides
    • Verify "Preview/Collapse" label updates
    • Expand and verify content shows
  6. Test Menu:

    • Open menu and click outside to close
    • Press Escape to close
    • Select options and verify menu closes
    • Check menu positioning on different screen sizes

Known Limitations

  1. Language Detection: The detection is pattern-based and may not be 100% accurate for ambiguous code snippets.
  2. Font Loading: Custom fonts (JetBrains Mono, Fira Code) need to be loaded in your app for them to work properly. Consider adding them to your global styles.
  3. Syntax Highlighting: This component uses CSS themes but doesn't have actual syntax highlighting (would need a library like Prism or Highlight.js for that).

Next Steps (Optional Enhancements)

  1. Add syntax highlighting with Prism.js or Highlight.js
  2. Add line highlighting feature
  3. Add search/replace functionality
  4. Add code folding
  5. Load custom fonts via CDN or local assets
  6. Add more sophisticated language detection (using a library)
  7. Add export functionality (download as file)