@tsdraw/react 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/SelectionOverlay.tsx","../src/components/StylePanel.tsx","../src/components/ToolOverlay.tsx","../src/components/Toolbar.tsx","../src/canvas/cursor.ts","../src/persistence/localIndexedDb.ts","../src/persistence/sessionId.ts","../src/canvas/useTsdrawCanvasController.ts","../src/components/TsdrawCanvas.tsx"],"names":["jsxs","jsx","resolveThemeColor","useState","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import type { PointerEvent as ReactPointerEvent } from 'react';\nimport type { ResizeHandle, ToolId } from '@tsdraw/core';\nimport type { ScreenRect } from '../types.js';\n\ninterface SelectionOverlayProps {\n selectionBrush: ScreenRect | null;\n selectionBounds: ScreenRect | null;\n selectionRotationDeg: number;\n currentTool: ToolId;\n selectedCount: number;\n onRotatePointerDown: (e: ReactPointerEvent<HTMLButtonElement>) => void;\n onResizePointerDown: (e: ReactPointerEvent<HTMLButtonElement>, handle: ResizeHandle) => void;\n}\n\nexport function SelectionOverlay({\n selectionBrush,\n selectionBounds,\n selectionRotationDeg,\n currentTool,\n selectedCount,\n onRotatePointerDown,\n onResizePointerDown,\n}: SelectionOverlayProps) {\n return (\n <>\n {selectionBrush && (\n <div\n className=\"tsdraw-selection-brush\"\n style={{\n left: selectionBrush.left,\n top: selectionBrush.top,\n width: selectionBrush.width,\n height: selectionBrush.height,\n }}\n />\n )}\n {selectionBounds && (\n <div\n className=\"tsdraw-selection-frame\"\n style={{\n left: selectionBounds.left,\n top: selectionBounds.top,\n width: selectionBounds.width,\n height: selectionBounds.height,\n transform: `rotate(${selectionRotationDeg}deg)`,\n }}\n >\n <div className=\"tsdraw-selection-bounds\" />\n {currentTool === 'select' && selectedCount > 0 && (\n <>\n <div className=\"tsdraw-rotation-stem\" />\n <button\n type=\"button\"\n className=\"tsdraw-rotation-handle\"\n aria-label=\"Rotate selection\"\n onPointerDown={onRotatePointerDown}\n />\n <button\n type=\"button\"\n className=\"tsdraw-selection-handle tsdraw-selection-handle--nw\"\n style={{ left: '0%', top: '0%' }}\n aria-label=\"Resize top left\"\n onPointerDown={(e) => onResizePointerDown(e, 'nw')}\n />\n <button\n type=\"button\"\n className=\"tsdraw-selection-handle tsdraw-selection-handle--ne\"\n style={{ left: '100%', top: '0%' }}\n aria-label=\"Resize top right\"\n onPointerDown={(e) => onResizePointerDown(e, 'ne')}\n />\n <button\n type=\"button\"\n className=\"tsdraw-selection-handle tsdraw-selection-handle--sw\"\n style={{ left: '0%', top: '100%' }}\n aria-label=\"Resize bottom left\"\n onPointerDown={(e) => onResizePointerDown(e, 'sw')}\n />\n <button\n type=\"button\"\n className=\"tsdraw-selection-handle tsdraw-selection-handle--se\"\n style={{ left: '100%', top: '100%' }}\n aria-label=\"Resize bottom right\"\n onPointerDown={(e) => onResizePointerDown(e, 'se')}\n />\n </>\n )}\n </div>\n )}\n </>\n );\n}","import { DEFAULT_COLORS, resolveThemeColor } from '@tsdraw/core';\nimport type { ColorStyle, DashStyle, SizeStyle } from '@tsdraw/core';\nimport type { CSSProperties } from 'react';\n\nconst STYLE_COLORS = Object.entries(DEFAULT_COLORS)\n .filter(([key]) => key !== 'white')\n .map(([value]) => ({ value }));\n\nconst STYLE_DASHES: DashStyle[] = ['draw', 'solid', 'dashed', 'dotted'];\nconst STYLE_SIZES: SizeStyle[] = ['s', 'm', 'l', 'xl'];\n\ninterface StylePanelProps {\n visible: boolean;\n style?: CSSProperties;\n theme: 'light' | 'dark';\n drawColor: ColorStyle;\n drawDash: DashStyle;\n drawSize: SizeStyle;\n onColorSelect: (color: ColorStyle) => void;\n onDashSelect: (dash: DashStyle) => void;\n onSizeSelect: (size: SizeStyle) => void;\n}\n\nexport function StylePanel({\n visible,\n style,\n theme,\n drawColor,\n drawDash,\n drawSize,\n onColorSelect,\n onDashSelect,\n onSizeSelect,\n}: StylePanelProps) {\n if (!visible) return null;\n\n return (\n <div className=\"tsdraw-style-panel\" style={style} aria-label=\"Draw style panel\">\n <div className=\"tsdraw-style-colors\">\n {STYLE_COLORS.map((item) => (\n <button\n key={item.value}\n type=\"button\"\n className=\"tsdraw-style-color\"\n data-active={drawColor === item.value ? 'true' : undefined}\n aria-label={`Color ${item.value}`}\n title={item.value}\n onClick={() => onColorSelect(item.value)}\n >\n <span\n className=\"tsdraw-style-color-dot\"\n style={{ background: resolveThemeColor(item.value, theme) }}\n />\n </button>\n ))}\n </div>\n <div className=\"tsdraw-style-section\">\n {STYLE_DASHES.map((dash) => (\n <button\n key={dash}\n type=\"button\"\n className=\"tsdraw-style-row\"\n data-active={drawDash === dash ? 'true' : undefined}\n aria-label={`Stroke ${dash}`}\n title={dash}\n onClick={() => onDashSelect(dash)}\n >\n <span className=\"tsdraw-style-preview\">\n <span className={`tsdraw-style-preview-line tsdraw-style-preview-line--${dash}`} />\n </span>\n </button>\n ))}\n </div>\n <div className=\"tsdraw-style-section\">\n {STYLE_SIZES.map((size) => (\n <button\n key={size}\n type=\"button\"\n className=\"tsdraw-style-row\"\n data-active={drawSize === size ? 'true' : undefined}\n aria-label={`Thickness ${size}`}\n title={size}\n onClick={() => onSizeSelect(size)}\n >\n <span className=\"tsdraw-style-preview\">\n <span className={`tsdraw-style-size tsdraw-style-size--${size}`} />\n </span>\n </button>\n ))}\n </div>\n </div>\n );\n}","interface ToolOverlayProps {\n visible: boolean;\n pointerX: number;\n pointerY: number;\n isPenPreview: boolean;\n penRadius: number;\n penColor: string;\n eraserRadius: number;\n}\n\nexport function ToolOverlay({\n visible,\n pointerX,\n pointerY,\n isPenPreview,\n penRadius,\n penColor,\n eraserRadius,\n}: ToolOverlayProps) {\n if (!visible) return null;\n\n return (\n <div className=\"tsdraw-tool-overlay\" aria-hidden=\"true\">\n {isPenPreview ? (\n <span\n className=\"tsdraw-tool-dot\"\n style={{\n left: pointerX,\n top: pointerY,\n width: penRadius * 2,\n height: penRadius * 2,\n backgroundColor: penColor,\n }}\n />\n ) : (\n <span\n className=\"tsdraw-tool-ring\"\n style={{\n left: pointerX,\n top: pointerY,\n width: eraserRadius * 2,\n height: eraserRadius * 2,\n }}\n />\n )}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport type { ToolId } from '@tsdraw/core';\nimport { IconArrowBackUp, IconArrowForwardUp, IconEraser, IconHandStop, IconPencil, IconPointer } from '@tabler/icons-react';\n\nexport interface ToolbarToolItem {\n type: 'tool';\n id: ToolId;\n label: string;\n icon: ReactNode | ((isActive: boolean) => ReactNode);\n}\n\nexport interface ToolbarActionItem {\n type: 'action';\n id: 'undo' | 'redo';\n label: string;\n disabled: boolean;\n onSelect: () => void;\n}\n\nexport type ToolbarRenderItem = ToolbarToolItem | ToolbarActionItem;\n\nexport interface ToolbarPart {\n id: string;\n items: ToolbarRenderItem[];\n}\n\ninterface ToolbarProps {\n parts: ToolbarPart[];\n currentTool: ToolId | null;\n onToolChange: (tool: ToolId) => void;\n disabled?: boolean;\n style?: CSSProperties;\n}\n\nexport function getDefaultToolbarIcon(toolId: ToolId, isActive: boolean): ReactNode {\n if (toolId === 'select') return <IconPointer size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'pen') return <IconPencil size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'eraser') return <IconEraser size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'hand') return <IconHandStop size={16} stroke={isActive ? 1 : 1.8} fill={isActive ? 'currentColor' : 'none'} style={isActive ? { stroke: '#000000' } : undefined} />;\n return null;\n}\n\nfunction getActionIcon(actionId: 'undo' | 'redo'): ReactNode {\n if (actionId === 'undo') return <IconArrowBackUp size={16} stroke={1.8} />;\n return <IconArrowForwardUp size={16} stroke={1.8} />;\n}\n\nexport function Toolbar({ parts, currentTool, onToolChange, disabled, style }: ToolbarProps) {\n return (\n <div className=\"tsdraw-toolbar\" style={style}>\n {parts.map((part, partIndex) => (\n <div key={part.id} className=\"tsdraw-toolbar-part\">\n {part.items.map((item) => {\n if (item.type === 'action') {\n return (\n <button\n key={item.id}\n type=\"button\"\n className=\"tsdraw-toolbar-btn\"\n onClick={item.onSelect}\n title={item.label}\n aria-label={item.label}\n disabled={disabled || item.disabled}\n >\n {getActionIcon(item.id)}\n </button>\n );\n }\n\n const isActive = currentTool === item.id;\n return (\n <button\n key={item.id}\n type=\"button\"\n className=\"tsdraw-toolbar-btn\"\n data-active={isActive ? 'true' : undefined}\n onClick={() => onToolChange(item.id)}\n title={item.label}\n aria-label={item.label}\n disabled={disabled}\n >\n {typeof item.icon === 'function' ? item.icon(isActive) : item.icon}\n </button>\n );\n })}\n {partIndex < parts.length - 1 ? <div className=\"tsdraw-toolbar-separator\" /> : null}\n </div>\n ))}\n </div>\n );\n}\n","import type { ToolId } from '@tsdraw/core';\nimport { isSelectTool } from '@tsdraw/core';\n\nexport function getCanvasCursor(\n currentTool: ToolId,\n state: {\n isMovingSelection: boolean;\n isResizingSelection: boolean;\n isRotatingSelection: boolean;\n showToolOverlay: boolean;\n }\n) {\n if (currentTool === 'hand') return 'grab';\n\n if (isSelectTool(currentTool)) {\n if (state.isRotatingSelection) return 'grabbing';\n if (state.isResizingSelection) return 'nwse-resize';\n if (state.isMovingSelection) return 'grabbing';\n return 'default';\n }\n\n return state.showToolOverlay ? 'none' : 'crosshair'; // Let tool overlay handle the cursor\n}","import type { TsdrawHistorySnapshot, TsdrawPersistedRecord, TsdrawSessionStateSnapshot } from '@tsdraw/core';\n\nconst DATABASE_PREFIX = 'tsdraw_v1_';\nconst DATABASE_VERSION = 2;\n\nconst STORE = {\n records: 'records',\n state: 'state',\n history: 'history',\n} as const;\n\ninterface StateRow {\n id: string;\n snapshot: TsdrawSessionStateSnapshot;\n updatedAt: number;\n}\n\ninterface HistoryRow {\n id: string;\n snapshot: TsdrawHistorySnapshot;\n updatedAt: number;\n}\n\nexport interface LocalLoadResult {\n records: TsdrawPersistedRecord[];\n state: TsdrawSessionStateSnapshot | null;\n history: TsdrawHistorySnapshot | null;\n}\n\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB request failed'));\n });\n}\n\nfunction transactionDone(transaction: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error ?? new Error('IndexedDB transaction failed'));\n transaction.onabort = () => reject(transaction.error ?? new Error('IndexedDB transaction aborted'));\n });\n}\n\nfunction openLocalDatabase(persistenceKey: string): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(`${DATABASE_PREFIX}${persistenceKey}`, DATABASE_VERSION);\n\n request.onupgradeneeded = () => {\n const database = request.result;\n if (!database.objectStoreNames.contains(STORE.records)) { database.createObjectStore(STORE.records); }\n if (!database.objectStoreNames.contains(STORE.state)) { database.createObjectStore(STORE.state); }\n if (!database.objectStoreNames.contains(STORE.history)) { database.createObjectStore(STORE.history); }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('Failed to open IndexedDB'));\n });\n}\n\nexport class TsdrawLocalIndexedDb {\n private readonly databasePromise: Promise<IDBDatabase>;\n\n constructor(persistenceKey: string) {\n this.databasePromise = openLocalDatabase(persistenceKey);\n }\n\n async close(): Promise<void> {\n const database = await this.databasePromise;\n database.close();\n }\n\n async load(sessionId: string): Promise<LocalLoadResult> {\n const database = await this.databasePromise;\n const transaction = database.transaction([STORE.records, STORE.state, STORE.history], 'readonly');\n const recordStore = transaction.objectStore(STORE.records);\n const stateStore = transaction.objectStore(STORE.state);\n const historyStore = transaction.objectStore(STORE.history);\n\n const records = (await requestToPromise(recordStore.getAll())) as TsdrawPersistedRecord[];\n let state = (await requestToPromise(stateStore.get(sessionId)) as StateRow | undefined)?.snapshot ?? null;\n let history = (await requestToPromise(historyStore.get(sessionId)) as HistoryRow | undefined)?.snapshot ?? null;\n\n if (!state) {\n const allStates = (await requestToPromise(stateStore.getAll())) as StateRow[];\n if (allStates.length > 0) {\n allStates.sort((left, right) => left.updatedAt - right.updatedAt);\n state = allStates[allStates.length - 1]?.snapshot ?? null;\n }\n }\n\n if (!history) {\n const allHistoryRows = (await requestToPromise(historyStore.getAll())) as HistoryRow[];\n if (allHistoryRows.length > 0) {\n allHistoryRows.sort((left, right) => left.updatedAt - right.updatedAt);\n history = allHistoryRows[allHistoryRows.length - 1]?.snapshot ?? null;\n }\n }\n\n await transactionDone(transaction);\n return { records, state, history };\n }\n\n async storeSnapshot(args: {\n records: TsdrawPersistedRecord[];\n sessionId: string;\n state: TsdrawSessionStateSnapshot;\n history: TsdrawHistorySnapshot;\n }): Promise<void> {\n const database = await this.databasePromise;\n const transaction = database.transaction([STORE.records, STORE.state, STORE.history], 'readwrite');\n const recordStore = transaction.objectStore(STORE.records);\n const stateStore = transaction.objectStore(STORE.state);\n const historyStore = transaction.objectStore(STORE.history);\n\n recordStore.clear();\n for (const record of args.records) {\n recordStore.put(record, record.id);\n }\n\n const stateRow: StateRow = {\n id: args.sessionId,\n snapshot: args.state,\n updatedAt: Date.now(),\n };\n stateStore.put(stateRow, args.sessionId);\n\n const historyRow: HistoryRow = {\n id: args.sessionId,\n snapshot: args.history,\n updatedAt: Date.now(),\n };\n historyStore.put(historyRow, args.sessionId);\n\n await transactionDone(transaction);\n }\n}\n\nexport function getPersistenceDatabaseName(persistenceKey: string): string {\n return `${DATABASE_PREFIX}${persistenceKey}`;\n}","const SESSION_STORAGE_KEY = 'TSDRAW_TAB_SESSION_ID_v1';\n\nfunction createSessionId(): string {\n const timestamp = Date.now().toString(36);\n const randomPart = Math.random().toString(36).slice(2, 10);\n return `tsdraw-session-${timestamp}-${randomPart}`;\n}\n\nexport function getOrCreateSessionId(): string {\n if (typeof window === 'undefined') return createSessionId();\n\n const existing = window.sessionStorage.getItem(SESSION_STORAGE_KEY);\n if (existing) return existing;\n\n const newId = createSessionId();\n window.sessionStorage.setItem(SESSION_STORAGE_KEY, newId);\n return newId;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { PointerEvent as ReactPointerEvent } from 'react';\nimport type { RefObject } from 'react';\nimport {\n Editor,\n ERASER_MARGIN,\n STROKE_WIDTHS,\n normalizeSelectionBounds,\n applyMove,\n applyResize,\n applyRotation,\n buildStartPositions,\n buildTransformSnapshots,\n getSelectionBoundsPage,\n getShapesInBounds,\n getTopShapeAtPoint,\n resolveThemeColor,\n type ResizeHandle,\n type ToolDefinition,\n type ToolId,\n} from '@tsdraw/core';\nimport type { ColorStyle, DashStyle, ShapeId, SizeStyle, SelectionBounds, TsdrawDocumentSnapshot, TsdrawEditorSnapshot } from '@tsdraw/core';\nimport { getCanvasCursor } from './cursor.js';\nimport type { ScreenRect } from '../types.js';\nimport { TsdrawLocalIndexedDb } from '../persistence/localIndexedDb.js';\nimport { getOrCreateSessionId } from '../persistence/sessionId.js';\n\ntype SelectDragMode = 'none' | 'marquee' | 'move' | 'resize' | 'rotate';\n\nexport interface TsdrawCursorContext {\n currentTool: ToolId;\n defaultCursor: string;\n showToolOverlay: boolean;\n isMovingSelection: boolean;\n isResizingSelection: boolean;\n isRotatingSelection: boolean;\n}\n\nexport interface TsdrawToolOverlayState {\n visible: boolean;\n pointerX: number;\n pointerY: number;\n isPenPreview: boolean;\n penRadius: number;\n penColor: string;\n eraserRadius: number;\n}\n\nexport interface TsdrawMountApi {\n editor: Editor;\n container: HTMLDivElement;\n canvas: HTMLCanvasElement;\n setTool: (tool: ToolId) => void;\n getCurrentTool: () => ToolId;\n undo: () => boolean;\n redo: () => boolean;\n canUndo: () => boolean;\n canRedo: () => boolean;\n applyDrawStyle: (partial: Partial<{ color: ColorStyle; dash: DashStyle; size: SizeStyle }>) => void;\n}\n\nexport interface UseTsdrawCanvasControllerOptions {\n toolDefinitions?: ToolDefinition[];\n initialTool?: ToolId;\n theme?: 'light' | 'dark';\n stylePanelToolIds?: ToolId[];\n persistenceKey?: string;\n onMount?: (api: TsdrawMountApi) => void | (() => void);\n}\n\nexport interface TsdrawCanvasController {\n containerRef: RefObject<HTMLDivElement>;\n canvasRef: RefObject<HTMLCanvasElement>;\n currentTool: ToolId;\n drawColor: ColorStyle;\n drawDash: DashStyle;\n drawSize: SizeStyle;\n selectedShapeIds: ShapeId[];\n selectionBrush: ScreenRect | null;\n selectionBounds: ScreenRect | null;\n selectionRotationDeg: number;\n canvasCursor: string;\n cursorContext: TsdrawCursorContext;\n toolOverlay: TsdrawToolOverlayState;\n isPersistenceReady: boolean;\n showStylePanel: boolean;\n canUndo: boolean;\n canRedo: boolean;\n undo: () => boolean;\n redo: () => boolean;\n setTool: (tool: ToolId) => void;\n applyDrawStyle: (partial: Partial<{ color: ColorStyle; dash: DashStyle; size: SizeStyle }>) => void;\n handleResizePointerDown: (e: ReactPointerEvent<HTMLButtonElement>, handle: ResizeHandle) => void;\n handleRotatePointerDown: (e: ReactPointerEvent<HTMLButtonElement>) => void;\n}\n\nfunction toScreenRect(editor: Editor, bounds: SelectionBounds): ScreenRect {\n const { x, y, zoom } = editor.viewport;\n return {\n left: bounds.minX * zoom + x,\n top: bounds.minY * zoom + y,\n width: (bounds.maxX - bounds.minX) * zoom,\n height: (bounds.maxY - bounds.minY) * zoom,\n };\n}\n\nfunction resolveDrawColor(colorStyle: ColorStyle, theme: 'light' | 'dark'): string {\n return resolveThemeColor(colorStyle, theme);\n}\n\nexport function useTsdrawCanvasController(options: UseTsdrawCanvasControllerOptions = {}): TsdrawCanvasController {\n const stylePanelToolIds = options.stylePanelToolIds ?? ['pen'];\n const stylePanelToolIdsRef = useRef<ToolId[]>(stylePanelToolIds);\n const containerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const editorRef = useRef<Editor | null>(null);\n const dprRef = useRef(1);\n const lastPointerClientRef = useRef<{ x: number; y: number } | null>(null);\n const currentToolRef = useRef<ToolId>(options.initialTool ?? 'pen');\n const selectedShapeIdsRef = useRef<ShapeId[]>([]);\n const schedulePersistRef = useRef<(() => void) | null>(null);\n const isPointerActiveRef = useRef(false);\n const pendingRemoteDocumentRef = useRef<TsdrawDocumentSnapshot | null>(null);\n const selectionRotationRef = useRef(0);\n const resizeRef = useRef<{\n handle: ResizeHandle | null;\n startBounds: ReturnType<typeof getSelectionBoundsPage>;\n startShapes: ReturnType<typeof buildTransformSnapshots>;\n }>({\n handle: null,\n startBounds: null,\n startShapes: new Map(),\n });\n const rotateRef = useRef<{\n center: { x: number; y: number } | null;\n startAngle: number;\n startSelectionRotationDeg: number;\n startShapes: ReturnType<typeof buildTransformSnapshots>;\n }>({\n center: null,\n startAngle: 0,\n startSelectionRotationDeg: 0,\n startShapes: new Map(),\n });\n const selectDragRef = useRef<{\n mode: SelectDragMode;\n startPage: { x: number; y: number };\n currentPage: { x: number; y: number };\n startPositions: ReturnType<typeof buildStartPositions>;\n additive: boolean;\n initialSelection: ShapeId[];\n }>({\n mode: 'none',\n startPage: { x: 0, y: 0 },\n currentPage: { x: 0, y: 0 },\n startPositions: new Map(),\n additive: false,\n initialSelection: [],\n });\n\n const [currentTool, setCurrentToolState] = useState<ToolId>(options.initialTool ?? 'pen');\n const [drawColor, setDrawColor] = useState<ColorStyle>('black');\n const [drawDash, setDrawDash] = useState<DashStyle>('draw');\n const [drawSize, setDrawSize] = useState<SizeStyle>('m');\n const [selectedShapeIds, setSelectedShapeIds] = useState<ShapeId[]>([]);\n const [selectionBrush, setSelectionBrush] = useState<ScreenRect | null>(null);\n const [selectionBounds, setSelectionBounds] = useState<ScreenRect | null>(null);\n const [selectionRotationDeg, setSelectionRotationDeg] = useState(0);\n const [isMovingSelection, setIsMovingSelection] = useState(false);\n const [isResizingSelection, setIsResizingSelection] = useState(false);\n const [isRotatingSelection, setIsRotatingSelection] = useState(false);\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n const [isPersistenceReady, setIsPersistenceReady] = useState(!options.persistenceKey);\n const [pointerScreenPoint, setPointerScreenPoint] = useState({ x: 0, y: 0 });\n const [isPointerInsideCanvas, setIsPointerInsideCanvas] = useState(false);\n\n useEffect(() => {\n currentToolRef.current = currentTool;\n }, [currentTool]);\n\n useEffect(() => {\n stylePanelToolIdsRef.current = stylePanelToolIds;\n }, [stylePanelToolIds]);\n\n useEffect(() => {\n selectedShapeIdsRef.current = selectedShapeIds;\n }, [selectedShapeIds]);\n\n useEffect(() => {\n selectionRotationRef.current = selectionRotationDeg;\n }, [selectionRotationDeg]);\n\n useEffect(() => {\n schedulePersistRef.current?.();\n }, [selectedShapeIds, currentTool, drawColor, drawDash, drawSize]);\n\n const render = useCallback(() => {\n const canvas = canvasRef.current;\n const editor = editorRef.current;\n if (!canvas || !editor) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n const dpr = dprRef.current || 1;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, canvas.width / dpr, canvas.height / dpr);\n editor.render(ctx);\n }, []);\n\n // Keep overlays screen-space bounds in sync with the current page-space selection\n const refreshSelectionBounds = useCallback((editor: Editor, ids = selectedShapeIdsRef.current) => {\n const pageBounds = getSelectionBoundsPage(editor, ids);\n setSelectionBounds(pageBounds ? toScreenRect(editor, pageBounds) : null);\n }, []);\n\n const getPagePointFromClient = useCallback((editor: Editor, clientX: number, clientY: number) => {\n const canvas = canvasRef.current;\n if (!canvas) return { x: 0, y: 0 };\n const rect = canvas.getBoundingClientRect();\n return editor.screenToPage(clientX - rect.left, clientY - rect.top);\n }, []);\n\n const updatePointerPreview = useCallback((clientX: number, clientY: number) => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n const isInside =\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom;\n\n setIsPointerInsideCanvas(isInside);\n setPointerScreenPoint({\n x: clientX - rect.left,\n y: clientY - rect.top,\n });\n }, []);\n\n const resetSelectUi = useCallback(() => {\n setSelectionBrush(null);\n setSelectionRotationDeg(0);\n setIsMovingSelection(false);\n setIsResizingSelection(false);\n setIsRotatingSelection(false);\n selectDragRef.current.mode = 'none';\n resizeRef.current = { handle: null, startBounds: null, startShapes: new Map() };\n rotateRef.current = {\n center: null,\n startAngle: 0,\n startSelectionRotationDeg: selectionRotationRef.current,\n startShapes: new Map(),\n };\n }, []);\n\n const handleResizePointerDown = useCallback(\n (e: ReactPointerEvent<HTMLButtonElement>, handle: ResizeHandle) => {\n e.preventDefault();\n e.stopPropagation();\n const editor = editorRef.current;\n if (!editor || selectedShapeIdsRef.current.length === 0) return;\n const bounds = getSelectionBoundsPage(editor, selectedShapeIdsRef.current);\n if (!bounds) return;\n\n resizeRef.current = {\n handle,\n startBounds: bounds,\n startShapes: buildTransformSnapshots(editor, selectedShapeIdsRef.current),\n };\n editor.beginHistoryEntry();\n selectDragRef.current.mode = 'resize';\n const p = getPagePointFromClient(editor, e.clientX, e.clientY);\n editor.input.pointerDown(p.x, p.y, 0.5, false);\n selectDragRef.current.startPage = p;\n selectDragRef.current.currentPage = p;\n lastPointerClientRef.current = { x: e.clientX, y: e.clientY };\n setIsResizingSelection(true);\n },\n [getPagePointFromClient]\n );\n\n const handleRotatePointerDown = useCallback(\n (e: ReactPointerEvent<HTMLButtonElement>) => {\n e.preventDefault();\n e.stopPropagation();\n const editor = editorRef.current;\n if (!editor || selectedShapeIdsRef.current.length === 0) return;\n const bounds = getSelectionBoundsPage(editor, selectedShapeIdsRef.current);\n if (!bounds) return;\n\n const center = {\n x: (bounds.minX + bounds.maxX) / 2,\n y: (bounds.minY + bounds.maxY) / 2,\n };\n const p = getPagePointFromClient(editor, e.clientX, e.clientY);\n rotateRef.current = {\n center,\n startAngle: Math.atan2(p.y - center.y, p.x - center.x),\n startSelectionRotationDeg: selectionRotationRef.current,\n startShapes: buildTransformSnapshots(editor, selectedShapeIdsRef.current),\n };\n editor.beginHistoryEntry();\n selectDragRef.current.mode = 'rotate';\n editor.input.pointerDown(p.x, p.y, 0.5, false);\n selectDragRef.current.startPage = p;\n selectDragRef.current.currentPage = p;\n lastPointerClientRef.current = { x: e.clientX, y: e.clientY };\n setIsRotatingSelection(true);\n },\n [getPagePointFromClient]\n );\n\n useEffect(() => {\n const container = containerRef.current;\n const canvas = canvasRef.current;\n if (!container || !canvas) return;\n\n const initialTool = options.initialTool ?? 'pen';\n const editor = new Editor({\n toolDefinitions: options.toolDefinitions,\n initialToolId: initialTool,\n });\n editor.renderer.setTheme(options.theme ?? 'light');\n if (!editor.tools.hasTool(initialTool)) {\n editor.setCurrentTool('pen');\n }\n\n let disposed = false;\n let ignorePersistenceChanges = false;\n let disposeMount: void | (() => void);\n let persistenceDb: TsdrawLocalIndexedDb | null = null;\n let persistenceChannel: BroadcastChannel | null = null;\n let isPersisting = false;\n let needsAnotherPersist = false;\n let persistenceActive = false;\n const persistenceKey = options.persistenceKey;\n const sessionId = getOrCreateSessionId();\n const syncHistoryState = () => {\n setCanUndo(editor.canUndo());\n setCanRedo(editor.canRedo());\n };\n\n const activeTool = editor.getCurrentToolId();\n editorRef.current = editor;\n setCurrentToolState(activeTool);\n currentToolRef.current = activeTool;\n syncHistoryState();\n\n const initialStyle = editor.getCurrentDrawStyle();\n setDrawColor(initialStyle.color);\n setDrawDash(initialStyle.dash);\n setDrawSize(initialStyle.size);\n\n const resize = () => {\n const dpr = window.devicePixelRatio ?? 1;\n dprRef.current = dpr;\n const rect = container.getBoundingClientRect();\n canvas.width = Math.round(rect.width * dpr);\n canvas.height = Math.round(rect.height * dpr);\n canvas.style.width = `${rect.width}px`;\n canvas.style.height = `${rect.height}px`;\n if (!persistenceActive) {\n editor.setViewport({ x: 0, y: 0, zoom: 1 });\n }\n render();\n refreshSelectionBounds(editor);\n };\n\n const persistSnapshot = async () => {\n if (!persistenceDb || !persistenceKey || ignorePersistenceChanges || disposed) return;\n const snapshot = editor.getPersistenceSnapshot({\n selectedShapeIds: selectedShapeIdsRef.current,\n });\n await persistenceDb.storeSnapshot({\n records: snapshot.document.records,\n state: snapshot.state,\n history: editor.getHistorySnapshot(),\n sessionId,\n });\n if (disposed) return;\n persistenceChannel?.postMessage({\n type: 'tsdraw:persisted',\n senderSessionId: sessionId,\n });\n };\n\n const schedulePersist = () => {\n if (!persistenceDb || !persistenceKey || disposed) return;\n const runPersist = async () => {\n if (isPersisting) {\n needsAnotherPersist = true;\n return;\n }\n\n isPersisting = true;\n try {\n do {\n needsAnotherPersist = false;\n await persistSnapshot();\n } while (needsAnotherPersist && !disposed);\n } catch (error) {\n console.error('tsdraw persistence failed', error);\n } finally {\n isPersisting = false;\n }\n };\n\n void runPersist();\n };\n\n schedulePersistRef.current = schedulePersist;\n\n const reconcileSelectionAfterDocumentLoad = () => {\n const nextSelectedShapeIds = selectedShapeIdsRef.current.filter((shapeId) => editor.getShape(shapeId) != null);\n if (nextSelectedShapeIds.length !== selectedShapeIdsRef.current.length) {\n selectedShapeIdsRef.current = nextSelectedShapeIds;\n setSelectedShapeIds(nextSelectedShapeIds);\n }\n refreshSelectionBounds(editor, nextSelectedShapeIds);\n };\n\n const applyRemoteDocumentSnapshot = (document: TsdrawDocumentSnapshot) => {\n ignorePersistenceChanges = true;\n editor.loadDocumentSnapshot(document);\n editor.clearRedoHistory();\n reconcileSelectionAfterDocumentLoad();\n render();\n ignorePersistenceChanges = false;\n };\n\n const applyLoadedSnapshot = (snapshot: Partial<TsdrawEditorSnapshot>) => {\n ignorePersistenceChanges = true;\n const nextSelectionIds = editor.loadPersistenceSnapshot(snapshot);\n setSelectedShapeIds(nextSelectionIds);\n selectedShapeIdsRef.current = nextSelectionIds;\n const nextTool = editor.getCurrentToolId();\n currentToolRef.current = nextTool;\n setCurrentToolState(nextTool);\n const nextDrawStyle = editor.getCurrentDrawStyle();\n setDrawColor(nextDrawStyle.color);\n setDrawDash(nextDrawStyle.dash);\n setDrawSize(nextDrawStyle.size);\n setSelectionRotationDeg(0);\n render();\n refreshSelectionBounds(editor, nextSelectionIds);\n ignorePersistenceChanges = false;\n };\n\n const getPagePoint = (e: PointerEvent) => {\n const rect = canvas.getBoundingClientRect();\n return editor.screenToPage(e.clientX - rect.left, e.clientY - rect.top);\n };\n\n const sampleEvents = (e: PointerEvent) => {\n const coalesced = e.getCoalescedEvents?.();\n return coalesced && coalesced.length > 0 ? coalesced : [e];\n };\n\n const handlePointerDown = (e: PointerEvent) => {\n if (!canvas.contains(e.target as Node)) return;\n isPointerActiveRef.current = true;\n editor.beginHistoryEntry();\n canvas.setPointerCapture(e.pointerId);\n lastPointerClientRef.current = { x: e.clientX, y: e.clientY };\n updatePointerPreview(e.clientX, e.clientY);\n\n const first = sampleEvents(e)[0]!;\n const { x, y } = getPagePoint(first);\n const pressure = first.pressure ?? 0.5;\n const isPen = first.pointerType === 'pen' || first.pointerType === 'touch';\n\n if (currentToolRef.current === 'select') {\n const hit = getTopShapeAtPoint(editor, { x, y });\n const isHitSelected = !!(hit && selectedShapeIdsRef.current.includes(hit.id));\n\n if (isHitSelected) {\n selectDragRef.current = {\n mode: 'move',\n startPage: { x, y },\n currentPage: { x, y },\n startPositions: buildStartPositions(editor, selectedShapeIdsRef.current),\n additive: false,\n initialSelection: [...selectedShapeIdsRef.current],\n };\n setIsMovingSelection(true);\n return;\n }\n\n selectDragRef.current = {\n mode: 'marquee',\n startPage: { x, y },\n currentPage: { x, y },\n startPositions: new Map(),\n additive: first.shiftKey,\n initialSelection: [...selectedShapeIdsRef.current],\n };\n setSelectionBrush({ left: e.offsetX, top: e.offsetY, width: 0, height: 0 });\n if (!e.shiftKey) {\n setSelectedShapeIds([]);\n selectedShapeIdsRef.current = [];\n setSelectionBounds(null);\n setSelectionRotationDeg(0);\n }\n return;\n }\n\n editor.input.pointerDown(x, y, pressure, isPen);\n editor.input.setModifiers(first.shiftKey, first.ctrlKey, first.metaKey);\n editor.tools.pointerDown({ point: { x, y, z: pressure } });\n render();\n refreshSelectionBounds(editor);\n };\n\n const handlePointerMove = (e: PointerEvent) => {\n updatePointerPreview(e.clientX, e.clientY);\n const prevClient = lastPointerClientRef.current;\n const dx = prevClient ? e.clientX - prevClient.x : 0;\n const dy = prevClient ? e.clientY - prevClient.y : 0;\n lastPointerClientRef.current = { x: e.clientX, y: e.clientY };\n\n for (const sample of sampleEvents(e)) {\n const { x, y } = getPagePoint(sample);\n const pressure = sample.pressure ?? 0.5;\n const isPen = sample.pointerType === 'pen' || sample.pointerType === 'touch';\n editor.input.pointerMove(x, y, pressure, isPen);\n }\n\n if (currentToolRef.current === 'select') {\n const mode = selectDragRef.current.mode;\n const { x: px, y: py } = editor.input.getCurrentPagePoint();\n\n if (mode === 'rotate') {\n const { center, startAngle, startSelectionRotationDeg, startShapes } = rotateRef.current;\n if (!center) return;\n const angle = Math.atan2(py - center.y, px - center.x);\n const delta = angle - startAngle;\n setSelectionRotationDeg(startSelectionRotationDeg + (delta * 180) / Math.PI);\n applyRotation(editor, startShapes, center, delta);\n render();\n return;\n }\n\n // Resize and move both work using captured snapshots so the transform stays stable throughout the drag instead of adding up shape updates on each pointer move\n if (mode === 'resize') {\n const { handle, startBounds, startShapes } = resizeRef.current;\n if (!handle || !startBounds) return;\n applyResize(editor, handle, startBounds, startShapes, { x: px, y: py }, e.shiftKey);\n render();\n refreshSelectionBounds(editor);\n return;\n }\n\n if (mode === 'move') {\n const drag = selectDragRef.current;\n applyMove(editor, drag.startPositions, px - drag.startPage.x, py - drag.startPage.y);\n render();\n refreshSelectionBounds(editor);\n return;\n }\n\n // Marquee selection updates live as brush changes so that the overlay matches feedback\n if (mode === 'marquee') {\n selectDragRef.current.currentPage = { x: px, y: py };\n const pageRect = normalizeSelectionBounds(selectDragRef.current.startPage, selectDragRef.current.currentPage);\n setSelectionBrush(toScreenRect(editor, pageRect));\n const ids = getShapesInBounds(editor, pageRect);\n const nextIds = selectDragRef.current.additive ? Array.from(new Set([...selectDragRef.current.initialSelection, ...ids])) : ids;\n setSelectedShapeIds(nextIds);\n selectedShapeIdsRef.current = nextIds;\n setSelectionRotationDeg(0);\n refreshSelectionBounds(editor, nextIds);\n return;\n }\n }\n\n editor.input.setModifiers(e.shiftKey, e.ctrlKey, e.metaKey);\n editor.tools.pointerMove({ screenDeltaX: dx, screenDeltaY: dy });\n render();\n refreshSelectionBounds(editor);\n };\n\n const handlePointerUp = (e: PointerEvent) => {\n isPointerActiveRef.current = false;\n lastPointerClientRef.current = null;\n updatePointerPreview(e.clientX, e.clientY);\n const { x, y } = getPagePoint(e);\n editor.input.pointerMove(x, y);\n editor.input.pointerUp();\n\n if (currentToolRef.current === 'select') {\n const drag = selectDragRef.current;\n\n // Rotation resets overlay back to normal selection box after release while rotated geometry stays\n if (drag.mode === 'rotate') {\n setIsRotatingSelection(false);\n selectDragRef.current.mode = 'none';\n setSelectionRotationDeg(0);\n rotateRef.current = {\n center: null,\n startAngle: 0,\n startSelectionRotationDeg: selectionRotationRef.current,\n startShapes: new Map(),\n };\n render();\n refreshSelectionBounds(editor);\n editor.endHistoryEntry();\n return;\n }\n\n if (drag.mode === 'resize') {\n setIsResizingSelection(false);\n selectDragRef.current.mode = 'none';\n resizeRef.current = { handle: null, startBounds: null, startShapes: new Map() };\n render();\n refreshSelectionBounds(editor);\n editor.endHistoryEntry();\n return;\n }\n\n if (drag.mode === 'move') {\n setIsMovingSelection(false);\n selectDragRef.current.mode = 'none';\n render();\n refreshSelectionBounds(editor);\n editor.endHistoryEntry();\n return;\n }\n\n if (drag.mode === 'marquee') {\n const rect = normalizeSelectionBounds(drag.startPage, { x, y });\n const moved = Math.abs(x - drag.startPage.x) > 2 || Math.abs(y - drag.startPage.y) > 2;\n let ids: ShapeId[] = [];\n\n if (!moved) {\n const hit = getTopShapeAtPoint(editor, { x, y });\n if (hit) {\n ids = drag.additive ? Array.from(new Set([...drag.initialSelection, hit.id])) : [hit.id];\n } else {\n ids = drag.additive ? drag.initialSelection : [];\n }\n } else {\n ids = getShapesInBounds(editor, rect);\n if (drag.additive) {\n ids = Array.from(new Set([...drag.initialSelection, ...ids]));\n }\n }\n\n setSelectedShapeIds(ids);\n selectedShapeIdsRef.current = ids;\n setSelectionRotationDeg(0);\n setSelectionBrush(null);\n selectDragRef.current.mode = 'none';\n render();\n refreshSelectionBounds(editor, ids);\n if (pendingRemoteDocumentRef.current) {\n const pendingRemoteDocument = pendingRemoteDocumentRef.current;\n pendingRemoteDocumentRef.current = null;\n applyRemoteDocumentSnapshot(pendingRemoteDocument);\n }\n editor.endHistoryEntry();\n return;\n }\n }\n\n editor.tools.pointerUp();\n render();\n refreshSelectionBounds(editor);\n if (pendingRemoteDocumentRef.current) {\n const pendingRemoteDocument = pendingRemoteDocumentRef.current;\n pendingRemoteDocumentRef.current = null;\n applyRemoteDocumentSnapshot(pendingRemoteDocument);\n }\n editor.endHistoryEntry();\n };\n\n // undo/redo keybinds\n const handleKeyDown = (e: KeyboardEvent) => {\n const isMetaPressed = e.metaKey || e.ctrlKey;\n const loweredKey = e.key.toLowerCase();\n const isUndoOrRedoKey = loweredKey === 'z' || loweredKey === 'y';\n\n if (isMetaPressed && isUndoOrRedoKey) {\n const shouldRedo = loweredKey === 'y' || (loweredKey === 'z' && e.shiftKey);\n const changed = shouldRedo ? editor.redo() : editor.undo();\n if (changed) {\n e.preventDefault();\n e.stopPropagation();\n reconcileSelectionAfterDocumentLoad();\n setSelectionRotationDeg(0);\n render();\n syncHistoryState();\n return;\n }\n }\n\n editor.input.setModifiers(e.shiftKey, e.ctrlKey, e.metaKey);\n editor.tools.keyDown({ key: e.key });\n render();\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n editor.input.setModifiers(e.shiftKey, e.ctrlKey, e.metaKey);\n editor.tools.keyUp({ key: e.key });\n render();\n };\n\n const initializePersistence = async () => {\n if (!persistenceKey) { setIsPersistenceReady(true); return; }\n\n try {\n persistenceDb = new TsdrawLocalIndexedDb(persistenceKey);\n const loaded = await persistenceDb.load(sessionId);\n const snapshot: Partial<TsdrawEditorSnapshot> = {};\n if (loaded.records.length > 0) {\n snapshot.document = { records: loaded.records };\n }\n if (loaded.state) {\n snapshot.state = loaded.state;\n }\n if (snapshot.document || snapshot.state) {\n applyLoadedSnapshot(snapshot);\n }\n editor.loadHistorySnapshot(loaded.history);\n syncHistoryState();\n\n persistenceActive = true;\n persistenceChannel = new BroadcastChannel(`tsdraw:persistence:${persistenceKey}`);\n persistenceChannel.onmessage = async (event) => {\n const data = event.data as { type?: string; senderSessionId?: string };\n if (data?.type !== 'tsdraw:persisted' || data.senderSessionId === sessionId) return;\n if (!persistenceDb || disposed) return;\n const nextLoaded = await persistenceDb.load(sessionId);\n if (nextLoaded.records.length > 0) {\n const nextDocument: TsdrawDocumentSnapshot = { records: nextLoaded.records };\n if (isPointerActiveRef.current) {\n pendingRemoteDocumentRef.current = nextDocument;\n return;\n }\n applyRemoteDocumentSnapshot(nextDocument);\n }\n };\n } finally {\n if (!disposed) { setIsPersistenceReady(true); }\n }\n };\n\n const cleanupEditorListener = editor.listen(() => {\n if (ignorePersistenceChanges) return;\n schedulePersist();\n });\n const cleanupHistoryListener = editor.listenHistory(() => {\n syncHistoryState();\n if (ignorePersistenceChanges) return;\n schedulePersist();\n });\n\n resize();\n const ro = new ResizeObserver(resize);\n ro.observe(container);\n canvas.addEventListener('pointerdown', handlePointerDown);\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n\n void initializePersistence().catch((error) => {\n console.error('failed to initialize tsdraw persistence', error);\n });\n\n disposeMount = options.onMount?.({\n editor,\n container,\n canvas,\n setTool: (tool) => {\n if (!editor.tools.hasTool(tool)) return;\n editor.setCurrentTool(tool);\n setCurrentToolState(tool);\n currentToolRef.current = tool;\n },\n getCurrentTool: () => editor.getCurrentToolId(),\n undo: () => {\n const changed = editor.undo();\n if (!changed) return false;\n reconcileSelectionAfterDocumentLoad();\n setSelectionRotationDeg(0);\n render();\n syncHistoryState();\n return true;\n },\n redo: () => {\n const changed = editor.redo();\n if (!changed) return false;\n reconcileSelectionAfterDocumentLoad();\n setSelectionRotationDeg(0);\n render();\n syncHistoryState();\n return true;\n },\n canUndo: () => editor.canUndo(),\n canRedo: () => editor.canRedo(),\n applyDrawStyle: (partial) => {\n editor.setCurrentDrawStyle(partial);\n if (partial.color) setDrawColor(partial.color);\n if (partial.dash) setDrawDash(partial.dash);\n if (partial.size) setDrawSize(partial.size);\n render();\n },\n });\n\n return () => {\n disposed = true;\n schedulePersistRef.current = null;\n cleanupEditorListener();\n cleanupHistoryListener();\n disposeMount?.();\n ro.disconnect();\n canvas.removeEventListener('pointerdown', handlePointerDown);\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n isPointerActiveRef.current = false;\n pendingRemoteDocumentRef.current = null;\n persistenceChannel?.close();\n void persistenceDb?.close();\n editorRef.current = null;\n };\n }, [\n getPagePointFromClient,\n options.initialTool,\n options.onMount,\n options.persistenceKey,\n options.toolDefinitions,\n refreshSelectionBounds,\n render,\n updatePointerPreview,\n ]);\n\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n editor.renderer.setTheme(options.theme ?? 'light');\n render();\n }, [options.theme, render]);\n\n const setTool = useCallback(\n (tool: ToolId) => {\n const editor = editorRef.current;\n if (!editor) return;\n if (!editor.tools.hasTool(tool)) return;\n editor.setCurrentTool(tool);\n setCurrentToolState(tool);\n currentToolRef.current = tool;\n if (tool !== 'select') resetSelectUi();\n },\n [resetSelectUi]\n );\n\n const applyDrawStyle = useCallback(\n (partial: Partial<{ color: ColorStyle; dash: DashStyle; size: SizeStyle }>) => {\n const editor = editorRef.current;\n if (!editor) return;\n editor.setCurrentDrawStyle(partial);\n if (partial.color) setDrawColor(partial.color);\n if (partial.dash) setDrawDash(partial.dash);\n if (partial.size) setDrawSize(partial.size);\n render();\n },\n [render]\n );\n\n const undo = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return false;\n const changed = editor.undo();\n if (!changed) return false;\n const nextSelectedShapeIds = selectedShapeIdsRef.current.filter((shapeId) => editor.getShape(shapeId) != null);\n if (nextSelectedShapeIds.length !== selectedShapeIdsRef.current.length) {\n selectedShapeIdsRef.current = nextSelectedShapeIds;\n setSelectedShapeIds(nextSelectedShapeIds);\n }\n setSelectionRotationDeg(0);\n render();\n setCanUndo(editor.canUndo());\n setCanRedo(editor.canRedo());\n return true;\n }, [render]);\n\n const redo = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return false;\n const changed = editor.redo();\n if (!changed) return false;\n const nextSelectedShapeIds = selectedShapeIdsRef.current.filter((shapeId) => editor.getShape(shapeId) != null);\n if (nextSelectedShapeIds.length !== selectedShapeIdsRef.current.length) {\n selectedShapeIdsRef.current = nextSelectedShapeIds;\n setSelectedShapeIds(nextSelectedShapeIds);\n }\n setSelectionRotationDeg(0);\n render();\n setCanUndo(editor.canUndo());\n setCanRedo(editor.canRedo());\n return true;\n }, [render]);\n\n const showToolOverlay = isPointerInsideCanvas && (currentTool === 'pen' || currentTool === 'eraser');\n const canvasCursor = getCanvasCursor(currentTool, {\n isMovingSelection,\n isResizingSelection,\n isRotatingSelection,\n showToolOverlay,\n });\n const cursorContext: TsdrawCursorContext = {\n currentTool,\n defaultCursor: canvasCursor,\n showToolOverlay,\n isMovingSelection,\n isResizingSelection,\n isRotatingSelection,\n };\n const toolOverlay: TsdrawToolOverlayState = {\n visible: showToolOverlay,\n pointerX: pointerScreenPoint.x,\n pointerY: pointerScreenPoint.y,\n isPenPreview: currentTool === 'pen',\n penRadius: Math.max(2, STROKE_WIDTHS[drawSize] / 2),\n penColor: resolveDrawColor(drawColor, options.theme ?? 'light'),\n eraserRadius: ERASER_MARGIN,\n };\n\n return {\n containerRef,\n canvasRef,\n currentTool,\n drawColor,\n drawDash,\n drawSize,\n selectedShapeIds,\n selectionBrush,\n selectionBounds,\n selectionRotationDeg,\n canvasCursor,\n cursorContext,\n toolOverlay,\n isPersistenceReady,\n showStylePanel: stylePanelToolIdsRef.current.includes(currentTool),\n canUndo,\n canRedo,\n undo,\n redo,\n setTool,\n applyDrawStyle,\n handleResizePointerDown,\n handleRotatePointerDown,\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport type { ColorStyle, DashStyle, DefaultToolId, SizeStyle, ToolDefinition, ToolId } from '@tsdraw/core';\nimport { SelectionOverlay } from './SelectionOverlay.js';\nimport { StylePanel } from './StylePanel.js';\nimport { ToolOverlay } from './ToolOverlay.js';\nimport { Toolbar, getDefaultToolbarIcon, type ToolbarPart } from './Toolbar.js';\nimport {\n useTsdrawCanvasController,\n type TsdrawCursorContext,\n type TsdrawMountApi,\n type TsdrawToolOverlayState,\n} from '../canvas/useTsdrawCanvasController.js';\n\nconst DEFAULT_TOOLBAR_PARTS: ToolbarPartItem[][] = [['undo', 'redo'], ['select', 'hand', 'pen', 'eraser']];\n\nconst DEFAULT_TOOL_LABELS: Record<DefaultToolId, string> = {\n select: 'Select',\n pen: 'Pen',\n eraser: 'Eraser',\n hand: 'Hand',\n};\n\ntype VerticalPart = 'top' | 'bottom' | 'center';\ntype HorizontalPart = 'left' | 'right' | 'center';\nexport type UiAnchor = | `${VerticalPart}-${HorizontalPart}` | `${HorizontalPart}-${VerticalPart}`;\n\nfunction parseAnchor(anchor: UiAnchor): { vertical: VerticalPart; horizontal: HorizontalPart } {\n const parts = anchor.split('-') as string[];\n let vertical: VerticalPart = 'center';\n let horizontal: HorizontalPart = 'center';\n for (const part of parts) {\n if (part === 'top' || part === 'bottom') vertical = part;\n else if (part === 'left' || part === 'right') horizontal = part;\n }\n return { vertical, horizontal };\n}\n\nexport interface TsdrawCustomTool {\n id: ToolId;\n label: string;\n icon: ReactNode;\n iconSelected?: ReactNode;\n definition: ToolDefinition;\n showStylePanel?: boolean;\n}\n\nexport type TsdrawToolbarBuiltInAction = 'undo' | 'redo';\nexport type ToolbarPartItem = ToolId | TsdrawToolbarBuiltInAction;\n\nexport interface TsdrawUiPlacement {\n anchor?: UiAnchor;\n offsetX?: number;\n offsetY?: number;\n style?: CSSProperties;\n}\n\nexport interface TsdrawUiOptions {\n toolbar?: {\n placement?: TsdrawUiPlacement;\n parts?: ToolbarPartItem[][];\n };\n stylePanel?: {\n placement?: TsdrawUiPlacement;\n };\n customElements?: TsdrawCustomElement[];\n cursor?: {\n getCursor?: (context: TsdrawCursorContext) => string;\n };\n overlays?: {\n renderToolOverlay?: (args: {\n defaultOverlay: ReactNode;\n overlayState: TsdrawToolOverlayState;\n currentTool: ToolId;\n }) => ReactNode;\n };\n}\n\nexport interface TsdrawCustomElementRenderArgs {\n currentTool: ToolId;\n setTool: (tool: ToolId) => void;\n applyDrawStyle: (partial: Partial<{ color: ColorStyle; dash: DashStyle; size: SizeStyle }>) => void;\n}\n\nexport interface TsdrawCustomElement {\n id: string;\n placement?: TsdrawUiPlacement;\n render: (args: TsdrawCustomElementRenderArgs) => ReactNode;\n}\n\nexport interface TsdrawProps {\n width?: number | string;\n height?: number | string;\n className?: string;\n style?: CSSProperties;\n theme?: 'light' | 'dark' | 'system';\n persistenceKey?: string;\n customTools?: TsdrawCustomTool[];\n initialToolId?: ToolId;\n uiOptions?: TsdrawUiOptions;\n onMount?: (api: TsdrawMountApi) => void | (() => void);\n}\n\nexport type TsdrawCanvasProps = TsdrawProps;\n\nfunction isToolbarAction(item: ToolbarPartItem): item is TsdrawToolbarBuiltInAction {\n return item === 'undo' || item === 'redo';\n}\n\nfunction resolvePlacementStyle(\n placement: TsdrawUiPlacement | undefined,\n fallbackAnchor: UiAnchor,\n fallbackOffsetX: number,\n fallbackOffsetY: number\n): CSSProperties {\n const anchor = placement?.anchor ?? fallbackAnchor;\n const offsetX = placement?.offsetX ?? fallbackOffsetX;\n const offsetY = placement?.offsetY ?? fallbackOffsetY;\n const { vertical, horizontal } = parseAnchor(anchor);\n const result: CSSProperties = {};\n const transforms: string[] = [];\n\n if (horizontal === 'left') {\n result.left = offsetX;\n } else if (horizontal === 'right') {\n result.right = offsetX;\n } else {\n result.left = '50%';\n transforms.push('translateX(-50%)');\n if (offsetX) transforms.push(`translateX(${offsetX}px)`);\n }\n\n if (vertical === 'top') {\n result.top = offsetY;\n } else if (vertical === 'bottom') {\n result.bottom = offsetY;\n } else {\n result.top = '50%';\n transforms.push('translateY(-50%)');\n if (offsetY) transforms.push(`translateY(${offsetY}px)`);\n }\n\n if (transforms.length > 0) result.transform = transforms.join(' ');\n\n return { ...result, ...(placement?.style ?? {}) };\n}\n\nexport function Tsdraw(props: TsdrawProps) {\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>(() => {\n if (typeof window === 'undefined') return 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n });\n const customTools = props.customTools ?? [];\n const toolbarPartIds = props.uiOptions?.toolbar?.parts ?? DEFAULT_TOOLBAR_PARTS;\n const customToolMap = useMemo(\n () => new Map(customTools.map((customTool) => [customTool.id, customTool])),\n [customTools]\n );\n const toolbarToolIds = useMemo(() => {\n const ids = new Set<ToolId>();\n for (const toolbarPart of toolbarPartIds) {\n for (const item of toolbarPart) {\n if (isToolbarAction(item)) continue;\n if (item in DEFAULT_TOOL_LABELS || customToolMap.has(item)) {\n ids.add(item);\n }\n }\n }\n return ids;\n }, [customToolMap, toolbarPartIds]);\n const toolDefinitions = useMemo(\n () => customTools.filter((customTool) => toolbarToolIds.has(customTool.id)).map((customTool) => customTool.definition),\n [customTools, toolbarToolIds]\n );\n const stylePanelToolIds = useMemo<ToolId[]>(\n () => {\n const nextToolIds = new Set<ToolId>();\n if (toolbarToolIds.has('pen')) {\n nextToolIds.add('pen');\n }\n for (const customTool of customTools) {\n if ((customTool.showStylePanel ?? false) && toolbarToolIds.has(customTool.id)) {\n nextToolIds.add(customTool.id);\n }\n }\n return [...nextToolIds];\n },\n [customTools, toolbarToolIds]\n );\n const firstToolbarTool = useMemo(() => {\n for (const toolbarPart of toolbarPartIds) {\n for (const item of toolbarPart) {\n if (isToolbarAction(item)) continue;\n if (item in DEFAULT_TOOL_LABELS || customToolMap.has(item)) {\n return item;\n }\n }\n }\n return undefined;\n }, [customToolMap, toolbarPartIds]);\n const initialTool: ToolId = props.initialToolId ?? firstToolbarTool ?? 'pen';\n const requestedTheme = props.theme ?? 'light';\n\n // Themes and so that system theme works\n useEffect(() => {\n if (requestedTheme !== 'system' || typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const syncSystemTheme = () => setSystemTheme(mediaQuery.matches ? 'dark' : 'light');\n\n syncSystemTheme();\n mediaQuery.addEventListener('change', syncSystemTheme);\n\n return () => mediaQuery.removeEventListener('change', syncSystemTheme);\n }, [requestedTheme]);\n\n const resolvedTheme = requestedTheme === 'system' ? systemTheme : requestedTheme;\n\n const {\n containerRef,\n canvasRef,\n currentTool,\n drawColor,\n drawDash,\n drawSize,\n selectedShapeIds,\n selectionBrush,\n selectionBounds,\n selectionRotationDeg,\n canvasCursor: defaultCanvasCursor,\n cursorContext,\n toolOverlay,\n isPersistenceReady,\n showStylePanel,\n canUndo,\n canRedo,\n undo,\n redo,\n setTool,\n applyDrawStyle,\n handleResizePointerDown,\n handleRotatePointerDown,\n } = useTsdrawCanvasController({\n toolDefinitions,\n initialTool,\n theme: resolvedTheme,\n persistenceKey: props.persistenceKey,\n stylePanelToolIds,\n onMount: props.onMount,\n });\n\n const toolbarPlacementStyle = resolvePlacementStyle(props.uiOptions?.toolbar?.placement, 'bottom-center', 0, 14);\n const stylePanelPlacementStyle = resolvePlacementStyle(props.uiOptions?.stylePanel?.placement, 'top-right', 8, 8);\n const canvasCursor = props.uiOptions?.cursor?.getCursor?.(cursorContext) ?? defaultCanvasCursor;\n const defaultToolOverlay = (\n <ToolOverlay\n visible={toolOverlay.visible}\n pointerX={toolOverlay.pointerX}\n pointerY={toolOverlay.pointerY}\n isPenPreview={toolOverlay.isPenPreview}\n penRadius={toolOverlay.penRadius}\n penColor={toolOverlay.penColor}\n eraserRadius={toolOverlay.eraserRadius}\n />\n );\n const overlayNode = props.uiOptions?.overlays?.renderToolOverlay?.({ defaultOverlay: defaultToolOverlay, overlayState: toolOverlay, currentTool }) ?? defaultToolOverlay;\n const customElements = props.uiOptions?.customElements ?? [];\n const toolbarParts = useMemo<ToolbarPart[]>(\n () =>\n toolbarPartIds\n .map((toolbarPart, partIndex) => {\n const items = toolbarPart\n .map((item) => {\n if (item === 'undo') {\n return {\n type: 'action' as const,\n id: 'undo' as const,\n label: 'Undo',\n disabled: !canUndo,\n onSelect: undo,\n };\n }\n\n if (item === 'redo') {\n return {\n type: 'action' as const,\n id: 'redo' as const,\n label: 'Redo',\n disabled: !canRedo,\n onSelect: redo,\n };\n }\n\n if (item in DEFAULT_TOOL_LABELS) {\n return {\n type: 'tool' as const,\n id: item,\n label: DEFAULT_TOOL_LABELS[item as DefaultToolId],\n icon: (isActive: boolean) => getDefaultToolbarIcon(item, isActive),\n };\n }\n\n const customTool = customToolMap.get(item);\n if (!customTool) return null;\n return {\n type: 'tool' as const,\n id: customTool.id,\n label: customTool.label,\n icon: (isActive: boolean) => (isActive && customTool.iconSelected ? customTool.iconSelected : customTool.icon),\n };\n })\n .filter((nextItem): nextItem is NonNullable<typeof nextItem> => nextItem != null);\n return {\n id: `toolbar-part-${partIndex.toString(36)}`,\n items,\n };\n })\n .filter((part) => part.items.length > 0),\n [canRedo, canUndo, customToolMap, redo, toolbarPartIds, undo]\n );\n\n return (\n <div\n ref={containerRef}\n className={`tsdraw tsdraw-${resolvedTheme}mode ${props.className ?? ''}`}\n style={{\n width: props.width ?? '100%',\n height: props.height ?? '100%',\n position: 'relative',\n overflow: 'hidden',\n ...props.style,\n }}\n >\n <canvas\n ref={canvasRef}\n style={{\n display: 'block',\n width: '100%',\n height: '100%',\n touchAction: 'none',\n cursor: canvasCursor,\n }}\n data-testid=\"tsdraw-canvas\"\n />\n {overlayNode}\n <SelectionOverlay\n selectionBrush={selectionBrush}\n selectionBounds={selectionBounds}\n selectionRotationDeg={selectionRotationDeg}\n currentTool={currentTool}\n selectedCount={selectedShapeIds.length}\n onRotatePointerDown={handleRotatePointerDown}\n onResizePointerDown={handleResizePointerDown}\n />\n <StylePanel\n visible={isPersistenceReady && showStylePanel}\n style={stylePanelPlacementStyle}\n theme={resolvedTheme}\n drawColor={drawColor}\n drawDash={drawDash}\n drawSize={drawSize}\n onColorSelect={(color) => applyDrawStyle({ color })}\n onDashSelect={(dash) => applyDrawStyle({ dash })}\n onSizeSelect={(size) => applyDrawStyle({ size })}\n />\n {customElements.map((customElement) => (\n <div\n key={customElement.id}\n style={{\n position: 'absolute',\n zIndex: 130,\n pointerEvents: 'all',\n ...resolvePlacementStyle(customElement.placement, 'top-left', 8, 8),\n }}\n >\n {customElement.render({ currentTool, setTool, applyDrawStyle })}\n </div>\n ))}\n <Toolbar\n parts={toolbarParts}\n style={toolbarPlacementStyle}\n currentTool={isPersistenceReady ? currentTool : null}\n onToolChange={setTool}\n disabled={!isPersistenceReady}\n />\n </div>\n );\n}\n\nexport function TsdrawCanvas(props: TsdrawCanvasProps) {\n return <Tsdraw {...props} />;\n}"]}
1
+ {"version":3,"sources":["../src/components/SelectionOverlay.tsx","../src/components/StylePanel.tsx","../src/components/ToolOverlay.tsx","../src/components/Toolbar.tsx","../src/canvas/cursor.ts","../src/persistence/localIndexedDb.ts","../src/persistence/sessionId.ts","../src/canvas/useTsdrawCanvasController.ts","../src/components/TsdrawCanvas.tsx"],"names":["jsx","jsxs","resolveThemeColor","useState","useEffect","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import type { PointerEvent as ReactPointerEvent } from 'react';\nimport type { ResizeHandle, ToolId } from '@tsdraw/core';\nimport type { ScreenRect } from '../types.js';\n\ninterface SelectionOverlayProps {\n selectionBrush: ScreenRect | null;\n selectionBounds: ScreenRect | null;\n selectionRotationDeg: number;\n currentTool: ToolId;\n selectedCount: number;\n onRotatePointerDown: (e: ReactPointerEvent<HTMLButtonElement>) => void;\n onResizePointerDown: (e: ReactPointerEvent<HTMLButtonElement>, handle: ResizeHandle) => void;\n}\n\nexport function SelectionOverlay({\n selectionBrush,\n selectionBounds,\n selectionRotationDeg,\n currentTool,\n selectedCount,\n onRotatePointerDown,\n onResizePointerDown,\n}: SelectionOverlayProps) {\n return (\n <>\n {selectionBrush && (\n <div\n className=\"tsdraw-selection-brush\"\n style={{\n left: selectionBrush.left,\n top: selectionBrush.top,\n width: selectionBrush.width,\n height: selectionBrush.height,\n }}\n />\n )}\n {selectionBounds && (\n <div\n className=\"tsdraw-selection-frame\"\n style={{\n left: selectionBounds.left,\n top: selectionBounds.top,\n width: selectionBounds.width,\n height: selectionBounds.height,\n transform: `rotate(${selectionRotationDeg}deg)`,\n }}\n >\n <div className=\"tsdraw-selection-bounds\" />\n {currentTool === 'select' && selectedCount > 0 && (\n <>\n <div className=\"tsdraw-rotation-stem\" />\n <button\n type=\"button\"\n className=\"tsdraw-rotation-handle\"\n aria-label=\"Rotate selection\"\n onPointerDown={onRotatePointerDown}\n />\n <button\n type=\"button\"\n className=\"tsdraw-selection-handle tsdraw-selection-handle--nw\"\n style={{ left: '0%', top: '0%' }}\n aria-label=\"Resize top left\"\n onPointerDown={(e) => onResizePointerDown(e, 'nw')}\n />\n <button\n type=\"button\"\n className=\"tsdraw-selection-handle tsdraw-selection-handle--ne\"\n style={{ left: '100%', top: '0%' }}\n aria-label=\"Resize top right\"\n onPointerDown={(e) => onResizePointerDown(e, 'ne')}\n />\n <button\n type=\"button\"\n className=\"tsdraw-selection-handle tsdraw-selection-handle--sw\"\n style={{ left: '0%', top: '100%' }}\n aria-label=\"Resize bottom left\"\n onPointerDown={(e) => onResizePointerDown(e, 'sw')}\n />\n <button\n type=\"button\"\n className=\"tsdraw-selection-handle tsdraw-selection-handle--se\"\n style={{ left: '100%', top: '100%' }}\n aria-label=\"Resize bottom right\"\n onPointerDown={(e) => onResizePointerDown(e, 'se')}\n />\n </>\n )}\n </div>\n )}\n </>\n );\n}","import { DEFAULT_COLORS, resolveThemeColor } from '@tsdraw/core';\nimport type { ColorStyle, DashStyle, FillStyle, SizeStyle } from '@tsdraw/core';\nimport type { CSSProperties, ReactNode } from 'react';\n\nconst STYLE_COLORS = Object.entries(DEFAULT_COLORS)\n .filter(([key]) => key !== 'white')\n .map(([value]) => ({ value }));\n\nconst STYLE_DASHES: DashStyle[] = ['draw', 'solid', 'dashed', 'dotted'];\nconst STYLE_FILLS: FillStyle[] = ['none', 'blank', 'semi', 'solid'];\nconst STYLE_SIZES: SizeStyle[] = ['s', 'm', 'l', 'xl'];\n\nexport type TsdrawStylePanelPartItem = | 'colors' | 'dashes' | 'fills' | 'sizes' | (string & {});\n\nexport interface TsdrawStylePanelRenderContext {\n drawColor: ColorStyle;\n drawDash: DashStyle;\n drawFill: FillStyle;\n drawSize: SizeStyle;\n onColorSelect: (color: ColorStyle) => void;\n onDashSelect: (dash: DashStyle) => void;\n onFillSelect: (fill: FillStyle) => void;\n onSizeSelect: (size: SizeStyle) => void;\n}\n\nexport interface TsdrawStylePanelCustomPart {\n id: string;\n render: (context: TsdrawStylePanelRenderContext) => ReactNode;\n}\n\ninterface StylePanelProps extends TsdrawStylePanelRenderContext {\n visible: boolean;\n parts: TsdrawStylePanelPartItem[];\n customParts?: TsdrawStylePanelCustomPart[];\n style?: CSSProperties;\n theme: 'light' | 'dark';\n}\n\nexport function StylePanel({\n visible,\n parts,\n customParts,\n style,\n theme,\n drawColor,\n drawDash,\n drawFill,\n drawSize,\n onColorSelect,\n onDashSelect,\n onFillSelect,\n onSizeSelect,\n}: StylePanelProps) {\n if (!visible || parts.length === 0) return null;\n\n const context: TsdrawStylePanelRenderContext = {\n drawColor,\n drawDash,\n drawFill,\n drawSize,\n onColorSelect,\n onDashSelect,\n onFillSelect,\n onSizeSelect,\n };\n const customPartMap = new Map((customParts ?? []).map((customPart) => [customPart.id, customPart]));\n\n return (\n <div className=\"tsdraw-style-panel\" style={style} aria-label=\"Draw style panel\">\n {parts.map((part) => {\n if (part === 'colors') {\n return (\n <div key={part} className=\"tsdraw-style-colors\">\n {STYLE_COLORS.map((item) => (\n <button\n key={item.value}\n type=\"button\"\n className=\"tsdraw-style-color\"\n data-active={drawColor === item.value ? 'true' : undefined}\n aria-label={`Color ${item.value}`}\n title={item.value}\n onClick={() => onColorSelect(item.value)}\n >\n <span\n className=\"tsdraw-style-color-dot\"\n style={{ background: resolveThemeColor(item.value, theme) }}\n />\n </button>\n ))}\n </div>\n );\n }\n\n if (part === 'dashes') {\n return (\n <div key={part} className=\"tsdraw-style-section\">\n {STYLE_DASHES.map((dash) => (\n <button\n key={dash}\n type=\"button\"\n className=\"tsdraw-style-row\"\n data-active={drawDash === dash ? 'true' : undefined}\n aria-label={`Stroke ${dash}`}\n title={dash}\n onClick={() => onDashSelect(dash)}\n >\n <span className=\"tsdraw-style-preview\">\n <span className={`tsdraw-style-preview-line tsdraw-style-preview-line--${dash}`} />\n </span>\n </button>\n ))}\n </div>\n );\n }\n\n if (part === 'fills') {\n return (\n <div key={part} className=\"tsdraw-style-section\">\n {STYLE_FILLS.map((fill) => (\n <button\n key={fill}\n type=\"button\"\n className=\"tsdraw-style-row\"\n data-active={drawFill === fill ? 'true' : undefined}\n aria-label={`Fill ${fill}`}\n title={fill}\n onClick={() => onFillSelect(fill)}\n >\n <span className=\"tsdraw-style-preview\">\n <span className={`tsdraw-style-fill tsdraw-style-fill--${fill}`} />\n </span>\n </button>\n ))}\n </div>\n );\n }\n\n if (part === 'sizes') {\n return (\n <div key={part} className=\"tsdraw-style-section\">\n {STYLE_SIZES.map((size) => (\n <button\n key={size}\n type=\"button\"\n className=\"tsdraw-style-row\"\n data-active={drawSize === size ? 'true' : undefined}\n aria-label={`Thickness ${size}`}\n title={size}\n onClick={() => onSizeSelect(size)}\n >\n <span className=\"tsdraw-style-preview\">\n <span className={`tsdraw-style-size tsdraw-style-size--${size}`} />\n </span>\n </button>\n ))}\n </div>\n );\n }\n\n const customPart = customPartMap.get(part);\n if (!customPart) return null;\n return (\n <div key={part} className=\"tsdraw-style-section tsdraw-style-section--custom\">\n {customPart.render(context)}\n </div>\n );\n })}\n </div>\n );\n}","interface ToolOverlayProps {\n visible: boolean;\n pointerX: number;\n pointerY: number;\n isPenPreview: boolean;\n penRadius: number;\n penColor: string;\n eraserRadius: number;\n}\n\nexport function ToolOverlay({\n visible,\n pointerX,\n pointerY,\n isPenPreview,\n penRadius,\n penColor,\n eraserRadius,\n}: ToolOverlayProps) {\n if (!visible) return null;\n\n return (\n <div className=\"tsdraw-tool-overlay\" aria-hidden=\"true\">\n {isPenPreview ? (\n <span\n className=\"tsdraw-tool-dot\"\n style={{\n left: pointerX,\n top: pointerY,\n width: penRadius * 2,\n height: penRadius * 2,\n backgroundColor: penColor,\n }}\n />\n ) : (\n <span\n className=\"tsdraw-tool-ring\"\n style={{\n left: pointerX,\n top: pointerY,\n width: eraserRadius * 2,\n height: eraserRadius * 2,\n }}\n />\n )}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport type { ToolId } from '@tsdraw/core';\nimport { IconArrowBackUp, IconArrowForwardUp, IconEraser, IconHandStop, IconPencil, IconPointer, IconSquare, IconCircle } from '@tabler/icons-react';\n\nexport interface ToolbarToolItem {\n type: 'tool';\n id: ToolId;\n label: string;\n icon: ReactNode | ((isActive: boolean) => ReactNode);\n}\n\nexport interface ToolbarActionItem {\n type: 'action';\n id: 'undo' | 'redo';\n label: string;\n disabled: boolean;\n onSelect: () => void;\n}\n\nexport type ToolbarRenderItem = ToolbarToolItem | ToolbarActionItem;\n\nexport interface ToolbarPart {\n id: string;\n items: ToolbarRenderItem[];\n}\n\ninterface ToolbarProps {\n parts: ToolbarPart[];\n currentTool: ToolId | null;\n onToolChange: (tool: ToolId) => void;\n disabled?: boolean;\n style?: CSSProperties;\n}\n\nexport function getDefaultToolbarIcon(toolId: ToolId, isActive: boolean): ReactNode {\n if (toolId === 'select') return <IconPointer size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'pen') return <IconPencil size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'square') return <IconSquare size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'circle') return <IconCircle size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'eraser') return <IconEraser size={16} stroke={1.8} fill={isActive ? 'currentColor' : 'none'} />;\n if (toolId === 'hand') return <IconHandStop size={16} stroke={isActive ? 1 : 1.8} fill={isActive ? 'currentColor' : 'none'} style={isActive ? { stroke: '#000000' } : undefined} />;\n return null;\n}\n\nfunction getActionIcon(actionId: 'undo' | 'redo'): ReactNode {\n if (actionId === 'undo') return <IconArrowBackUp size={16} stroke={1.8} />;\n return <IconArrowForwardUp size={16} stroke={1.8} />;\n}\n\nexport function Toolbar({ parts, currentTool, onToolChange, disabled, style }: ToolbarProps) {\n return (\n <div className=\"tsdraw-toolbar\" style={style}>\n {parts.map((part, partIndex) => (\n <div key={part.id} className=\"tsdraw-toolbar-part\">\n {part.items.map((item) => {\n if (item.type === 'action') {\n return (\n <button\n key={item.id}\n type=\"button\"\n className=\"tsdraw-toolbar-btn\"\n onClick={item.onSelect}\n title={item.label}\n aria-label={item.label}\n disabled={disabled || item.disabled}\n >\n {getActionIcon(item.id)}\n </button>\n );\n }\n\n const isActive = currentTool === item.id;\n return (\n <button\n key={item.id}\n type=\"button\"\n className=\"tsdraw-toolbar-btn\"\n data-active={isActive ? 'true' : undefined}\n onClick={() => onToolChange(item.id)}\n title={item.label}\n aria-label={item.label}\n disabled={disabled}\n >\n {typeof item.icon === 'function' ? item.icon(isActive) : item.icon}\n </button>\n );\n })}\n {partIndex < parts.length - 1 ? <div className=\"tsdraw-toolbar-separator\" /> : null}\n </div>\n ))}\n </div>\n );\n}\n","import type { ToolId } from '@tsdraw/core';\nimport { isSelectTool } from '@tsdraw/core';\n\nexport function getCanvasCursor(\n currentTool: ToolId,\n state: {\n isMovingSelection: boolean;\n isResizingSelection: boolean;\n isRotatingSelection: boolean;\n showToolOverlay: boolean;\n }\n) {\n if (currentTool === 'hand') return 'grab';\n\n if (isSelectTool(currentTool)) {\n if (state.isRotatingSelection) return 'grabbing';\n if (state.isResizingSelection) return 'nwse-resize';\n if (state.isMovingSelection) return 'grabbing';\n return 'default';\n }\n\n return state.showToolOverlay ? 'none' : 'crosshair'; // Let tool overlay handle the cursor\n}","import type { TsdrawHistorySnapshot, TsdrawPersistedRecord, TsdrawSessionStateSnapshot } from '@tsdraw/core';\n\nconst DATABASE_PREFIX = 'tsdraw_v1_';\nconst DATABASE_VERSION = 2;\n\nconst STORE = {\n records: 'records',\n state: 'state',\n history: 'history',\n} as const;\n\ninterface StateRow {\n id: string;\n snapshot: TsdrawSessionStateSnapshot;\n updatedAt: number;\n}\n\ninterface HistoryRow {\n id: string;\n snapshot: TsdrawHistorySnapshot;\n updatedAt: number;\n}\n\nexport interface LocalLoadResult {\n records: TsdrawPersistedRecord[];\n state: TsdrawSessionStateSnapshot | null;\n history: TsdrawHistorySnapshot | null;\n}\n\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB request failed'));\n });\n}\n\nfunction transactionDone(transaction: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error ?? new Error('IndexedDB transaction failed'));\n transaction.onabort = () => reject(transaction.error ?? new Error('IndexedDB transaction aborted'));\n });\n}\n\nfunction openLocalDatabase(persistenceKey: string): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(`${DATABASE_PREFIX}${persistenceKey}`, DATABASE_VERSION);\n\n request.onupgradeneeded = () => {\n const database = request.result;\n if (!database.objectStoreNames.contains(STORE.records)) { database.createObjectStore(STORE.records); }\n if (!database.objectStoreNames.contains(STORE.state)) { database.createObjectStore(STORE.state); }\n if (!database.objectStoreNames.contains(STORE.history)) { database.createObjectStore(STORE.history); }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('Failed to open IndexedDB'));\n });\n}\n\nexport class TsdrawLocalIndexedDb {\n private readonly databasePromise: Promise<IDBDatabase>;\n\n constructor(persistenceKey: string) {\n this.databasePromise = openLocalDatabase(persistenceKey);\n }\n\n async close(): Promise<void> {\n const database = await this.databasePromise;\n database.close();\n }\n\n async load(sessionId: string): Promise<LocalLoadResult> {\n const database = await this.databasePromise;\n const transaction = database.transaction([STORE.records, STORE.state, STORE.history], 'readonly');\n const recordStore = transaction.objectStore(STORE.records);\n const stateStore = transaction.objectStore(STORE.state);\n const historyStore = transaction.objectStore(STORE.history);\n\n const records = (await requestToPromise(recordStore.getAll())) as TsdrawPersistedRecord[];\n let state = (await requestToPromise(stateStore.get(sessionId)) as StateRow | undefined)?.snapshot ?? null;\n let history = (await requestToPromise(historyStore.get(sessionId)) as HistoryRow | undefined)?.snapshot ?? null;\n\n if (!state) {\n const allStates = (await requestToPromise(stateStore.getAll())) as StateRow[];\n if (allStates.length > 0) {\n allStates.sort((left, right) => left.updatedAt - right.updatedAt);\n state = allStates[allStates.length - 1]?.snapshot ?? null;\n }\n }\n\n if (!history) {\n const allHistoryRows = (await requestToPromise(historyStore.getAll())) as HistoryRow[];\n if (allHistoryRows.length > 0) {\n allHistoryRows.sort((left, right) => left.updatedAt - right.updatedAt);\n history = allHistoryRows[allHistoryRows.length - 1]?.snapshot ?? null;\n }\n }\n\n await transactionDone(transaction);\n return { records, state, history };\n }\n\n async storeSnapshot(args: {\n records: TsdrawPersistedRecord[];\n sessionId: string;\n state: TsdrawSessionStateSnapshot;\n history: TsdrawHistorySnapshot;\n }): Promise<void> {\n const database = await this.databasePromise;\n const transaction = database.transaction([STORE.records, STORE.state, STORE.history], 'readwrite');\n const recordStore = transaction.objectStore(STORE.records);\n const stateStore = transaction.objectStore(STORE.state);\n const historyStore = transaction.objectStore(STORE.history);\n\n recordStore.clear();\n for (const record of args.records) {\n recordStore.put(record, record.id);\n }\n\n const stateRow: StateRow = {\n id: args.sessionId,\n snapshot: args.state,\n updatedAt: Date.now(),\n };\n stateStore.put(stateRow, args.sessionId);\n\n const historyRow: HistoryRow = {\n id: args.sessionId,\n snapshot: args.history,\n updatedAt: Date.now(),\n };\n historyStore.put(historyRow, args.sessionId);\n\n await transactionDone(transaction);\n }\n}\n\nexport function getPersistenceDatabaseName(persistenceKey: string): string {\n return `${DATABASE_PREFIX}${persistenceKey}`;\n}","const SESSION_STORAGE_KEY = 'TSDRAW_TAB_SESSION_ID_v1';\n\nfunction createSessionId(): string {\n const timestamp = Date.now().toString(36);\n const randomPart = Math.random().toString(36).slice(2, 10);\n return `tsdraw-session-${timestamp}-${randomPart}`;\n}\n\nexport function getOrCreateSessionId(): string {\n if (typeof window === 'undefined') return createSessionId();\n\n try {\n const existing = window.sessionStorage.getItem(SESSION_STORAGE_KEY);\n if (existing) return existing;\n\n const newId = createSessionId();\n window.sessionStorage.setItem(SESSION_STORAGE_KEY, newId);\n return newId;\n } catch {\n return createSessionId();\n }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { PointerEvent as ReactPointerEvent } from 'react';\nimport type { RefObject } from 'react';\nimport {\n Editor,\n ERASER_MARGIN,\n STROKE_WIDTHS,\n normalizeSelectionBounds,\n applyMove,\n applyResize,\n applyRotation,\n buildStartPositions,\n buildTransformSnapshots,\n getSelectionBoundsPage,\n getShapesInBounds,\n getTopShapeAtPoint,\n resolveThemeColor,\n type ResizeHandle,\n type ToolDefinition,\n type ToolId,\n} from '@tsdraw/core';\nimport type { ColorStyle, DashStyle, FillStyle, ShapeId, SizeStyle, SelectionBounds, TsdrawDocumentSnapshot, TsdrawEditorSnapshot } from '@tsdraw/core';\nimport { getCanvasCursor } from './cursor.js';\nimport type { ScreenRect } from '../types.js';\nimport { TsdrawLocalIndexedDb } from '../persistence/localIndexedDb.js';\nimport { getOrCreateSessionId } from '../persistence/sessionId.js';\n\ntype SelectDragMode = 'none' | 'marquee' | 'move' | 'resize' | 'rotate';\n\nexport interface TsdrawCursorContext {\n currentTool: ToolId;\n defaultCursor: string;\n showToolOverlay: boolean;\n isMovingSelection: boolean;\n isResizingSelection: boolean;\n isRotatingSelection: boolean;\n}\n\nexport interface TsdrawToolOverlayState {\n visible: boolean;\n pointerX: number;\n pointerY: number;\n isPenPreview: boolean;\n penRadius: number;\n penColor: string;\n eraserRadius: number;\n}\n\nexport interface TsdrawMountApi {\n editor: Editor;\n container: HTMLDivElement;\n canvas: HTMLCanvasElement;\n setTool: (tool: ToolId) => void;\n getCurrentTool: () => ToolId;\n undo: () => boolean;\n redo: () => boolean;\n canUndo: () => boolean;\n canRedo: () => boolean;\n applyDrawStyle: (partial: Partial<{ color: ColorStyle; dash: DashStyle; fill: FillStyle; size: SizeStyle }>) => void;\n}\n\nexport interface UseTsdrawCanvasControllerOptions {\n toolDefinitions?: ToolDefinition[];\n initialTool?: ToolId;\n theme?: 'light' | 'dark';\n persistenceKey?: string;\n onMount?: (api: TsdrawMountApi) => void | (() => void);\n}\n\nexport interface TsdrawCanvasController {\n containerRef: RefObject<HTMLDivElement>;\n canvasRef: RefObject<HTMLCanvasElement>;\n currentTool: ToolId;\n drawColor: ColorStyle;\n drawDash: DashStyle;\n drawFill: FillStyle;\n drawSize: SizeStyle;\n selectedShapeIds: ShapeId[];\n selectionBrush: ScreenRect | null;\n selectionBounds: ScreenRect | null;\n selectionRotationDeg: number;\n canvasCursor: string;\n cursorContext: TsdrawCursorContext;\n toolOverlay: TsdrawToolOverlayState;\n isPersistenceReady: boolean;\n canUndo: boolean;\n canRedo: boolean;\n undo: () => boolean;\n redo: () => boolean;\n setTool: (tool: ToolId) => void;\n applyDrawStyle: (partial: Partial<{ color: ColorStyle; dash: DashStyle; fill: FillStyle; size: SizeStyle }>) => void;\n handleResizePointerDown: (e: ReactPointerEvent<HTMLButtonElement>, handle: ResizeHandle) => void;\n handleRotatePointerDown: (e: ReactPointerEvent<HTMLButtonElement>) => void;\n}\n\nfunction toScreenRect(editor: Editor, bounds: SelectionBounds): ScreenRect {\n const { x, y, zoom } = editor.viewport;\n return {\n left: bounds.minX * zoom + x,\n top: bounds.minY * zoom + y,\n width: (bounds.maxX - bounds.minX) * zoom,\n height: (bounds.maxY - bounds.minY) * zoom,\n };\n}\n\nfunction resolveDrawColor(colorStyle: ColorStyle, theme: 'light' | 'dark'): string {\n return resolveThemeColor(colorStyle, theme);\n}\n\nexport function useTsdrawCanvasController(options: UseTsdrawCanvasControllerOptions = {}): TsdrawCanvasController {\n const onMountRef = useRef(options.onMount);\n const containerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const editorRef = useRef<Editor | null>(null);\n const dprRef = useRef(1);\n const lastPointerClientRef = useRef<{ x: number; y: number } | null>(null);\n const currentToolRef = useRef<ToolId>(options.initialTool ?? 'pen');\n const selectedShapeIdsRef = useRef<ShapeId[]>([]);\n const schedulePersistRef = useRef<(() => void) | null>(null);\n const isPointerActiveRef = useRef(false);\n const pendingRemoteDocumentRef = useRef<TsdrawDocumentSnapshot | null>(null);\n const selectionRotationRef = useRef(0);\n const resizeRef = useRef<{\n handle: ResizeHandle | null;\n startBounds: ReturnType<typeof getSelectionBoundsPage>;\n startShapes: ReturnType<typeof buildTransformSnapshots>;\n }>({\n handle: null,\n startBounds: null,\n startShapes: new Map(),\n });\n const rotateRef = useRef<{\n center: { x: number; y: number } | null;\n startAngle: number;\n startSelectionRotationDeg: number;\n startShapes: ReturnType<typeof buildTransformSnapshots>;\n }>({\n center: null,\n startAngle: 0,\n startSelectionRotationDeg: 0,\n startShapes: new Map(),\n });\n const selectDragRef = useRef<{\n mode: SelectDragMode;\n startPage: { x: number; y: number };\n currentPage: { x: number; y: number };\n startPositions: ReturnType<typeof buildStartPositions>;\n additive: boolean;\n initialSelection: ShapeId[];\n }>({\n mode: 'none',\n startPage: { x: 0, y: 0 },\n currentPage: { x: 0, y: 0 },\n startPositions: new Map(),\n additive: false,\n initialSelection: [],\n });\n\n const [currentTool, setCurrentToolState] = useState<ToolId>(options.initialTool ?? 'pen');\n const [drawColor, setDrawColor] = useState<ColorStyle>('black');\n const [drawDash, setDrawDash] = useState<DashStyle>('draw');\n const [drawFill, setDrawFill] = useState<FillStyle>('none');\n const [drawSize, setDrawSize] = useState<SizeStyle>('m');\n const [selectedShapeIds, setSelectedShapeIds] = useState<ShapeId[]>([]);\n const [selectionBrush, setSelectionBrush] = useState<ScreenRect | null>(null);\n const [selectionBounds, setSelectionBounds] = useState<ScreenRect | null>(null);\n const [selectionRotationDeg, setSelectionRotationDeg] = useState(0);\n const [isMovingSelection, setIsMovingSelection] = useState(false);\n const [isResizingSelection, setIsResizingSelection] = useState(false);\n const [isRotatingSelection, setIsRotatingSelection] = useState(false);\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n const [isPersistenceReady, setIsPersistenceReady] = useState(!options.persistenceKey);\n const [pointerScreenPoint, setPointerScreenPoint] = useState({ x: 0, y: 0 });\n const [isPointerInsideCanvas, setIsPointerInsideCanvas] = useState(false);\n\n useEffect(() => {\n currentToolRef.current = currentTool;\n }, [currentTool]);\n\n useEffect(() => {\n onMountRef.current = options.onMount;\n }, [options.onMount]);\n\n useEffect(() => {\n selectedShapeIdsRef.current = selectedShapeIds;\n }, [selectedShapeIds]);\n\n useEffect(() => {\n selectionRotationRef.current = selectionRotationDeg;\n }, [selectionRotationDeg]);\n\n useEffect(() => {\n schedulePersistRef.current?.();\n }, [selectedShapeIds, currentTool, drawColor, drawDash, drawFill, drawSize]);\n\n const render = useCallback(() => {\n const canvas = canvasRef.current;\n const editor = editorRef.current;\n if (!canvas || !editor) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n const dpr = dprRef.current || 1;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, canvas.width / dpr, canvas.height / dpr);\n editor.render(ctx);\n }, []);\n\n // Keep overlays screen-space bounds in sync with the current page-space selection\n const refreshSelectionBounds = useCallback((editor: Editor, ids = selectedShapeIdsRef.current) => {\n const pageBounds = getSelectionBoundsPage(editor, ids);\n setSelectionBounds(pageBounds ? toScreenRect(editor, pageBounds) : null);\n }, []);\n\n const getPagePointFromClient = useCallback((editor: Editor, clientX: number, clientY: number) => {\n const canvas = canvasRef.current;\n if (!canvas) return { x: 0, y: 0 };\n const rect = canvas.getBoundingClientRect();\n return editor.screenToPage(clientX - rect.left, clientY - rect.top);\n }, []);\n\n const updatePointerPreview = useCallback((clientX: number, clientY: number) => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n const isInside =\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom;\n\n setIsPointerInsideCanvas(isInside);\n setPointerScreenPoint({\n x: clientX - rect.left,\n y: clientY - rect.top,\n });\n }, []);\n\n const resetSelectUi = useCallback(() => {\n setSelectionBrush(null);\n setSelectionRotationDeg(0);\n setIsMovingSelection(false);\n setIsResizingSelection(false);\n setIsRotatingSelection(false);\n selectDragRef.current.mode = 'none';\n resizeRef.current = { handle: null, startBounds: null, startShapes: new Map() };\n rotateRef.current = {\n center: null,\n startAngle: 0,\n startSelectionRotationDeg: selectionRotationRef.current,\n startShapes: new Map(),\n };\n }, []);\n\n const handleResizePointerDown = useCallback(\n (e: ReactPointerEvent<HTMLButtonElement>, handle: ResizeHandle) => {\n e.preventDefault();\n e.stopPropagation();\n const editor = editorRef.current;\n if (!editor || selectedShapeIdsRef.current.length === 0) return;\n const bounds = getSelectionBoundsPage(editor, selectedShapeIdsRef.current);\n if (!bounds) return;\n\n resizeRef.current = {\n handle,\n startBounds: bounds,\n startShapes: buildTransformSnapshots(editor, selectedShapeIdsRef.current),\n };\n editor.beginHistoryEntry();\n selectDragRef.current.mode = 'resize';\n const p = getPagePointFromClient(editor, e.clientX, e.clientY);\n editor.input.pointerDown(p.x, p.y, 0.5, false);\n selectDragRef.current.startPage = p;\n selectDragRef.current.currentPage = p;\n lastPointerClientRef.current = { x: e.clientX, y: e.clientY };\n setIsResizingSelection(true);\n },\n [getPagePointFromClient]\n );\n\n const handleRotatePointerDown = useCallback(\n (e: ReactPointerEvent<HTMLButtonElement>) => {\n e.preventDefault();\n e.stopPropagation();\n const editor = editorRef.current;\n if (!editor || selectedShapeIdsRef.current.length === 0) return;\n const bounds = getSelectionBoundsPage(editor, selectedShapeIdsRef.current);\n if (!bounds) return;\n\n const center = {\n x: (bounds.minX + bounds.maxX) / 2,\n y: (bounds.minY + bounds.maxY) / 2,\n };\n const p = getPagePointFromClient(editor, e.clientX, e.clientY);\n rotateRef.current = {\n center,\n startAngle: Math.atan2(p.y - center.y, p.x - center.x),\n startSelectionRotationDeg: selectionRotationRef.current,\n startShapes: buildTransformSnapshots(editor, selectedShapeIdsRef.current),\n };\n editor.beginHistoryEntry();\n selectDragRef.current.mode = 'rotate';\n editor.input.pointerDown(p.x, p.y, 0.5, false);\n selectDragRef.current.startPage = p;\n selectDragRef.current.currentPage = p;\n lastPointerClientRef.current = { x: e.clientX, y: e.clientY };\n setIsRotatingSelection(true);\n },\n [getPagePointFromClient]\n );\n\n useEffect(() => {\n const container = containerRef.current;\n const canvas = canvasRef.current;\n if (!container || !canvas) return;\n\n const initialTool = options.initialTool ?? 'pen';\n const editor = new Editor({\n toolDefinitions: options.toolDefinitions,\n initialToolId: initialTool,\n });\n editor.renderer.setTheme(options.theme ?? 'light');\n if (!editor.tools.hasTool(initialTool)) {\n editor.setCurrentTool('pen');\n }\n\n let disposed = false;\n let ignorePersistenceChanges = false;\n let disposeMount: void | (() => void);\n let persistenceDb: TsdrawLocalIndexedDb | null = null;\n let persistenceChannel: BroadcastChannel | null = null;\n let isPersisting = false;\n let needsAnotherPersist = false;\n let persistenceActive = false;\n const persistenceKey = options.persistenceKey;\n const sessionId = getOrCreateSessionId();\n const syncHistoryState = () => {\n setCanUndo(editor.canUndo());\n setCanRedo(editor.canRedo());\n };\n\n const activeTool = editor.getCurrentToolId();\n editorRef.current = editor;\n setCurrentToolState(activeTool);\n currentToolRef.current = activeTool;\n syncHistoryState();\n\n const initialStyle = editor.getCurrentDrawStyle();\n setDrawColor(initialStyle.color);\n setDrawDash(initialStyle.dash);\n setDrawFill(initialStyle.fill);\n setDrawSize(initialStyle.size);\n\n const resize = () => {\n const dpr = window.devicePixelRatio ?? 1;\n dprRef.current = dpr;\n const rect = container.getBoundingClientRect();\n canvas.width = Math.round(rect.width * dpr);\n canvas.height = Math.round(rect.height * dpr);\n canvas.style.width = `${rect.width}px`;\n canvas.style.height = `${rect.height}px`;\n if (!persistenceActive) {\n editor.setViewport({ x: 0, y: 0, zoom: 1 });\n }\n render();\n refreshSelectionBounds(editor);\n };\n\n const persistSnapshot = async () => {\n if (!persistenceDb || !persistenceKey || ignorePersistenceChanges || disposed) return;\n const snapshot = editor.getPersistenceSnapshot({\n selectedShapeIds: selectedShapeIdsRef.current,\n });\n await persistenceDb.storeSnapshot({\n records: snapshot.document.records,\n state: snapshot.state,\n history: editor.getHistorySnapshot(),\n sessionId,\n });\n if (disposed) return;\n persistenceChannel?.postMessage({\n type: 'tsdraw:persisted',\n senderSessionId: sessionId,\n });\n };\n\n const schedulePersist = () => {\n if (!persistenceDb || !persistenceKey || disposed) return;\n const runPersist = async () => {\n if (isPersisting) {\n needsAnotherPersist = true;\n return;\n }\n\n isPersisting = true;\n try {\n do {\n needsAnotherPersist = false;\n await persistSnapshot();\n } while (needsAnotherPersist && !disposed);\n } catch (error) {\n console.error('tsdraw persistence failed', error);\n } finally {\n isPersisting = false;\n }\n };\n\n void runPersist();\n };\n\n schedulePersistRef.current = schedulePersist;\n\n const reconcileSelectionAfterDocumentLoad = () => {\n const nextSelectedShapeIds = selectedShapeIdsRef.current.filter((shapeId) => editor.getShape(shapeId) != null);\n if (nextSelectedShapeIds.length !== selectedShapeIdsRef.current.length) {\n selectedShapeIdsRef.current = nextSelectedShapeIds;\n setSelectedShapeIds(nextSelectedShapeIds);\n }\n refreshSelectionBounds(editor, nextSelectedShapeIds);\n };\n\n const applyRemoteDocumentSnapshot = (document: TsdrawDocumentSnapshot) => {\n ignorePersistenceChanges = true;\n editor.loadDocumentSnapshot(document);\n editor.clearRedoHistory();\n reconcileSelectionAfterDocumentLoad();\n render();\n ignorePersistenceChanges = false;\n };\n\n const applyLoadedSnapshot = (snapshot: Partial<TsdrawEditorSnapshot>) => {\n ignorePersistenceChanges = true;\n const nextSelectionIds = editor.loadPersistenceSnapshot(snapshot);\n setSelectedShapeIds(nextSelectionIds);\n selectedShapeIdsRef.current = nextSelectionIds;\n const nextTool = editor.getCurrentToolId();\n currentToolRef.current = nextTool;\n setCurrentToolState(nextTool);\n const nextDrawStyle = editor.getCurrentDrawStyle();\n setDrawColor(nextDrawStyle.color);\n setDrawDash(nextDrawStyle.dash);\n setDrawFill(nextDrawStyle.fill);\n setDrawSize(nextDrawStyle.size);\n setSelectionRotationDeg(0);\n render();\n refreshSelectionBounds(editor, nextSelectionIds);\n ignorePersistenceChanges = false;\n };\n\n const getPagePoint = (e: PointerEvent) => {\n const rect = canvas.getBoundingClientRect();\n return editor.screenToPage(e.clientX - rect.left, e.clientY - rect.top);\n };\n\n const sampleEvents = (e: PointerEvent) => {\n const coalesced = e.getCoalescedEvents?.();\n return coalesced && coalesced.length > 0 ? coalesced : [e];\n };\n\n const handlePointerDown = (e: PointerEvent) => {\n if (!canvas.contains(e.target as Node)) return;\n isPointerActiveRef.current = true;\n editor.beginHistoryEntry();\n canvas.setPointerCapture(e.pointerId);\n lastPointerClientRef.current = { x: e.clientX, y: e.clientY };\n updatePointerPreview(e.clientX, e.clientY);\n\n const first = sampleEvents(e)[0]!;\n const { x, y } = getPagePoint(first);\n const pressure = first.pressure ?? 0.5;\n const isPen = first.pointerType === 'pen' || first.pointerType === 'touch';\n\n if (currentToolRef.current === 'select') {\n const hit = getTopShapeAtPoint(editor, { x, y });\n const isHitSelected = !!(hit && selectedShapeIdsRef.current.includes(hit.id));\n\n if (isHitSelected) {\n selectDragRef.current = {\n mode: 'move',\n startPage: { x, y },\n currentPage: { x, y },\n startPositions: buildStartPositions(editor, selectedShapeIdsRef.current),\n additive: false,\n initialSelection: [...selectedShapeIdsRef.current],\n };\n setIsMovingSelection(true);\n return;\n }\n\n selectDragRef.current = {\n mode: 'marquee',\n startPage: { x, y },\n currentPage: { x, y },\n startPositions: new Map(),\n additive: first.shiftKey,\n initialSelection: [...selectedShapeIdsRef.current],\n };\n setSelectionBrush(toScreenRect(editor, { minX: x, minY: y, maxX: x, maxY: y }));\n if (!e.shiftKey) {\n setSelectedShapeIds([]);\n selectedShapeIdsRef.current = [];\n setSelectionBounds(null);\n setSelectionRotationDeg(0);\n }\n return;\n }\n\n editor.input.pointerDown(x, y, pressure, isPen);\n editor.input.setModifiers(first.shiftKey, first.ctrlKey, first.metaKey);\n editor.tools.pointerDown({ point: { x, y, z: pressure } });\n render();\n refreshSelectionBounds(editor);\n };\n\n const handlePointerMove = (e: PointerEvent) => {\n updatePointerPreview(e.clientX, e.clientY);\n const prevClient = lastPointerClientRef.current;\n const dx = prevClient ? e.clientX - prevClient.x : 0;\n const dy = prevClient ? e.clientY - prevClient.y : 0;\n lastPointerClientRef.current = { x: e.clientX, y: e.clientY };\n\n for (const sample of sampleEvents(e)) {\n const { x, y } = getPagePoint(sample);\n const pressure = sample.pressure ?? 0.5;\n const isPen = sample.pointerType === 'pen' || sample.pointerType === 'touch';\n editor.input.pointerMove(x, y, pressure, isPen);\n }\n\n if (currentToolRef.current === 'select') {\n const mode = selectDragRef.current.mode;\n const { x: px, y: py } = editor.input.getCurrentPagePoint();\n\n if (mode === 'rotate') {\n const { center, startAngle, startSelectionRotationDeg, startShapes } = rotateRef.current;\n if (!center) return;\n const angle = Math.atan2(py - center.y, px - center.x);\n const delta = angle - startAngle;\n setSelectionRotationDeg(startSelectionRotationDeg + (delta * 180) / Math.PI);\n applyRotation(editor, startShapes, center, delta);\n render();\n return;\n }\n\n // Resize and move both work using captured snapshots so the transform stays stable throughout the drag instead of adding up shape updates on each pointer move\n if (mode === 'resize') {\n const { handle, startBounds, startShapes } = resizeRef.current;\n if (!handle || !startBounds) return;\n applyResize(editor, handle, startBounds, startShapes, { x: px, y: py }, e.shiftKey);\n render();\n refreshSelectionBounds(editor);\n return;\n }\n\n if (mode === 'move') {\n const drag = selectDragRef.current;\n applyMove(editor, drag.startPositions, px - drag.startPage.x, py - drag.startPage.y);\n render();\n refreshSelectionBounds(editor);\n return;\n }\n\n // Marquee selection updates live as brush changes so that the overlay matches feedback\n if (mode === 'marquee') {\n selectDragRef.current.currentPage = { x: px, y: py };\n const pageRect = normalizeSelectionBounds(selectDragRef.current.startPage, selectDragRef.current.currentPage);\n setSelectionBrush(toScreenRect(editor, pageRect));\n const ids = getShapesInBounds(editor, pageRect);\n const nextIds = selectDragRef.current.additive ? Array.from(new Set([...selectDragRef.current.initialSelection, ...ids])) : ids;\n setSelectedShapeIds(nextIds);\n selectedShapeIdsRef.current = nextIds;\n setSelectionRotationDeg(0);\n refreshSelectionBounds(editor, nextIds);\n return;\n }\n }\n\n editor.input.setModifiers(e.shiftKey, e.ctrlKey, e.metaKey);\n editor.tools.pointerMove({ screenDeltaX: dx, screenDeltaY: dy });\n render();\n refreshSelectionBounds(editor);\n };\n\n const handlePointerUp = (e: PointerEvent) => {\n isPointerActiveRef.current = false;\n lastPointerClientRef.current = null;\n updatePointerPreview(e.clientX, e.clientY);\n const { x, y } = getPagePoint(e);\n editor.input.pointerMove(x, y);\n editor.input.pointerUp();\n\n if (currentToolRef.current === 'select') {\n const drag = selectDragRef.current;\n\n // Rotation resets overlay back to normal selection box after release while rotated geometry stays\n if (drag.mode === 'rotate') {\n setIsRotatingSelection(false);\n selectDragRef.current.mode = 'none';\n setSelectionRotationDeg(0);\n rotateRef.current = {\n center: null,\n startAngle: 0,\n startSelectionRotationDeg: selectionRotationRef.current,\n startShapes: new Map(),\n };\n render();\n refreshSelectionBounds(editor);\n editor.endHistoryEntry();\n return;\n }\n\n if (drag.mode === 'resize') {\n setIsResizingSelection(false);\n selectDragRef.current.mode = 'none';\n resizeRef.current = { handle: null, startBounds: null, startShapes: new Map() };\n render();\n refreshSelectionBounds(editor);\n editor.endHistoryEntry();\n return;\n }\n\n if (drag.mode === 'move') {\n setIsMovingSelection(false);\n selectDragRef.current.mode = 'none';\n render();\n refreshSelectionBounds(editor);\n editor.endHistoryEntry();\n return;\n }\n\n if (drag.mode === 'marquee') {\n const rect = normalizeSelectionBounds(drag.startPage, { x, y });\n const moved = Math.abs(x - drag.startPage.x) > 2 || Math.abs(y - drag.startPage.y) > 2;\n let ids: ShapeId[] = [];\n\n if (!moved) {\n const hit = getTopShapeAtPoint(editor, { x, y });\n if (hit) {\n ids = drag.additive ? Array.from(new Set([...drag.initialSelection, hit.id])) : [hit.id];\n } else {\n ids = drag.additive ? drag.initialSelection : [];\n }\n } else {\n ids = getShapesInBounds(editor, rect);\n if (drag.additive) {\n ids = Array.from(new Set([...drag.initialSelection, ...ids]));\n }\n }\n\n setSelectedShapeIds(ids);\n selectedShapeIdsRef.current = ids;\n setSelectionRotationDeg(0);\n setSelectionBrush(null);\n selectDragRef.current.mode = 'none';\n render();\n refreshSelectionBounds(editor, ids);\n if (pendingRemoteDocumentRef.current) {\n const pendingRemoteDocument = pendingRemoteDocumentRef.current;\n pendingRemoteDocumentRef.current = null;\n applyRemoteDocumentSnapshot(pendingRemoteDocument);\n }\n editor.endHistoryEntry();\n return;\n }\n }\n\n editor.tools.pointerUp();\n render();\n refreshSelectionBounds(editor);\n if (pendingRemoteDocumentRef.current) {\n const pendingRemoteDocument = pendingRemoteDocumentRef.current;\n pendingRemoteDocumentRef.current = null;\n applyRemoteDocumentSnapshot(pendingRemoteDocument);\n }\n editor.endHistoryEntry();\n };\n\n const handlePointerCancel = () => {\n if (!isPointerActiveRef.current) return;\n isPointerActiveRef.current = false;\n lastPointerClientRef.current = null;\n editor.input.pointerUp();\n\n if (currentToolRef.current === 'select') {\n const drag = selectDragRef.current;\n if (drag.mode === 'rotate') setIsRotatingSelection(false);\n if (drag.mode === 'resize') setIsResizingSelection(false);\n if (drag.mode === 'move') setIsMovingSelection(false);\n if (drag.mode === 'marquee') setSelectionBrush(null);\n if (drag.mode !== 'none') {\n selectDragRef.current.mode = 'none';\n render();\n refreshSelectionBounds(editor);\n }\n editor.endHistoryEntry();\n } else {\n editor.tools.pointerUp();\n render();\n refreshSelectionBounds(editor);\n editor.endHistoryEntry();\n }\n\n if (pendingRemoteDocumentRef.current) {\n const pending = pendingRemoteDocumentRef.current;\n pendingRemoteDocumentRef.current = null;\n applyRemoteDocumentSnapshot(pending);\n }\n };\n\n // undo/redo keybinds\n const handleKeyDown = (e: KeyboardEvent) => {\n const isMetaPressed = e.metaKey || e.ctrlKey;\n const loweredKey = e.key.toLowerCase();\n const isUndoOrRedoKey = loweredKey === 'z' || loweredKey === 'y';\n\n if (isMetaPressed && isUndoOrRedoKey) {\n const shouldRedo = loweredKey === 'y' || (loweredKey === 'z' && e.shiftKey);\n const changed = shouldRedo ? editor.redo() : editor.undo();\n if (changed) {\n e.preventDefault();\n e.stopPropagation();\n reconcileSelectionAfterDocumentLoad();\n setSelectionRotationDeg(0);\n render();\n syncHistoryState();\n return;\n }\n }\n\n editor.input.setModifiers(e.shiftKey, e.ctrlKey, e.metaKey);\n editor.tools.keyDown({ key: e.key });\n render();\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n editor.input.setModifiers(e.shiftKey, e.ctrlKey, e.metaKey);\n editor.tools.keyUp({ key: e.key });\n render();\n };\n\n const initializePersistence = async () => {\n if (!persistenceKey) { setIsPersistenceReady(true); return; }\n\n try {\n persistenceDb = new TsdrawLocalIndexedDb(persistenceKey);\n const loaded = await persistenceDb.load(sessionId);\n const snapshot: Partial<TsdrawEditorSnapshot> = {};\n if (loaded.records.length > 0) {\n snapshot.document = { records: loaded.records };\n }\n if (loaded.state) {\n snapshot.state = loaded.state;\n }\n if (snapshot.document || snapshot.state) {\n applyLoadedSnapshot(snapshot);\n }\n editor.loadHistorySnapshot(loaded.history);\n syncHistoryState();\n\n if (disposed) return;\n persistenceActive = true;\n if (typeof BroadcastChannel !== 'undefined') {\n persistenceChannel = new BroadcastChannel(`tsdraw:persistence:${persistenceKey}`);\n let isLoadingRemote = false;\n let pendingRemoteLoad = false;\n persistenceChannel.onmessage = () => {\n if (disposed) return;\n if (isLoadingRemote) {\n pendingRemoteLoad = true;\n return;\n }\n isLoadingRemote = true;\n const processLoad = async () => {\n try {\n do {\n pendingRemoteLoad = false;\n if (!persistenceDb || disposed) return;\n const nextLoaded = await persistenceDb.load(sessionId);\n if (disposed) return;\n if (nextLoaded.records.length > 0) {\n const nextDocument: TsdrawDocumentSnapshot = { records: nextLoaded.records };\n if (isPointerActiveRef.current) {\n pendingRemoteDocumentRef.current = nextDocument;\n return;\n }\n applyRemoteDocumentSnapshot(nextDocument);\n }\n } while (pendingRemoteLoad && !disposed);\n } finally {\n isLoadingRemote = false;\n }\n };\n void processLoad();\n };\n }\n } finally {\n if (!disposed) { setIsPersistenceReady(true); }\n }\n };\n\n const cleanupEditorListener = editor.listen(() => {\n if (ignorePersistenceChanges) return;\n schedulePersist();\n });\n const cleanupHistoryListener = editor.listenHistory(() => {\n syncHistoryState();\n if (ignorePersistenceChanges) return;\n schedulePersist();\n });\n\n resize();\n const ro = new ResizeObserver(resize);\n ro.observe(container);\n canvas.addEventListener('pointerdown', handlePointerDown);\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n window.addEventListener('pointercancel', handlePointerCancel);\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n\n void initializePersistence().catch((error) => {\n console.error('failed to initialize tsdraw persistence', error);\n });\n\n disposeMount = onMountRef.current?.({\n editor,\n container,\n canvas,\n setTool: (tool) => {\n if (!editor.tools.hasTool(tool)) return;\n editor.setCurrentTool(tool);\n setCurrentToolState(tool);\n currentToolRef.current = tool;\n },\n getCurrentTool: () => editor.getCurrentToolId(),\n undo: () => {\n const changed = editor.undo();\n if (!changed) return false;\n reconcileSelectionAfterDocumentLoad();\n setSelectionRotationDeg(0);\n render();\n syncHistoryState();\n return true;\n },\n redo: () => {\n const changed = editor.redo();\n if (!changed) return false;\n reconcileSelectionAfterDocumentLoad();\n setSelectionRotationDeg(0);\n render();\n syncHistoryState();\n return true;\n },\n canUndo: () => editor.canUndo(),\n canRedo: () => editor.canRedo(),\n applyDrawStyle: (partial) => {\n editor.setCurrentDrawStyle(partial);\n if (partial.color) setDrawColor(partial.color);\n if (partial.dash) setDrawDash(partial.dash);\n if (partial.fill) setDrawFill(partial.fill);\n if (partial.size) setDrawSize(partial.size);\n render();\n },\n });\n\n return () => {\n disposed = true;\n schedulePersistRef.current = null;\n cleanupEditorListener();\n cleanupHistoryListener();\n disposeMount?.();\n ro.disconnect();\n canvas.removeEventListener('pointerdown', handlePointerDown);\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n window.removeEventListener('pointercancel', handlePointerCancel);\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n isPointerActiveRef.current = false;\n pendingRemoteDocumentRef.current = null;\n persistenceChannel?.close();\n void persistenceDb?.close();\n editorRef.current = null;\n };\n }, [\n getPagePointFromClient,\n options.initialTool,\n options.persistenceKey,\n options.toolDefinitions,\n refreshSelectionBounds,\n render,\n updatePointerPreview,\n ]);\n\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n editor.renderer.setTheme(options.theme ?? 'light');\n render();\n }, [options.theme, render]);\n\n const setTool = useCallback(\n (tool: ToolId) => {\n const editor = editorRef.current;\n if (!editor) return;\n if (!editor.tools.hasTool(tool)) return;\n editor.setCurrentTool(tool);\n setCurrentToolState(tool);\n currentToolRef.current = tool;\n if (tool !== 'select') resetSelectUi();\n },\n [resetSelectUi]\n );\n\n const applyDrawStyle = useCallback(\n (partial: Partial<{ color: ColorStyle; dash: DashStyle; fill: FillStyle; size: SizeStyle }>) => {\n const editor = editorRef.current;\n if (!editor) return;\n editor.setCurrentDrawStyle(partial);\n if (partial.color) setDrawColor(partial.color);\n if (partial.dash) setDrawDash(partial.dash);\n if (partial.fill) setDrawFill(partial.fill);\n if (partial.size) setDrawSize(partial.size);\n render();\n },\n [render]\n );\n\n const undo = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return false;\n const changed = editor.undo();\n if (!changed) return false;\n const nextSelectedShapeIds = selectedShapeIdsRef.current.filter((shapeId) => editor.getShape(shapeId) != null);\n if (nextSelectedShapeIds.length !== selectedShapeIdsRef.current.length) {\n selectedShapeIdsRef.current = nextSelectedShapeIds;\n setSelectedShapeIds(nextSelectedShapeIds);\n }\n setSelectionRotationDeg(0);\n render();\n setCanUndo(editor.canUndo());\n setCanRedo(editor.canRedo());\n return true;\n }, [render]);\n\n const redo = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return false;\n const changed = editor.redo();\n if (!changed) return false;\n const nextSelectedShapeIds = selectedShapeIdsRef.current.filter((shapeId) => editor.getShape(shapeId) != null);\n if (nextSelectedShapeIds.length !== selectedShapeIdsRef.current.length) {\n selectedShapeIdsRef.current = nextSelectedShapeIds;\n setSelectedShapeIds(nextSelectedShapeIds);\n }\n setSelectionRotationDeg(0);\n render();\n setCanUndo(editor.canUndo());\n setCanRedo(editor.canRedo());\n return true;\n }, [render]);\n\n const showToolOverlay = isPointerInsideCanvas && (currentTool === 'pen' || currentTool === 'eraser');\n const canvasCursor = getCanvasCursor(currentTool, {\n isMovingSelection,\n isResizingSelection,\n isRotatingSelection,\n showToolOverlay,\n });\n const cursorContext: TsdrawCursorContext = {\n currentTool,\n defaultCursor: canvasCursor,\n showToolOverlay,\n isMovingSelection,\n isResizingSelection,\n isRotatingSelection,\n };\n const toolOverlay: TsdrawToolOverlayState = {\n visible: showToolOverlay,\n pointerX: pointerScreenPoint.x,\n pointerY: pointerScreenPoint.y,\n isPenPreview: currentTool === 'pen',\n penRadius: Math.max(2, STROKE_WIDTHS[drawSize] / 2),\n penColor: resolveDrawColor(drawColor, options.theme ?? 'light'),\n eraserRadius: ERASER_MARGIN,\n };\n\n return {\n containerRef,\n canvasRef,\n currentTool,\n drawColor,\n drawDash,\n drawFill,\n drawSize,\n selectedShapeIds,\n selectionBrush,\n selectionBounds,\n selectionRotationDeg,\n canvasCursor,\n cursorContext,\n toolOverlay,\n isPersistenceReady,\n canUndo,\n canRedo,\n undo,\n redo,\n setTool,\n applyDrawStyle,\n handleResizePointerDown,\n handleRotatePointerDown,\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport type { ColorStyle, DashStyle, DefaultToolId, FillStyle, SizeStyle, ToolDefinition, ToolId } from '@tsdraw/core';\nimport { SelectionOverlay } from './SelectionOverlay.js';\nimport { StylePanel, type TsdrawStylePanelCustomPart, type TsdrawStylePanelPartItem } from './StylePanel.js';\nimport { ToolOverlay } from './ToolOverlay.js';\nimport { Toolbar, getDefaultToolbarIcon, type ToolbarPart } from './Toolbar.js';\nimport {\n useTsdrawCanvasController,\n type TsdrawCursorContext,\n type TsdrawMountApi,\n type TsdrawToolOverlayState,\n} from '../canvas/useTsdrawCanvasController.js';\n\nconst DEFAULT_TOOLBAR_PARTS: ToolbarPartItem[][] = [['undo', 'redo'], ['select', 'hand', 'pen', 'eraser', 'square', 'circle']];\nconst EMPTY_CUSTOM_TOOLS: TsdrawCustomTool[] = [];\nconst EMPTY_CUSTOM_ELEMENTS: TsdrawCustomElement[] = [];\nconst EMPTY_STYLE_PANEL_PARTS: TsdrawStylePanelPartItem[] = [];\nconst EMPTY_STYLE_PANEL_CUSTOM_PARTS: TsdrawStylePanelCustomPart[] = [];\nconst DEFAULT_STYLE_PANEL_PARTS_BY_TOOL: Partial<Record<DefaultToolId, TsdrawStylePanelPartItem[]>> = {\n pen: ['colors', 'dashes', 'sizes'],\n square: ['colors', 'dashes', 'fills', 'sizes'],\n circle: ['colors', 'dashes', 'fills', 'sizes'],\n};\n\nconst DEFAULT_TOOL_LABELS: Record<DefaultToolId, string> = {\n select: 'Select',\n pen: 'Pen',\n square: 'Rectangle',\n circle: 'Ellipse',\n eraser: 'Eraser',\n hand: 'Hand',\n};\n\ntype VerticalPart = 'top' | 'bottom' | 'center';\ntype HorizontalPart = 'left' | 'right' | 'center';\nexport type UiAnchor = | `${VerticalPart}-${HorizontalPart}` | `${HorizontalPart}-${VerticalPart}`;\n\nfunction parseAnchor(anchor: UiAnchor): { vertical: VerticalPart; horizontal: HorizontalPart } {\n const parts = anchor.split('-') as string[];\n let vertical: VerticalPart = 'center';\n let horizontal: HorizontalPart = 'center';\n for (const part of parts) {\n if (part === 'top' || part === 'bottom') vertical = part;\n else if (part === 'left' || part === 'right') horizontal = part;\n }\n return { vertical, horizontal };\n}\n\nexport interface TsdrawCustomTool {\n id: ToolId;\n label: string;\n icon: ReactNode;\n iconSelected?: ReactNode;\n definition: ToolDefinition;\n stylePanel?: {\n parts?: TsdrawStylePanelPartItem[];\n customParts?: TsdrawStylePanelCustomPart[];\n };\n}\n\nexport type TsdrawToolbarBuiltInAction = 'undo' | 'redo';\nexport type ToolbarPartItem = ToolId | TsdrawToolbarBuiltInAction;\n\nexport interface TsdrawUiPlacement {\n anchor?: UiAnchor;\n offsetX?: number;\n offsetY?: number;\n style?: CSSProperties;\n}\n\nexport interface TsdrawUiOptions {\n toolbar?: {\n hide?: boolean;\n placement?: TsdrawUiPlacement;\n parts?: ToolbarPartItem[][];\n };\n stylePanel?: {\n hide?: boolean;\n placement?: TsdrawUiPlacement;\n };\n customElements?: TsdrawCustomElement[];\n cursor?: {\n getCursor?: (context: TsdrawCursorContext) => string;\n };\n overlays?: {\n renderToolOverlay?: (args: {\n defaultOverlay: ReactNode;\n overlayState: TsdrawToolOverlayState;\n currentTool: ToolId;\n }) => ReactNode;\n };\n}\n\nexport interface TsdrawCustomElementRenderArgs {\n currentTool: ToolId;\n setTool: (tool: ToolId) => void;\n applyDrawStyle: (partial: Partial<{ color: ColorStyle; dash: DashStyle; fill: FillStyle; size: SizeStyle }>) => void;\n}\n\nexport interface TsdrawCustomElement {\n id: string;\n placement?: TsdrawUiPlacement;\n render: (args: TsdrawCustomElementRenderArgs) => ReactNode;\n}\n\nexport interface TsdrawProps {\n width?: number | string;\n height?: number | string;\n className?: string;\n style?: CSSProperties;\n theme?: 'light' | 'dark' | 'system';\n persistenceKey?: string;\n customTools?: TsdrawCustomTool[];\n initialToolId?: ToolId;\n uiOptions?: TsdrawUiOptions;\n onMount?: (api: TsdrawMountApi) => void | (() => void);\n}\n\nexport type TsdrawCanvasProps = TsdrawProps;\n\nfunction isToolbarAction(item: ToolbarPartItem): item is TsdrawToolbarBuiltInAction {\n return item === 'undo' || item === 'redo';\n}\n\nfunction resolvePlacementStyle(\n placement: TsdrawUiPlacement | undefined,\n fallbackAnchor: UiAnchor,\n fallbackOffsetX: number,\n fallbackOffsetY: number\n): CSSProperties {\n const anchor = placement?.anchor ?? fallbackAnchor;\n const offsetX = placement?.offsetX ?? fallbackOffsetX;\n const offsetY = placement?.offsetY ?? fallbackOffsetY;\n const { vertical, horizontal } = parseAnchor(anchor);\n const result: CSSProperties = {};\n const transforms: string[] = [];\n\n if (horizontal === 'left') {\n result.left = offsetX;\n } else if (horizontal === 'right') {\n result.right = offsetX;\n } else {\n result.left = '50%';\n transforms.push('translateX(-50%)');\n if (offsetX) transforms.push(`translateX(${offsetX}px)`);\n }\n\n if (vertical === 'top') {\n result.top = offsetY;\n } else if (vertical === 'bottom') {\n result.bottom = offsetY;\n } else {\n result.top = '50%';\n transforms.push('translateY(-50%)');\n if (offsetY) transforms.push(`translateY(${offsetY}px)`);\n }\n\n if (transforms.length > 0) result.transform = transforms.join(' ');\n\n return placement?.style ? { ...result, ...placement.style } : result;\n}\n\nexport function Tsdraw(props: TsdrawProps) {\n const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>(() => {\n if (typeof window === 'undefined') return 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n });\n const customTools = props.customTools ?? EMPTY_CUSTOM_TOOLS;\n const toolbarPartIds = props.uiOptions?.toolbar?.parts ?? DEFAULT_TOOLBAR_PARTS;\n const customToolMap = useMemo(\n () => new Map(customTools.map((customTool) => [customTool.id, customTool])),\n [customTools]\n );\n const toolbarToolIds = useMemo(() => {\n const ids = new Set<ToolId>();\n for (const toolbarPart of toolbarPartIds) {\n for (const item of toolbarPart) {\n if (isToolbarAction(item)) continue;\n if (item in DEFAULT_TOOL_LABELS || customToolMap.has(item)) {\n ids.add(item);\n }\n }\n }\n return ids;\n }, [customToolMap, toolbarPartIds]);\n const toolDefinitions = useMemo(\n () => customTools.filter((customTool) => toolbarToolIds.has(customTool.id)).map((customTool) => customTool.definition),\n [customTools, toolbarToolIds]\n );\n const firstToolbarTool = useMemo(() => {\n for (const toolbarPart of toolbarPartIds) {\n for (const item of toolbarPart) {\n if (isToolbarAction(item)) continue;\n if (item in DEFAULT_TOOL_LABELS || customToolMap.has(item)) {\n return item;\n }\n }\n }\n return undefined;\n }, [customToolMap, toolbarPartIds]);\n const initialTool: ToolId = props.initialToolId ?? firstToolbarTool ?? 'pen';\n const requestedTheme = props.theme ?? 'light';\n\n // Themes and so that system theme works\n useEffect(() => {\n if (requestedTheme !== 'system' || typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const syncSystemTheme = () => setSystemTheme(mediaQuery.matches ? 'dark' : 'light');\n\n syncSystemTheme();\n mediaQuery.addEventListener('change', syncSystemTheme);\n\n return () => mediaQuery.removeEventListener('change', syncSystemTheme);\n }, [requestedTheme]);\n\n const resolvedTheme = requestedTheme === 'system' ? systemTheme : requestedTheme;\n\n const {\n containerRef,\n canvasRef,\n currentTool,\n drawColor,\n drawDash,\n drawFill,\n drawSize,\n selectedShapeIds,\n selectionBrush,\n selectionBounds,\n selectionRotationDeg,\n canvasCursor: defaultCanvasCursor,\n cursorContext,\n toolOverlay,\n isPersistenceReady,\n canUndo,\n canRedo,\n undo,\n redo,\n setTool,\n applyDrawStyle,\n handleResizePointerDown,\n handleRotatePointerDown,\n } = useTsdrawCanvasController({\n toolDefinitions,\n initialTool,\n theme: resolvedTheme,\n persistenceKey: props.persistenceKey,\n onMount: props.onMount,\n });\n\n const toolbarPlacementStyle = resolvePlacementStyle(props.uiOptions?.toolbar?.placement, 'bottom-center', 0, 14);\n const stylePanelPlacementStyle = resolvePlacementStyle(props.uiOptions?.stylePanel?.placement, 'top-right', 8, 8);\n const isToolbarHidden = props.uiOptions?.toolbar?.hide === true;\n const isStylePanelHidden = props.uiOptions?.stylePanel?.hide === true;\n const canvasCursor = props.uiOptions?.cursor?.getCursor?.(cursorContext) ?? defaultCanvasCursor;\n const defaultToolOverlay = (\n <ToolOverlay\n visible={toolOverlay.visible}\n pointerX={toolOverlay.pointerX}\n pointerY={toolOverlay.pointerY}\n isPenPreview={toolOverlay.isPenPreview}\n penRadius={toolOverlay.penRadius}\n penColor={toolOverlay.penColor}\n eraserRadius={toolOverlay.eraserRadius}\n />\n );\n const overlayNode = props.uiOptions?.overlays?.renderToolOverlay?.({ defaultOverlay: defaultToolOverlay, overlayState: toolOverlay, currentTool }) ?? defaultToolOverlay;\n const customElements = props.uiOptions?.customElements ?? EMPTY_CUSTOM_ELEMENTS;\n const onColorSelect = useCallback((color: ColorStyle) => {\n applyDrawStyle({ color });\n }, [applyDrawStyle]);\n const onDashSelect = useCallback((dash: DashStyle) => {\n applyDrawStyle({ dash });\n }, [applyDrawStyle]);\n const onFillSelect = useCallback((fill: FillStyle) => {\n applyDrawStyle({ fill });\n }, [applyDrawStyle]);\n const onSizeSelect = useCallback((size: SizeStyle) => {\n applyDrawStyle({ size });\n }, [applyDrawStyle]);\n const activeCustomTool = customToolMap.get(currentTool);\n const stylePanelParts = useMemo<TsdrawStylePanelPartItem[]>(\n () => {\n const fromCustomTool = activeCustomTool?.stylePanel?.parts;\n if (fromCustomTool && fromCustomTool.length > 0) return fromCustomTool;\n if (activeCustomTool?.stylePanel?.customParts && activeCustomTool.stylePanel.customParts.length > 0) return activeCustomTool.stylePanel.customParts.map((customPart) => customPart.id);\n if (currentTool in DEFAULT_STYLE_PANEL_PARTS_BY_TOOL) return DEFAULT_STYLE_PANEL_PARTS_BY_TOOL[currentTool as DefaultToolId] ?? EMPTY_STYLE_PANEL_PARTS;\n return EMPTY_STYLE_PANEL_PARTS;\n },\n [activeCustomTool, currentTool]\n );\n const stylePanelCustomParts = activeCustomTool?.stylePanel?.customParts ?? EMPTY_STYLE_PANEL_CUSTOM_PARTS;\n const toolbarParts = useMemo<ToolbarPart[]>(\n () =>\n toolbarPartIds\n .map((toolbarPart, partIndex) => {\n const items = toolbarPart\n .map((item) => {\n if (item === 'undo') {\n return {\n type: 'action' as const,\n id: 'undo' as const,\n label: 'Undo',\n disabled: !canUndo,\n onSelect: undo,\n };\n }\n\n if (item === 'redo') {\n return {\n type: 'action' as const,\n id: 'redo' as const,\n label: 'Redo',\n disabled: !canRedo,\n onSelect: redo,\n };\n }\n\n if (item in DEFAULT_TOOL_LABELS) {\n return {\n type: 'tool' as const,\n id: item,\n label: DEFAULT_TOOL_LABELS[item as DefaultToolId],\n icon: (isActive: boolean) => getDefaultToolbarIcon(item, isActive),\n };\n }\n\n const customTool = customToolMap.get(item);\n if (!customTool) return null;\n return {\n type: 'tool' as const,\n id: customTool.id,\n label: customTool.label,\n icon: (isActive: boolean) => (isActive && customTool.iconSelected ? customTool.iconSelected : customTool.icon),\n };\n })\n .filter((nextItem): nextItem is NonNullable<typeof nextItem> => nextItem != null);\n return {\n id: `toolbar-part-${partIndex.toString(36)}`,\n items,\n };\n })\n .filter((part) => part.items.length > 0),\n [canRedo, canUndo, customToolMap, redo, toolbarPartIds, undo]\n );\n\n return (\n <div\n ref={containerRef}\n className={`tsdraw tsdraw-${resolvedTheme}mode ${props.className ?? ''}`}\n style={{\n width: props.width ?? '100%',\n height: props.height ?? '100%',\n position: 'relative',\n overflow: 'hidden',\n ...props.style,\n }}\n >\n <canvas\n ref={canvasRef}\n style={{\n display: 'block',\n width: '100%',\n height: '100%',\n touchAction: 'none',\n cursor: canvasCursor,\n }}\n data-testid=\"tsdraw-canvas\"\n />\n {overlayNode}\n <SelectionOverlay\n selectionBrush={selectionBrush}\n selectionBounds={selectionBounds}\n selectionRotationDeg={selectionRotationDeg}\n currentTool={currentTool}\n selectedCount={selectedShapeIds.length}\n onRotatePointerDown={handleRotatePointerDown}\n onResizePointerDown={handleResizePointerDown}\n />\n <StylePanel\n visible={!isStylePanelHidden && isPersistenceReady && stylePanelParts.length > 0}\n parts={stylePanelParts}\n customParts={stylePanelCustomParts}\n style={stylePanelPlacementStyle}\n theme={resolvedTheme}\n drawColor={drawColor}\n drawDash={drawDash}\n drawFill={drawFill}\n drawSize={drawSize}\n onColorSelect={onColorSelect}\n onDashSelect={onDashSelect}\n onFillSelect={onFillSelect}\n onSizeSelect={onSizeSelect}\n />\n {customElements.map((customElement) => (\n <div\n key={customElement.id}\n style={{\n position: 'absolute',\n zIndex: 130,\n pointerEvents: 'all',\n ...resolvePlacementStyle(customElement.placement, 'top-left', 8, 8),\n }}\n >\n {customElement.render({ currentTool, setTool, applyDrawStyle })}\n </div>\n ))}\n {!isToolbarHidden ? (\n <Toolbar\n parts={toolbarParts}\n style={toolbarPlacementStyle}\n currentTool={isPersistenceReady ? currentTool : null}\n onToolChange={setTool}\n disabled={!isPersistenceReady}\n />\n ) : null}\n </div>\n );\n}\n\nexport function TsdrawCanvas(props: TsdrawCanvasProps) {\n return <Tsdraw {...props} />;\n}"]}