diff --git a/src/Drawd.jsx b/src/Drawd.jsx index 05d1664..eef3fa9 100644 --- a/src/Drawd.jsx +++ b/src/Drawd.jsx @@ -33,6 +33,7 @@ import { BatchSelectionBar } from "./components/BatchSelectionBar"; import { SelectionOverlay } from "./components/SelectionOverlay"; import { ToolBar } from "./components/ToolBar"; import { StickyNote } from "./components/StickyNote"; +import { StickyNoteSidebar } from "./components/StickyNoteSidebar"; import { ScreenGroup } from "./components/ScreenGroup"; import { generateId } from "./utils/generateId"; @@ -466,6 +467,7 @@ export default function Drawd() { // ── Derived values ────────────────────────────────────────────────────────────────── const selectedScreenData = screens.find((s) => s.id === selectedScreen); + const selectedStickyNoteData = stickyNotes.find((n) => n.id === selectedStickyNote); const previewLine = connecting ? { fromScreenId: connecting.fromScreenId, toX: connecting.mouseX, toY: connecting.mouseY } @@ -597,7 +599,7 @@ export default function Drawd() { key={screen.id} screen={screen} selected={selectedScreen === screen.id} - onSelect={(id) => { clearSelection(); setSelectedScreen(id); }} + onSelect={(id) => { clearSelection(); setSelectedScreen(id); setSelectedStickyNote(null); }} onDragStart={onDragStart} isSpaceHeld={isSpaceHeld} onAddHotspot={addHotspotViaConnect} @@ -642,6 +644,14 @@ export default function Drawd() { zoom={zoom} onUpdate={updateStickyNote} onDelete={deleteStickyNote} + selected={selectedStickyNote === note.id} + onSelect={(id) => { + setSelectedStickyNote(id); + setSelectedScreen(null); + setSelectedConnection(null); + setHotspotInteraction(null); + setSelectedScreenGroup(null); + }} isMultiSelected={canvasSelection.some((i) => i.type === "sticky" && i.id === note.id)} onToggleSelect={toggleSelection} onMultiDragStart={onMultiDragStart} @@ -848,6 +858,15 @@ export default function Drawd() { onUpdateStatus={updateScreenStatus} /> )} + + {selectedStickyNoteData && ( + setSelectedStickyNote(null)} + /> + )} diff --git a/src/components/StickyNote.jsx b/src/components/StickyNote.jsx index 5bcab72..471e401 100644 --- a/src/components/StickyNote.jsx +++ b/src/components/StickyNote.jsx @@ -10,7 +10,7 @@ const NOTE_COLORS = { const COLOR_OPTIONS = ["yellow", "blue", "red", "green"]; -export function StickyNote({ note, zoom, onUpdate, onDelete, onDragStart, isMultiSelected, onToggleSelect, onMultiDragStart }) { +export function StickyNote({ note, zoom, onUpdate, onDelete, onDragStart, isMultiSelected, onToggleSelect, onMultiDragStart, selected, onSelect }) { const [isEditing, setIsEditing] = useState(!note.content); const [showMenu, setShowMenu] = useState(false); const textareaRef = useRef(null); @@ -29,8 +29,9 @@ export function StickyNote({ note, zoom, onUpdate, onDelete, onDragStart, isMult onMultiDragStart?.(e); return; } + onSelect?.(note.id); onDragStart?.(e, note.id); - }, [note.id, onDragStart, isMultiSelected, onMultiDragStart, onToggleSelect]); + }, [note.id, onDragStart, isMultiSelected, onMultiDragStart, onToggleSelect, onSelect]); return (
{note.author && ( - + {note.author} )} diff --git a/src/components/StickyNoteSidebar.jsx b/src/components/StickyNoteSidebar.jsx new file mode 100644 index 0000000..f245824 --- /dev/null +++ b/src/components/StickyNoteSidebar.jsx @@ -0,0 +1,176 @@ +import { useState } from "react"; +import { COLORS, FONTS, styles } from "../styles/theme"; +import { SIDEBAR_WIDTH } from "../constants"; + +const NOTE_COLORS = { + yellow: { bg: "#2d2a00", border: "#f0c040", text: "#f5e17a" }, + blue: { bg: "#001a2d", border: "#4da6ff", text: "#a8d4ff" }, + red: { bg: "#2d0000", border: "#ff6b6b", text: "#ffb3b3" }, + green: { bg: "#002d0a", border: "#00d27d", text: "#7fffb8" }, +}; + +const COLOR_OPTIONS = ["yellow", "blue", "red", "green"]; + +export function StickyNoteSidebar({ note, onUpdate, onDelete, onClose }) { + const [draftAuthor, setDraftAuthor] = useState(note.author || ""); + const [noteId, setNoteId] = useState(note.id); + + // Reset draft when note changes + if (note.id !== noteId) { + setDraftAuthor(note.author || ""); + setNoteId(note.id); + } + + return ( +
+ {/* Header */} +
+

+ Sticky Note +

+ +
+ + {/* Color picker */} +
+
+ Color +
+
+ {COLOR_OPTIONS.map((c) => { + const isActive = (note.color || "yellow") === c; + return ( + + ); + })} +
+
+ + {/* Author */} +
+ + setDraftAuthor(e.target.value)} + onBlur={() => onUpdate(note.id, { author: draftAuthor })} + placeholder="e.g. Jane" + style={{ ...styles.input }} + /> +
+ + {/* Content */} +
+ +