{"version":3,"sources":["../src/components/StickyNote/StickyNote.tsx"],"names":["forwardRef","useState","useRef","useEffect","jsx","cn"],"mappings":"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","file":"chunk-ATJSHM6J.cjs","sourcesContent":["import { forwardRef, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport type { StickyNoteColor, StickyNoteProps } from \"./StickyNote.types\";\n\n// Preset paper colors → bg + text classes. An arbitrary CSS color string\n// falls through to an inline `background` (text stays a dark ink tone).\nconst colorClasses: Record<StickyNoteColor, string> = {\n  yellow: \"bg-amber-100 text-amber-950 dark:bg-amber-200 dark:text-amber-950\",\n  blue: \"bg-sky-100 text-sky-950 dark:bg-sky-200 dark:text-sky-950\",\n  green: \"bg-emerald-100 text-emerald-950 dark:bg-emerald-200 dark:text-emerald-950\",\n  pink: \"bg-pink-100 text-pink-950 dark:bg-pink-200 dark:text-pink-950\",\n  violet: \"bg-violet-100 text-violet-950 dark:bg-violet-200 dark:text-violet-950\",\n};\n\nconst isPreset = (c: string): c is StickyNoteColor => c in colorClasses;\n\n/**\n * A sticky note — paper-styled, with optional inline text editing.\n *\n * Presentational primitive only: it owns the note's look and its editable\n * text. Positioning, dragging, resizing, and z-order are the consumer's job\n * (e.g. `fancy-whiteboard`'s `<Board>` places it in world space;\n * `fancy-artboard`'s `<ArtBoard.Note>` positions it absolutely).\n *\n *   <StickyNote value={text} onChange={setText} color=\"yellow\" rotate={-2} />\n */\nexport const StickyNote = forwardRef<HTMLDivElement, StickyNoteProps>(\n  (\n    {\n      value,\n      defaultValue,\n      onChange,\n      color = \"yellow\",\n      rotate = 0,\n      width = 180,\n      height = \"auto\",\n      selected = false,\n      editable = true,\n      autoFocus = false,\n      id,\n      children,\n      className,\n      style,\n    },\n    ref,\n  ) => {\n    const isControlled = value !== undefined;\n    const [internal, setInternal] = useState(defaultValue ?? \"\");\n    const text = isControlled ? value : internal;\n    const editRef = useRef<HTMLDivElement>(null);\n\n    // Push text into the contentEditable node only when it differs AND the node\n    // isn't focused — editing in place must not yank the caret to the start.\n    useEffect(() => {\n      const el = editRef.current;\n      if (el && document.activeElement !== el && el.textContent !== text) {\n        el.textContent = text ?? \"\";\n      }\n    }, [text]);\n\n    // Focus + caret-to-end when editing turns on (consumer \"enter edit\" gesture).\n    useEffect(() => {\n      if (!editable || !autoFocus) return;\n      const el = editRef.current;\n      if (!el) return;\n      el.focus();\n      const range = document.createRange();\n      range.selectNodeContents(el);\n      range.collapse(false);\n      const sel = window.getSelection();\n      sel?.removeAllRanges();\n      sel?.addRange(range);\n    }, [editable, autoFocus]);\n\n    const commit = () => {\n      const next = editRef.current?.textContent ?? \"\";\n      if (next === text) return;\n      if (!isControlled) setInternal(next);\n      onChange?.(next);\n    };\n\n    const preset = isPreset(color);\n    const content =\n      children != null ? (\n        children\n      ) : editable ? (\n        <div\n          ref={editRef}\n          contentEditable\n          suppressContentEditableWarning\n          spellCheck={false}\n          role=\"textbox\"\n          aria-multiline=\"true\"\n          className=\"outline-none whitespace-pre-wrap break-words min-h-[1.4em]\"\n          onBlur={commit}\n          onKeyDown={(e) => {\n            if (e.key === \"Escape\") e.currentTarget.blur();\n          }}\n        >\n          {text}\n        </div>\n      ) : (\n        <div className=\"whitespace-pre-wrap break-words\">{text}</div>\n      );\n\n    return (\n      <div\n        ref={ref}\n        id={id}\n        data-react-fancy-sticky=\"\"\n        className={cn(\n          \"rounded-sm p-3.5 text-sm leading-relaxed shadow-[0_2px_8px_rgba(0,0,0,0.12),0_1px_2px_rgba(0,0,0,0.08)]\",\n          preset ? colorClasses[color] : \"text-zinc-900\",\n          selected && \"ring-2 ring-blue-500 ring-offset-1\",\n          className,\n        )}\n        style={{\n          width,\n          height,\n          transform: rotate ? `rotate(${rotate}deg)` : undefined,\n          ...(preset ? null : { background: color }),\n          ...style,\n        }}\n      >\n        {content}\n      </div>\n    );\n  },\n);\n\nStickyNote.displayName = \"StickyNote\";\n"]}