Implements multi-select functionality in the file browser, allowing users to
perform batch actions such as deleting or moving multiple drawings at once.
Adds full CRUD support for folders, including updating folder properties
and reordering folders via a new `sort_order` column in the database.
- feat(ui): add multi-select, batch delete, and batch move in FileBrowser
- feat(api): add endpoints for updating, deleting, and reordering folders
- feat(db): add `sort_order` column and index to `workspace_folders`
- fix(editor): integrate `useHandleLibrary` for better library management
- chore(deps): update excalidraw subproject
Refactor the file browser to improve the user experience and reliability of
folder management and item movement.
- Implement a dedicated drag handle wrapper to improve drag-and-drop
precision and visual feedback.
- Improve drag-and-drop event handling to prevent accidental triggers
and ensure correct visual states during drag operations.
- Refactor the move modal logic and styling for better clarity and
usability.
- Fix folder menu closing logic to correctly handle outside clicks.
- Update CI workflow to ensure Docker is installed before building
images.
- Move custom tools (checkbox, correct/incorrect, star) to floating
canvas toolbar above native Excalidraw tools
- Fix correct/incorrect toggle: square text element cycling empty/
check/cross with debounce to prevent double-firing
- Fix star rating: updates displayed stars on click
- Remove broken infinity-arrow feature entirely
- Fix autosave false "unsaved" on load by skipping first change
after initial data normalization
- Fix presentation mode: remove opaque overlay blocking canvas,
add pointer-events to only toolbar/thumbnails
- Fix to-do list add: full text area clickable via customData,
correct spacing when inserting new tasks
- Add customData to all template "Add..." text elements so every
template add button + text pair is fully clickable
- Expand generic add handler with role-specific creation for
brainstorm, retro, swot, storymap, wireframe, timeline, api,
sitemap, and persona templates
- Fix library import from libraries.excalidraw.com via #addLibrary
hash: extract into reusable callback, listen to hashchange events,
and offset imported elements to viewport center
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Refactor the Editor component to replace `any` types with explicit interfaces for Excalidraw props, library items, and elements, improving type safety and developer experience.
Additionally, update the Vite configuration to implement manual chunking for large dependencies like Excalidraw, React, and Zustand to optimize bundle loading and improve build performance.
Implements full folder CRUD operations in the file browser, including
renaming, deleting, and drag-and-drop reordering. Enhances the editor
with improved autosave logic and new template role toggling.
- Add folder management (create, update, delete, reorder) to API and UI
- Implement drag-and-drop functionality for folders in FileBrowser
- Add folder context menus and improved styling for Editor and FileBrowser
- Optimize editor autosave to only trigger on actual data changes
- Add support for 'correct-incorrect' template roles in the editor
Implements an autosave mechanism to prevent data loss by periodically
sending snapshots of the drawing to the backend. This includes new
API endpoints on the server and updated frontend services.
Additionally, improves the editor experience with:
- Enhanced CSRF protection and origin validation in the backend.
- Fix for React "Maximum update depth exceeded" error during scene
mutations using a mutation guard.
- New presentation slide thumbnails and navigation UI.
- Expanded template library with various brainstorming layouts.
- Refined dashboard statistics and layout styling.
- Improved sidebar logo using SVG for better scaling.
Refactor the frontend styling to use consistent design tokens and remove the hand-drawn/rotated aesthetic in favor of a cleaner, more standard UI.
- Replace hardcoded colors and border radii with CSS variables (e.g., `--default-border-color`, `--border-radius-lg`).
- Remove `transform: rotate(...)` and manual `box-shadow` offsets from various components (Sidebar, Dashboard, TemplatePicker, etc.).
- Update `Dashboard` to use a standard `ProgressBar` instead of a hand-drawn SVG chart.
- Standardize font families to use `--ui-font`.
- Clean up `TemplatePicker` logic to properly handle element grouping.
- Remove stale test result files and update `.last-run.json`.
This commit introduces a significant update to both the frontend and backend, focusing on enhanced user engagement and a consistent visual identity.
Key changes include:
- **Frontend UI/UX Refactor**:
- Implemented a "hand-drawn" aesthetic across the entire application using CSS overrides, custom SVG charts, and specific border/shadow styles to match the Excalidraw experience.
- Added a new notification system in the Header to display user updates.
- Enhanced the Template Picker with more variety and improved interaction models.
- Added a "Presentation Mode" in the Editor.
- Improved Dashboard visualizations with hand-drawn style sparklines and charts.
- Added modal dialogs for creating drawings and templates with custom names.
- **Backend & API Enhancements**:
- Implemented full CRUD support for custom templates, allowing users to save their drawings as reusable templates.
- Added a notification service with endpoints to list, mark as read, and mark all as read.
- Updated the API client to handle more robust JSON responses and error states.
- Improved CORS/Origin validation in the HTTP middleware to handle proxy headers (`X-Forwarded-Host`, `X-Forwarded-Proto`) more reliably.
- **Database & Infrastructure**:
- Added a new PostgreSQL migration for the `notifications` table.
- Updated the data models in the workspace to support templates (including snapshot storage) and notifications.
- Updated `.gitignore` to exclude graphify cache and AST files.
Migrate the frontend to ESLint 9, add `eslint.config.mjs`, and replace various `any` types with more specific or safer alternatives across the codebase.
- Update `package.json` with new ESLint and TypeScript-ESLint dependencies
- Replace `any` with `Record<string, unknown>` or specific types in `TemplatePicker`, `Editor`, and `FileBrowser`
- Improve error handling in `TeamSettings` and `Templates` using type guards
- Add explicit type imports for Excalidraw elements in `Editor.tsx`
- Refactor `Modal.tsx` for cleaner conditional logic
- Add `check` script to `package.json` for type checking
- Fix go.mod Go version from invalid 1.25.7 to 1.23
- Fix Dockerfile golang image from 1.25 to 1.23
- Add window.matchMedia mock for jsdom themeStore tests
- Exclude e2e/ from Vitest to prevent Playwright test conflicts
- Add frontend test step to both CI workflows