diff --git a/frontend/src/lib/components/GfmMarkdown.svelte b/frontend/src/lib/components/GfmMarkdown.svelte index 7392de5484..83cce90fbe 100644 --- a/frontend/src/lib/components/GfmMarkdown.svelte +++ b/frontend/src/lib/components/GfmMarkdown.svelte @@ -3,7 +3,12 @@ import { gfmPlugin } from 'svelte-exmarkdown/gfm' import rehypeRaw from 'rehype-raw' import { rehypeGithubAlerts } from 'rehype-github-alerts' - export let md: string + interface Props { + md: string + noPadding?: boolean + } + + let { md, noPadding }: Props = $props() const plugins: Plugin[] = [ gfmPlugin(), { rehypePlugin: [rehypeRaw] }, @@ -11,7 +16,7 @@ ] -
+
diff --git a/frontend/src/lib/components/graph/NoteTool.svelte b/frontend/src/lib/components/graph/NoteTool.svelte index 0dd3163801..01db3d8f05 100644 --- a/frontend/src/lib/components/graph/NoteTool.svelte +++ b/frontend/src/lib/components/graph/NoteTool.svelte @@ -29,7 +29,6 @@ } function onPointerMove(event: PointerEvent) { - console.log('NoteTool: pointer move', event) if (event.buttons !== 1) return // Use page coordinates as reference diff --git a/frontend/src/lib/components/graph/renderers/nodes/NoteNode.svelte b/frontend/src/lib/components/graph/renderers/nodes/NoteNode.svelte index 136138e166..0c02e71a9d 100644 --- a/frontend/src/lib/components/graph/renderers/nodes/NoteNode.svelte +++ b/frontend/src/lib/components/graph/renderers/nodes/NoteNode.svelte @@ -2,6 +2,8 @@ import { NodeResizer } from '@xyflow/svelte' import { X } from 'lucide-svelte' import { twMerge } from 'tailwind-merge' + import GfmMarkdown from '$lib/components/GfmMarkdown.svelte' + import { fade } from 'svelte/transition' interface Props { data: { @@ -18,15 +20,14 @@ let { data, selected = false, dragging = false }: Props = $props() let textareaElement: HTMLTextAreaElement | undefined = $state(undefined) + let editMode = $state(false) + let hovering = $state(false) function handleTextChange(event: Event) { const target = event.target as HTMLTextAreaElement + console.log('Text change detected', target.value) // Call the update callback data.onUpdate?.(target.value) - - // Auto-resize textarea - target.style.height = 'auto' - target.style.height = target.scrollHeight + 'px' } function handleDelete(event: Event) { @@ -36,14 +37,31 @@ data.onDelete?.() } - // Auto-resize textarea when text changes + function handleDoubleClick(event: Event) { + console.log('Double click detected', { editMode, selected, dragging }) + event.preventDefault() + event.stopPropagation() + editMode = true + // Focus the textarea after a short delay to ensure it's rendered + setTimeout(() => { + textareaElement?.focus() + }, 0) + } + + function handleMouseEnter() { + hovering = true + } + + function handleMouseLeave() { + hovering = false + } + + // Exit edit mode when note is deselected $effect(() => { - if (textareaElement) { - textareaElement.style.height = 'auto' - textareaElement.style.height = textareaElement.scrollHeight + 'px' + if (!selected) { + editMode = false } }) - $inspect('dbg selected', selected)
{ dragging = false }} + onmouseenter={handleMouseEnter} + onmouseleave={handleMouseLeave} role="note" > + + {#if hovering} + {#if !editMode && data.text} +
+ Double click to edit +
+ {:else} +
GH Markdown
+ {/if} + {/if} + -
- +
+ {#if editMode} + + + {:else} + + +
+ {#if data.text} +
+ +
+ {:else} +
Double-click to add a note
+ {/if} +
+ {/if}