Skip to content

Conversation

@jsnanigans
Copy link

No description provided.

jsnanigans added 26 commits January 4, 2026 11:56
- Add ImageWaveform module with canvas-based RGB/Luma/channel rendering
- Update WaveformData type for separate channel arrays
- Add mock waveform generation to PreviewBloc
- Create MetadataBloc for EXIF parsing and GPS extraction
- Create MetadataPanel with GPS map and collapsible sections
- Create ExportBloc for export settings and progress state
- Create ExportPanel with format, resize, metadata, color space options
- Update PanelSwitcher to route Metadata and Export tabs
- Register new modules in registry

Progress: 71% complete (62/87 tasks)
- CropBloc: aspect ratio presets, rotation, flip, straighten
- CropPanel: aspect ratio grid, rotation slider, transform tools
- MasksBloc: mask containers, sub-masks (brush/gradient/radial/luminosity/color/AI)
- MasksPanel: mask creation, editing view, per-mask adjustments
- PresetsBloc: folder/preset tree, import/export, preview URLs
- PresetsPanel: folder tree, preset thumbnails, inline forms
- AIBloc: AI patches, ComfyUI status, generative fill state
- AIPanel: connection status, tool grid, brush settings, prompt input
- Updated registry and PanelSwitcher to enable all panel tabs

Phase 4 now 75% complete (12/16 tasks), overall ~80% complete
Add ModalBloc for modal visibility registry with typed data and confirm() API.
Add Modal primitive with ConfirmModal and InputModal variants.
Add RatingControl, ColorLabelPicker, and TagEditor metadata widgets.
Update progress to 85% complete (74/87 tasks).
- KeyboardService: centralized shortcuts with modifiers and categories
- ContextMenuService + ContextMenu: nested submenus, portal rendering
- ClipboardService: copy/paste adjustments by category
- FullscreenViewer: fullscreen image viewing with auto-hide UI
- ErrorMessage: error/warning/info variants with retry/dismiss
- CommunityBloc + CommunityView: preset browsing with search/filter
- KeyboardShortcutsModal, AboutModal, ExportProgressModal

Progress: ~95% complete (83/87 tasks)
- Add @tanstack/react-virtual for list virtualization
- Virtualize GalleryGrid with dynamic column count and row-based rendering
- Virtualize Filmstrip with horizontal scrolling
- Virtualize CommunityView grid and list modes
- Configure useFlushSync: false for React 19 compatibility
- Add LRU cache utility with eviction callbacks for blob URL cleanup
- Update ThumbnailBloc to use LRU cache (500 item limit)
- Update PreviewBloc with blob URL revocation on clear/change
- Add unit tests for SelectionBloc, HistoryBloc, AdjustmentsBloc, LRUCache

Phase 5 progress: 11/13 complete (~98%)
- Implement BottomBar component with star rating, copy/paste adjustments, and view-specific controls
- Add LibraryExportPanel with format selection, resize options, and metadata controls
- Create Switch primitive component for boolean settings
- Update layout configs with proper pixel-based sizing from legacy values
- Refine WelcomeScreen with splash images and settings panel
- Update primitives (Button, Dropdown, Input, Modal, Slider, CollapsibleSection) for consistency
…hortcuts

- Add ModalRenderer to centrally render all modals from ModalBloc state
- Integrate TitleBar with macOS traffic light support
- Wire up ContextMenuProvider for global right-click menus
- Initialize KeyboardService with useGlobalShortcuts hook (Cmd+1/2/3, Cmd+/)
- Create barrel exports for blocs, hooks, utils, and services
- Fix Button (add secondary variant), Input (add icon props), Dropdown (generic types)
- Complete feature parity with 48/48 components implemented
- Replace custom Button with React Aria Button for accessibility
- Use tailwind-variants for variant management
- Add pressed state via data-[pressed]: selectors
- Add focus ring via focusRing utility
- Maintain backward compatibility: onClick, disabled, title props still work
- Add react-aria-components and tailwind-variants dependencies
- Modal: use React Aria Dialog/ModalOverlay with animations
- Switch: use React Aria Switch with tailwind-variants
- Input: use React Aria Input with focusRing utility
- CollapsibleSection: use React Aria Disclosure with MutationObserver for height animation

All components preserve existing APIs for backward compatibility.
- Create Tooltip primitive using React Aria (200ms delay, animations)
- Update Switch to use Tooltip instead of native title attribute
- Refactor ContextMenu UI with React Aria Menu components
  - Full keyboard navigation (arrows, Home/End, typeahead)
  - Auto-focus first item, proper ARIA roles
  - Keep ContextMenuService BLoC for state management
- Document decision to keep Slider as custom implementation
- Phase 3 complete, Phase 4 in progress
- Add tailwind-merge dependency (required by tailwind-variants for build)
- ColorWheel evaluation: keep custom (already SVG implementation)
- Build validated: 584.97 kB (179.27 kB gzip)
- Bundle increase ~70 kB gzip for accessibility benefits
- All phases complete (98%), ready for manual testing
- Remove @uiw/react-color-wheel and @uiw/color-convert (only used in legacy)
- Add aria-label and aria-valuetext to Slider for screen reader support
- Screen readers now announce 'Exposure: 1.5' instead of just '1.5'
Document all dependencies with usage analysis:
- 17 active dependencies to keep
- 14 unused/legacy dependencies that can be removed
- Includes removal instructions and alternatives considered
@jsnanigans jsnanigans requested a review from CyberTimon as a code owner January 6, 2026 20:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant