diff --git a/docs/pr-evidence/pr-1256/character-magic-rewrite.png b/docs/pr-evidence/pr-1256/character-magic-rewrite.png new file mode 100644 index 000000000..0d2d85e9b Binary files /dev/null and b/docs/pr-evidence/pr-1256/character-magic-rewrite.png differ diff --git a/docs/pr-evidence/pr-1256/lorebook-magic-rewrite.png b/docs/pr-evidence/pr-1256/lorebook-magic-rewrite.png new file mode 100644 index 000000000..92233e9cf Binary files /dev/null and b/docs/pr-evidence/pr-1256/lorebook-magic-rewrite.png differ diff --git a/packages/client/src/components/lorebooks/LorebookFormFields.tsx b/packages/client/src/components/lorebooks/LorebookFormFields.tsx index 4453bdc78..b1c89bef8 100644 --- a/packages/client/src/components/lorebooks/LorebookFormFields.tsx +++ b/packages/client/src/components/lorebooks/LorebookFormFields.tsx @@ -4,10 +4,11 @@ // and LorebookEntryRow (the per-entry inline drawer). // Extracted from LorebookEditor.tsx so styling stays consistent. // ────────────────────────────────────────────── -import { useEffect, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from "react"; -import { FileText, Maximize2, ToggleLeft, ToggleRight, X } from "lucide-react"; +import { useCallback, useEffect, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from "react"; +import { FileText, Maximize2, Sparkles, ToggleLeft, ToggleRight, X } from "lucide-react"; import { cn } from "../../lib/utils"; import { HelpTooltip } from "../ui/HelpTooltip"; +import { MagicRewritePanel } from "../ui/MagicRewritePanel"; export function FieldGroup({ label, @@ -233,6 +234,8 @@ export function ExpandedContentModal({ placeholder?: string; }) { const [local, setLocal] = useState(value); + const [magicRewriteMode, setMagicRewriteMode] = useState(false); + const [magicRewriteResult, setMagicRewriteResult] = useState(""); const textareaRef = useRef(null); useEffect(() => { @@ -241,7 +244,7 @@ export function ExpandedContentModal({ useEffect(() => { const handler = (e: KeyboardEvent) => { - if (e.key === "Escape") { + if (e.key === "Escape" && !magicRewriteMode) { onChange(local); onCommit?.(); onClose(); @@ -249,7 +252,7 @@ export function ExpandedContentModal({ }; document.addEventListener("keydown", handler); return () => document.removeEventListener("keydown", handler); - }, [onClose, onChange, onCommit, local]); + }, [onClose, onChange, onCommit, local, magicRewriteMode]); const handleClose = () => { onChange(local); @@ -257,36 +260,87 @@ export function ExpandedContentModal({ onClose(); }; + const handleMagicRewriteBack = () => { + setMagicRewriteMode(false); + setMagicRewriteResult(""); + }; + + const handleMagicRewriteApply = () => { + if (!magicRewriteResult) return; + setLocal(magicRewriteResult); + setMagicRewriteMode(false); + setMagicRewriteResult(""); + window.setTimeout(() => textareaRef.current?.focus(), 100); + }; + + const handleMagicRewriteResultChange = useCallback((next: string) => { + setMagicRewriteResult(next); + }, []); + return (
-
+
-

{title}

- +

{magicRewriteMode ? "✨ Magic Rewrite" : title}

+
+ +
-