@vishu1301/script-writing 1.4.7 → 1.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../app/types/screenplay-editor.types.tsx","../app/components/PdfImporter.tsx","../app/view/screenplay-editor.view.tsx","../app/service/screenplay-editor.service.ts","../app/hook/use-screenplay-editor.ts","../app/handler/script-file.handler.tsx","../app/types/script-breakdown.types.tsx","../app/components/summarize-button.tsx","../app/view/script-breakdown-scene.view.tsx","../app/hook/use-script-breakdown-scene.ts","../app/components/modal/modal-layout.tsx","../app/components/input/inputs.tsx","../data/shot-data.ts","../app/components/modal/add-shot-modal.tsx","../app/components/modal/production-setup-modal.tsx","../app/components/modal/view-shot-modal.tsx","../app/view/shot-breakdown-scene.view.tsx","../app/hook/use-shot-breakdown-scene.ts"],"names":["_a","jsx","useState","useRef","jsxs","Fragment","User","useEffect","newBlockId","Map","Loader2","AlignLeft","Tags","X","error","useMemo","useCallback","Check","AsteriskIcon","ErrorMessage","Formik","Yup2","Form","Info","Frame","Video","Settings2"],"mappings":"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","file":"index.js","sourcesContent":["import {\r\n Type,\r\n AlignLeft,\r\n User,\r\n Parentheses,\r\n MessageSquareText,\r\n CornerDownRight,\r\n} from \"lucide-react\";\r\nimport React from \"react\";\r\n\r\nexport type BlockType =\r\n | \"SCENE_HEADING\"\r\n | \"ACTION\"\r\n | \"CHARACTER\"\r\n | \"PARENTHETICAL\"\r\n | \"DIALOGUE\"\r\n | \"TRANSITION\";\r\n\r\nexport type TimeOfDay = \"DAY\" | \"NIGHT\";\r\nexport const timeOfDayOptions: TimeOfDay[] = [\"DAY\", \"NIGHT\"];\r\n\r\nexport interface Block {\r\n id: string;\r\n type: BlockType;\r\n text: string;\r\n sceneNumber?: string;\r\n sceneType?: \"INT.\" | \"EXT.\" | \"INT/EXT.\";\r\n timeOfDay?: TimeOfDay;\r\n}\r\n\r\nexport const blockTypes: BlockType[] = [\r\n \"SCENE_HEADING\",\r\n \"ACTION\",\r\n \"CHARACTER\",\r\n \"PARENTHETICAL\",\r\n \"DIALOGUE\",\r\n \"TRANSITION\",\r\n];\r\n\r\nexport const uuid = () => Math.random().toString(36).slice(2, 9);\r\n\r\nexport const icons: Record<BlockType, React.ReactNode> = {\r\n SCENE_HEADING: <Type className=\"w-5 h-5\" />,\r\n ACTION: <AlignLeft className=\"w-5 h-5\" />,\r\n CHARACTER: <User className=\"w-5 h-5\" />,\r\n PARENTHETICAL: <Parentheses className=\"w-5 h-5\" />,\r\n DIALOGUE: <MessageSquareText className=\"w-5 h-5\" />,\r\n TRANSITION: <CornerDownRight className=\"w-5 h-5\" />,\r\n};\r\n\r\nexport const blockStyles: Record<\r\n BlockType,\r\n { label: string; className: string; inputStyle: React.CSSProperties }\r\n> = {\r\n SCENE_HEADING: {\r\n label: \"Scene Heading\",\r\n className: \"uppercase font-bold text-zinc-900 flex items-center gap-3\",\r\n inputStyle: {\r\n textTransform: \"uppercase\",\r\n fontWeight: 700,\r\n maxWidth: \"6.0in\",\r\n outline: \"none\",\r\n whiteSpace: \"pre-wrap\",\r\n overflowWrap: \"break-word\",\r\n wordBreak: \"break-word\",\r\n },\r\n },\r\n ACTION: {\r\n label: \"Action\",\r\n className: \"text-zinc-800\",\r\n inputStyle: {\r\n maxWidth: \"6.0in\",\r\n outline: \"none\",\r\n whiteSpace: \"pre-wrap\",\r\n overflowWrap: \"break-word\",\r\n wordBreak: \"break-word\",\r\n lineHeight: \"12pt\",\r\n },\r\n },\r\n CHARACTER: {\r\n label: \"Character\",\r\n className: \"uppercase text-zinc-900 tracking-widest\",\r\n inputStyle: {\r\n textTransform: \"uppercase\",\r\n textAlign: \"left\",\r\n marginLeft: \"2.0in\",\r\n maxWidth: \"4.0in\",\r\n letterSpacing: \"0.1em\",\r\n outline: \"none\",\r\n whiteSpace: \"pre-wrap\",\r\n overflowWrap: \"break-word\",\r\n wordBreak: \"break-word\",\r\n },\r\n },\r\n PARENTHETICAL: {\r\n label: \"Parenthetical\",\r\n className: \"text-zinc-600\",\r\n inputStyle: {\r\n fontStyle: \"normal\",\r\n maxWidth: \"3.0in\",\r\n marginLeft: \"1.5in\",\r\n textTransform: \"lowercase\",\r\n outline: \"none\",\r\n whiteSpace: \"pre-wrap\",\r\n overflowWrap: \"break-word\",\r\n wordBreak: \"break-word\",\r\n textAlign: \"left\",\r\n },\r\n },\r\n DIALOGUE: {\r\n label: \"Dialogue\",\r\n className: \"text-zinc-900\",\r\n inputStyle: {\r\n marginLeft: \"1.0in\",\r\n maxWidth: \"3.5in\",\r\n outline: \"none\",\r\n whiteSpace: \"pre-wrap\",\r\n overflowWrap: \"break-word\",\r\n wordBreak: \"break-word\",\r\n fontSize: \"1.05rem\",\r\n textAlign: \"left\",\r\n lineHeight: \"12pt\",\r\n },\r\n },\r\n TRANSITION: {\r\n label: \"Transition\",\r\n className: \"uppercase font-bold text-right text-zinc-900\",\r\n inputStyle: {\r\n textTransform: \"uppercase\",\r\n fontWeight: 600,\r\n textAlign: \"right\",\r\n outline: \"none\",\r\n whiteSpace: \"pre-wrap\",\r\n overflowWrap: \"break-word\",\r\n wordBreak: \"break-word\",\r\n },\r\n },\r\n};\r\n","\"use client\";\r\n\r\nimport { useState, type ChangeEvent, useRef } from \"react\";\r\nimport * as pdfjs from \"pdfjs-dist\";\r\n\r\n// Set workerSrc to avoid issues with Next.js.\r\n// This is a common pattern for using pdf.js in a webpacked environment.\r\npdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`;\r\n\r\ninterface PdfImporterProps {\r\n onScriptImported: (\r\n title: string,\r\n content: string,\r\n preParsedBlocks?: any[],\r\n ) => void;\r\n disabled?: boolean\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function PdfImporter({ onScriptImported, disabled, children }: PdfImporterProps) {\r\n const [isProcessing, setIsProcessing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n\r\n const handleFileChange = async (event: ChangeEvent<HTMLInputElement>) => {\r\n const file = event.target.files?.[0];\r\n if (!file) {\r\n return;\r\n }\r\n\r\n setIsProcessing(true);\r\n setError(null);\r\n\r\n try {\r\n if (file.name.toLowerCase().endsWith(\".sbx\")) {\r\n let text = await file.text();\r\n\r\n // Decode HTML entities if the SBX was saved with encoded brackets\r\n if (text.includes(\"<div\")) {\r\n const textarea = document.createElement(\"textarea\");\r\n textarea.innerHTML = text;\r\n text = textarea.value;\r\n }\r\n\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(text, \"text/html\");\r\n\r\n const divs = Array.from(doc.querySelectorAll(\"div\"));\r\n const preParsedBlocks: any[] = [];\r\n\r\n const typeMap: Record<string, string> = {\r\n divtype0: \"SCENE_HEADING\",\r\n divtype2: \"ACTION\",\r\n divtype3: \"CHARACTER\",\r\n divtype4: \"PARENTHETICAL\",\r\n divtype5: \"DIALOGUE\",\r\n divtype6: \"TRANSITION\",\r\n };\r\n\r\n divs.forEach((div) => {\r\n let divText = div.textContent?.trim() || \"\";\r\n if (!divText) return; // Skip completely empty blocks\r\n\r\n let type = \"ACTION\"; // Default\r\n for (const className of Array.from(div.classList)) {\r\n if (typeMap[className]) {\r\n type = typeMap[className];\r\n break;\r\n }\r\n }\r\n\r\n const block: any = { type, text: divText };\r\n\r\n if (type === \"SCENE_HEADING\") {\r\n const sceneNum = div.getAttribute(\"data-scene\");\r\n if (sceneNum) block.sceneNumber = sceneNum;\r\n\r\n let parsedText = divText;\r\n const typeMatch = parsedText.match(/^(INT\\/EXT|INT|EXT)\\.?\\s+/i);\r\n if (typeMatch) {\r\n let sType = typeMatch[1].toUpperCase();\r\n if (!sType.endsWith(\".\")) sType += \".\";\r\n block.sceneType = sType;\r\n parsedText = parsedText.substring(typeMatch[0].length).trim();\r\n }\r\n\r\n const timeMatch = parsedText.match(/\\s+-\\s+([^-]+)$/);\r\n if (timeMatch) {\r\n block.timeOfDay = timeMatch[1].trim().toUpperCase();\r\n parsedText = parsedText.substring(0, timeMatch.index).trim();\r\n }\r\n\r\n block.text = parsedText;\r\n }\r\n\r\n preParsedBlocks.push(block);\r\n });\r\n\r\n const title = file.name.replace(/\\.sbx$/i, \"\");\r\n onScriptImported(title.trim(), \"\", preParsedBlocks);\r\n } else {\r\n const arrayBuffer = await file.arrayBuffer();\r\n const pdf = await pdfjs.getDocument(arrayBuffer).promise;\r\n\r\n const processPage = async (pageNumber: number): Promise<string> => {\r\n const page = await pdf.getPage(pageNumber);\r\n const content = await page.getTextContent();\r\n const items = content.items.filter(\r\n (item): item is pdfjs.TextItem =>\r\n \"str\" in item && item.str.trim().length > 0,\r\n );\r\n\r\n if (items.length === 0) return \"\";\r\n\r\n const lines: { y: number; items: { x: number; text: string }[] }[] =\r\n [];\r\n\r\n for (const item of items) {\r\n let found = false;\r\n for (const line of lines) {\r\n if (Math.abs(line.y - item.transform[5]) < 5) {\r\n // 5px tolerance\r\n line.items.push({ x: item.transform[4], text: item.str });\r\n found = true;\r\n break;\r\n }\r\n }\r\n if (!found) {\r\n lines.push({\r\n y: item.transform[5],\r\n items: [{ x: item.transform[4], text: item.str }],\r\n });\r\n }\r\n }\r\n\r\n lines.sort((a, b) => b.y - a.y);\r\n\r\n return lines\r\n .map((line) => {\r\n line.items.sort((a, b) => a.x - b.x);\r\n return line.items.map((item) => item.text).join(\" \");\r\n })\r\n .join(\"\\n\");\r\n };\r\n\r\n let title = \"\";\r\n if (pdf.numPages > 0) {\r\n title = await processPage(1);\r\n }\r\n\r\n let scriptContent = \"\";\r\n for (let i = 1; i <= pdf.numPages; i++) {\r\n scriptContent += (await processPage(i)) + \"\\n\\n\";\r\n }\r\n\r\n onScriptImported(title.trim(), scriptContent);\r\n }\r\n } catch (err) {\r\n console.error(\"Error processing PDF:\", err);\r\n setError(\r\n err instanceof Error\r\n ? `Error processing PDF: ${err.message}`\r\n : \"An unknown error occurred.\",\r\n );\r\n } finally {\r\n setIsProcessing(false);\r\n // Reset file input so the same file can be selected again\r\n if (event.target) {\r\n event.target.value = \"\";\r\n }\r\n }\r\n };\r\n\r\n const handleClick = () => {\r\n fileInputRef.current?.click();\r\n };\r\n\r\n return (\r\n <>\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept=\".pdf,application/pdf\"\r\n onChange={handleFileChange}\r\n disabled={isProcessing || disabled}\r\n className=\"hidden\"\r\n id=\"pdf-importer-input\"\r\n />\r\n <button\r\n onClick={handleClick}\r\n disabled={isProcessing || disabled}\r\n className={`flex items-center justify-center transition-all duration-200 active:scale-95 disabled:cursor-not-allowed disabled:opacity-50 ${isProcessing ? \"w-auto px-3 sm:px-4 h-8 sm:h-10 rounded-full text-sm font-semibold bg-zinc-100 text-zinc-500\" : \"w-8 h-8 sm:w-10 sm:h-10 rounded-full text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900\"}`}\r\n aria-label=\"Import Script\"\r\n >\r\n {isProcessing ? (\r\n <span className=\"text-xs sm:text-sm font-semibold\">Processing...</span>\r\n ) : (\r\n children\r\n )}\r\n </button>\r\n {error && <p className=\"sr-only\">Error: {error}</p>}\r\n </>\r\n );\r\n}\r\n","\"use client\";\r\nimport React, { useEffect, useState, useRef } from \"react\";\r\nimport {\r\n blockStyles,\r\n blockTypes,\r\n icons,\r\n timeOfDayOptions,\r\n Block,\r\n} from \"../types/screenplay-editor.types\";\r\nimport { useScreenplayEditor } from \"../hook/use-screenplay-editor\";\r\nimport {\r\n ArrowRight,\r\n ChevronRight,\r\n User,\r\n Cog,\r\n Save,\r\n FileDown,\r\n Upload,\r\n RefreshCcw,\r\n Lock,\r\n Unlock,\r\n Loader2,\r\n Sparkles,\r\n Check,\r\n X,\r\n} from \"lucide-react\";\r\n\r\nimport { PdfImporter } from \"../components/PdfImporter\";\r\n\r\ntype ScreenplayEditorViewProps = ReturnType<typeof useScreenplayEditor> & {\r\n showPdfImport?: boolean;\r\n showSaveButton?: boolean;\r\n showSyncButton?: boolean;\r\n isLocked?: boolean;\r\n onToggleLock?: () => void;\r\n onSave?: () => void;\r\n onSaveAsPdf?: () => void;\r\n onSaveAsSbx?: () => void;\r\n onSyncWithCloud?: () => void;\r\n handleSceneNumberChange: (blockId: string, value: string) => void;\r\n handleEnhance: (block: Block) => void;\r\n handleApproveEnhance: () => void;\r\n handleRejectEnhance: () => void;\r\n enhancingBlockId: string | null;\r\n enhancementSuggestion: string | null;\r\n isEnhancing: boolean;\r\n};\r\nexport function ScreenplayEditorView({\r\n blocks,\r\n refs,\r\n focusedBlockId,\r\n showSuggestions,\r\n showExtensionSuggestions,\r\n characterExtensions,\r\n locations,\r\n characters,\r\n showPdfImport = false,\r\n showSaveButton = false,\r\n showSyncButton = false,\r\n isLocked = false,\r\n onToggleLock,\r\n handleBlockTextChange,\r\n handleSceneTypeChange,\r\n handleTimeOfDayChange,\r\n handleBlockTypeChange,\r\n handleSelectCharacterExtension,\r\n handleKeyDown,\r\n handleFocus,\r\n handleBlur,\r\n handleScriptImport,\r\n onSave,\r\n onSaveAsPdf,\r\n onSyncWithCloud,\r\n handleSceneNumberChange,\r\n handleEnhance,\r\n handleApproveEnhance,\r\n handleRejectEnhance,\r\n enhancingBlockId,\r\n enhancementSuggestion,\r\n isEnhancing,\r\n showUnsavedPopover,\r\n syncScreenplay,\r\n ignoreChanges,\r\n isLoading = false,\r\n}: ScreenplayEditorViewProps) {\r\n const [isRulesOpen, setIsRulesOpen] = useState(false);\r\n const rulesRef = useRef<HTMLDivElement>(null);\r\n\r\n const COURIER_STACK = \"'Courier Prime', 'Courier', monospace\";\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n rulesRef.current &&\r\n !rulesRef.current.contains(event.target as Node)\r\n ) {\r\n setIsRulesOpen(false);\r\n }\r\n };\r\n\r\n if (isRulesOpen) {\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n }\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n };\r\n }, [isRulesOpen]);\r\n\r\n useEffect(() => {\r\n const fontId = \"google-font-courier-prime\";\r\n const styleId = \"screenplay-editor-force-v4\";\r\n\r\n // 1. Inject Google Font\r\n if (!document.getElementById(fontId)) {\r\n const link = document.createElement(\"link\");\r\n link.id = fontId;\r\n link.rel = \"stylesheet\";\r\n link.href =\r\n \"https://fonts.googleapis.com/css2?family=Courier+Prime:ital,wght@0,400;0,700;1,400;1,700&display=swap\";\r\n document.head.appendChild(link);\r\n }\r\n\r\n // 2. Inject high-specificity CSS (Safe textContent approach)\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement(\"style\");\r\n style.id = styleId;\r\n style.textContent = `\r\n /* We target by the data-attribute to ensure the highest specificity possible */\r\n [data-screenplay-editor] *, \r\n [data-screenplay-editor] div, \r\n [data-screenplay-editor] span, \r\n [data-screenplay-editor] [contenteditable=\"true\"] {\r\n font-family: ${COURIER_STACK} !important;\r\n -webkit-font-smoothing: antialiased;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }\r\n }, [COURIER_STACK]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"fixed inset-0 z-[100] flex items-center justify-center bg-white/80 transition-opacity\">\r\n <div className=\"flex flex-col items-center gap-3\">\r\n <Loader2 className=\"w-8 h-8 text-zinc-400 animate-spin\" />\r\n <p className=\"text-zinc-500 text-sm font-medium\">Loading script...</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <div className=\"sticky top-2 sm:top-6 z-50 mx-auto w-full max-w-[1037px] rounded-[2.5rem] sm:rounded-[2rem] bg-gradient-to-b from-white/90 to-white/70 border border-white/60 shadow-[0_14px_34px_rgba(16,37,54,0.06),0_2px_8px_rgba(16,37,54,0.03)] backdrop-blur-xl flex items-center justify-between px-2 py-1.5 sm:px-3 sm:py-2 mb-6 sm:mb-12 select-none transition-all\">\r\n <div className=\"flex items-center gap-1 overflow-x-auto pr-2 flex-1 no-scrollbar rounded-full p-1 bg-gradient-to-b from-white/80 to-blumine-50 border border-blumine-200 shadow-inner\">\r\n {blockTypes.map((type) => {\r\n const selected =\r\n blocks.find((b) => b.id === focusedBlockId)?.type === type;\r\n\r\n return (\r\n <button\r\n key={type}\r\n type=\"button\"\r\n disabled={isLocked}\r\n onClick={() => handleBlockTypeChange(type)}\r\n className={`group w-fit flex shrink-0 items-center gap-2 px-3 sm:px-4 h-[40px] sm:h-[42px] rounded-full font-medium text-xs sm:text-sm transition-all duration-200 ease-out active:scale-95 whitespace-nowrap ${\r\n selected\r\n ? \"bg-gradient-to-b from-white to-blumine-100 text-blumine-500 shadow-[0_6px_14px_rgba(24,88,122,0.15)] border border-blumine-200\"\r\n : \"text-blumine-500 hover:bg-white\"\r\n } ${isLocked ? \"opacity-50 cursor-not-allowed\" : \"\"}`}\r\n >\r\n <div\r\n className={`flex items-center justify-center transition-opacity duration-200 ${selected ? \"opacity-100\" : \"opacity-70 group-hover:opacity-100\"}`}\r\n >\r\n {icons[type]}\r\n </div>\r\n\r\n <span className=\"hidden lg:inline tracking-wide\">\r\n {blockStyles[type].label}\r\n </span>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1.5 shrink-0 ml-2 sm:ml-0 pl-2 sm:pl-1 border-l sm:border-none border-blumine-200/70\">\r\n <div className=\"hidden sm:block w-[1px] h-6 bg-blumine-200 rounded-full mx-1\" />\r\n\r\n {showPdfImport && !isLocked && (\r\n <PdfImporter\r\n disabled={isLocked}\r\n onScriptImported={handleScriptImport}\r\n >\r\n <div className=\"w-9 h-9 sm:w-10 sm:h-10 flex items-center justify-center rounded-full text-blumine-500 hover:text-blumine-900 hover:bg-white/70 transition active:scale-95\">\r\n <Upload className=\"w-4 h-4 sm:w-[18px] sm:h-[18px]\" />\r\n </div>\r\n </PdfImporter>\r\n )}\r\n\r\n {onToggleLock && (\r\n <button\r\n onClick={onToggleLock}\r\n className={`w-9 h-9 sm:w-10 sm:h-10 flex items-center justify-center rounded-full transition-all duration-200 active:scale-95 ${isLocked ? \"text-rose-500 bg-rose-50/60\" : \"text-blumine-500 hover:text-blumine-900 hover:bg-white/70\"}`}\r\n >\r\n {isLocked ? (\r\n <Lock className=\"w-4 h-4 sm:w-[18px] sm:h-[18px]\" />\r\n ) : (\r\n <Unlock className=\"w-4 h-4 sm:w-[18px] sm:h-[18px]\" />\r\n )}\r\n </button>\r\n )}\r\n\r\n {onSave && showSaveButton && !isLocked && (\r\n <button\r\n onClick={onSave}\r\n className=\"w-9 h-9 sm:w-10 sm:h-10 flex items-center justify-center rounded-full text-blumine-500 hover:text-blumine-900 hover:bg-white/70 transition active:scale-95\"\r\n >\r\n <Save className=\"w-4 h-4 sm:w-[18px] sm:h-[18px]\" />\r\n </button>\r\n )}\r\n\r\n {onSaveAsPdf && showSaveButton && (\r\n <button\r\n onClick={onSaveAsPdf}\r\n className=\"w-9 h-9 sm:w-10 sm:h-10 flex items-center justify-center rounded-full text-blumine-500 hover:text-blumine-900 hover:bg-white/70 transition active:scale-95\"\r\n >\r\n <FileDown className=\"w-4 h-4 sm:w-[18px] sm:h-[18px]\" />\r\n </button>\r\n )}\r\n\r\n {onSyncWithCloud && showSyncButton && !isLocked && (\r\n <button\r\n onClick={onSyncWithCloud}\r\n className=\"w-9 h-9 sm:w-10 sm:h-10 flex items-center justify-center rounded-full text-blumine-500 hover:text-blumine-900 hover:bg-white/70 transition active:scale-95\"\r\n >\r\n <RefreshCcw className=\"w-4 h-4 sm:w-[18px] sm:h-[18px]\" />\r\n </button>\r\n )}\r\n\r\n <div ref={rulesRef} className=\"relative flex items-center\">\r\n <button\r\n onClick={() => setIsRulesOpen(!isRulesOpen)}\r\n className={`w-9 h-9 sm:w-10 sm:h-10 flex items-center justify-center rounded-full transition-all duration-200 active:scale-95 ${isRulesOpen ? \"bg-gradient-to-b from-white to-blumine-100 text-blumine-500 shadow-md border border-blumine-100\" : \"text-blumine-500 hover:text-blumine-900 hover:bg-white/70\"}`}\r\n >\r\n <Cog className=\"w-4 h-4 sm:w-[18px] sm:h-[18px]\" />\r\n </button>\r\n\r\n {isRulesOpen && (\r\n <div className=\"absolute -right-2 top-[calc(100%+14px)] w-[332px] max-w-[90vw] p-3 rounded-[24px] bg-white border border-blumine-200/70 shadow-[0_18px_40px_rgba(16,37,54,0.08),0_3px_10px_rgba(16,37,54,0.04)] backdrop-blur-xl origin-top-right animate-in fade-in zoom-in-95 z-50\">\r\n <div className=\"absolute -top-2 right-5 w-4 h-4 rotate-45 bg-white border-l border-t border-blumine-200/70\" />\r\n\r\n <div className=\"flex items-start justify-between mb-3 px-1\">\r\n <div className=\"flex gap-3\">\r\n <div className=\"w-10 h-10 flex items-center justify-center rounded-xl bg-gradient-to-b from-white to-blumine-50 text-blumine-500 border border-blumine-200/70 shadow-inner\">\r\n <Cog className=\"w-4 h-4\" />\r\n </div>\r\n\r\n <div>\r\n <h4 className=\"text-[15px] font-semibold text-blumine-900 leading-tight\">\r\n Settings & Shortcuts\r\n </h4>\r\n <p className=\"text-xs text-blumine-500 mt-1\">\r\n Writing flow & editor controls\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n {[\r\n {\r\n title: \"New Block\",\r\n desc: \"Insert the next section\",\r\n key: [\"Enter\"],\r\n },\r\n {\r\n title: \"Delete Block\",\r\n desc: \"Remove selected section\",\r\n key: [\"Backspace 🡠\"],\r\n },\r\n {\r\n title: \"Change Type\",\r\n desc: \"Cycle block styles\",\r\n key: [\"Ctrl\", \"+\", \"↑/↓\"],\r\n },\r\n ].map((item) => (\r\n <div\r\n key={item.title}\r\n className=\"flex items-center justify-between gap-4 p-3 rounded-[18px] bg-gradient-to-b from-white to-blumine-50/50 border border-blumine-200/60 shadow-[inset_0_1px_0_rgba(255,255,255,0.8)]\"\r\n >\r\n <div className=\"flex flex-col min-w-0\">\r\n <span className=\"text-sm font-medium text-blumine-800\">\r\n {item.title}\r\n </span>\r\n <span className=\"text-[11px] text-blumine-500 truncate\">\r\n {item.desc}\r\n </span>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1 shrink-0\">\r\n {item.key.map((k, i) =>\r\n k === \"+\" ? (\r\n <span\r\n key={i}\r\n className=\"text-blumine-400 text-xs font-semibold\"\r\n >\r\n +\r\n </span>\r\n ) : (\r\n <kbd\r\n key={i}\r\n className=\"min-w-[28px] px-2 py-1 text-[11px] font-bold text-primary bg-gradient-to-b from-white to-blumine-100 border border-blumine-200/70 rounded-full text-center shadow-[inset_0_1px_0_rgba(255,255,255,0.9)]\"\r\n >\r\n {k}\r\n </kbd>\r\n ),\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex flex-col gap-12 pb-24 w-full items-center justify-center\">\r\n <div\r\n className=\"relative bg-[#fdfdfc] shadow-2xl shadow-zinc-300/60 border border-zinc-100 rounded-sm md:rounded-md pl-[1.5in] py-[1in] pr-[1in] flex flex-col w-[210mm] min-h-[297mm] shrink-0\"\r\n style={{\r\n fontFamily: COURIER_STACK,\r\n paddingLeft: \"1.5in\",\r\n paddingRight: \"1in\",\r\n paddingTop: \"1in\",\r\n paddingBottom: \"1in\",\r\n lineHeight: \"1.2\",\r\n }}\r\n data-screenplay-editor=\"true\"\r\n >\r\n {blocks.map((block) => (\r\n <div\r\n key={block.id + \"-\" + block.type}\r\n data-block-id={block.id}\r\n className={`relative rounded-sm transition-all duration-200 outline-none ${\r\n focusedBlockId === block.id\r\n ? \"bg-zinc-100/50\"\r\n : \"bg-transparent\"\r\n }`}\r\n >\r\n {block.type === \"SCENE_HEADING\" ? (\r\n <>\r\n <div className=\"flex items-center gap-2 px-4 py-1 bg-transparent\">\r\n <input\r\n className=\"absolute -left-16 top-2 w-12 text-right text-zinc-400 font-semibold select-none bg-transparent outline-none focus:ring-1 focus:ring-blue-400 rounded-sm\"\r\n spellCheck={false}\r\n disabled={isLocked}\r\n // FIX: Use the derived map to ensure consistency with what the hook calculates\r\n value={block.sceneNumber || \"\"}\r\n onChange={(e) =>\r\n handleSceneNumberChange(\r\n block.id,\r\n e.target.value.toUpperCase(),\r\n )\r\n }\r\n onFocus={() => handleFocus(block.id)}\r\n onBlur={() => handleBlur(block.id)}\r\n onKeyDown={(e) => {\r\n // Prevent the editor's global keydown from triggering when typing in the number box\r\n if (e.key === \"Enter\" || e.key === \"Backspace\") {\r\n e.stopPropagation();\r\n }\r\n }}\r\n aria-label=\"Scene Number\"\r\n />\r\n <select\r\n className=\"rounded-md text-zinc-800 font-bold px-1.5 py-1 appearance-none bg-transparent hover:bg-zinc-200/50 outline-none cursor-pointer w-fit transition-colors\"\r\n aria-label=\"Scene Type\"\r\n disabled={isLocked}\r\n value={block.sceneType ?? \"INT.\"}\r\n onChange={(e) =>\r\n handleSceneTypeChange(block.id, e.target.value as any)\r\n }\r\n style={{\r\n appearance: \"none\",\r\n }}\r\n >\r\n <option>INT.</option>\r\n <option>EXT.</option>\r\n <option>INT/EXT.</option>\r\n </select>\r\n <div\r\n ref={(el) => {\r\n if (!el) return;\r\n refs.current[block.id] = el;\r\n }}\r\n contentEditable={!isLocked}\r\n suppressContentEditableWarning\r\n aria-label={`Scene Heading: ${block.text}`}\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={\r\n focusedBlockId === block.id &&\r\n showSuggestions &&\r\n locations.length > 0\r\n }\r\n spellCheck={false}\r\n className=\"min-w-[3rem] py-1 outline-none text-base font-bold uppercase tracking-widest break-all bg-transparent\"\r\n style={{\r\n minWidth: \"3rem\",\r\n }}\r\n onInput={(e) =>\r\n handleBlockTextChange(\r\n block.id,\r\n (e.target as HTMLDivElement).innerText,\r\n )\r\n }\r\n onKeyDown={(e) => handleKeyDown(e, block.id, block.text)}\r\n onFocus={() => handleFocus(block.id)}\r\n onBlur={() => handleBlur(block.id)}\r\n ></div>\r\n <span className=\"text-zinc-400/80 font-bold\">-</span>\r\n <select\r\n className=\"rounded-md text-zinc-800 font-bold px-1.5 py-1 appearance-none bg-transparent hover:bg-zinc-200/50 outline-none cursor-pointer transition-colors\"\r\n aria-label=\"Time of Day\"\r\n disabled={isLocked}\r\n value={block.timeOfDay ?? \"DAY\"}\r\n style={{\r\n appearance: \"none\",\r\n }}\r\n onChange={(e) =>\r\n handleTimeOfDayChange(block.id, e.target.value as any)\r\n }\r\n >\r\n {timeOfDayOptions.map((t) => (\r\n <option key={t}>{t}</option>\r\n ))}\r\n </select>\r\n </div>\r\n {focusedBlockId === block.id &&\r\n showSuggestions &&\r\n locations.length > 0 && (\r\n <div\r\n role=\"listbox\"\r\n id={`suggestions-${block.id}`}\r\n className=\"absolute top-[calc(100%+6px)] left-0 min-w-[240px] z-50 bg-white border border-slate-200/80 shadow-xl shadow-slate-200/40 rounded-xl py-1 overflow-hidden animate-in fade-in zoom-in-95 duration-150\"\r\n >\r\n <div className=\"max-h-60 overflow-y-auto custom-scrollbar\">\r\n {locations\r\n .filter(\r\n (loc) =>\r\n loc.startsWith(block.text.toUpperCase()) &&\r\n loc !== block.text.toUpperCase(),\r\n )\r\n .map((loc) => (\r\n <div\r\n role=\"option\"\r\n key={loc}\r\n className=\"group flex items-center justify-between px-4 py-2.5 cursor-pointer transition-all duration-150 hover:bg-slate-50 active:bg-slate-100\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n const element = refs.current[block.id];\r\n if (element) {\r\n element.innerText = loc;\r\n handleBlockTextChange(block.id, loc);\r\n element.focus();\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n range.selectNodeContents(element);\r\n range.collapse(false);\r\n sel?.removeAllRanges();\r\n sel?.addRange(range);\r\n }\r\n handleBlur(block.id);\r\n }}\r\n >\r\n <span className=\"text-[12px] font-semibold tracking-wide text-slate-600 uppercase line-clamp-1\">\r\n {loc}\r\n </span>\r\n\r\n <ArrowRight className=\"w-3.5 h-3.5 text-slate-300 opacity-0 -translate-x-2 group-hover:opacity-100 group-hover:translate-x-0 transition-all duration-200\" />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n ) : (\r\n <>\r\n <div\r\n ref={(el) => {\r\n if (!el) return;\r\n refs.current[block.id] = el;\r\n }}\r\n contentEditable={!isLocked}\r\n suppressContentEditableWarning\r\n aria-label={`${blockStyles[block.type].label} text`}\r\n aria-multiline={\r\n block.type === \"ACTION\" || block.type === \"DIALOGUE\"\r\n }\r\n spellCheck={false}\r\n className={`block outline-none w-full min-h-[2.5rem] px-4 py-2 break-words ${\r\n blockStyles[block.type].className\r\n }`}\r\n onInput={(e) =>\r\n handleBlockTextChange(\r\n block.id,\r\n (e.target as HTMLDivElement).innerText,\r\n )\r\n }\r\n onKeyDown={(e) => handleKeyDown(e, block.id, block.text)}\r\n onFocus={() => handleFocus(block.id)}\r\n onBlur={() => handleBlur(block.id)}\r\n style={blockStyles[block.type].inputStyle}\r\n ></div>\r\n {focusedBlockId === block.id &&\r\n block.type === \"CHARACTER\" &&\r\n showSuggestions &&\r\n characters.length > 0 && (\r\n <div\r\n role=\"listbox\"\r\n id={`suggestions-${block.id}`}\r\n className=\"absolute top-[calc(100%+8px)] left-1/2 -translate-x-1/2 w-72 z-50 bg-white border border-slate-200 shadow-2xl shadow-slate-200/60 rounded-xl py-2 overflow-hidden animate-in fade-in zoom-in-95 duration-200\"\r\n >\r\n <div className=\"max-h-56 overflow-y-auto custom-scrollbar\">\r\n {characters\r\n .filter(\r\n (char) =>\r\n char.startsWith(block.text.toUpperCase()) &&\r\n char !== block.text.toUpperCase(),\r\n )\r\n .map((char) => (\r\n <div\r\n role=\"option\"\r\n key={char}\r\n className=\"group flex items-center px-4 py-2.5 cursor-pointer transition-colors duration-150 hover:bg-slate-50 active:bg-slate-100\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n const element = refs.current[block.id];\r\n if (element) {\r\n element.innerText = char;\r\n handleBlockTextChange(block.id, char);\r\n element.focus();\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n range.selectNodeContents(element);\r\n range.collapse(false);\r\n sel?.removeAllRanges();\r\n sel?.addRange(range);\r\n }\r\n handleBlur(block.id);\r\n }}\r\n >\r\n <User className=\"w-3.5 h-3.5 text-slate-300 group-hover:text-blumine-500 transition-colors mr-3\" />\r\n\r\n <span className=\"flex-1 text-[11px] font-bold tracking-[0.1em] text-slate-600 uppercase text-left\">\r\n {char}\r\n </span>\r\n\r\n <ChevronRight className=\"w-3 h-3 text-slate-200 opacity-0 group-hover:opacity-100 transition-all -translate-x-1 group-hover:translate-x-0\" />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n {focusedBlockId === block.id &&\r\n block.type === \"CHARACTER\" &&\r\n showExtensionSuggestions &&\r\n characterExtensions && (\r\n <div\r\n role=\"listbox\"\r\n id={`extension-suggestions-${block.id}`}\r\n className=\"absolute top-[calc(100%+8px)] left-1/2 -translate-x-1/2 w-72 z-50 bg-white border border-slate-200 shadow-2xl shadow-slate-200/60 rounded-xl py-2 overflow-hidden animate-in fade-in zoom-in-95 duration-200\"\r\n >\r\n <div className=\"max-h-56 overflow-y-auto custom-scrollbar\">\r\n {characterExtensions\r\n .filter((ext) => {\r\n const openParenIndex =\r\n block.text.lastIndexOf(\"(\");\r\n const query =\r\n openParenIndex > -1\r\n ? block.text\r\n .substring(openParenIndex + 1)\r\n .toUpperCase()\r\n : \"\";\r\n return ext.toUpperCase().includes(query);\r\n })\r\n .map((ext) => (\r\n <div\r\n role=\"option\"\r\n key={ext}\r\n className=\"group flex items-center px-4 py-2.5 cursor-pointer transition-colors duration-150 hover:bg-slate-50 active:bg-slate-100\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n handleSelectCharacterExtension(ext);\r\n }}\r\n >\r\n <span className=\"flex-1 text-[11px] font-bold tracking-[0.1em] text-slate-600 uppercase text-left\">\r\n {ext}\r\n </span>\r\n <ChevronRight className=\"w-3 h-3 text-slate-200 opacity-0 group-hover:opacity-100 transition-all -translate-x-1 group-hover:translate-x-0\" />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n {focusedBlockId === block.id &&\r\n !enhancingBlockId &&\r\n (block.type === \"ACTION\" || block.type === \"DIALOGUE\") && (\r\n <button\r\n onClick={() => handleEnhance(block)}\r\n className=\"absolute -right-12 top-1/2 -translate-y-1/2 flex items-center justify-center w-8 h-8 rounded-xl border border-blumine-200/50 bg-white text-blumine-500 hover:border-blumine-400/60 hover:bg-blumine-50/90 hover:ring-2 hover:ring-blumine-100 hover:scale-105 active:scale-95 transition-all duration-200 group/enhance animate-in fade-in slide-in-from-left-2\"\r\n title=\"Enhance with AI\"\r\n >\r\n <Sparkles className=\"w-4 h-4 group-hover/enhance:animate-pulse transition-colors\" />\r\n </button>\r\n )}\r\n\r\n {enhancingBlockId === block.id &&\r\n (enhancementSuggestion || isEnhancing) && (\r\n <div\r\n className=\"absolute left-0 right-0 -top-4 -translate-y-full z-[30] animate-in fade-in zoom-in-95 slide-in-from-bottom-4 duration-300\"\r\n style={{ width: \"calc(100% + 2rem)\", left: \"-1rem\" }}\r\n >\r\n <div className=\"mx-auto w-full rounded-[2rem] bg-white border border-white/60 shadow-[0_14px_34px_rgba(16,37,54,0.1),0_2px_8px_rgba(16,37,54,0.05)] backdrop-blur-xl p-2 select-none transition-all\">\r\n <div className=\"flex flex-col gap-3\">\r\n <div className=\"flex items-center justify-between pl-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-9 h-9 flex items-center justify-center rounded-full bg-blumine-50 text-blumine-500 border border-blumine-100 shadow-inner\">\r\n <Sparkles className=\"w-4 h-4\" />\r\n </div>\r\n <div>\r\n <p className=\"text-[11px] font-bold text-zinc-900 uppercase tracking-wider leading-none\">\r\n AI Suggestion\r\n </p>\r\n {!isEnhancing && (\r\n <p className=\"text-[10px] text-zinc-500 mt-1 font-medium\">\r\n Refining your screenplay dialogue\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {!isEnhancing && (\r\n <div className=\"flex items-center gap-1.5\">\r\n <button\r\n onClick={handleRejectEnhance}\r\n className=\"px-3 py-2 rounded-full text-xs font-bold text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900 transition-all active:scale-95\"\r\n >\r\n Discard\r\n </button>\r\n <button\r\n onClick={handleApproveEnhance}\r\n className=\"px-4 py-2 rounded-full text-xs font-bold bg-blumine-500 text-white hover:bg-blumine-600 shadow-lg shadow-blumine-500/20 transition-all active:scale-95 flex items-center gap-1.5\"\r\n >\r\n <Check className=\"w-3.5 h-3.5\" />\r\n Apply Changes\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"relative overflow-hidden rounded-[1.25rem] bg-zinc-50/50 border border-zinc-100 p-4 min-h-[4rem]\">\r\n {isEnhancing ? (\r\n <div className=\"flex flex-col gap-2.5 py-1\">\r\n <div className=\"h-3.5 w-3/4 bg-zinc-200/60 animate-pulse rounded-full\" />\r\n <div className=\"h-3.5 w-1/2 bg-zinc-200/60 animate-pulse rounded-full\" />\r\n </div>\r\n ) : (\r\n <div className=\"flex flex-col gap-2\">\r\n <p className=\"text-xs text-zinc-400 line-through decoration-zinc-300 italic\">\r\n {block.text}\r\n </p>\r\n <p className=\"text-sm text-zinc-800 font-medium leading-relaxed\">\r\n {enhancementSuggestion}\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"absolute -bottom-1.5 left-1/2 -translate-x-1/2 w-3.5 h-3.5 bg-white border-r border-b border-zinc-200/50 rotate-45\" />\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n <div\r\n className={`fixed bottom-10 left-[60%] -translate-x-1/2 z-[100] w-full max-w-[95%] sm:max-w-2xl transition-all duration-500 ease-in-out ${\r\n showUnsavedPopover\r\n ? \"translate-y-0 opacity-100 scale-100\"\r\n : \"translate-y-12 opacity-0 scale-95 pointer-events-none\"\r\n }`}\r\n >\r\n <div className=\"mx-auto rounded-[2.5rem] bg-white/95 border border-white/60 shadow-[0_20px_50px_rgba(16,37,54,0.12),0_4px_12px_rgba(16,37,54,0.05)] backdrop-blur-2xl flex items-center justify-between px-2 py-1.5 sm:px-4 sm:py-2.5 select-none transition-all hover:shadow-[0_25px_60px_rgba(16,37,54,0.18)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 flex items-center justify-center rounded-[2.5rem] bg-blumine-50 text-blumine-500 border border-blumine-100 shadow-inner\">\r\n <Save className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"mr-5\">\r\n <p className=\"text-xs font-bold text-zinc-900 leading-none\">\r\n Unsaved Changes\r\n </p>\r\n <p className=\"text-[11px] text-zinc-500 mt-1 font-medium\">\r\n You have changes that haven't been saved yet.\r\n </p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2 w-full sm:w-auto\">\r\n <button\r\n onClick={ignoreChanges}\r\n className=\"flex-1 sm:flex-none px-4 py-2 rounded-[2.5rem] text-xs font-bold text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900 transition-all active:scale-95 whitespace-nowrap\"\r\n >\r\n Ignore\r\n </button>\r\n <button\r\n onClick={syncScreenplay}\r\n className=\"flex-1 sm:flex-none px-5 py-2 rounded-[2.5rem] text-xs font-bold bg-blumine-500 text-white hover:bg-blumine-600 shadow-lg shadow-blumine-500/25 transition-all active:scale-95 flex items-center justify-center gap-2 whitespace-nowrap\"\r\n >\r\n <RefreshCcw className=\"w-4 h-4\" />\r\n Sync to Cloud\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n","import {\r\n Block,\r\n BlockType,\r\n TimeOfDay,\r\n uuid,\r\n} from \"../types/screenplay-editor.types\";\r\n\r\nexport function getNextBlockType(currentType: BlockType): BlockType {\r\n switch (currentType) {\r\n case \"SCENE_HEADING\":\r\n return \"ACTION\";\r\n case \"CHARACTER\":\r\n return \"PARENTHETICAL\";\r\n case \"PARENTHETICAL\":\r\n return \"DIALOGUE\";\r\n case \"DIALOGUE\":\r\n return \"CHARACTER\";\r\n case \"TRANSITION\":\r\n return \"SCENE_HEADING\";\r\n default:\r\n return \"ACTION\";\r\n }\r\n}\r\n\r\nexport function createNewBlock(type: BlockType): Block {\r\n const newBlock: Block = { id: uuid(), type, text: \"\" };\r\n\r\n if (type === \"SCENE_HEADING\") {\r\n newBlock.sceneType = \"INT.\";\r\n newBlock.timeOfDay = \"DAY\";\r\n newBlock.sceneNumber = \"\"; // Only exists for scenes\r\n } else if (type === \"PARENTHETICAL\") {\r\n newBlock.text = \"()\";\r\n }\r\n\r\n return newBlock;\r\n}\r\n\r\nexport function addBlockAfter(\r\n blocks: Block[],\r\n currentBlockId: string,\r\n): { newBlocks: Block[]; newBlockId: string } {\r\n const currentIndex = blocks.findIndex((b) => b.id === currentBlockId);\r\n if (currentIndex === -1) return { newBlocks: blocks, newBlockId: \"\" };\r\n\r\n const nextType = getNextBlockType(blocks[currentIndex].type);\r\n const newBlock = createNewBlock(nextType);\r\n\r\n // If the NEW block is a scene, calculate its number based on the current list\r\n if (nextType === \"SCENE_HEADING\") {\r\n newBlock.sceneNumber = generateNextSceneNumber(blocks, currentIndex);\r\n }\r\n\r\n const newBlocks = [\r\n ...blocks.slice(0, currentIndex + 1),\r\n newBlock,\r\n ...blocks.slice(currentIndex + 1),\r\n ];\r\n\r\n return { newBlocks, newBlockId: newBlock.id };\r\n}\r\nexport function deleteBlock(\r\n blocks: Block[],\r\n blockIdToDelete: string,\r\n): { newBlocks: Block[]; nextFocusedId: string | null } {\r\n if (blocks.length <= 1) {\r\n return { newBlocks: blocks, nextFocusedId: blocks[0]?.id || null };\r\n }\r\n\r\n const index = blocks.findIndex((b) => b.id === blockIdToDelete);\r\n if (index === -1) {\r\n return { newBlocks: blocks, nextFocusedId: null };\r\n }\r\n\r\n const newBlocks = [...blocks];\r\n newBlocks.splice(index, 1);\r\n\r\n const nextFocusedId =\r\n newBlocks[index]?.id || newBlocks[index - 1]?.id || null;\r\n\r\n return { newBlocks, nextFocusedId };\r\n}\r\n\r\nexport function updateBlock<K extends keyof Block>(\r\n blocks: Block[],\r\n id: string,\r\n key: K,\r\n value: Block[K],\r\n): Block[] {\r\n return blocks.map((b) => (b.id === id ? { ...b, [key]: value } : b));\r\n}\r\n\r\nexport const generateNextSceneNumber = (\r\n blocks: Block[],\r\n currentIndex: number, // The index of the block where Enter was pressed\r\n): string => {\r\n // Find all scene headings before the current cursor\r\n const prevScenes = blocks\r\n .slice(0, currentIndex + 1)\r\n .filter((b) => b.type === \"SCENE_HEADING\");\r\n\r\n // 1. If it's the first scene in the script\r\n if (prevScenes.length === 0) return \"1\";\r\n\r\n const lastScene = prevScenes[prevScenes.length - 1];\r\n const lastNum = lastScene.sceneNumber || \"1\";\r\n\r\n // Match pattern: \"1\" -> [\"1\", \"\"] | \"1A\" -> [\"1\", \"A\"]\r\n const match = lastNum.match(/^(\\d+)([A-Z]*)$/);\r\n if (!match) return \"1\";\r\n\r\n const baseNumber = match[1];\r\n const currentSuffix = match[2];\r\n\r\n // 2. Determine if we are INSERTING or APPENDING\r\n // Look for any scene headings that exist AFTER the current cursor position\r\n const scenesAfter = blocks\r\n .slice(currentIndex + 1)\r\n .filter((b) => b.type === \"SCENE_HEADING\");\r\n\r\n if (scenesAfter.length > 0) {\r\n // --- INSERTION LOGIC (StudioBinder Style) ---\r\n // If we are between 1 and 2, we take \"1\" and add/increment a letter\r\n if (currentSuffix === \"\") {\r\n return `${baseNumber}A`;\r\n } else {\r\n return `${baseNumber}${incrementChar(currentSuffix)}`;\r\n }\r\n }\r\n\r\n // --- APPENDING LOGIC ---\r\n // If we are at the very end of the script, just increment the number (1 -> 2)\r\n return String(parseInt(baseNumber) + 1);\r\n};\r\n\r\n// Helper to handle alphabet incrementing: A -> B, Z -> AA\r\nfunction incrementChar(text: string): string {\r\n if (text === \"\") return \"A\";\r\n const lastChar = text.slice(-1);\r\n const remaining = text.slice(0, -1);\r\n\r\n if (lastChar === \"Z\") {\r\n return incrementChar(remaining) + \"A\";\r\n }\r\n return remaining + String.fromCharCode(lastChar.charCodeAt(0) + 1);\r\n}\r\n\r\nexport function changeBlockType(\r\n blocks: Block[],\r\n id: string,\r\n newType: BlockType,\r\n) {\r\n const currentIndex = blocks.findIndex((b) => b.id === id);\r\n if (currentIndex === -1) return blocks;\r\n\r\n const currentBlock = blocks[currentIndex];\r\n const newBlock = createNewBlock(newType);\r\n\r\n // --- PERSISTENCE LOGIC ---\r\n // Keep the old text unless it's a Parenthetical (which needs specific formatting)\r\n if (newType === \"PARENTHETICAL\") {\r\n const cleanText = currentBlock.text.replace(/[()]/g, \"\");\r\n newBlock.text = `(${cleanText})`;\r\n } else {\r\n newBlock.text = currentBlock.text;\r\n }\r\n\r\n if (newType === \"SCENE_HEADING\") {\r\n newBlock.sceneNumber = generateNextSceneNumber(blocks, currentIndex);\r\n // Optional: Auto-uppercase text if switching to a scene heading\r\n newBlock.text = newBlock.text.toUpperCase();\r\n }\r\n\r\n return blocks.map((b) => (b.id === id ? { ...newBlock, id: b.id } : b));\r\n}\r\n\r\nexport function parseScreenplayText(content: string): Block[] {\r\n const lines = content.split(\"\\n\");\r\n const blocks: Block[] = [];\r\n let lastBlock: Block | null = null;\r\n let activeSpeaker: string | null = null;\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n let originalLine = lines[i]; // Don't trim yet\r\n let trimmedLine = lines[i].trim().replace(/\\s+/g, \" \");\r\n // 1. STANDARDIZE TEXT\r\n const leadingSpaces = originalLine.search(/\\S/);\r\n\r\n // --- FIX 1: RESET CONTEXT ON EMPTY LINES ---\r\n // This ensures that after \"Another!\", the speaker is cleared before the Action starts.\r\n if (lines[i].trim() === \"\") {\r\n activeSpeaker = null;\r\n continue;\r\n }\r\n\r\n // 2. PAGE NUMBER FILTER\r\n const isPageNumber =\r\n /^\\d+$/.test(trimmedLine) ||\r\n /^(PAGE|pg\\.?)\\s?\\d+$/i.test(trimmedLine) ||\r\n /^[\\d]+\\.$/.test(trimmedLine);\r\n\r\n if (trimmedLine.length === 0 || isPageNumber) continue;\r\n\r\n let currentBlockType: BlockType | null = null;\r\n const isAllUpperCase =\r\n trimmedLine === trimmedLine.toUpperCase() && /[A-Z]/.test(trimmedLine);\r\n\r\n // 3. IDENTIFY STRUCTURAL BLOCKS\r\n const sceneHeadingStartRegex =\r\n /^(?:\\d+[A-Z]?\\.?\\s*)?(INT\\.?\\/EXT\\.?|I\\/E|INT|EXT|EST\\.)\\b/i;\r\n const isTransition =\r\n isAllUpperCase &&\r\n (trimmedLine.endsWith(\" TO:\") ||\r\n [\"FADE IN:\", \"FADE OUT.\", \"CUT TO BLACK.\"].includes(trimmedLine));\r\n\r\n if (sceneHeadingStartRegex.test(trimmedLine)) {\r\n currentBlockType = \"SCENE_HEADING\";\r\n activeSpeaker = null;\r\n } else if (isTransition) {\r\n currentBlockType = \"TRANSITION\";\r\n activeSpeaker = null;\r\n }\r\n // 4. CHARACTER DETECTION\r\n else if (isAllUpperCase && !trimmedLine.startsWith(\"(\")) {\r\n let nextLine = \"\";\r\n for (let j = i + 1; j < lines.length; j++) {\r\n const nextTrimmed = lines[j].trim();\r\n const nextIsPage =\r\n /^\\d+$/.test(nextTrimmed) ||\r\n /^(PAGE|pg\\.?)\\s?\\d+$/i.test(nextTrimmed);\r\n if (nextTrimmed.length > 0 && !nextIsPage) {\r\n nextLine = nextTrimmed;\r\n break;\r\n }\r\n }\r\n\r\n if (\r\n (nextLine &&\r\n (nextLine.startsWith(\"(\") || nextLine !== nextLine.toUpperCase())) ||\r\n /\\s\\(.*\\)$/.test(trimmedLine)\r\n ) {\r\n currentBlockType = \"CHARACTER\";\r\n activeSpeaker = trimmedLine;\r\n } else {\r\n currentBlockType = \"ACTION\";\r\n activeSpeaker = null;\r\n }\r\n }\r\n // 5. PARENTHETICALS\r\n else if (trimmedLine.startsWith(\"(\") && trimmedLine.endsWith(\")\")) {\r\n currentBlockType = \"PARENTHETICAL\";\r\n }\r\n // 6. DIALOGUE (Persistent Context)\r\n else if (\r\n activeSpeaker &&\r\n (lastBlock?.type === \"CHARACTER\" ||\r\n lastBlock?.type === \"PARENTHETICAL\" ||\r\n lastBlock?.type === \"DIALOGUE\")\r\n ) {\r\n // 1. Check if the previous block of dialogue actually ended.\r\n // If it ends in a comma, or no punctuation at all, it's almost certainly\r\n // just the dialogue wrapping to a new line.\r\n const isLastLineComplete = /[.!?]\"?$/.test(lastBlock.text.trim());\r\n\r\n // 2. The Indentation Check (The \"Hard\" Break)\r\n // We only allow a switch to Action if the indentation is low AND\r\n // the previous dialogue sentence felt finished.\r\n if (\r\n leadingSpaces < 15 &&\r\n lastBlock?.type !== \"CHARACTER\" &&\r\n isLastLineComplete\r\n ) {\r\n currentBlockType = \"ACTION\";\r\n activeSpeaker = null;\r\n } else {\r\n currentBlockType = \"DIALOGUE\";\r\n }\r\n }\r\n // 7. DEFAULT ACTION\r\n else {\r\n currentBlockType = \"ACTION\";\r\n activeSpeaker = null;\r\n }\r\n\r\n // --- Block Construction & Scene Metadata Extraction ---\r\n // --- FIX 2: PREVENT IMPROPER MERGING ---\r\n if (\r\n lastBlock &&\r\n lastBlock.type === currentBlockType &&\r\n (currentBlockType === \"ACTION\" || currentBlockType === \"DIALOGUE\") &&\r\n !(currentBlockType === \"DIALOGUE\" && !activeSpeaker) // Added this guard\r\n ) {\r\n lastBlock.text += \" \" + trimmedLine;\r\n } else {\r\n const newBlock = createNewBlock(currentBlockType);\r\n\r\n if (currentBlockType === \"SCENE_HEADING\") {\r\n let workingLine = trimmedLine;\r\n\r\n const sceneNumMatch = workingLine.match(/^(\\d+[A-Z]*)\\.?\\s+/i);\r\n\r\n if (sceneNumMatch) {\r\n // 1. SAVE AS RAW STRING (e.g., \"24A\")\r\n newBlock.sceneNumber = String(sceneNumMatch[1]).toUpperCase();\r\n // Strip \"24A. \" from the text so the editor stays clean\r\n workingLine = workingLine.replace(/^(\\d+[A-Z]*)\\.?\\s+/i, \"\").trim();\r\n } else {\r\n // 2. NO NUMBER FOUND: Set to empty string\r\n newBlock.sceneNumber = \"\";\r\n }\r\n\r\n const typeMatch = workingLine.match(\r\n /^(INT\\.?\\/EXT\\.?|I\\/E|INT|EXT|EST\\.)/i,\r\n );\r\n if (typeMatch) {\r\n let sType = typeMatch[0].toUpperCase().replace(/[^A-Z/.]/g, \"\");\r\n if (!sType.endsWith(\".\")) sType += \".\";\r\n newBlock.sceneType = sType as any;\r\n workingLine = workingLine.substring(typeMatch[0].length).trim();\r\n }\r\n\r\n const suffixRegex =\r\n /[.\\-\\s]+(DAY|NIGHT|CONTINUOUS|LATER|MORNING|EVENING|DUSK|DAWN|MORN|AFT|SUNSET|SUNRISE)(?:\\s+.*)*$/i;\r\n const suffixMatch = workingLine.match(suffixRegex);\r\n\r\n if (suffixMatch) {\r\n const rawTime = suffixMatch[1].toUpperCase();\r\n const nightKeys = [\"NIGHT\", \"EVENING\", \"DUSK\", \"SUNSET\"];\r\n newBlock.timeOfDay = nightKeys.includes(rawTime) ? \"NIGHT\" : \"DAY\";\r\n workingLine = workingLine.substring(0, suffixMatch.index).trim();\r\n } else {\r\n workingLine = workingLine.replace(/\\s+\\d+(\\s+\\d+)*$/, \"\").trim();\r\n newBlock.timeOfDay = \"DAY\";\r\n }\r\n\r\n newBlock.text = workingLine\r\n .replace(/^[-.\\s]+/, \"\")\r\n .replace(/[-.\\s]+$/, \"\")\r\n .toUpperCase();\r\n } else {\r\n newBlock.text = trimmedLine;\r\n }\r\n\r\n blocks.push(newBlock);\r\n lastBlock = newBlock;\r\n }\r\n }\r\n\r\n return blocks.length > 0 ? blocks : [createNewBlock(\"SCENE_HEADING\")];\r\n}\r\n\r\nexport function serializeToSbx(blocks: Block[]): string {\r\n const typeToDivClass: Record<string, string> = {\r\n SCENE_HEADING: \"divtype0\",\r\n ACTION: \"divtype2\",\r\n CHARACTER: \"divtype3\",\r\n PARENTHETICAL: \"divtype4\",\r\n DIALOGUE: \"divtype5\",\r\n TRANSITION: \"divtype6\",\r\n GENERAL: \"divtype2\",\r\n };\r\n\r\n return blocks\r\n .map((block) => {\r\n const divClass = typeToDivClass[block.type] || \"divtype2\";\r\n let text = block.text || \"\";\r\n let extraAttributes = \"\";\r\n\r\n if (block.type === \"SCENE_HEADING\") {\r\n text =\r\n `${block.sceneType || \"INT.\"} ${text} - ${block.timeOfDay || \"DAY\"}`.toUpperCase();\r\n if (block.sceneNumber) {\r\n extraAttributes = ` data-scene=\"${block.sceneNumber}\"`;\r\n }\r\n } else if (block.type === \"CHARACTER\" || block.type === \"TRANSITION\") {\r\n text = text.toUpperCase();\r\n }\r\n\r\n return `<div class=\"${divClass}\" id=\"par${block.id}\"${extraAttributes}>${text}</div>`;\r\n })\r\n .join(\"\");\r\n}\r\n","\"use client\";\r\nimport React, {\r\n useState,\r\n useRef,\r\n KeyboardEvent,\r\n useEffect,\r\n useMemo,\r\n useCallback,\r\n} from \"react\";\r\nimport {\r\n Block,\r\n BlockType,\r\n TimeOfDay,\r\n uuid,\r\n blockTypes,\r\n} from \"../types/screenplay-editor.types\";\r\nimport * as ScreenplayService from \"../service/screenplay-editor.service\";\r\n\r\nconst initialBlocks: Block[] = [\r\n {\r\n id: uuid(),\r\n type: \"SCENE_HEADING\",\r\n text: \"\",\r\n sceneNumber: \"1\",\r\n sceneType: \"INT.\",\r\n timeOfDay: \"DAY\",\r\n },\r\n];\r\n\r\nfunction getCaretCharacterOffsetWithin(element: HTMLElement) {\r\n let caretOffset = 0;\r\n const doc = element.ownerDocument;\r\n const win = doc.defaultView;\r\n const sel = win?.getSelection();\r\n if (sel && sel.rangeCount > 0) {\r\n const range = sel.getRangeAt(0);\r\n const preCaretRange = range.cloneRange();\r\n preCaretRange.selectNodeContents(element);\r\n preCaretRange.setEnd(range.endContainer, range.endOffset);\r\n caretOffset = preCaretRange.toString().length;\r\n }\r\n return caretOffset;\r\n}\r\n\r\nfunction setCaretPosition(element: HTMLElement, offset: number) {\r\n const sel = window.getSelection();\r\n if (!sel) return;\r\n const range = document.createRange();\r\n let currentOffset = 0;\r\n let found = false;\r\n\r\n function traverseNodes(node: Node) {\r\n if (found) return;\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n const length = node.nodeValue?.length || 0;\r\n if (currentOffset + length >= offset) {\r\n range.setStart(node, offset - currentOffset);\r\n range.collapse(true);\r\n found = true;\r\n } else {\r\n currentOffset += length;\r\n }\r\n } else {\r\n for (let i = 0; i < node.childNodes.length; i++) {\r\n traverseNodes(node.childNodes[i]);\r\n if (found) break;\r\n }\r\n }\r\n }\r\n\r\n traverseNodes(element);\r\n\r\n if (!found) {\r\n range.setStart(element, 0);\r\n range.collapse(true);\r\n }\r\n\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n}\r\n\r\nexport interface UseScreenplayEditorOptions {\r\n initialUrl?: string;\r\n fetchOptions?: RequestInit;\r\n onSave?: (content?: Blob) => void;\r\n onSyncWithCloud?: (\r\n blocks: Block[],\r\n sceneNumbers: Record<string, string>,\r\n ) => void;\r\n enhanceContentUrl?: string | URL | Request;\r\n}\r\n\r\nexport function useScreenplayEditor(options?: UseScreenplayEditorOptions) {\r\n const [blocks, setBlocks] = useState<Block[]>(initialBlocks);\r\n const refs = useRef<Record<string, HTMLDivElement | null>>({});\r\n const [focusedBlockId, setFocusedBlockId] = useState<string>(\r\n initialBlocks[0].id,\r\n );\r\n const [newBlockId, setNewBlockId] = useState<string | null>(null);\r\n const [showSuggestions, setShowSuggestions] = useState(false);\r\n const [showExtensionSuggestions, setShowExtensionSuggestions] =\r\n useState(false);\r\n const [isLoading, setIsLoading] = useState(!!options?.initialUrl);\r\n const [enhancingBlockId, setEnhancingBlockId] = useState<string | null>(null);\r\n const [enhancementSuggestion, setEnhancementSuggestion] = useState<\r\n string | null\r\n >(null);\r\n const [isEnhancing, setIsEnhancing] = useState(false);\r\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\r\n const [showUnsavedPopover, setShowUnsavedPopover] = useState(false);\r\n const popoverTimeoutRef = useRef<NodeJS.Timeout | null>(null);\r\n const blurTimeout = useRef<NodeJS.Timeout | null>(null);\r\n const isInitialLoadRef = useRef(true);\r\n const loadedUrlRef = useRef<string | null>(null);\r\n const lastSavedContent = useRef<string | null>(null);\r\n const onSaveRef = useRef(options?.onSave);\r\n const onSyncWithCloudRef = useRef(options?.onSyncWithCloud);\r\n\r\n useEffect(() => {\r\n onSaveRef.current = options?.onSave;\r\n onSyncWithCloudRef.current = options?.onSyncWithCloud;\r\n }, [options?.onSave, options?.onSyncWithCloud]);\r\n\r\n const characterExtensions = useMemo(\r\n () => [\"(V.O.)\", \"(O.S.)\", \"(O.C.)\", \"(SUBTITLE)\", \"(CONT'D)\"],\r\n [],\r\n );\r\n\r\n const handleSceneNumberChange = useCallback(\r\n (id: string, newNumber: string) => {\r\n setBlocks((prevBlocks) =>\r\n prevBlocks.map((block) =>\r\n block.id === id\r\n ? { ...block, sceneNumber: newNumber.toUpperCase() }\r\n : block,\r\n ),\r\n );\r\n },\r\n [],\r\n );\r\n\r\n // Derived State\r\n const locations = useMemo(() => {\r\n const locs = blocks\r\n .filter((b) => b.type === \"SCENE_HEADING\" && b.text.trim() !== \"\")\r\n .map((b) => b.text.trim().toUpperCase());\r\n return [...new Set(locs)];\r\n }, [blocks]);\r\n\r\n const characters = useMemo(() => {\r\n const chars = blocks\r\n .filter((b) => b.type === \"CHARACTER\" && b.text.trim() !== \"\")\r\n .map((b) => {\r\n const text = b.text.trim().toUpperCase();\r\n const parenIndex = text.indexOf(\"(\");\r\n if (parenIndex > -1) {\r\n return text.substring(0, parenIndex).trim();\r\n }\r\n return text;\r\n })\r\n .filter(Boolean);\r\n return [...new Set(chars)];\r\n }, [blocks]);\r\n\r\n const sceneNumbers = useMemo(() => {\r\n const map: Record<string, string> = {};\r\n let fallbackCount = 0;\r\n\r\n blocks.forEach((block) => {\r\n if (block.type === \"SCENE_HEADING\") {\r\n if (block.sceneNumber) {\r\n map[block.id] = block.sceneNumber;\r\n const base = parseInt(block.sceneNumber);\r\n if (!isNaN(base)) fallbackCount = Math.max(fallbackCount, base);\r\n } else {\r\n fallbackCount++;\r\n map[block.id] = String(fallbackCount);\r\n }\r\n }\r\n });\r\n return map;\r\n }, [blocks]);\r\n\r\n useEffect(() => {\r\n if (newBlockId && refs.current[newBlockId]) {\r\n const block = blocks.find((b) => b.id === newBlockId);\r\n const el = refs.current[newBlockId];\r\n if (el && block) {\r\n el.focus();\r\n el.innerText = block.text;\r\n if (block.type === \"PARENTHETICAL\") {\r\n setTimeout(() => setCaretPosition(el, 1), 0);\r\n } else {\r\n setTimeout(() => setCaretPosition(el, block.text.length), 0);\r\n }\r\n }\r\n setFocusedBlockId(newBlockId);\r\n setNewBlockId(null);\r\n }\r\n }, [newBlockId, blocks]);\r\n\r\n useEffect(() => {\r\n blocks.forEach((block) => {\r\n const element = refs.current[block.id];\r\n if (element) {\r\n if (\r\n element.innerText !== block.text &&\r\n document.activeElement !== element\r\n ) {\r\n element.innerText = block.text;\r\n }\r\n }\r\n });\r\n }, [blocks]);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (e: MouseEvent) => {\r\n // Check if the clicked element is a contentEditable block or inside the toolbar\r\n const target = e.target as HTMLElement;\r\n const isInsideBlock = target.closest(\"[data-block-id]\");\r\n const isInsideToolbar = target.closest(\".sticky\"); // Adjust selector based on your UI\r\n const isInsideSuggestions = target.closest('[role=\"listbox\"]');\r\n\r\n if (!isInsideBlock && !isInsideToolbar && !isInsideSuggestions) {\r\n setFocusedBlockId(\"\");\r\n setShowSuggestions(false);\r\n setShowExtensionSuggestions(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n };\r\n }, []);\r\n\r\n // Handlers\r\n const handleBlockTextChange = useCallback(\r\n (id: string, text: string) => {\r\n const block = blocks.find((b) => b.id === id);\r\n if (!block) return;\r\n\r\n if (block.type === \"CHARACTER\") {\r\n const trimmedText = text.trim();\r\n const openParenIndex = trimmedText.lastIndexOf(\"(\");\r\n const closeParenIndex = trimmedText.lastIndexOf(\")\");\r\n\r\n if (openParenIndex !== -1 && openParenIndex > closeParenIndex) {\r\n setShowExtensionSuggestions(true);\r\n setShowSuggestions(false);\r\n } else {\r\n setShowExtensionSuggestions(false);\r\n setShowSuggestions(openParenIndex === -1);\r\n }\r\n } else if (showExtensionSuggestions) {\r\n setShowExtensionSuggestions(false);\r\n }\r\n\r\n let processedText = text;\r\n if (block.type === \"PARENTHETICAL\") {\r\n const clean = text.replace(/[()]/g, \"\");\r\n processedText = `(${clean})`;\r\n }\r\n\r\n setBlocks((bs) =>\r\n ScreenplayService.updateBlock(bs, id, \"text\", processedText),\r\n );\r\n\r\n if (text !== processedText) {\r\n const el = refs.current[id];\r\n if (el) {\r\n const offset = getCaretCharacterOffsetWithin(el);\r\n const charsBeforeCaret = text\r\n .substring(0, offset)\r\n .replace(/[()]/g, \"\").length;\r\n const newOffset = 1 + charsBeforeCaret;\r\n el.innerText = processedText;\r\n setCaretPosition(el, newOffset);\r\n }\r\n }\r\n },\r\n [blocks, showExtensionSuggestions],\r\n );\r\n\r\n const handleSceneTypeChange = useCallback(\r\n (id: string, sceneType: \"INT.\" | \"EXT.\" | \"INT/EXT.\") => {\r\n setBlocks((bs) =>\r\n ScreenplayService.updateBlock(bs, id, \"sceneType\", sceneType),\r\n );\r\n setTimeout(() => {\r\n refs.current[id]?.focus();\r\n setFocusedBlockId(id);\r\n }, 10);\r\n },\r\n [],\r\n );\r\n\r\n const handleTimeOfDayChange = useCallback((id: string, time: TimeOfDay) => {\r\n setBlocks((bs) => ScreenplayService.updateBlock(bs, id, \"timeOfDay\", time));\r\n setTimeout(() => {\r\n refs.current[id]?.focus();\r\n setFocusedBlockId(id);\r\n }, 10);\r\n }, []);\r\n\r\n const handleBlockTypeChange = useCallback(\r\n (newType: BlockType) => {\r\n if (!focusedBlockId) return;\r\n\r\n // The service now handles text preservation\r\n setBlocks((bs) =>\r\n ScreenplayService.changeBlockType(bs, focusedBlockId, newType),\r\n );\r\n\r\n setTimeout(() => {\r\n const el = refs.current[focusedBlockId];\r\n if (el) {\r\n el.focus();\r\n // REMOVE the line: el.innerText = newBlock.text;\r\n // Instead, let the useEffect handle syncing the text or set it from the current state\r\n const currentBlock = blocks.find((b) => b.id === focusedBlockId);\r\n if (currentBlock) {\r\n // Move caret to the end of the existing text\r\n const pos =\r\n newType === \"PARENTHETICAL\"\r\n ? el.innerText.length - 1\r\n : el.innerText.length;\r\n setCaretPosition(el, Math.max(0, pos));\r\n }\r\n }\r\n }, 10);\r\n },\r\n [focusedBlockId, blocks],\r\n );\r\n\r\n const handleSelectCharacterExtension = useCallback(\r\n (extension: string) => {\r\n if (!focusedBlockId) return;\r\n\r\n setBlocks((currentBlocks) => {\r\n const block = currentBlocks.find((b) => b.id === focusedBlockId);\r\n if (!block || block.type !== \"CHARACTER\") return currentBlocks;\r\n\r\n const parenIndex = block.text.indexOf(\"(\");\r\n const baseText = (\r\n parenIndex > -1 ? block.text.substring(0, parenIndex) : block.text\r\n ).trim();\r\n const newText = `${baseText} ${extension}`;\r\n\r\n const newBlocks = ScreenplayService.updateBlock(\r\n currentBlocks,\r\n focusedBlockId,\r\n \"text\",\r\n newText,\r\n );\r\n\r\n setTimeout(() => {\r\n const el = refs.current[focusedBlockId];\r\n if (el) {\r\n el.innerText = newText;\r\n el.focus();\r\n setCaretPosition(el, newText.length);\r\n }\r\n }, 0);\r\n return newBlocks;\r\n });\r\n setShowExtensionSuggestions(false);\r\n },\r\n [focusedBlockId],\r\n );\r\n\r\n const focusBlock = (id: string, position: \"start\" | \"end\" = \"start\") => {\r\n const el = refs.current[id];\r\n if (!el) return;\r\n\r\n el.focus();\r\n\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n if (!sel) return;\r\n\r\n range.selectNodeContents(el);\r\n range.collapse(position === \"start\");\r\n\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n };\r\n\r\n const cycleBlockType = (id: string, direction: \"up\" | \"down\") => {\r\n const block = blocks.find((b) => b.id === id);\r\n if (!block) return;\r\n\r\n const idx = blockTypes.indexOf(block.type);\r\n let newIdx = direction === \"up\" ? idx - 1 : idx + 1;\r\n if (newIdx < 0) newIdx = blockTypes.length - 1;\r\n if (newIdx >= blockTypes.length) newIdx = 0;\r\n\r\n const newType = blockTypes[newIdx];\r\n\r\n setBlocks((bs) => ScreenplayService.changeBlockType(bs, id, newType));\r\n\r\n // Handle the DOM and Caret after the state update\r\n setTimeout(() => {\r\n const el = refs.current[id];\r\n if (el) {\r\n el.focus();\r\n\r\n if (newType === \"PARENTHETICAL\") {\r\n setCaretPosition(el, 1);\r\n } else {\r\n setCaretPosition(el, el.innerText.length);\r\n }\r\n }\r\n }, 10);\r\n };\r\n\r\n const handleKeyDown = useCallback(\r\n (e: KeyboardEvent<HTMLDivElement>, id: string, text: string) => {\r\n const block = blocks.find((b) => b.id === id);\r\n\r\n if (block?.type === \"PARENTHETICAL\") {\r\n const offset = getCaretCharacterOffsetWithin(e.currentTarget);\r\n\r\n if (e.key === \"Backspace\" && (offset <= 1 || text === \"()\")) {\r\n e.preventDefault();\r\n cycleBlockType(id, \"up\");\r\n return;\r\n }\r\n if (\r\n e.key === \"Delete\" &&\r\n (offset >= text.length - 1 || text === \"()\")\r\n ) {\r\n e.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n if ((e.key === \"Backspace\" || e.key === \"Delete\") && text.length <= 1) {\r\n e.preventDefault();\r\n const { newBlocks, nextFocusedId } = ScreenplayService.deleteBlock(\r\n blocks,\r\n id,\r\n );\r\n setBlocks(newBlocks);\r\n if (nextFocusedId) {\r\n setTimeout(() => {\r\n focusBlock(nextFocusedId, \"end\");\r\n }, 0);\r\n }\r\n return;\r\n }\r\n\r\n if (e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n const { newBlocks, newBlockId } = ScreenplayService.addBlockAfter(\r\n blocks,\r\n id,\r\n );\r\n setBlocks(newBlocks);\r\n setNewBlockId(newBlockId);\r\n } else if (e.key === \"ArrowUp\" && e.ctrlKey) {\r\n e.preventDefault();\r\n cycleBlockType(id, \"up\");\r\n } else if (e.key === \"ArrowDown\" && e.ctrlKey) {\r\n e.preventDefault();\r\n cycleBlockType(id, \"down\");\r\n } else if (e.key === \"ArrowUp\" && !e.ctrlKey) {\r\n const selection = window.getSelection();\r\n if (\r\n !selection ||\r\n !selection.isCollapsed ||\r\n selection.rangeCount === 0\r\n ) {\r\n return;\r\n }\r\n\r\n const range = selection.getRangeAt(0);\r\n const contentEditable = e.currentTarget as HTMLDivElement;\r\n\r\n let atStart = false;\r\n if (range.startOffset === 0) {\r\n let node = range.startContainer;\r\n if (node === contentEditable) {\r\n atStart = true;\r\n } else {\r\n let atStartOfParents = true;\r\n while (node !== contentEditable) {\r\n if (node.previousSibling) {\r\n atStartOfParents = false;\r\n break;\r\n }\r\n node = node.parentNode!;\r\n if (!node) {\r\n atStartOfParents = false;\r\n break;\r\n }\r\n }\r\n atStart = atStartOfParents;\r\n }\r\n }\r\n\r\n if (atStart) {\r\n e.preventDefault();\r\n const currentIndex = blocks.findIndex((b) => b.id === id);\r\n if (currentIndex > 0) {\r\n const prevBlockId = blocks[currentIndex - 1].id;\r\n focusBlock(prevBlockId, \"end\");\r\n }\r\n }\r\n } else if (e.key === \"ArrowDown\" && !e.ctrlKey) {\r\n const selection = window.getSelection();\r\n if (\r\n !selection ||\r\n !selection.isCollapsed ||\r\n selection.rangeCount === 0\r\n ) {\r\n return;\r\n }\r\n\r\n const range = selection.getRangeAt(0);\r\n const contentEditable = e.currentTarget as HTMLDivElement;\r\n const container = range.endContainer;\r\n\r\n const isAtEndOffset =\r\n range.endOffset ===\r\n (container.nodeType === Node.TEXT_NODE\r\n ? container.textContent?.length\r\n : container.childNodes.length);\r\n\r\n if (isAtEndOffset) {\r\n let atEnd = false;\r\n let node = container;\r\n if (node === contentEditable) {\r\n atEnd = true;\r\n } else {\r\n let atEndOfParents = true;\r\n while (node !== contentEditable) {\r\n if (node.nextSibling) {\r\n atEndOfParents = false;\r\n break;\r\n }\r\n node = node.parentNode!;\r\n if (!node) {\r\n atEndOfParents = false;\r\n break;\r\n }\r\n }\r\n atEnd = atEndOfParents;\r\n }\r\n\r\n if (atEnd) {\r\n e.preventDefault();\r\n const currentIndex = blocks.findIndex((b) => b.id === id);\r\n if (currentIndex < blocks.length - 1) {\r\n const nextBlockId = blocks[currentIndex + 1].id;\r\n focusBlock(nextBlockId, \"start\");\r\n }\r\n }\r\n }\r\n }\r\n },\r\n [blocks, handleBlockTextChange],\r\n );\r\n\r\n const handleScriptImport = useCallback(\r\n (\r\n title: string,\r\n content: string,\r\n preParsedBlocks?: Partial<Block>[],\r\n isInitialLoad?: boolean,\r\n ) => {\r\n let parsedBlocks: Block[] = [];\r\n\r\n // Directly use provided blocks (like from an SBX file) or parse standard text\r\n if (preParsedBlocks && preParsedBlocks.length > 0) {\r\n parsedBlocks = preParsedBlocks.map((b) => ({\r\n id: b.id || uuid(),\r\n type: b.type || \"ACTION\",\r\n text: b.text || \"\",\r\n sceneNumber: b.sceneNumber,\r\n sceneType: b.sceneType,\r\n timeOfDay: b.timeOfDay,\r\n })) as Block[];\r\n } else {\r\n parsedBlocks = ScreenplayService.parseScreenplayText(content);\r\n }\r\n\r\n if (parsedBlocks.length > 0) {\r\n let fallbackCount = 1;\r\n\r\n const finalizedBlocks = parsedBlocks.map((block) => {\r\n if (block.type === \"SCENE_HEADING\") {\r\n // RULE 1: If the parser found ANY string (24A, 1, 10-B), USE IT.\r\n // We do zero math on it.\r\n if (block.sceneNumber && block.sceneNumber.trim().length > 0) {\r\n // Only update our fallback counter if we see a plain number (e.g. \"24\")\r\n // If we see \"24A\", we DON'T update the count so the next scene stays on track.\r\n const isPureNumber = /^\\d+$/.test(block.sceneNumber);\r\n if (isPureNumber) {\r\n fallbackCount = parseInt(block.sceneNumber) + 1;\r\n }\r\n\r\n return block;\r\n }\r\n\r\n // RULE 2: Fallback ONLY for scenes that had no number in the script\r\n return { ...block, sceneNumber: String(fallbackCount++) };\r\n }\r\n return block;\r\n });\r\n\r\n setBlocks(finalizedBlocks);\r\n\r\n if (onSaveRef.current) {\r\n const sbxData = ScreenplayService.serializeToSbx(finalizedBlocks);\r\n\r\n // Only save if the data is different from what we last saved\r\n if (sbxData !== lastSavedContent.current) {\r\n lastSavedContent.current = sbxData;\r\n if (!isInitialLoad) {\r\n const blob = new Blob([sbxData], { type: \"text/plain\" });\r\n onSaveRef.current(blob);\r\n }\r\n }\r\n }\r\n\r\n // 3. Focus logic\r\n setTimeout(() => {\r\n const firstId = parsedBlocks[0].id;\r\n if (firstId && refs.current[firstId]) {\r\n setFocusedBlockId(firstId);\r\n refs.current[firstId]?.focus();\r\n }\r\n }, 100);\r\n }\r\n },\r\n [refs],\r\n );\r\n const handleFocus = useCallback(\r\n (id: string) => {\r\n if (blurTimeout.current) {\r\n clearTimeout(blurTimeout.current);\r\n }\r\n setFocusedBlockId(id);\r\n const block = blocks.find((b) => b.id === id);\r\n if (block?.type === \"CHARACTER\") {\r\n const trimmedText = block.text.trim();\r\n const openParenIndex = trimmedText.lastIndexOf(\"(\");\r\n const closeParenIndex = trimmedText.lastIndexOf(\")\");\r\n\r\n if (openParenIndex !== -1 && openParenIndex > closeParenIndex) {\r\n setShowExtensionSuggestions(true);\r\n setShowSuggestions(false);\r\n } else {\r\n setShowExtensionSuggestions(false);\r\n setShowSuggestions(openParenIndex === -1);\r\n }\r\n } else {\r\n setShowSuggestions(true);\r\n setShowExtensionSuggestions(false);\r\n }\r\n },\r\n [blocks],\r\n );\r\n\r\n const handleBlur = useCallback((id: string) => {\r\n if (document.activeElement === refs.current[id]) return;\r\n blurTimeout.current = setTimeout(() => {\r\n setShowSuggestions(false);\r\n setShowExtensionSuggestions(false);\r\n }, 200);\r\n }, []);\r\n\r\n const syncScreenplay = useCallback(() => {\r\n if (!onSyncWithCloudRef.current) return;\r\n\r\n onSyncWithCloudRef.current(blocks, sceneNumbers);\r\n lastSavedContent.current = ScreenplayService.serializeToSbx(blocks);\r\n setHasUnsavedChanges(false);\r\n setShowUnsavedPopover(false);\r\n if (popoverTimeoutRef.current) clearTimeout(popoverTimeoutRef.current);\r\n }, [blocks, sceneNumbers]);\r\n\r\n const ignoreChanges = useCallback(() => {\r\n setShowUnsavedPopover(false);\r\n if (popoverTimeoutRef.current) clearTimeout(popoverTimeoutRef.current);\r\n }, []);\r\n\r\n const loadFromUrl = useCallback(\r\n async (\r\n url: string,\r\n fetchOptions: RequestInit = {},\r\n isInitialLoad?: boolean,\r\n ) => {\r\n setIsLoading(true);\r\n try {\r\n const response = await fetch(url, fetchOptions);\r\n if (!response.ok) {\r\n throw new Error(\r\n `[useScreenplayEditor] Failed to fetch script. HTTP Status: ${response.status}`,\r\n );\r\n }\r\n\r\n let text = await response.text();\r\n let preParsedBlocks: Partial<Block>[] | undefined = undefined;\r\n let scriptContent = text;\r\n\r\n // Detect if the content is an SBX file (HTML format)\r\n if (\r\n text.includes('class=\"divtype') ||\r\n url.toLowerCase().includes(\".sbx\")\r\n ) {\r\n if (text.includes(\"<div\")) {\r\n const textarea = document.createElement(\"textarea\");\r\n textarea.innerHTML = text;\r\n text = textarea.value;\r\n }\r\n\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(text, \"text/html\");\r\n const divs = Array.from(doc.querySelectorAll(\"div\"));\r\n const parsed: Partial<Block>[] = [];\r\n\r\n const typeMap: Record<string, BlockType> = {\r\n divtype0: \"SCENE_HEADING\",\r\n divtype2: \"ACTION\",\r\n divtype3: \"CHARACTER\",\r\n divtype4: \"PARENTHETICAL\",\r\n divtype5: \"DIALOGUE\",\r\n divtype6: \"TRANSITION\",\r\n };\r\n\r\n divs.forEach((div) => {\r\n let divText = div.textContent?.trim() || \"\";\r\n if (!divText) return;\r\n\r\n let type: BlockType = \"ACTION\";\r\n for (const className of Array.from(div.classList)) {\r\n if (typeMap[className]) {\r\n type = typeMap[className];\r\n break;\r\n }\r\n }\r\n\r\n const block: Partial<Block> = { type, text: divText };\r\n\r\n // Preserve the block ID if it exists to prevent unnecessary re-saves\r\n const idAttr = div.getAttribute(\"id\");\r\n if (idAttr && idAttr.startsWith(\"par\")) {\r\n block.id = idAttr.substring(3);\r\n }\r\n\r\n if (type === \"SCENE_HEADING\") {\r\n const sceneNum = div.getAttribute(\"data-scene\");\r\n if (sceneNum) block.sceneNumber = sceneNum;\r\n\r\n let parsedText = divText;\r\n const typeMatch = parsedText.match(/^(INT\\/EXT|INT|EXT)\\.?\\s+/i);\r\n if (typeMatch) {\r\n let sType = typeMatch[1].toUpperCase();\r\n if (!sType.endsWith(\".\")) sType += \".\";\r\n block.sceneType = sType as any;\r\n parsedText = parsedText.substring(typeMatch[0].length).trim();\r\n }\r\n\r\n const timeMatch = parsedText.match(/\\s+-\\s+([^-]+)$/);\r\n if (timeMatch) {\r\n block.timeOfDay = timeMatch[1].trim().toUpperCase() as any;\r\n parsedText = parsedText.substring(0, timeMatch.index).trim();\r\n }\r\n\r\n block.text = parsedText;\r\n }\r\n\r\n parsed.push(block);\r\n });\r\n\r\n if (parsed.length > 0) {\r\n preParsedBlocks = parsed;\r\n scriptContent = \"\"; // Clear raw text if parsed successfully\r\n }\r\n }\r\n\r\n // Try to get a clean title from the URL\r\n const filename =\r\n url\r\n .split(\"/\")\r\n .pop()\r\n ?.replace(/\\.sbx$/i, \"\") || \"Imported from URL\";\r\n\r\n handleScriptImport(\r\n filename,\r\n scriptContent,\r\n preParsedBlocks,\r\n isInitialLoad,\r\n );\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [handleScriptImport],\r\n );\r\n\r\n useEffect(() => {\r\n if (isLoading) {\r\n isInitialLoadRef.current = true;\r\n return;\r\n }\r\n\r\n const currentSbx = ScreenplayService.serializeToSbx(blocks);\r\n\r\n if (isInitialLoadRef.current) {\r\n if (lastSavedContent.current === null) {\r\n lastSavedContent.current = currentSbx;\r\n }\r\n isInitialLoadRef.current = false;\r\n return;\r\n }\r\n\r\n const hasActualChanges =\r\n lastSavedContent.current !== null &&\r\n currentSbx !== lastSavedContent.current;\r\n\r\n if (hasActualChanges) {\r\n setHasUnsavedChanges(true);\r\n if (popoverTimeoutRef.current) clearTimeout(popoverTimeoutRef.current);\r\n setShowUnsavedPopover(false);\r\n popoverTimeoutRef.current = setTimeout(() => {\r\n setShowUnsavedPopover(true);\r\n }, 1000);\r\n } else {\r\n setHasUnsavedChanges(false);\r\n setShowUnsavedPopover(false);\r\n if (popoverTimeoutRef.current) clearTimeout(popoverTimeoutRef.current);\r\n }\r\n\r\n return () => {\r\n if (popoverTimeoutRef.current) clearTimeout(popoverTimeoutRef.current);\r\n };\r\n }, [blocks, isLoading]);\r\n\r\n useEffect(() => {\r\n if (options?.initialUrl && options.initialUrl !== loadedUrlRef.current) {\r\n loadedUrlRef.current = options.initialUrl;\r\n loadFromUrl(options.initialUrl, options.fetchOptions, true);\r\n }\r\n }, [options?.initialUrl, options?.fetchOptions, loadFromUrl]);\r\n\r\n return {\r\n blocks,\r\n refs,\r\n focusedBlockId,\r\n showSuggestions,\r\n showExtensionSuggestions,\r\n characterExtensions,\r\n locations,\r\n characters,\r\n sceneNumbers,\r\n isLoading,\r\n handleBlockTextChange,\r\n handleSceneTypeChange,\r\n handleTimeOfDayChange,\r\n handleBlockTypeChange,\r\n handleSelectCharacterExtension,\r\n handleKeyDown,\r\n handleScriptImport,\r\n handleSceneNumberChange,\r\n handleFocus,\r\n handleBlur,\r\n handleEnhance: async (block: Block) => {\r\n if (isEnhancing || enhancingBlockId || !options?.enhanceContentUrl)\r\n return;\r\n setEnhancingBlockId(block.id);\r\n setIsEnhancing(true);\r\n setEnhancementSuggestion(null);\r\n\r\n try {\r\n const res = await fetch(options?.enhanceContentUrl, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({\r\n mode: block.type.toLowerCase(),\r\n script: block.text,\r\n language: \"English\",\r\n }),\r\n });\r\n\r\n const data = await res.json();\r\n const content = data.data;\r\n\r\n setEnhancementSuggestion(content);\r\n } catch (error) {\r\n console.error(\"Failed to enhance block:\", error);\r\n if (error) {\r\n setIsEnhancing(false);\r\n }\r\n } finally {\r\n setIsEnhancing(false);\r\n }\r\n },\r\n handleApproveEnhance: () => {\r\n if (enhancingBlockId && enhancementSuggestion) {\r\n setBlocks((bs) =>\r\n ScreenplayService.updateBlock(\r\n bs,\r\n enhancingBlockId,\r\n \"text\",\r\n enhancementSuggestion,\r\n ),\r\n );\r\n // Sync DOM manually if needed, or let useEffect handle it\r\n }\r\n setEnhancingBlockId(null);\r\n setEnhancementSuggestion(null);\r\n },\r\n handleRejectEnhance: () => {\r\n setEnhancingBlockId(null);\r\n setEnhancementSuggestion(null);\r\n },\r\n enhancingBlockId,\r\n enhancementSuggestion,\r\n isEnhancing,\r\n hasUnsavedChanges,\r\n showUnsavedPopover,\r\n syncScreenplay,\r\n ignoreChanges,\r\n loadFromUrl,\r\n };\r\n}\r\n","import jsPDF from \"jspdf\";\r\nimport { Block } from \"../types/screenplay-editor.types\";\r\n\r\nexport const handleSaveAsPdf = (\r\n blocks: Block[],\r\n sceneNumbers: Record<string, string>,\r\n project_name?: string,\r\n) => {\r\n // 1. Blur active elements\r\n if (document.activeElement instanceof HTMLElement) {\r\n document.activeElement.blur();\r\n }\r\n\r\n // 2. Initialize PDF\r\n const doc = new jsPDF({\r\n orientation: \"portrait\",\r\n unit: \"mm\",\r\n format: \"letter\",\r\n });\r\n\r\n const FONT_SIZE = 12;\r\n const LINE_HEIGHT = 4.233;\r\n const PAGE_WIDTH = doc.internal.pageSize.getWidth();\r\n const PAGE_HEIGHT = doc.internal.pageSize.getHeight();\r\n\r\n const MARGIN_LEFT = 38.1;\r\n const MARGIN_RIGHT = 25.4;\r\n const MARGIN_TOP = 25.4;\r\n const MARGIN_BOTTOM = 25.4;\r\n\r\n const blockDimensions: Record<string, any> = {\r\n SCENE_HEADING: { indent: 0, width: 152.4, upper: true, bold: true },\r\n ACTION: { indent: 0, width: 152.4, upper: false, bold: false },\r\n CHARACTER: { indent: 50.8, width: 101.6, upper: true, bold: false },\r\n PARENTHETICAL: { indent: 38.1, width: 50.8, upper: false, bold: false },\r\n DIALOGUE: { indent: 25.4, width: 88.9, upper: false, bold: false },\r\n TRANSITION: {\r\n indent: 0,\r\n width: 152.4,\r\n upper: true,\r\n bold: false,\r\n align: \"right\",\r\n },\r\n GENERAL: { indent: 0, width: 152.4, upper: false, bold: false },\r\n };\r\n\r\n let y = MARGIN_TOP;\r\n let pageNumber = 1;\r\n\r\n const drawPageNumber = (num: number) => {\r\n if (num > 1) {\r\n doc.setFont(\"Courier\", \"normal\");\r\n doc.setFontSize(12);\r\n doc.text(`${num}.`, PAGE_WIDTH - MARGIN_RIGHT, 12.7, {\r\n align: \"right\",\r\n });\r\n }\r\n };\r\n\r\n // 4. Processing Blocks\r\n blocks.forEach((block: any, index: number) => {\r\n const config = blockDimensions[block.type] || blockDimensions.GENERAL;\r\n let text = block.text || \"\";\r\n\r\n if (config.upper) text = text.toUpperCase();\r\n if (block.type === \"SCENE_HEADING\") {\r\n text =\r\n `${block.sceneType || \"INT.\"} ${text} - ${block.timeOfDay || \"DAY\"}`.toUpperCase();\r\n }\r\n\r\n doc.setFont(\"Courier\", config.bold ? \"bold\" : \"normal\");\r\n doc.setFontSize(FONT_SIZE);\r\n\r\n const lines = doc.splitTextToSize(text, config.width);\r\n const blockHeight = lines.length * LINE_HEIGHT;\r\n\r\n // --- UPDATED SECTION: OVERFLOW LOGIC ONLY ---\r\n\r\n // We removed the isNewScene check.\r\n // Now it only breaks a page if the block exceeds the bottom margin.\r\n let safetyBuffer = 0;\r\n if (block.type === \"CHARACTER\") safetyBuffer = LINE_HEIGHT * 3;\r\n\r\n if (y + blockHeight + safetyBuffer > PAGE_HEIGHT - MARGIN_BOTTOM) {\r\n doc.addPage();\r\n pageNumber++;\r\n drawPageNumber(pageNumber);\r\n y = MARGIN_TOP;\r\n\r\n doc.setFont(\"Courier\", config.bold ? \"bold\" : \"normal\");\r\n doc.setFontSize(FONT_SIZE);\r\n }\r\n\r\n // 6. Vertical Spacing\r\n if (y > MARGIN_TOP) {\r\n if (\r\n block.type === \"SCENE_HEADING\" ||\r\n block.type === \"ACTION\" ||\r\n block.type === \"CHARACTER\"\r\n ) {\r\n y += LINE_HEIGHT;\r\n }\r\n }\r\n\r\n // 7. Actual Rendering\r\n const xPos = MARGIN_LEFT + config.indent;\r\n if (config.align === \"right\") {\r\n doc.text(lines, PAGE_WIDTH - MARGIN_RIGHT, y, { align: \"right\" });\r\n } else {\r\n doc.text(lines, xPos, y);\r\n }\r\n\r\n // Scene Numbers\r\n if (block.type === \"SCENE_HEADING\" && sceneNumbers?.[block.id]) {\r\n const sNum = String(sceneNumbers[block.id]);\r\n doc.setFont(\"Courier\", \"normal\");\r\n doc.setFontSize(FONT_SIZE);\r\n doc.text(sNum, MARGIN_LEFT - 12, y);\r\n doc.text(sNum, PAGE_WIDTH - MARGIN_RIGHT + 5, y);\r\n doc.setFont(\"Courier\", config.bold ? \"bold\" : \"normal\");\r\n }\r\n\r\n y += blockHeight;\r\n });\r\n\r\n if (project_name) {\r\n doc.save(`${project_name}_${new Date().toISOString()}.pdf`);\r\n } else {\r\n doc.save(\"screenplay_export.pdf\");\r\n }\r\n};\r\n\r\nexport const convertBlocksToSbx = (\r\n blocks: Block[],\r\n sceneNumbers: Record<string, string>,\r\n): string => {\r\n const typeToDivClass: Record<string, string> = {\r\n SCENE_HEADING: \"divtype0\",\r\n ACTION: \"divtype2\",\r\n CHARACTER: \"divtype3\",\r\n PARENTHETICAL: \"divtype4\",\r\n DIALOGUE: \"divtype5\",\r\n TRANSITION: \"divtype6\",\r\n GENERAL: \"divtype2\",\r\n };\r\n\r\n return blocks\r\n .map((block: any) => {\r\n const divClass = typeToDivClass[block.type] || \"divtype2\";\r\n let text = block.text || \"\";\r\n let extraAttributes = \"\";\r\n\r\n if (block.type === \"SCENE_HEADING\") {\r\n text =\r\n `${block.sceneType || \"INT.\"} ${text} - ${block.timeOfDay || \"DAY\"}`.toUpperCase();\r\n const sceneNum = sceneNumbers?.[block.id];\r\n if (sceneNum) {\r\n extraAttributes = ` data-scene=\"${sceneNum}\"`;\r\n }\r\n } else if (block.type === \"CHARACTER\" || block.type === \"TRANSITION\") {\r\n text = text.toUpperCase();\r\n }\r\n\r\n return `<div class=\"${divClass}\" id=\"par${block.id}\"${extraAttributes}>${text}</div>`;\r\n })\r\n .join(\"\");\r\n};\r\n\r\nexport const handleSyncWithCloud = (\r\n blocks: Block[],\r\n sceneNumbers: Record<string, string>,\r\n onSaveAsSbx?: (file: File) => void,\r\n project_name?: string,\r\n) => {\r\n const sbxData = convertBlocksToSbx(blocks, sceneNumbers);\r\n\r\n const blob = new Blob([sbxData], { type: \"text/plain\" });\r\n\r\n // 1. Trigger a local download of the .sbx file\r\n // const url = URL.createObjectURL(blob);\r\n // const a = document.createElement(\"a\");\r\n // a.href = url;\r\n // a.download = \"screenplay.sbx\";\r\n // document.body.appendChild(a);\r\n // a.click();\r\n // document.body.removeChild(a);\r\n // URL.revokeObjectURL(url);\r\n\r\n // 2. Pass the binary file to the API function provided via props\r\n if (onSaveAsSbx) {\r\n if (project_name) {\r\n const file = new File(\r\n [blob],\r\n `${project_name}_${new Date().toISOString()}.sbx`,\r\n { type: \"text/plain\" },\r\n );\r\n onSaveAsSbx(file);\r\n } else {\r\n const file = new File([blob], \"screenplay.sbx\", { type: \"text/plain\" });\r\n onSaveAsSbx(file);\r\n }\r\n }\r\n};\r\n","import { ElementType } from \"react\";\r\nimport { Users, Box, Shirt, Car, MapPin, Map, UserPlus, Tags, Armchair } from \"lucide-react\";\r\n\r\nexport interface ScriptBreakdown {\r\n scene_number: string;\r\n content: string;\r\n}\r\n\r\nexport type ElementCategory =\r\n | \"CAST\"\r\n | \"PROP\"\r\n | \"COSTUME\"\r\n | \"VEHICLE\"\r\n | \"SET_PROP\"\r\n | \"EXTRA\"\r\n | \"LOCATION\"\r\n | \"SUBLOCATION\"\r\n | \"OTHER\";\r\nexport interface Tag {\r\n id?: string;\r\n scene_id?: string | number; // Optional, as it may not be set when creating a new tag\r\n block_id: string;\r\n category_id: ElementCategory;\r\n name: string;\r\n start_index: number;\r\n end_index: number;\r\n quantity?: number;\r\n look?: string;\r\n age?: string;\r\n created_at?: string;\r\n updated_at?: string;\r\n}\r\n\r\nexport const CATEGORIES: {\r\n id: ElementCategory;\r\n label: string;\r\n color: string;\r\n hex: string;\r\n icon: ElementType;\r\n}[] = [\r\n { id: \"CAST\", label: \"Cast\", color: \"#F97316\", hex: \"#FDBA74\", icon: Users },\r\n { id: \"PROP\", label: \"Prop\", color: \"#7C3AED\", hex: \"#C4B5FD\", icon: Box },\r\n { id: \"COSTUME\", label: \"Costume\", color: \"#DB2777\", hex: \"#F9A8D4\", icon: Shirt },\r\n { id: \"VEHICLE\", label: \"Vehicle\", color: \"#2563EB\", hex: \"#93C5FD\", icon: Car },\r\n { id: \"SET_PROP\", label: \"Set Prop\", color: \"#92400E\", hex: \"#FCD34D\", icon: Armchair },\r\n { id: \"EXTRA\", label: \"Extra\", color: \"#F59E0B\", hex: \"#FDE68A\", icon: UserPlus },\r\n { id: \"LOCATION\", label: \"Location\", color: \"#059669\", hex: \"#6EE7B7\", icon: MapPin },\r\n { id: \"SUBLOCATION\", label: \"Sublocation\", color: \"#65A30D\", hex: \"#BEF264\", icon: Map },\r\n // { id: \"OTHER\", label: \"Other\", color: \"#475569\", hex: \"#CBD5F5\", icon: Tags }\r\n];\r\n","import React from \"react\";\r\n\r\nconst CinemaAIIcon = ({ isProcessing }: { isProcessing?: boolean }) => {\r\n return (\r\n <div className=\"relative flex items-center justify-center w-[18px] h-[18px]\">\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n className={`w-full h-full stroke-[#1e769c] ${isProcessing ? \"animate-[spin_2s_linear_infinite]\" : \"\"}`}\r\n fill=\"none\"\r\n strokeWidth=\"1.75\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n {isProcessing ? (\r\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\r\n ) : (\r\n <>\r\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"2.5\" />\r\n <path d=\"M7 2v20\" />\r\n <path d=\"M17 2v20\" />\r\n <path d=\"M2 12h20\" />\r\n <path d=\"M2 7h5\" />\r\n <path d=\"M2 17h5\" />\r\n <path d=\"M17 17h5\" />\r\n <path d=\"M17 7h5\" />\r\n </>\r\n )}\r\n </svg>\r\n </div>\r\n );\r\n};\r\n\r\nconst SummarizeButton = ({\r\n onSummarize,\r\n isSummarizing,\r\n}: {\r\n onSummarize?: () => void;\r\n isSummarizing?: boolean;\r\n}) => {\r\n return (\r\n <button\r\n onClick={onSummarize}\r\n disabled={isSummarizing}\r\n className={`relative inline-flex items-center justify-center overflow-hidden px-7 py-3.5 rounded-[2.5rem] border outline-none transition-all duration-300 ease-out ${\r\n isSummarizing\r\n ? \"border-[#7acee6] bg-[#d5f1f8] cursor-wait shadow-[0_0_0_4px_#eefafd]\"\r\n : \"border-[#b0e3f1] bg-[#eefafd] cursor-pointer hover:border-[#7acee6] hover:bg-[#d5f1f8] hover:shadow-[0_8px_24px_-6px_rgba(32,146,186,0.18)] hover:-translate-y-[1px]\"\r\n }`}\r\n >\r\n <span\r\n className={`absolute inset-0 rounded-[inherit] ${\r\n isSummarizing\r\n ? \"bg-[linear-gradient(135deg,#d5f1f8_0%,#b0e3f1_100%)]\"\r\n : \"bg-[linear-gradient(135deg,#eefafd_0%,#d5f1f8_100%)]\"\r\n }`}\r\n />\r\n\r\n <span className=\"relative z-10 flex items-center gap-3\">\r\n <CinemaAIIcon isProcessing={isSummarizing} />\r\n\r\n <span className=\"flex flex-col items-start leading-none\">\r\n <span className=\"text-[13px] font-semibold text-[#1d5b79] tracking-[0.01em]\">\r\n {isSummarizing ? \"Analyzing Scene...\" : \"Summarize Scene\"}\r\n </span>\r\n <span\r\n className={`text-[9px] font-medium uppercase tracking-[0.12em] mt-1 ${\r\n isSummarizing ? \"text-[#2092ba]\" : \"text-[#3cafd4]\"\r\n }`}\r\n >\r\n {isSummarizing ? \"AI Engine Active\" : \"\"}\r\n </span>\r\n </span>\r\n </span>\r\n </button>\r\n );\r\n};\r\n\r\nexport default SummarizeButton;\r\n","\"use client\";\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { Block, blockStyles } from \"../types/screenplay-editor.types\";\r\nimport { Loader2, Tags, AlignLeft, ChevronDown, X } from \"lucide-react\";\r\nimport {\r\n ElementCategory,\r\n Tag,\r\n CATEGORIES,\r\n} from \"../types/script-breakdown.types\";\r\nimport SummarizeButton from \"../components/summarize-button\";\r\n\r\nexport function ScriptBreakdownSceneView({\r\n blocks,\r\n characters,\r\n isLoading,\r\n sceneNumber,\r\n tags,\r\n selectionMenu,\r\n handleMouseUp,\r\n addTag,\r\n updateTag,\r\n removeTag,\r\n clearSelection,\r\n menuPlacement,\r\n menuRef,\r\n sceneBrief,\r\n setSceneBrief,\r\n onSummarize,\r\n isSummarizing,\r\n aiSummarized = false,\r\n onUpdateBrief,\r\n}: {\r\n blocks: Block[];\r\n characters: string[];\r\n isLoading: boolean;\r\n sceneNumber: string;\r\n tags: Tag[];\r\n selectionMenu: {\r\n blockId: string;\r\n startIndex: number;\r\n endIndex: number;\r\n text: string;\r\n top: number;\r\n left: number;\r\n } | null;\r\n handleMouseUp: () => void;\r\n addTag: (c: ElementCategory) => void;\r\n updateTag?: (\r\n id: string,\r\n categoryId?: ElementCategory | null,\r\n details?: Partial<Tag>,\r\n ) => void;\r\n removeTag: (e: React.MouseEvent, id?: string) => void;\r\n clearSelection: () => void;\r\n menuPlacement: \"top\" | \"bottom\";\r\n menuRef: React.RefObject<HTMLDivElement | null>;\r\n sceneBrief: string;\r\n setSceneBrief: (brief: string) => void;\r\n onSummarize?: () => void;\r\n isSummarizing?: boolean;\r\n aiSummarized?: boolean;\r\n onUpdateBrief?: () => void;\r\n}) {\r\n const [expandedCategories, setExpandedCategories] = useState<\r\n Record<string, boolean>\r\n >({});\r\n const [editingTagData, setEditingTagData] = useState<{\r\n tag: Tag;\r\n catId: ElementCategory;\r\n catColor: string;\r\n rect: DOMRect;\r\n } | null>(null);\r\n const [tagForm, setTagForm] = useState<{\r\n quantity: number;\r\n look: string;\r\n age: string;\r\n }>({ quantity: 1, look: \"\", age: \"\" });\r\n const [popupPlacement, setPopupPlacement] = useState({\r\n alignRight: false,\r\n alignBottom: false,\r\n });\r\n const [isSidebarOpen, setIsSidebarOpen] = useState(false);\r\n const COURIER_STACK = \"'Courier Prime', 'Courier', monospace\";\r\n\r\n useEffect(() => {\r\n const fontId = \"google-font-courier-prime\";\r\n const styleId = \"screenplay-editor-force-v4\";\r\n\r\n // 1. Inject Google Font\r\n if (!document.getElementById(fontId)) {\r\n const link = document.createElement(\"link\");\r\n link.id = fontId;\r\n link.rel = \"stylesheet\";\r\n link.href =\r\n \"https://fonts.googleapis.com/css2?family=Courier+Prime:ital,wght@0,400;0,700;1,400;1,700&display=swap\";\r\n document.head.appendChild(link);\r\n }\r\n\r\n // 2. Inject high-specificity CSS (Safe textContent approach)\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement(\"style\");\r\n style.id = styleId;\r\n style.textContent = `\r\n /* We target by the data-attribute to ensure the highest specificity possible */\r\n [data-screenplay-editor] *, \r\n [data-screenplay-editor] div, \r\n [data-screenplay-editor] span, \r\n [data-screenplay-editor] [contenteditable=\"true\"] {\r\n font-family: ${COURIER_STACK} !important;\r\n -webkit-font-smoothing: antialiased;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }\r\n }, [COURIER_STACK]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-32 gap-4\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-zinc-400\" />\r\n <p className=\"text-sm font-medium text-zinc-500 animate-pulse\">\r\n Loading scene details...\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n const hasLocationTag = tags.some((t) => t.category_id === \"LOCATION\");\r\n\r\n const renderBlockText = (block: Block) => {\r\n const blockTags = tags\r\n .filter((t) => t.block_id === block.id)\r\n .sort((a, b) => a.start_index - b.start_index);\r\n\r\n if (blockTags.length === 0) return block.text;\r\n\r\n const nodes = [];\r\n let currentIndex = 0;\r\n\r\n blockTags.forEach((tag) => {\r\n // Defensively prevent regressing indexes if tags overlap\r\n const actualStart = Math.max(tag.start_index, currentIndex);\r\n\r\n if (actualStart > currentIndex) {\r\n nodes.push(\r\n <span key={`text-${currentIndex}`}>\r\n {block.text.slice(currentIndex, actualStart)}\r\n </span>,\r\n );\r\n }\r\n\r\n const category = CATEGORIES.find((c) => c.id === tag.category_id);\r\n if (actualStart < tag.end_index) {\r\n nodes.push(\r\n <span\r\n key={tag.id || `tag-${actualStart}-${tag.end_index}`}\r\n title={`${category?.label} (Click to edit)`}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n const selection = window.getSelection();\r\n if (!selection) return;\r\n const range = document.createRange();\r\n\r\n // Select the inner text node so the range offset reflects the text length\r\n // rather than the child node count (which was causing the 1-character bug)\r\n const textNode = e.currentTarget.firstChild;\r\n if (textNode && textNode.nodeType === Node.TEXT_NODE) {\r\n range.selectNodeContents(textNode);\r\n } else {\r\n range.selectNodeContents(e.currentTarget);\r\n }\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n setTimeout(() => handleMouseUp(), 0);\r\n }}\r\n className=\"cursor-pointer font-bold transition-all hover:opacity-80 rounded-[3px]\"\r\n style={{\r\n color: category?.color,\r\n padding: \"0.125rem 0.25rem\",\r\n margin: \"0 -0.125rem\",\r\n }}\r\n >\r\n {block.text.slice(actualStart, tag.end_index)}\r\n </span>,\r\n );\r\n }\r\n\r\n currentIndex = Math.max(currentIndex, tag.end_index);\r\n });\r\n\r\n if (currentIndex < block.text.length) {\r\n nodes.push(\r\n <span key={`text-${currentIndex}`}>\r\n {block.text.slice(currentIndex)}\r\n </span>,\r\n );\r\n }\r\n\r\n return nodes;\r\n };\r\n\r\n return (\r\n <div className=\"relative p-8 md:p-12 mx-auto w-full min-h-screen flex flex-col gap-8 xl:pr-[20rem]\">\r\n <div className=\"flex items-center justify-center max-w-6xl xl:max-w-full\">\r\n <div className=\"flex flex-col gap-4 min-h-screen\">\r\n <div\r\n className=\"relative bg-[#fdfdfc] shadow-md shadow-zinc-300/60 border border-zinc-100 rounded-sm md:rounded-md pl-[1.5in] py-[1in] pr-[1in] flex flex-col w-[210mm] min-h-auto shrink-0\"\r\n style={{\r\n fontFamily: COURIER_STACK,\r\n paddingLeft: \"1.5in\",\r\n paddingRight: \"1in\",\r\n paddingTop: \"1in\",\r\n paddingBottom: \"1in\",\r\n lineHeight: \"1.2\",\r\n }}\r\n data-screenplay-editor=\"true\"\r\n onMouseUp={handleMouseUp}\r\n >\r\n {blocks.map((block) => (\r\n <div\r\n key={block.id}\r\n data-block-id={block.id}\r\n className={`relative break-words w-full px-4 py-2 ${blockStyles[block.type].className}`}\r\n style={{\r\n ...blockStyles[block.type].inputStyle,\r\n minHeight: \"2.5rem\",\r\n }}\r\n >\r\n {renderBlockText(block)}\r\n\r\n {selectionMenu?.blockId === block.id && (\r\n <div\r\n ref={menuRef}\r\n data-screenplay-editor=\"false\"\r\n className={`tag-menu absolute z-50 bg-white/70 backdrop-blur-2xl shadow-[0_10px_40px_rgb(0,0,0,0.06)] border border-white rounded-[1.5rem] p-2 flex flex-col w-56 animate-in fade-in zoom-in-95 duration-300 ease-out ${menuPlacement === \"top\" ? \"origin-bottom\" : \"origin-top\"}`}\r\n style={{\r\n top: selectionMenu.top,\r\n left: selectionMenu.left,\r\n transform:\r\n menuPlacement === \"top\"\r\n ? \"translate(-50%, calc(-100% - 12px))\"\r\n : \"translate(-50%, 32px)\",\r\n }}\r\n >\r\n <div className=\"relative z-10 px-3 py-2.5 border-b border-white/60 mb-1.5\">\r\n <p className=\"text-[9px] font-extrabold tracking-[0.2em] text-slate-400 uppercase mb-1\">\r\n Tag Element\r\n </p>\r\n <p\r\n className=\"text-xs font-bold text-slate-700 truncate drop-shadow-sm\"\r\n title={selectionMenu.text}\r\n >\r\n \"{selectionMenu.text}\"\r\n </p>\r\n </div>\r\n <div className=\"relative z-10 flex flex-col gap-1\">\r\n {CATEGORIES.filter(\r\n (cat) =>\r\n !(cat.id === \"LOCATION\" && hasLocationTag) &&\r\n !(cat.id === \"SUBLOCATION\" && !hasLocationTag),\r\n ).map((cat) => (\r\n <button\r\n key={cat.id}\r\n onClick={() => {\r\n const existingTag = tags.find(\r\n (t) =>\r\n t.block_id === block.id &&\r\n t.start_index === selectionMenu.startIndex &&\r\n t.end_index === selectionMenu.endIndex,\r\n );\r\n if (existingTag && existingTag.id) {\r\n updateTag?.(existingTag.id, cat.id);\r\n } else {\r\n addTag(cat.id);\r\n }\r\n }}\r\n className=\"group w-full text-[12px] font-bold px-3 py-2 rounded-xl transition-all duration-300 text-left flex items-center justify-between hover:bg-white/80 hover:shadow-[0_2px_10px_rgb(0,0,0,0.02)] active:scale-[0.98]\"\r\n style={{ color: cat.color }}\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n <cat.icon\r\n className=\"w-4 h-4 group-hover:scale-110 transition-transform duration-300\"\r\n style={{ color: cat.color }}\r\n />\r\n {cat.label}\r\n </div>\r\n <span className=\"text-[10px] font-bold text-slate-400 opacity-0 group-hover:opacity-100 transition-all duration-300 translate-x-1 group-hover:translate-x-0\">\r\n Select\r\n </span>\r\n </button>\r\n ))}\r\n\r\n {tags.some(\r\n (t) =>\r\n t.block_id === block.id &&\r\n t.start_index === selectionMenu.startIndex &&\r\n t.end_index === selectionMenu.endIndex,\r\n ) && (\r\n <div className=\"mt-1 pt-1 border-t border-white/60\">\r\n <button\r\n onClick={(e) => {\r\n const tagToRemove = tags.find(\r\n (t) =>\r\n t.block_id === block.id &&\r\n t.start_index === selectionMenu.startIndex &&\r\n t.end_index === selectionMenu.endIndex,\r\n );\r\n if (tagToRemove) {\r\n removeTag(e, tagToRemove.id);\r\n clearSelection();\r\n }\r\n }}\r\n className=\"group w-full text-[12px] font-bold px-3 py-2 rounded-xl transition-all duration-300 text-left flex items-center justify-between hover:bg-rose-50 hover:text-rose-600 hover:shadow-[0_2px_10px_rgb(225,29,72,0.04)] active:scale-[0.98] text-slate-500 border border-transparent hover:border-rose-100\"\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-2 h-2 rounded-full shadow-sm bg-rose-400 group-hover:scale-125 transition-transform duration-300\" />\r\n Remove Tag\r\n </div>\r\n <span className=\"text-[10px] font-bold text-rose-400 opacity-0 group-hover:opacity-100 transition-all duration-300 translate-x-1 group-hover:translate-x-0\">\r\n Remove\r\n </span>\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n\r\n <div className=\"relative bg-[#fdfdfc] shadow-md shadow-zinc-300/60 border border-zinc-100 rounded-sm md:rounded-md flex flex-col w-[210mm] shrink-0 p-8 md:p-12 lg:p-16\">\r\n <h3 className=\"text-xs font-extrabold text-slate-800 uppercase tracking-[0.25em] mb-6 flex items-center gap-3 font-sans\">\r\n <span className=\"flex items-center justify-center w-8 h-8 rounded-full bg-slate-100/80 shadow-inner border border-slate-200/50\">\r\n <AlignLeft className=\"w-3.5 h-3.5 text-slate-500\" />\r\n </span>\r\n Scene Brief\r\n </h3>\r\n <div className=\"relative bg-zinc-50/50 border border-zinc-200/60 rounded-xl p-4 md:p-6 shadow-inner focus-within:bg-white focus-within:border-zinc-300 focus-within:shadow-[0_8px_30px_rgb(0,0,0,0.04)] transition-all duration-300\">\r\n <textarea\r\n value={sceneBrief}\r\n onChange={(e) => setSceneBrief(e.target.value)}\r\n placeholder=\"Write a brief description or notes for this scene...\"\r\n className=\"w-full min-h-[120px] bg-transparent outline-none resize-y text-zinc-700 placeholder:text-zinc-400 text-sm md:text-base custom-scrollbar font-sans select-none\"\r\n style={{\r\n lineHeight: \"1.6\",\r\n }}\r\n />\r\n <div className=\"mt-4 flex justify-end\">\r\n <button\r\n onClick={onUpdateBrief}\r\n disabled={!sceneBrief || sceneBrief.trim() === \"\"}\r\n className=\"rounded-full bg-[#15607b] px-6 py-3 text-[13px] font-semibold tracking-wide text-white shadow-md transition-all hover:bg-[#134a61] hover:shadow-lg active:scale-95 disabled:bg-gray-200 disabled:cursor-not-allowed disabled:opacity-95 disabled:text-black disabled:shadow-none\"\r\n >\r\n Update\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <button\r\n onClick={() => setIsSidebarOpen(true)}\r\n className=\"fixed bottom-6 right-6 z-40 flex h-14 w-14 items-center justify-center rounded-full bg-[#15607b] text-white shadow-[0_8px_30px_rgba(21,96,123,0.3)] transition-transform hover:scale-105 active:scale-95 xl:hidden\"\r\n >\r\n <Tags className=\"h-6 w-6\" />\r\n {tags.length > 0 && (\r\n <span className=\"absolute -top-1 -right-1 flex h-5 w-5 items-center justify-center rounded-full bg-rose-500 text-[10px] font-bold text-white shadow-sm border-2 border-white\">\r\n {tags.length}\r\n </span>\r\n )}\r\n </button>\r\n\r\n {isSidebarOpen && (\r\n <div\r\n className=\"fixed inset-0 z-40 bg-slate-900/20 backdrop-blur-sm transition-opacity xl:hidden\"\r\n onClick={() => setIsSidebarOpen(false)}\r\n />\r\n )}\r\n <div\r\n className={`fixed xl:absolute top-0 right-0 z-50 h-full w-72 transform transition-transform duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] xl:translate-x-0 ${\r\n isSidebarOpen\r\n ? \"translate-x-0 shadow-[0_0_40px_rgba(0,0,0,0.1)]\"\r\n : \"translate-x-full\"\r\n }`}\r\n >\r\n <div className=\"sticky top-0 flex h-[100dvh] max-h-screen w-full flex-col border-l border-l-[#eefafd] bg-white p-3 py-5\">\r\n {!aiSummarized && (\r\n <SummarizeButton\r\n isSummarizing={isSummarizing}\r\n onSummarize={onSummarize}\r\n />\r\n )}\r\n <div className=\"relative flex flex-col gap-3 py-5 my-5 border-t border-t-[#eefafd] flex-1 overflow-hidden\">\r\n <div className=\"relative flex items-center justify-between mb-6 shrink-0\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"relative flex h-8 w-8 items-center justify-center rounded-[10px] border border-[#15607b]/20 bg-white shadow-sm\">\r\n <Tags className=\"h-4 w-4 text-[#15607b]\" />\r\n </div>\r\n <h3 className=\"text-[12px] font-semibold uppercase tracking-[0.28em] text-[#134a61]\">\r\n Breakdown\r\n </h3>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"rounded-full border border-slate-200/60 bg-slate-50 px-2.5 py-1 text-[11px] font-semibold text-[#134a61] shadow-sm backdrop-blur-md\">\r\n {tags.length}\r\n </span>\r\n </div>\r\n </div>\r\n <div className=\"flex flex-col gap-4 overflow-y-auto overflow-x-hidden pb-4 pr-1 custom-scrollbar\">\r\n {CATEGORIES.map((cat) => {\r\n const catTags = tags.filter((t) => t.category_id === cat.id);\r\n if (!catTags.length) return null;\r\n\r\n const isExpanded = expandedCategories[cat.id];\r\n\r\n const uniqueTags = Array.from(\r\n new Map(\r\n catTags.map((tag) => [tag.name.toLowerCase(), tag]),\r\n ).values(),\r\n );\r\n\r\n return (\r\n <div key={cat.id} className=\"relative\">\r\n <div\r\n onClick={() =>\r\n setExpandedCategories((prev) => ({\r\n [cat.id]: !prev[cat.id],\r\n }))\r\n }\r\n className=\"group relative flex cursor-pointer items-center gap-3 overflow-hidden rounded-[24px] border border-white/70 px-4 py-3.5 transition-all duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] hover:-translate-y-[1px]\"\r\n style={{\r\n background: `linear-gradient(135deg, rgba(255,255,255,0.92), ${cat.hex}18)`,\r\n boxShadow: `0 16px 36px ${cat.hex}14, inset 0 1px 0 rgba(255,255,255,0.9)`,\r\n border: `1px solid ${cat.hex}50`,\r\n }}\r\n >\r\n <div\r\n className=\"absolute inset-0 opacity-0 transition-opacity duration-300 group-hover:opacity-100\"\r\n style={{\r\n background: `radial-gradient(circle at 15% 20%, ${cat.hex}24, transparent 38%)`,\r\n }}\r\n />\r\n\r\n <div\r\n className=\"relative flex h-9 w-9 shrink-0 items-center justify-center rounded-xl border border-white/70 backdrop-blur-md\"\r\n style={{\r\n background: `linear-gradient(135deg, ${cat.color}22, rgba(255,255,255,0.75))`,\r\n boxShadow: `0 10px 22px ${cat.color}14`,\r\n }}\r\n >\r\n <cat.icon className=\"h-4 w-4\" color={cat.color} />\r\n </div>\r\n\r\n <span\r\n className=\"relative text-[13px] font-semibold tracking-[0.01em]\"\r\n style={{ color: cat.color }}\r\n >\r\n {cat.label}\r\n </span>\r\n\r\n <span className=\"relative ml-auto rounded-full border border-white/70 bg-white/75 px-2.5 py-1 text-[11px] font-semibold text-[#456575] backdrop-blur-md\">\r\n {catTags.length}\r\n </span>\r\n\r\n <ChevronDown\r\n className={`relative h-4 w-4 transition-transform duration-500 ease-[cubic-bezier(0.22,1,0.36,1)] ${\r\n isExpanded ? \"rotate-180\" : \"\"\r\n }`}\r\n style={{ color: cat.color }}\r\n />\r\n </div>\r\n\r\n <div\r\n className={`grid transition-all duration-500 ease-[cubic-bezier(0.22,1,0.36,1)] ${\r\n isExpanded\r\n ? \"grid-rows-[1fr] opacity-100 mt-3\"\r\n : \"grid-rows-[0fr] opacity-0\"\r\n }`}\r\n >\r\n <div className=\"overflow-hidden\">\r\n <div className=\"flex flex-wrap justify-start gap-2 py-2\">\r\n {uniqueTags.map((tag, index) => (\r\n <div\r\n key={index}\r\n className=\"relative flex flex-col items-start\"\r\n >\r\n <span\r\n title={tag.name}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n if (\r\n cat.id !== \"PROP\" &&\r\n cat.id !== \"SET_PROP\" &&\r\n cat.id !== \"CAST\"\r\n )\r\n return;\r\n if (editingTagData?.tag.id === tag.id) {\r\n setEditingTagData(null);\r\n } else {\r\n const rect =\r\n e.currentTarget.getBoundingClientRect();\r\n setPopupPlacement({\r\n alignRight:\r\n rect.left > window.innerWidth - 240,\r\n alignBottom:\r\n rect.bottom >\r\n window.innerHeight - 250,\r\n });\r\n setTagForm({\r\n quantity: tag.quantity || 1,\r\n look: tag.look || \"\",\r\n age: tag.age || \"\",\r\n });\r\n setEditingTagData({\r\n tag,\r\n catId: cat.id,\r\n catColor: cat.color,\r\n rect,\r\n });\r\n }\r\n }}\r\n className={`inline-block max-w-full truncate text-[11px] font-semibold px-3 py-1.5 rounded-full border backdrop-blur-md transition-all duration-300 ${cat.id === \"PROP\" || cat.id === \"SET_PROP\" || cat.id === \"CAST\" ? \"cursor-pointer hover:scale-105 shadow-sm\" : \"\"}`}\r\n style={{\r\n color: cat.color,\r\n background: `linear-gradient(145deg, ${cat.color}18, rgba(255,255,255,0.88))`,\r\n borderColor: `${cat.color}28`,\r\n }}\r\n >\r\n {tag.name}\r\n {(cat.id === \"PROP\" ||\r\n cat.id === \"SET_PROP\") &&\r\n tag.quantity &&\r\n tag.quantity > 1 ? (\r\n <span className=\"ml-1.5 opacity-80 font-bold\">\r\n x{tag.quantity}\r\n </span>\r\n ) : null}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {editingTagData && (\r\n <>\r\n <div\r\n className=\"fixed inset-0 z-[100]\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setEditingTagData(null);\r\n }}\r\n />\r\n <div\r\n className={`p-3.5 bg-white/90 backdrop-blur-2xl rounded-[1.25rem] shadow-[0_10px_40px_rgb(0,0,0,0.12)] border border-white/60 z-[101] w-56 animate-in fade-in zoom-in-95 duration-200 ease-out fixed`}\r\n style={{\r\n top: popupPlacement.alignBottom\r\n ? \"auto\"\r\n : editingTagData.rect.bottom + 8,\r\n bottom: popupPlacement.alignBottom\r\n ? window.innerHeight - editingTagData.rect.top + 8\r\n : \"auto\",\r\n left: popupPlacement.alignRight\r\n ? \"auto\"\r\n : editingTagData.rect.left,\r\n right: popupPlacement.alignRight\r\n ? window.innerWidth - editingTagData.rect.right\r\n : \"auto\",\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"flex justify-between items-center mb-3 border-b border-slate-100 pb-2.5\">\r\n <span className=\"text-[10px] font-extrabold text-slate-400 uppercase tracking-widest drop-shadow-sm\">\r\n Details\r\n </span>\r\n <button\r\n onClick={() => setEditingTagData(null)}\r\n className=\"hover:bg-slate-100/80 p-1.5 rounded-full transition-colors active:scale-95\"\r\n >\r\n <X className=\"w-3.5 h-3.5 text-slate-500\" />\r\n </button>\r\n </div>\r\n {(editingTagData.catId === \"PROP\" ||\r\n editingTagData.catId === \"SET_PROP\") && (\r\n <div className=\"flex flex-col gap-1.5\">\r\n <label className=\"text-[11px] font-bold text-slate-600 ml-1\">\r\n Quantity\r\n </label>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n value={tagForm.quantity}\r\n onChange={(e) => {\r\n const val = Math.max(1, parseInt(e.target.value) || 1);\r\n setTagForm((prev) => ({\r\n ...prev,\r\n quantity: val,\r\n }));\r\n }}\r\n className=\"w-full text-[13px] px-3 py-2 rounded-xl border border-slate-200/80 outline-none focus:border-[#15607b] focus:ring-2 focus:ring-[#15607b]/20 transition-all bg-slate-50/50 focus:bg-white font-semibold text-slate-700\"\r\n />\r\n </div>\r\n )}\r\n {editingTagData.catId === \"CAST\" && (\r\n <div className=\"flex flex-col gap-3\">\r\n <div className=\"flex flex-col gap-1.5\">\r\n <label className=\"text-[11px] font-bold text-slate-600 ml-1\">\r\n Look\r\n </label>\r\n <input\r\n type=\"text\"\r\n placeholder=\"e.g. Dirty, Formal\"\r\n value={tagForm.look}\r\n onChange={(e) => {\r\n setTagForm((prev) => ({\r\n ...prev,\r\n look: e.target.value,\r\n }));\r\n }}\r\n className=\"w-full text-[13px] px-3 py-2 rounded-xl border border-slate-200/80 outline-none focus:border-[#15607b] focus:ring-2 focus:ring-[#15607b]/20 transition-all bg-slate-50/50 focus:bg-white font-semibold text-slate-700 placeholder:text-slate-400 placeholder:font-normal\"\r\n />\r\n </div>\r\n <div className=\"flex flex-col gap-1.5\">\r\n <label className=\"text-[11px] font-bold text-slate-600 ml-1\">\r\n Age\r\n </label>\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n max=\"100\"\r\n value={tagForm.age}\r\n onChange={(e) => {\r\n let val = parseInt(e.target.value);\r\n if (isNaN(val)) {\r\n setTagForm((prev) => ({\r\n ...prev,\r\n age: \"\",\r\n }));\r\n return;\r\n }\r\n val = Math.max(0, Math.min(100, val));\r\n setTagForm((prev) => ({\r\n ...prev,\r\n age: val.toString(),\r\n }));\r\n }}\r\n className=\"w-full text-[13px] px-3 py-2 rounded-xl border border-slate-200/80 outline-none focus:border-[#15607b] focus:ring-2 focus:ring-[#15607b]/20 transition-all bg-slate-50/50 focus:bg-white font-semibold text-slate-700\"\r\n />\r\n </div>\r\n </div>\r\n )}\r\n <div className=\"mt-4\">\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n if (editingTagData.tag.id) {\r\n updateTag?.(editingTagData.tag.id, editingTagData.catId, {\r\n ...(editingTagData.catId === \"PROP\" ||\r\n editingTagData.catId === \"SET_PROP\"\r\n ? { quantity: tagForm.quantity }\r\n : {}),\r\n ...(editingTagData.catId === \"CAST\"\r\n ? { look: tagForm.look, age: tagForm.age }\r\n : {}),\r\n });\r\n }\r\n setEditingTagData(null);\r\n }}\r\n className=\"w-full bg-[#15607b] hover:bg-[#134a61] text-white text-[12px] font-bold py-2.5 rounded-xl transition-all shadow-[0_4px_12px_rgba(21,96,123,0.2)] hover:shadow-[0_6px_16px_rgba(21,96,123,0.3)] active:scale-[0.98]\"\r\n >\r\n Update Details\r\n </button>\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\n// import useScriptBreakdown from \"./use-script-breakdown\";\r\nimport { Block, BlockType, uuid } from \"../types/screenplay-editor.types\";\r\nimport { ElementCategory, Tag } from \"../types/script-breakdown.types\";\r\n\r\nexport interface UseScriptBreakdownSceneOptions {\r\n scene_url: string;\r\n fetchOptions?: RequestInit;\r\n onAISummarize?: (scene: any) => void;\r\n onTagAdded?: (tag: Tag) => void;\r\n onTagsBulkAdded?: (tags: Tag[], summary?: string) => Promise<void>;\r\n onTagRemoved?: (tagId: string) => void;\r\n onTagUpdated?: (\r\n tagId: string,\r\n categoryId: ElementCategory | null,\r\n details?: Partial<Tag>,\r\n ) => void;\r\n preLoadedTags?: Tag[];\r\n preLoadedTagsLoading?: boolean;\r\n}\r\n\r\nexport function useScriptBreakdownScene(\r\n options: UseScriptBreakdownSceneOptions,\r\n) {\r\n // const { scenes, isLoading, error } = useScriptBreakdown({ scenes: [] });\r\n const [tags, setTags] = useState<Tag[]>(options.preLoadedTags || []);\r\n const [selectionMenu, setSelectionMenu] = useState<{\r\n blockId: string;\r\n startIndex: number;\r\n endIndex: number;\r\n text: string;\r\n top: number;\r\n left: number;\r\n } | null>(null);\r\n const autoTaggedSceneRef = useRef<string | null>(null);\r\n const [scene, setScene] = useState<any>(null);\r\n const [menuPlacement, setMenuPlacement] = useState<\"top\" | \"bottom\">(\"top\");\r\n const [sceneBrief, setSceneBrief] = useState<string>(\"\");\r\n const [isSummarizing, setIsSummarizing] = useState<boolean>(false);\r\n const [isLoading, setIsLoading] = useState<boolean>(true);\r\n const [error, setError] = useState<boolean>(false);\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n setIsLoading(true);\r\n const fetchScene = async () => {\r\n try {\r\n const response = await fetch(options.scene_url, options.fetchOptions);\r\n if (response.ok) {\r\n const text = await response.text();\r\n setScene({ content: text });\r\n } else {\r\n console.error(\"Failed to fetch scene:\", response);\r\n setError(true);\r\n }\r\n setIsLoading(false);\r\n } catch (error) {\r\n setError(true);\r\n setIsLoading(false);\r\n console.error(\"Error fetching scene:\", error);\r\n }\r\n };\r\n fetchScene();\r\n }, []);\r\n\r\n const blocks = useMemo(() => {\r\n if (!scene || !scene.content) return [];\r\n\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(scene.content, \"text/html\");\r\n const divs = Array.from(doc.querySelectorAll(\"div\"));\r\n const parsedBlocks: Block[] = [];\r\n\r\n const typeMap: Record<string, BlockType> = {\r\n divtype0: \"SCENE_HEADING\",\r\n divtype2: \"ACTION\",\r\n divtype3: \"CHARACTER\",\r\n divtype4: \"PARENTHETICAL\",\r\n divtype5: \"DIALOGUE\",\r\n divtype6: \"TRANSITION\",\r\n };\r\n\r\n divs.forEach((div) => {\r\n const divText = div.textContent?.trim() || \"\";\r\n if (!divText) return;\r\n\r\n let type: BlockType = \"ACTION\";\r\n for (const className of Array.from(div.classList)) {\r\n if (typeMap[className]) {\r\n type = typeMap[className];\r\n break;\r\n }\r\n }\r\n\r\n const idAttr = div.getAttribute(\"id\");\r\n const blockId =\r\n idAttr && idAttr.startsWith(\"par\")\r\n ? idAttr.substring(3)\r\n : idAttr || uuid();\r\n\r\n parsedBlocks.push({ id: blockId, type, text: divText });\r\n });\r\n\r\n return parsedBlocks;\r\n }, [scene]);\r\n\r\n const characters = useMemo(() => {\r\n const chars = blocks\r\n .filter((b) => b.type === \"CHARACTER\")\r\n .map((b) => {\r\n const text = b.text.trim().toUpperCase();\r\n const parenIndex = text.indexOf(\"(\");\r\n return parenIndex > -1 ? text.substring(0, parenIndex).trim() : text;\r\n })\r\n .filter(Boolean);\r\n\r\n return [...new Set(chars)];\r\n }, [blocks]);\r\n\r\n const handleAISummarize = async () => {\r\n setIsSummarizing(true);\r\n const res: any = await options.onAISummarize?.(scene.content);\r\n\r\n if (res.ok) {\r\n const data = await res.json();\r\n setIsSummarizing(false);\r\n\r\n let parsedData: any[] = [];\r\n let parsedSummaryData: any = {};\r\n\r\n try {\r\n const normalData = JSON.parse(data.data);\r\n if (Array.isArray(normalData)) {\r\n parsedData = Array.isArray(normalData[0]) ? normalData[0] : [];\r\n const summary = Array.isArray(normalData[1]) ? normalData[1] : [];\r\n parsedSummaryData = summary[0] || {};\r\n }\r\n } catch (error) {\r\n console.error(\"Error parsing AI summary data:\", error);\r\n }\r\n\r\n setSceneBrief(parsedSummaryData.summarise || \"\");\r\n\r\n const newTags: Tag[] = [];\r\n\r\n parsedData.forEach((aiTag: any) => {\r\n if (\r\n !aiTag.block_id ||\r\n !aiTag.category_id ||\r\n typeof aiTag.start_index !== \"number\" ||\r\n typeof aiTag.end_index !== \"number\"\r\n ) {\r\n return;\r\n }\r\n\r\n const newTag: Tag = {\r\n id: aiTag.id || uuid(),\r\n block_id: String(aiTag.block_id).startsWith(\"par\")\r\n ? String(aiTag.block_id).substring(3)\r\n : String(aiTag.block_id),\r\n category_id: aiTag.category_id,\r\n name: aiTag.name,\r\n start_index: aiTag.start_index,\r\n end_index: aiTag.end_index,\r\n };\r\n\r\n if (aiTag.category_id === \"PROP\" || aiTag.category_id === \"SET_PROP\") {\r\n newTag.quantity = 1;\r\n } else if (aiTag.category_id === \"CAST\") {\r\n newTag.look = \"\";\r\n newTag.age = \"\";\r\n }\r\n\r\n newTags.push(newTag);\r\n });\r\n\r\n if (newTags.length > 0) {\r\n const originalTags = tags;\r\n setTags((prev) => {\r\n const merged = [...prev];\r\n newTags.forEach((newTag) => {\r\n // Prevent overlapping tags\r\n const isOverlapping = merged.some(\r\n (t) =>\r\n t.block_id === newTag.block_id &&\r\n newTag.end_index > t.start_index &&\r\n newTag.start_index < t.end_index,\r\n );\r\n if (!isOverlapping) {\r\n merged.push(newTag);\r\n }\r\n });\r\n return merged;\r\n });\r\n\r\n try {\r\n if (options.onTagsBulkAdded) {\r\n await options.onTagsBulkAdded(newTags, parsedSummaryData.summarise);\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to bulk add AI-generated tags:\", error);\r\n setTags(originalTags);\r\n }\r\n }\r\n\r\n return data;\r\n } else {\r\n setIsSummarizing(false);\r\n console.error(\"Failed to summarize scene:\", res);\r\n }\r\n };\r\n\r\n const bulkCreateTags = useCallback(async () => {\r\n if (blocks.length === 0) return;\r\n\r\n const newTags: Tag[] = [];\r\n const seenCharacters = new Set<string>();\r\n const timeOfDays = [\"DAY\", \"NIGHT\"];\r\n const isTimeOfDay = (str: string) => timeOfDays.includes(str.toUpperCase());\r\n\r\n blocks.forEach((block) => {\r\n if (block.type === \"CHARACTER\") {\r\n const text = block.text.trim();\r\n const parenIndex = text.indexOf(\"(\");\r\n const charName =\r\n parenIndex > -1 ? text.substring(0, parenIndex).trim() : text;\r\n\r\n if (charName && !seenCharacters.has(charName.toUpperCase())) {\r\n seenCharacters.add(charName.toUpperCase());\r\n const startIndex = text.indexOf(charName);\r\n if (startIndex !== -1) {\r\n newTags.push({\r\n id: uuid(),\r\n block_id: block.id,\r\n category_id: \"CAST\" as unknown as ElementCategory,\r\n name: charName,\r\n start_index: startIndex,\r\n end_index: startIndex + charName.length,\r\n look: \"\",\r\n age: \"\",\r\n });\r\n }\r\n }\r\n } else if (block.type === \"SCENE_HEADING\") {\r\n const text = block.text.trim();\r\n const typeMatch = text.match(\r\n /^(INT\\/EXT|INT\\.?\\/EXT\\.?|INT\\.EXT\\.?|INT|EXT|I\\/E)\\.?\\s+/i,\r\n );\r\n let remainingText = text;\r\n let offset = 0;\r\n\r\n if (typeMatch) {\r\n offset = typeMatch[0].length;\r\n remainingText = text.substring(offset);\r\n }\r\n\r\n const parts = remainingText.split(/\\s+-\\s+/);\r\n if (parts.length > 0) {\r\n const locationName = parts[0].trim();\r\n const locStart = text.indexOf(locationName, offset);\r\n if (locStart !== -1 && locationName) {\r\n newTags.push({\r\n id: uuid(),\r\n block_id: block.id,\r\n category_id: \"LOCATION\" as unknown as ElementCategory,\r\n name: locationName,\r\n start_index: locStart,\r\n end_index: locStart + locationName.length,\r\n });\r\n }\r\n\r\n if (parts.length > 1) {\r\n const secondPart = parts[1].trim();\r\n const isLast = parts.length === 2;\r\n // Only treat the second part as sublocation if it's not the time of day\r\n if (!isLast || !isTimeOfDay(secondPart)) {\r\n const subLocStart = text.indexOf(\r\n secondPart,\r\n locStart + locationName.length,\r\n );\r\n if (subLocStart !== -1 && secondPart) {\r\n newTags.push({\r\n id: uuid(),\r\n block_id: block.id,\r\n category_id: \"SUBLOCATION\" as unknown as ElementCategory,\r\n name: secondPart,\r\n start_index: subLocStart,\r\n end_index: subLocStart + secondPart.length,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n if (newTags.length > 0) {\r\n const originalTags = tags;\r\n setTags((prev) => {\r\n const merged = [...prev];\r\n // Ensure characters are only highlighted once across both existing and new tags\r\n const existingChars = new Set(\r\n merged\r\n .filter(\r\n (t) =>\r\n t.category_id === (\"CHARACTER\" as unknown as ElementCategory) ||\r\n t.category_id === (\"CAST\" as unknown as ElementCategory),\r\n )\r\n .map((t) => t.name.toUpperCase()),\r\n );\r\n\r\n newTags.forEach((newTag) => {\r\n if (\r\n newTag.category_id === (\"CHARACTER\" as unknown as ElementCategory)\r\n ) {\r\n if (existingChars.has(newTag.name.toUpperCase())) return;\r\n existingChars.add(newTag.name.toUpperCase());\r\n }\r\n\r\n const isOverlapping = merged.some(\r\n (t) =>\r\n t.block_id === newTag.block_id &&\r\n newTag.end_index > t.start_index &&\r\n newTag.start_index < t.end_index,\r\n );\r\n if (!isOverlapping) {\r\n merged.push(newTag);\r\n }\r\n });\r\n return merged;\r\n });\r\n\r\n try {\r\n if (options.onTagsBulkAdded) {\r\n await options.onTagsBulkAdded(newTags);\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to bulk create tags:\", error);\r\n setTags(originalTags);\r\n }\r\n }\r\n }, [blocks, tags, options.onTagsBulkAdded]);\r\n\r\n // Reset tags when scene changes to prevent stale tags between navigation\r\n useEffect(() => {\r\n setSceneBrief(\"\");\r\n autoTaggedSceneRef.current = null;\r\n }, [options.scene_url]);\r\n\r\n useEffect(() => {\r\n if (options.preLoadedTags && options.preLoadedTags.length > 0) {\r\n setTags((prev) => {\r\n if (JSON.stringify(prev) === JSON.stringify(options.preLoadedTags)) {\r\n return prev;\r\n }\r\n return options.preLoadedTags || [];\r\n });\r\n }\r\n }, [options.preLoadedTags]);\r\n\r\n useEffect(() => {\r\n const doBulkCreate = async () => {\r\n if (blocks.length === 0) return;\r\n\r\n if (options.preLoadedTagsLoading) return;\r\n\r\n if (autoTaggedSceneRef.current === options.scene_url) return;\r\n\r\n const hasPreloadedTags =\r\n options.preLoadedTags && options.preLoadedTags.length > 0;\r\n\r\n autoTaggedSceneRef.current = options.scene_url;\r\n\r\n if (hasPreloadedTags) return;\r\n\r\n await bulkCreateTags();\r\n };\r\n\r\n doBulkCreate();\r\n }, [\r\n blocks,\r\n options.scene_url,\r\n options.preLoadedTags,\r\n options.preLoadedTagsLoading,\r\n ]);\r\n\r\n const clearSelection = useCallback(() => {\r\n setSelectionMenu(null);\r\n window.getSelection()?.removeAllRanges();\r\n }, []);\r\n\r\n // Reset placement to default when selection closes\r\n useEffect(() => {\r\n if (!selectionMenu) {\r\n setMenuPlacement(\"top\");\r\n }\r\n }, [selectionMenu]);\r\n\r\n // Flip menu if it goes off screen\r\n useEffect(() => {\r\n if (selectionMenu && menuRef.current) {\r\n const rect = menuRef.current.getBoundingClientRect();\r\n if (menuPlacement === \"top\" && rect.top < 100) {\r\n setMenuPlacement(\"bottom\");\r\n } else if (\r\n menuPlacement === \"bottom\" &&\r\n rect.bottom > window.innerHeight - 40 &&\r\n rect.top > 300\r\n ) {\r\n setMenuPlacement(\"top\");\r\n }\r\n }\r\n }, [selectionMenu, menuPlacement]);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (selectionMenu && !(e.target as HTMLElement).closest(\".tag-menu\")) {\r\n clearSelection();\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, [selectionMenu, clearSelection]);\r\n\r\n const getAbsoluteOffset = (\r\n container: HTMLElement,\r\n targetNode: Node,\r\n targetOffset: number,\r\n ) => {\r\n let absoluteOffset = 0;\r\n let found = false;\r\n\r\n const traverse = (node: Node) => {\r\n if (found) return;\r\n if (node === targetNode) {\r\n absoluteOffset += targetOffset;\r\n found = true;\r\n return;\r\n }\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n absoluteOffset += node.nodeValue?.length || 0;\r\n } else {\r\n for (let i = 0; i < node.childNodes.length; i++) {\r\n traverse(node.childNodes[i]);\r\n if (found) return;\r\n }\r\n }\r\n };\r\n\r\n traverse(container);\r\n return found ? absoluteOffset : null;\r\n };\r\n\r\n const handleMouseUp = () => {\r\n const selection = window.getSelection();\r\n if (!selection || selection.isCollapsed || !selection.toString().trim())\r\n return;\r\n\r\n const range = selection.getRangeAt(0);\r\n let container = range.commonAncestorContainer as HTMLElement;\r\n if (container.nodeType === Node.TEXT_NODE)\r\n container = container.parentElement!;\r\n\r\n const blockElem = container.closest(\"[data-block-id]\") as HTMLElement;\r\n if (!blockElem) return;\r\n\r\n const blockId = blockElem.getAttribute(\"data-block-id\")!;\r\n const startOffset = getAbsoluteOffset(\r\n blockElem,\r\n range.startContainer,\r\n range.startOffset,\r\n );\r\n const endOffset = getAbsoluteOffset(\r\n blockElem,\r\n range.endContainer,\r\n range.endOffset,\r\n );\r\n\r\n if (startOffset !== null && endOffset !== null) {\r\n const rect = range.getBoundingClientRect();\r\n const blockRect = blockElem.getBoundingClientRect();\r\n setSelectionMenu({\r\n blockId,\r\n startIndex: Math.min(startOffset, endOffset),\r\n endIndex: Math.max(startOffset, endOffset),\r\n text: selection.toString().trim(),\r\n top: rect.top - blockRect.top,\r\n left: rect.left - blockRect.left + rect.width / 2,\r\n });\r\n }\r\n };\r\n\r\n const addTag = async (categoryId: ElementCategory) => {\r\n if (!selectionMenu) return;\r\n const newTag: Tag = {\r\n id: uuid(),\r\n block_id: selectionMenu.blockId,\r\n category_id: categoryId,\r\n name: selectionMenu.text,\r\n start_index: selectionMenu.startIndex,\r\n end_index: selectionMenu.endIndex,\r\n };\r\n\r\n if (categoryId === \"PROP\" || categoryId === \"SET_PROP\") {\r\n newTag.quantity = 1;\r\n } else if (categoryId === \"CAST\") {\r\n newTag.look = \"\";\r\n newTag.age = \"\";\r\n }\r\n\r\n // Optimistically update the UI\r\n setTags((prev) => {\r\n const filtered = prev.filter(\r\n (t) =>\r\n t.block_id !== newTag.block_id ||\r\n !(\r\n newTag.end_index > t.start_index && newTag.start_index < t.end_index\r\n ),\r\n );\r\n return [...filtered, newTag];\r\n });\r\n clearSelection();\r\n\r\n try {\r\n await options.onTagAdded?.(newTag);\r\n } catch (error) {\r\n console.error(\"Failed to add tag:\", error);\r\n // On failure, revert the optimistic update\r\n setTags((prev) => prev.filter((t) => t.id !== newTag.id));\r\n }\r\n };\r\n\r\n const removeTag = async (e: React.MouseEvent, id: string) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n const tagToRemove = tags.find((t) => t.id === id);\r\n if (!tagToRemove) return;\r\n\r\n // Optimistically remove the tag from the UI\r\n setTags((prev) => prev.filter((t) => t.id !== id));\r\n clearSelection();\r\n\r\n try {\r\n await options.onTagRemoved?.(id);\r\n } catch (error) {\r\n console.error(\"Failed to remove tag:\", error);\r\n // On failure, revert the optimistic update by adding the tag back\r\n setTags((prev) => [...prev, tagToRemove]);\r\n }\r\n };\r\n\r\n const updateTag = async (\r\n id: string,\r\n categoryId?: ElementCategory | null,\r\n details?: Partial<Tag>,\r\n ) => {\r\n const tagToUpdate = tags.find((t) => t.id === id);\r\n if (!tagToUpdate) return;\r\n\r\n const updatedFields: Partial<Tag> = { ...details };\r\n if (categoryId) {\r\n updatedFields.category_id = categoryId;\r\n if (categoryId === \"PROP\" || categoryId === \"SET_PROP\") {\r\n updatedFields.quantity = tagToUpdate.quantity ?? 1;\r\n } else if (categoryId === \"CAST\") {\r\n updatedFields.look = tagToUpdate.look ?? \"\";\r\n updatedFields.age = tagToUpdate.age ?? \"\";\r\n }\r\n }\r\n\r\n // Optimistically update the UI\r\n setTags((prev) =>\r\n prev.map((t) => {\r\n if (t.id === id) return { ...t, ...updatedFields };\r\n // Sync details across identically named tags in the same category\r\n if (\r\n details &&\r\n t.name === tagToUpdate.name &&\r\n t.category_id === tagToUpdate.category_id\r\n ) {\r\n return { ...t, ...details };\r\n }\r\n return t;\r\n }),\r\n );\r\n if (categoryId) clearSelection();\r\n\r\n try {\r\n await options.onTagUpdated?.(id, categoryId || null, details);\r\n } catch (error) {\r\n console.error(\"Failed to update tag:\", error);\r\n // On failure, revert the optimistic update\r\n setTags((prev) => prev.map((t) => (t.id === id ? tagToUpdate : t)));\r\n }\r\n };\r\n\r\n return {\r\n scene,\r\n blocks,\r\n characters,\r\n isLoading,\r\n error,\r\n tags,\r\n selectionMenu,\r\n handleMouseUp,\r\n addTag,\r\n updateTag,\r\n removeTag,\r\n clearSelection,\r\n menuPlacement,\r\n menuRef,\r\n sceneBrief,\r\n setSceneBrief,\r\n handleAISummarize,\r\n isSummarizing,\r\n };\r\n}\r\n","import { X } from \"lucide-react\";\r\nimport React, { useEffect } from \"react\";\r\n\r\nfunction ModalLayout({\r\n children,\r\n onClose,\r\n title,\r\n maxWidth = \"max-w-4xl\",\r\n menuRef,\r\n}: {\r\n children: React.ReactNode;\r\n onClose: () => void;\r\n title: string;\r\n maxWidth?: string;\r\n menuRef?: React.RefObject<HTMLDivElement | null>;\r\n}) {\r\n useEffect(() => {\r\n document.body.style.overflow = \"hidden\";\r\n return () => {\r\n document.body.style.overflow = \"\";\r\n };\r\n }, []);\r\n\r\n return (\r\n <div\r\n ref={menuRef}\r\n onClick={onClose}\r\n className=\"fixed inset-0 z-50 overflow-y-auto bg-black/40 backdrop-blur-xs\"\r\n data-lenis-prevent=\"true\"\r\n >\r\n <div className=\"flex min-h-full items-center justify-center p-4 sm:p-6\">\r\n <div\r\n onClick={(e) => e.stopPropagation()}\r\n className={`relative w-full ${maxWidth} bg-white rounded-3xl shadow-2xl transform transition-all duration-300 scale-100 opacity-100 animate-modal`}\r\n >\r\n <div className=\"flex items-center justify-between border-b border-gray-200 pb-3 pt-6 px-6\">\r\n <h2 className=\"text-xl sm:text-2xl font-medium text-blumine-600 line-clamp-1\">\r\n {title}\r\n </h2>\r\n <button\r\n onClick={onClose}\r\n className=\"w-10 h-10 flex items-center justify-center rounded-full border border-blumine-600 text-blumine-600 hover:bg-blumine-600/10 hover:rotate-90 transition-all duration-300\"\r\n aria-label=\"Close\"\r\n >\r\n <X size={20} />\r\n </button>\r\n </div>\r\n\r\n {children}\r\n </div>\r\n </div>\r\n\r\n <style>\r\n {`\r\n @keyframes modal {\r\n 0% {\r\n opacity: 0;\r\n transform: translateY(20px) scale(0.95);\r\n }\r\n 100% {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n }\r\n .animate-modal {\r\n animation: modal 0.3s ease-out forwards;\r\n }\r\n `}\r\n </style>\r\n </div>\r\n );\r\n}\r\n\r\nexport default ModalLayout;\r\n","import { ErrorMessage, Field, useFormikContext } from \"formik\";\r\nimport { AsteriskIcon } from \"lucide-react\";\r\nimport React from \"react\";\r\n\r\ninterface FormikSelectProps {\r\n label?: string;\r\n name: string;\r\n selectedOption: string;\r\n optionData?: Record<string, any>[];\r\n onChange?: (e: React.ChangeEvent<HTMLSelectElement>) => void;\r\n value?: string | number;\r\n disable?: boolean;\r\n divClasses?: string;\r\n valueProperty?: string;\r\n labelProperty?: string;\r\n label2propery?: string;\r\n brackets?: boolean;\r\n className?: string;\r\n enableRedAsterick?: boolean;\r\n disableOptionProperty?: string;\r\n disabledOptionText?: string;\r\n}\r\nexport const FormikSelect = ({\r\n label,\r\n name,\r\n selectedOption,\r\n optionData,\r\n value,\r\n disable,\r\n divClasses,\r\n valueProperty = \"name\",\r\n labelProperty = \"name\",\r\n label2propery,\r\n brackets,\r\n className,\r\n enableRedAsterick = false,\r\n disableOptionProperty = \"disable\",\r\n disabledOptionText = \"\",\r\n onChange,\r\n}: FormikSelectProps) => {\r\n return (\r\n <div className={`w-full ${divClasses}`}>\r\n {label && (\r\n <label className={`mb-1.5 text-sm font-medium text-slate-700 capitalize flex`}>\r\n {label}\r\n {enableRedAsterick && (\r\n <AsteriskIcon className=\"size-3 text-red-500\" />\r\n )}\r\n </label>\r\n )}\r\n <Field\r\n name={name}\r\n as=\"select\"\r\n value={value}\r\n disabled={disable}\r\n onChange={onChange}\r\n className={`${className} rounded-[2.5rem] block w-full px-3 py-2.5 text-slate-700 placeholder-slate-400 placeholder:capitalize bg-white border border-slate-300/80 focus:border-blumine-500 focus:ring-2 focus:ring-blumine-500/50 focus:outline-none transition-all`}\r\n >\r\n <option selected value=\"\" disabled className=\"capitalize\">\r\n {selectedOption}\r\n </option>\r\n {optionData?.map((option, index) => (\r\n <option\r\n key={index}\r\n value={option[valueProperty]}\r\n disabled={option[disableOptionProperty]}\r\n >\r\n {option[labelProperty]}\r\n {label2propery\r\n ? brackets\r\n ? ` (${option[label2propery]})`\r\n : option[label2propery]\r\n : \"\"}{\" \"}\r\n {option[disableOptionProperty] && `(${disabledOptionText})`}\r\n </option>\r\n ))}\r\n </Field>\r\n <ErrorMessage\r\n name={name}\r\n className=\"text-red-500 text-sm mt-1\"\r\n component=\"div\"\r\n />\r\n </div>\r\n );\r\n};\r\n\r\ninterface FormikInputProps {\r\n label: string;\r\n name: string;\r\n type: string;\r\n placeholder?: string;\r\n className?: string;\r\n labelClassName?: string;\r\n readOnly?: boolean;\r\n divClasses?: string;\r\n length?: number;\r\n disable?: boolean;\r\n min?: number;\r\n max?: number;\r\n convertToText?: boolean;\r\n enableRedAsterick?: boolean;\r\n case_sensitivity?: \"normal\" | \"lowercase\" | \"uppercase\";\r\n [key: string]: any;\r\n}\r\nexport const FormikInput = ({\r\n label,\r\n name,\r\n type,\r\n placeholder,\r\n className,\r\n labelClassName,\r\n readOnly,\r\n divClasses,\r\n length,\r\n disable,\r\n min = 0,\r\n max,\r\n convertToText = false,\r\n enableRedAsterick = false,\r\n case_sensitivity = \"normal\",\r\n ...props\r\n}: FormikInputProps) => {\r\n const { setFieldValue } = useFormikContext();\r\n\r\n const handleCaseChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n let value = e.target.value;\r\n\r\n if (type === \"number\" && min !== undefined) {\r\n if (value !== \"\" && Number(value) < min) return;\r\n }\r\n\r\n switch (case_sensitivity) {\r\n case \"lowercase\":\r\n value = value.toLowerCase();\r\n break;\r\n case \"uppercase\":\r\n value = value.toUpperCase();\r\n break;\r\n case \"normal\":\r\n default:\r\n break;\r\n }\r\n\r\n setFieldValue(name, value);\r\n };\r\n\r\n return (\r\n <div className={`w-full ${divClasses}`}>\r\n <label\r\n className={`${labelClassName} mb-1.5 text-sm font-medium text-slate-700 capitalize flex`}\r\n >\r\n {label}\r\n {enableRedAsterick && <AsteriskIcon className=\"size-3 text-red-500\" />}\r\n </label>\r\n <Field\r\n name={name}\r\n placeholder={placeholder}\r\n readOnly={readOnly}\r\n type={type}\r\n maxLength={length}\r\n disabled={disable}\r\n max={max}\r\n min={min}\r\n onChange={handleCaseChange}\r\n {...props}\r\n className={`${className} rounded-[2.5rem] block w-full px-3 py-2.5 text-slate-700 placeholder-slate-400 placeholder:capitalize bg-white border border-slate-300/80 focus:border-blumine-500 focus:ring-2 focus:ring-blumine-500/50 focus:outline-none transition-all disabled:opacity-70`}\r\n />\r\n\r\n <ErrorMessage\r\n name={name}\r\n className=\"text-red-500 text-sm mt-1\"\r\n component=\"div\"\r\n />\r\n </div>\r\n );\r\n};\r\n\r\ninterface FormikTextareaProps {\r\n label: string;\r\n name: string;\r\n placeholder?: string;\r\n readOnly?: boolean;\r\n divClasses?: string;\r\n className?: string;\r\n length?: number;\r\n disable?: boolean;\r\n min?: number;\r\n max?: number;\r\n enableRedAsterick?: boolean;\r\n}\r\nexport const FormikTextarea = ({\r\n label,\r\n name,\r\n placeholder,\r\n readOnly,\r\n divClasses = \"\",\r\n className = \"\",\r\n length,\r\n disable,\r\n min,\r\n max,\r\n enableRedAsterick = false,\r\n}: FormikTextareaProps) => {\r\n return (\r\n <div className={`w-full ${divClasses}`}>\r\n <label className={`mb-1.5 text-sm font-medium text-slate-700 capitalize flex`}>\r\n {label}\r\n {enableRedAsterick && <AsteriskIcon className=\"size-3 text-red-500\" />}\r\n </label>\r\n <Field\r\n as=\"textarea\"\r\n name={name}\r\n placeholder={placeholder}\r\n readOnly={readOnly}\r\n maxLength={length}\r\n disabled={disable}\r\n max={max}\r\n min={min}\r\n className={`${className} block w-full px-4 py-3 text-slate-700 placeholder-slate-400 placeholder:capitalize bg-white border border-slate-300/80 rounded-2xl focus:border-blumine-500 focus:ring-2 focus:ring-blumine-500/50 focus:outline-none transition-all disabled:opacity-70`}\r\n />\r\n <ErrorMessage\r\n name={name}\r\n className=\"text-red-500 text-sm mt-1\"\r\n component=\"div\"\r\n />\r\n </div>\r\n );\r\n};\r\n","export const shot_types = [\r\n { name: \"Extreme Close-Up (ECU)\" },\r\n { name: \"Extreme Close-Up 2-Shot\" },\r\n { name: \"Close-Up (CU)\" },\r\n { name: \"Close-Up 2-Shot\" },\r\n { name: \"Medium Close-Up (MCU)\" },\r\n { name: \"Medium Close-Up 2-Shot\" },\r\n { name: \"Medium Shot (MS)\" },\r\n { name: \"Medium Shot 2-Shot\" },\r\n { name: \"Medium Wide Shot (MWS)\" },\r\n { name: \"Medium Wide 2-Shot\" },\r\n { name: \"Wide Shot (WS)\" },\r\n { name: \"Wide Shot 2-Shot\" },\r\n { name: \"Extreme Wide Shot (EWS)\" },\r\n { name: \"Establishing Shot\" },\r\n { name: \"Over-the-Shoulder (OTS)\" },\r\n { name: \"Over-the-Shoulder 2-Shot\" },\r\n { name: \"Reverse Over-the-Shoulder\" },\r\n { name: \"Point of View (POV)\" },\r\n { name: \"Subjective POV\" },\r\n { name: \"Objective Shot\" },\r\n { name: \"Insert Shot\" },\r\n { name: \"Cutaway Shot\" },\r\n { name: \"Reaction Shot\" },\r\n { name: \"Profile Shot\" },\r\n { name: \"Profile 2-Shot\" },\r\n { name: \"Silhouette Shot\" },\r\n];\r\n\r\nexport const camera_angles = [\r\n { name: \"Eye Level\" },\r\n { name: \"Low Angle\" },\r\n { name: \"High Angle\" },\r\n { name: \"Bird’s Eye View (Top Shot)\" },\r\n { name: \"Worm’s Eye View (Ground Level)\" },\r\n { name: \"Dutch Tilt (Canted Angle)\" },\r\n { name: \"Overhead Shot\" },\r\n { name: \"Underhead Shot\" },\r\n { name: \"Shoulder Level\" },\r\n { name: \"Hip Level\" },\r\n { name: \"Knee Level\" },\r\n { name: \"Ground Level Tracking Angle\" },\r\n { name: \"Aerial Angle (Drone)\" },\r\n { name: \"Subjective Angle (POV Angle)\" },\r\n];\r\n\r\nexport const camera_movements = [\r\n { name: \"Static (Locked-Off)\" },\r\n { name: \"Pan Left\" },\r\n { name: \"Pan Right\" },\r\n { name: \"Tilt Up\" },\r\n { name: \"Tilt Down\" },\r\n { name: \"Roll (Dutch Roll)\" },\r\n { name: \"Dolly In\" },\r\n { name: \"Dolly Out\" },\r\n { name: \"Dolly Left\" },\r\n { name: \"Dolly Right\" },\r\n { name: \"Truck Left\" },\r\n { name: \"Truck Right\" },\r\n { name: \"Pedestal Up\" },\r\n { name: \"Pedestal Down\" },\r\n { name: \"Tracking Shot\" },\r\n { name: \"Push-In\" },\r\n { name: \"Pull-Out\" },\r\n { name: \"Crane Up\" },\r\n { name: \"Crane Down\" },\r\n { name: \"Jib Shot\" },\r\n { name: \"Steadicam\" },\r\n { name: \"Handheld\" },\r\n { name: \"Whip Pan\" },\r\n { name: \"Arc Shot\" },\r\n { name: \"360 Degree Shot\" },\r\n { name: \"Orbit Shot\" },\r\n { name: \"Zoom In\" },\r\n { name: \"Zoom Out\" },\r\n { name: \"Dolly Zoom (Vertigo Effect)\" },\r\n];\r\n\r\nexport const camera_supports = [\r\n { name: \"Tripod\" },\r\n { name: \"Monopod\" },\r\n { name: \"Static Mount (Fixed Rig)\" },\r\n { name: \"Handheld\" },\r\n { name: \"Shoulder Rig\" },\r\n { name: \"Steadicam\" },\r\n { name: \"Gimbal\" },\r\n { name: \"Dolly (On Track)\" },\r\n { name: \"Dolly (Free / Floor)\" },\r\n { name: \"Slider\" },\r\n { name: \"Crane / Jib\" },\r\n { name: \"Drone\" },\r\n { name: \"Car Mount (Rig)\" },\r\n { name: \"Body Mount\" },\r\n { name: \"Cable Cam / Wire Cam\" },\r\n];\r\n\r\nexport const lens_options = [\r\n { name: \"14mm\", type: \"Ultra Wide\" },\r\n { name: \"18mm\", type: \"Ultra Wide\" },\r\n { name: \"24mm\", type: \"Wide\" },\r\n { name: \"28mm\", type: \"Wide\" },\r\n { name: \"35mm\", type: \"Wide / Standard\" },\r\n { name: \"50mm\", type: \"Standard\" },\r\n { name: \"65mm\", type: \"Standard / Portrait\" },\r\n { name: \"85mm\", type: \"Telephoto (Portrait)\" },\r\n { name: \"100mm\", type: \"Telephoto\" },\r\n { name: \"135mm\", type: \"Telephoto\" },\r\n { name: \"200mm\", type: \"Long Telephoto\" },\r\n];\r\n\r\nexport const aperture_options = [\r\n { value: 1.3, label: \"T1.3\" },\r\n { value: 1.4, label: \"T1.4\" },\r\n { value: 1.5, label: \"T1.5\" },\r\n { value: 1.8, label: \"T1.8\" },\r\n { value: 2.0, label: \"T2.0\" },\r\n { value: 2.2, label: \"T2.2\" },\r\n { value: 2.8, label: \"T2.8\" },\r\n { value: 3.1, label: \"T3.1\" },\r\n { value: 4.0, label: \"T4.0\" },\r\n { value: 4.5, label: \"T4.5\" },\r\n { value: 5.6, label: \"T5.6\" },\r\n { value: 6.3, label: \"T6.3\" },\r\n { value: 8.0, label: \"T8\" },\r\n { value: 9.5, label: \"T9.5\" },\r\n { value: 11, label: \"T11\" },\r\n { value: 13, label: \"T13\" },\r\n { value: 16, label: \"T16\" },\r\n { value: 22, label: \"T22\" },\r\n];\r\n\r\nexport const vfx_types = [\r\n { name: \"None\" },\r\n { name: \"Green Screen (Chroma Key)\" },\r\n { name: \"Blue Screen\" },\r\n { name: \"Set Extension\" },\r\n { name: \"Matte Painting\" },\r\n { name: \"Full CGI Environment\" },\r\n { name: \"CGI Character\" },\r\n { name: \"CGI Props\" },\r\n { name: \"Fire Simulation\" },\r\n { name: \"Smoke / Fog Simulation\" },\r\n { name: \"Water Simulation\" },\r\n { name: \"Destruction Simulation\" },\r\n { name: \"Digital Makeup / De-aging\" },\r\n { name: \"Wire Removal\" },\r\n { name: \"Object Removal\" },\r\n { name: \"Crowd Duplication\" },\r\n { name: \"Sky Replacement\" },\r\n { name: \"Weather Enhancement\" },\r\n { name: \"CG Lighting / Light Wrap\" },\r\n];\r\n\r\nexport const fps_options = [\r\n { value: 23.98, label: \"23.98 fps\" },\r\n { value: 24, label: \"24 fps\" },\r\n { value: 25, label: \"25 fps\" },\r\n { value: 29.97, label: \"29.97 fps\" },\r\n { value: 30, label: \"30 fps\" },\r\n { value: 48, label: \"48 fps\" },\r\n { value: 50, label: \"50 fps\" },\r\n { value: 59.94, label: \"59.94 fps\" },\r\n { value: 60, label: \"60 fps\" },\r\n { value: 120, label: \"120 fps (Slow Motion)\" },\r\n { value: 240, label: \"240 fps (High Speed)\" },\r\n];\r\n\r\nexport const scene_types = [\r\n { name: \"Action / Adventure\" },\r\n { name: \"Comedy / Sitcom\" },\r\n { name: \"Drama / Melodrama\" },\r\n { name: \"Sci-Fi / Fantasy\" },\r\n { name: \"Horror / Thriller\" },\r\n { name: \"Suspense / Mystery\" },\r\n { name: \"Sci-Fi Thriller / Suspense\" },\r\n { name: \"Crime / Film Noir\" },\r\n { name: \"Romance / Romantic Comedy\" },\r\n { name: \"Musical / Dance\" },\r\n { name: \"Documentary / Docudrama\" },\r\n { name: \"Animation / Family\" },\r\n { name: \"Western\" },\r\n { name: \"War / Historical\" },\r\n { name: \"Biographical (Biopic)\" },\r\n { name: \"Psychological Thriller\" },\r\n { name: \"Supernatural / Paranormal\" },\r\n { name: \"Slasher / Gore\" },\r\n { name: \"Dark Comedy / Satire\" },\r\n { name: \"Parody / Spoof\" },\r\n { name: \"Experimental / Avant-Garde\" },\r\n { name: \"Music Video / Visual Arts\" },\r\n { name: \"Instructional / Educational\" },\r\n];\r\n","\"use client\";\r\n\r\nimport * as Yup from \"yup\";\r\nimport { Camera, Shot, ShotPart } from \"@/app/types/shot-breakdown.types\";\r\nimport { useState } from \"react\";\r\nimport { Form, Formik, ErrorMessage } from \"formik\";\r\nimport {\r\n AsteriskIcon,\r\n BookText,\r\n Check,\r\n Frame,\r\n Info,\r\n Settings2,\r\n} from \"lucide-react\";\r\nimport { FormikInput, FormikSelect, FormikTextarea } from \"../input/inputs\";\r\nimport {\r\n aperture_options,\r\n camera_angles,\r\n camera_movements,\r\n camera_supports,\r\n lens_options,\r\n shot_types,\r\n vfx_types,\r\n fps_options,\r\n} from \"@/data/shot-data\";\r\n\r\nconst formSteps = [\r\n {\r\n id: 1,\r\n name: \"Core Identification\",\r\n icon: Info,\r\n fields: [\"priority\", \"shot_type\", \"camera_name\"],\r\n },\r\n {\r\n id: 2,\r\n name: \"Optics & Mechanics\",\r\n icon: Settings2,\r\n fields: [\r\n \"camera_angle\",\r\n \"camera_movement\",\r\n \"camera_support\",\r\n \"lens_mm\",\r\n \"aperture\",\r\n \"fps\",\r\n ],\r\n },\r\n {\r\n id: 3,\r\n name: \"Visual Composition\",\r\n icon: Frame,\r\n fields: [\"subject\", \"duration_seconds\", \"framing\", \"depth_of_field\"],\r\n },\r\n {\r\n id: 4,\r\n name: \"Narrative Context\",\r\n icon: BookText,\r\n fields: [\r\n \"action_blocking\",\r\n \"emotional_purpose\",\r\n \"edit_purpose\",\r\n \"reason\",\r\n \"lighting\",\r\n \"sound\",\r\n \"vfx\",\r\n ],\r\n },\r\n];\r\n\r\nconst AddShotForm = ({\r\n userShotValue,\r\n onSubmit,\r\n cameras,\r\n shots,\r\n handleCloseModal,\r\n parts,\r\n}: {\r\n userShotValue?: Omit<Shot, \"id\" | \"shot_number\" | \"parts\">;\r\n onSubmit: (values: Omit<Shot, \"id\" | \"shot_number\" | \"parts\">) => void;\r\n cameras: Camera[];\r\n shots: Shot[];\r\n handleCloseModal: () => void;\r\n parts: ShotPart[];\r\n}) => {\r\n const initialShotValues: Omit<Shot, \"id\" | \"shot_number\" | \"parts\"> = {\r\n priority: \"Essential\",\r\n shot_type: \"\",\r\n framing: \"\",\r\n camera_angle: \"\",\r\n camera_movement: \"\",\r\n camera_support: \"\",\r\n lens_mm: \"\",\r\n lens_feel: \"\",\r\n aperture: \"T2.8\",\r\n fps: 24,\r\n depth_of_field: \"\",\r\n subject: \"\",\r\n action_blocking: \"\",\r\n emotional_purpose: \"\",\r\n lighting: \"\",\r\n sound: \"\",\r\n duration_seconds: 5,\r\n edit_purpose: \"\",\r\n reason: \"\",\r\n vfx: \"None\",\r\n camera_name: cameras.length === 1 ? cameras[0].name : \"\",\r\n };\r\n\r\n const ShotSchema = Yup.object().shape({\r\n priority: Yup.string().required(\"Required\"),\r\n shot_type: Yup.string().required(\"Required\"),\r\n camera_angle: Yup.string().required(\"Required\"),\r\n camera_movement: Yup.string().required(\"Required\"),\r\n camera_support: Yup.string().required(\"Required\"),\r\n lens_mm: Yup.string().required(\"Required\"),\r\n aperture: Yup.string().required(\"Required\"),\r\n subject: Yup.string().required(\"Required\"),\r\n duration_seconds: Yup.number().min(0).required(\"Required\"),\r\n camera_name: Yup.string().required(\"Required\"),\r\n });\r\n const [step, setStep] = useState(1);\r\n const [highestStep, setHighestStep] = useState(1);\r\n\r\n return (\r\n <Formik\r\n initialValues={userShotValue || initialShotValues}\r\n validationSchema={ShotSchema}\r\n onSubmit={(values, { setSubmitting }) => {\r\n onSubmit(values);\r\n setSubmitting(false);\r\n }}\r\n >\r\n {({\r\n setFieldValue,\r\n isSubmitting,\r\n setTouched,\r\n validateForm,\r\n values,\r\n submitForm,\r\n }) => {\r\n const handleNext = async () => {\r\n const errors = await validateForm();\r\n const currentStepInfo = formSteps.find((s) => s.id === step);\r\n if (!currentStepInfo) return;\r\n\r\n const stepErrors = Object.keys(errors).filter((key) =>\r\n currentStepInfo.fields.includes(key),\r\n );\r\n\r\n if (stepErrors.length === 0) {\r\n setHighestStep((prev) => Math.max(prev, step + 1));\r\n if (step < formSteps.length) {\r\n setStep(step + 1);\r\n } else {\r\n await submitForm();\r\n }\r\n } else {\r\n const touchedFields = currentStepInfo.fields.reduce(\r\n (acc, field) => {\r\n acc[field] = true;\r\n return acc;\r\n },\r\n {} as Record<string, boolean>,\r\n );\r\n setTouched(touchedFields, true);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n setStep((s) => Math.max(s - 1, 1));\r\n };\r\n\r\n return (\r\n <Form className=\"flex flex-col overflow-hidden h-[90vh] lg:h-[85vh] bg-white rounded-b-3xl shadow-[0_12px_40px_-12px_rgba(0,0,0,0.15),_0_0_0_1px_rgba(0,0,0,0.05)]\">\r\n <div className=\"flex flex-col lg:flex-row flex-1 overflow-hidden\">\r\n <div className=\"w-full lg:w-72 flex-shrink-0 border-b lg:border-b-0 lg:border-r border-slate-200 bg-white p-4 lg:p-8 flex flex-col z-10 relative\">\r\n <h3 className=\"hidden lg:block text-[11px] font-semibold uppercase tracking-wider text-slate-400 mb-6 px-2\">\r\n {userShotValue ? \"Update Shot\" : \"Create a Shot\"}\r\n </h3>\r\n <nav className=\"flex flex-row lg:flex-col gap-2 overflow-x-auto lg:overflow-visible pb-2 lg:pb-0 [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]\">\r\n {formSteps.map((formStep) => {\r\n const isCurrent = step === formStep.id;\r\n const isAccessible = formStep.id <= highestStep;\r\n const isCompleted = formStep.id < highestStep;\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n key={formStep.id}\r\n disabled={!isAccessible}\r\n onClick={async () => {\r\n if (formStep.id !== step) {\r\n if (formStep.id < step) {\r\n setStep(formStep.id);\r\n } else {\r\n const errors = await validateForm();\r\n const currentStepInfo = formSteps.find(\r\n (s) => s.id === step,\r\n );\r\n const stepErrors = currentStepInfo\r\n ? Object.keys(errors).filter((key) =>\r\n currentStepInfo.fields.includes(key),\r\n )\r\n : [];\r\n\r\n if (stepErrors.length === 0) {\r\n setHighestStep((prev) =>\r\n Math.max(prev, step + 1),\r\n );\r\n setStep(formStep.id);\r\n } else {\r\n const touchedFields =\r\n currentStepInfo?.fields.reduce(\r\n (acc, field) => {\r\n acc[field] = true;\r\n return acc;\r\n },\r\n {} as Record<string, boolean>,\r\n );\r\n setTouched(touchedFields || {}, true);\r\n }\r\n }\r\n }\r\n }}\r\n className={`group relative flex flex-shrink-0 items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition-colors text-left w-auto lg:w-full\r\n ${isCurrent ? \"bg-slate-100 text-slate-900 font-semibold\" : \"text-slate-500\"}\r\n ${isAccessible && !isCurrent ? \"hover:bg-slate-50 hover:text-slate-900 cursor-pointer\" : \"\"}\r\n ${!isAccessible ? \"opacity-50 cursor-not-allowed\" : \"\"}`}\r\n >\r\n <div\r\n className={`flex items-center justify-center w-6 h-6 rounded-md transition-colors\r\n ${isCurrent ? \"text-slate-900\" : \"\"}\r\n ${isCompleted && !isCurrent ? \"text-slate-400\" : \"\"}\r\n ${!isCurrent && !isCompleted ? \"text-slate-400 group-hover:text-slate-600\" : \"\"}`}\r\n >\r\n {isCompleted && !isCurrent ? (\r\n <Check className=\"w-4 h-4 stroke-[2.5] text-slate-900\" />\r\n ) : (\r\n <formStep.icon\r\n className={`w-4 h-4 ${isCurrent ? \"stroke-[2.5]\" : \"stroke-[2]\"}`}\r\n />\r\n )}\r\n </div>\r\n <span\r\n className={`whitespace-nowrap ${isCurrent ? \"font-semibold\" : \"\"}`}\r\n >\r\n {formStep.name}\r\n </span>\r\n </button>\r\n );\r\n })}\r\n </nav>\r\n {parts && parts.length > 0 && (\r\n <div className=\"mt-4 lg:mt-6 pt-4 lg:pt-6 border-t border-slate-200 flex-1 flex flex-col min-h-0\">\r\n <h4 className=\"hidden lg:block text-[11px] font-semibold text-slate-400 mb-3 uppercase tracking-wider px-2\">\r\n Scene Context\r\n </h4>\r\n <div className=\"overflow-y-auto custom-scrollbar pr-2 -mr-2 max-h-24 lg:max-h-full\">\r\n <div\r\n className=\"text-[13px] text-slate-600 bg-slate-50 p-4 rounded-lg font-mono whitespace-pre-wrap leading-relaxed border border-slate-100\"\r\n style={{\r\n fontFamily:\r\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\r\n }}\r\n >\r\n {parts.map((p) => p.text).join(\" \")}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex-1 overflow-y-auto px-4 sm:px-8 md:px-12 lg:px-16 pt-6 lg:pt-10 pb-24 lg:pb-12 custom-scrollbar bg-white\">\r\n <div className=\"mx-auto\">\r\n {(() => {\r\n const currentStepInfo = formSteps.find(\r\n (s) => s.id === step,\r\n );\r\n return (\r\n <div className=\"mb-8 lg:mb-10 text-left\">\r\n <span className=\"inline-block text-[11px] font-mono text-slate-400 uppercase tracking-widest mb-2\">\r\n STEP {step} OF {formSteps.length}\r\n </span>\r\n <h2 className=\"text-2xl lg:text-3xl font-semibold text-slate-900 tracking-tight\">\r\n {currentStepInfo?.name}\r\n </h2>\r\n <p className=\"text-slate-500 mt-2 text-sm leading-relaxed max-w-xl\">\r\n Configure the necessary parameters for this shot\r\n sequence.\r\n </p>\r\n </div>\r\n );\r\n })()}\r\n\r\n <div className=\"space-y-8 lg:space-y-10\">\r\n {step === 1 && (\r\n <section className=\"animate-in fade-in slide-in-from-bottom-4 duration-500\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 md:gap-6 lg:gap-8\">\r\n <FormikInput\r\n label=\"Shot Number\"\r\n name=\"shot_number\"\r\n type=\"number\"\r\n readOnly\r\n value={shots.length + 1}\r\n />\r\n <div>\r\n <label className=\"mb-1.5 text-sm font-medium text-slate-700 capitalize flex\">\r\n Priority\r\n <AsteriskIcon className=\"size-3 text-red-500\" />\r\n </label>\r\n <div className=\"flex items-center p-1 bg-slate-100 rounded-full ring-1 ring-inset ring-slate-200/50\">\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n setFieldValue(\"priority\", \"Essential\")\r\n }\r\n className={`w-full rounded-full px-3 py-1.5 text-sm font-medium transition-colors ${\r\n values.priority === \"Essential\"\r\n ? \"bg-white text-slate-900 shadow-sm ring-1 ring-slate-200/50\"\r\n : \"text-slate-500 hover:text-slate-900\"\r\n }`}\r\n >\r\n Essential\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n setFieldValue(\"priority\", \"Optional\")\r\n }\r\n className={`w-full rounded-full px-3 py-1.5 text-sm font-medium transition-colors ${\r\n values.priority === \"Optional\"\r\n ? \"bg-white text-slate-900 shadow-sm ring-1 ring-slate-200/50\"\r\n : \"text-slate-500 hover:text-slate-900\"\r\n }`}\r\n >\r\n Optional\r\n </button>\r\n </div>\r\n <ErrorMessage\r\n name=\"priority\"\r\n className=\"text-red-500 text-sm mt-1\"\r\n component=\"div\"\r\n />\r\n </div>\r\n <FormikSelect\r\n label=\"Camera\"\r\n name=\"camera_name\"\r\n selectedOption=\"Select Camera\"\r\n optionData={cameras}\r\n enableRedAsterick\r\n value={values.camera_name}\r\n onChange={(e) =>\r\n setFieldValue(\"camera_name\", e.target.value)\r\n }\r\n />\r\n <FormikSelect\r\n label=\"Shot Type\"\r\n name=\"shot_type\"\r\n selectedOption=\"Select Shot Type\"\r\n optionData={shot_types}\r\n enableRedAsterick\r\n value={values.shot_type}\r\n onChange={(e) =>\r\n setFieldValue(\"shot_type\", e.target.value)\r\n }\r\n />\r\n </div>\r\n </section>\r\n )}\r\n\r\n {step === 2 && (\r\n <section className=\"animate-in fade-in slide-in-from-bottom-4 duration-500\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-6 lg:gap-8\">\r\n <FormikSelect\r\n label=\"Camera Angle\"\r\n name=\"camera_angle\"\r\n selectedOption=\"Select Angle\"\r\n optionData={camera_angles}\r\n enableRedAsterick\r\n value={values.camera_angle}\r\n onChange={(e) =>\r\n setFieldValue(\"camera_angle\", e.target.value)\r\n }\r\n />\r\n <FormikSelect\r\n label=\"Camera Movement\"\r\n name=\"camera_movement\"\r\n selectedOption=\"Select Movement\"\r\n optionData={camera_movements}\r\n enableRedAsterick\r\n value={values.camera_movement}\r\n onChange={(e) =>\r\n setFieldValue(\"camera_movement\", e.target.value)\r\n }\r\n />\r\n <FormikSelect\r\n label=\"Camera Support\"\r\n name=\"camera_support\"\r\n selectedOption=\"Select Support\"\r\n optionData={camera_supports}\r\n enableRedAsterick\r\n value={values.camera_support}\r\n onChange={(e) =>\r\n setFieldValue(\"camera_support\", e.target.value)\r\n }\r\n />\r\n <FormikSelect\r\n label=\"Lens (mm)\"\r\n name=\"lens_mm\"\r\n selectedOption=\"Select Lens\"\r\n optionData={lens_options}\r\n valueProperty=\"name\"\r\n enableRedAsterick\r\n value={values.lens_mm}\r\n onChange={(e) => {\r\n const lensName = e.target.value;\r\n setFieldValue(\"lens_mm\", lensName);\r\n const selectedLens = lens_options.find(\r\n (l) => l.name === lensName,\r\n );\r\n if (selectedLens) {\r\n setFieldValue(\"lens_feel\", selectedLens.type);\r\n }\r\n }}\r\n />\r\n <FormikInput\r\n label=\"Lens Feel\"\r\n name=\"lens_feel\"\r\n type=\"text\"\r\n readOnly\r\n placeholder=\"e.g. Wide, Normal, Telephoto\"\r\n />\r\n <FormikSelect\r\n label=\"Aperture (T-Stop)\"\r\n name=\"aperture\"\r\n selectedOption=\"Select Aperture\"\r\n optionData={aperture_options}\r\n valueProperty=\"label\"\r\n labelProperty=\"label\"\r\n enableRedAsterick\r\n value={values.aperture}\r\n onChange={(e) =>\r\n setFieldValue(\"aperture\", e.target.value)\r\n }\r\n />\r\n <FormikSelect\r\n label=\"Frame Rate (FPS)\"\r\n name=\"fps\"\r\n selectedOption=\"Select FPS\"\r\n optionData={fps_options}\r\n valueProperty=\"value\"\r\n labelProperty=\"label\"\r\n enableRedAsterick\r\n value={values.fps}\r\n onChange={(e) =>\r\n setFieldValue(\"fps\", e.target.value)\r\n }\r\n />\r\n </div>\r\n </section>\r\n )}\r\n\r\n {step === 3 && (\r\n <section className=\"animate-in fade-in slide-in-from-bottom-4 duration-500\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-6 lg:gap-8\">\r\n <FormikInput\r\n label=\"Subject\"\r\n name=\"subject\"\r\n type=\"text\"\r\n placeholder=\"e.g. John, The Car\"\r\n enableRedAsterick\r\n />\r\n <FormikInput\r\n label=\"Framing\"\r\n name=\"framing\"\r\n type=\"text\"\r\n placeholder=\"e.g. Over-the-shoulder\"\r\n />\r\n <FormikInput\r\n label=\"Depth of Field\"\r\n name=\"depth_of_field\"\r\n type=\"text\"\r\n placeholder=\"e.g. Shallow, Deep\"\r\n />\r\n <FormikInput\r\n label=\"Duration (seconds)\"\r\n name=\"duration_seconds\"\r\n type=\"number\"\r\n min={0}\r\n enableRedAsterick\r\n />\r\n </div>\r\n </section>\r\n )}\r\n\r\n {step === 4 && (\r\n <section className=\"animate-in fade-in slide-in-from-bottom-4 duration-500 space-y-6 lg:space-y-10\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 md:gap-6 lg:gap-8\">\r\n <FormikInput\r\n label=\"Lighting\"\r\n name=\"lighting\"\r\n type=\"text\"\r\n placeholder=\"e.g. High-key\"\r\n />\r\n <FormikInput\r\n label=\"Sound\"\r\n name=\"sound\"\r\n type=\"text\"\r\n placeholder=\"e.g. Dialogue\"\r\n />\r\n <FormikSelect\r\n label=\"VFX\"\r\n name=\"vfx\"\r\n selectedOption=\"Select VFX\"\r\n optionData={vfx_types}\r\n value={values.vfx}\r\n onChange={(e) =>\r\n setFieldValue(\"vfx\", e.target.value)\r\n }\r\n />\r\n </div>\r\n <div className=\"space-y-6 lg:space-y-10\">\r\n <FormikTextarea\r\n label=\"Action / Blocking\"\r\n name=\"action_blocking\"\r\n placeholder=\"Key character movements and staging...\"\r\n />\r\n <FormikTextarea\r\n label=\"Emotional Purpose\"\r\n name=\"emotional_purpose\"\r\n placeholder=\"What is the intended emotional impact on the audience?\"\r\n />\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-6 lg:gap-8\">\r\n <FormikTextarea\r\n label=\"Edit Purpose\"\r\n name=\"edit_purpose\"\r\n placeholder=\"How does this shot fit into the edit?\"\r\n />\r\n <FormikTextarea\r\n label=\"Reason\"\r\n name=\"reason\"\r\n placeholder=\"Why is this shot necessary for the story?\"\r\n />\r\n </div>\r\n </div>\r\n </section>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"sticky bottom-0 border-t border-slate-200 px-6 lg:px-12 py-4 lg:py-5 flex justify-between items-center z-10 rounded-b-xl lg:rounded-2xl\">\r\n <div>\r\n {step > 1 && (\r\n <button\r\n type=\"button\"\r\n onClick={handleBack}\r\n className=\"flex items-center gap-2 px-3 py-2 text-sm font-medium text-slate-500 hover:text-slate-900 transition-colors rounded-md hover:bg-slate-50\"\r\n >\r\n <span>←</span> Back\r\n </button>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={handleCloseModal}\r\n className=\"px-4 py-2 text-sm font-medium text-slate-500 hover:text-slate-900 rounded-md hover:bg-slate-50 transition-colors\"\r\n >\r\n Cancel\r\n </button>\r\n {step !== 4 ? (\r\n <button\r\n type=\"button\"\r\n onClick={handleNext}\r\n className={`bg-blumine-600 rounded-full inline-flex items-center justify-center gap-1.5 px-4 py-2 text-sm md:text-lg font-medium text-white shadow-md transition-all duration-300 ease-in-out hover:bg-opacity-70 hover:shadow-lg hover:shadow-blumine-600/50 focus:outline-hidden focus:ring-2 focus:ring-blumine-600 focus:ring-opacity-50 disabled:opacity-60 disabled:cursor-not-allowed disabled:hover:scale-100 disabled:hover:bg-blumine-600 disabled:hover:shadow-md cursor-pointer!`}\r\n >\r\n Next Step\r\n </button>\r\n ) : (\r\n <button\r\n type=\"button\"\r\n onClick={handleNext}\r\n disabled={isSubmitting}\r\n className={`bg-blumine-600 rounded-full inline-flex items-center justify-center gap-1.5 px-4 py-2 text-sm md:text-lg font-medium text-white shadow-md transition-all duration-300 ease-in-out hover:bg-opacity-70 hover:shadow-lg hover:shadow-blumine-600/50 focus:outline-hidden focus:ring-2 focus:ring-blumine-600 focus:ring-opacity-50 disabled:opacity-60 disabled:cursor-not-allowed disabled:hover:scale-100 disabled:hover:bg-blumine-600 disabled:hover:shadow-md cursor-pointer!`}\r\n >\r\n {isSubmitting ? (\r\n <>\r\n <div className=\"w-3.5 h-3.5 border-2 border-white/30 border-t-white rounded-full animate-spin\" />\r\n Processing...\r\n </>\r\n ) : userShotValue ? (\r\n \"Save Changes\"\r\n ) : (\r\n \"Create Shot\"\r\n )}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </Form>\r\n );\r\n }}\r\n </Formik>\r\n );\r\n};\r\n\r\nexport default AddShotForm;\r\n","\"use client\";\nimport { Form, Formik } from \"formik\";\nimport * as Yup from \"yup\";\n\nimport { FormikInput, FormikSelect } from \"../input/inputs\";\nimport { scene_types } from \"@/data/shot-data\";\nimport { Info } from \"lucide-react\";\n\nconst ProductionSetupModal = ({\n initializeProduction,\n initialValues,\n}: {\n initializeProduction: (count: number, type: string) => Promise<any> | any;\n initialValues?: { numCameras: number; scene_type: string };\n}) => {\n return (\n <div className=\"min-h-[80vh] flex items-center justify-center px-6\">\n <div className=\"w-full max-w-lg\">\n <div className=\"mb-8 text-center\">\n <h1 className=\"text-2xl md:text-3xl font-semibold text-slate-900 tracking-tight\">\n Production Setup for this Scene\n </h1>\n <p className=\"text-sm text-slate-500 mt-2\">\n Configure your scene and camera setup to get started\n </p>\n </div>\n\n <div className=\"p-6 md:p-8\">\n <Formik\n initialValues={initialValues || { numCameras: 1, scene_type: \"\" }}\n validationSchema={Yup.object({\n numCameras: Yup.number()\n .min(1, \"Must be at least 1\")\n .max(20, \"Cannot add more than 20 cameras\")\n .required(\"Number of cameras is required\"),\n scene_type: Yup.string().required(\"Scene type is required\"),\n })}\n onSubmit={async (values) => {\n await initializeProduction(values.numCameras, values.scene_type);\n }}\n >\n {({ isSubmitting, setFieldValue }) => (\n <Form className=\"flex flex-col gap-6\">\n <div className=\"grid gap-5\">\n <FormikSelect\n label=\"Scene Type\"\n name=\"scene_type\"\n selectedOption=\"Select scene type\"\n optionData={scene_types}\n enableRedAsterick\n onChange={(e) =>\n setFieldValue(\"scene_type\", e.target.value)\n }\n />\n\n <FormikInput\n label=\"Number of Cameras\"\n name=\"numCameras\"\n type=\"number\"\n min={1}\n max={20}\n enableRedAsterick\n />\n </div>\n\n <div className=\"flex gap-3 bg-slate-50 border border-slate-100 p-4 rounded-xl\">\n <Info className=\"w-5 h-5 text-slate-400 shrink-0 mt-0.5\" />\n <p className=\"text-[13px] text-slate-600 leading-relaxed\">\n <span className=\"font-semibold text-slate-900\">\n Important:\n </span>{\" \"}\n These settings are permanent. Once the production is\n initialized for this scene, you won't be able to change the\n scene type or camera count.\n </p>\n </div>\n\n <div className=\"pt-2\">\n <button\n type=\"submit\"\n disabled={isSubmitting}\n className=\"w-full h-11 rounded-3xl bg-blumine-600 text-white text-sm md:text-base font-medium shadow-sm transition-all duration-300 hover:bg-blumine-700 hover:shadow-md focus:outline-none focus:ring-2 focus:ring-blumine-600/40 disabled:opacity-60 disabled:cursor-not-allowed\"\n >\n {isSubmitting ? \"Initializing...\" : \"Complete Setup\"}\n </button>\n </div>\n </Form>\n )}\n </Formik>\n </div>\n </div>\n </div>\n );\n};\n\nexport default ProductionSetupModal;\n","import { Shot } from \"@/app/types/shot-breakdown.types\";\nimport {\n Camera,\n Clock,\n Target,\n Activity,\n Settings2,\n Frame,\n Video,\n AlignLeft,\n Aperture,\n SlidersHorizontal,\n Crosshair,\n Sun,\n Volume2,\n Wand2,\n MonitorPlay,\n} from \"lucide-react\";\nimport React from \"react\";\n\nexport default function ViewShotModal({ shot }: { shot: Shot }) {\n const PropertyRow = ({ icon: Icon, label, value }: any) => (\n <div className=\"flex items-start gap-3 py-1.5 group\">\n <div className=\"flex items-center gap-2.5 w-32 shrink-0 text-slate-500 mt-0.5\">\n <Icon\n className=\"w-4 h-4 text-slate-400 group-hover:text-slate-600 transition-colors\"\n strokeWidth={2}\n />\n <span className=\"text-[13px] font-medium\">{label}</span>\n </div>\n <div className=\"text-[13px] font-medium text-slate-900 flex-1 break-words whitespace-pre-wrap leading-relaxed\">\n {value || (\n <span className=\"text-slate-400 italic font-normal\">Unspecified</span>\n )}\n </div>\n </div>\n );\n\n const DescriptionBlock = ({ icon: Icon, label, value }: any) => (\n <div className=\"flex flex-col sm:flex-row gap-4 md:gap-6 mb-12 sm:mb-10 w-full\">\n <div className=\"shrink-0 mt-1 hidden sm:block\">\n <div className=\"flex items-center justify-center w-8 h-8 rounded-full bg-slate-50 border border-slate-100\">\n <Icon className=\"w-4 h-4 text-[#15607b]/70\" />\n </div>\n </div>\n <div className=\"flex flex-col gap-2.5 flex-1 w-full max-w-2xl\">\n <div className=\"flex items-center gap-2 sm:hidden mb-1\">\n <Icon className=\"w-4 h-4 text-[#15607b]/70\" />\n <h3 className=\"text-[13px] font-bold uppercase tracking-wider text-[#15607b]\">\n {label}\n </h3>\n </div>\n <h3 className=\"hidden sm:block text-[14px] font-semibold text-slate-900\">\n {label}\n </h3>\n <div className=\"text-[15px] leading-[1.8] text-slate-600 font-normal whitespace-pre-wrap\">\n {value || (\n <span className=\"text-slate-400 italic\">\n No description provided.\n </span>\n )}\n </div>\n </div>\n </div>\n );\n\n return (\n <div className=\"flex flex-col lg:flex-row bg-white max-h-[85vh] rounded-b-[2.5rem] overflow-y-auto w-full custom-scrollbar relative items-start\">\n {/* Main Content Area (Left) */}\n <div className=\"flex-1 p-6 sm:p-8 md:p-12 w-full min-h-0\">\n <div className=\"max-w-3xl mx-auto lg:mx-0\">\n <div className=\"mb-12 flex flex-col gap-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <span className=\"inline-flex items-center justify-center bg-slate-50 text-slate-400 font-mono text-[12px] font-semibold px-2 py-1 rounded-[2.5rem] border border-slate-200/60 shadow-sm\">\n SH-{shot.shot_number.toString().padStart(3, \"0\")}\n </span>\n {shot.shot_type && (\n <div className=\"flex items-center gap-1.5 bg-blumine-50 border border-blumine-400 px-3 py-1 rounded-[2.5rem] text-blumine-500 shadow-sm\">\n <span className=\"text-[13px] font-bold uppercase tracking-widest opacity-90\">\n Shot Type:\n </span>\n <span className=\"text-[13px] font-bold tracking-wide\">\n {shot.shot_type}\n </span>\n </div>\n )}\n </div>\n\n <div className=\"flex flex-col mt-2\">\n <span className=\"text-[11px] font-bold uppercase tracking-widest text-blumine-700 mb-2\">\n Subject\n </span>\n <h1 className=\"text-2xl md:text-3xl font-semibold text-slate-900 tracking-tight break-words\">\n {shot.subject || \"No Subject Defined\"}\n </h1>\n </div>\n </div>\n\n <div className=\"mt-10\">\n <DescriptionBlock\n icon={AlignLeft}\n label=\"Action & Blocking\"\n value={shot.action_blocking}\n />\n <DescriptionBlock\n icon={Target}\n label=\"Reasoning & Importance\"\n value={shot.reason}\n />\n <DescriptionBlock\n icon={Activity}\n label=\"Emotional Intent\"\n value={shot.emotional_purpose}\n />\n <DescriptionBlock\n icon={MonitorPlay}\n label=\"Editorial Role\"\n value={shot.edit_purpose}\n />\n </div>\n </div>\n </div>\n\n {/* Properties Sidebar (Right) */}\n <div className=\"w-full lg:w-[340px] xl:w-[380px] shrink-0 bg-[#fdfdfd] border-t lg:border-t-0 lg:border-l border-slate-200/60 p-6 sm:p-8 pb-12 lg:pb-8 h-full\">\n <div className=\"flex flex-col gap-2 mb-8\">\n <h4 className=\"text-[11px] font-bold uppercase tracking-widest text-blumine-700 mb-4 ml-1\">\n Core Identity\n </h4>\n\n <PropertyRow icon={Video} label=\"Shot Type\" value={shot.shot_type} />\n <PropertyRow\n icon={Target}\n label=\"Priority\"\n value={\n <span\n className={`inline-flex items-center rounded-[2.5rem] px-2 py-0.5 text-[11px] font-bold tracking-wide ${\n shot.priority === \"Essential\"\n ? \"bg-green-50 text-green-700 border border-green-200/60\"\n : \"bg-orange-100 text-orange-600 border border-orange-200/60\"\n }`}\n >\n {shot.priority}\n </span>\n }\n />\n <PropertyRow icon={Crosshair} label=\"Subject\" value={shot.subject} />\n <PropertyRow\n icon={Clock}\n label=\"Duration\"\n value={shot.duration_seconds ? `${shot.duration_seconds}` : null}\n />\n </div>\n\n <div className=\"w-full h-px bg-slate-100 mb-8 mt-4\"></div>\n\n <div className=\"flex flex-col sm:flex-row lg:flex-col gap-10 lg:gap-8 w-full\">\n <div className=\"flex-1\">\n <h4 className=\"text-[11px] font-bold uppercase tracking-widest text-[#15607b] mb-5 ml-1\">\n Optics & Gear\n </h4>\n <div className=\"flex flex-col gap-2\">\n <PropertyRow\n icon={Camera}\n label=\"Camera\"\n value={shot.camera_name}\n />\n <PropertyRow\n icon={Aperture}\n label=\"Lens MM\"\n value={shot.lens_mm}\n />\n <PropertyRow\n icon={SlidersHorizontal}\n label=\"Aperture\"\n value={shot.aperture}\n />\n <PropertyRow\n icon={Frame}\n label=\"Support\"\n value={shot.camera_support}\n />\n <PropertyRow\n icon={Clock}\n label=\"Frame Rate\"\n value={shot.fps ? `${shot.fps} fps` : null}\n />\n <PropertyRow\n icon={Frame}\n label=\"Angle\"\n value={shot.camera_angle}\n />\n <PropertyRow\n icon={Frame}\n label=\"Movement\"\n value={shot.camera_movement}\n />\n </div>\n </div>\n\n <div className=\"flex-1\">\n <h4 className=\"text-[11px] font-bold uppercase tracking-widest text-[#15607b] mb-5 ml-1\">\n Visual Profile\n </h4>\n <div className=\"flex flex-col gap-2\">\n <PropertyRow icon={Frame} label=\"Framing\" value={shot.framing} />\n <PropertyRow\n icon={Aperture}\n label=\"Depth Field\"\n value={shot.depth_of_field}\n />\n <PropertyRow icon={Sun} label=\"Lighting\" value={shot.lighting} />\n <PropertyRow icon={Wand2} label=\"VFX\" value={shot.vfx} />\n <PropertyRow icon={Volume2} label=\"Sound\" value={shot.sound} />\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\r\nimport React, { useEffect, useRef, useState } from \"react\";\r\nimport { Block, blockStyles } from \"../types/screenplay-editor.types\";\r\nimport { Loader2, Video, Eye, Pencil, Settings2 } from \"lucide-react\";\r\nimport { Camera, Shot, ShotPart } from \"../types/shot-breakdown.types\";\r\nimport ModalLayout from \"../components/modal/modal-layout\";\r\nimport AddShotForm from \"../components/modal/add-shot-modal\";\r\nimport ProductionSetupModal from \"../components/modal/production-setup-modal\";\r\nimport ViewShotModal from \"../components/modal/view-shot-modal\";\r\nimport SummarizeButton from \"../components/summarize-button\";\r\n\r\nexport function ShotBreakdownView({\r\n blocks,\r\n isLoading,\r\n shots,\r\n selectionMenu,\r\n handleMouseUp,\r\n addShot,\r\n updateShot,\r\n clearSelection,\r\n menuRef,\r\n cameras,\r\n sceneType,\r\n initializeProduction,\r\n handleAISummarize,\r\n isSummarizing,\r\n aiSummarized = false,\r\n}: {\r\n blocks: Block[];\r\n isLoading: boolean;\r\n shots: Shot[];\r\n sceneType: string;\r\n selectionMenu: {\r\n top: number;\r\n left: number;\r\n parts: ShotPart[];\r\n } | null;\r\n handleMouseUp: () => void;\r\n addShot: (shotDetails: Omit<Shot, \"id\" | \"shot_number\" | \"parts\">) => any;\r\n updateShot: (\r\n shotId: string | number,\r\n updatedDetails: Omit<Shot, \"id\" | \"shot_number\" | \"parts\">,\r\n ) => any;\r\n clearSelection: () => void;\r\n menuRef: React.RefObject<HTMLDivElement | null>;\r\n cameras: Camera[];\r\n initializeProduction: (count: number, type: string) => any;\r\n handleAISummarize: () => void;\r\n isSummarizing: boolean;\r\n aiSummarized?: boolean;\r\n}) {\r\n const COURIER_STACK = \"'Courier Prime', 'Courier', monospace\";\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n const [isSidebarOpen, setIsSidebarOpen] = useState(false);\r\n const [toggledShotId, setToggledShotId] = useState<number | string | null>(\r\n null,\r\n );\r\n const [viewingShotId, setViewingShotId] = useState<number | string | null>(\r\n null,\r\n );\r\n const [updatingShotId, setUpdatingShotId] = useState<number | string | null>(\r\n null,\r\n );\r\n const [isInitModalOpen, setIsInitModalOpen] = useState(false);\r\n\r\n const handleCloseModal = () => {\r\n clearSelection();\r\n };\r\n\r\n const renderBlockText = (block: Block) => {\r\n if (!toggledShotId) return block.text;\r\n\r\n const toggledShot = shots.find((s) => s.id === toggledShotId);\r\n if (!toggledShot) return block.text;\r\n\r\n const blockShotParts = toggledShot.parts\r\n .filter((p) => p.block_id === block.id)\r\n .sort((a, b) => a.start_index - b.start_index);\r\n\r\n if (blockShotParts.length === 0) return block.text;\r\n\r\n const nodes = [];\r\n let currentIndex = 0;\r\n\r\n blockShotParts.forEach((part, index) => {\r\n const actualStart = Math.max(part.start_index, currentIndex);\r\n\r\n if (actualStart > currentIndex) {\r\n nodes.push(\r\n <span key={`text-${currentIndex}`}>\r\n {block.text.slice(currentIndex, actualStart)}\r\n </span>,\r\n );\r\n }\r\n\r\n if (actualStart < part.end_index) {\r\n nodes.push(\r\n <span\r\n key={`shot-${toggledShot.id}-${index}`}\r\n style={{\r\n // Balanced marker gradient using blumine-200 and blumine-300 tones\r\n backgroundImage:\r\n \"linear-gradient(104deg, transparent 0.5%, rgba(176, 227, 241, 0.7) 2%, rgba(122, 206, 230, 0.8) 5%, rgba(176, 227, 241, 0.7) 95%, transparent 99%)\",\r\n // Tidy but still slightly organic marker edges\r\n borderRadius: \"6px 2px 5px 3px / 2px 6px 3px 5px\",\r\n // Clone decoration across line breaks for multi-line seamlessness\r\n boxDecorationBreak: \"clone\",\r\n WebkitBoxDecorationBreak: \"clone\",\r\n // Tighter bleed so it looks \"proper\" and less messy\r\n padding: \"0.15em 0.25em\",\r\n margin: \"0 -0.15em\",\r\n }}\r\n >\r\n {block.text.slice(actualStart, part.end_index)}\r\n </span>,\r\n );\r\n }\r\n currentIndex = Math.max(currentIndex, part.end_index);\r\n });\r\n\r\n if (currentIndex < block.text.length) {\r\n nodes.push(\r\n <span key={`text-${currentIndex}`}>\r\n {block.text.slice(currentIndex)}\r\n </span>,\r\n );\r\n }\r\n\r\n return nodes;\r\n };\r\n\r\n useEffect(() => {\r\n const fontId = \"google-font-courier-prime\";\r\n const styleId = \"screenplay-editor-force-v4\";\r\n\r\n // 1. Inject Google Font\r\n if (!document.getElementById(fontId)) {\r\n const link = document.createElement(\"link\");\r\n link.id = fontId;\r\n link.rel = \"stylesheet\";\r\n link.href =\r\n \"https://fonts.googleapis.com/css2?family=Courier+Prime:ital,wght@0,400;0,700;1,400;1,700&display=swap\";\r\n document.head.appendChild(link);\r\n }\r\n\r\n // 2. Inject high-specificity CSS (Safe textContent approach)\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement(\"style\");\r\n style.id = styleId;\r\n style.textContent = `\r\n /* We target by the data-attribute to ensure the highest specificity possible */\r\n [data-screenplay-editor] *, \r\n [data-screenplay-editor] div, \r\n [data-screenplay-editor] span, \r\n [data-screenplay-editor] [contenteditable=\"true\"] {\r\n font-family: ${COURIER_STACK} !important;\r\n -webkit-font-smoothing: antialiased;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }\r\n }, [COURIER_STACK]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-32 gap-4\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-zinc-400\" />\r\n <p className=\"text-sm font-medium text-zinc-500 animate-pulse\">\r\n Loading scene details...\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className=\"relative p-8 md:p-12 mx-auto w-full min-h-screen flex flex-col gap-8 xl:pr-[20rem]\"\r\n ref={containerRef}\r\n >\r\n <div className=\"flex items-center justify-center max-w-6xl xl:max-w-full\">\r\n <div className=\"flex flex-col gap-4 min-h-screen\">\r\n <div\r\n className=\"relative bg-[#fdfdfc] shadow-md shadow-zinc-300/60 border border-zinc-100 rounded-sm md:rounded-md pl-[1.5in] py-[1in] pr-[1in] flex flex-col w-[210mm] min-h-auto shrink-0\"\r\n style={{\r\n fontFamily: COURIER_STACK,\r\n paddingLeft: \"1.5in\",\r\n paddingRight: \"1in\",\r\n paddingTop: \"1in\",\r\n paddingBottom: \"1in\",\r\n lineHeight: \"1.2\",\r\n }}\r\n data-screenplay-editor=\"true\"\r\n onMouseUp={handleMouseUp}\r\n >\r\n {blocks.map((block) => (\r\n <div\r\n key={block.id}\r\n data-block-id={block.id}\r\n className={`relative break-words w-full px-4 py-2 ${blockStyles[block.type].className}`}\r\n style={{\r\n ...blockStyles[block.type].inputStyle,\r\n minHeight: \"2.5rem\",\r\n }}\r\n >\r\n {renderBlockText(block)}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <button\r\n onClick={() => setIsSidebarOpen(true)}\r\n className=\"fixed bottom-6 right-6 z-40 flex h-14 w-14 items-center justify-center rounded-full bg-[#15607b] text-white shadow-[0_8px_30px_rgba(21,96,123,0.3)] transition-transform hover:scale-105 active:scale-95 xl:hidden\"\r\n >\r\n <Video className=\"h-6 w-6\" />\r\n {shots.length > 0 && (\r\n <span className=\"absolute -top-1 -right-1 flex h-5 w-5 items-center justify-center rounded-full bg-rose-500 text-[10px] font-bold text-white shadow-sm border-2 border-white\">\r\n {shots.length}\r\n </span>\r\n )}\r\n </button>\r\n\r\n {isSidebarOpen && (\r\n <div\r\n className=\"fixed inset-0 z-40 bg-slate-900/20 backdrop-blur-sm transition-opacity xl:hidden\"\r\n onClick={() => setIsSidebarOpen(false)}\r\n />\r\n )}\r\n <div\r\n className={`fixed xl:absolute top-0 right-0 z-50 h-full w-72 transform transition-transform duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] xl:translate-x-0 ${\r\n isSidebarOpen\r\n ? \"translate-x-0 shadow-[0_0_40px_rgba(0,0,0,0.1)]\"\r\n : \"translate-x-full\"\r\n }`}\r\n >\r\n <div className=\"sticky top-0 flex h-[100dvh] max-h-screen w-full flex-col border-l border-l-[#eefafd] bg-white p-3 py-5\">\r\n {!aiSummarized && (\r\n <SummarizeButton\r\n onSummarize={handleAISummarize}\r\n isSummarizing={isSummarizing}\r\n />\r\n )}\r\n <div className=\"relative flex flex-col gap-3 py-5 my-5 border-t border-t-[#eefafd] flex-1 overflow-hidden\">\r\n <div className=\"relative flex items-center justify-between mb-6 shrink-0 px-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"relative flex h-8 w-8 items-center justify-center rounded-[10px] border border-[#15607b]/20 bg-white shadow-sm\">\r\n <Video className=\"h-4 w-4 text-[#15607b]\" />\r\n </div>\r\n <div className=\"flex flex-col\">\r\n <h3 className=\"text-[12px] font-semibold uppercase tracking-[0.28em] text-[#134a61]\">\r\n Shots\r\n </h3>\r\n {sceneType && (\r\n <span className=\"text-[9px] font-bold text-[#15607b] uppercase tracking-tighter opacity-80 mt-0.5\">\r\n {sceneType}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {cameras.length === 0 && (\r\n <button\r\n onClick={() => setIsInitModalOpen(true)}\r\n className=\"flex h-7 w-7 items-center justify-center rounded-md border border-slate-200 bg-white shadow-sm transition-colors hover:bg-slate-50\"\r\n title=\"Project Setup\"\r\n >\r\n <Settings2 className=\"h-3.5 w-3.5 text-slate-600\" />\r\n </button>\r\n )}\r\n\r\n {shots.length > 0 && (\r\n <span className=\"rounded-md border border-slate-200 bg-white px-2 py-0.5 text-[10px] font-semibold text-slate-600 shadow-sm\">\r\n {shots.length}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {shots.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center py-10 px-4 text-center\">\r\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-slate-50 border border-slate-100 mb-3\">\r\n <Video className=\"h-4 w-4 text-slate-300\" />\r\n </div>\r\n <p className=\"text-xs font-semibold text-slate-700\">\r\n No shots created\r\n </p>\r\n <p className=\"text-[11px] text-slate-500 mt-1 max-w-[160px] leading-relaxed\">\r\n Highlight text in the screenplay to add your first shot.\r\n </p>\r\n </div>\r\n ) : (\r\n <div className=\"flex h-full max-h-[calc(100vh-200px)] flex-col gap-2.5 overflow-y-auto overflow-x-hidden pb-4 pr-2 custom-scrollbar\">\r\n {shots.map((shot) => {\r\n const isActive = toggledShotId === shot.id;\r\n return (\r\n <div\r\n key={shot.id}\r\n onClick={() =>\r\n setToggledShotId(isActive ? null : (shot.id ?? null))\r\n }\r\n className={`group relative flex-shrink-0 cursor-pointer rounded-xl border transition-all duration-300 overflow-hidden ${\r\n isActive\r\n ? \"border-slate-900 bg-slate-50 shadow-[0_6px_20px_rgba(0,0,0,0.06)]\"\r\n : \"border-slate-200 bg-white hover:border-slate-300 hover:shadow-[0_4px_14px_rgba(0,0,0,0.05)]\"\r\n }`}\r\n >\r\n <div\r\n className={`absolute left-0 top-0 h-full w-[3px] transition-all duration-300\r\n ${isActive ? \"bg-slate-900\" : \"bg-transparent group-hover:bg-slate-300\"}`}\r\n />\r\n\r\n <div className=\"flex flex-col gap-2 px-4 py-3.5\">\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex flex-col\">\r\n <span\r\n className={`text-[11px] font-semibold tracking-wide uppercase\r\n ${isActive ? \"text-slate-900\" : \"text-slate-500\"}`}\r\n >\r\n Shot {shot.shot_number}\r\n </span>\r\n\r\n <span className=\"text-sm font-semibold text-slate-800 leading-tight\">\r\n {shot.camera_name || \"Unknown Camera\"}\r\n </span>\r\n </div>\r\n\r\n <span\r\n className={`rounded-md px-2 py-0.5 text-[8px] font-bold uppercase tracking-wider ${\r\n isActive\r\n ? \"bg-slate-900 text-white\"\r\n : \"bg-slate-100 text-slate-500 group-hover:bg-slate-200\"\r\n }`}\r\n >\r\n {shot.shot_type}\r\n </span>\r\n </div>\r\n\r\n <div className=\"flex items-center justify-between text-[11px] text-slate-500\">\r\n <span>\r\n {shot.lens_mm ? `${shot.lens_mm}mm Lens` : \"—\"}\r\n </span>\r\n <span className=\"opacity-60\">Tap to expand</span>\r\n </div>\r\n\r\n <div\r\n className={`grid transition-all duration-300 ease-in-out ${\r\n isActive\r\n ? \"grid-rows-[1fr] opacity-100 mt-2\"\r\n : \"grid-rows-[0fr] opacity-0\"\r\n }`}\r\n >\r\n <div className=\"overflow-hidden\">\r\n <div className=\"py-3 pb-1 border-t border-slate-200/70 flex gap-2\">\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setViewingShotId(shot.id ?? null);\r\n }}\r\n className=\"flex flex-1 items-center justify-center gap-1.5 rounded-md border border-slate-200 bg-white py-2 text-[11px] font-semibold text-slate-700 transition-all hover:bg-slate-50 hover:text-slate-900\"\r\n >\r\n <Eye className=\"h-3.5 w-3.5\" />\r\n View\r\n </button>\r\n\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setUpdatingShotId(shot.id ?? null);\r\n }}\r\n className=\"flex flex-1 items-center justify-center gap-1.5 rounded-md bg-slate-900 py-2 text-[11px] font-semibold text-white transition-all hover:bg-slate-800\"\r\n >\r\n <Pencil className=\"h-3.5 w-3.5\" />\r\n Edit\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n {selectionMenu && (\r\n <ModalLayout\r\n onClose={handleCloseModal}\r\n title={cameras.length === 0 ? \"Production Setup\" : \"Add New Shot\"}\r\n menuRef={menuRef}\r\n maxWidth={cameras.length === 0 ? \"max-w-lg\" : \"max-w-7xl\"}\r\n >\r\n {cameras.length === 0 ? (\r\n <ProductionSetupModal initializeProduction={initializeProduction} />\r\n ) : (\r\n <AddShotForm\r\n onSubmit={(values) => {\r\n addShot(values);\r\n // handleCloseModal();\r\n }}\r\n cameras={cameras}\r\n shots={shots}\r\n handleCloseModal={handleCloseModal}\r\n parts={selectionMenu.parts}\r\n />\r\n )}\r\n </ModalLayout>\r\n )}\r\n\r\n {isInitModalOpen && (\r\n <ModalLayout\r\n onClose={() => setIsInitModalOpen(false)}\r\n title=\"Production Setup\"\r\n maxWidth=\"max-w-lg\"\r\n >\r\n <ProductionSetupModal\r\n initializeProduction={(count, type) => {\r\n initializeProduction(count, type).then(() => {\r\n setIsInitModalOpen(false);\r\n });\r\n }}\r\n initialValues={{\r\n numCameras: cameras.length || 1,\r\n scene_type: sceneType,\r\n }}\r\n />\r\n </ModalLayout>\r\n )}\r\n\r\n {viewingShotId && (\r\n <ModalLayout\r\n onClose={() => setViewingShotId(null)}\r\n title={`Shot ${shots.find((s) => s.id === viewingShotId)?.shot_number || \"\"} Details`}\r\n maxWidth=\"max-w-5xl\"\r\n >\r\n {shots.find((s) => s.id === viewingShotId) && (\r\n <ViewShotModal shot={shots.find((s) => s.id === viewingShotId)!} />\r\n )}\r\n </ModalLayout>\r\n )}\r\n\r\n {updatingShotId && (\r\n <ModalLayout\r\n onClose={() => setUpdatingShotId(null)}\r\n title={`Update Shot SH-${\r\n shots\r\n .find((s) => s.id === updatingShotId)\r\n ?.shot_number?.toString()\r\n .padStart(3, \"0\") || \"\"\r\n }`}\r\n maxWidth=\"max-w-7xl\"\r\n >\r\n {shots.find((s) => s.id === updatingShotId) && (\r\n <AddShotForm\r\n parts={shots.find((s) => s.id === updatingShotId)!.parts}\r\n cameras={cameras}\r\n shots={shots}\r\n handleCloseModal={() => setUpdatingShotId(null)}\r\n userShotValue={shots.find((s) => s.id === updatingShotId)}\r\n onSubmit={(values) => {\r\n updateShot(updatingShotId, values).then(() => {\r\n setUpdatingShotId(null);\r\n });\r\n }}\r\n />\r\n )}\r\n </ModalLayout>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { useEffect, useMemo, useState, useRef } from \"react\";\r\nimport { Block, BlockType, uuid } from \"../types/screenplay-editor.types\";\r\nimport { Camera, Shot, ShotPart } from \"../types/shot-breakdown.types\";\r\n\r\nexport interface UseShotBreakdownOptions {\r\n scene_url: string;\r\n fetchOptions?: RequestInit;\r\n onAISummarize?: (scene: any) => void;\r\n onShotAdded?: (shot: Shot) => any;\r\n onShotsBulkAdded?: (shots: Shot[], scene_type: string) => Promise<void>;\r\n onShotRemoved?: (shotId: string) => any;\r\n onShotUpdated?: (shotId: string, detail: Shot) => any;\r\n onProductionInitialized?: (cameras: Camera[], type: string) => any;\r\n preloadedShots?: Shot[];\r\n preloadedCameras?: Camera[];\r\n preloadedSceneType?: string;\r\n}\r\n\r\nexport function useShotBreakdownScene(options: UseShotBreakdownOptions) {\r\n const [shots, setShots] = useState<Shot[]>(options.preloadedShots || []);\r\n const [cameras, setCameras] = useState<Camera[]>(\r\n options.preloadedCameras || [],\r\n );\r\n const [sceneType, setSceneType] = useState<string>(\r\n options.preloadedSceneType || \"\",\r\n );\r\n const [scene, setScene] = useState<any>(null);\r\n const [isLoading, setIsLoading] = useState<boolean>(true);\r\n const [isSummarizing, setIsSummarizing] = useState<boolean>(false);\r\n const [error, setError] = useState<boolean>(false);\r\n const [selectionMenu, setSelectionMenu] = useState<{\r\n top: number;\r\n left: number;\r\n parts: ShotPart[];\r\n } | null>(null);\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (options.preloadedShots && options.preloadedShots.length > 0) {\r\n setShots((prev) => {\r\n if (JSON.stringify(prev) === JSON.stringify(options.preloadedShots)) {\r\n return prev;\r\n }\r\n return options.preloadedShots || [];\r\n });\r\n }\r\n }, [options.preloadedShots]);\r\n\r\n useEffect(() => {\r\n if (options.preloadedCameras && options.preloadedCameras.length > 0) {\r\n setCameras((prev) => {\r\n if (JSON.stringify(prev) === JSON.stringify(options.preloadedCameras)) {\r\n return prev;\r\n }\r\n return options.preloadedCameras || [];\r\n });\r\n }\r\n }, [options.preloadedCameras]);\r\n\r\n useEffect(() => {\r\n if (options.preloadedSceneType) {\r\n setSceneType((prev) => {\r\n if (prev === options.preloadedSceneType) return prev;\r\n return options.preloadedSceneType || \"\";\r\n });\r\n }\r\n }, [options.preloadedSceneType]);\r\n\r\n useEffect(() => {\r\n setIsLoading(true);\r\n const fetchScene = async () => {\r\n try {\r\n const response = await fetch(options.scene_url, options.fetchOptions);\r\n if (response.ok) {\r\n const text = await response.text();\r\n setScene({ content: text });\r\n } else {\r\n console.error(\"Failed to fetch scene:\", response);\r\n setError(true);\r\n }\r\n setIsLoading(false);\r\n } catch (error) {\r\n setError(true);\r\n setIsLoading(false);\r\n console.error(\"Error fetching scene:\", error);\r\n }\r\n };\r\n fetchScene();\r\n }, []);\r\n\r\n const blocks = useMemo(() => {\r\n if (!scene || !scene.content) return [];\r\n\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(scene.content, \"text/html\");\r\n const divs = Array.from(doc.querySelectorAll(\"div\"));\r\n const parsedBlocks: Block[] = [];\r\n\r\n const typeMap: Record<string, BlockType> = {\r\n divtype0: \"SCENE_HEADING\",\r\n divtype2: \"ACTION\",\r\n divtype3: \"CHARACTER\",\r\n divtype4: \"PARENTHETICAL\",\r\n divtype5: \"DIALOGUE\",\r\n divtype6: \"TRANSITION\",\r\n };\r\n\r\n divs.forEach((div) => {\r\n const divText = div.textContent?.trim() || \"\";\r\n if (!divText) return;\r\n\r\n let type: BlockType = \"ACTION\";\r\n for (const className of Array.from(div.classList)) {\r\n if (typeMap[className]) {\r\n type = typeMap[className];\r\n break;\r\n }\r\n }\r\n\r\n const idAttr = div.getAttribute(\"id\");\r\n const blockId =\r\n idAttr && idAttr.startsWith(\"par\")\r\n ? idAttr.substring(3)\r\n : idAttr || uuid();\r\n\r\n parsedBlocks.push({ id: blockId, type, text: divText });\r\n });\r\n\r\n return parsedBlocks;\r\n }, [scene]);\r\n\r\n const clearSelection = () => {\r\n setSelectionMenu(null);\r\n window.getSelection()?.removeAllRanges();\r\n };\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\r\n clearSelection();\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, []);\r\n\r\n const getAbsoluteOffset = (\r\n blockEl: Element,\r\n targetNode: Node,\r\n targetOffset: number,\r\n ) => {\r\n let currentOffset = 0;\r\n const walker = document.createTreeWalker(\r\n blockEl,\r\n NodeFilter.SHOW_TEXT,\r\n null,\r\n );\r\n let currentNode = walker.nextNode();\r\n while (currentNode) {\r\n if (currentNode === targetNode) {\r\n return currentOffset + targetOffset;\r\n }\r\n currentOffset += currentNode.nodeValue?.length || 0;\r\n currentNode = walker.nextNode();\r\n }\r\n return targetOffset;\r\n };\r\n\r\n const handleMouseUp = () => {\r\n const selection = window.getSelection();\r\n if (!selection || selection.isCollapsed) return;\r\n\r\n const range = selection.getRangeAt(0);\r\n const startNode = range.startContainer;\r\n const endNode = range.endContainer;\r\n\r\n const startBlockEl =\r\n startNode.nodeType === Node.TEXT_NODE\r\n ? startNode.parentElement?.closest(\"[data-block-id]\")\r\n : (startNode as Element).closest(\"[data-block-id]\");\r\n const endBlockEl =\r\n endNode.nodeType === Node.TEXT_NODE\r\n ? endNode.parentElement?.closest(\"[data-block-id]\")\r\n : (endNode as Element).closest(\"[data-block-id]\");\r\n\r\n if (!startBlockEl || !endBlockEl) return;\r\n\r\n const startBlockId = startBlockEl.getAttribute(\"data-block-id\");\r\n const endBlockId = endBlockEl.getAttribute(\"data-block-id\");\r\n\r\n const startIndexInArray = blocks.findIndex((b) => b.id === startBlockId);\r\n const endIndexInArray = blocks.findIndex((b) => b.id === endBlockId);\r\n\r\n if (startIndexInArray === -1 || endIndexInArray === -1) return;\r\n\r\n const startAbsOffset = getAbsoluteOffset(\r\n startBlockEl,\r\n startNode,\r\n range.startOffset,\r\n );\r\n const endAbsOffset = getAbsoluteOffset(\r\n endBlockEl,\r\n endNode,\r\n range.endOffset,\r\n );\r\n\r\n const selectedParts: ShotPart[] = [];\r\n\r\n for (let i = startIndexInArray; i <= endIndexInArray; i++) {\r\n const block = blocks[i];\r\n const start = i === startIndexInArray ? startAbsOffset : 0;\r\n const end = i === endIndexInArray ? endAbsOffset : block.text.length;\r\n\r\n if (start !== end) {\r\n selectedParts.push({\r\n block_id: block.id,\r\n start_index: start,\r\n end_index: end,\r\n text: block.text.slice(start, end),\r\n });\r\n }\r\n }\r\n\r\n if (selectedParts.length > 0) {\r\n const rect = range.getBoundingClientRect();\r\n setSelectionMenu({\r\n top: rect.top + window.scrollY,\r\n left: rect.left + rect.width / 2 + window.scrollX,\r\n parts: selectedParts,\r\n });\r\n }\r\n };\r\n\r\n const initializeProduction = async (count: number, type: string) => {\r\n const newCameras: Camera[] = [];\r\n for (let i = 1; i <= count; i++) {\r\n newCameras.push({ name: `Camera ${String.fromCharCode(64 + i)}` });\r\n }\r\n\r\n const result = options.onProductionInitialized?.(newCameras, type);\r\n if (result instanceof Promise) {\r\n setCameras(newCameras);\r\n setSceneType(type);\r\n await result;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n const addShot = (shotDetails: Omit<Shot, \"id\" | \"shot_number\" | \"parts\">) => {\r\n if (!selectionMenu) return;\r\n const newShot: Shot = {\r\n ...shotDetails,\r\n id: uuid(),\r\n shot_number: shots.length + 1,\r\n parts: selectionMenu.parts,\r\n };\r\n setShots((prev) => [...prev, newShot]);\r\n\r\n const result = options.onShotAdded?.(newShot);\r\n if (result instanceof Promise) {\r\n return result.then(() => {\r\n clearSelection();\r\n });\r\n } else {\r\n clearSelection();\r\n return result;\r\n }\r\n };\r\n\r\n const updateShot = async (\r\n shotId: string | number,\r\n updatedDetails: Omit<Shot, \"id\" | \"shot_number\" | \"parts\">,\r\n ) => {\r\n let updatedShot: Shot | null = null;\r\n setShots((prev) =>\r\n prev.map((shot) => {\r\n if (shot.id === shotId) {\r\n updatedShot = { ...shot, ...updatedDetails };\r\n return updatedShot;\r\n }\r\n return shot;\r\n }),\r\n );\r\n\r\n if (updatedShot) {\r\n const result = options.onShotUpdated?.(shotId as string, updatedShot);\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n return result;\r\n }\r\n };\r\n\r\n const handleAISummarize = async () => {\r\n if (!scene || !scene.content || !options.onAISummarize) return;\r\n setIsSummarizing(true);\r\n try {\r\n const res: any = await options.onAISummarize?.(scene.content);\r\n\r\n if (res && res.ok) {\r\n const data = await res.json();\r\n setIsSummarizing(false);\r\n\r\n const newShots: Shot[] = [];\r\n data.data[0].forEach((aiShot: any) => {\r\n // Map AI response to Shot type\r\n // This mapping depends on what the AI returns for shots\r\n const newShot: Shot = {\r\n id: aiShot.id || uuid(),\r\n shot_number: (shots.length || 0) + newShots.length + 1,\r\n priority: aiShot.priority || \"Essential\",\r\n shot_type: aiShot.shot_type || \"Medium Shot (MS)\",\r\n framing: aiShot.framing || \"Eye Level\",\r\n camera_angle: aiShot.camera_angle || \"Eye Level\",\r\n camera_movement: aiShot.camera_movement || \"Static (Locked-Off)\",\r\n camera_support: aiShot.camera_support || \"Tripod\",\r\n lens_mm: aiShot.lens_mm || \"35\",\r\n lens_feel: aiShot.lens_feel || \"Standard\",\r\n aperture: aiShot.aperture || \"T2.8\",\r\n depth_of_field: aiShot.depth_of_field || \"Deep\",\r\n subject: aiShot.subject || \"\",\r\n action_blocking: aiShot.action_blocking || \"\",\r\n emotional_purpose: aiShot.emotional_purpose || \"\",\r\n lighting: aiShot.lighting || \"\",\r\n sound: aiShot.sound || \"\",\r\n duration_seconds: aiShot.duration_seconds || 5,\r\n edit_purpose: aiShot.edit_purpose || \"\",\r\n reason: aiShot.reason || \"\",\r\n vfx: aiShot.vfx || \"None\",\r\n camera_name: aiShot.camera_name || cameras[0]?.name || \"Camera A\",\r\n fps: aiShot.fps || 24,\r\n parts:\r\n aiShot.parts.map((part: any) => ({\r\n block_id: part.block_id.startsWith(\"par\")\r\n ? part.block_id.substring(3)\r\n : part.block_id || uuid(),\r\n start_index: part.start_index,\r\n end_index: part.end_index,\r\n text: part.text,\r\n })) || [],\r\n };\r\n newShots.push(newShot);\r\n });\r\n\r\n if (newShots.length > 0) {\r\n setShots((prev) => [...prev, ...newShots]);\r\n if (options.onShotsBulkAdded) {\r\n await options.onShotsBulkAdded(newShots, data.data[1]);\r\n }\r\n }\r\n } else {\r\n setIsSummarizing(false);\r\n }\r\n } catch (error) {\r\n setIsSummarizing(false);\r\n console.error(\"Error in AI summarization:\", error);\r\n }\r\n };\r\n\r\n return {\r\n blocks,\r\n isLoading,\r\n error,\r\n shots,\r\n sceneType,\r\n selectionMenu,\r\n handleMouseUp,\r\n cameras,\r\n initializeProduction,\r\n addShot,\r\n updateShot,\r\n clearSelection,\r\n handleAISummarize,\r\n isSummarizing,\r\n menuRef,\r\n };\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../app/types/screenplay-editor.types.tsx","../app/components/PdfImporter.tsx","../app/view/screenplay-editor.view.tsx","../app/service/screenplay-editor.service.ts","../app/hook/use-screenplay-editor.ts","../app/handler/script-file.handler.tsx","../app/types/script-breakdown.types.tsx","../app/components/summarize-button.tsx","../app/view/script-breakdown-scene.view.tsx","../app/hook/use-script-breakdown-scene.ts","../app/components/modal/modal-layout.tsx","../app/components/input/inputs.tsx","../data/shot-data.ts","../app/components/modal/add-shot-modal.tsx","../app/components/modal/production-setup-modal.tsx","../app/components/modal/view-shot-modal.tsx","../app/view/shot-breakdown-scene.view.tsx","../app/hook/use-shot-breakdown-scene.ts"],"names":["_a","jsx","useState","useRef","jsxs","Fragment","User","useEffect","newBlockId","Map","Loader2","AlignLeft","Tags","X","error","useMemo","useCallback","Check","AsteriskIcon","ErrorMessage","Formik","Yup2","Form","Info","Frame","Video","Settings2"],"mappings":"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","file":"index.js","sourcesContent":["import {\r\n Type,\r\n AlignLeft,\r\n User,\r\n Parentheses,\r\n MessageSquareText,\r\n CornerDownRight,\r\n} from \"lucide-react\";\r\nimport React from \"react\";\r\n\r\nexport type BlockType =\r\n | \"SCENE_HEADING\"\r\n | \"ACTION\"\r\n | \"CHARACTER\"\r\n | \"PARENTHETICAL\"\r\n | \"DIALOGUE\"\r\n | \"TRANSITION\";\r\n\r\nexport type TimeOfDay = \"DAY\" | \"NIGHT\";\r\nexport const timeOfDayOptions: TimeOfDay[] = [\"DAY\", \"NIGHT\"];\r\n\r\nexport interface Block {\r\n id: string;\r\n type: BlockType;\r\n text: string;\r\n sceneNumber?: string;\r\n sceneType?: \"INT.\" | \"EXT.\" | \"INT/EXT.\";\r\n timeOfDay?: TimeOfDay;\r\n}\r\n\r\nexport const blockTypes: BlockType[] = [\r\n \"SCENE_HEADING\",\r\n \"ACTION\",\r\n \"CHARACTER\",\r\n \"PARENTHETICAL\",\r\n \"DIALOGUE\",\r\n \"TRANSITION\",\r\n];\r\n\r\nexport const uuid = () => Math.random().toString(36).slice(2, 9);\r\n\r\nexport const icons: Record<BlockType, React.ReactNode> = {\r\n SCENE_HEADING: <Type className=\"w-5 h-5\" />,\r\n ACTION: <AlignLeft className=\"w-5 h-5\" />,\r\n CHARACTER: <User className=\"w-5 h-5\" />,\r\n PARENTHETICAL: <Parentheses className=\"w-5 h-5\" />,\r\n DIALOGUE: <MessageSquareText className=\"w-5 h-5\" />,\r\n TRANSITION: <CornerDownRight className=\"w-5 h-5\" />,\r\n};\r\n\r\nexport const blockStyles: Record<\r\n BlockType,\r\n { label: string; className: string; inputStyle: React.CSSProperties }\r\n> = {\r\n SCENE_HEADING: {\r\n label: \"Scene Heading\",\r\n className: \"uppercase font-bold text-zinc-900 flex items-center gap-3\",\r\n inputStyle: {\r\n textTransform: \"uppercase\",\r\n fontWeight: 700,\r\n maxWidth: \"6.0in\",\r\n outline: \"none\",\r\n whiteSpace: \"pre-wrap\",\r\n overflowWrap: \"break-word\",\r\n wordBreak: \"break-word\",\r\n },\r\n },\r\n ACTION: {\r\n label: \"Action\",\r\n className: \"text-zinc-800\",\r\n inputStyle: {\r\n maxWidth: \"6.0in\",\r\n outline: \"none\",\r\n whiteSpace: \"pre-wrap\",\r\n overflowWrap: \"break-word\",\r\n wordBreak: \"break-word\",\r\n lineHeight: \"12pt\",\r\n },\r\n },\r\n CHARACTER: {\r\n label: \"Character\",\r\n className: \"uppercase text-zinc-900 tracking-widest\",\r\n inputStyle: {\r\n textTransform: \"uppercase\",\r\n textAlign: \"left\",\r\n marginLeft: \"2.0in\",\r\n maxWidth: \"4.0in\",\r\n letterSpacing: \"0.1em\",\r\n outline: \"none\",\r\n whiteSpace: \"pre-wrap\",\r\n overflowWrap: \"break-word\",\r\n wordBreak: \"break-word\",\r\n },\r\n },\r\n PARENTHETICAL: {\r\n label: \"Parenthetical\",\r\n className: \"text-zinc-600\",\r\n inputStyle: {\r\n fontStyle: \"normal\",\r\n maxWidth: \"3.0in\",\r\n marginLeft: \"1.5in\",\r\n textTransform: \"lowercase\",\r\n outline: \"none\",\r\n whiteSpace: \"pre-wrap\",\r\n overflowWrap: \"break-word\",\r\n wordBreak: \"break-word\",\r\n textAlign: \"left\",\r\n },\r\n },\r\n DIALOGUE: {\r\n label: \"Dialogue\",\r\n className: \"text-zinc-900\",\r\n inputStyle: {\r\n marginLeft: \"1.0in\",\r\n maxWidth: \"3.5in\",\r\n outline: \"none\",\r\n whiteSpace: \"pre-wrap\",\r\n overflowWrap: \"break-word\",\r\n wordBreak: \"break-word\",\r\n fontSize: \"1.05rem\",\r\n textAlign: \"left\",\r\n lineHeight: \"12pt\",\r\n },\r\n },\r\n TRANSITION: {\r\n label: \"Transition\",\r\n className: \"uppercase font-bold text-right text-zinc-900\",\r\n inputStyle: {\r\n textTransform: \"uppercase\",\r\n fontWeight: 600,\r\n textAlign: \"right\",\r\n outline: \"none\",\r\n whiteSpace: \"pre-wrap\",\r\n overflowWrap: \"break-word\",\r\n wordBreak: \"break-word\",\r\n },\r\n },\r\n};\r\n","\"use client\";\r\n\r\nimport { useState, type ChangeEvent, useRef } from \"react\";\r\nimport * as pdfjs from \"pdfjs-dist\";\r\n\r\n// Set workerSrc to avoid issues with Next.js.\r\n// This is a common pattern for using pdf.js in a webpacked environment.\r\npdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`;\r\n\r\ninterface PdfImporterProps {\r\n onScriptImported: (\r\n title: string,\r\n content: string,\r\n preParsedBlocks?: any[],\r\n ) => void;\r\n disabled?: boolean\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function PdfImporter({ onScriptImported, disabled, children }: PdfImporterProps) {\r\n const [isProcessing, setIsProcessing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n\r\n const handleFileChange = async (event: ChangeEvent<HTMLInputElement>) => {\r\n const file = event.target.files?.[0];\r\n if (!file) {\r\n return;\r\n }\r\n\r\n setIsProcessing(true);\r\n setError(null);\r\n\r\n try {\r\n if (file.name.toLowerCase().endsWith(\".sbx\")) {\r\n let text = await file.text();\r\n\r\n // Decode HTML entities if the SBX was saved with encoded brackets\r\n if (text.includes(\"<div\")) {\r\n const textarea = document.createElement(\"textarea\");\r\n textarea.innerHTML = text;\r\n text = textarea.value;\r\n }\r\n\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(text, \"text/html\");\r\n\r\n const divs = Array.from(doc.querySelectorAll(\"div\"));\r\n const preParsedBlocks: any[] = [];\r\n\r\n const typeMap: Record<string, string> = {\r\n divtype0: \"SCENE_HEADING\",\r\n divtype2: \"ACTION\",\r\n divtype3: \"CHARACTER\",\r\n divtype4: \"PARENTHETICAL\",\r\n divtype5: \"DIALOGUE\",\r\n divtype6: \"TRANSITION\",\r\n };\r\n\r\n divs.forEach((div) => {\r\n let divText = div.textContent?.trim() || \"\";\r\n if (!divText) return; // Skip completely empty blocks\r\n\r\n let type = \"ACTION\"; // Default\r\n for (const className of Array.from(div.classList)) {\r\n if (typeMap[className]) {\r\n type = typeMap[className];\r\n break;\r\n }\r\n }\r\n\r\n const block: any = { type, text: divText };\r\n\r\n if (type === \"SCENE_HEADING\") {\r\n const sceneNum = div.getAttribute(\"data-scene\");\r\n if (sceneNum) block.sceneNumber = sceneNum;\r\n\r\n let parsedText = divText;\r\n const typeMatch = parsedText.match(/^(INT\\/EXT|INT|EXT)\\.?\\s+/i);\r\n if (typeMatch) {\r\n let sType = typeMatch[1].toUpperCase();\r\n if (!sType.endsWith(\".\")) sType += \".\";\r\n block.sceneType = sType;\r\n parsedText = parsedText.substring(typeMatch[0].length).trim();\r\n }\r\n\r\n const timeMatch = parsedText.match(/\\s+-\\s+([^-]+)$/);\r\n if (timeMatch) {\r\n block.timeOfDay = timeMatch[1].trim().toUpperCase();\r\n parsedText = parsedText.substring(0, timeMatch.index).trim();\r\n }\r\n\r\n block.text = parsedText;\r\n }\r\n\r\n preParsedBlocks.push(block);\r\n });\r\n\r\n const title = file.name.replace(/\\.sbx$/i, \"\");\r\n onScriptImported(title.trim(), \"\", preParsedBlocks);\r\n } else {\r\n const arrayBuffer = await file.arrayBuffer();\r\n const pdf = await pdfjs.getDocument(arrayBuffer).promise;\r\n\r\n const processPage = async (pageNumber: number): Promise<string> => {\r\n const page = await pdf.getPage(pageNumber);\r\n const content = await page.getTextContent();\r\n const items = content.items.filter(\r\n (item): item is pdfjs.TextItem =>\r\n \"str\" in item && item.str.trim().length > 0,\r\n );\r\n\r\n if (items.length === 0) return \"\";\r\n\r\n const lines: { y: number; items: { x: number; text: string }[] }[] =\r\n [];\r\n\r\n for (const item of items) {\r\n let found = false;\r\n for (const line of lines) {\r\n if (Math.abs(line.y - item.transform[5]) < 5) {\r\n // 5px tolerance\r\n line.items.push({ x: item.transform[4], text: item.str });\r\n found = true;\r\n break;\r\n }\r\n }\r\n if (!found) {\r\n lines.push({\r\n y: item.transform[5],\r\n items: [{ x: item.transform[4], text: item.str }],\r\n });\r\n }\r\n }\r\n\r\n lines.sort((a, b) => b.y - a.y);\r\n\r\n return lines\r\n .map((line) => {\r\n line.items.sort((a, b) => a.x - b.x);\r\n return line.items.map((item) => item.text).join(\" \");\r\n })\r\n .join(\"\\n\");\r\n };\r\n\r\n let title = \"\";\r\n if (pdf.numPages > 0) {\r\n title = await processPage(1);\r\n }\r\n\r\n let scriptContent = \"\";\r\n for (let i = 1; i <= pdf.numPages; i++) {\r\n scriptContent += (await processPage(i)) + \"\\n\\n\";\r\n }\r\n\r\n onScriptImported(title.trim(), scriptContent);\r\n }\r\n } catch (err) {\r\n console.error(\"Error processing PDF:\", err);\r\n setError(\r\n err instanceof Error\r\n ? `Error processing PDF: ${err.message}`\r\n : \"An unknown error occurred.\",\r\n );\r\n } finally {\r\n setIsProcessing(false);\r\n // Reset file input so the same file can be selected again\r\n if (event.target) {\r\n event.target.value = \"\";\r\n }\r\n }\r\n };\r\n\r\n const handleClick = () => {\r\n fileInputRef.current?.click();\r\n };\r\n\r\n return (\r\n <>\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept=\".pdf,application/pdf\"\r\n onChange={handleFileChange}\r\n disabled={isProcessing || disabled}\r\n className=\"hidden\"\r\n id=\"pdf-importer-input\"\r\n />\r\n <button\r\n onClick={handleClick}\r\n disabled={isProcessing || disabled}\r\n className={`flex items-center justify-center transition-all duration-200 active:scale-95 disabled:cursor-not-allowed disabled:opacity-50 ${isProcessing ? \"w-auto px-3 sm:px-4 h-8 sm:h-10 rounded-full text-sm font-semibold bg-zinc-100 text-zinc-500\" : \"w-8 h-8 sm:w-10 sm:h-10 rounded-full text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900\"}`}\r\n aria-label=\"Import Script\"\r\n >\r\n {isProcessing ? (\r\n <span className=\"text-xs sm:text-sm font-semibold\">Processing...</span>\r\n ) : (\r\n children\r\n )}\r\n </button>\r\n {error && <p className=\"sr-only\">Error: {error}</p>}\r\n </>\r\n );\r\n}\r\n","\"use client\";\r\nimport React, { useEffect, useState, useRef } from \"react\";\r\nimport {\r\n blockStyles,\r\n blockTypes,\r\n icons,\r\n timeOfDayOptions,\r\n Block,\r\n} from \"../types/screenplay-editor.types\";\r\nimport { useScreenplayEditor } from \"../hook/use-screenplay-editor\";\r\nimport {\r\n ArrowRight,\r\n ChevronRight,\r\n User,\r\n Cog,\r\n Save,\r\n FileDown,\r\n Upload,\r\n RefreshCcw,\r\n Lock,\r\n Unlock,\r\n Loader2,\r\n Sparkles,\r\n Check,\r\n X,\r\n} from \"lucide-react\";\r\n\r\nimport { PdfImporter } from \"../components/PdfImporter\";\r\n\r\ntype ScreenplayEditorViewProps = ReturnType<typeof useScreenplayEditor> & {\r\n showPdfImport?: boolean;\r\n showSaveButton?: boolean;\r\n showSyncButton?: boolean;\r\n isLocked?: boolean;\r\n onToggleLock?: () => void;\r\n onSave?: () => void;\r\n onSaveAsPdf?: () => void;\r\n onSaveAsSbx?: () => void;\r\n onSyncWithCloud?: () => void;\r\n handleSceneNumberChange: (blockId: string, value: string) => void;\r\n handleEnhance: (block: Block) => void;\r\n handleApproveEnhance: () => void;\r\n handleRejectEnhance: () => void;\r\n enhancingBlockId: string | null;\r\n enhancementSuggestion: string | null;\r\n isEnhancing: boolean;\r\n};\r\nexport function ScreenplayEditorView({\r\n blocks,\r\n refs,\r\n focusedBlockId,\r\n showSuggestions,\r\n showExtensionSuggestions,\r\n characterExtensions,\r\n locations,\r\n characters,\r\n showPdfImport = false,\r\n showSaveButton = false,\r\n showSyncButton = false,\r\n isLocked = false,\r\n onToggleLock,\r\n handleBlockTextChange,\r\n handleSceneTypeChange,\r\n handleTimeOfDayChange,\r\n handleBlockTypeChange,\r\n handleSelectCharacterExtension,\r\n handleKeyDown,\r\n handleFocus,\r\n handleBlur,\r\n handleScriptImport,\r\n onSave,\r\n onSaveAsPdf,\r\n onSyncWithCloud,\r\n handleSceneNumberChange,\r\n handleEnhance,\r\n handleApproveEnhance,\r\n handleRejectEnhance,\r\n enhancingBlockId,\r\n enhancementSuggestion,\r\n isEnhancing,\r\n showUnsavedPopover,\r\n syncScreenplay,\r\n ignoreChanges,\r\n isLoading = false,\r\n}: ScreenplayEditorViewProps) {\r\n const [isRulesOpen, setIsRulesOpen] = useState(false);\r\n const rulesRef = useRef<HTMLDivElement>(null);\r\n\r\n const COURIER_STACK = \"'Courier Prime', 'Courier', monospace\";\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n rulesRef.current &&\r\n !rulesRef.current.contains(event.target as Node)\r\n ) {\r\n setIsRulesOpen(false);\r\n }\r\n };\r\n\r\n if (isRulesOpen) {\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n }\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n };\r\n }, [isRulesOpen]);\r\n\r\n useEffect(() => {\r\n const fontId = \"google-font-courier-prime\";\r\n const styleId = \"screenplay-editor-force-v4\";\r\n\r\n // 1. Inject Google Font\r\n if (!document.getElementById(fontId)) {\r\n const link = document.createElement(\"link\");\r\n link.id = fontId;\r\n link.rel = \"stylesheet\";\r\n link.href =\r\n \"https://fonts.googleapis.com/css2?family=Courier+Prime:ital,wght@0,400;0,700;1,400;1,700&display=swap\";\r\n document.head.appendChild(link);\r\n }\r\n\r\n // 2. Inject high-specificity CSS (Safe textContent approach)\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement(\"style\");\r\n style.id = styleId;\r\n style.textContent = `\r\n /* We target by the data-attribute to ensure the highest specificity possible */\r\n [data-screenplay-editor] *, \r\n [data-screenplay-editor] div, \r\n [data-screenplay-editor] span, \r\n [data-screenplay-editor] [contenteditable=\"true\"] {\r\n font-family: ${COURIER_STACK} !important;\r\n -webkit-font-smoothing: antialiased;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }\r\n }, [COURIER_STACK]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"fixed inset-0 z-[100] flex items-center justify-center bg-white/80 transition-opacity\">\r\n <div className=\"flex flex-col items-center gap-3\">\r\n <Loader2 className=\"w-8 h-8 text-zinc-400 animate-spin\" />\r\n <p className=\"text-zinc-500 text-sm font-medium\">Loading script...</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <div className=\"sticky top-2 sm:top-6 z-50 mx-auto w-full max-w-[1037px] rounded-[2.5rem] sm:rounded-[2rem] bg-gradient-to-b from-white/90 to-white/70 border border-white/60 shadow-[0_14px_34px_rgba(16,37,54,0.06),0_2px_8px_rgba(16,37,54,0.03)] backdrop-blur-xl flex items-center justify-between px-2 py-1.5 sm:px-3 sm:py-2 mb-6 sm:mb-12 select-none transition-all\">\r\n <div className=\"flex items-center gap-1 overflow-x-auto pr-2 flex-1 no-scrollbar rounded-full p-1 bg-gradient-to-b from-white/80 to-blumine-50 border border-blumine-200 shadow-inner\">\r\n {blockTypes.map((type) => {\r\n const selected =\r\n blocks.find((b) => b.id === focusedBlockId)?.type === type;\r\n\r\n return (\r\n <button\r\n key={type}\r\n type=\"button\"\r\n disabled={isLocked}\r\n onClick={() => handleBlockTypeChange(type)}\r\n className={`group w-fit flex shrink-0 items-center gap-2 px-3 sm:px-4 h-[40px] sm:h-[42px] rounded-full font-medium text-xs sm:text-sm transition-all duration-200 ease-out active:scale-95 whitespace-nowrap ${\r\n selected\r\n ? \"bg-gradient-to-b from-white to-blumine-100 text-blumine-500 shadow-[0_6px_14px_rgba(24,88,122,0.15)] border border-blumine-200\"\r\n : \"text-blumine-500 hover:bg-white\"\r\n } ${isLocked ? \"opacity-50 cursor-not-allowed\" : \"\"}`}\r\n >\r\n <div\r\n className={`flex items-center justify-center transition-opacity duration-200 ${selected ? \"opacity-100\" : \"opacity-70 group-hover:opacity-100\"}`}\r\n >\r\n {icons[type]}\r\n </div>\r\n\r\n <span className=\"hidden lg:inline tracking-wide\">\r\n {blockStyles[type].label}\r\n </span>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1.5 shrink-0 ml-2 sm:ml-0 pl-2 sm:pl-1 border-l sm:border-none border-blumine-200/70\">\r\n <div className=\"hidden sm:block w-[1px] h-6 bg-blumine-200 rounded-full mx-1\" />\r\n\r\n {showPdfImport && !isLocked && (\r\n <PdfImporter\r\n disabled={isLocked}\r\n onScriptImported={handleScriptImport}\r\n >\r\n <div className=\"w-9 h-9 sm:w-10 sm:h-10 flex items-center justify-center rounded-full text-blumine-500 hover:text-blumine-900 hover:bg-white/70 transition active:scale-95\">\r\n <Upload className=\"w-4 h-4 sm:w-[18px] sm:h-[18px]\" />\r\n </div>\r\n </PdfImporter>\r\n )}\r\n\r\n {onToggleLock && (\r\n <button\r\n onClick={onToggleLock}\r\n className={`w-9 h-9 sm:w-10 sm:h-10 flex items-center justify-center rounded-full transition-all duration-200 active:scale-95 ${isLocked ? \"text-rose-500 bg-rose-50/60\" : \"text-blumine-500 hover:text-blumine-900 hover:bg-white/70\"}`}\r\n >\r\n {isLocked ? (\r\n <Lock className=\"w-4 h-4 sm:w-[18px] sm:h-[18px]\" />\r\n ) : (\r\n <Unlock className=\"w-4 h-4 sm:w-[18px] sm:h-[18px]\" />\r\n )}\r\n </button>\r\n )}\r\n\r\n {onSave && showSaveButton && !isLocked && (\r\n <button\r\n onClick={onSave}\r\n className=\"w-9 h-9 sm:w-10 sm:h-10 flex items-center justify-center rounded-full text-blumine-500 hover:text-blumine-900 hover:bg-white/70 transition active:scale-95\"\r\n >\r\n <Save className=\"w-4 h-4 sm:w-[18px] sm:h-[18px]\" />\r\n </button>\r\n )}\r\n\r\n {onSaveAsPdf && showSaveButton && (\r\n <button\r\n onClick={onSaveAsPdf}\r\n className=\"w-9 h-9 sm:w-10 sm:h-10 flex items-center justify-center rounded-full text-blumine-500 hover:text-blumine-900 hover:bg-white/70 transition active:scale-95\"\r\n >\r\n <FileDown className=\"w-4 h-4 sm:w-[18px] sm:h-[18px]\" />\r\n </button>\r\n )}\r\n\r\n {onSyncWithCloud && showSyncButton && !isLocked && (\r\n <button\r\n onClick={onSyncWithCloud}\r\n className=\"w-9 h-9 sm:w-10 sm:h-10 flex items-center justify-center rounded-full text-blumine-500 hover:text-blumine-900 hover:bg-white/70 transition active:scale-95\"\r\n >\r\n <RefreshCcw className=\"w-4 h-4 sm:w-[18px] sm:h-[18px]\" />\r\n </button>\r\n )}\r\n\r\n <div ref={rulesRef} className=\"relative flex items-center\">\r\n <button\r\n onClick={() => setIsRulesOpen(!isRulesOpen)}\r\n className={`w-9 h-9 sm:w-10 sm:h-10 flex items-center justify-center rounded-full transition-all duration-200 active:scale-95 ${isRulesOpen ? \"bg-gradient-to-b from-white to-blumine-100 text-blumine-500 shadow-md border border-blumine-100\" : \"text-blumine-500 hover:text-blumine-900 hover:bg-white/70\"}`}\r\n >\r\n <Cog className=\"w-4 h-4 sm:w-[18px] sm:h-[18px]\" />\r\n </button>\r\n\r\n {isRulesOpen && (\r\n <div className=\"absolute -right-2 top-[calc(100%+14px)] w-[332px] max-w-[90vw] p-3 rounded-[24px] bg-white border border-blumine-200/70 shadow-[0_18px_40px_rgba(16,37,54,0.08),0_3px_10px_rgba(16,37,54,0.04)] backdrop-blur-xl origin-top-right animate-in fade-in zoom-in-95 z-50\">\r\n <div className=\"absolute -top-2 right-5 w-4 h-4 rotate-45 bg-white border-l border-t border-blumine-200/70\" />\r\n\r\n <div className=\"flex items-start justify-between mb-3 px-1\">\r\n <div className=\"flex gap-3\">\r\n <div className=\"w-10 h-10 flex items-center justify-center rounded-xl bg-gradient-to-b from-white to-blumine-50 text-blumine-500 border border-blumine-200/70 shadow-inner\">\r\n <Cog className=\"w-4 h-4\" />\r\n </div>\r\n\r\n <div>\r\n <h4 className=\"text-[15px] font-semibold text-blumine-900 leading-tight\">\r\n Settings & Shortcuts\r\n </h4>\r\n <p className=\"text-xs text-blumine-500 mt-1\">\r\n Writing flow & editor controls\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n {[\r\n {\r\n title: \"New Block\",\r\n desc: \"Insert the next section\",\r\n key: [\"Enter\"],\r\n },\r\n {\r\n title: \"Delete Block\",\r\n desc: \"Remove selected section\",\r\n key: [\"Backspace 🡠\"],\r\n },\r\n {\r\n title: \"Change Type\",\r\n desc: \"Cycle block styles\",\r\n key: [\"Ctrl\", \"+\", \"↑/↓\"],\r\n },\r\n ].map((item) => (\r\n <div\r\n key={item.title}\r\n className=\"flex items-center justify-between gap-4 p-3 rounded-[18px] bg-gradient-to-b from-white to-blumine-50/50 border border-blumine-200/60 shadow-[inset_0_1px_0_rgba(255,255,255,0.8)]\"\r\n >\r\n <div className=\"flex flex-col min-w-0\">\r\n <span className=\"text-sm font-medium text-blumine-800\">\r\n {item.title}\r\n </span>\r\n <span className=\"text-[11px] text-blumine-500 truncate\">\r\n {item.desc}\r\n </span>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1 shrink-0\">\r\n {item.key.map((k, i) =>\r\n k === \"+\" ? (\r\n <span\r\n key={i}\r\n className=\"text-blumine-400 text-xs font-semibold\"\r\n >\r\n +\r\n </span>\r\n ) : (\r\n <kbd\r\n key={i}\r\n className=\"min-w-[28px] px-2 py-1 text-[11px] font-bold text-primary bg-gradient-to-b from-white to-blumine-100 border border-blumine-200/70 rounded-full text-center shadow-[inset_0_1px_0_rgba(255,255,255,0.9)]\"\r\n >\r\n {k}\r\n </kbd>\r\n ),\r\n )}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex flex-col gap-12 pb-24 w-full items-center justify-center\">\r\n <div\r\n className=\"relative bg-[#fdfdfc] shadow-2xl shadow-zinc-300/60 border border-zinc-100 rounded-sm md:rounded-md pl-[1.5in] py-[1in] pr-[1in] flex flex-col w-[210mm] min-h-[297mm] shrink-0\"\r\n style={{\r\n fontFamily: COURIER_STACK,\r\n paddingLeft: \"1.5in\",\r\n paddingRight: \"1in\",\r\n paddingTop: \"1in\",\r\n paddingBottom: \"1in\",\r\n lineHeight: \"1.2\",\r\n }}\r\n data-screenplay-editor=\"true\"\r\n >\r\n {blocks.map((block) => (\r\n <div\r\n key={block.id + \"-\" + block.type}\r\n data-block-id={block.id}\r\n className={`relative rounded-sm transition-all duration-200 outline-none ${\r\n focusedBlockId === block.id\r\n ? \"bg-zinc-100/50\"\r\n : \"bg-transparent\"\r\n }`}\r\n >\r\n {block.type === \"SCENE_HEADING\" ? (\r\n <>\r\n <div className=\"flex items-center gap-2 px-4 py-1 bg-transparent\">\r\n <input\r\n className=\"absolute -left-16 top-2 w-12 text-right text-zinc-400 font-semibold select-none bg-transparent outline-none focus:ring-1 focus:ring-blue-400 rounded-sm\"\r\n spellCheck={false}\r\n disabled={isLocked}\r\n // FIX: Use the derived map to ensure consistency with what the hook calculates\r\n value={block.sceneNumber || \"\"}\r\n onChange={(e) =>\r\n handleSceneNumberChange(\r\n block.id,\r\n e.target.value.toUpperCase(),\r\n )\r\n }\r\n onFocus={() => handleFocus(block.id)}\r\n onBlur={() => handleBlur(block.id)}\r\n onKeyDown={(e) => {\r\n // Prevent the editor's global keydown from triggering when typing in the number box\r\n if (e.key === \"Enter\" || e.key === \"Backspace\") {\r\n e.stopPropagation();\r\n }\r\n }}\r\n aria-label=\"Scene Number\"\r\n />\r\n <select\r\n className=\"rounded-md text-zinc-800 font-bold px-1.5 py-1 appearance-none bg-transparent hover:bg-zinc-200/50 outline-none cursor-pointer w-fit transition-colors\"\r\n aria-label=\"Scene Type\"\r\n disabled={isLocked}\r\n value={block.sceneType ?? \"INT.\"}\r\n onChange={(e) =>\r\n handleSceneTypeChange(block.id, e.target.value as any)\r\n }\r\n style={{\r\n appearance: \"none\",\r\n }}\r\n >\r\n <option>INT.</option>\r\n <option>EXT.</option>\r\n <option>INT/EXT.</option>\r\n </select>\r\n <div\r\n ref={(el) => {\r\n if (!el) return;\r\n refs.current[block.id] = el;\r\n }}\r\n contentEditable={!isLocked}\r\n suppressContentEditableWarning\r\n aria-label={`Scene Heading: ${block.text}`}\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={\r\n focusedBlockId === block.id &&\r\n showSuggestions &&\r\n locations.length > 0\r\n }\r\n spellCheck={false}\r\n className=\"min-w-[3rem] py-1 outline-none text-base font-bold uppercase tracking-widest break-all bg-transparent\"\r\n style={{\r\n minWidth: \"3rem\",\r\n }}\r\n onInput={(e) =>\r\n handleBlockTextChange(\r\n block.id,\r\n (e.target as HTMLDivElement).innerText,\r\n )\r\n }\r\n onKeyDown={(e) => handleKeyDown(e, block.id, block.text)}\r\n onFocus={() => handleFocus(block.id)}\r\n onBlur={() => handleBlur(block.id)}\r\n ></div>\r\n <span className=\"text-zinc-400/80 font-bold\">-</span>\r\n <select\r\n className=\"rounded-md text-zinc-800 font-bold px-1.5 py-1 appearance-none bg-transparent hover:bg-zinc-200/50 outline-none cursor-pointer transition-colors\"\r\n aria-label=\"Time of Day\"\r\n disabled={isLocked}\r\n value={block.timeOfDay ?? \"DAY\"}\r\n style={{\r\n appearance: \"none\",\r\n }}\r\n onChange={(e) =>\r\n handleTimeOfDayChange(block.id, e.target.value as any)\r\n }\r\n >\r\n {timeOfDayOptions.map((t) => (\r\n <option key={t}>{t}</option>\r\n ))}\r\n </select>\r\n </div>\r\n {focusedBlockId === block.id &&\r\n showSuggestions &&\r\n locations.length > 0 && (\r\n <div\r\n role=\"listbox\"\r\n id={`suggestions-${block.id}`}\r\n className=\"absolute top-[calc(100%+6px)] left-0 min-w-[240px] z-50 bg-white border border-slate-200/80 shadow-xl shadow-slate-200/40 rounded-xl py-1 overflow-hidden animate-in fade-in zoom-in-95 duration-150\"\r\n >\r\n <div className=\"max-h-60 overflow-y-auto custom-scrollbar\">\r\n {locations\r\n .filter(\r\n (loc) =>\r\n loc.startsWith(block.text.toUpperCase()) &&\r\n loc !== block.text.toUpperCase(),\r\n )\r\n .map((loc) => (\r\n <div\r\n role=\"option\"\r\n key={loc}\r\n className=\"group flex items-center justify-between px-4 py-2.5 cursor-pointer transition-all duration-150 hover:bg-slate-50 active:bg-slate-100\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n const element = refs.current[block.id];\r\n if (element) {\r\n element.innerText = loc;\r\n handleBlockTextChange(block.id, loc);\r\n element.focus();\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n range.selectNodeContents(element);\r\n range.collapse(false);\r\n sel?.removeAllRanges();\r\n sel?.addRange(range);\r\n }\r\n handleBlur(block.id);\r\n }}\r\n >\r\n <span className=\"text-[12px] font-semibold tracking-wide text-slate-600 uppercase line-clamp-1\">\r\n {loc}\r\n </span>\r\n\r\n <ArrowRight className=\"w-3.5 h-3.5 text-slate-300 opacity-0 -translate-x-2 group-hover:opacity-100 group-hover:translate-x-0 transition-all duration-200\" />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n ) : (\r\n <>\r\n <div\r\n ref={(el) => {\r\n if (!el) return;\r\n refs.current[block.id] = el;\r\n }}\r\n contentEditable={!isLocked}\r\n suppressContentEditableWarning\r\n aria-label={`${blockStyles[block.type].label} text`}\r\n aria-multiline={\r\n block.type === \"ACTION\" || block.type === \"DIALOGUE\"\r\n }\r\n spellCheck={false}\r\n className={`block outline-none w-full min-h-[2.5rem] px-4 py-2 break-words ${\r\n blockStyles[block.type].className\r\n }`}\r\n onInput={(e) =>\r\n handleBlockTextChange(\r\n block.id,\r\n (e.target as HTMLDivElement).innerText,\r\n )\r\n }\r\n onKeyDown={(e) => handleKeyDown(e, block.id, block.text)}\r\n onFocus={() => handleFocus(block.id)}\r\n onBlur={() => handleBlur(block.id)}\r\n style={blockStyles[block.type].inputStyle}\r\n ></div>\r\n {focusedBlockId === block.id &&\r\n block.type === \"CHARACTER\" &&\r\n showSuggestions &&\r\n characters.length > 0 && (\r\n <div\r\n role=\"listbox\"\r\n id={`suggestions-${block.id}`}\r\n className=\"absolute top-[calc(100%+8px)] left-1/2 -translate-x-1/2 w-72 z-50 bg-white border border-slate-200 shadow-2xl shadow-slate-200/60 rounded-xl py-2 overflow-hidden animate-in fade-in zoom-in-95 duration-200\"\r\n >\r\n <div className=\"max-h-56 overflow-y-auto custom-scrollbar\">\r\n {characters\r\n .filter(\r\n (char) =>\r\n char.startsWith(block.text.toUpperCase()) &&\r\n char !== block.text.toUpperCase(),\r\n )\r\n .map((char) => (\r\n <div\r\n role=\"option\"\r\n key={char}\r\n className=\"group flex items-center px-4 py-2.5 cursor-pointer transition-colors duration-150 hover:bg-slate-50 active:bg-slate-100\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n const element = refs.current[block.id];\r\n if (element) {\r\n element.innerText = char;\r\n handleBlockTextChange(block.id, char);\r\n element.focus();\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n range.selectNodeContents(element);\r\n range.collapse(false);\r\n sel?.removeAllRanges();\r\n sel?.addRange(range);\r\n }\r\n handleBlur(block.id);\r\n }}\r\n >\r\n <User className=\"w-3.5 h-3.5 text-slate-300 group-hover:text-blumine-500 transition-colors mr-3\" />\r\n\r\n <span className=\"flex-1 text-[11px] font-bold tracking-[0.1em] text-slate-600 uppercase text-left\">\r\n {char}\r\n </span>\r\n\r\n <ChevronRight className=\"w-3 h-3 text-slate-200 opacity-0 group-hover:opacity-100 transition-all -translate-x-1 group-hover:translate-x-0\" />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n {focusedBlockId === block.id &&\r\n block.type === \"CHARACTER\" &&\r\n showExtensionSuggestions &&\r\n characterExtensions && (\r\n <div\r\n role=\"listbox\"\r\n id={`extension-suggestions-${block.id}`}\r\n className=\"absolute top-[calc(100%+8px)] left-1/2 -translate-x-1/2 w-72 z-50 bg-white border border-slate-200 shadow-2xl shadow-slate-200/60 rounded-xl py-2 overflow-hidden animate-in fade-in zoom-in-95 duration-200\"\r\n >\r\n <div className=\"max-h-56 overflow-y-auto custom-scrollbar\">\r\n {characterExtensions\r\n .filter((ext) => {\r\n const openParenIndex =\r\n block.text.lastIndexOf(\"(\");\r\n const query =\r\n openParenIndex > -1\r\n ? block.text\r\n .substring(openParenIndex + 1)\r\n .toUpperCase()\r\n : \"\";\r\n return ext.toUpperCase().includes(query);\r\n })\r\n .map((ext) => (\r\n <div\r\n role=\"option\"\r\n key={ext}\r\n className=\"group flex items-center px-4 py-2.5 cursor-pointer transition-colors duration-150 hover:bg-slate-50 active:bg-slate-100\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n handleSelectCharacterExtension(ext);\r\n }}\r\n >\r\n <span className=\"flex-1 text-[11px] font-bold tracking-[0.1em] text-slate-600 uppercase text-left\">\r\n {ext}\r\n </span>\r\n <ChevronRight className=\"w-3 h-3 text-slate-200 opacity-0 group-hover:opacity-100 transition-all -translate-x-1 group-hover:translate-x-0\" />\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n {focusedBlockId === block.id &&\r\n !enhancingBlockId &&\r\n (block.type === \"ACTION\" || block.type === \"DIALOGUE\") && (\r\n <button\r\n onClick={() => handleEnhance(block)}\r\n className=\"absolute -right-12 top-1/2 -translate-y-1/2 flex items-center justify-center w-8 h-8 rounded-xl border border-blumine-200/50 bg-white text-blumine-500 hover:border-blumine-400/60 hover:bg-blumine-50/90 hover:ring-2 hover:ring-blumine-100 hover:scale-105 active:scale-95 transition-all duration-200 group/enhance animate-in fade-in slide-in-from-left-2\"\r\n title=\"Enhance with AI\"\r\n >\r\n <Sparkles className=\"w-4 h-4 group-hover/enhance:animate-pulse transition-colors\" />\r\n </button>\r\n )}\r\n\r\n {enhancingBlockId === block.id &&\r\n (enhancementSuggestion || isEnhancing) && (\r\n <div\r\n className=\"absolute left-0 right-0 -top-4 -translate-y-full z-[30] animate-in fade-in zoom-in-95 slide-in-from-bottom-4 duration-300\"\r\n style={{ width: \"calc(100% + 2rem)\", left: \"-1rem\" }}\r\n >\r\n <div className=\"mx-auto w-full rounded-[2rem] bg-white border border-white/60 shadow-[0_14px_34px_rgba(16,37,54,0.1),0_2px_8px_rgba(16,37,54,0.05)] backdrop-blur-xl p-2 select-none transition-all\">\r\n <div className=\"flex flex-col gap-3\">\r\n <div className=\"flex items-center justify-between pl-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-9 h-9 flex items-center justify-center rounded-full bg-blumine-50 text-blumine-500 border border-blumine-100 shadow-inner\">\r\n <Sparkles className=\"w-4 h-4\" />\r\n </div>\r\n <div>\r\n <p className=\"text-[11px] font-bold text-zinc-900 uppercase tracking-wider leading-none\">\r\n AI Suggestion\r\n </p>\r\n {!isEnhancing && (\r\n <p className=\"text-[10px] text-zinc-500 mt-1 font-medium\">\r\n Refining your screenplay dialogue\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {!isEnhancing && (\r\n <div className=\"flex items-center gap-1.5\">\r\n <button\r\n onClick={handleRejectEnhance}\r\n className=\"px-3 py-2 rounded-full text-xs font-bold text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900 transition-all active:scale-95\"\r\n >\r\n Discard\r\n </button>\r\n <button\r\n onClick={handleApproveEnhance}\r\n className=\"px-4 py-2 rounded-full text-xs font-bold bg-blumine-500 text-white hover:bg-blumine-600 shadow-lg shadow-blumine-500/20 transition-all active:scale-95 flex items-center gap-1.5\"\r\n >\r\n <Check className=\"w-3.5 h-3.5\" />\r\n Apply Changes\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"relative overflow-hidden rounded-[1.25rem] bg-zinc-50/50 border border-zinc-100 p-4 min-h-[4rem]\">\r\n {isEnhancing ? (\r\n <div className=\"flex flex-col gap-2.5 py-1\">\r\n <div className=\"h-3.5 w-3/4 bg-zinc-200/60 animate-pulse rounded-full\" />\r\n <div className=\"h-3.5 w-1/2 bg-zinc-200/60 animate-pulse rounded-full\" />\r\n </div>\r\n ) : (\r\n <div className=\"flex flex-col gap-2\">\r\n <p className=\"text-xs text-zinc-400 line-through decoration-zinc-300 italic\">\r\n {block.text}\r\n </p>\r\n <p className=\"text-sm text-zinc-800 font-medium leading-relaxed\">\r\n {enhancementSuggestion}\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"absolute -bottom-1.5 left-1/2 -translate-x-1/2 w-3.5 h-3.5 bg-white border-r border-b border-zinc-200/50 rotate-45\" />\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n <div\r\n className={`fixed bottom-10 left-[53%] -translate-x-1/2 z-[100] w-full max-w-[95%] sm:max-w-2xl transition-all duration-500 ease-in-out ${\r\n showUnsavedPopover\r\n ? \"translate-y-0 opacity-100 scale-100\"\r\n : \"translate-y-12 opacity-0 scale-95 pointer-events-none\"\r\n }`}\r\n >\r\n <div className=\"mx-auto rounded-[2.5rem] bg-white/95 border border-white/60 shadow-[0_20px_50px_rgba(16,37,54,0.12),0_4px_12px_rgba(16,37,54,0.05)] backdrop-blur-2xl flex items-center justify-between px-2 py-1.5 sm:px-4 sm:py-2.5 select-none transition-all hover:shadow-[0_25px_60px_rgba(16,37,54,0.18)]\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-10 h-10 flex items-center justify-center rounded-[2.5rem] bg-blumine-50 text-blumine-500 border border-blumine-100 shadow-inner\">\r\n <Save className=\"w-5 h-5\" />\r\n </div>\r\n <div className=\"mr-5\">\r\n <p className=\"text-xs font-bold text-zinc-900 leading-none\">\r\n Unsaved Changes\r\n </p>\r\n <p className=\"text-[11px] text-zinc-500 mt-1 font-medium\">\r\n You have changes that haven't been saved yet.\r\n </p>\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2 w-full sm:w-auto\">\r\n <button\r\n onClick={ignoreChanges}\r\n className=\"flex-1 sm:flex-none px-4 py-2 rounded-[2.5rem] text-xs font-bold text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900 transition-all active:scale-95 whitespace-nowrap\"\r\n >\r\n Ignore\r\n </button>\r\n <button\r\n onClick={syncScreenplay}\r\n className=\"flex-1 sm:flex-none px-5 py-2 rounded-[2.5rem] text-xs font-bold bg-blumine-500 text-white hover:bg-blumine-600 shadow-lg shadow-blumine-500/25 transition-all active:scale-95 flex items-center justify-center gap-2 whitespace-nowrap\"\r\n >\r\n <RefreshCcw className=\"w-4 h-4\" />\r\n Sync to Cloud\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n","import {\r\n Block,\r\n BlockType,\r\n TimeOfDay,\r\n uuid,\r\n} from \"../types/screenplay-editor.types\";\r\n\r\nexport function getNextBlockType(currentType: BlockType): BlockType {\r\n switch (currentType) {\r\n case \"SCENE_HEADING\":\r\n return \"ACTION\";\r\n case \"CHARACTER\":\r\n return \"PARENTHETICAL\";\r\n case \"PARENTHETICAL\":\r\n return \"DIALOGUE\";\r\n case \"DIALOGUE\":\r\n return \"CHARACTER\";\r\n case \"TRANSITION\":\r\n return \"SCENE_HEADING\";\r\n default:\r\n return \"ACTION\";\r\n }\r\n}\r\n\r\nexport function createNewBlock(type: BlockType): Block {\r\n const newBlock: Block = { id: uuid(), type, text: \"\" };\r\n\r\n if (type === \"SCENE_HEADING\") {\r\n newBlock.sceneType = \"INT.\";\r\n newBlock.timeOfDay = \"DAY\";\r\n newBlock.sceneNumber = \"\"; // Only exists for scenes\r\n } else if (type === \"PARENTHETICAL\") {\r\n newBlock.text = \"()\";\r\n }\r\n\r\n return newBlock;\r\n}\r\n\r\nexport function addBlockAfter(\r\n blocks: Block[],\r\n currentBlockId: string,\r\n): { newBlocks: Block[]; newBlockId: string } {\r\n const currentIndex = blocks.findIndex((b) => b.id === currentBlockId);\r\n if (currentIndex === -1) return { newBlocks: blocks, newBlockId: \"\" };\r\n\r\n const nextType = getNextBlockType(blocks[currentIndex].type);\r\n const newBlock = createNewBlock(nextType);\r\n\r\n // If the NEW block is a scene, calculate its number based on the current list\r\n if (nextType === \"SCENE_HEADING\") {\r\n newBlock.sceneNumber = generateNextSceneNumber(blocks, currentIndex);\r\n }\r\n\r\n const newBlocks = [\r\n ...blocks.slice(0, currentIndex + 1),\r\n newBlock,\r\n ...blocks.slice(currentIndex + 1),\r\n ];\r\n\r\n return { newBlocks, newBlockId: newBlock.id };\r\n}\r\nexport function deleteBlock(\r\n blocks: Block[],\r\n blockIdToDelete: string,\r\n): { newBlocks: Block[]; nextFocusedId: string | null } {\r\n if (blocks.length <= 1) {\r\n return { newBlocks: blocks, nextFocusedId: blocks[0]?.id || null };\r\n }\r\n\r\n const index = blocks.findIndex((b) => b.id === blockIdToDelete);\r\n if (index === -1) {\r\n return { newBlocks: blocks, nextFocusedId: null };\r\n }\r\n\r\n const newBlocks = [...blocks];\r\n newBlocks.splice(index, 1);\r\n\r\n const nextFocusedId =\r\n newBlocks[index]?.id || newBlocks[index - 1]?.id || null;\r\n\r\n return { newBlocks, nextFocusedId };\r\n}\r\n\r\nexport function updateBlock<K extends keyof Block>(\r\n blocks: Block[],\r\n id: string,\r\n key: K,\r\n value: Block[K],\r\n): Block[] {\r\n return blocks.map((b) => (b.id === id ? { ...b, [key]: value } : b));\r\n}\r\n\r\nexport const generateNextSceneNumber = (\r\n blocks: Block[],\r\n currentIndex: number, // The index of the block where Enter was pressed\r\n): string => {\r\n // Find all scene headings before the current cursor\r\n const prevScenes = blocks\r\n .slice(0, currentIndex + 1)\r\n .filter((b) => b.type === \"SCENE_HEADING\");\r\n\r\n // 1. If it's the first scene in the script\r\n if (prevScenes.length === 0) return \"1\";\r\n\r\n const lastScene = prevScenes[prevScenes.length - 1];\r\n const lastNum = lastScene.sceneNumber || \"1\";\r\n\r\n // Match pattern: \"1\" -> [\"1\", \"\"] | \"1A\" -> [\"1\", \"A\"]\r\n const match = lastNum.match(/^(\\d+)([A-Z]*)$/);\r\n if (!match) return \"1\";\r\n\r\n const baseNumber = match[1];\r\n const currentSuffix = match[2];\r\n\r\n // 2. Determine if we are INSERTING or APPENDING\r\n // Look for any scene headings that exist AFTER the current cursor position\r\n const scenesAfter = blocks\r\n .slice(currentIndex + 1)\r\n .filter((b) => b.type === \"SCENE_HEADING\");\r\n\r\n if (scenesAfter.length > 0) {\r\n // --- INSERTION LOGIC (StudioBinder Style) ---\r\n // If we are between 1 and 2, we take \"1\" and add/increment a letter\r\n if (currentSuffix === \"\") {\r\n return `${baseNumber}A`;\r\n } else {\r\n return `${baseNumber}${incrementChar(currentSuffix)}`;\r\n }\r\n }\r\n\r\n // --- APPENDING LOGIC ---\r\n // If we are at the very end of the script, just increment the number (1 -> 2)\r\n return String(parseInt(baseNumber) + 1);\r\n};\r\n\r\n// Helper to handle alphabet incrementing: A -> B, Z -> AA\r\nfunction incrementChar(text: string): string {\r\n if (text === \"\") return \"A\";\r\n const lastChar = text.slice(-1);\r\n const remaining = text.slice(0, -1);\r\n\r\n if (lastChar === \"Z\") {\r\n return incrementChar(remaining) + \"A\";\r\n }\r\n return remaining + String.fromCharCode(lastChar.charCodeAt(0) + 1);\r\n}\r\n\r\nexport function changeBlockType(\r\n blocks: Block[],\r\n id: string,\r\n newType: BlockType,\r\n) {\r\n const currentIndex = blocks.findIndex((b) => b.id === id);\r\n if (currentIndex === -1) return blocks;\r\n\r\n const currentBlock = blocks[currentIndex];\r\n const newBlock = createNewBlock(newType);\r\n\r\n // --- PERSISTENCE LOGIC ---\r\n // Keep the old text unless it's a Parenthetical (which needs specific formatting)\r\n if (newType === \"PARENTHETICAL\") {\r\n const cleanText = currentBlock.text.replace(/[()]/g, \"\");\r\n newBlock.text = `(${cleanText})`;\r\n } else {\r\n newBlock.text = currentBlock.text;\r\n }\r\n\r\n if (newType === \"SCENE_HEADING\") {\r\n newBlock.sceneNumber = generateNextSceneNumber(blocks, currentIndex);\r\n // Optional: Auto-uppercase text if switching to a scene heading\r\n newBlock.text = newBlock.text.toUpperCase();\r\n }\r\n\r\n return blocks.map((b) => (b.id === id ? { ...newBlock, id: b.id } : b));\r\n}\r\n\r\nexport function parseScreenplayText(content: string): Block[] {\r\n const lines = content.split(\"\\n\");\r\n const blocks: Block[] = [];\r\n let lastBlock: Block | null = null;\r\n let activeSpeaker: string | null = null;\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n let originalLine = lines[i]; // Don't trim yet\r\n let trimmedLine = lines[i].trim().replace(/\\s+/g, \" \");\r\n // 1. STANDARDIZE TEXT\r\n const leadingSpaces = originalLine.search(/\\S/);\r\n\r\n // --- FIX 1: RESET CONTEXT ON EMPTY LINES ---\r\n // This ensures that after \"Another!\", the speaker is cleared before the Action starts.\r\n if (lines[i].trim() === \"\") {\r\n activeSpeaker = null;\r\n continue;\r\n }\r\n\r\n // 2. PAGE NUMBER FILTER\r\n const isPageNumber =\r\n /^\\d+$/.test(trimmedLine) ||\r\n /^(PAGE|pg\\.?)\\s?\\d+$/i.test(trimmedLine) ||\r\n /^[\\d]+\\.$/.test(trimmedLine);\r\n\r\n if (trimmedLine.length === 0 || isPageNumber) continue;\r\n\r\n let currentBlockType: BlockType | null = null;\r\n const isAllUpperCase =\r\n trimmedLine === trimmedLine.toUpperCase() && /[A-Z]/.test(trimmedLine);\r\n\r\n // 3. IDENTIFY STRUCTURAL BLOCKS\r\n const sceneHeadingStartRegex =\r\n /^(?:\\d+[A-Z]?\\.?\\s*)?(INT\\.?\\/EXT\\.?|I\\/E|INT|EXT|EST\\.)\\b/i;\r\n const isTransition =\r\n isAllUpperCase &&\r\n (trimmedLine.endsWith(\" TO:\") ||\r\n [\"FADE IN:\", \"FADE OUT.\", \"CUT TO BLACK.\"].includes(trimmedLine));\r\n\r\n if (sceneHeadingStartRegex.test(trimmedLine)) {\r\n currentBlockType = \"SCENE_HEADING\";\r\n activeSpeaker = null;\r\n } else if (isTransition) {\r\n currentBlockType = \"TRANSITION\";\r\n activeSpeaker = null;\r\n }\r\n // 4. CHARACTER DETECTION\r\n else if (isAllUpperCase && !trimmedLine.startsWith(\"(\")) {\r\n let nextLine = \"\";\r\n for (let j = i + 1; j < lines.length; j++) {\r\n const nextTrimmed = lines[j].trim();\r\n const nextIsPage =\r\n /^\\d+$/.test(nextTrimmed) ||\r\n /^(PAGE|pg\\.?)\\s?\\d+$/i.test(nextTrimmed);\r\n if (nextTrimmed.length > 0 && !nextIsPage) {\r\n nextLine = nextTrimmed;\r\n break;\r\n }\r\n }\r\n\r\n if (\r\n (nextLine &&\r\n (nextLine.startsWith(\"(\") || nextLine !== nextLine.toUpperCase())) ||\r\n /\\s\\(.*\\)$/.test(trimmedLine)\r\n ) {\r\n currentBlockType = \"CHARACTER\";\r\n activeSpeaker = trimmedLine;\r\n } else {\r\n currentBlockType = \"ACTION\";\r\n activeSpeaker = null;\r\n }\r\n }\r\n // 5. PARENTHETICALS\r\n else if (trimmedLine.startsWith(\"(\") && trimmedLine.endsWith(\")\")) {\r\n currentBlockType = \"PARENTHETICAL\";\r\n }\r\n // 6. DIALOGUE (Persistent Context)\r\n else if (\r\n activeSpeaker &&\r\n (lastBlock?.type === \"CHARACTER\" ||\r\n lastBlock?.type === \"PARENTHETICAL\" ||\r\n lastBlock?.type === \"DIALOGUE\")\r\n ) {\r\n // 1. Check if the previous block of dialogue actually ended.\r\n // If it ends in a comma, or no punctuation at all, it's almost certainly\r\n // just the dialogue wrapping to a new line.\r\n const isLastLineComplete = /[.!?]\"?$/.test(lastBlock.text.trim());\r\n\r\n // 2. The Indentation Check (The \"Hard\" Break)\r\n // We only allow a switch to Action if the indentation is low AND\r\n // the previous dialogue sentence felt finished.\r\n if (\r\n leadingSpaces < 15 &&\r\n lastBlock?.type !== \"CHARACTER\" &&\r\n isLastLineComplete\r\n ) {\r\n currentBlockType = \"ACTION\";\r\n activeSpeaker = null;\r\n } else {\r\n currentBlockType = \"DIALOGUE\";\r\n }\r\n }\r\n // 7. DEFAULT ACTION\r\n else {\r\n currentBlockType = \"ACTION\";\r\n activeSpeaker = null;\r\n }\r\n\r\n // --- Block Construction & Scene Metadata Extraction ---\r\n // --- FIX 2: PREVENT IMPROPER MERGING ---\r\n if (\r\n lastBlock &&\r\n lastBlock.type === currentBlockType &&\r\n (currentBlockType === \"ACTION\" || currentBlockType === \"DIALOGUE\") &&\r\n !(currentBlockType === \"DIALOGUE\" && !activeSpeaker) // Added this guard\r\n ) {\r\n lastBlock.text += \" \" + trimmedLine;\r\n } else {\r\n const newBlock = createNewBlock(currentBlockType);\r\n\r\n if (currentBlockType === \"SCENE_HEADING\") {\r\n let workingLine = trimmedLine;\r\n\r\n const sceneNumMatch = workingLine.match(/^(\\d+[A-Z]*)\\.?\\s+/i);\r\n\r\n if (sceneNumMatch) {\r\n // 1. SAVE AS RAW STRING (e.g., \"24A\")\r\n newBlock.sceneNumber = String(sceneNumMatch[1]).toUpperCase();\r\n // Strip \"24A. \" from the text so the editor stays clean\r\n workingLine = workingLine.replace(/^(\\d+[A-Z]*)\\.?\\s+/i, \"\").trim();\r\n } else {\r\n // 2. NO NUMBER FOUND: Set to empty string\r\n newBlock.sceneNumber = \"\";\r\n }\r\n\r\n const typeMatch = workingLine.match(\r\n /^(INT\\.?\\/EXT\\.?|I\\/E|INT|EXT|EST\\.)/i,\r\n );\r\n if (typeMatch) {\r\n let sType = typeMatch[0].toUpperCase().replace(/[^A-Z/.]/g, \"\");\r\n if (!sType.endsWith(\".\")) sType += \".\";\r\n newBlock.sceneType = sType as any;\r\n workingLine = workingLine.substring(typeMatch[0].length).trim();\r\n }\r\n\r\n const suffixRegex =\r\n /[.\\-\\s]+(DAY|NIGHT|CONTINUOUS|LATER|MORNING|EVENING|DUSK|DAWN|MORN|AFT|SUNSET|SUNRISE)(?:\\s+.*)*$/i;\r\n const suffixMatch = workingLine.match(suffixRegex);\r\n\r\n if (suffixMatch) {\r\n const rawTime = suffixMatch[1].toUpperCase();\r\n const nightKeys = [\"NIGHT\", \"EVENING\", \"DUSK\", \"SUNSET\"];\r\n newBlock.timeOfDay = nightKeys.includes(rawTime) ? \"NIGHT\" : \"DAY\";\r\n workingLine = workingLine.substring(0, suffixMatch.index).trim();\r\n } else {\r\n workingLine = workingLine.replace(/\\s+\\d+(\\s+\\d+)*$/, \"\").trim();\r\n newBlock.timeOfDay = \"DAY\";\r\n }\r\n\r\n newBlock.text = workingLine\r\n .replace(/^[-.\\s]+/, \"\")\r\n .replace(/[-.\\s]+$/, \"\")\r\n .toUpperCase();\r\n } else {\r\n newBlock.text = trimmedLine;\r\n }\r\n\r\n blocks.push(newBlock);\r\n lastBlock = newBlock;\r\n }\r\n }\r\n\r\n return blocks.length > 0 ? blocks : [createNewBlock(\"SCENE_HEADING\")];\r\n}\r\n\r\nexport function serializeToSbx(blocks: Block[]): string {\r\n const typeToDivClass: Record<string, string> = {\r\n SCENE_HEADING: \"divtype0\",\r\n ACTION: \"divtype2\",\r\n CHARACTER: \"divtype3\",\r\n PARENTHETICAL: \"divtype4\",\r\n DIALOGUE: \"divtype5\",\r\n TRANSITION: \"divtype6\",\r\n GENERAL: \"divtype2\",\r\n };\r\n\r\n return blocks\r\n .map((block) => {\r\n const divClass = typeToDivClass[block.type] || \"divtype2\";\r\n let text = block.text || \"\";\r\n let extraAttributes = \"\";\r\n\r\n if (block.type === \"SCENE_HEADING\") {\r\n text =\r\n `${block.sceneType || \"INT.\"} ${text} - ${block.timeOfDay || \"DAY\"}`.toUpperCase();\r\n if (block.sceneNumber) {\r\n extraAttributes = ` data-scene=\"${block.sceneNumber}\"`;\r\n }\r\n } else if (block.type === \"CHARACTER\" || block.type === \"TRANSITION\") {\r\n text = text.toUpperCase();\r\n }\r\n\r\n return `<div class=\"${divClass}\" id=\"par${block.id}\"${extraAttributes}>${text}</div>`;\r\n })\r\n .join(\"\");\r\n}\r\n","\"use client\";\r\nimport React, {\r\n useState,\r\n useRef,\r\n KeyboardEvent,\r\n useEffect,\r\n useMemo,\r\n useCallback,\r\n} from \"react\";\r\nimport {\r\n Block,\r\n BlockType,\r\n TimeOfDay,\r\n uuid,\r\n blockTypes,\r\n} from \"../types/screenplay-editor.types\";\r\nimport * as ScreenplayService from \"../service/screenplay-editor.service\";\r\n\r\nconst initialBlocks: Block[] = [\r\n {\r\n id: uuid(),\r\n type: \"SCENE_HEADING\",\r\n text: \"\",\r\n sceneNumber: \"1\",\r\n sceneType: \"INT.\",\r\n timeOfDay: \"DAY\",\r\n },\r\n];\r\n\r\nfunction getCaretCharacterOffsetWithin(element: HTMLElement) {\r\n let caretOffset = 0;\r\n const doc = element.ownerDocument;\r\n const win = doc.defaultView;\r\n const sel = win?.getSelection();\r\n if (sel && sel.rangeCount > 0) {\r\n const range = sel.getRangeAt(0);\r\n const preCaretRange = range.cloneRange();\r\n preCaretRange.selectNodeContents(element);\r\n preCaretRange.setEnd(range.endContainer, range.endOffset);\r\n caretOffset = preCaretRange.toString().length;\r\n }\r\n return caretOffset;\r\n}\r\n\r\nfunction setCaretPosition(element: HTMLElement, offset: number) {\r\n const sel = window.getSelection();\r\n if (!sel) return;\r\n const range = document.createRange();\r\n let currentOffset = 0;\r\n let found = false;\r\n\r\n function traverseNodes(node: Node) {\r\n if (found) return;\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n const length = node.nodeValue?.length || 0;\r\n if (currentOffset + length >= offset) {\r\n range.setStart(node, offset - currentOffset);\r\n range.collapse(true);\r\n found = true;\r\n } else {\r\n currentOffset += length;\r\n }\r\n } else {\r\n for (let i = 0; i < node.childNodes.length; i++) {\r\n traverseNodes(node.childNodes[i]);\r\n if (found) break;\r\n }\r\n }\r\n }\r\n\r\n traverseNodes(element);\r\n\r\n if (!found) {\r\n range.setStart(element, 0);\r\n range.collapse(true);\r\n }\r\n\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n}\r\n\r\nexport interface UseScreenplayEditorOptions {\r\n initialUrl?: string;\r\n fetchOptions?: RequestInit;\r\n onSave?: (content?: Blob) => void;\r\n onSyncWithCloud?: (\r\n blocks: Block[],\r\n sceneNumbers: Record<string, string>,\r\n ) => void;\r\n enhanceContentUrl?: string | URL | Request;\r\n}\r\n\r\nexport function useScreenplayEditor(options?: UseScreenplayEditorOptions) {\r\n const [blocks, setBlocks] = useState<Block[]>(initialBlocks);\r\n const refs = useRef<Record<string, HTMLDivElement | null>>({});\r\n const [focusedBlockId, setFocusedBlockId] = useState<string>(\r\n initialBlocks[0].id,\r\n );\r\n const [newBlockId, setNewBlockId] = useState<string | null>(null);\r\n const [showSuggestions, setShowSuggestions] = useState(false);\r\n const [showExtensionSuggestions, setShowExtensionSuggestions] =\r\n useState(false);\r\n const [isLoading, setIsLoading] = useState(!!options?.initialUrl);\r\n const [enhancingBlockId, setEnhancingBlockId] = useState<string | null>(null);\r\n const [enhancementSuggestion, setEnhancementSuggestion] = useState<\r\n string | null\r\n >(null);\r\n const [isEnhancing, setIsEnhancing] = useState(false);\r\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\r\n const [showUnsavedPopover, setShowUnsavedPopover] = useState(false);\r\n const popoverTimeoutRef = useRef<NodeJS.Timeout | null>(null);\r\n const blurTimeout = useRef<NodeJS.Timeout | null>(null);\r\n const isInitialLoadRef = useRef(true);\r\n const loadedUrlRef = useRef<string | null>(null);\r\n const lastSavedContent = useRef<string | null>(null);\r\n const onSaveRef = useRef(options?.onSave);\r\n const onSyncWithCloudRef = useRef(options?.onSyncWithCloud);\r\n\r\n useEffect(() => {\r\n onSaveRef.current = options?.onSave;\r\n onSyncWithCloudRef.current = options?.onSyncWithCloud;\r\n }, [options?.onSave, options?.onSyncWithCloud]);\r\n\r\n const characterExtensions = useMemo(\r\n () => [\"(V.O.)\", \"(O.S.)\", \"(O.C.)\", \"(SUBTITLE)\", \"(CONT'D)\"],\r\n [],\r\n );\r\n\r\n const handleSceneNumberChange = useCallback(\r\n (id: string, newNumber: string) => {\r\n setBlocks((prevBlocks) =>\r\n prevBlocks.map((block) =>\r\n block.id === id\r\n ? { ...block, sceneNumber: newNumber.toUpperCase() }\r\n : block,\r\n ),\r\n );\r\n },\r\n [],\r\n );\r\n\r\n // Derived State\r\n const locations = useMemo(() => {\r\n const locs = blocks\r\n .filter((b) => b.type === \"SCENE_HEADING\" && b.text.trim() !== \"\")\r\n .map((b) => b.text.trim().toUpperCase());\r\n return [...new Set(locs)];\r\n }, [blocks]);\r\n\r\n const characters = useMemo(() => {\r\n const chars = blocks\r\n .filter((b) => b.type === \"CHARACTER\" && b.text.trim() !== \"\")\r\n .map((b) => {\r\n const text = b.text.trim().toUpperCase();\r\n const parenIndex = text.indexOf(\"(\");\r\n if (parenIndex > -1) {\r\n return text.substring(0, parenIndex).trim();\r\n }\r\n return text;\r\n })\r\n .filter(Boolean);\r\n return [...new Set(chars)];\r\n }, [blocks]);\r\n\r\n const sceneNumbers = useMemo(() => {\r\n const map: Record<string, string> = {};\r\n let fallbackCount = 0;\r\n\r\n blocks.forEach((block) => {\r\n if (block.type === \"SCENE_HEADING\") {\r\n if (block.sceneNumber) {\r\n map[block.id] = block.sceneNumber;\r\n const base = parseInt(block.sceneNumber);\r\n if (!isNaN(base)) fallbackCount = Math.max(fallbackCount, base);\r\n } else {\r\n fallbackCount++;\r\n map[block.id] = String(fallbackCount);\r\n }\r\n }\r\n });\r\n return map;\r\n }, [blocks]);\r\n\r\n useEffect(() => {\r\n if (newBlockId && refs.current[newBlockId]) {\r\n const block = blocks.find((b) => b.id === newBlockId);\r\n const el = refs.current[newBlockId];\r\n if (el && block) {\r\n el.focus();\r\n el.innerText = block.text;\r\n if (block.type === \"PARENTHETICAL\") {\r\n setTimeout(() => setCaretPosition(el, 1), 0);\r\n } else {\r\n setTimeout(() => setCaretPosition(el, block.text.length), 0);\r\n }\r\n }\r\n setFocusedBlockId(newBlockId);\r\n setNewBlockId(null);\r\n }\r\n }, [newBlockId, blocks]);\r\n\r\n useEffect(() => {\r\n blocks.forEach((block) => {\r\n const element = refs.current[block.id];\r\n if (element) {\r\n if (\r\n element.innerText !== block.text &&\r\n document.activeElement !== element\r\n ) {\r\n element.innerText = block.text;\r\n }\r\n }\r\n });\r\n }, [blocks]);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (e: MouseEvent) => {\r\n // Check if the clicked element is a contentEditable block or inside the toolbar\r\n const target = e.target as HTMLElement;\r\n const isInsideBlock = target.closest(\"[data-block-id]\");\r\n const isInsideToolbar = target.closest(\".sticky\"); // Adjust selector based on your UI\r\n const isInsideSuggestions = target.closest('[role=\"listbox\"]');\r\n\r\n if (!isInsideBlock && !isInsideToolbar && !isInsideSuggestions) {\r\n setFocusedBlockId(\"\");\r\n setShowSuggestions(false);\r\n setShowExtensionSuggestions(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n };\r\n }, []);\r\n\r\n // Handlers\r\n const handleBlockTextChange = useCallback(\r\n (id: string, text: string) => {\r\n const block = blocks.find((b) => b.id === id);\r\n if (!block) return;\r\n\r\n if (block.type === \"CHARACTER\") {\r\n const trimmedText = text.trim();\r\n const openParenIndex = trimmedText.lastIndexOf(\"(\");\r\n const closeParenIndex = trimmedText.lastIndexOf(\")\");\r\n\r\n if (openParenIndex !== -1 && openParenIndex > closeParenIndex) {\r\n setShowExtensionSuggestions(true);\r\n setShowSuggestions(false);\r\n } else {\r\n setShowExtensionSuggestions(false);\r\n setShowSuggestions(openParenIndex === -1);\r\n }\r\n } else if (showExtensionSuggestions) {\r\n setShowExtensionSuggestions(false);\r\n }\r\n\r\n let processedText = text;\r\n if (block.type === \"PARENTHETICAL\") {\r\n const clean = text.replace(/[()]/g, \"\");\r\n processedText = `(${clean})`;\r\n }\r\n\r\n setBlocks((bs) =>\r\n ScreenplayService.updateBlock(bs, id, \"text\", processedText),\r\n );\r\n\r\n if (text !== processedText) {\r\n const el = refs.current[id];\r\n if (el) {\r\n const offset = getCaretCharacterOffsetWithin(el);\r\n const charsBeforeCaret = text\r\n .substring(0, offset)\r\n .replace(/[()]/g, \"\").length;\r\n const newOffset = 1 + charsBeforeCaret;\r\n el.innerText = processedText;\r\n setCaretPosition(el, newOffset);\r\n }\r\n }\r\n },\r\n [blocks, showExtensionSuggestions],\r\n );\r\n\r\n const handleSceneTypeChange = useCallback(\r\n (id: string, sceneType: \"INT.\" | \"EXT.\" | \"INT/EXT.\") => {\r\n setBlocks((bs) =>\r\n ScreenplayService.updateBlock(bs, id, \"sceneType\", sceneType),\r\n );\r\n setTimeout(() => {\r\n refs.current[id]?.focus();\r\n setFocusedBlockId(id);\r\n }, 10);\r\n },\r\n [],\r\n );\r\n\r\n const handleTimeOfDayChange = useCallback((id: string, time: TimeOfDay) => {\r\n setBlocks((bs) => ScreenplayService.updateBlock(bs, id, \"timeOfDay\", time));\r\n setTimeout(() => {\r\n refs.current[id]?.focus();\r\n setFocusedBlockId(id);\r\n }, 10);\r\n }, []);\r\n\r\n const handleBlockTypeChange = useCallback(\r\n (newType: BlockType) => {\r\n if (!focusedBlockId) return;\r\n\r\n // The service now handles text preservation\r\n setBlocks((bs) =>\r\n ScreenplayService.changeBlockType(bs, focusedBlockId, newType),\r\n );\r\n\r\n setTimeout(() => {\r\n const el = refs.current[focusedBlockId];\r\n if (el) {\r\n el.focus();\r\n // REMOVE the line: el.innerText = newBlock.text;\r\n // Instead, let the useEffect handle syncing the text or set it from the current state\r\n const currentBlock = blocks.find((b) => b.id === focusedBlockId);\r\n if (currentBlock) {\r\n // Move caret to the end of the existing text\r\n const pos =\r\n newType === \"PARENTHETICAL\"\r\n ? el.innerText.length - 1\r\n : el.innerText.length;\r\n setCaretPosition(el, Math.max(0, pos));\r\n }\r\n }\r\n }, 10);\r\n },\r\n [focusedBlockId, blocks],\r\n );\r\n\r\n const handleSelectCharacterExtension = useCallback(\r\n (extension: string) => {\r\n if (!focusedBlockId) return;\r\n\r\n setBlocks((currentBlocks) => {\r\n const block = currentBlocks.find((b) => b.id === focusedBlockId);\r\n if (!block || block.type !== \"CHARACTER\") return currentBlocks;\r\n\r\n const parenIndex = block.text.indexOf(\"(\");\r\n const baseText = (\r\n parenIndex > -1 ? block.text.substring(0, parenIndex) : block.text\r\n ).trim();\r\n const newText = `${baseText} ${extension}`;\r\n\r\n const newBlocks = ScreenplayService.updateBlock(\r\n currentBlocks,\r\n focusedBlockId,\r\n \"text\",\r\n newText,\r\n );\r\n\r\n setTimeout(() => {\r\n const el = refs.current[focusedBlockId];\r\n if (el) {\r\n el.innerText = newText;\r\n el.focus();\r\n setCaretPosition(el, newText.length);\r\n }\r\n }, 0);\r\n return newBlocks;\r\n });\r\n setShowExtensionSuggestions(false);\r\n },\r\n [focusedBlockId],\r\n );\r\n\r\n const focusBlock = (id: string, position: \"start\" | \"end\" = \"start\") => {\r\n const el = refs.current[id];\r\n if (!el) return;\r\n\r\n el.focus();\r\n\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n if (!sel) return;\r\n\r\n range.selectNodeContents(el);\r\n range.collapse(position === \"start\");\r\n\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n };\r\n\r\n const cycleBlockType = (id: string, direction: \"up\" | \"down\") => {\r\n const block = blocks.find((b) => b.id === id);\r\n if (!block) return;\r\n\r\n const idx = blockTypes.indexOf(block.type);\r\n let newIdx = direction === \"up\" ? idx - 1 : idx + 1;\r\n if (newIdx < 0) newIdx = blockTypes.length - 1;\r\n if (newIdx >= blockTypes.length) newIdx = 0;\r\n\r\n const newType = blockTypes[newIdx];\r\n\r\n setBlocks((bs) => ScreenplayService.changeBlockType(bs, id, newType));\r\n\r\n // Handle the DOM and Caret after the state update\r\n setTimeout(() => {\r\n const el = refs.current[id];\r\n if (el) {\r\n el.focus();\r\n\r\n if (newType === \"PARENTHETICAL\") {\r\n setCaretPosition(el, 1);\r\n } else {\r\n setCaretPosition(el, el.innerText.length);\r\n }\r\n }\r\n }, 10);\r\n };\r\n\r\n const handleKeyDown = useCallback(\r\n (e: KeyboardEvent<HTMLDivElement>, id: string, text: string) => {\r\n const block = blocks.find((b) => b.id === id);\r\n\r\n if (block?.type === \"PARENTHETICAL\") {\r\n const offset = getCaretCharacterOffsetWithin(e.currentTarget);\r\n\r\n if (e.key === \"Backspace\" && (offset <= 1 || text === \"()\")) {\r\n e.preventDefault();\r\n cycleBlockType(id, \"up\");\r\n return;\r\n }\r\n if (\r\n e.key === \"Delete\" &&\r\n (offset >= text.length - 1 || text === \"()\")\r\n ) {\r\n e.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n if ((e.key === \"Backspace\" || e.key === \"Delete\") && text.length <= 1) {\r\n e.preventDefault();\r\n const { newBlocks, nextFocusedId } = ScreenplayService.deleteBlock(\r\n blocks,\r\n id,\r\n );\r\n setBlocks(newBlocks);\r\n if (nextFocusedId) {\r\n setTimeout(() => {\r\n focusBlock(nextFocusedId, \"end\");\r\n }, 0);\r\n }\r\n return;\r\n }\r\n\r\n if (e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n const { newBlocks, newBlockId } = ScreenplayService.addBlockAfter(\r\n blocks,\r\n id,\r\n );\r\n setBlocks(newBlocks);\r\n setNewBlockId(newBlockId);\r\n } else if (e.key === \"ArrowUp\" && e.ctrlKey) {\r\n e.preventDefault();\r\n cycleBlockType(id, \"up\");\r\n } else if (e.key === \"ArrowDown\" && e.ctrlKey) {\r\n e.preventDefault();\r\n cycleBlockType(id, \"down\");\r\n } else if (e.key === \"ArrowUp\" && !e.ctrlKey) {\r\n const selection = window.getSelection();\r\n if (\r\n !selection ||\r\n !selection.isCollapsed ||\r\n selection.rangeCount === 0\r\n ) {\r\n return;\r\n }\r\n\r\n const range = selection.getRangeAt(0);\r\n const contentEditable = e.currentTarget as HTMLDivElement;\r\n\r\n let atStart = false;\r\n if (range.startOffset === 0) {\r\n let node = range.startContainer;\r\n if (node === contentEditable) {\r\n atStart = true;\r\n } else {\r\n let atStartOfParents = true;\r\n while (node !== contentEditable) {\r\n if (node.previousSibling) {\r\n atStartOfParents = false;\r\n break;\r\n }\r\n node = node.parentNode!;\r\n if (!node) {\r\n atStartOfParents = false;\r\n break;\r\n }\r\n }\r\n atStart = atStartOfParents;\r\n }\r\n }\r\n\r\n if (atStart) {\r\n e.preventDefault();\r\n const currentIndex = blocks.findIndex((b) => b.id === id);\r\n if (currentIndex > 0) {\r\n const prevBlockId = blocks[currentIndex - 1].id;\r\n focusBlock(prevBlockId, \"end\");\r\n }\r\n }\r\n } else if (e.key === \"ArrowDown\" && !e.ctrlKey) {\r\n const selection = window.getSelection();\r\n if (\r\n !selection ||\r\n !selection.isCollapsed ||\r\n selection.rangeCount === 0\r\n ) {\r\n return;\r\n }\r\n\r\n const range = selection.getRangeAt(0);\r\n const contentEditable = e.currentTarget as HTMLDivElement;\r\n const container = range.endContainer;\r\n\r\n const isAtEndOffset =\r\n range.endOffset ===\r\n (container.nodeType === Node.TEXT_NODE\r\n ? container.textContent?.length\r\n : container.childNodes.length);\r\n\r\n if (isAtEndOffset) {\r\n let atEnd = false;\r\n let node = container;\r\n if (node === contentEditable) {\r\n atEnd = true;\r\n } else {\r\n let atEndOfParents = true;\r\n while (node !== contentEditable) {\r\n if (node.nextSibling) {\r\n atEndOfParents = false;\r\n break;\r\n }\r\n node = node.parentNode!;\r\n if (!node) {\r\n atEndOfParents = false;\r\n break;\r\n }\r\n }\r\n atEnd = atEndOfParents;\r\n }\r\n\r\n if (atEnd) {\r\n e.preventDefault();\r\n const currentIndex = blocks.findIndex((b) => b.id === id);\r\n if (currentIndex < blocks.length - 1) {\r\n const nextBlockId = blocks[currentIndex + 1].id;\r\n focusBlock(nextBlockId, \"start\");\r\n }\r\n }\r\n }\r\n }\r\n },\r\n [blocks, handleBlockTextChange],\r\n );\r\n\r\n const handleScriptImport = useCallback(\r\n (\r\n title: string,\r\n content: string,\r\n preParsedBlocks?: Partial<Block>[],\r\n isInitialLoad?: boolean,\r\n ) => {\r\n let parsedBlocks: Block[] = [];\r\n\r\n // Directly use provided blocks (like from an SBX file) or parse standard text\r\n if (preParsedBlocks && preParsedBlocks.length > 0) {\r\n parsedBlocks = preParsedBlocks.map((b) => ({\r\n id: b.id || uuid(),\r\n type: b.type || \"ACTION\",\r\n text: b.text || \"\",\r\n sceneNumber: b.sceneNumber,\r\n sceneType: b.sceneType,\r\n timeOfDay: b.timeOfDay,\r\n })) as Block[];\r\n } else {\r\n parsedBlocks = ScreenplayService.parseScreenplayText(content);\r\n }\r\n\r\n if (parsedBlocks.length > 0) {\r\n let fallbackCount = 1;\r\n\r\n const finalizedBlocks = parsedBlocks.map((block) => {\r\n if (block.type === \"SCENE_HEADING\") {\r\n // RULE 1: If the parser found ANY string (24A, 1, 10-B), USE IT.\r\n // We do zero math on it.\r\n if (block.sceneNumber && block.sceneNumber.trim().length > 0) {\r\n // Only update our fallback counter if we see a plain number (e.g. \"24\")\r\n // If we see \"24A\", we DON'T update the count so the next scene stays on track.\r\n const isPureNumber = /^\\d+$/.test(block.sceneNumber);\r\n if (isPureNumber) {\r\n fallbackCount = parseInt(block.sceneNumber) + 1;\r\n }\r\n\r\n return block;\r\n }\r\n\r\n // RULE 2: Fallback ONLY for scenes that had no number in the script\r\n return { ...block, sceneNumber: String(fallbackCount++) };\r\n }\r\n return block;\r\n });\r\n\r\n setBlocks(finalizedBlocks);\r\n\r\n if (onSaveRef.current) {\r\n const sbxData = ScreenplayService.serializeToSbx(finalizedBlocks);\r\n\r\n // Only save if the data is different from what we last saved\r\n if (sbxData !== lastSavedContent.current) {\r\n lastSavedContent.current = sbxData;\r\n if (!isInitialLoad) {\r\n const blob = new Blob([sbxData], { type: \"text/plain\" });\r\n onSaveRef.current(blob);\r\n }\r\n }\r\n }\r\n\r\n // 3. Focus logic\r\n setTimeout(() => {\r\n const firstId = parsedBlocks[0].id;\r\n if (firstId && refs.current[firstId]) {\r\n setFocusedBlockId(firstId);\r\n refs.current[firstId]?.focus();\r\n }\r\n }, 100);\r\n }\r\n },\r\n [refs],\r\n );\r\n const handleFocus = useCallback(\r\n (id: string) => {\r\n if (blurTimeout.current) {\r\n clearTimeout(blurTimeout.current);\r\n }\r\n setFocusedBlockId(id);\r\n const block = blocks.find((b) => b.id === id);\r\n if (block?.type === \"CHARACTER\") {\r\n const trimmedText = block.text.trim();\r\n const openParenIndex = trimmedText.lastIndexOf(\"(\");\r\n const closeParenIndex = trimmedText.lastIndexOf(\")\");\r\n\r\n if (openParenIndex !== -1 && openParenIndex > closeParenIndex) {\r\n setShowExtensionSuggestions(true);\r\n setShowSuggestions(false);\r\n } else {\r\n setShowExtensionSuggestions(false);\r\n setShowSuggestions(openParenIndex === -1);\r\n }\r\n } else {\r\n setShowSuggestions(true);\r\n setShowExtensionSuggestions(false);\r\n }\r\n },\r\n [blocks],\r\n );\r\n\r\n const handleBlur = useCallback((id: string) => {\r\n if (document.activeElement === refs.current[id]) return;\r\n blurTimeout.current = setTimeout(() => {\r\n setShowSuggestions(false);\r\n setShowExtensionSuggestions(false);\r\n }, 200);\r\n }, []);\r\n\r\n const syncScreenplay = useCallback(() => {\r\n if (!onSyncWithCloudRef.current) return;\r\n\r\n onSyncWithCloudRef.current(blocks, sceneNumbers);\r\n lastSavedContent.current = ScreenplayService.serializeToSbx(blocks);\r\n setHasUnsavedChanges(false);\r\n setShowUnsavedPopover(false);\r\n if (popoverTimeoutRef.current) clearTimeout(popoverTimeoutRef.current);\r\n }, [blocks, sceneNumbers]);\r\n\r\n const ignoreChanges = useCallback(() => {\r\n setShowUnsavedPopover(false);\r\n if (popoverTimeoutRef.current) clearTimeout(popoverTimeoutRef.current);\r\n }, []);\r\n\r\n const loadFromUrl = useCallback(\r\n async (\r\n url: string,\r\n fetchOptions: RequestInit = {},\r\n isInitialLoad?: boolean,\r\n ) => {\r\n setIsLoading(true);\r\n try {\r\n const response = await fetch(url, fetchOptions);\r\n if (!response.ok) {\r\n throw new Error(\r\n `[useScreenplayEditor] Failed to fetch script. HTTP Status: ${response.status}`,\r\n );\r\n }\r\n\r\n let text = await response.text();\r\n let preParsedBlocks: Partial<Block>[] | undefined = undefined;\r\n let scriptContent = text;\r\n\r\n // Detect if the content is an SBX file (HTML format)\r\n if (\r\n text.includes('class=\"divtype') ||\r\n url.toLowerCase().includes(\".sbx\")\r\n ) {\r\n if (text.includes(\"<div\")) {\r\n const textarea = document.createElement(\"textarea\");\r\n textarea.innerHTML = text;\r\n text = textarea.value;\r\n }\r\n\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(text, \"text/html\");\r\n const divs = Array.from(doc.querySelectorAll(\"div\"));\r\n const parsed: Partial<Block>[] = [];\r\n\r\n const typeMap: Record<string, BlockType> = {\r\n divtype0: \"SCENE_HEADING\",\r\n divtype2: \"ACTION\",\r\n divtype3: \"CHARACTER\",\r\n divtype4: \"PARENTHETICAL\",\r\n divtype5: \"DIALOGUE\",\r\n divtype6: \"TRANSITION\",\r\n };\r\n\r\n divs.forEach((div) => {\r\n let divText = div.textContent?.trim() || \"\";\r\n if (!divText) return;\r\n\r\n let type: BlockType = \"ACTION\";\r\n for (const className of Array.from(div.classList)) {\r\n if (typeMap[className]) {\r\n type = typeMap[className];\r\n break;\r\n }\r\n }\r\n\r\n const block: Partial<Block> = { type, text: divText };\r\n\r\n // Preserve the block ID if it exists to prevent unnecessary re-saves\r\n const idAttr = div.getAttribute(\"id\");\r\n if (idAttr && idAttr.startsWith(\"par\")) {\r\n block.id = idAttr.substring(3);\r\n }\r\n\r\n if (type === \"SCENE_HEADING\") {\r\n const sceneNum = div.getAttribute(\"data-scene\");\r\n if (sceneNum) block.sceneNumber = sceneNum;\r\n\r\n let parsedText = divText;\r\n const typeMatch = parsedText.match(/^(INT\\/EXT|INT|EXT)\\.?\\s+/i);\r\n if (typeMatch) {\r\n let sType = typeMatch[1].toUpperCase();\r\n if (!sType.endsWith(\".\")) sType += \".\";\r\n block.sceneType = sType as any;\r\n parsedText = parsedText.substring(typeMatch[0].length).trim();\r\n }\r\n\r\n const timeMatch = parsedText.match(/\\s+-\\s+([^-]+)$/);\r\n if (timeMatch) {\r\n block.timeOfDay = timeMatch[1].trim().toUpperCase() as any;\r\n parsedText = parsedText.substring(0, timeMatch.index).trim();\r\n }\r\n\r\n block.text = parsedText;\r\n }\r\n\r\n parsed.push(block);\r\n });\r\n\r\n if (parsed.length > 0) {\r\n preParsedBlocks = parsed;\r\n scriptContent = \"\"; // Clear raw text if parsed successfully\r\n }\r\n }\r\n\r\n // Try to get a clean title from the URL\r\n const filename =\r\n url\r\n .split(\"/\")\r\n .pop()\r\n ?.replace(/\\.sbx$/i, \"\") || \"Imported from URL\";\r\n\r\n handleScriptImport(\r\n filename,\r\n scriptContent,\r\n preParsedBlocks,\r\n isInitialLoad,\r\n );\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n },\r\n [handleScriptImport],\r\n );\r\n\r\n useEffect(() => {\r\n if (isLoading) {\r\n isInitialLoadRef.current = true;\r\n return;\r\n }\r\n\r\n const currentSbx = ScreenplayService.serializeToSbx(blocks);\r\n\r\n if (isInitialLoadRef.current) {\r\n if (lastSavedContent.current === null) {\r\n lastSavedContent.current = currentSbx;\r\n }\r\n isInitialLoadRef.current = false;\r\n return;\r\n }\r\n\r\n const hasActualChanges =\r\n lastSavedContent.current !== null &&\r\n currentSbx !== lastSavedContent.current;\r\n\r\n if (hasActualChanges) {\r\n setHasUnsavedChanges(true);\r\n if (popoverTimeoutRef.current) clearTimeout(popoverTimeoutRef.current);\r\n setShowUnsavedPopover(false);\r\n popoverTimeoutRef.current = setTimeout(() => {\r\n setShowUnsavedPopover(true);\r\n }, 1000);\r\n } else {\r\n setHasUnsavedChanges(false);\r\n setShowUnsavedPopover(false);\r\n if (popoverTimeoutRef.current) clearTimeout(popoverTimeoutRef.current);\r\n }\r\n\r\n return () => {\r\n if (popoverTimeoutRef.current) clearTimeout(popoverTimeoutRef.current);\r\n };\r\n }, [blocks, isLoading]);\r\n\r\n useEffect(() => {\r\n if (options?.initialUrl && options.initialUrl !== loadedUrlRef.current) {\r\n loadedUrlRef.current = options.initialUrl;\r\n loadFromUrl(options.initialUrl, options.fetchOptions, true);\r\n }\r\n }, [options?.initialUrl, options?.fetchOptions, loadFromUrl]);\r\n\r\n return {\r\n blocks,\r\n refs,\r\n focusedBlockId,\r\n showSuggestions,\r\n showExtensionSuggestions,\r\n characterExtensions,\r\n locations,\r\n characters,\r\n sceneNumbers,\r\n isLoading,\r\n handleBlockTextChange,\r\n handleSceneTypeChange,\r\n handleTimeOfDayChange,\r\n handleBlockTypeChange,\r\n handleSelectCharacterExtension,\r\n handleKeyDown,\r\n handleScriptImport,\r\n handleSceneNumberChange,\r\n handleFocus,\r\n handleBlur,\r\n handleEnhance: async (block: Block) => {\r\n if (isEnhancing || enhancingBlockId || !options?.enhanceContentUrl)\r\n return;\r\n setEnhancingBlockId(block.id);\r\n setIsEnhancing(true);\r\n setEnhancementSuggestion(null);\r\n\r\n try {\r\n const res = await fetch(options?.enhanceContentUrl, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify({\r\n mode: block.type.toLowerCase(),\r\n script: block.text,\r\n language: \"English\",\r\n }),\r\n });\r\n\r\n const data = await res.json();\r\n const content = data.data;\r\n\r\n setEnhancementSuggestion(content);\r\n } catch (error) {\r\n console.error(\"Failed to enhance block:\", error);\r\n if (error) {\r\n setIsEnhancing(false);\r\n }\r\n } finally {\r\n setIsEnhancing(false);\r\n }\r\n },\r\n handleApproveEnhance: () => {\r\n if (enhancingBlockId && enhancementSuggestion) {\r\n setBlocks((bs) =>\r\n ScreenplayService.updateBlock(\r\n bs,\r\n enhancingBlockId,\r\n \"text\",\r\n enhancementSuggestion,\r\n ),\r\n );\r\n // Sync DOM manually if needed, or let useEffect handle it\r\n }\r\n setEnhancingBlockId(null);\r\n setEnhancementSuggestion(null);\r\n },\r\n handleRejectEnhance: () => {\r\n setEnhancingBlockId(null);\r\n setEnhancementSuggestion(null);\r\n },\r\n enhancingBlockId,\r\n enhancementSuggestion,\r\n isEnhancing,\r\n hasUnsavedChanges,\r\n showUnsavedPopover,\r\n syncScreenplay,\r\n ignoreChanges,\r\n loadFromUrl,\r\n };\r\n}\r\n","import jsPDF from \"jspdf\";\r\nimport { Block } from \"../types/screenplay-editor.types\";\r\n\r\nexport const handleSaveAsPdf = (\r\n blocks: Block[],\r\n sceneNumbers: Record<string, string>,\r\n project_name?: string,\r\n) => {\r\n // 1. Blur active elements\r\n if (document.activeElement instanceof HTMLElement) {\r\n document.activeElement.blur();\r\n }\r\n\r\n // 2. Initialize PDF\r\n const doc = new jsPDF({\r\n orientation: \"portrait\",\r\n unit: \"mm\",\r\n format: \"letter\",\r\n });\r\n\r\n const FONT_SIZE = 12;\r\n const LINE_HEIGHT = 4.233;\r\n const PAGE_WIDTH = doc.internal.pageSize.getWidth();\r\n const PAGE_HEIGHT = doc.internal.pageSize.getHeight();\r\n\r\n const MARGIN_LEFT = 38.1;\r\n const MARGIN_RIGHT = 25.4;\r\n const MARGIN_TOP = 25.4;\r\n const MARGIN_BOTTOM = 25.4;\r\n\r\n const blockDimensions: Record<string, any> = {\r\n SCENE_HEADING: { indent: 0, width: 152.4, upper: true, bold: true },\r\n ACTION: { indent: 0, width: 152.4, upper: false, bold: false },\r\n CHARACTER: { indent: 50.8, width: 101.6, upper: true, bold: false },\r\n PARENTHETICAL: { indent: 38.1, width: 50.8, upper: false, bold: false },\r\n DIALOGUE: { indent: 25.4, width: 88.9, upper: false, bold: false },\r\n TRANSITION: {\r\n indent: 0,\r\n width: 152.4,\r\n upper: true,\r\n bold: false,\r\n align: \"right\",\r\n },\r\n GENERAL: { indent: 0, width: 152.4, upper: false, bold: false },\r\n };\r\n\r\n let y = MARGIN_TOP;\r\n let pageNumber = 1;\r\n\r\n const drawPageNumber = (num: number) => {\r\n if (num > 1) {\r\n doc.setFont(\"Courier\", \"normal\");\r\n doc.setFontSize(12);\r\n doc.text(`${num}.`, PAGE_WIDTH - MARGIN_RIGHT, 12.7, {\r\n align: \"right\",\r\n });\r\n }\r\n };\r\n\r\n // 4. Processing Blocks\r\n blocks.forEach((block: any, index: number) => {\r\n const config = blockDimensions[block.type] || blockDimensions.GENERAL;\r\n let text = block.text || \"\";\r\n\r\n if (config.upper) text = text.toUpperCase();\r\n if (block.type === \"SCENE_HEADING\") {\r\n text =\r\n `${block.sceneType || \"INT.\"} ${text} - ${block.timeOfDay || \"DAY\"}`.toUpperCase();\r\n }\r\n\r\n doc.setFont(\"Courier\", config.bold ? \"bold\" : \"normal\");\r\n doc.setFontSize(FONT_SIZE);\r\n\r\n const lines = doc.splitTextToSize(text, config.width);\r\n const blockHeight = lines.length * LINE_HEIGHT;\r\n\r\n // --- UPDATED SECTION: OVERFLOW LOGIC ONLY ---\r\n\r\n // We removed the isNewScene check.\r\n // Now it only breaks a page if the block exceeds the bottom margin.\r\n let safetyBuffer = 0;\r\n if (block.type === \"CHARACTER\") safetyBuffer = LINE_HEIGHT * 3;\r\n\r\n if (y + blockHeight + safetyBuffer > PAGE_HEIGHT - MARGIN_BOTTOM) {\r\n doc.addPage();\r\n pageNumber++;\r\n drawPageNumber(pageNumber);\r\n y = MARGIN_TOP;\r\n\r\n doc.setFont(\"Courier\", config.bold ? \"bold\" : \"normal\");\r\n doc.setFontSize(FONT_SIZE);\r\n }\r\n\r\n // 6. Vertical Spacing\r\n if (y > MARGIN_TOP) {\r\n if (\r\n block.type === \"SCENE_HEADING\" ||\r\n block.type === \"ACTION\" ||\r\n block.type === \"CHARACTER\"\r\n ) {\r\n y += LINE_HEIGHT;\r\n }\r\n }\r\n\r\n // 7. Actual Rendering\r\n const xPos = MARGIN_LEFT + config.indent;\r\n if (config.align === \"right\") {\r\n doc.text(lines, PAGE_WIDTH - MARGIN_RIGHT, y, { align: \"right\" });\r\n } else {\r\n doc.text(lines, xPos, y);\r\n }\r\n\r\n // Scene Numbers\r\n if (block.type === \"SCENE_HEADING\" && sceneNumbers?.[block.id]) {\r\n const sNum = String(sceneNumbers[block.id]);\r\n doc.setFont(\"Courier\", \"normal\");\r\n doc.setFontSize(FONT_SIZE);\r\n doc.text(sNum, MARGIN_LEFT - 12, y);\r\n doc.text(sNum, PAGE_WIDTH - MARGIN_RIGHT + 5, y);\r\n doc.setFont(\"Courier\", config.bold ? \"bold\" : \"normal\");\r\n }\r\n\r\n y += blockHeight;\r\n });\r\n\r\n if (project_name) {\r\n doc.save(`${project_name}_${new Date().toISOString()}.pdf`);\r\n } else {\r\n doc.save(\"screenplay_export.pdf\");\r\n }\r\n};\r\n\r\nexport const convertBlocksToSbx = (\r\n blocks: Block[],\r\n sceneNumbers: Record<string, string>,\r\n): string => {\r\n const typeToDivClass: Record<string, string> = {\r\n SCENE_HEADING: \"divtype0\",\r\n ACTION: \"divtype2\",\r\n CHARACTER: \"divtype3\",\r\n PARENTHETICAL: \"divtype4\",\r\n DIALOGUE: \"divtype5\",\r\n TRANSITION: \"divtype6\",\r\n GENERAL: \"divtype2\",\r\n };\r\n\r\n return blocks\r\n .map((block: any) => {\r\n const divClass = typeToDivClass[block.type] || \"divtype2\";\r\n let text = block.text || \"\";\r\n let extraAttributes = \"\";\r\n\r\n if (block.type === \"SCENE_HEADING\") {\r\n text =\r\n `${block.sceneType || \"INT.\"} ${text} - ${block.timeOfDay || \"DAY\"}`.toUpperCase();\r\n const sceneNum = sceneNumbers?.[block.id];\r\n if (sceneNum) {\r\n extraAttributes = ` data-scene=\"${sceneNum}\"`;\r\n }\r\n } else if (block.type === \"CHARACTER\" || block.type === \"TRANSITION\") {\r\n text = text.toUpperCase();\r\n }\r\n\r\n return `<div class=\"${divClass}\" id=\"par${block.id}\"${extraAttributes}>${text}</div>`;\r\n })\r\n .join(\"\");\r\n};\r\n\r\nexport const handleSyncWithCloud = (\r\n blocks: Block[],\r\n sceneNumbers: Record<string, string>,\r\n onSaveAsSbx?: (file: File) => void,\r\n project_name?: string,\r\n) => {\r\n const sbxData = convertBlocksToSbx(blocks, sceneNumbers);\r\n\r\n const blob = new Blob([sbxData], { type: \"text/plain\" });\r\n\r\n // 1. Trigger a local download of the .sbx file\r\n // const url = URL.createObjectURL(blob);\r\n // const a = document.createElement(\"a\");\r\n // a.href = url;\r\n // a.download = \"screenplay.sbx\";\r\n // document.body.appendChild(a);\r\n // a.click();\r\n // document.body.removeChild(a);\r\n // URL.revokeObjectURL(url);\r\n\r\n // 2. Pass the binary file to the API function provided via props\r\n if (onSaveAsSbx) {\r\n if (project_name) {\r\n const file = new File(\r\n [blob],\r\n `${project_name}_${new Date().toISOString()}.sbx`,\r\n { type: \"text/plain\" },\r\n );\r\n onSaveAsSbx(file);\r\n } else {\r\n const file = new File([blob], \"screenplay.sbx\", { type: \"text/plain\" });\r\n onSaveAsSbx(file);\r\n }\r\n }\r\n};\r\n","import { ElementType } from \"react\";\r\nimport { Users, Box, Shirt, Car, MapPin, Map, UserPlus, Tags, Armchair } from \"lucide-react\";\r\n\r\nexport interface ScriptBreakdown {\r\n scene_number: string;\r\n content: string;\r\n}\r\n\r\nexport type ElementCategory =\r\n | \"CAST\"\r\n | \"PROP\"\r\n | \"COSTUME\"\r\n | \"VEHICLE\"\r\n | \"SET_PROP\"\r\n | \"EXTRA\"\r\n | \"LOCATION\"\r\n | \"SUBLOCATION\"\r\n | \"OTHER\";\r\nexport interface Tag {\r\n id?: string;\r\n scene_id?: string | number; // Optional, as it may not be set when creating a new tag\r\n block_id: string;\r\n category_id: ElementCategory;\r\n name: string;\r\n start_index: number;\r\n end_index: number;\r\n quantity?: number;\r\n look?: string;\r\n age?: string;\r\n created_at?: string;\r\n updated_at?: string;\r\n}\r\n\r\nexport const CATEGORIES: {\r\n id: ElementCategory;\r\n label: string;\r\n color: string;\r\n hex: string;\r\n icon: ElementType;\r\n}[] = [\r\n { id: \"CAST\", label: \"Cast\", color: \"#F97316\", hex: \"#FDBA74\", icon: Users },\r\n { id: \"PROP\", label: \"Prop\", color: \"#7C3AED\", hex: \"#C4B5FD\", icon: Box },\r\n { id: \"COSTUME\", label: \"Costume\", color: \"#DB2777\", hex: \"#F9A8D4\", icon: Shirt },\r\n { id: \"VEHICLE\", label: \"Vehicle\", color: \"#2563EB\", hex: \"#93C5FD\", icon: Car },\r\n { id: \"SET_PROP\", label: \"Set Prop\", color: \"#92400E\", hex: \"#FCD34D\", icon: Armchair },\r\n { id: \"EXTRA\", label: \"Extra\", color: \"#F59E0B\", hex: \"#FDE68A\", icon: UserPlus },\r\n { id: \"LOCATION\", label: \"Location\", color: \"#059669\", hex: \"#6EE7B7\", icon: MapPin },\r\n { id: \"SUBLOCATION\", label: \"Sublocation\", color: \"#65A30D\", hex: \"#BEF264\", icon: Map },\r\n // { id: \"OTHER\", label: \"Other\", color: \"#475569\", hex: \"#CBD5F5\", icon: Tags }\r\n];\r\n","import React from \"react\";\r\n\r\nconst CinemaAIIcon = ({ isProcessing }: { isProcessing?: boolean }) => {\r\n return (\r\n <div className=\"relative flex items-center justify-center w-[18px] h-[18px]\">\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n className={`w-full h-full stroke-[#1e769c] ${isProcessing ? \"animate-[spin_2s_linear_infinite]\" : \"\"}`}\r\n fill=\"none\"\r\n strokeWidth=\"1.75\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n {isProcessing ? (\r\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\r\n ) : (\r\n <>\r\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"2.5\" />\r\n <path d=\"M7 2v20\" />\r\n <path d=\"M17 2v20\" />\r\n <path d=\"M2 12h20\" />\r\n <path d=\"M2 7h5\" />\r\n <path d=\"M2 17h5\" />\r\n <path d=\"M17 17h5\" />\r\n <path d=\"M17 7h5\" />\r\n </>\r\n )}\r\n </svg>\r\n </div>\r\n );\r\n};\r\n\r\nconst SummarizeButton = ({\r\n onSummarize,\r\n isSummarizing,\r\n}: {\r\n onSummarize?: () => void;\r\n isSummarizing?: boolean;\r\n}) => {\r\n return (\r\n <button\r\n onClick={onSummarize}\r\n disabled={isSummarizing}\r\n className={`relative inline-flex items-center justify-center overflow-hidden px-7 py-3.5 rounded-[2.5rem] border outline-none transition-all duration-300 ease-out ${\r\n isSummarizing\r\n ? \"border-[#7acee6] bg-[#d5f1f8] cursor-wait shadow-[0_0_0_4px_#eefafd]\"\r\n : \"border-[#b0e3f1] bg-[#eefafd] cursor-pointer hover:border-[#7acee6] hover:bg-[#d5f1f8] hover:shadow-[0_8px_24px_-6px_rgba(32,146,186,0.18)] hover:-translate-y-[1px]\"\r\n }`}\r\n >\r\n <span\r\n className={`absolute inset-0 rounded-[inherit] ${\r\n isSummarizing\r\n ? \"bg-[linear-gradient(135deg,#d5f1f8_0%,#b0e3f1_100%)]\"\r\n : \"bg-[linear-gradient(135deg,#eefafd_0%,#d5f1f8_100%)]\"\r\n }`}\r\n />\r\n\r\n <span className=\"relative z-10 flex items-center gap-3\">\r\n <CinemaAIIcon isProcessing={isSummarizing} />\r\n\r\n <span className=\"flex flex-col items-start leading-none\">\r\n <span className=\"text-[13px] font-semibold text-[#1d5b79] tracking-[0.01em]\">\r\n {isSummarizing ? \"Analyzing Scene...\" : \"Summarize Scene\"}\r\n </span>\r\n <span\r\n className={`text-[9px] font-medium uppercase tracking-[0.12em] mt-1 ${\r\n isSummarizing ? \"text-[#2092ba]\" : \"text-[#3cafd4]\"\r\n }`}\r\n >\r\n {isSummarizing ? \"AI Engine Active\" : \"\"}\r\n </span>\r\n </span>\r\n </span>\r\n </button>\r\n );\r\n};\r\n\r\nexport default SummarizeButton;\r\n","\"use client\";\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { Block, blockStyles } from \"../types/screenplay-editor.types\";\r\nimport { Loader2, Tags, AlignLeft, ChevronDown, X } from \"lucide-react\";\r\nimport {\r\n ElementCategory,\r\n Tag,\r\n CATEGORIES,\r\n} from \"../types/script-breakdown.types\";\r\nimport SummarizeButton from \"../components/summarize-button\";\r\n\r\nexport function ScriptBreakdownSceneView({\r\n blocks,\r\n characters,\r\n isLoading,\r\n sceneNumber,\r\n tags,\r\n selectionMenu,\r\n handleMouseUp,\r\n addTag,\r\n updateTag,\r\n removeTag,\r\n clearSelection,\r\n menuPlacement,\r\n menuRef,\r\n sceneBrief,\r\n setSceneBrief,\r\n onSummarize,\r\n isSummarizing,\r\n aiSummarized = false,\r\n onUpdateBrief,\r\n}: {\r\n blocks: Block[];\r\n characters: string[];\r\n isLoading: boolean;\r\n sceneNumber: string;\r\n tags: Tag[];\r\n selectionMenu: {\r\n blockId: string;\r\n startIndex: number;\r\n endIndex: number;\r\n text: string;\r\n top: number;\r\n left: number;\r\n } | null;\r\n handleMouseUp: () => void;\r\n addTag: (c: ElementCategory) => void;\r\n updateTag?: (\r\n id: string,\r\n categoryId?: ElementCategory | null,\r\n details?: Partial<Tag>,\r\n ) => void;\r\n removeTag: (e: React.MouseEvent, id?: string) => void;\r\n clearSelection: () => void;\r\n menuPlacement: \"top\" | \"bottom\";\r\n menuRef: React.RefObject<HTMLDivElement | null>;\r\n sceneBrief: string;\r\n setSceneBrief: (brief: string) => void;\r\n onSummarize?: () => void;\r\n isSummarizing?: boolean;\r\n aiSummarized?: boolean;\r\n onUpdateBrief?: () => void;\r\n}) {\r\n const [expandedCategories, setExpandedCategories] = useState<\r\n Record<string, boolean>\r\n >({});\r\n const [editingTagData, setEditingTagData] = useState<{\r\n tag: Tag;\r\n catId: ElementCategory;\r\n catColor: string;\r\n rect: DOMRect;\r\n } | null>(null);\r\n const [tagForm, setTagForm] = useState<{\r\n quantity: number;\r\n look: string;\r\n age: string;\r\n }>({ quantity: 1, look: \"\", age: \"\" });\r\n const [popupPlacement, setPopupPlacement] = useState({\r\n alignRight: false,\r\n alignBottom: false,\r\n });\r\n const [isSidebarOpen, setIsSidebarOpen] = useState(false);\r\n const COURIER_STACK = \"'Courier Prime', 'Courier', monospace\";\r\n\r\n useEffect(() => {\r\n const fontId = \"google-font-courier-prime\";\r\n const styleId = \"screenplay-editor-force-v4\";\r\n\r\n // 1. Inject Google Font\r\n if (!document.getElementById(fontId)) {\r\n const link = document.createElement(\"link\");\r\n link.id = fontId;\r\n link.rel = \"stylesheet\";\r\n link.href =\r\n \"https://fonts.googleapis.com/css2?family=Courier+Prime:ital,wght@0,400;0,700;1,400;1,700&display=swap\";\r\n document.head.appendChild(link);\r\n }\r\n\r\n // 2. Inject high-specificity CSS (Safe textContent approach)\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement(\"style\");\r\n style.id = styleId;\r\n style.textContent = `\r\n /* We target by the data-attribute to ensure the highest specificity possible */\r\n [data-screenplay-editor] *, \r\n [data-screenplay-editor] div, \r\n [data-screenplay-editor] span, \r\n [data-screenplay-editor] [contenteditable=\"true\"] {\r\n font-family: ${COURIER_STACK} !important;\r\n -webkit-font-smoothing: antialiased;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }\r\n }, [COURIER_STACK]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-32 gap-4\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-zinc-400\" />\r\n <p className=\"text-sm font-medium text-zinc-500 animate-pulse\">\r\n Loading scene details...\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n const hasLocationTag = tags.some((t) => t.category_id === \"LOCATION\");\r\n\r\n const renderBlockText = (block: Block) => {\r\n const blockTags = tags\r\n .filter((t) => t.block_id === block.id)\r\n .sort((a, b) => a.start_index - b.start_index);\r\n\r\n if (blockTags.length === 0) return block.text;\r\n\r\n const nodes = [];\r\n let currentIndex = 0;\r\n\r\n blockTags.forEach((tag) => {\r\n // Defensively prevent regressing indexes if tags overlap\r\n const actualStart = Math.max(tag.start_index, currentIndex);\r\n\r\n if (actualStart > currentIndex) {\r\n nodes.push(\r\n <span key={`text-${currentIndex}`}>\r\n {block.text.slice(currentIndex, actualStart)}\r\n </span>,\r\n );\r\n }\r\n\r\n const category = CATEGORIES.find((c) => c.id === tag.category_id);\r\n if (actualStart < tag.end_index) {\r\n nodes.push(\r\n <span\r\n key={tag.id || `tag-${actualStart}-${tag.end_index}`}\r\n title={`${category?.label} (Click to edit)`}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n const selection = window.getSelection();\r\n if (!selection) return;\r\n const range = document.createRange();\r\n\r\n // Select the inner text node so the range offset reflects the text length\r\n // rather than the child node count (which was causing the 1-character bug)\r\n const textNode = e.currentTarget.firstChild;\r\n if (textNode && textNode.nodeType === Node.TEXT_NODE) {\r\n range.selectNodeContents(textNode);\r\n } else {\r\n range.selectNodeContents(e.currentTarget);\r\n }\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n setTimeout(() => handleMouseUp(), 0);\r\n }}\r\n className=\"cursor-pointer font-bold transition-all hover:opacity-80 rounded-[3px]\"\r\n style={{\r\n color: category?.color,\r\n padding: \"0.125rem 0.25rem\",\r\n margin: \"0 -0.125rem\",\r\n }}\r\n >\r\n {block.text.slice(actualStart, tag.end_index)}\r\n </span>,\r\n );\r\n }\r\n\r\n currentIndex = Math.max(currentIndex, tag.end_index);\r\n });\r\n\r\n if (currentIndex < block.text.length) {\r\n nodes.push(\r\n <span key={`text-${currentIndex}`}>\r\n {block.text.slice(currentIndex)}\r\n </span>,\r\n );\r\n }\r\n\r\n return nodes;\r\n };\r\n\r\n return (\r\n <div className=\"relative p-8 md:p-12 mx-auto w-full min-h-screen flex flex-col gap-8 xl:pr-[20rem]\">\r\n <div className=\"flex items-center justify-center max-w-6xl xl:max-w-full\">\r\n <div className=\"flex flex-col gap-4 min-h-screen\">\r\n <div\r\n className=\"relative bg-[#fdfdfc] shadow-md shadow-zinc-300/60 border border-zinc-100 rounded-sm md:rounded-md pl-[1.5in] py-[1in] pr-[1in] flex flex-col w-[210mm] min-h-auto shrink-0\"\r\n style={{\r\n fontFamily: COURIER_STACK,\r\n paddingLeft: \"1.5in\",\r\n paddingRight: \"1in\",\r\n paddingTop: \"1in\",\r\n paddingBottom: \"1in\",\r\n lineHeight: \"1.2\",\r\n }}\r\n data-screenplay-editor=\"true\"\r\n onMouseUp={handleMouseUp}\r\n >\r\n {blocks.map((block) => (\r\n <div\r\n key={block.id}\r\n data-block-id={block.id}\r\n className={`relative break-words w-full px-4 py-2 ${blockStyles[block.type].className}`}\r\n style={{\r\n ...blockStyles[block.type].inputStyle,\r\n minHeight: \"2.5rem\",\r\n }}\r\n >\r\n {renderBlockText(block)}\r\n\r\n {selectionMenu?.blockId === block.id && (\r\n <div\r\n ref={menuRef}\r\n data-screenplay-editor=\"false\"\r\n className={`tag-menu absolute z-50 bg-white/70 backdrop-blur-2xl shadow-[0_10px_40px_rgb(0,0,0,0.06)] border border-white rounded-[1.5rem] p-2 flex flex-col w-56 animate-in fade-in zoom-in-95 duration-300 ease-out ${menuPlacement === \"top\" ? \"origin-bottom\" : \"origin-top\"}`}\r\n style={{\r\n top: selectionMenu.top,\r\n left: selectionMenu.left,\r\n transform:\r\n menuPlacement === \"top\"\r\n ? \"translate(-50%, calc(-100% - 12px))\"\r\n : \"translate(-50%, 32px)\",\r\n }}\r\n >\r\n <div className=\"relative z-10 px-3 py-2.5 border-b border-white/60 mb-1.5\">\r\n <p className=\"text-[9px] font-extrabold tracking-[0.2em] text-slate-400 uppercase mb-1\">\r\n Tag Element\r\n </p>\r\n <p\r\n className=\"text-xs font-bold text-slate-700 truncate drop-shadow-sm\"\r\n title={selectionMenu.text}\r\n >\r\n \"{selectionMenu.text}\"\r\n </p>\r\n </div>\r\n <div className=\"relative z-10 flex flex-col gap-1\">\r\n {CATEGORIES.filter(\r\n (cat) =>\r\n !(cat.id === \"LOCATION\" && hasLocationTag) &&\r\n !(cat.id === \"SUBLOCATION\" && !hasLocationTag),\r\n ).map((cat) => (\r\n <button\r\n key={cat.id}\r\n onClick={() => {\r\n const existingTag = tags.find(\r\n (t) =>\r\n t.block_id === block.id &&\r\n t.start_index === selectionMenu.startIndex &&\r\n t.end_index === selectionMenu.endIndex,\r\n );\r\n if (existingTag && existingTag.id) {\r\n updateTag?.(existingTag.id, cat.id);\r\n } else {\r\n addTag(cat.id);\r\n }\r\n }}\r\n className=\"group w-full text-[12px] font-bold px-3 py-2 rounded-xl transition-all duration-300 text-left flex items-center justify-between hover:bg-white/80 hover:shadow-[0_2px_10px_rgb(0,0,0,0.02)] active:scale-[0.98]\"\r\n style={{ color: cat.color }}\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n <cat.icon\r\n className=\"w-4 h-4 group-hover:scale-110 transition-transform duration-300\"\r\n style={{ color: cat.color }}\r\n />\r\n {cat.label}\r\n </div>\r\n <span className=\"text-[10px] font-bold text-slate-400 opacity-0 group-hover:opacity-100 transition-all duration-300 translate-x-1 group-hover:translate-x-0\">\r\n Select\r\n </span>\r\n </button>\r\n ))}\r\n\r\n {tags.some(\r\n (t) =>\r\n t.block_id === block.id &&\r\n t.start_index === selectionMenu.startIndex &&\r\n t.end_index === selectionMenu.endIndex,\r\n ) && (\r\n <div className=\"mt-1 pt-1 border-t border-white/60\">\r\n <button\r\n onClick={(e) => {\r\n const tagToRemove = tags.find(\r\n (t) =>\r\n t.block_id === block.id &&\r\n t.start_index === selectionMenu.startIndex &&\r\n t.end_index === selectionMenu.endIndex,\r\n );\r\n if (tagToRemove) {\r\n removeTag(e, tagToRemove.id);\r\n clearSelection();\r\n }\r\n }}\r\n className=\"group w-full text-[12px] font-bold px-3 py-2 rounded-xl transition-all duration-300 text-left flex items-center justify-between hover:bg-rose-50 hover:text-rose-600 hover:shadow-[0_2px_10px_rgb(225,29,72,0.04)] active:scale-[0.98] text-slate-500 border border-transparent hover:border-rose-100\"\r\n >\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-2 h-2 rounded-full shadow-sm bg-rose-400 group-hover:scale-125 transition-transform duration-300\" />\r\n Remove Tag\r\n </div>\r\n <span className=\"text-[10px] font-bold text-rose-400 opacity-0 group-hover:opacity-100 transition-all duration-300 translate-x-1 group-hover:translate-x-0\">\r\n Remove\r\n </span>\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n\r\n <div className=\"relative bg-[#fdfdfc] shadow-md shadow-zinc-300/60 border border-zinc-100 rounded-sm md:rounded-md flex flex-col w-[210mm] shrink-0 p-8 md:p-12 lg:p-16\">\r\n <h3 className=\"text-xs font-extrabold text-slate-800 uppercase tracking-[0.25em] mb-6 flex items-center gap-3 font-sans\">\r\n <span className=\"flex items-center justify-center w-8 h-8 rounded-full bg-slate-100/80 shadow-inner border border-slate-200/50\">\r\n <AlignLeft className=\"w-3.5 h-3.5 text-slate-500\" />\r\n </span>\r\n Scene Brief\r\n </h3>\r\n <div className=\"relative bg-zinc-50/50 border border-zinc-200/60 rounded-xl p-4 md:p-6 shadow-inner focus-within:bg-white focus-within:border-zinc-300 focus-within:shadow-[0_8px_30px_rgb(0,0,0,0.04)] transition-all duration-300\">\r\n <textarea\r\n value={sceneBrief}\r\n onChange={(e) => setSceneBrief(e.target.value)}\r\n placeholder=\"Write a brief description or notes for this scene...\"\r\n className=\"w-full min-h-[120px] bg-transparent outline-none resize-y text-zinc-700 placeholder:text-zinc-400 text-sm md:text-base custom-scrollbar font-sans select-none\"\r\n style={{\r\n lineHeight: \"1.6\",\r\n }}\r\n />\r\n <div className=\"mt-4 flex justify-end\">\r\n <button\r\n onClick={onUpdateBrief}\r\n disabled={!sceneBrief || sceneBrief.trim() === \"\"}\r\n className=\"rounded-full bg-[#15607b] px-6 py-3 text-[13px] font-semibold tracking-wide text-white shadow-md transition-all hover:bg-[#134a61] hover:shadow-lg active:scale-95 disabled:bg-gray-200 disabled:cursor-not-allowed disabled:opacity-95 disabled:text-black disabled:shadow-none\"\r\n >\r\n Update\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <button\r\n onClick={() => setIsSidebarOpen(true)}\r\n className=\"fixed bottom-6 right-6 z-40 flex h-14 w-14 items-center justify-center rounded-full bg-[#15607b] text-white shadow-[0_8px_30px_rgba(21,96,123,0.3)] transition-transform hover:scale-105 active:scale-95 xl:hidden\"\r\n >\r\n <Tags className=\"h-6 w-6\" />\r\n {tags.length > 0 && (\r\n <span className=\"absolute -top-1 -right-1 flex h-5 w-5 items-center justify-center rounded-full bg-rose-500 text-[10px] font-bold text-white shadow-sm border-2 border-white\">\r\n {tags.length}\r\n </span>\r\n )}\r\n </button>\r\n\r\n {isSidebarOpen && (\r\n <div\r\n className=\"fixed inset-0 z-40 bg-slate-900/20 backdrop-blur-sm transition-opacity xl:hidden\"\r\n onClick={() => setIsSidebarOpen(false)}\r\n />\r\n )}\r\n <div\r\n className={`fixed xl:absolute top-0 right-0 z-50 h-full w-72 transform transition-transform duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] xl:translate-x-0 ${\r\n isSidebarOpen\r\n ? \"translate-x-0 shadow-[0_0_40px_rgba(0,0,0,0.1)]\"\r\n : \"translate-x-full\"\r\n }`}\r\n >\r\n <div className=\"sticky top-0 flex h-[100dvh] max-h-screen w-full flex-col border-l border-l-[#eefafd] bg-white p-3 py-5\">\r\n {!aiSummarized && (\r\n <SummarizeButton\r\n isSummarizing={isSummarizing}\r\n onSummarize={onSummarize}\r\n />\r\n )}\r\n <div className=\"relative flex flex-col gap-3 py-5 my-5 border-t border-t-[#eefafd] flex-1 overflow-hidden\">\r\n <div className=\"relative flex items-center justify-between mb-6 shrink-0\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"relative flex h-8 w-8 items-center justify-center rounded-[10px] border border-[#15607b]/20 bg-white shadow-sm\">\r\n <Tags className=\"h-4 w-4 text-[#15607b]\" />\r\n </div>\r\n <h3 className=\"text-[12px] font-semibold uppercase tracking-[0.28em] text-[#134a61]\">\r\n Breakdown\r\n </h3>\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"rounded-full border border-slate-200/60 bg-slate-50 px-2.5 py-1 text-[11px] font-semibold text-[#134a61] shadow-sm backdrop-blur-md\">\r\n {tags.length}\r\n </span>\r\n </div>\r\n </div>\r\n <div className=\"flex flex-col gap-4 overflow-y-auto overflow-x-hidden pb-4 pr-1 custom-scrollbar\">\r\n {CATEGORIES.map((cat) => {\r\n const catTags = tags.filter((t) => t.category_id === cat.id);\r\n if (!catTags.length) return null;\r\n\r\n const isExpanded = expandedCategories[cat.id];\r\n\r\n const uniqueTags = Array.from(\r\n new Map(\r\n catTags.map((tag) => [tag.name.toLowerCase(), tag]),\r\n ).values(),\r\n );\r\n\r\n return (\r\n <div key={cat.id} className=\"relative\">\r\n <div\r\n onClick={() =>\r\n setExpandedCategories((prev) => ({\r\n [cat.id]: !prev[cat.id],\r\n }))\r\n }\r\n className=\"group relative flex cursor-pointer items-center gap-3 overflow-hidden rounded-[24px] border border-white/70 px-4 py-3.5 transition-all duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] hover:-translate-y-[1px]\"\r\n style={{\r\n background: `linear-gradient(135deg, rgba(255,255,255,0.92), ${cat.hex}18)`,\r\n boxShadow: `0 16px 36px ${cat.hex}14, inset 0 1px 0 rgba(255,255,255,0.9)`,\r\n border: `1px solid ${cat.hex}50`,\r\n }}\r\n >\r\n <div\r\n className=\"absolute inset-0 opacity-0 transition-opacity duration-300 group-hover:opacity-100\"\r\n style={{\r\n background: `radial-gradient(circle at 15% 20%, ${cat.hex}24, transparent 38%)`,\r\n }}\r\n />\r\n\r\n <div\r\n className=\"relative flex h-9 w-9 shrink-0 items-center justify-center rounded-xl border border-white/70 backdrop-blur-md\"\r\n style={{\r\n background: `linear-gradient(135deg, ${cat.color}22, rgba(255,255,255,0.75))`,\r\n boxShadow: `0 10px 22px ${cat.color}14`,\r\n }}\r\n >\r\n <cat.icon className=\"h-4 w-4\" color={cat.color} />\r\n </div>\r\n\r\n <span\r\n className=\"relative text-[13px] font-semibold tracking-[0.01em]\"\r\n style={{ color: cat.color }}\r\n >\r\n {cat.label}\r\n </span>\r\n\r\n <span className=\"relative ml-auto rounded-full border border-white/70 bg-white/75 px-2.5 py-1 text-[11px] font-semibold text-[#456575] backdrop-blur-md\">\r\n {catTags.length}\r\n </span>\r\n\r\n <ChevronDown\r\n className={`relative h-4 w-4 transition-transform duration-500 ease-[cubic-bezier(0.22,1,0.36,1)] ${\r\n isExpanded ? \"rotate-180\" : \"\"\r\n }`}\r\n style={{ color: cat.color }}\r\n />\r\n </div>\r\n\r\n <div\r\n className={`grid transition-all duration-500 ease-[cubic-bezier(0.22,1,0.36,1)] ${\r\n isExpanded\r\n ? \"grid-rows-[1fr] opacity-100 mt-3\"\r\n : \"grid-rows-[0fr] opacity-0\"\r\n }`}\r\n >\r\n <div className=\"overflow-hidden\">\r\n <div className=\"flex flex-wrap justify-start gap-2 py-2\">\r\n {uniqueTags.map((tag, index) => (\r\n <div\r\n key={index}\r\n className=\"relative flex flex-col items-start\"\r\n >\r\n <span\r\n title={tag.name}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n if (\r\n cat.id !== \"PROP\" &&\r\n cat.id !== \"SET_PROP\" &&\r\n cat.id !== \"CAST\"\r\n )\r\n return;\r\n if (editingTagData?.tag.id === tag.id) {\r\n setEditingTagData(null);\r\n } else {\r\n const rect =\r\n e.currentTarget.getBoundingClientRect();\r\n setPopupPlacement({\r\n alignRight:\r\n rect.left > window.innerWidth - 240,\r\n alignBottom:\r\n rect.bottom >\r\n window.innerHeight - 250,\r\n });\r\n setTagForm({\r\n quantity: tag.quantity || 1,\r\n look: tag.look || \"\",\r\n age: tag.age || \"\",\r\n });\r\n setEditingTagData({\r\n tag,\r\n catId: cat.id,\r\n catColor: cat.color,\r\n rect,\r\n });\r\n }\r\n }}\r\n className={`inline-block max-w-full truncate text-[11px] font-semibold px-3 py-1.5 rounded-full border backdrop-blur-md transition-all duration-300 ${cat.id === \"PROP\" || cat.id === \"SET_PROP\" || cat.id === \"CAST\" ? \"cursor-pointer hover:scale-105 shadow-sm\" : \"\"}`}\r\n style={{\r\n color: cat.color,\r\n background: `linear-gradient(145deg, ${cat.color}18, rgba(255,255,255,0.88))`,\r\n borderColor: `${cat.color}28`,\r\n }}\r\n >\r\n {tag.name}\r\n {(cat.id === \"PROP\" ||\r\n cat.id === \"SET_PROP\") &&\r\n tag.quantity &&\r\n tag.quantity > 1 ? (\r\n <span className=\"ml-1.5 opacity-80 font-bold\">\r\n x{tag.quantity}\r\n </span>\r\n ) : null}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {editingTagData && (\r\n <>\r\n <div\r\n className=\"fixed inset-0 z-[100]\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setEditingTagData(null);\r\n }}\r\n />\r\n <div\r\n className={`p-3.5 bg-white/90 backdrop-blur-2xl rounded-[1.25rem] shadow-[0_10px_40px_rgb(0,0,0,0.12)] border border-white/60 z-[101] w-56 animate-in fade-in zoom-in-95 duration-200 ease-out fixed`}\r\n style={{\r\n top: popupPlacement.alignBottom\r\n ? \"auto\"\r\n : editingTagData.rect.bottom + 8,\r\n bottom: popupPlacement.alignBottom\r\n ? window.innerHeight - editingTagData.rect.top + 8\r\n : \"auto\",\r\n left: popupPlacement.alignRight\r\n ? \"auto\"\r\n : editingTagData.rect.left,\r\n right: popupPlacement.alignRight\r\n ? window.innerWidth - editingTagData.rect.right\r\n : \"auto\",\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"flex justify-between items-center mb-3 border-b border-slate-100 pb-2.5\">\r\n <span className=\"text-[10px] font-extrabold text-slate-400 uppercase tracking-widest drop-shadow-sm\">\r\n Details\r\n </span>\r\n <button\r\n onClick={() => setEditingTagData(null)}\r\n className=\"hover:bg-slate-100/80 p-1.5 rounded-full transition-colors active:scale-95\"\r\n >\r\n <X className=\"w-3.5 h-3.5 text-slate-500\" />\r\n </button>\r\n </div>\r\n {(editingTagData.catId === \"PROP\" ||\r\n editingTagData.catId === \"SET_PROP\") && (\r\n <div className=\"flex flex-col gap-1.5\">\r\n <label className=\"text-[11px] font-bold text-slate-600 ml-1\">\r\n Quantity\r\n </label>\r\n <input\r\n type=\"number\"\r\n min=\"1\"\r\n value={tagForm.quantity}\r\n onChange={(e) => {\r\n const val = Math.max(1, parseInt(e.target.value) || 1);\r\n setTagForm((prev) => ({\r\n ...prev,\r\n quantity: val,\r\n }));\r\n }}\r\n className=\"w-full text-[13px] px-3 py-2 rounded-xl border border-slate-200/80 outline-none focus:border-[#15607b] focus:ring-2 focus:ring-[#15607b]/20 transition-all bg-slate-50/50 focus:bg-white font-semibold text-slate-700\"\r\n />\r\n </div>\r\n )}\r\n {editingTagData.catId === \"CAST\" && (\r\n <div className=\"flex flex-col gap-3\">\r\n <div className=\"flex flex-col gap-1.5\">\r\n <label className=\"text-[11px] font-bold text-slate-600 ml-1\">\r\n Look\r\n </label>\r\n <input\r\n type=\"text\"\r\n placeholder=\"e.g. Dirty, Formal\"\r\n value={tagForm.look}\r\n onChange={(e) => {\r\n setTagForm((prev) => ({\r\n ...prev,\r\n look: e.target.value,\r\n }));\r\n }}\r\n className=\"w-full text-[13px] px-3 py-2 rounded-xl border border-slate-200/80 outline-none focus:border-[#15607b] focus:ring-2 focus:ring-[#15607b]/20 transition-all bg-slate-50/50 focus:bg-white font-semibold text-slate-700 placeholder:text-slate-400 placeholder:font-normal\"\r\n />\r\n </div>\r\n <div className=\"flex flex-col gap-1.5\">\r\n <label className=\"text-[11px] font-bold text-slate-600 ml-1\">\r\n Age\r\n </label>\r\n <input\r\n type=\"number\"\r\n min=\"0\"\r\n max=\"100\"\r\n value={tagForm.age}\r\n onChange={(e) => {\r\n let val = parseInt(e.target.value);\r\n if (isNaN(val)) {\r\n setTagForm((prev) => ({\r\n ...prev,\r\n age: \"\",\r\n }));\r\n return;\r\n }\r\n val = Math.max(0, Math.min(100, val));\r\n setTagForm((prev) => ({\r\n ...prev,\r\n age: val.toString(),\r\n }));\r\n }}\r\n className=\"w-full text-[13px] px-3 py-2 rounded-xl border border-slate-200/80 outline-none focus:border-[#15607b] focus:ring-2 focus:ring-[#15607b]/20 transition-all bg-slate-50/50 focus:bg-white font-semibold text-slate-700\"\r\n />\r\n </div>\r\n </div>\r\n )}\r\n <div className=\"mt-4\">\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n if (editingTagData.tag.id) {\r\n updateTag?.(editingTagData.tag.id, editingTagData.catId, {\r\n ...(editingTagData.catId === \"PROP\" ||\r\n editingTagData.catId === \"SET_PROP\"\r\n ? { quantity: tagForm.quantity }\r\n : {}),\r\n ...(editingTagData.catId === \"CAST\"\r\n ? { look: tagForm.look, age: tagForm.age }\r\n : {}),\r\n });\r\n }\r\n setEditingTagData(null);\r\n }}\r\n className=\"w-full bg-[#15607b] hover:bg-[#134a61] text-white text-[12px] font-bold py-2.5 rounded-xl transition-all shadow-[0_4px_12px_rgba(21,96,123,0.2)] hover:shadow-[0_6px_16px_rgba(21,96,123,0.3)] active:scale-[0.98]\"\r\n >\r\n Update Details\r\n </button>\r\n </div>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\n// import useScriptBreakdown from \"./use-script-breakdown\";\r\nimport { Block, BlockType, uuid } from \"../types/screenplay-editor.types\";\r\nimport { ElementCategory, Tag } from \"../types/script-breakdown.types\";\r\n\r\nexport interface UseScriptBreakdownSceneOptions {\r\n scene_url: string;\r\n fetchOptions?: RequestInit;\r\n onAISummarize?: (scene: any) => void;\r\n onTagAdded?: (tag: Tag) => void;\r\n onTagsBulkAdded?: (tags: Tag[], summary?: string) => Promise<void>;\r\n onTagRemoved?: (tagId: string) => void;\r\n onTagUpdated?: (\r\n tagId: string,\r\n categoryId: ElementCategory | null,\r\n details?: Partial<Tag>,\r\n ) => void;\r\n preLoadedTags?: Tag[];\r\n preLoadedTagsLoading?: boolean;\r\n}\r\n\r\nexport function useScriptBreakdownScene(\r\n options: UseScriptBreakdownSceneOptions,\r\n) {\r\n // const { scenes, isLoading, error } = useScriptBreakdown({ scenes: [] });\r\n const [tags, setTags] = useState<Tag[]>(options.preLoadedTags || []);\r\n const [selectionMenu, setSelectionMenu] = useState<{\r\n blockId: string;\r\n startIndex: number;\r\n endIndex: number;\r\n text: string;\r\n top: number;\r\n left: number;\r\n } | null>(null);\r\n const autoTaggedSceneRef = useRef<string | null>(null);\r\n const [scene, setScene] = useState<any>(null);\r\n const [menuPlacement, setMenuPlacement] = useState<\"top\" | \"bottom\">(\"top\");\r\n const [sceneBrief, setSceneBrief] = useState<string>(\"\");\r\n const [isSummarizing, setIsSummarizing] = useState<boolean>(false);\r\n const [isLoading, setIsLoading] = useState<boolean>(true);\r\n const [error, setError] = useState<boolean>(false);\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n setIsLoading(true);\r\n const fetchScene = async () => {\r\n try {\r\n const response = await fetch(options.scene_url, options.fetchOptions);\r\n if (response.ok) {\r\n const text = await response.text();\r\n setScene({ content: text });\r\n } else {\r\n console.error(\"Failed to fetch scene:\", response);\r\n setError(true);\r\n }\r\n setIsLoading(false);\r\n } catch (error) {\r\n setError(true);\r\n setIsLoading(false);\r\n console.error(\"Error fetching scene:\", error);\r\n }\r\n };\r\n fetchScene();\r\n }, []);\r\n\r\n const blocks = useMemo(() => {\r\n if (!scene || !scene.content) return [];\r\n\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(scene.content, \"text/html\");\r\n const divs = Array.from(doc.querySelectorAll(\"div\"));\r\n const parsedBlocks: Block[] = [];\r\n\r\n const typeMap: Record<string, BlockType> = {\r\n divtype0: \"SCENE_HEADING\",\r\n divtype2: \"ACTION\",\r\n divtype3: \"CHARACTER\",\r\n divtype4: \"PARENTHETICAL\",\r\n divtype5: \"DIALOGUE\",\r\n divtype6: \"TRANSITION\",\r\n };\r\n\r\n divs.forEach((div) => {\r\n const divText = div.textContent?.trim() || \"\";\r\n if (!divText) return;\r\n\r\n let type: BlockType = \"ACTION\";\r\n for (const className of Array.from(div.classList)) {\r\n if (typeMap[className]) {\r\n type = typeMap[className];\r\n break;\r\n }\r\n }\r\n\r\n const idAttr = div.getAttribute(\"id\");\r\n const blockId =\r\n idAttr && idAttr.startsWith(\"par\")\r\n ? idAttr.substring(3)\r\n : idAttr || uuid();\r\n\r\n parsedBlocks.push({ id: blockId, type, text: divText });\r\n });\r\n\r\n return parsedBlocks;\r\n }, [scene]);\r\n\r\n const characters = useMemo(() => {\r\n const chars = blocks\r\n .filter((b) => b.type === \"CHARACTER\")\r\n .map((b) => {\r\n const text = b.text.trim().toUpperCase();\r\n const parenIndex = text.indexOf(\"(\");\r\n return parenIndex > -1 ? text.substring(0, parenIndex).trim() : text;\r\n })\r\n .filter(Boolean);\r\n\r\n return [...new Set(chars)];\r\n }, [blocks]);\r\n\r\n const handleAISummarize = async () => {\r\n setIsSummarizing(true);\r\n const res: any = await options.onAISummarize?.(scene.content);\r\n\r\n if (res.ok) {\r\n const data = await res.json();\r\n setIsSummarizing(false);\r\n\r\n let parsedData: any[] = [];\r\n let parsedSummaryData: any = {};\r\n\r\n try {\r\n const normalData = JSON.parse(data.data);\r\n if (Array.isArray(normalData)) {\r\n parsedData = Array.isArray(normalData[0]) ? normalData[0] : [];\r\n const summary = Array.isArray(normalData[1]) ? normalData[1] : [];\r\n parsedSummaryData = summary[0] || {};\r\n }\r\n } catch (error) {\r\n console.error(\"Error parsing AI summary data:\", error);\r\n }\r\n\r\n setSceneBrief(parsedSummaryData.summarise || \"\");\r\n\r\n const newTags: Tag[] = [];\r\n\r\n parsedData.forEach((aiTag: any) => {\r\n if (\r\n !aiTag.block_id ||\r\n !aiTag.category_id ||\r\n typeof aiTag.start_index !== \"number\" ||\r\n typeof aiTag.end_index !== \"number\"\r\n ) {\r\n return;\r\n }\r\n\r\n const newTag: Tag = {\r\n id: aiTag.id || uuid(),\r\n block_id: String(aiTag.block_id).startsWith(\"par\")\r\n ? String(aiTag.block_id).substring(3)\r\n : String(aiTag.block_id),\r\n category_id: aiTag.category_id,\r\n name: aiTag.name,\r\n start_index: aiTag.start_index,\r\n end_index: aiTag.end_index,\r\n };\r\n\r\n if (aiTag.category_id === \"PROP\" || aiTag.category_id === \"SET_PROP\") {\r\n newTag.quantity = 1;\r\n } else if (aiTag.category_id === \"CAST\") {\r\n newTag.look = \"\";\r\n newTag.age = \"\";\r\n }\r\n\r\n newTags.push(newTag);\r\n });\r\n\r\n if (newTags.length > 0) {\r\n const originalTags = tags;\r\n setTags((prev) => {\r\n const merged = [...prev];\r\n newTags.forEach((newTag) => {\r\n // Prevent overlapping tags\r\n const isOverlapping = merged.some(\r\n (t) =>\r\n t.block_id === newTag.block_id &&\r\n newTag.end_index > t.start_index &&\r\n newTag.start_index < t.end_index,\r\n );\r\n if (!isOverlapping) {\r\n merged.push(newTag);\r\n }\r\n });\r\n return merged;\r\n });\r\n\r\n try {\r\n if (options.onTagsBulkAdded) {\r\n await options.onTagsBulkAdded(newTags, parsedSummaryData.summarise);\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to bulk add AI-generated tags:\", error);\r\n setTags(originalTags);\r\n }\r\n }\r\n\r\n return data;\r\n } else {\r\n setIsSummarizing(false);\r\n console.error(\"Failed to summarize scene:\", res);\r\n }\r\n };\r\n\r\n const bulkCreateTags = useCallback(async () => {\r\n if (blocks.length === 0) return;\r\n\r\n const newTags: Tag[] = [];\r\n const seenCharacters = new Set<string>();\r\n const timeOfDays = [\"DAY\", \"NIGHT\"];\r\n const isTimeOfDay = (str: string) => timeOfDays.includes(str.toUpperCase());\r\n\r\n blocks.forEach((block) => {\r\n if (block.type === \"CHARACTER\") {\r\n const text = block.text.trim();\r\n const parenIndex = text.indexOf(\"(\");\r\n const charName =\r\n parenIndex > -1 ? text.substring(0, parenIndex).trim() : text;\r\n\r\n if (charName && !seenCharacters.has(charName.toUpperCase())) {\r\n seenCharacters.add(charName.toUpperCase());\r\n const startIndex = text.indexOf(charName);\r\n if (startIndex !== -1) {\r\n newTags.push({\r\n id: uuid(),\r\n block_id: block.id,\r\n category_id: \"CAST\" as unknown as ElementCategory,\r\n name: charName,\r\n start_index: startIndex,\r\n end_index: startIndex + charName.length,\r\n look: \"\",\r\n age: \"\",\r\n });\r\n }\r\n }\r\n } else if (block.type === \"SCENE_HEADING\") {\r\n const text = block.text.trim();\r\n const typeMatch = text.match(\r\n /^(INT\\/EXT|INT\\.?\\/EXT\\.?|INT\\.EXT\\.?|INT|EXT|I\\/E)\\.?\\s+/i,\r\n );\r\n let remainingText = text;\r\n let offset = 0;\r\n\r\n if (typeMatch) {\r\n offset = typeMatch[0].length;\r\n remainingText = text.substring(offset);\r\n }\r\n\r\n const parts = remainingText.split(/\\s+-\\s+/);\r\n if (parts.length > 0) {\r\n const locationName = parts[0].trim();\r\n const locStart = text.indexOf(locationName, offset);\r\n if (locStart !== -1 && locationName) {\r\n newTags.push({\r\n id: uuid(),\r\n block_id: block.id,\r\n category_id: \"LOCATION\" as unknown as ElementCategory,\r\n name: locationName,\r\n start_index: locStart,\r\n end_index: locStart + locationName.length,\r\n });\r\n }\r\n\r\n if (parts.length > 1) {\r\n const secondPart = parts[1].trim();\r\n const isLast = parts.length === 2;\r\n // Only treat the second part as sublocation if it's not the time of day\r\n if (!isLast || !isTimeOfDay(secondPart)) {\r\n const subLocStart = text.indexOf(\r\n secondPart,\r\n locStart + locationName.length,\r\n );\r\n if (subLocStart !== -1 && secondPart) {\r\n newTags.push({\r\n id: uuid(),\r\n block_id: block.id,\r\n category_id: \"SUBLOCATION\" as unknown as ElementCategory,\r\n name: secondPart,\r\n start_index: subLocStart,\r\n end_index: subLocStart + secondPart.length,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n if (newTags.length > 0) {\r\n const originalTags = tags;\r\n setTags((prev) => {\r\n const merged = [...prev];\r\n // Ensure characters are only highlighted once across both existing and new tags\r\n const existingChars = new Set(\r\n merged\r\n .filter(\r\n (t) =>\r\n t.category_id === (\"CHARACTER\" as unknown as ElementCategory) ||\r\n t.category_id === (\"CAST\" as unknown as ElementCategory),\r\n )\r\n .map((t) => t.name.toUpperCase()),\r\n );\r\n\r\n newTags.forEach((newTag) => {\r\n if (\r\n newTag.category_id === (\"CHARACTER\" as unknown as ElementCategory)\r\n ) {\r\n if (existingChars.has(newTag.name.toUpperCase())) return;\r\n existingChars.add(newTag.name.toUpperCase());\r\n }\r\n\r\n const isOverlapping = merged.some(\r\n (t) =>\r\n t.block_id === newTag.block_id &&\r\n newTag.end_index > t.start_index &&\r\n newTag.start_index < t.end_index,\r\n );\r\n if (!isOverlapping) {\r\n merged.push(newTag);\r\n }\r\n });\r\n return merged;\r\n });\r\n\r\n try {\r\n if (options.onTagsBulkAdded) {\r\n await options.onTagsBulkAdded(newTags);\r\n }\r\n } catch (error) {\r\n console.error(\"Failed to bulk create tags:\", error);\r\n setTags(originalTags);\r\n }\r\n }\r\n }, [blocks, tags, options.onTagsBulkAdded]);\r\n\r\n // Reset tags when scene changes to prevent stale tags between navigation\r\n useEffect(() => {\r\n setSceneBrief(\"\");\r\n autoTaggedSceneRef.current = null;\r\n }, [options.scene_url]);\r\n\r\n useEffect(() => {\r\n if (options.preLoadedTags && options.preLoadedTags.length > 0) {\r\n setTags((prev) => {\r\n if (JSON.stringify(prev) === JSON.stringify(options.preLoadedTags)) {\r\n return prev;\r\n }\r\n return options.preLoadedTags || [];\r\n });\r\n }\r\n }, [options.preLoadedTags]);\r\n\r\n useEffect(() => {\r\n const doBulkCreate = async () => {\r\n if (blocks.length === 0) return;\r\n\r\n if (options.preLoadedTagsLoading) return;\r\n\r\n if (autoTaggedSceneRef.current === options.scene_url) return;\r\n\r\n const hasPreloadedTags =\r\n options.preLoadedTags && options.preLoadedTags.length > 0;\r\n\r\n autoTaggedSceneRef.current = options.scene_url;\r\n\r\n if (hasPreloadedTags) return;\r\n\r\n await bulkCreateTags();\r\n };\r\n\r\n doBulkCreate();\r\n }, [\r\n blocks,\r\n options.scene_url,\r\n options.preLoadedTags,\r\n options.preLoadedTagsLoading,\r\n ]);\r\n\r\n const clearSelection = useCallback(() => {\r\n setSelectionMenu(null);\r\n window.getSelection()?.removeAllRanges();\r\n }, []);\r\n\r\n // Reset placement to default when selection closes\r\n useEffect(() => {\r\n if (!selectionMenu) {\r\n setMenuPlacement(\"top\");\r\n }\r\n }, [selectionMenu]);\r\n\r\n // Flip menu if it goes off screen\r\n useEffect(() => {\r\n if (selectionMenu && menuRef.current) {\r\n const rect = menuRef.current.getBoundingClientRect();\r\n if (menuPlacement === \"top\" && rect.top < 100) {\r\n setMenuPlacement(\"bottom\");\r\n } else if (\r\n menuPlacement === \"bottom\" &&\r\n rect.bottom > window.innerHeight - 40 &&\r\n rect.top > 300\r\n ) {\r\n setMenuPlacement(\"top\");\r\n }\r\n }\r\n }, [selectionMenu, menuPlacement]);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (selectionMenu && !(e.target as HTMLElement).closest(\".tag-menu\")) {\r\n clearSelection();\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, [selectionMenu, clearSelection]);\r\n\r\n const getAbsoluteOffset = (\r\n container: HTMLElement,\r\n targetNode: Node,\r\n targetOffset: number,\r\n ) => {\r\n let absoluteOffset = 0;\r\n let found = false;\r\n\r\n const traverse = (node: Node) => {\r\n if (found) return;\r\n if (node === targetNode) {\r\n absoluteOffset += targetOffset;\r\n found = true;\r\n return;\r\n }\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n absoluteOffset += node.nodeValue?.length || 0;\r\n } else {\r\n for (let i = 0; i < node.childNodes.length; i++) {\r\n traverse(node.childNodes[i]);\r\n if (found) return;\r\n }\r\n }\r\n };\r\n\r\n traverse(container);\r\n return found ? absoluteOffset : null;\r\n };\r\n\r\n const handleMouseUp = () => {\r\n const selection = window.getSelection();\r\n if (!selection || selection.isCollapsed || !selection.toString().trim())\r\n return;\r\n\r\n const range = selection.getRangeAt(0);\r\n let container = range.commonAncestorContainer as HTMLElement;\r\n if (container.nodeType === Node.TEXT_NODE)\r\n container = container.parentElement!;\r\n\r\n const blockElem = container.closest(\"[data-block-id]\") as HTMLElement;\r\n if (!blockElem) return;\r\n\r\n const blockId = blockElem.getAttribute(\"data-block-id\")!;\r\n const startOffset = getAbsoluteOffset(\r\n blockElem,\r\n range.startContainer,\r\n range.startOffset,\r\n );\r\n const endOffset = getAbsoluteOffset(\r\n blockElem,\r\n range.endContainer,\r\n range.endOffset,\r\n );\r\n\r\n if (startOffset !== null && endOffset !== null) {\r\n const rect = range.getBoundingClientRect();\r\n const blockRect = blockElem.getBoundingClientRect();\r\n setSelectionMenu({\r\n blockId,\r\n startIndex: Math.min(startOffset, endOffset),\r\n endIndex: Math.max(startOffset, endOffset),\r\n text: selection.toString().trim(),\r\n top: rect.top - blockRect.top,\r\n left: rect.left - blockRect.left + rect.width / 2,\r\n });\r\n }\r\n };\r\n\r\n const addTag = async (categoryId: ElementCategory) => {\r\n if (!selectionMenu) return;\r\n const newTag: Tag = {\r\n id: uuid(),\r\n block_id: selectionMenu.blockId,\r\n category_id: categoryId,\r\n name: selectionMenu.text,\r\n start_index: selectionMenu.startIndex,\r\n end_index: selectionMenu.endIndex,\r\n };\r\n\r\n if (categoryId === \"PROP\" || categoryId === \"SET_PROP\") {\r\n newTag.quantity = 1;\r\n } else if (categoryId === \"CAST\") {\r\n newTag.look = \"\";\r\n newTag.age = \"\";\r\n }\r\n\r\n // Optimistically update the UI\r\n setTags((prev) => {\r\n const filtered = prev.filter(\r\n (t) =>\r\n t.block_id !== newTag.block_id ||\r\n !(\r\n newTag.end_index > t.start_index && newTag.start_index < t.end_index\r\n ),\r\n );\r\n return [...filtered, newTag];\r\n });\r\n clearSelection();\r\n\r\n try {\r\n await options.onTagAdded?.(newTag);\r\n } catch (error) {\r\n console.error(\"Failed to add tag:\", error);\r\n // On failure, revert the optimistic update\r\n setTags((prev) => prev.filter((t) => t.id !== newTag.id));\r\n }\r\n };\r\n\r\n const removeTag = async (e: React.MouseEvent, id: string) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n const tagToRemove = tags.find((t) => t.id === id);\r\n if (!tagToRemove) return;\r\n\r\n // Optimistically remove the tag from the UI\r\n setTags((prev) => prev.filter((t) => t.id !== id));\r\n clearSelection();\r\n\r\n try {\r\n await options.onTagRemoved?.(id);\r\n } catch (error) {\r\n console.error(\"Failed to remove tag:\", error);\r\n // On failure, revert the optimistic update by adding the tag back\r\n setTags((prev) => [...prev, tagToRemove]);\r\n }\r\n };\r\n\r\n const updateTag = async (\r\n id: string,\r\n categoryId?: ElementCategory | null,\r\n details?: Partial<Tag>,\r\n ) => {\r\n const tagToUpdate = tags.find((t) => t.id === id);\r\n if (!tagToUpdate) return;\r\n\r\n const updatedFields: Partial<Tag> = { ...details };\r\n if (categoryId) {\r\n updatedFields.category_id = categoryId;\r\n if (categoryId === \"PROP\" || categoryId === \"SET_PROP\") {\r\n updatedFields.quantity = tagToUpdate.quantity ?? 1;\r\n } else if (categoryId === \"CAST\") {\r\n updatedFields.look = tagToUpdate.look ?? \"\";\r\n updatedFields.age = tagToUpdate.age ?? \"\";\r\n }\r\n }\r\n\r\n // Optimistically update the UI\r\n setTags((prev) =>\r\n prev.map((t) => {\r\n if (t.id === id) return { ...t, ...updatedFields };\r\n // Sync details across identically named tags in the same category\r\n if (\r\n details &&\r\n t.name === tagToUpdate.name &&\r\n t.category_id === tagToUpdate.category_id\r\n ) {\r\n return { ...t, ...details };\r\n }\r\n return t;\r\n }),\r\n );\r\n if (categoryId) clearSelection();\r\n\r\n try {\r\n await options.onTagUpdated?.(id, categoryId || null, details);\r\n } catch (error) {\r\n console.error(\"Failed to update tag:\", error);\r\n // On failure, revert the optimistic update\r\n setTags((prev) => prev.map((t) => (t.id === id ? tagToUpdate : t)));\r\n }\r\n };\r\n\r\n return {\r\n scene,\r\n blocks,\r\n characters,\r\n isLoading,\r\n error,\r\n tags,\r\n selectionMenu,\r\n handleMouseUp,\r\n addTag,\r\n updateTag,\r\n removeTag,\r\n clearSelection,\r\n menuPlacement,\r\n menuRef,\r\n sceneBrief,\r\n setSceneBrief,\r\n handleAISummarize,\r\n isSummarizing,\r\n };\r\n}\r\n","import { X } from \"lucide-react\";\r\nimport React, { useEffect } from \"react\";\r\n\r\nfunction ModalLayout({\r\n children,\r\n onClose,\r\n title,\r\n maxWidth = \"max-w-4xl\",\r\n menuRef,\r\n}: {\r\n children: React.ReactNode;\r\n onClose: () => void;\r\n title: string;\r\n maxWidth?: string;\r\n menuRef?: React.RefObject<HTMLDivElement | null>;\r\n}) {\r\n useEffect(() => {\r\n document.body.style.overflow = \"hidden\";\r\n return () => {\r\n document.body.style.overflow = \"\";\r\n };\r\n }, []);\r\n\r\n return (\r\n <div\r\n ref={menuRef}\r\n onClick={onClose}\r\n className=\"fixed inset-0 z-50 overflow-y-auto bg-black/40 backdrop-blur-xs\"\r\n data-lenis-prevent=\"true\"\r\n >\r\n <div className=\"flex min-h-full items-center justify-center p-4 sm:p-6\">\r\n <div\r\n onClick={(e) => e.stopPropagation()}\r\n className={`relative w-full ${maxWidth} bg-white rounded-3xl shadow-2xl transform transition-all duration-300 scale-100 opacity-100 animate-modal`}\r\n >\r\n <div className=\"flex items-center justify-between border-b border-gray-200 pb-3 pt-6 px-6\">\r\n <h2 className=\"text-xl sm:text-2xl font-medium text-blumine-600 line-clamp-1\">\r\n {title}\r\n </h2>\r\n <button\r\n onClick={onClose}\r\n className=\"w-10 h-10 flex items-center justify-center rounded-full border border-blumine-600 text-blumine-600 hover:bg-blumine-600/10 hover:rotate-90 transition-all duration-300\"\r\n aria-label=\"Close\"\r\n >\r\n <X size={20} />\r\n </button>\r\n </div>\r\n\r\n {children}\r\n </div>\r\n </div>\r\n\r\n <style>\r\n {`\r\n @keyframes modal {\r\n 0% {\r\n opacity: 0;\r\n transform: translateY(20px) scale(0.95);\r\n }\r\n 100% {\r\n opacity: 1;\r\n transform: translateY(0) scale(1);\r\n }\r\n }\r\n .animate-modal {\r\n animation: modal 0.3s ease-out forwards;\r\n }\r\n `}\r\n </style>\r\n </div>\r\n );\r\n}\r\n\r\nexport default ModalLayout;\r\n","import { ErrorMessage, Field, useFormikContext } from \"formik\";\r\nimport { AsteriskIcon } from \"lucide-react\";\r\nimport React from \"react\";\r\n\r\ninterface FormikSelectProps {\r\n label?: string;\r\n name: string;\r\n selectedOption: string;\r\n optionData?: Record<string, any>[];\r\n onChange?: (e: React.ChangeEvent<HTMLSelectElement>) => void;\r\n value?: string | number;\r\n disable?: boolean;\r\n divClasses?: string;\r\n valueProperty?: string;\r\n labelProperty?: string;\r\n label2propery?: string;\r\n brackets?: boolean;\r\n className?: string;\r\n enableRedAsterick?: boolean;\r\n disableOptionProperty?: string;\r\n disabledOptionText?: string;\r\n}\r\nexport const FormikSelect = ({\r\n label,\r\n name,\r\n selectedOption,\r\n optionData,\r\n value,\r\n disable,\r\n divClasses,\r\n valueProperty = \"name\",\r\n labelProperty = \"name\",\r\n label2propery,\r\n brackets,\r\n className,\r\n enableRedAsterick = false,\r\n disableOptionProperty = \"disable\",\r\n disabledOptionText = \"\",\r\n onChange,\r\n}: FormikSelectProps) => {\r\n return (\r\n <div className={`w-full ${divClasses}`}>\r\n {label && (\r\n <label className={`mb-1.5 text-sm font-medium text-slate-700 capitalize flex`}>\r\n {label}\r\n {enableRedAsterick && (\r\n <AsteriskIcon className=\"size-3 text-red-500\" />\r\n )}\r\n </label>\r\n )}\r\n <Field\r\n name={name}\r\n as=\"select\"\r\n value={value}\r\n disabled={disable}\r\n onChange={onChange}\r\n className={`${className} rounded-[2.5rem] block w-full px-3 py-2.5 text-slate-700 placeholder-slate-400 placeholder:capitalize bg-white border border-slate-300/80 focus:border-blumine-500 focus:ring-2 focus:ring-blumine-500/50 focus:outline-none transition-all`}\r\n >\r\n <option selected value=\"\" disabled className=\"capitalize\">\r\n {selectedOption}\r\n </option>\r\n {optionData?.map((option, index) => (\r\n <option\r\n key={index}\r\n value={option[valueProperty]}\r\n disabled={option[disableOptionProperty]}\r\n >\r\n {option[labelProperty]}\r\n {label2propery\r\n ? brackets\r\n ? ` (${option[label2propery]})`\r\n : option[label2propery]\r\n : \"\"}{\" \"}\r\n {option[disableOptionProperty] && `(${disabledOptionText})`}\r\n </option>\r\n ))}\r\n </Field>\r\n <ErrorMessage\r\n name={name}\r\n className=\"text-red-500 text-sm mt-1\"\r\n component=\"div\"\r\n />\r\n </div>\r\n );\r\n};\r\n\r\ninterface FormikInputProps {\r\n label: string;\r\n name: string;\r\n type: string;\r\n placeholder?: string;\r\n className?: string;\r\n labelClassName?: string;\r\n readOnly?: boolean;\r\n divClasses?: string;\r\n length?: number;\r\n disable?: boolean;\r\n min?: number;\r\n max?: number;\r\n convertToText?: boolean;\r\n enableRedAsterick?: boolean;\r\n case_sensitivity?: \"normal\" | \"lowercase\" | \"uppercase\";\r\n [key: string]: any;\r\n}\r\nexport const FormikInput = ({\r\n label,\r\n name,\r\n type,\r\n placeholder,\r\n className,\r\n labelClassName,\r\n readOnly,\r\n divClasses,\r\n length,\r\n disable,\r\n min = 0,\r\n max,\r\n convertToText = false,\r\n enableRedAsterick = false,\r\n case_sensitivity = \"normal\",\r\n ...props\r\n}: FormikInputProps) => {\r\n const { setFieldValue } = useFormikContext();\r\n\r\n const handleCaseChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n let value = e.target.value;\r\n\r\n if (type === \"number\" && min !== undefined) {\r\n if (value !== \"\" && Number(value) < min) return;\r\n }\r\n\r\n switch (case_sensitivity) {\r\n case \"lowercase\":\r\n value = value.toLowerCase();\r\n break;\r\n case \"uppercase\":\r\n value = value.toUpperCase();\r\n break;\r\n case \"normal\":\r\n default:\r\n break;\r\n }\r\n\r\n setFieldValue(name, value);\r\n };\r\n\r\n return (\r\n <div className={`w-full ${divClasses}`}>\r\n <label\r\n className={`${labelClassName} mb-1.5 text-sm font-medium text-slate-700 capitalize flex`}\r\n >\r\n {label}\r\n {enableRedAsterick && <AsteriskIcon className=\"size-3 text-red-500\" />}\r\n </label>\r\n <Field\r\n name={name}\r\n placeholder={placeholder}\r\n readOnly={readOnly}\r\n type={type}\r\n maxLength={length}\r\n disabled={disable}\r\n max={max}\r\n min={min}\r\n onChange={handleCaseChange}\r\n {...props}\r\n className={`${className} rounded-[2.5rem] block w-full px-3 py-2.5 text-slate-700 placeholder-slate-400 placeholder:capitalize bg-white border border-slate-300/80 focus:border-blumine-500 focus:ring-2 focus:ring-blumine-500/50 focus:outline-none transition-all disabled:opacity-70`}\r\n />\r\n\r\n <ErrorMessage\r\n name={name}\r\n className=\"text-red-500 text-sm mt-1\"\r\n component=\"div\"\r\n />\r\n </div>\r\n );\r\n};\r\n\r\ninterface FormikTextareaProps {\r\n label: string;\r\n name: string;\r\n placeholder?: string;\r\n readOnly?: boolean;\r\n divClasses?: string;\r\n className?: string;\r\n length?: number;\r\n disable?: boolean;\r\n min?: number;\r\n max?: number;\r\n enableRedAsterick?: boolean;\r\n}\r\nexport const FormikTextarea = ({\r\n label,\r\n name,\r\n placeholder,\r\n readOnly,\r\n divClasses = \"\",\r\n className = \"\",\r\n length,\r\n disable,\r\n min,\r\n max,\r\n enableRedAsterick = false,\r\n}: FormikTextareaProps) => {\r\n return (\r\n <div className={`w-full ${divClasses}`}>\r\n <label className={`mb-1.5 text-sm font-medium text-slate-700 capitalize flex`}>\r\n {label}\r\n {enableRedAsterick && <AsteriskIcon className=\"size-3 text-red-500\" />}\r\n </label>\r\n <Field\r\n as=\"textarea\"\r\n name={name}\r\n placeholder={placeholder}\r\n readOnly={readOnly}\r\n maxLength={length}\r\n disabled={disable}\r\n max={max}\r\n min={min}\r\n className={`${className} block w-full px-4 py-3 text-slate-700 placeholder-slate-400 placeholder:capitalize bg-white border border-slate-300/80 rounded-2xl focus:border-blumine-500 focus:ring-2 focus:ring-blumine-500/50 focus:outline-none transition-all disabled:opacity-70`}\r\n />\r\n <ErrorMessage\r\n name={name}\r\n className=\"text-red-500 text-sm mt-1\"\r\n component=\"div\"\r\n />\r\n </div>\r\n );\r\n};\r\n","export const shot_types = [\r\n { name: \"Extreme Close-Up (ECU)\" },\r\n { name: \"Extreme Close-Up 2-Shot\" },\r\n { name: \"Close-Up (CU)\" },\r\n { name: \"Close-Up 2-Shot\" },\r\n { name: \"Medium Close-Up (MCU)\" },\r\n { name: \"Medium Close-Up 2-Shot\" },\r\n { name: \"Medium Shot (MS)\" },\r\n { name: \"Medium Shot 2-Shot\" },\r\n { name: \"Medium Wide Shot (MWS)\" },\r\n { name: \"Medium Wide 2-Shot\" },\r\n { name: \"Wide Shot (WS)\" },\r\n { name: \"Wide Shot 2-Shot\" },\r\n { name: \"Extreme Wide Shot (EWS)\" },\r\n { name: \"Establishing Shot\" },\r\n { name: \"Over-the-Shoulder (OTS)\" },\r\n { name: \"Over-the-Shoulder 2-Shot\" },\r\n { name: \"Reverse Over-the-Shoulder\" },\r\n { name: \"Point of View (POV)\" },\r\n { name: \"Subjective POV\" },\r\n { name: \"Objective Shot\" },\r\n { name: \"Insert Shot\" },\r\n { name: \"Cutaway Shot\" },\r\n { name: \"Reaction Shot\" },\r\n { name: \"Profile Shot\" },\r\n { name: \"Profile 2-Shot\" },\r\n { name: \"Silhouette Shot\" },\r\n];\r\n\r\nexport const camera_angles = [\r\n { name: \"Eye Level\" },\r\n { name: \"Low Angle\" },\r\n { name: \"High Angle\" },\r\n { name: \"Bird’s Eye View (Top Shot)\" },\r\n { name: \"Worm’s Eye View (Ground Level)\" },\r\n { name: \"Dutch Tilt (Canted Angle)\" },\r\n { name: \"Overhead Shot\" },\r\n { name: \"Underhead Shot\" },\r\n { name: \"Shoulder Level\" },\r\n { name: \"Hip Level\" },\r\n { name: \"Knee Level\" },\r\n { name: \"Ground Level Tracking Angle\" },\r\n { name: \"Aerial Angle (Drone)\" },\r\n { name: \"Subjective Angle (POV Angle)\" },\r\n];\r\n\r\nexport const camera_movements = [\r\n { name: \"Static (Locked-Off)\" },\r\n { name: \"Pan Left\" },\r\n { name: \"Pan Right\" },\r\n { name: \"Tilt Up\" },\r\n { name: \"Tilt Down\" },\r\n { name: \"Roll (Dutch Roll)\" },\r\n { name: \"Dolly In\" },\r\n { name: \"Dolly Out\" },\r\n { name: \"Dolly Left\" },\r\n { name: \"Dolly Right\" },\r\n { name: \"Truck Left\" },\r\n { name: \"Truck Right\" },\r\n { name: \"Pedestal Up\" },\r\n { name: \"Pedestal Down\" },\r\n { name: \"Tracking Shot\" },\r\n { name: \"Push-In\" },\r\n { name: \"Pull-Out\" },\r\n { name: \"Crane Up\" },\r\n { name: \"Crane Down\" },\r\n { name: \"Jib Shot\" },\r\n { name: \"Steadicam\" },\r\n { name: \"Handheld\" },\r\n { name: \"Whip Pan\" },\r\n { name: \"Arc Shot\" },\r\n { name: \"360 Degree Shot\" },\r\n { name: \"Orbit Shot\" },\r\n { name: \"Zoom In\" },\r\n { name: \"Zoom Out\" },\r\n { name: \"Dolly Zoom (Vertigo Effect)\" },\r\n];\r\n\r\nexport const camera_supports = [\r\n { name: \"Tripod\" },\r\n { name: \"Monopod\" },\r\n { name: \"Static Mount (Fixed Rig)\" },\r\n { name: \"Handheld\" },\r\n { name: \"Shoulder Rig\" },\r\n { name: \"Steadicam\" },\r\n { name: \"Gimbal\" },\r\n { name: \"Dolly (On Track)\" },\r\n { name: \"Dolly (Free / Floor)\" },\r\n { name: \"Slider\" },\r\n { name: \"Crane / Jib\" },\r\n { name: \"Drone\" },\r\n { name: \"Car Mount (Rig)\" },\r\n { name: \"Body Mount\" },\r\n { name: \"Cable Cam / Wire Cam\" },\r\n];\r\n\r\nexport const lens_options = [\r\n { name: \"14mm\", type: \"Ultra Wide\" },\r\n { name: \"18mm\", type: \"Ultra Wide\" },\r\n { name: \"24mm\", type: \"Wide\" },\r\n { name: \"28mm\", type: \"Wide\" },\r\n { name: \"35mm\", type: \"Wide / Standard\" },\r\n { name: \"50mm\", type: \"Standard\" },\r\n { name: \"65mm\", type: \"Standard / Portrait\" },\r\n { name: \"85mm\", type: \"Telephoto (Portrait)\" },\r\n { name: \"100mm\", type: \"Telephoto\" },\r\n { name: \"135mm\", type: \"Telephoto\" },\r\n { name: \"200mm\", type: \"Long Telephoto\" },\r\n];\r\n\r\nexport const aperture_options = [\r\n { value: 1.3, label: \"T1.3\" },\r\n { value: 1.4, label: \"T1.4\" },\r\n { value: 1.5, label: \"T1.5\" },\r\n { value: 1.8, label: \"T1.8\" },\r\n { value: 2.0, label: \"T2.0\" },\r\n { value: 2.2, label: \"T2.2\" },\r\n { value: 2.8, label: \"T2.8\" },\r\n { value: 3.1, label: \"T3.1\" },\r\n { value: 4.0, label: \"T4.0\" },\r\n { value: 4.5, label: \"T4.5\" },\r\n { value: 5.6, label: \"T5.6\" },\r\n { value: 6.3, label: \"T6.3\" },\r\n { value: 8.0, label: \"T8\" },\r\n { value: 9.5, label: \"T9.5\" },\r\n { value: 11, label: \"T11\" },\r\n { value: 13, label: \"T13\" },\r\n { value: 16, label: \"T16\" },\r\n { value: 22, label: \"T22\" },\r\n];\r\n\r\nexport const vfx_types = [\r\n { name: \"None\" },\r\n { name: \"Green Screen (Chroma Key)\" },\r\n { name: \"Blue Screen\" },\r\n { name: \"Set Extension\" },\r\n { name: \"Matte Painting\" },\r\n { name: \"Full CGI Environment\" },\r\n { name: \"CGI Character\" },\r\n { name: \"CGI Props\" },\r\n { name: \"Fire Simulation\" },\r\n { name: \"Smoke / Fog Simulation\" },\r\n { name: \"Water Simulation\" },\r\n { name: \"Destruction Simulation\" },\r\n { name: \"Digital Makeup / De-aging\" },\r\n { name: \"Wire Removal\" },\r\n { name: \"Object Removal\" },\r\n { name: \"Crowd Duplication\" },\r\n { name: \"Sky Replacement\" },\r\n { name: \"Weather Enhancement\" },\r\n { name: \"CG Lighting / Light Wrap\" },\r\n];\r\n\r\nexport const fps_options = [\r\n { value: 23.98, label: \"23.98 fps\" },\r\n { value: 24, label: \"24 fps\" },\r\n { value: 25, label: \"25 fps\" },\r\n { value: 29.97, label: \"29.97 fps\" },\r\n { value: 30, label: \"30 fps\" },\r\n { value: 48, label: \"48 fps\" },\r\n { value: 50, label: \"50 fps\" },\r\n { value: 59.94, label: \"59.94 fps\" },\r\n { value: 60, label: \"60 fps\" },\r\n { value: 120, label: \"120 fps (Slow Motion)\" },\r\n { value: 240, label: \"240 fps (High Speed)\" },\r\n];\r\n\r\nexport const scene_types = [\r\n { name: \"Action / Adventure\" },\r\n { name: \"Comedy / Sitcom\" },\r\n { name: \"Drama / Melodrama\" },\r\n { name: \"Sci-Fi / Fantasy\" },\r\n { name: \"Horror / Thriller\" },\r\n { name: \"Suspense / Mystery\" },\r\n { name: \"Sci-Fi Thriller / Suspense\" },\r\n { name: \"Crime / Film Noir\" },\r\n { name: \"Romance / Romantic Comedy\" },\r\n { name: \"Musical / Dance\" },\r\n { name: \"Documentary / Docudrama\" },\r\n { name: \"Animation / Family\" },\r\n { name: \"Western\" },\r\n { name: \"War / Historical\" },\r\n { name: \"Biographical (Biopic)\" },\r\n { name: \"Psychological Thriller\" },\r\n { name: \"Supernatural / Paranormal\" },\r\n { name: \"Slasher / Gore\" },\r\n { name: \"Dark Comedy / Satire\" },\r\n { name: \"Parody / Spoof\" },\r\n { name: \"Experimental / Avant-Garde\" },\r\n { name: \"Music Video / Visual Arts\" },\r\n { name: \"Instructional / Educational\" },\r\n];\r\n","\"use client\";\r\n\r\nimport * as Yup from \"yup\";\r\nimport { Camera, Shot, ShotPart } from \"@/app/types/shot-breakdown.types\";\r\nimport { useState } from \"react\";\r\nimport { Form, Formik, ErrorMessage } from \"formik\";\r\nimport {\r\n AsteriskIcon,\r\n BookText,\r\n Check,\r\n Frame,\r\n Info,\r\n Settings2,\r\n} from \"lucide-react\";\r\nimport { FormikInput, FormikSelect, FormikTextarea } from \"../input/inputs\";\r\nimport {\r\n aperture_options,\r\n camera_angles,\r\n camera_movements,\r\n camera_supports,\r\n lens_options,\r\n shot_types,\r\n vfx_types,\r\n fps_options,\r\n} from \"@/data/shot-data\";\r\n\r\nconst formSteps = [\r\n {\r\n id: 1,\r\n name: \"Core Identification\",\r\n icon: Info,\r\n fields: [\"priority\", \"shot_type\", \"camera_name\"],\r\n },\r\n {\r\n id: 2,\r\n name: \"Optics & Mechanics\",\r\n icon: Settings2,\r\n fields: [\r\n \"camera_angle\",\r\n \"camera_movement\",\r\n \"camera_support\",\r\n \"lens_mm\",\r\n \"aperture\",\r\n \"fps\",\r\n ],\r\n },\r\n {\r\n id: 3,\r\n name: \"Visual Composition\",\r\n icon: Frame,\r\n fields: [\"subject\", \"duration_seconds\", \"framing\", \"depth_of_field\"],\r\n },\r\n {\r\n id: 4,\r\n name: \"Narrative Context\",\r\n icon: BookText,\r\n fields: [\r\n \"action_blocking\",\r\n \"emotional_purpose\",\r\n \"edit_purpose\",\r\n \"reason\",\r\n \"lighting\",\r\n \"sound\",\r\n \"vfx\",\r\n ],\r\n },\r\n];\r\n\r\nconst AddShotForm = ({\r\n userShotValue,\r\n onSubmit,\r\n cameras,\r\n shots,\r\n handleCloseModal,\r\n parts,\r\n}: {\r\n userShotValue?: Omit<Shot, \"id\" | \"shot_number\" | \"parts\">;\r\n onSubmit: (values: Omit<Shot, \"id\" | \"shot_number\" | \"parts\">) => void;\r\n cameras: Camera[];\r\n shots: Shot[];\r\n handleCloseModal: () => void;\r\n parts: ShotPart[];\r\n}) => {\r\n const initialShotValues: Omit<Shot, \"id\" | \"shot_number\" | \"parts\"> = {\r\n priority: \"Essential\",\r\n shot_type: \"\",\r\n framing: \"\",\r\n camera_angle: \"\",\r\n camera_movement: \"\",\r\n camera_support: \"\",\r\n lens_mm: \"\",\r\n lens_feel: \"\",\r\n aperture: \"T2.8\",\r\n fps: 24,\r\n depth_of_field: \"\",\r\n subject: \"\",\r\n action_blocking: \"\",\r\n emotional_purpose: \"\",\r\n lighting: \"\",\r\n sound: \"\",\r\n duration_seconds: 5,\r\n edit_purpose: \"\",\r\n reason: \"\",\r\n vfx: \"None\",\r\n camera_name: cameras.length === 1 ? cameras[0].name : \"\",\r\n };\r\n\r\n const ShotSchema = Yup.object().shape({\r\n priority: Yup.string().required(\"Required\"),\r\n shot_type: Yup.string().required(\"Required\"),\r\n camera_angle: Yup.string().required(\"Required\"),\r\n camera_movement: Yup.string().required(\"Required\"),\r\n camera_support: Yup.string().required(\"Required\"),\r\n lens_mm: Yup.string().required(\"Required\"),\r\n aperture: Yup.string().required(\"Required\"),\r\n subject: Yup.string().required(\"Required\"),\r\n duration_seconds: Yup.number().min(0).required(\"Required\"),\r\n camera_name: Yup.string().required(\"Required\"),\r\n });\r\n const [step, setStep] = useState(1);\r\n const [highestStep, setHighestStep] = useState(1);\r\n\r\n return (\r\n <Formik\r\n initialValues={userShotValue || initialShotValues}\r\n validationSchema={ShotSchema}\r\n onSubmit={(values, { setSubmitting }) => {\r\n onSubmit(values);\r\n setSubmitting(false);\r\n }}\r\n >\r\n {({\r\n setFieldValue,\r\n isSubmitting,\r\n setTouched,\r\n validateForm,\r\n values,\r\n submitForm,\r\n }) => {\r\n const handleNext = async () => {\r\n const errors = await validateForm();\r\n const currentStepInfo = formSteps.find((s) => s.id === step);\r\n if (!currentStepInfo) return;\r\n\r\n const stepErrors = Object.keys(errors).filter((key) =>\r\n currentStepInfo.fields.includes(key),\r\n );\r\n\r\n if (stepErrors.length === 0) {\r\n setHighestStep((prev) => Math.max(prev, step + 1));\r\n if (step < formSteps.length) {\r\n setStep(step + 1);\r\n } else {\r\n await submitForm();\r\n }\r\n } else {\r\n const touchedFields = currentStepInfo.fields.reduce(\r\n (acc, field) => {\r\n acc[field] = true;\r\n return acc;\r\n },\r\n {} as Record<string, boolean>,\r\n );\r\n setTouched(touchedFields, true);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n setStep((s) => Math.max(s - 1, 1));\r\n };\r\n\r\n return (\r\n <Form className=\"flex flex-col overflow-hidden h-[90vh] lg:h-[85vh] bg-white rounded-b-3xl shadow-[0_12px_40px_-12px_rgba(0,0,0,0.15),_0_0_0_1px_rgba(0,0,0,0.05)]\">\r\n <div className=\"flex flex-col lg:flex-row flex-1 overflow-hidden\">\r\n <div className=\"w-full lg:w-72 flex-shrink-0 border-b lg:border-b-0 lg:border-r border-slate-200 bg-white p-4 lg:p-8 flex flex-col z-10 relative\">\r\n <h3 className=\"hidden lg:block text-[11px] font-semibold uppercase tracking-wider text-slate-400 mb-6 px-2\">\r\n {userShotValue ? \"Update Shot\" : \"Create a Shot\"}\r\n </h3>\r\n <nav className=\"flex flex-row lg:flex-col gap-2 overflow-x-auto lg:overflow-visible pb-2 lg:pb-0 [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] [scrollbar-width:none]\">\r\n {formSteps.map((formStep) => {\r\n const isCurrent = step === formStep.id;\r\n const isAccessible = formStep.id <= highestStep;\r\n const isCompleted = formStep.id < highestStep;\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n key={formStep.id}\r\n disabled={!isAccessible}\r\n onClick={async () => {\r\n if (formStep.id !== step) {\r\n if (formStep.id < step) {\r\n setStep(formStep.id);\r\n } else {\r\n const errors = await validateForm();\r\n const currentStepInfo = formSteps.find(\r\n (s) => s.id === step,\r\n );\r\n const stepErrors = currentStepInfo\r\n ? Object.keys(errors).filter((key) =>\r\n currentStepInfo.fields.includes(key),\r\n )\r\n : [];\r\n\r\n if (stepErrors.length === 0) {\r\n setHighestStep((prev) =>\r\n Math.max(prev, step + 1),\r\n );\r\n setStep(formStep.id);\r\n } else {\r\n const touchedFields =\r\n currentStepInfo?.fields.reduce(\r\n (acc, field) => {\r\n acc[field] = true;\r\n return acc;\r\n },\r\n {} as Record<string, boolean>,\r\n );\r\n setTouched(touchedFields || {}, true);\r\n }\r\n }\r\n }\r\n }}\r\n className={`group relative flex flex-shrink-0 items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition-colors text-left w-auto lg:w-full\r\n ${isCurrent ? \"bg-slate-100 text-slate-900 font-semibold\" : \"text-slate-500\"}\r\n ${isAccessible && !isCurrent ? \"hover:bg-slate-50 hover:text-slate-900 cursor-pointer\" : \"\"}\r\n ${!isAccessible ? \"opacity-50 cursor-not-allowed\" : \"\"}`}\r\n >\r\n <div\r\n className={`flex items-center justify-center w-6 h-6 rounded-md transition-colors\r\n ${isCurrent ? \"text-slate-900\" : \"\"}\r\n ${isCompleted && !isCurrent ? \"text-slate-400\" : \"\"}\r\n ${!isCurrent && !isCompleted ? \"text-slate-400 group-hover:text-slate-600\" : \"\"}`}\r\n >\r\n {isCompleted && !isCurrent ? (\r\n <Check className=\"w-4 h-4 stroke-[2.5] text-slate-900\" />\r\n ) : (\r\n <formStep.icon\r\n className={`w-4 h-4 ${isCurrent ? \"stroke-[2.5]\" : \"stroke-[2]\"}`}\r\n />\r\n )}\r\n </div>\r\n <span\r\n className={`whitespace-nowrap ${isCurrent ? \"font-semibold\" : \"\"}`}\r\n >\r\n {formStep.name}\r\n </span>\r\n </button>\r\n );\r\n })}\r\n </nav>\r\n {parts && parts.length > 0 && (\r\n <div className=\"mt-4 lg:mt-6 pt-4 lg:pt-6 border-t border-slate-200 flex-1 flex flex-col min-h-0\">\r\n <h4 className=\"hidden lg:block text-[11px] font-semibold text-slate-400 mb-3 uppercase tracking-wider px-2\">\r\n Scene Context\r\n </h4>\r\n <div className=\"overflow-y-auto custom-scrollbar pr-2 -mr-2 max-h-24 lg:max-h-full\">\r\n <div\r\n className=\"text-[13px] text-slate-600 bg-slate-50 p-4 rounded-lg font-mono whitespace-pre-wrap leading-relaxed border border-slate-100\"\r\n style={{\r\n fontFamily:\r\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\r\n }}\r\n >\r\n {parts.map((p) => p.text).join(\" \")}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex-1 overflow-y-auto px-4 sm:px-8 md:px-12 lg:px-16 pt-6 lg:pt-10 pb-24 lg:pb-12 custom-scrollbar bg-white\">\r\n <div className=\"mx-auto\">\r\n {(() => {\r\n const currentStepInfo = formSteps.find(\r\n (s) => s.id === step,\r\n );\r\n return (\r\n <div className=\"mb-8 lg:mb-10 text-left\">\r\n <span className=\"inline-block text-[11px] font-mono text-slate-400 uppercase tracking-widest mb-2\">\r\n STEP {step} OF {formSteps.length}\r\n </span>\r\n <h2 className=\"text-2xl lg:text-3xl font-semibold text-slate-900 tracking-tight\">\r\n {currentStepInfo?.name}\r\n </h2>\r\n <p className=\"text-slate-500 mt-2 text-sm leading-relaxed max-w-xl\">\r\n Configure the necessary parameters for this shot\r\n sequence.\r\n </p>\r\n </div>\r\n );\r\n })()}\r\n\r\n <div className=\"space-y-8 lg:space-y-10\">\r\n {step === 1 && (\r\n <section className=\"animate-in fade-in slide-in-from-bottom-4 duration-500\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 md:gap-6 lg:gap-8\">\r\n <FormikInput\r\n label=\"Shot Number\"\r\n name=\"shot_number\"\r\n type=\"number\"\r\n readOnly\r\n value={shots.length + 1}\r\n />\r\n <div>\r\n <label className=\"mb-1.5 text-sm font-medium text-slate-700 capitalize flex\">\r\n Priority\r\n <AsteriskIcon className=\"size-3 text-red-500\" />\r\n </label>\r\n <div className=\"flex items-center p-1 bg-slate-100 rounded-full ring-1 ring-inset ring-slate-200/50\">\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n setFieldValue(\"priority\", \"Essential\")\r\n }\r\n className={`w-full rounded-full px-3 py-1.5 text-sm font-medium transition-colors ${\r\n values.priority === \"Essential\"\r\n ? \"bg-white text-slate-900 shadow-sm ring-1 ring-slate-200/50\"\r\n : \"text-slate-500 hover:text-slate-900\"\r\n }`}\r\n >\r\n Essential\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n setFieldValue(\"priority\", \"Optional\")\r\n }\r\n className={`w-full rounded-full px-3 py-1.5 text-sm font-medium transition-colors ${\r\n values.priority === \"Optional\"\r\n ? \"bg-white text-slate-900 shadow-sm ring-1 ring-slate-200/50\"\r\n : \"text-slate-500 hover:text-slate-900\"\r\n }`}\r\n >\r\n Optional\r\n </button>\r\n </div>\r\n <ErrorMessage\r\n name=\"priority\"\r\n className=\"text-red-500 text-sm mt-1\"\r\n component=\"div\"\r\n />\r\n </div>\r\n <FormikSelect\r\n label=\"Camera\"\r\n name=\"camera_name\"\r\n selectedOption=\"Select Camera\"\r\n optionData={cameras}\r\n enableRedAsterick\r\n value={values.camera_name}\r\n onChange={(e) =>\r\n setFieldValue(\"camera_name\", e.target.value)\r\n }\r\n />\r\n <FormikSelect\r\n label=\"Shot Type\"\r\n name=\"shot_type\"\r\n selectedOption=\"Select Shot Type\"\r\n optionData={shot_types}\r\n enableRedAsterick\r\n value={values.shot_type}\r\n onChange={(e) =>\r\n setFieldValue(\"shot_type\", e.target.value)\r\n }\r\n />\r\n </div>\r\n </section>\r\n )}\r\n\r\n {step === 2 && (\r\n <section className=\"animate-in fade-in slide-in-from-bottom-4 duration-500\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-6 lg:gap-8\">\r\n <FormikSelect\r\n label=\"Camera Angle\"\r\n name=\"camera_angle\"\r\n selectedOption=\"Select Angle\"\r\n optionData={camera_angles}\r\n enableRedAsterick\r\n value={values.camera_angle}\r\n onChange={(e) =>\r\n setFieldValue(\"camera_angle\", e.target.value)\r\n }\r\n />\r\n <FormikSelect\r\n label=\"Camera Movement\"\r\n name=\"camera_movement\"\r\n selectedOption=\"Select Movement\"\r\n optionData={camera_movements}\r\n enableRedAsterick\r\n value={values.camera_movement}\r\n onChange={(e) =>\r\n setFieldValue(\"camera_movement\", e.target.value)\r\n }\r\n />\r\n <FormikSelect\r\n label=\"Camera Support\"\r\n name=\"camera_support\"\r\n selectedOption=\"Select Support\"\r\n optionData={camera_supports}\r\n enableRedAsterick\r\n value={values.camera_support}\r\n onChange={(e) =>\r\n setFieldValue(\"camera_support\", e.target.value)\r\n }\r\n />\r\n <FormikSelect\r\n label=\"Lens (mm)\"\r\n name=\"lens_mm\"\r\n selectedOption=\"Select Lens\"\r\n optionData={lens_options}\r\n valueProperty=\"name\"\r\n enableRedAsterick\r\n value={values.lens_mm}\r\n onChange={(e) => {\r\n const lensName = e.target.value;\r\n setFieldValue(\"lens_mm\", lensName);\r\n const selectedLens = lens_options.find(\r\n (l) => l.name === lensName,\r\n );\r\n if (selectedLens) {\r\n setFieldValue(\"lens_feel\", selectedLens.type);\r\n }\r\n }}\r\n />\r\n <FormikInput\r\n label=\"Lens Feel\"\r\n name=\"lens_feel\"\r\n type=\"text\"\r\n readOnly\r\n placeholder=\"e.g. Wide, Normal, Telephoto\"\r\n />\r\n <FormikSelect\r\n label=\"Aperture (T-Stop)\"\r\n name=\"aperture\"\r\n selectedOption=\"Select Aperture\"\r\n optionData={aperture_options}\r\n valueProperty=\"label\"\r\n labelProperty=\"label\"\r\n enableRedAsterick\r\n value={values.aperture}\r\n onChange={(e) =>\r\n setFieldValue(\"aperture\", e.target.value)\r\n }\r\n />\r\n <FormikSelect\r\n label=\"Frame Rate (FPS)\"\r\n name=\"fps\"\r\n selectedOption=\"Select FPS\"\r\n optionData={fps_options}\r\n valueProperty=\"value\"\r\n labelProperty=\"label\"\r\n enableRedAsterick\r\n value={values.fps}\r\n onChange={(e) =>\r\n setFieldValue(\"fps\", e.target.value)\r\n }\r\n />\r\n </div>\r\n </section>\r\n )}\r\n\r\n {step === 3 && (\r\n <section className=\"animate-in fade-in slide-in-from-bottom-4 duration-500\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-6 lg:gap-8\">\r\n <FormikInput\r\n label=\"Subject\"\r\n name=\"subject\"\r\n type=\"text\"\r\n placeholder=\"e.g. John, The Car\"\r\n enableRedAsterick\r\n />\r\n <FormikInput\r\n label=\"Framing\"\r\n name=\"framing\"\r\n type=\"text\"\r\n placeholder=\"e.g. Over-the-shoulder\"\r\n />\r\n <FormikInput\r\n label=\"Depth of Field\"\r\n name=\"depth_of_field\"\r\n type=\"text\"\r\n placeholder=\"e.g. Shallow, Deep\"\r\n />\r\n <FormikInput\r\n label=\"Duration (seconds)\"\r\n name=\"duration_seconds\"\r\n type=\"number\"\r\n min={0}\r\n enableRedAsterick\r\n />\r\n </div>\r\n </section>\r\n )}\r\n\r\n {step === 4 && (\r\n <section className=\"animate-in fade-in slide-in-from-bottom-4 duration-500 space-y-6 lg:space-y-10\">\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 md:gap-6 lg:gap-8\">\r\n <FormikInput\r\n label=\"Lighting\"\r\n name=\"lighting\"\r\n type=\"text\"\r\n placeholder=\"e.g. High-key\"\r\n />\r\n <FormikInput\r\n label=\"Sound\"\r\n name=\"sound\"\r\n type=\"text\"\r\n placeholder=\"e.g. Dialogue\"\r\n />\r\n <FormikSelect\r\n label=\"VFX\"\r\n name=\"vfx\"\r\n selectedOption=\"Select VFX\"\r\n optionData={vfx_types}\r\n value={values.vfx}\r\n onChange={(e) =>\r\n setFieldValue(\"vfx\", e.target.value)\r\n }\r\n />\r\n </div>\r\n <div className=\"space-y-6 lg:space-y-10\">\r\n <FormikTextarea\r\n label=\"Action / Blocking\"\r\n name=\"action_blocking\"\r\n placeholder=\"Key character movements and staging...\"\r\n />\r\n <FormikTextarea\r\n label=\"Emotional Purpose\"\r\n name=\"emotional_purpose\"\r\n placeholder=\"What is the intended emotional impact on the audience?\"\r\n />\r\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-6 lg:gap-8\">\r\n <FormikTextarea\r\n label=\"Edit Purpose\"\r\n name=\"edit_purpose\"\r\n placeholder=\"How does this shot fit into the edit?\"\r\n />\r\n <FormikTextarea\r\n label=\"Reason\"\r\n name=\"reason\"\r\n placeholder=\"Why is this shot necessary for the story?\"\r\n />\r\n </div>\r\n </div>\r\n </section>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"sticky bottom-0 border-t border-slate-200 px-6 lg:px-12 py-4 lg:py-5 flex justify-between items-center z-10 rounded-b-xl lg:rounded-2xl\">\r\n <div>\r\n {step > 1 && (\r\n <button\r\n type=\"button\"\r\n onClick={handleBack}\r\n className=\"flex items-center gap-2 px-3 py-2 text-sm font-medium text-slate-500 hover:text-slate-900 transition-colors rounded-md hover:bg-slate-50\"\r\n >\r\n <span>←</span> Back\r\n </button>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={handleCloseModal}\r\n className=\"px-4 py-2 text-sm font-medium text-slate-500 hover:text-slate-900 rounded-md hover:bg-slate-50 transition-colors\"\r\n >\r\n Cancel\r\n </button>\r\n {step !== 4 ? (\r\n <button\r\n type=\"button\"\r\n onClick={handleNext}\r\n className={`bg-blumine-600 rounded-full inline-flex items-center justify-center gap-1.5 px-4 py-2 text-sm md:text-lg font-medium text-white shadow-md transition-all duration-300 ease-in-out hover:bg-opacity-70 hover:shadow-lg hover:shadow-blumine-600/50 focus:outline-hidden focus:ring-2 focus:ring-blumine-600 focus:ring-opacity-50 disabled:opacity-60 disabled:cursor-not-allowed disabled:hover:scale-100 disabled:hover:bg-blumine-600 disabled:hover:shadow-md cursor-pointer!`}\r\n >\r\n Next Step\r\n </button>\r\n ) : (\r\n <button\r\n type=\"button\"\r\n onClick={handleNext}\r\n disabled={isSubmitting}\r\n className={`bg-blumine-600 rounded-full inline-flex items-center justify-center gap-1.5 px-4 py-2 text-sm md:text-lg font-medium text-white shadow-md transition-all duration-300 ease-in-out hover:bg-opacity-70 hover:shadow-lg hover:shadow-blumine-600/50 focus:outline-hidden focus:ring-2 focus:ring-blumine-600 focus:ring-opacity-50 disabled:opacity-60 disabled:cursor-not-allowed disabled:hover:scale-100 disabled:hover:bg-blumine-600 disabled:hover:shadow-md cursor-pointer!`}\r\n >\r\n {isSubmitting ? (\r\n <>\r\n <div className=\"w-3.5 h-3.5 border-2 border-white/30 border-t-white rounded-full animate-spin\" />\r\n Processing...\r\n </>\r\n ) : userShotValue ? (\r\n \"Save Changes\"\r\n ) : (\r\n \"Create Shot\"\r\n )}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </Form>\r\n );\r\n }}\r\n </Formik>\r\n );\r\n};\r\n\r\nexport default AddShotForm;\r\n","\"use client\";\nimport { Form, Formik } from \"formik\";\nimport * as Yup from \"yup\";\n\nimport { FormikInput, FormikSelect } from \"../input/inputs\";\nimport { scene_types } from \"@/data/shot-data\";\nimport { Info } from \"lucide-react\";\n\nconst ProductionSetupModal = ({\n initializeProduction,\n initialValues,\n}: {\n initializeProduction: (count: number, type: string) => Promise<any> | any;\n initialValues?: { numCameras: number; scene_type: string };\n}) => {\n return (\n <div className=\"min-h-[80vh] flex items-center justify-center px-6\">\n <div className=\"w-full max-w-lg\">\n <div className=\"mb-8 text-center\">\n <h1 className=\"text-2xl md:text-3xl font-semibold text-slate-900 tracking-tight\">\n Production Setup for this Scene\n </h1>\n <p className=\"text-sm text-slate-500 mt-2\">\n Configure your scene and camera setup to get started\n </p>\n </div>\n\n <div className=\"p-6 md:p-8\">\n <Formik\n initialValues={initialValues || { numCameras: 1, scene_type: \"\" }}\n validationSchema={Yup.object({\n numCameras: Yup.number()\n .min(1, \"Must be at least 1\")\n .max(20, \"Cannot add more than 20 cameras\")\n .required(\"Number of cameras is required\"),\n scene_type: Yup.string().required(\"Scene type is required\"),\n })}\n onSubmit={async (values) => {\n await initializeProduction(values.numCameras, values.scene_type);\n }}\n >\n {({ isSubmitting, setFieldValue }) => (\n <Form className=\"flex flex-col gap-6\">\n <div className=\"grid gap-5\">\n <FormikSelect\n label=\"Scene Type\"\n name=\"scene_type\"\n selectedOption=\"Select scene type\"\n optionData={scene_types}\n enableRedAsterick\n onChange={(e) =>\n setFieldValue(\"scene_type\", e.target.value)\n }\n />\n\n <FormikInput\n label=\"Number of Cameras\"\n name=\"numCameras\"\n type=\"number\"\n min={1}\n max={20}\n enableRedAsterick\n />\n </div>\n\n <div className=\"flex gap-3 bg-slate-50 border border-slate-100 p-4 rounded-xl\">\n <Info className=\"w-5 h-5 text-slate-400 shrink-0 mt-0.5\" />\n <p className=\"text-[13px] text-slate-600 leading-relaxed\">\n <span className=\"font-semibold text-slate-900\">\n Important:\n </span>{\" \"}\n These settings are permanent. Once the production is\n initialized for this scene, you won't be able to change the\n scene type or camera count.\n </p>\n </div>\n\n <div className=\"pt-2\">\n <button\n type=\"submit\"\n disabled={isSubmitting}\n className=\"w-full h-11 rounded-3xl bg-blumine-600 text-white text-sm md:text-base font-medium shadow-sm transition-all duration-300 hover:bg-blumine-700 hover:shadow-md focus:outline-none focus:ring-2 focus:ring-blumine-600/40 disabled:opacity-60 disabled:cursor-not-allowed\"\n >\n {isSubmitting ? \"Initializing...\" : \"Complete Setup\"}\n </button>\n </div>\n </Form>\n )}\n </Formik>\n </div>\n </div>\n </div>\n );\n};\n\nexport default ProductionSetupModal;\n","import { Shot } from \"@/app/types/shot-breakdown.types\";\nimport {\n Camera,\n Clock,\n Target,\n Activity,\n Settings2,\n Frame,\n Video,\n AlignLeft,\n Aperture,\n SlidersHorizontal,\n Crosshair,\n Sun,\n Volume2,\n Wand2,\n MonitorPlay,\n} from \"lucide-react\";\nimport React from \"react\";\n\nexport default function ViewShotModal({ shot }: { shot: Shot }) {\n const PropertyRow = ({ icon: Icon, label, value }: any) => (\n <div className=\"flex items-start gap-3 py-1.5 group\">\n <div className=\"flex items-center gap-2.5 w-32 shrink-0 text-slate-500 mt-0.5\">\n <Icon\n className=\"w-4 h-4 text-slate-400 group-hover:text-slate-600 transition-colors\"\n strokeWidth={2}\n />\n <span className=\"text-[13px] font-medium\">{label}</span>\n </div>\n <div className=\"text-[13px] font-medium text-slate-900 flex-1 break-words whitespace-pre-wrap leading-relaxed\">\n {value || (\n <span className=\"text-slate-400 italic font-normal\">Unspecified</span>\n )}\n </div>\n </div>\n );\n\n const DescriptionBlock = ({ icon: Icon, label, value }: any) => (\n <div className=\"flex flex-col sm:flex-row gap-4 md:gap-6 mb-12 sm:mb-10 w-full\">\n <div className=\"shrink-0 mt-1 hidden sm:block\">\n <div className=\"flex items-center justify-center w-8 h-8 rounded-full bg-slate-50 border border-slate-100\">\n <Icon className=\"w-4 h-4 text-[#15607b]/70\" />\n </div>\n </div>\n <div className=\"flex flex-col gap-2.5 flex-1 w-full max-w-2xl\">\n <div className=\"flex items-center gap-2 sm:hidden mb-1\">\n <Icon className=\"w-4 h-4 text-[#15607b]/70\" />\n <h3 className=\"text-[13px] font-bold uppercase tracking-wider text-[#15607b]\">\n {label}\n </h3>\n </div>\n <h3 className=\"hidden sm:block text-[14px] font-semibold text-slate-900\">\n {label}\n </h3>\n <div className=\"text-[15px] leading-[1.8] text-slate-600 font-normal whitespace-pre-wrap\">\n {value || (\n <span className=\"text-slate-400 italic\">\n No description provided.\n </span>\n )}\n </div>\n </div>\n </div>\n );\n\n return (\n <div className=\"flex flex-col lg:flex-row bg-white max-h-[85vh] rounded-b-[2.5rem] overflow-y-auto w-full custom-scrollbar relative items-start\">\n {/* Main Content Area (Left) */}\n <div className=\"flex-1 p-6 sm:p-8 md:p-12 w-full min-h-0\">\n <div className=\"max-w-3xl mx-auto lg:mx-0\">\n <div className=\"mb-12 flex flex-col gap-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <span className=\"inline-flex items-center justify-center bg-slate-50 text-slate-400 font-mono text-[12px] font-semibold px-2 py-1 rounded-[2.5rem] border border-slate-200/60 shadow-sm\">\n SH-{shot.shot_number.toString().padStart(3, \"0\")}\n </span>\n {shot.shot_type && (\n <div className=\"flex items-center gap-1.5 bg-blumine-50 border border-blumine-400 px-3 py-1 rounded-[2.5rem] text-blumine-500 shadow-sm\">\n <span className=\"text-[13px] font-bold uppercase tracking-widest opacity-90\">\n Shot Type:\n </span>\n <span className=\"text-[13px] font-bold tracking-wide\">\n {shot.shot_type}\n </span>\n </div>\n )}\n </div>\n\n <div className=\"flex flex-col mt-2\">\n <span className=\"text-[11px] font-bold uppercase tracking-widest text-blumine-700 mb-2\">\n Subject\n </span>\n <h1 className=\"text-2xl md:text-3xl font-semibold text-slate-900 tracking-tight break-words\">\n {shot.subject || \"No Subject Defined\"}\n </h1>\n </div>\n </div>\n\n <div className=\"mt-10\">\n <DescriptionBlock\n icon={AlignLeft}\n label=\"Action & Blocking\"\n value={shot.action_blocking}\n />\n <DescriptionBlock\n icon={Target}\n label=\"Reasoning & Importance\"\n value={shot.reason}\n />\n <DescriptionBlock\n icon={Activity}\n label=\"Emotional Intent\"\n value={shot.emotional_purpose}\n />\n <DescriptionBlock\n icon={MonitorPlay}\n label=\"Editorial Role\"\n value={shot.edit_purpose}\n />\n </div>\n </div>\n </div>\n\n {/* Properties Sidebar (Right) */}\n <div className=\"w-full lg:w-[340px] xl:w-[380px] shrink-0 bg-[#fdfdfd] border-t lg:border-t-0 lg:border-l border-slate-200/60 p-6 sm:p-8 pb-12 lg:pb-8 h-full\">\n <div className=\"flex flex-col gap-2 mb-8\">\n <h4 className=\"text-[11px] font-bold uppercase tracking-widest text-blumine-700 mb-4 ml-1\">\n Core Identity\n </h4>\n\n <PropertyRow icon={Video} label=\"Shot Type\" value={shot.shot_type} />\n <PropertyRow\n icon={Target}\n label=\"Priority\"\n value={\n <span\n className={`inline-flex items-center rounded-[2.5rem] px-2 py-0.5 text-[11px] font-bold tracking-wide ${\n shot.priority === \"Essential\"\n ? \"bg-green-50 text-green-700 border border-green-200/60\"\n : \"bg-orange-100 text-orange-600 border border-orange-200/60\"\n }`}\n >\n {shot.priority}\n </span>\n }\n />\n <PropertyRow icon={Crosshair} label=\"Subject\" value={shot.subject} />\n <PropertyRow\n icon={Clock}\n label=\"Duration\"\n value={shot.duration_seconds ? `${shot.duration_seconds}` : null}\n />\n </div>\n\n <div className=\"w-full h-px bg-slate-100 mb-8 mt-4\"></div>\n\n <div className=\"flex flex-col sm:flex-row lg:flex-col gap-10 lg:gap-8 w-full\">\n <div className=\"flex-1\">\n <h4 className=\"text-[11px] font-bold uppercase tracking-widest text-[#15607b] mb-5 ml-1\">\n Optics & Gear\n </h4>\n <div className=\"flex flex-col gap-2\">\n <PropertyRow\n icon={Camera}\n label=\"Camera\"\n value={shot.camera_name}\n />\n <PropertyRow\n icon={Aperture}\n label=\"Lens MM\"\n value={shot.lens_mm}\n />\n <PropertyRow\n icon={SlidersHorizontal}\n label=\"Aperture\"\n value={shot.aperture}\n />\n <PropertyRow\n icon={Frame}\n label=\"Support\"\n value={shot.camera_support}\n />\n <PropertyRow\n icon={Clock}\n label=\"Frame Rate\"\n value={shot.fps ? `${shot.fps} fps` : null}\n />\n <PropertyRow\n icon={Frame}\n label=\"Angle\"\n value={shot.camera_angle}\n />\n <PropertyRow\n icon={Frame}\n label=\"Movement\"\n value={shot.camera_movement}\n />\n </div>\n </div>\n\n <div className=\"flex-1\">\n <h4 className=\"text-[11px] font-bold uppercase tracking-widest text-[#15607b] mb-5 ml-1\">\n Visual Profile\n </h4>\n <div className=\"flex flex-col gap-2\">\n <PropertyRow icon={Frame} label=\"Framing\" value={shot.framing} />\n <PropertyRow\n icon={Aperture}\n label=\"Depth Field\"\n value={shot.depth_of_field}\n />\n <PropertyRow icon={Sun} label=\"Lighting\" value={shot.lighting} />\n <PropertyRow icon={Wand2} label=\"VFX\" value={shot.vfx} />\n <PropertyRow icon={Volume2} label=\"Sound\" value={shot.sound} />\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\r\nimport React, { useEffect, useRef, useState } from \"react\";\r\nimport { Block, blockStyles } from \"../types/screenplay-editor.types\";\r\nimport { Loader2, Video, Eye, Pencil, Settings2 } from \"lucide-react\";\r\nimport { Camera, Shot, ShotPart } from \"../types/shot-breakdown.types\";\r\nimport ModalLayout from \"../components/modal/modal-layout\";\r\nimport AddShotForm from \"../components/modal/add-shot-modal\";\r\nimport ProductionSetupModal from \"../components/modal/production-setup-modal\";\r\nimport ViewShotModal from \"../components/modal/view-shot-modal\";\r\nimport SummarizeButton from \"../components/summarize-button\";\r\n\r\nexport function ShotBreakdownView({\r\n blocks,\r\n isLoading,\r\n shots,\r\n selectionMenu,\r\n handleMouseUp,\r\n addShot,\r\n updateShot,\r\n clearSelection,\r\n menuRef,\r\n cameras,\r\n sceneType,\r\n initializeProduction,\r\n handleAISummarize,\r\n isSummarizing,\r\n aiSummarized = false,\r\n}: {\r\n blocks: Block[];\r\n isLoading: boolean;\r\n shots: Shot[];\r\n sceneType: string;\r\n selectionMenu: {\r\n top: number;\r\n left: number;\r\n parts: ShotPart[];\r\n } | null;\r\n handleMouseUp: () => void;\r\n addShot: (shotDetails: Omit<Shot, \"id\" | \"shot_number\" | \"parts\">) => any;\r\n updateShot: (\r\n shotId: string | number,\r\n updatedDetails: Omit<Shot, \"id\" | \"shot_number\" | \"parts\">,\r\n ) => any;\r\n clearSelection: () => void;\r\n menuRef: React.RefObject<HTMLDivElement | null>;\r\n cameras: Camera[];\r\n initializeProduction: (count: number, type: string) => any;\r\n handleAISummarize: () => void;\r\n isSummarizing: boolean;\r\n aiSummarized?: boolean;\r\n}) {\r\n const COURIER_STACK = \"'Courier Prime', 'Courier', monospace\";\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n const [isSidebarOpen, setIsSidebarOpen] = useState(false);\r\n const [toggledShotId, setToggledShotId] = useState<number | string | null>(\r\n null,\r\n );\r\n const [viewingShotId, setViewingShotId] = useState<number | string | null>(\r\n null,\r\n );\r\n const [updatingShotId, setUpdatingShotId] = useState<number | string | null>(\r\n null,\r\n );\r\n const [isInitModalOpen, setIsInitModalOpen] = useState(false);\r\n\r\n const handleCloseModal = () => {\r\n clearSelection();\r\n };\r\n\r\n const renderBlockText = (block: Block) => {\r\n if (!toggledShotId) return block.text;\r\n\r\n const toggledShot = shots.find((s) => s.id === toggledShotId);\r\n if (!toggledShot) return block.text;\r\n\r\n const blockShotParts = toggledShot.parts\r\n .filter((p) => p.block_id === block.id)\r\n .sort((a, b) => a.start_index - b.start_index);\r\n\r\n if (blockShotParts.length === 0) return block.text;\r\n\r\n const nodes = [];\r\n let currentIndex = 0;\r\n\r\n blockShotParts.forEach((part, index) => {\r\n const actualStart = Math.max(part.start_index, currentIndex);\r\n\r\n if (actualStart > currentIndex) {\r\n nodes.push(\r\n <span key={`text-${currentIndex}`}>\r\n {block.text.slice(currentIndex, actualStart)}\r\n </span>,\r\n );\r\n }\r\n\r\n if (actualStart < part.end_index) {\r\n nodes.push(\r\n <span\r\n key={`shot-${toggledShot.id}-${index}`}\r\n style={{\r\n // Balanced marker gradient using blumine-200 and blumine-300 tones\r\n backgroundImage:\r\n \"linear-gradient(104deg, transparent 0.5%, rgba(176, 227, 241, 0.7) 2%, rgba(122, 206, 230, 0.8) 5%, rgba(176, 227, 241, 0.7) 95%, transparent 99%)\",\r\n // Tidy but still slightly organic marker edges\r\n borderRadius: \"6px 2px 5px 3px / 2px 6px 3px 5px\",\r\n // Clone decoration across line breaks for multi-line seamlessness\r\n boxDecorationBreak: \"clone\",\r\n WebkitBoxDecorationBreak: \"clone\",\r\n // Tighter bleed so it looks \"proper\" and less messy\r\n padding: \"0.15em 0.25em\",\r\n margin: \"0 -0.15em\",\r\n }}\r\n >\r\n {block.text.slice(actualStart, part.end_index)}\r\n </span>,\r\n );\r\n }\r\n currentIndex = Math.max(currentIndex, part.end_index);\r\n });\r\n\r\n if (currentIndex < block.text.length) {\r\n nodes.push(\r\n <span key={`text-${currentIndex}`}>\r\n {block.text.slice(currentIndex)}\r\n </span>,\r\n );\r\n }\r\n\r\n return nodes;\r\n };\r\n\r\n useEffect(() => {\r\n const fontId = \"google-font-courier-prime\";\r\n const styleId = \"screenplay-editor-force-v4\";\r\n\r\n // 1. Inject Google Font\r\n if (!document.getElementById(fontId)) {\r\n const link = document.createElement(\"link\");\r\n link.id = fontId;\r\n link.rel = \"stylesheet\";\r\n link.href =\r\n \"https://fonts.googleapis.com/css2?family=Courier+Prime:ital,wght@0,400;0,700;1,400;1,700&display=swap\";\r\n document.head.appendChild(link);\r\n }\r\n\r\n // 2. Inject high-specificity CSS (Safe textContent approach)\r\n if (!document.getElementById(styleId)) {\r\n const style = document.createElement(\"style\");\r\n style.id = styleId;\r\n style.textContent = `\r\n /* We target by the data-attribute to ensure the highest specificity possible */\r\n [data-screenplay-editor] *, \r\n [data-screenplay-editor] div, \r\n [data-screenplay-editor] span, \r\n [data-screenplay-editor] [contenteditable=\"true\"] {\r\n font-family: ${COURIER_STACK} !important;\r\n -webkit-font-smoothing: antialiased;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }\r\n }, [COURIER_STACK]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center py-32 gap-4\">\r\n <Loader2 className=\"w-8 h-8 animate-spin text-zinc-400\" />\r\n <p className=\"text-sm font-medium text-zinc-500 animate-pulse\">\r\n Loading scene details...\r\n </p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n className=\"relative p-8 md:p-12 mx-auto w-full min-h-screen flex flex-col gap-8 xl:pr-[20rem]\"\r\n ref={containerRef}\r\n >\r\n <div className=\"flex items-center justify-center max-w-6xl xl:max-w-full\">\r\n <div className=\"flex flex-col gap-4 min-h-screen\">\r\n <div\r\n className=\"relative bg-[#fdfdfc] shadow-md shadow-zinc-300/60 border border-zinc-100 rounded-sm md:rounded-md pl-[1.5in] py-[1in] pr-[1in] flex flex-col w-[210mm] min-h-auto shrink-0\"\r\n style={{\r\n fontFamily: COURIER_STACK,\r\n paddingLeft: \"1.5in\",\r\n paddingRight: \"1in\",\r\n paddingTop: \"1in\",\r\n paddingBottom: \"1in\",\r\n lineHeight: \"1.2\",\r\n }}\r\n data-screenplay-editor=\"true\"\r\n onMouseUp={handleMouseUp}\r\n >\r\n {blocks.map((block) => (\r\n <div\r\n key={block.id}\r\n data-block-id={block.id}\r\n className={`relative break-words w-full px-4 py-2 ${blockStyles[block.type].className}`}\r\n style={{\r\n ...blockStyles[block.type].inputStyle,\r\n minHeight: \"2.5rem\",\r\n }}\r\n >\r\n {renderBlockText(block)}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <button\r\n onClick={() => setIsSidebarOpen(true)}\r\n className=\"fixed bottom-6 right-6 z-40 flex h-14 w-14 items-center justify-center rounded-full bg-[#15607b] text-white shadow-[0_8px_30px_rgba(21,96,123,0.3)] transition-transform hover:scale-105 active:scale-95 xl:hidden\"\r\n >\r\n <Video className=\"h-6 w-6\" />\r\n {shots.length > 0 && (\r\n <span className=\"absolute -top-1 -right-1 flex h-5 w-5 items-center justify-center rounded-full bg-rose-500 text-[10px] font-bold text-white shadow-sm border-2 border-white\">\r\n {shots.length}\r\n </span>\r\n )}\r\n </button>\r\n\r\n {isSidebarOpen && (\r\n <div\r\n className=\"fixed inset-0 z-40 bg-slate-900/20 backdrop-blur-sm transition-opacity xl:hidden\"\r\n onClick={() => setIsSidebarOpen(false)}\r\n />\r\n )}\r\n <div\r\n className={`fixed xl:absolute top-0 right-0 z-50 h-full w-72 transform transition-transform duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] xl:translate-x-0 ${\r\n isSidebarOpen\r\n ? \"translate-x-0 shadow-[0_0_40px_rgba(0,0,0,0.1)]\"\r\n : \"translate-x-full\"\r\n }`}\r\n >\r\n <div className=\"sticky top-0 flex h-[100dvh] max-h-screen w-full flex-col border-l border-l-[#eefafd] bg-white p-3 py-5\">\r\n {!aiSummarized && (\r\n <SummarizeButton\r\n onSummarize={handleAISummarize}\r\n isSummarizing={isSummarizing}\r\n />\r\n )}\r\n <div className=\"relative flex flex-col gap-3 py-5 my-5 border-t border-t-[#eefafd] flex-1 overflow-hidden\">\r\n <div className=\"relative flex items-center justify-between mb-6 shrink-0 px-1\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"relative flex h-8 w-8 items-center justify-center rounded-[10px] border border-[#15607b]/20 bg-white shadow-sm\">\r\n <Video className=\"h-4 w-4 text-[#15607b]\" />\r\n </div>\r\n <div className=\"flex flex-col\">\r\n <h3 className=\"text-[12px] font-semibold uppercase tracking-[0.28em] text-[#134a61]\">\r\n Shots\r\n </h3>\r\n {sceneType && (\r\n <span className=\"text-[9px] font-bold text-[#15607b] uppercase tracking-tighter opacity-80 mt-0.5\">\r\n {sceneType}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n {cameras.length === 0 && (\r\n <button\r\n onClick={() => setIsInitModalOpen(true)}\r\n className=\"flex h-7 w-7 items-center justify-center rounded-md border border-slate-200 bg-white shadow-sm transition-colors hover:bg-slate-50\"\r\n title=\"Project Setup\"\r\n >\r\n <Settings2 className=\"h-3.5 w-3.5 text-slate-600\" />\r\n </button>\r\n )}\r\n\r\n {shots.length > 0 && (\r\n <span className=\"rounded-md border border-slate-200 bg-white px-2 py-0.5 text-[10px] font-semibold text-slate-600 shadow-sm\">\r\n {shots.length}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {shots.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center py-10 px-4 text-center\">\r\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-slate-50 border border-slate-100 mb-3\">\r\n <Video className=\"h-4 w-4 text-slate-300\" />\r\n </div>\r\n <p className=\"text-xs font-semibold text-slate-700\">\r\n No shots created\r\n </p>\r\n <p className=\"text-[11px] text-slate-500 mt-1 max-w-[160px] leading-relaxed\">\r\n Highlight text in the screenplay to add your first shot.\r\n </p>\r\n </div>\r\n ) : (\r\n <div className=\"flex h-full max-h-[calc(100vh-200px)] flex-col gap-2.5 overflow-y-auto overflow-x-hidden pb-4 pr-2 custom-scrollbar\">\r\n {shots.map((shot) => {\r\n const isActive = toggledShotId === shot.id;\r\n return (\r\n <div\r\n key={shot.id}\r\n onClick={() =>\r\n setToggledShotId(isActive ? null : (shot.id ?? null))\r\n }\r\n className={`group relative flex-shrink-0 cursor-pointer rounded-xl border transition-all duration-300 overflow-hidden ${\r\n isActive\r\n ? \"border-slate-900 bg-slate-50 shadow-[0_6px_20px_rgba(0,0,0,0.06)]\"\r\n : \"border-slate-200 bg-white hover:border-slate-300 hover:shadow-[0_4px_14px_rgba(0,0,0,0.05)]\"\r\n }`}\r\n >\r\n <div\r\n className={`absolute left-0 top-0 h-full w-[3px] transition-all duration-300\r\n ${isActive ? \"bg-slate-900\" : \"bg-transparent group-hover:bg-slate-300\"}`}\r\n />\r\n\r\n <div className=\"flex flex-col gap-2 px-4 py-3.5\">\r\n <div className=\"flex items-start justify-between\">\r\n <div className=\"flex flex-col\">\r\n <span\r\n className={`text-[11px] font-semibold tracking-wide uppercase\r\n ${isActive ? \"text-slate-900\" : \"text-slate-500\"}`}\r\n >\r\n Shot {shot.shot_number}\r\n </span>\r\n\r\n <span className=\"text-sm font-semibold text-slate-800 leading-tight\">\r\n {shot.camera_name || \"Unknown Camera\"}\r\n </span>\r\n </div>\r\n\r\n <span\r\n className={`rounded-md px-2 py-0.5 text-[8px] font-bold uppercase tracking-wider ${\r\n isActive\r\n ? \"bg-slate-900 text-white\"\r\n : \"bg-slate-100 text-slate-500 group-hover:bg-slate-200\"\r\n }`}\r\n >\r\n {shot.shot_type}\r\n </span>\r\n </div>\r\n\r\n <div className=\"flex items-center justify-between text-[11px] text-slate-500\">\r\n <span>\r\n {shot.lens_mm ? `${shot.lens_mm}mm Lens` : \"—\"}\r\n </span>\r\n <span className=\"opacity-60\">Tap to expand</span>\r\n </div>\r\n\r\n <div\r\n className={`grid transition-all duration-300 ease-in-out ${\r\n isActive\r\n ? \"grid-rows-[1fr] opacity-100 mt-2\"\r\n : \"grid-rows-[0fr] opacity-0\"\r\n }`}\r\n >\r\n <div className=\"overflow-hidden\">\r\n <div className=\"py-3 pb-1 border-t border-slate-200/70 flex gap-2\">\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setViewingShotId(shot.id ?? null);\r\n }}\r\n className=\"flex flex-1 items-center justify-center gap-1.5 rounded-md border border-slate-200 bg-white py-2 text-[11px] font-semibold text-slate-700 transition-all hover:bg-slate-50 hover:text-slate-900\"\r\n >\r\n <Eye className=\"h-3.5 w-3.5\" />\r\n View\r\n </button>\r\n\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setUpdatingShotId(shot.id ?? null);\r\n }}\r\n className=\"flex flex-1 items-center justify-center gap-1.5 rounded-md bg-slate-900 py-2 text-[11px] font-semibold text-white transition-all hover:bg-slate-800\"\r\n >\r\n <Pencil className=\"h-3.5 w-3.5\" />\r\n Edit\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n {selectionMenu && (\r\n <ModalLayout\r\n onClose={handleCloseModal}\r\n title={cameras.length === 0 ? \"Production Setup\" : \"Add New Shot\"}\r\n menuRef={menuRef}\r\n maxWidth={cameras.length === 0 ? \"max-w-lg\" : \"max-w-7xl\"}\r\n >\r\n {cameras.length === 0 ? (\r\n <ProductionSetupModal initializeProduction={initializeProduction} />\r\n ) : (\r\n <AddShotForm\r\n onSubmit={(values) => {\r\n addShot(values);\r\n // handleCloseModal();\r\n }}\r\n cameras={cameras}\r\n shots={shots}\r\n handleCloseModal={handleCloseModal}\r\n parts={selectionMenu.parts}\r\n />\r\n )}\r\n </ModalLayout>\r\n )}\r\n\r\n {isInitModalOpen && (\r\n <ModalLayout\r\n onClose={() => setIsInitModalOpen(false)}\r\n title=\"Production Setup\"\r\n maxWidth=\"max-w-lg\"\r\n >\r\n <ProductionSetupModal\r\n initializeProduction={(count, type) => {\r\n initializeProduction(count, type).then(() => {\r\n setIsInitModalOpen(false);\r\n });\r\n }}\r\n initialValues={{\r\n numCameras: cameras.length || 1,\r\n scene_type: sceneType,\r\n }}\r\n />\r\n </ModalLayout>\r\n )}\r\n\r\n {viewingShotId && (\r\n <ModalLayout\r\n onClose={() => setViewingShotId(null)}\r\n title={`Shot ${shots.find((s) => s.id === viewingShotId)?.shot_number || \"\"} Details`}\r\n maxWidth=\"max-w-5xl\"\r\n >\r\n {shots.find((s) => s.id === viewingShotId) && (\r\n <ViewShotModal shot={shots.find((s) => s.id === viewingShotId)!} />\r\n )}\r\n </ModalLayout>\r\n )}\r\n\r\n {updatingShotId && (\r\n <ModalLayout\r\n onClose={() => setUpdatingShotId(null)}\r\n title={`Update Shot SH-${\r\n shots\r\n .find((s) => s.id === updatingShotId)\r\n ?.shot_number?.toString()\r\n .padStart(3, \"0\") || \"\"\r\n }`}\r\n maxWidth=\"max-w-7xl\"\r\n >\r\n {shots.find((s) => s.id === updatingShotId) && (\r\n <AddShotForm\r\n parts={shots.find((s) => s.id === updatingShotId)!.parts}\r\n cameras={cameras}\r\n shots={shots}\r\n handleCloseModal={() => setUpdatingShotId(null)}\r\n userShotValue={shots.find((s) => s.id === updatingShotId)}\r\n onSubmit={(values) => {\r\n updateShot(updatingShotId, values).then(() => {\r\n setUpdatingShotId(null);\r\n });\r\n }}\r\n />\r\n )}\r\n </ModalLayout>\r\n )}\r\n </div>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { useEffect, useMemo, useState, useRef } from \"react\";\r\nimport { Block, BlockType, uuid } from \"../types/screenplay-editor.types\";\r\nimport { Camera, Shot, ShotPart } from \"../types/shot-breakdown.types\";\r\n\r\nexport interface UseShotBreakdownOptions {\r\n scene_url: string;\r\n fetchOptions?: RequestInit;\r\n onAISummarize?: (scene: any) => void;\r\n onShotAdded?: (shot: Shot) => any;\r\n onShotsBulkAdded?: (shots: Shot[], scene_type: string) => Promise<void>;\r\n onShotRemoved?: (shotId: string) => any;\r\n onShotUpdated?: (shotId: string, detail: Shot) => any;\r\n onProductionInitialized?: (cameras: Camera[], type: string) => any;\r\n preloadedShots?: Shot[];\r\n preloadedCameras?: Camera[];\r\n preloadedSceneType?: string;\r\n}\r\n\r\nexport function useShotBreakdownScene(options: UseShotBreakdownOptions) {\r\n const [shots, setShots] = useState<Shot[]>(options.preloadedShots || []);\r\n const [cameras, setCameras] = useState<Camera[]>(\r\n options.preloadedCameras || [],\r\n );\r\n const [sceneType, setSceneType] = useState<string>(\r\n options.preloadedSceneType || \"\",\r\n );\r\n const [scene, setScene] = useState<any>(null);\r\n const [isLoading, setIsLoading] = useState<boolean>(true);\r\n const [isSummarizing, setIsSummarizing] = useState<boolean>(false);\r\n const [error, setError] = useState<boolean>(false);\r\n const [selectionMenu, setSelectionMenu] = useState<{\r\n top: number;\r\n left: number;\r\n parts: ShotPart[];\r\n } | null>(null);\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (options.preloadedShots && options.preloadedShots.length > 0) {\r\n setShots((prev) => {\r\n if (JSON.stringify(prev) === JSON.stringify(options.preloadedShots)) {\r\n return prev;\r\n }\r\n return options.preloadedShots || [];\r\n });\r\n }\r\n }, [options.preloadedShots]);\r\n\r\n useEffect(() => {\r\n if (options.preloadedCameras && options.preloadedCameras.length > 0) {\r\n setCameras((prev) => {\r\n if (JSON.stringify(prev) === JSON.stringify(options.preloadedCameras)) {\r\n return prev;\r\n }\r\n return options.preloadedCameras || [];\r\n });\r\n }\r\n }, [options.preloadedCameras]);\r\n\r\n useEffect(() => {\r\n if (options.preloadedSceneType) {\r\n setSceneType((prev) => {\r\n if (prev === options.preloadedSceneType) return prev;\r\n return options.preloadedSceneType || \"\";\r\n });\r\n }\r\n }, [options.preloadedSceneType]);\r\n\r\n useEffect(() => {\r\n setIsLoading(true);\r\n const fetchScene = async () => {\r\n try {\r\n const response = await fetch(options.scene_url, options.fetchOptions);\r\n if (response.ok) {\r\n const text = await response.text();\r\n setScene({ content: text });\r\n } else {\r\n console.error(\"Failed to fetch scene:\", response);\r\n setError(true);\r\n }\r\n setIsLoading(false);\r\n } catch (error) {\r\n setError(true);\r\n setIsLoading(false);\r\n console.error(\"Error fetching scene:\", error);\r\n }\r\n };\r\n fetchScene();\r\n }, []);\r\n\r\n const blocks = useMemo(() => {\r\n if (!scene || !scene.content) return [];\r\n\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(scene.content, \"text/html\");\r\n const divs = Array.from(doc.querySelectorAll(\"div\"));\r\n const parsedBlocks: Block[] = [];\r\n\r\n const typeMap: Record<string, BlockType> = {\r\n divtype0: \"SCENE_HEADING\",\r\n divtype2: \"ACTION\",\r\n divtype3: \"CHARACTER\",\r\n divtype4: \"PARENTHETICAL\",\r\n divtype5: \"DIALOGUE\",\r\n divtype6: \"TRANSITION\",\r\n };\r\n\r\n divs.forEach((div) => {\r\n const divText = div.textContent?.trim() || \"\";\r\n if (!divText) return;\r\n\r\n let type: BlockType = \"ACTION\";\r\n for (const className of Array.from(div.classList)) {\r\n if (typeMap[className]) {\r\n type = typeMap[className];\r\n break;\r\n }\r\n }\r\n\r\n const idAttr = div.getAttribute(\"id\");\r\n const blockId =\r\n idAttr && idAttr.startsWith(\"par\")\r\n ? idAttr.substring(3)\r\n : idAttr || uuid();\r\n\r\n parsedBlocks.push({ id: blockId, type, text: divText });\r\n });\r\n\r\n return parsedBlocks;\r\n }, [scene]);\r\n\r\n const clearSelection = () => {\r\n setSelectionMenu(null);\r\n window.getSelection()?.removeAllRanges();\r\n };\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\r\n clearSelection();\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, []);\r\n\r\n const getAbsoluteOffset = (\r\n blockEl: Element,\r\n targetNode: Node,\r\n targetOffset: number,\r\n ) => {\r\n let currentOffset = 0;\r\n const walker = document.createTreeWalker(\r\n blockEl,\r\n NodeFilter.SHOW_TEXT,\r\n null,\r\n );\r\n let currentNode = walker.nextNode();\r\n while (currentNode) {\r\n if (currentNode === targetNode) {\r\n return currentOffset + targetOffset;\r\n }\r\n currentOffset += currentNode.nodeValue?.length || 0;\r\n currentNode = walker.nextNode();\r\n }\r\n return targetOffset;\r\n };\r\n\r\n const handleMouseUp = () => {\r\n const selection = window.getSelection();\r\n if (!selection || selection.isCollapsed) return;\r\n\r\n const range = selection.getRangeAt(0);\r\n const startNode = range.startContainer;\r\n const endNode = range.endContainer;\r\n\r\n const startBlockEl =\r\n startNode.nodeType === Node.TEXT_NODE\r\n ? startNode.parentElement?.closest(\"[data-block-id]\")\r\n : (startNode as Element).closest(\"[data-block-id]\");\r\n const endBlockEl =\r\n endNode.nodeType === Node.TEXT_NODE\r\n ? endNode.parentElement?.closest(\"[data-block-id]\")\r\n : (endNode as Element).closest(\"[data-block-id]\");\r\n\r\n if (!startBlockEl || !endBlockEl) return;\r\n\r\n const startBlockId = startBlockEl.getAttribute(\"data-block-id\");\r\n const endBlockId = endBlockEl.getAttribute(\"data-block-id\");\r\n\r\n const startIndexInArray = blocks.findIndex((b) => b.id === startBlockId);\r\n const endIndexInArray = blocks.findIndex((b) => b.id === endBlockId);\r\n\r\n if (startIndexInArray === -1 || endIndexInArray === -1) return;\r\n\r\n const startAbsOffset = getAbsoluteOffset(\r\n startBlockEl,\r\n startNode,\r\n range.startOffset,\r\n );\r\n const endAbsOffset = getAbsoluteOffset(\r\n endBlockEl,\r\n endNode,\r\n range.endOffset,\r\n );\r\n\r\n const selectedParts: ShotPart[] = [];\r\n\r\n for (let i = startIndexInArray; i <= endIndexInArray; i++) {\r\n const block = blocks[i];\r\n const start = i === startIndexInArray ? startAbsOffset : 0;\r\n const end = i === endIndexInArray ? endAbsOffset : block.text.length;\r\n\r\n if (start !== end) {\r\n selectedParts.push({\r\n block_id: block.id,\r\n start_index: start,\r\n end_index: end,\r\n text: block.text.slice(start, end),\r\n });\r\n }\r\n }\r\n\r\n if (selectedParts.length > 0) {\r\n const rect = range.getBoundingClientRect();\r\n setSelectionMenu({\r\n top: rect.top + window.scrollY,\r\n left: rect.left + rect.width / 2 + window.scrollX,\r\n parts: selectedParts,\r\n });\r\n }\r\n };\r\n\r\n const initializeProduction = async (count: number, type: string) => {\r\n const newCameras: Camera[] = [];\r\n for (let i = 1; i <= count; i++) {\r\n newCameras.push({ name: `Camera ${String.fromCharCode(64 + i)}` });\r\n }\r\n\r\n const result = options.onProductionInitialized?.(newCameras, type);\r\n if (result instanceof Promise) {\r\n setCameras(newCameras);\r\n setSceneType(type);\r\n await result;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n const addShot = (shotDetails: Omit<Shot, \"id\" | \"shot_number\" | \"parts\">) => {\r\n if (!selectionMenu) return;\r\n const newShot: Shot = {\r\n ...shotDetails,\r\n id: uuid(),\r\n shot_number: shots.length + 1,\r\n parts: selectionMenu.parts,\r\n };\r\n setShots((prev) => [...prev, newShot]);\r\n\r\n const result = options.onShotAdded?.(newShot);\r\n if (result instanceof Promise) {\r\n return result.then(() => {\r\n clearSelection();\r\n });\r\n } else {\r\n clearSelection();\r\n return result;\r\n }\r\n };\r\n\r\n const updateShot = async (\r\n shotId: string | number,\r\n updatedDetails: Omit<Shot, \"id\" | \"shot_number\" | \"parts\">,\r\n ) => {\r\n let updatedShot: Shot | null = null;\r\n setShots((prev) =>\r\n prev.map((shot) => {\r\n if (shot.id === shotId) {\r\n updatedShot = { ...shot, ...updatedDetails };\r\n return updatedShot;\r\n }\r\n return shot;\r\n }),\r\n );\r\n\r\n if (updatedShot) {\r\n const result = options.onShotUpdated?.(shotId as string, updatedShot);\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n return result;\r\n }\r\n };\r\n\r\n const handleAISummarize = async () => {\r\n if (!scene || !scene.content || !options.onAISummarize) return;\r\n setIsSummarizing(true);\r\n try {\r\n const res: any = await options.onAISummarize?.(scene.content);\r\n\r\n if (res && res.ok) {\r\n const data = await res.json();\r\n setIsSummarizing(false);\r\n\r\n const newShots: Shot[] = [];\r\n data.data[0].forEach((aiShot: any) => {\r\n // Map AI response to Shot type\r\n // This mapping depends on what the AI returns for shots\r\n const newShot: Shot = {\r\n id: aiShot.id || uuid(),\r\n shot_number: (shots.length || 0) + newShots.length + 1,\r\n priority: aiShot.priority || \"Essential\",\r\n shot_type: aiShot.shot_type || \"Medium Shot (MS)\",\r\n framing: aiShot.framing || \"Eye Level\",\r\n camera_angle: aiShot.camera_angle || \"Eye Level\",\r\n camera_movement: aiShot.camera_movement || \"Static (Locked-Off)\",\r\n camera_support: aiShot.camera_support || \"Tripod\",\r\n lens_mm: aiShot.lens_mm || \"35\",\r\n lens_feel: aiShot.lens_feel || \"Standard\",\r\n aperture: aiShot.aperture || \"T2.8\",\r\n depth_of_field: aiShot.depth_of_field || \"Deep\",\r\n subject: aiShot.subject || \"\",\r\n action_blocking: aiShot.action_blocking || \"\",\r\n emotional_purpose: aiShot.emotional_purpose || \"\",\r\n lighting: aiShot.lighting || \"\",\r\n sound: aiShot.sound || \"\",\r\n duration_seconds: aiShot.duration_seconds || 5,\r\n edit_purpose: aiShot.edit_purpose || \"\",\r\n reason: aiShot.reason || \"\",\r\n vfx: aiShot.vfx || \"None\",\r\n camera_name: aiShot.camera_name || cameras[0]?.name || \"Camera A\",\r\n fps: aiShot.fps || 24,\r\n parts:\r\n aiShot.parts.map((part: any) => ({\r\n block_id: part.block_id.startsWith(\"par\")\r\n ? part.block_id.substring(3)\r\n : part.block_id || uuid(),\r\n start_index: part.start_index,\r\n end_index: part.end_index,\r\n text: part.text,\r\n })) || [],\r\n };\r\n newShots.push(newShot);\r\n });\r\n\r\n if (newShots.length > 0) {\r\n setShots((prev) => [...prev, ...newShots]);\r\n if (options.onShotsBulkAdded) {\r\n await options.onShotsBulkAdded(newShots, data.data[1]);\r\n }\r\n }\r\n } else {\r\n setIsSummarizing(false);\r\n }\r\n } catch (error) {\r\n setIsSummarizing(false);\r\n console.error(\"Error in AI summarization:\", error);\r\n }\r\n };\r\n\r\n return {\r\n blocks,\r\n isLoading,\r\n error,\r\n shots,\r\n sceneType,\r\n selectionMenu,\r\n handleMouseUp,\r\n cameras,\r\n initializeProduction,\r\n addShot,\r\n updateShot,\r\n clearSelection,\r\n handleAISummarize,\r\n isSummarizing,\r\n menuRef,\r\n };\r\n}\r\n"]}
|