feat(refboard): canvas polish — transform box sync, dot grid, snap tuning, perf fixes

- Fix transform box not updating after alignment/arrangement/normalize/flip operations
  (shortcuts, context menu, and selection toolbar all fixed with DRY _opUpdate helper)
- Replace 100ms polling loop with event-driven viewport updates (moved + wheel-scroll)
- Add adaptive dot grid background that responds to zoom/pan
- Reduce snap guide threshold from 8px to 4px for subtler snapping
- Remove PresenceOverlay (remote selection highlighting) — too heavy for minimal benefit
- Offset multiple dropped images so they don't overlap
- Add new canvas modules: SnapGuides, clipboard, grouping, FrameSprite, DrawingSprite,
  LaserPointer, context-menu-items, SelectionToolbar, Minimap
- Extract Editor hooks into dedicated files (useBoardLoader, useCanvasSetup,
  useShortcutHandler, useLayerPanel, useSaveManager, useFollowMode)
- Sync improvements: real-time transform broadcast, board rooms, viewport sync
This commit is contained in:
Hiren Kangad
2026-03-10 03:58:53 +05:30
parent cfd7adf73d
commit e9509ef7b0
41 changed files with 4171 additions and 705 deletions
+12 -2
View File
@@ -4,7 +4,7 @@
export interface SceneObject {
id: string;
type: 'image' | 'video' | 'text' | 'group';
type: 'image' | 'video' | 'text' | 'group' | 'drawing';
x: number;
y: number;
w: number;
@@ -42,12 +42,22 @@ export interface TextObject extends SceneObject {
fontFamily: string;
}
export interface DrawingObject extends SceneObject {
type: 'drawing';
points: number[]; // flat array: [x0, y0, x1, y1, ...]
color: string;
strokeWidth: number;
}
export interface GroupObject extends SceneObject {
type: 'group';
children: string[];
bgColor?: string; // frame background color (e.g. '#2a2a3a'), empty/undefined = transparent
label?: string; // frame title label
padding?: number; // inner padding around children (default 12)
}
export type AnySceneObject = ImageObject | VideoObject | TextObject | GroupObject;
export type AnySceneObject = ImageObject | VideoObject | TextObject | DrawingObject | GroupObject;
export interface SceneData {
v: 2;