From aaff33955eac2df674510b2db2352347804b021a Mon Sep 17 00:00:00 2001 From: BFlat Date: Fri, 26 Jun 2026 21:54:29 +0700 Subject: [PATCH] Webapp/website: Promptbox fullscreen "focus mode" + 3D & tooltip fixes (#1700) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Fullscreen focus mode (desktop + webapp) - Added a top-right expand icon on every prompt editor that opens a "Prompt" focus-mode overlay (blurred backdrop, `max-w-4xl` centered card) for more prompting space. - Same editor state — overlay binds to the same value + onChange, so text/@-mentions persist. Auto-focuses with the caret at the end on open. - Editor fills full height; @-mention dropdown no longer clipped; closes on Esc / backdrop click. - Reused `@storyteller/ui-modal`; shared `PromptFullscreenModal` + button + `useFullscreenPrompt` hook across all 5 desktop promptboxes, mirrored in the webapp's own PromptBox. ### 3D editor - Model selector now renders inside the promptbox (was standalone on the canvas). - Pose button hides on deselect; pressing "Done" keeps it (flips back to "Enter Pose Mode") while the character is still selected. - Drag and drop into folders fix within gallery modal - doesn't close immediately unless on 3D editor page. ### Tooltips & expand - Fixed top-left menu tooltips getting stuck open after a tab change. - Reworked image promptbox auto-grow/expand into a shared `useAutoGrowEditorHeight` hook (no per-render style writes) with a smooth height transition. --- .../src/components/prompt-box/PromptBox.tsx | 45 +++++- .../prompt-box/PromptFullscreen.tsx | 135 ++++++++++++++++++ frontend/apps/artcraft-webapp/src/main.tsx | 2 +- .../src/pages/pagescene/pagescene.tsx | 12 ++ .../PageImageTo3DObject/ImageTo3DStore.ts | 15 +- .../app/src/pages/PageScene/PageScene.tsx | 14 ++ frontend/libs/api/src/lib/models/Folder.ts | 6 + .../gallery-modal/src/lib/gallery-modal.tsx | 15 +- .../gallery-modal/src/lib/galleryDnd.ts | 59 ++++++-- .../src/lib/galleryModalSignals.ts | 7 + .../src/lib/menu-icon-selector.tsx | 6 +- .../libs/components/modal/src/lib/modal.tsx | 3 +- .../src/lib/engine/keybinds_controls.ts | 8 ++ .../libs/components/promptbox/src/index.ts | 3 + .../promptbox/src/lib/PromptBox2D.tsx | 25 +++- .../promptbox/src/lib/PromptBox3D.tsx | 33 ++++- .../promptbox/src/lib/PromptBoxEdit.tsx | 25 +++- .../promptbox/src/lib/PromptBoxImage.tsx | 59 ++++---- .../promptbox/src/lib/PromptBoxVideo.tsx | 42 +++++- .../src/lib/PromptFullscreenButton.tsx | 39 +++++ .../src/lib/PromptFullscreenModal.tsx | 83 +++++++++++ .../promptbox/src/lib/focusEditorAtEnd.ts | 29 ++++ .../src/lib/useAutoGrowEditorHeight.ts | 106 ++++++++++++++ .../components/tooltip/src/lib/tooltip.tsx | 37 ++++- .../viewer-3d/src/lib/viewer-3d.tsx | 3 + 25 files changed, 755 insertions(+), 56 deletions(-) create mode 100644 frontend/apps/artcraft-webapp/src/components/prompt-box/PromptFullscreen.tsx create mode 100644 frontend/libs/components/promptbox/src/lib/PromptFullscreenButton.tsx create mode 100644 frontend/libs/components/promptbox/src/lib/PromptFullscreenModal.tsx create mode 100644 frontend/libs/components/promptbox/src/lib/focusEditorAtEnd.ts create mode 100644 frontend/libs/components/promptbox/src/lib/useAutoGrowEditorHeight.ts diff --git a/frontend/apps/artcraft-webapp/src/components/prompt-box/PromptBox.tsx b/frontend/apps/artcraft-webapp/src/components/prompt-box/PromptBox.tsx index 81f87671a1..c0cac00b4c 100644 --- a/frontend/apps/artcraft-webapp/src/components/prompt-box/PromptBox.tsx +++ b/frontend/apps/artcraft-webapp/src/components/prompt-box/PromptBox.tsx @@ -23,6 +23,11 @@ import { MentionTextarea } from "./MentionTextarea"; import { getMentionColor, buildMentionColorMap } from "./mention-colors"; import type { RefImage, MentionItem } from "./types"; import { useEnterToGenerateStore } from "../../lib/enter-to-generate-store"; +import { + PromptFullscreenButton, + PromptFullscreenModal, + useFullscreenPrompt, +} from "./PromptFullscreen"; // ── Props ─────────────────────────────────────────────────────────────── @@ -107,6 +112,8 @@ export const PromptBox = forwardRef( const [isFocused, setIsFocused] = useState(false); const [isExpanded, setIsExpanded] = useState(false); const [showImagePrompts, setShowImagePrompts] = useState(false); + const { isFullscreen, openFullscreen, closeFullscreen } = + useFullscreenPrompt(); const EXPANDED_HEIGHT = "clamp(120px, calc(100vh - 700px), 500px)"; @@ -386,7 +393,7 @@ export const PromptBox = forwardRef( mentionItems={mentionItems} placeholder={placeholder} className={twMerge( - "promptbox-scrollbar min-h-[2.5em] w-full text-base-fg placeholder-base-fg/60", + "promptbox-scrollbar min-h-[2.5em] w-full pr-8 text-base-fg placeholder-base-fg/60", isExpanded ? "max-h-[500px]" : "max-h-[5.5em]", )} colorMap={mentionColorMap} @@ -411,7 +418,7 @@ export const PromptBox = forwardRef( ref={highlightRef} aria-hidden className={twMerge( - "pointer-events-none absolute inset-0 overflow-y-auto whitespace-pre-wrap break-words text-sm text-base-fg", + "pointer-events-none absolute inset-0 overflow-y-auto whitespace-pre-wrap break-words pr-8 text-sm text-base-fg", isExpanded ? "max-h-[500px]" : "max-h-[5.5em]", )} > @@ -425,7 +432,7 @@ export const PromptBox = forwardRef( autoFocus placeholder={placeholder} className={twMerge( - "promptbox-scrollbar min-h-[2.5em] w-full flex-1 resize-y overflow-y-auto bg-transparent text-md text-base-fg placeholder-base-fg/60 focus:outline-none", + "promptbox-scrollbar min-h-[2.5em] w-full flex-1 resize-y overflow-y-auto bg-transparent pr-8 text-md text-base-fg placeholder-base-fg/60 focus:outline-none", isExpanded ? "max-h-[500px]" : "max-h-[5.5em]", hasMentionItems && "text-transparent caret-white", )} @@ -504,6 +511,7 @@ export const PromptBox = forwardRef( )} )} + @@ -547,6 +555,37 @@ export const PromptBox = forwardRef( + + {hasMentionItems && mentionItems ? ( + { + if ( + e.key === "Enter" && + enterToGenerate && + !e.shiftKey && + !e.metaKey + ) { + e.preventDefault(); + onSubmit(); + } + }} + /> + ) : ( +