@@ -60,11 +81,19 @@
currentTool={c.tools.currentToolId}
onToolChange={c.tools.handleChange}
onHistoryClick={c.history.handleClick}
+ onStencilsClick={handleStencilsClick}
store={c.store}
getViewport={c.getViewport}
canvas={canvasEl ?? undefined}
brushStore={c.brushStore} />
-
+
{
+ e.preventDefault();
+ if (e.dataTransfer) e.dataTransfer.dropEffect = 'copy';
+ }}
+ ondrop={handleDrop}
+ role="application">
{/if}
+ (c.stencilPaletteOpen = false)} />
diff --git a/apps/web/src/lib/components/Toolbar.svelte b/apps/web/src/lib/components/Toolbar.svelte
index 19ac353..3843789 100644
--- a/apps/web/src/lib/components/Toolbar.svelte
+++ b/apps/web/src/lib/components/Toolbar.svelte
@@ -10,7 +10,7 @@
} from '$lib/constants';
import type { Platform } from '$lib/platform';
import type { BrushSettings, BrushStore } from '$lib/status';
- import { themeStore } from '$lib/theme.svelte';
+ import { themeStore } from '$lib/theme.svelte';
import type {
ArrowShape,
BoardMeta,
@@ -33,7 +33,7 @@
shapeBounds,
SnapshotCommand
} from 'inkfinite-core';
- import { fade } from 'svelte/transition';
+ import { fade } from 'svelte/transition';
import icon from '../assets/favicon.svg';
import ArrowPopover from './ArrowPopover.svelte';
import BrushPopover from './BrushPopover.svelte';
@@ -61,6 +61,7 @@
platform?: Platform;
desktop?: DesktopControls;
onOpenBrowser?: () => void;
+ onStencilsClick?: () => void;
};
let {
@@ -73,7 +74,8 @@
brushStore,
platform = 'web',
desktop,
- onOpenBrowser
+ onOpenBrowser,
+ onStencilsClick
}: Props = $props();
let editorState = $derived
(store.getState());
@@ -130,11 +132,11 @@
}
});
- let showColorControls = $derived(
- toolSupportsStyles(currentTool) ||
- toolSupportsFill(currentTool) ||
- getSelectedShapes(editorState).some(s => shapeSupportsFill(s) || shapeSupportsStroke(s))
- );
+ let showColorControls = $derived(
+ toolSupportsStyles(currentTool) ||
+ toolSupportsFill(currentTool) ||
+ getSelectedShapes(editorState).some((s) => shapeSupportsFill(s) || shapeSupportsStroke(s))
+ );
let position = $state({ x: 20, y: 20 });
let isDragging = $state(false);
@@ -181,29 +183,22 @@
function handleDragStart(event: PointerEvent) {
isDragging = true;
- dragOffset = {
- x: event.clientX - position.x,
- y: event.clientY - position.y
- };
+ dragOffset = { x: event.clientX - position.x, y: event.clientY - position.y };
- if(typeof document !== 'undefined') document.body.style.userSelect = 'none';
-
+ if (typeof document !== 'undefined') document.body.style.userSelect = 'none';
- (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);
+ (event.currentTarget as HTMLElement).setPointerCapture(event.pointerId);
}
function handleDragMove(event: PointerEvent) {
if (!isDragging) return;
- position = {
- x: event.clientX - dragOffset.x,
- y: event.clientY - dragOffset.y
- };
+ position = { x: event.clientX - dragOffset.x, y: event.clientY - dragOffset.y };
}
function handleDragEnd(event: PointerEvent) {
isDragging = false;
- if(typeof document !== 'undefined') document.body.style.userSelect = '';
- (event.currentTarget as HTMLElement).releasePointerCapture(event.pointerId);
+ if (typeof document !== 'undefined') document.body.style.userSelect = '';
+ (event.currentTarget as HTMLElement).releasePointerCapture(event.pointerId);
}
function openInfo() {
@@ -347,18 +342,13 @@
);
}
- function toolSupportsStyles(tool: ToolId): boolean {
- return (
- tool === 'rect' ||
- tool === 'ellipse' ||
- tool === 'line' ||
- tool === 'arrow'
- );
- }
+ function toolSupportsStyles(tool: ToolId): boolean {
+ return tool === 'rect' || tool === 'ellipse' || tool === 'line' || tool === 'arrow';
+ }
- function toolSupportsFill(tool: ToolId): boolean {
- return tool === 'rect' || tool === 'ellipse' || tool === 'text';
- }
+ function toolSupportsFill(tool: ToolId): boolean {
+ return tool === 'rect' || tool === 'ellipse' || tool === 'text';
+ }
function getSharedColor(
shapes: T[],
@@ -488,26 +478,24 @@
}
-