@vishu1301/script-writing 1.2.3 → 1.2.5

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.
@@ -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"],"names":["jsx","Clapperboard","Sparkles","UserRound","Brackets","MessageCircle","ArrowRightLeft","pdfjs","useState","useRef","_a","jsxs","Fragment","useEffect","Upload","Lock","Unlock","Save","FileDown","RefreshCcw","Cog","ArrowRight","User","ChevronRight","useMemo","useCallback","newBlockId","jsPDF","Loader2","AlignLeft","Tags","error"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\r\n Clapperboard,\r\n Sparkles,\r\n UserRound,\r\n Brackets,\r\n MessageCircle,\r\n ArrowRightLeft,\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: <Clapperboard className=\"w-5 h-5\" />,\r\n ACTION: <Sparkles className=\"w-5 h-5\" />,\r\n CHARACTER: <UserRound className=\"w-5 h-5\" />,\r\n PARENTHETICAL: <Brackets className=\"w-5 h-5\" />,\r\n DIALOGUE: <MessageCircle className=\"w-5 h-5\" />,\r\n TRANSITION: <ArrowRightLeft 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(\"&lt;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 gap-2 w-auto px-4 h-12 rounded-full bg-zinc-950 text-white shadow-xl shadow-zinc-900/20 border border-white/10 hover:bg-zinc-800 hover:scale-105 active:scale-95 transition-all duration-300 disabled:cursor-not-allowed disabled:bg-zinc-700 disabled:shadow-none disabled:border-zinc-600/50\"\r\n aria-label=\"Import Script\"\r\n >\r\n {isProcessing ? (\r\n <span className=\"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} 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} 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};\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 onSaveAsSbx,\r\n onSyncWithCloud,\r\n handleSceneNumberChange,\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 return (\r\n <>\r\n <div\r\n className=\"sticky top-6 z-50 mx-auto bg-white/70 backdrop-blur-2xl border border-white/60 shadow-[0_8px_30px_rgb(0,0,0,0.04)] rounded-[2rem] flex items-center justify-between p-2 mb-12 select-none transition-all\"\r\n style={{\r\n maxWidth: \"1240px\",\r\n }}\r\n >\r\n <div className=\"flex gap-1 overflow-x-auto custom-scrollbar pr-2 items-center\">\r\n {blockTypes.map((type) => {\r\n const selected =\r\n blocks.find((b) => b.id === focusedBlockId)?.type === type;\r\n return (\r\n <button\r\n key={type}\r\n type=\"button\"\r\n disabled={isLocked}\r\n className={`group flex items-center gap-2.5 px-4 py-2 rounded-full font-semibold text-sm transition-all duration-300 ease-out active:scale-95 ${\r\n selected\r\n ? \"bg-zinc-900 text-white shadow-md shadow-zinc-900/20\"\r\n : \"text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900\"\r\n } ${isLocked ? \"opacity-50 cursor-not-allowed\" : \"\"}`}\r\n onClick={() => handleBlockTypeChange(type)}\r\n >\r\n <input\r\n type=\"radio\"\r\n name=\"blockType\"\r\n id={`block-type-${type}`}\r\n className=\"sr-only\"\r\n aria-label={blockStyles[type].label}\r\n checked={selected}\r\n readOnly\r\n />\r\n <label\r\n htmlFor={`block-type-${type}`}\r\n className=\"flex items-center gap-2 cursor-pointer pointer-events-none\"\r\n >\r\n <div\r\n className={`${selected ? \"opacity-100\" : \"opacity-70 group-hover:opacity-100\"} transition-opacity duration-200`}\r\n >\r\n {icons[type]}\r\n </div>\r\n <span className=\"whitespace-nowrap hidden sm:inline tracking-wide\">\r\n {blockStyles[type].label}\r\n </span>\r\n </label>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1 shrink-0 relative px-1\">\r\n <div className=\"w-[1px] h-6 bg-zinc-200/80 mx-2 hidden sm:block rounded-full\"></div>\r\n {showPdfImport && !isLocked && (\r\n <PdfImporter disabled={isLocked} onScriptImported={handleScriptImport}>\r\n <div title=\"Import Script\">\r\n <Upload className=\"w-[18px] h-[18px]\" />\r\n </div>\r\n </PdfImporter>\r\n )}\r\n {onToggleLock && (\r\n <button\r\n onClick={onToggleLock}\r\n className={`flex items-center justify-center w-10 h-10 rounded-full transition-all duration-200 active:scale-95 ${\r\n isLocked\r\n ? \"text-rose-500 hover:bg-rose-50\"\r\n : \"text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900\"\r\n }`}\r\n title={isLocked ? \"Unlock Script\" : \"Lock Script\"}\r\n aria-label={isLocked ? \"Unlock Script\" : \"Lock Script\"}\r\n >\r\n {isLocked ? (\r\n <Lock className=\"w-[18px] h-[18px]\" />\r\n ) : (\r\n <Unlock className=\"w-[18px] h-[18px]\" />\r\n )}\r\n </button>\r\n )}\r\n {onSave && showSaveButton && !isLocked && (\r\n <button\r\n onClick={onSave}\r\n className=\"flex items-center justify-center w-10 h-10 rounded-full text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900 transition-all duration-200 active:scale-95\"\r\n title=\"Save Script\"\r\n aria-label=\"Save Script\"\r\n >\r\n <Save className=\"w-[18px] h-[18px]\" />\r\n </button>\r\n )}\r\n {onSaveAsPdf && showSaveButton && (\r\n <button\r\n onClick={onSaveAsPdf}\r\n className=\"flex items-center justify-center w-10 h-10 rounded-full text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900 transition-all duration-200 active:scale-95\"\r\n title=\"Save as PDF\"\r\n aria-label=\"Save Script as PDF\"\r\n >\r\n <FileDown className=\"w-[18px] h-[18px]\" />\r\n </button>\r\n )}\r\n {onSyncWithCloud && showSyncButton && !isLocked && (\r\n <button\r\n onClick={onSyncWithCloud}\r\n className=\"flex items-center justify-center w-10 h-10 rounded-full text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900 transition-all duration-200 active:scale-95\"\r\n title=\"Sync with Cloud\"\r\n aria-label=\"Sync with Cloud\"\r\n >\r\n <RefreshCcw className=\"w-[18px] h-[18px]\" />\r\n </button>\r\n )}\r\n <div ref={rulesRef} className=\"relative flex items-center\">\r\n <button\r\n onClick={() => setIsRulesOpen(!isRulesOpen)}\r\n className={`flex items-center justify-center w-10 h-10 rounded-full transition-all duration-200 active:scale-95 ${\r\n isRulesOpen\r\n ? \"bg-zinc-900 text-white shadow-md shadow-zinc-900/20\"\r\n : \"text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900\"\r\n }`}\r\n title=\"Settings & Shortcuts\"\r\n aria-label=\"Toggle Settings\"\r\n >\r\n <Cog className=\"w-[18px] h-[18px]\" />\r\n </button>\r\n\r\n {isRulesOpen && (\r\n <div className=\"absolute top-full mt-2 right-0 bg-white/95 backdrop-blur-3xl rounded-[1.5rem] shadow-[0_20px_60px_-15px_rgba(0,0,0,0.1)] p-5 text-sm text-zinc-700 select-none font-sans overflow-hidden transition-all duration-300 w-72 origin-top-right animate-in fade-in zoom-in-95 z-50\">\r\n <h4 className=\"font-bold text-zinc-900 mb-4 text-sm flex items-center gap-2\">\r\n <Cog className=\"w-4 h-4 text-zinc-400\" />\r\n Settings & Shortcuts\r\n </h4>\r\n <div className=\"space-y-4\">\r\n <ul className=\"space-y-2.5\">\r\n <li className=\"flex items-center justify-between gap-6\">\r\n <span className=\"font-medium text-zinc-600\">\r\n New Block\r\n </span>\r\n <kbd className=\"px-2 py-1 text-[11px] font-bold text-zinc-700 bg-white border border-zinc-200/80 shadow-[0_2px_4px_rgb(0,0,0,0.02)] rounded-md\">\r\n Enter\r\n </kbd>\r\n </li>\r\n <li className=\"flex items-center justify-between gap-6\">\r\n <span className=\"font-medium text-zinc-600\">\r\n Delete Block\r\n </span>\r\n <kbd className=\"px-2 py-1 text-[11px] font-bold text-zinc-700 bg-white border border-zinc-200/80 shadow-[0_2px_4px_rgb(0,0,0,0.02)] rounded-md\">\r\n Backspace\r\n </kbd>\r\n </li>\r\n <li className=\"flex items-center justify-between gap-6\">\r\n <span className=\"font-medium text-zinc-600\">\r\n Change Type\r\n </span>\r\n <div className=\"flex items-center gap-1\">\r\n <kbd className=\"px-2 py-1 text-[11px] font-bold text-zinc-700 bg-white border border-zinc-200/80 shadow-[0_2px_4px_rgb(0,0,0,0.02)] rounded-md\">\r\n Ctrl\r\n </kbd>\r\n <span className=\"text-zinc-400 font-medium\">+</span>\r\n <kbd className=\"px-2 py-1 text-[11px] font-bold text-zinc-700 bg-white border border-zinc-200/80 shadow-[0_2px_4px_rgb(0,0,0,0.02)] rounded-md\">\r\n ↑/↓\r\n </kbd>\r\n </div>\r\n </li>\r\n </ul>\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 w-full items-center pb-24\">\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-sky-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 </>\r\n )}\r\n </div>\r\n ))}\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","\"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}\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 blurTimeout = useRef<NodeJS.Timeout | null>(null);\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\r\n useEffect(() => {\r\n onSaveRef.current = options?.onSave;\r\n }, [options?.onSave]);\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 (title: string, content: string, preParsedBlocks?: Partial<Block>[], isInitialLoad?: boolean) => {\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 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 const sbxData = finalizedBlocks\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 (\r\n block.type === \"CHARACTER\" ||\r\n block.type === \"TRANSITION\"\r\n ) {\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 // 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 loadFromUrl = useCallback(\r\n async (url: string, fetchOptions: RequestInit = {}, isInitialLoad?: boolean) => {\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(\"&lt;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(filename, scriptContent, preParsedBlocks, isInitialLoad);\r\n } catch (error) {\r\n console.error(\r\n \"[useScreenplayEditor] Error loading script from URL:\",\r\n error,\r\n );\r\n throw error;\r\n }\r\n },\r\n [handleScriptImport],\r\n );\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 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 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","export 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 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}[] = [\r\n { id: \"CAST\", label: \"Cast\", color: \"#7C3AED\", hex: \"#A78BFA\" },\r\n { id: \"PROP\", label: \"Prop\", color: \"#FF6A00\", hex: \"#FFB86B\" },\r\n { id: \"COSTUME\", label: \"Costume\", color: \"#FF2E93\", hex: \"#FF8AC2\" },\r\n { id: \"VEHICLE\", label: \"Vehicle\", color: \"#00A6FF\", hex: \"#6ED6FF\" },\r\n { id: \"SET_PROP\", label: \"Set Prop\", color: \"#00C853\", hex: \"#69F0AE\" },\r\n { id: \"EXTRA\", label: \"Extra\", color: \"#00B8D4\", hex: \"#62EFFF\" },\r\n { id: \"LOCATION\", label: \"Location\", color: \"#FFB300\", hex: \"#FFE082\" },\r\n { id: \"SUBLOCATION\", label: \"Sublocation\", color: \"#004CFF\", hex: \"#004CFF\" },\r\n { id: \"OTHER\", label: \"Other\", color: \"#9E9E9E\", hex: \"#E0E0E0\" },\r\n];\r\n","import React from \"react\";\r\nimport { Popcorn } from \"lucide-react\";\r\n\r\nconst PopcornIcon = ({ isSummarizing }: { isSummarizing?: boolean }) => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={`w-6 h-6 transition-all duration-500 ${\r\n isSummarizing\r\n ? \"animate-cook\"\r\n : \"group-hover:scale-110 group-hover:-rotate-12\"\r\n }`}\r\n >\r\n {/* 1. THE POPCORN (Top Bubbles) - Yellow */}\r\n <path\r\n d=\"M18 8a2 2 0 0 0 0-4 2 2 0 0 0-4 0 2 2 0 0 0-4 0 2 2 0 0 0-4 0 2 2 0 0 0 0 4\"\r\n stroke=\"#facc15\"\r\n strokeWidth=\"2\"\r\n />\r\n\r\n {/* 2. THE CONTAINER (Bucket) - Red */}\r\n <g stroke=\"#ef4444\" strokeWidth=\"2\">\r\n {/* Outer Shell */}\r\n <path d=\"M20 8c.5 0 .9.4.8 1l-2.6 12c-.1.5-.7 1-1.2 1H7c-.6 0-1.1-.4-1.2-1L3.2 9c-.1-.6.3-1 .8-1Z\" />\r\n {/* Vertical Detail Lines */}\r\n <path d=\"M10 22 9 8\" strokeWidth=\"1\" />\r\n <path d=\"m14 22 1-14\" strokeWidth=\"1\" />\r\n </g>\r\n </svg>\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={`group relative w-full py-4 px-8 rounded-[3rem] transition-all duration-500 ease-[cubic-bezier(0.22,1,0.36,1)] border ${\r\n isSummarizing\r\n ? \"bg-zinc-100 border-zinc-300 opacity-100 cursor-wait shadow-inner\"\r\n : \"bg-gradient-to-b from-white via-zinc-50 to-zinc-100 border-white/70 shadow-[0_10px_30px_-10px_rgba(0,0,0,0.12),inset_0_1px_0_rgba(255,255,255,0.8)] hover:shadow-[0_20px_50px_-15px_rgba(139,92,246,0.3)] hover:-translate-y-[2px] active:scale-[0.98]\"\r\n }`}\r\n >\r\n {/* 1. Background Glow (Hover) */}\r\n <span className=\"absolute inset-0 opacity-0 group-hover:opacity-100 transition duration-700\">\r\n <span\r\n className=\"absolute inset-0 blur-3xl opacity-20\"\r\n style={{\r\n backgroundImage: \"conic-gradient(from 0deg at 50% 50%, #c084fc, transparent 60%, #fb7185, transparent 90%)\",\r\n animation: \"custom-spin 10s linear infinite\"\r\n }}\r\n />\r\n </span>\r\n\r\n {/* 2. Heat Glow (Stronger Contrast for Summarizing) */}\r\n <span\r\n className={`absolute inset-0 transition-opacity duration-700 ${isSummarizing ? \"opacity-100\" : \"opacity-0\"}`}\r\n style={{\r\n backgroundImage: \"radial-gradient(circle at 50% 50%, rgba(139, 92, 246, 0.1), transparent 70%)\"\r\n }}\r\n />\r\n\r\n <div className=\"relative flex items-center justify-center gap-4\">\r\n <style>{`\r\n @keyframes custom-spin {\r\n from { transform: rotate(0deg); }\r\n to { transform: rotate(360deg); }\r\n }\r\n @keyframes kernel-pop {\r\n 0% { transform: translate(0, 0) scale(0) rotate(0deg); opacity: 0; }\r\n 10% { opacity: 1; transform: translate(var(--tx1), var(--ty1)) scale(1.3) rotate(45deg); }\r\n 40% { transform: translate(var(--tx2), var(--ty2)) scale(1) rotate(180deg); opacity: 1; }\r\n 100% { transform: translate(var(--tx3), var(--ty3)) scale(0.4) rotate(360deg); opacity: 0; }\r\n }\r\n @keyframes icon-cook {\r\n 0%, 100% { transform: scale(1.1) translateY(0); }\r\n 50% { transform: scale(0.9, 1.1) translateY(-3px) rotate(3deg); }\r\n }\r\n .animate-kernel { \r\n animation: kernel-pop var(--dur) cubic-bezier(0.34, 1.56, 0.64, 1) infinite;\r\n animation-delay: var(--delay);\r\n filter: drop-shadow(0 4px 6px rgba(0,0,0,0.15)); /* Added shadow for visibility */\r\n }\r\n .animate-cook { animation: icon-cook 0.3s ease-in-out infinite; }\r\n `}</style>\r\n\r\n <div className=\"relative flex items-center justify-center\">\r\n \r\n <PopcornIcon isSummarizing={isSummarizing} />\r\n\r\n {isSummarizing && (\r\n <div className=\"absolute inset-0 pointer-events-none\">\r\n {/* Kernel 1 - Bright Amber/Yellow */}\r\n <svg\r\n className=\"animate-kernel absolute w-4 h-4\"\r\n style={{\r\n \"--dur\": \"1.2s\",\r\n \"--delay\": \"0s\",\r\n \"--tx1\": \"-18px\",\r\n \"--ty1\": \"-22px\",\r\n \"--tx2\": \"-28px\",\r\n \"--ty2\": \"-28px\",\r\n \"--tx3\": \"-38px\",\r\n \"--ty3\": \"12px\",\r\n }}\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n d=\"M12 2a4 4 0 0 0-4 4 4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0 4-4 4 4 0 0 0-4-4 4 4 0 0 0-4-4z\"\r\n fill=\"#FBBF24\" // Amber-400\r\n stroke=\"#F59E0B\" // Amber-500\r\n strokeWidth=\"0.5\"\r\n />\r\n </svg>\r\n\r\n {/* Kernel 2 - Bright Yellow */}\r\n <svg\r\n className=\"animate-kernel absolute w-3.5 h-3.5\"\r\n style={{\r\n \"--dur\": \"1.5s\",\r\n \"--delay\": \"0.3s\",\r\n \"--tx1\": \"18px\",\r\n \"--ty1\": \"-28px\",\r\n \"--tx2\": \"28px\",\r\n \"--ty2\": \"-38px\",\r\n \"--tx3\": \"38px\",\r\n \"--ty3\": \"18px\",\r\n }}\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n d=\"M12 3c-2 0-3 1-4 2-1-1-3-1-4 1-1 2 0 4 1 5-1 1-1 3 1 4 2 1 4 0 6-1 2 1 4 2 6 1 2-1 2-3 1-4 1-1 2-3 1-5-1-2-3-2-4-1-1-1-2-2-4-2z\"\r\n fill=\"#FDE68A\" // Amber-200\r\n stroke=\"#FBBF24\" // Amber-400\r\n strokeWidth=\"0.5\"\r\n />\r\n </svg>\r\n\r\n {/* Kernel 3 - White Highlight Kernel */}\r\n <svg\r\n className=\"animate-kernel absolute w-4 h-4\"\r\n style={{\r\n \"--dur\": \"1.8s\",\r\n \"--delay\": \"0.7s\",\r\n \"--tx1\": \"-2px\",\r\n \"--ty1\": \"-28px\",\r\n \"--tx2\": \"5px\",\r\n \"--ty2\": \"-48px\",\r\n \"--tx3\": \"10px\",\r\n \"--ty3\": \"18px\",\r\n }}\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n d=\"M12 2a4 4 0 0 0-4 4 4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0 4-4 4 4 0 0 0-4-4 4 4 0 0 0-4-4z\"\r\n fill=\"#FEF3C7\" // Amber-50\r\n />\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <span\r\n className={`text-[12px] font-bold tracking-[0.25em] uppercase transition-all duration-300 ${\r\n isSummarizing\r\n ? \"text-violet-700\"\r\n : \"text-zinc-500 group-hover:text-zinc-900\"\r\n }`}\r\n >\r\n {isSummarizing ? \"Summarizing...\" : \"Summarize Scene\"}\r\n </span>\r\n </div>\r\n\r\n <span className=\"absolute bottom-0 left-0 right-0 h-[1px] bg-gradient-to-r from-transparent via-white/40 to-transparent\" />\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 } 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}: {\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?: (id: string, categoryId: ElementCategory) => 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}) {\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=\"p-8 md:p-12 mx-auto w-full min-h-screen flex flex-col gap-8\">\r\n <div className=\"flex flex-col lg:flex-row gap-8 items-start\">\r\n <div className=\"flex flex-col gap-4\">\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 {/* Menu rendered natively inside the relative block so it travels with the scroll */}\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={`absolute left-1/2 -translate-x-1/2 w-3.5 h-3.5 bg-white/90 border-white shadow-[4px_4px_10px_rgb(0,0,0,0.02)] rotate-45 rounded-sm ${menuPlacement === \"top\" ? \"-bottom-1.5 border-b border-r\" : \"-top-1.5 border-t border-l\"}`} /> */}\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 <div\r\n className=\"w-2 h-2 rounded-full shadow-sm group-hover:scale-125 transition-transform duration-300\"\r\n style={{ backgroundColor: cat.hex }}\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 {/* Allow removing existing tags that match the selection exactly */}\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 <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>\r\n </div>\r\n </div>\r\n\r\n <div className=\"w-full flex flex-col gap-6 sticky top-6\">\r\n <SummarizeButton\r\n isSummarizing={isSummarizing}\r\n onSummarize={onSummarize}\r\n />\r\n <div className=\"bg-white/50 backdrop-blur-2xl border border-white shadow-[0_8px_30px_rgb(0,0,0,0.04)] rounded-[2.5rem] p-8 w-full\">\r\n <h3 className=\"text-xs font-extrabold text-slate-800 uppercase tracking-[0.25em] mb-8 flex items-center gap-3\">\r\n <span className=\"flex items-center justify-center w-8 h-8 rounded-full bg-white/80 shadow-[0_4px_15px_rgb(0,0,0,0.04)] border border-white\">\r\n <Tags className=\"w-3.5 h-3.5 text-slate-500\" />\r\n </span>\r\n Tags\r\n <span className=\"ml-auto bg-slate-100/80 text-slate-500 px-2.5 py-1 rounded-lg text-[10px] font-bold tracking-widest border border-slate-200/50 shadow-inner\">\r\n {tags.length}\r\n </span>\r\n </h3>\r\n {tags.length > 0 ? (\r\n <div className=\"flex flex-col gap-8\">\r\n {CATEGORIES.map((cat) => {\r\n if (cat.id === \"SUBLOCATION\" && !hasLocationTag) return null;\r\n\r\n const catTags = Array.from(\r\n new Map(\r\n tags\r\n .filter((t) => t.category_id === cat.id)\r\n .map((tag) => [tag.name.toLowerCase(), tag]),\r\n ).values(),\r\n );\r\n if (catTags.length === 0) return null;\r\n return (\r\n <div key={cat.id} className=\"flex flex-col gap-4\">\r\n <h4 className=\"text-[10px] font-bold text-slate-400 uppercase tracking-[0.2em] flex items-center gap-2 border-b border-white/60 pb-2\">\r\n <div\r\n className=\"w-2 h-2 rounded-full shadow-sm\"\r\n style={{ backgroundColor: cat.hex }}\r\n />\r\n {cat.label}\r\n </h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {catTags.map((tag, index) => (\r\n <span\r\n key={index}\r\n className=\"text-[11px] font-bold px-3 py-1.5 rounded-xl bg-white/80 backdrop-blur-md border border-white shadow-[0_4px_15px_rgb(0,0,0,0.03)] hover:shadow-[0_4px_20px_rgb(0,0,0,0.06)] hover:-translate-y-0.5 transition-all duration-300 cursor-default\"\r\n style={{ color: cat.color }}\r\n >\r\n {tag.name}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <p className=\"text-xs font-medium text-slate-400 italic bg-white/40 p-6 rounded-[2rem] border border-white border-dashed text-center shadow-[0_4px_20px_rgb(0,0,0,0.02)]\">\r\n Highlight text to tag elements.\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\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 onTagRemoved?: (tagId: string) => void;\r\n onTagUpdated?: (tagId: string, categoryId: ElementCategory) => void;\r\n preLoadedTags?: Tag[];\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 newTags.push({\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\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 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 // 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 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 // 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 (id: string, categoryId: ElementCategory) => {\r\n const tagToUpdate = tags.find((t) => t.id === id);\r\n if (!tagToUpdate) return;\r\n\r\n // Optimistically update the UI\r\n setTags((prev) =>\r\n prev.map((t) => (t.id === id ? { ...t, category_id: categoryId } : t)),\r\n );\r\n clearSelection();\r\n\r\n try {\r\n await options.onTagUpdated?.(id, categoryId);\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) =>\r\n prev.map((t) =>\r\n t.id === id ? { ...t, category_id: tagToUpdate.category_id } : t,\r\n ),\r\n );\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"]}
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"],"names":["jsx","Clapperboard","Sparkles","UserRound","Brackets","MessageCircle","ArrowRightLeft","pdfjs","useState","useRef","_a","jsxs","Fragment","useEffect","Upload","Lock","Unlock","Save","FileDown","RefreshCcw","Cog","ArrowRight","User","ChevronRight","useMemo","useCallback","newBlockId","jsPDF","Loader2","AlignLeft","Tags","error"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\r\n Clapperboard,\r\n Sparkles,\r\n UserRound,\r\n Brackets,\r\n MessageCircle,\r\n ArrowRightLeft,\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: <Clapperboard className=\"w-5 h-5\" />,\r\n ACTION: <Sparkles className=\"w-5 h-5\" />,\r\n CHARACTER: <UserRound className=\"w-5 h-5\" />,\r\n PARENTHETICAL: <Brackets className=\"w-5 h-5\" />,\r\n DIALOGUE: <MessageCircle className=\"w-5 h-5\" />,\r\n TRANSITION: <ArrowRightLeft 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(\"&lt;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 gap-2 w-auto px-4 h-12 rounded-full bg-zinc-950 text-white shadow-xl shadow-zinc-900/20 border border-white/10 hover:bg-zinc-800 hover:scale-105 active:scale-95 transition-all duration-300 disabled:cursor-not-allowed disabled:bg-zinc-700 disabled:shadow-none disabled:border-zinc-600/50\"\r\n aria-label=\"Import Script\"\r\n >\r\n {isProcessing ? (\r\n <span className=\"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} 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} 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};\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 onSaveAsSbx,\r\n onSyncWithCloud,\r\n handleSceneNumberChange,\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 return (\r\n <>\r\n <div\r\n className=\"sticky top-6 z-50 mx-auto bg-white/70 backdrop-blur-2xl border border-white/60 shadow-[0_8px_30px_rgb(0,0,0,0.04)] rounded-[2rem] flex items-center justify-between p-2 mb-12 select-none transition-all\"\r\n style={{\r\n maxWidth: \"1240px\",\r\n }}\r\n >\r\n <div className=\"flex gap-1 overflow-x-auto custom-scrollbar pr-2 items-center\">\r\n {blockTypes.map((type) => {\r\n const selected =\r\n blocks.find((b) => b.id === focusedBlockId)?.type === type;\r\n return (\r\n <button\r\n key={type}\r\n type=\"button\"\r\n disabled={isLocked}\r\n className={`group flex items-center gap-2.5 px-4 py-2 rounded-full font-semibold text-sm transition-all duration-300 ease-out active:scale-95 ${\r\n selected\r\n ? \"bg-zinc-900 text-white shadow-md shadow-zinc-900/20\"\r\n : \"text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900\"\r\n } ${isLocked ? \"opacity-50 cursor-not-allowed\" : \"\"}`}\r\n onClick={() => handleBlockTypeChange(type)}\r\n >\r\n <input\r\n type=\"radio\"\r\n name=\"blockType\"\r\n id={`block-type-${type}`}\r\n className=\"sr-only\"\r\n aria-label={blockStyles[type].label}\r\n checked={selected}\r\n readOnly\r\n />\r\n <label\r\n htmlFor={`block-type-${type}`}\r\n className=\"flex items-center gap-2 cursor-pointer pointer-events-none\"\r\n >\r\n <div\r\n className={`${selected ? \"opacity-100\" : \"opacity-70 group-hover:opacity-100\"} transition-opacity duration-200`}\r\n >\r\n {icons[type]}\r\n </div>\r\n <span className=\"whitespace-nowrap hidden sm:inline tracking-wide\">\r\n {blockStyles[type].label}\r\n </span>\r\n </label>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1 shrink-0 relative px-1\">\r\n <div className=\"w-[1px] h-6 bg-zinc-200/80 mx-2 hidden sm:block rounded-full\"></div>\r\n {showPdfImport && !isLocked && (\r\n <PdfImporter disabled={isLocked} onScriptImported={handleScriptImport}>\r\n <div title=\"Import Script\">\r\n <Upload className=\"w-[18px] h-[18px]\" />\r\n </div>\r\n </PdfImporter>\r\n )}\r\n {onToggleLock && (\r\n <button\r\n onClick={onToggleLock}\r\n className={`flex items-center justify-center w-10 h-10 rounded-full transition-all duration-200 active:scale-95 ${\r\n isLocked\r\n ? \"text-rose-500 hover:bg-rose-50\"\r\n : \"text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900\"\r\n }`}\r\n title={isLocked ? \"Unlock Script\" : \"Lock Script\"}\r\n aria-label={isLocked ? \"Unlock Script\" : \"Lock Script\"}\r\n >\r\n {isLocked ? (\r\n <Lock className=\"w-[18px] h-[18px]\" />\r\n ) : (\r\n <Unlock className=\"w-[18px] h-[18px]\" />\r\n )}\r\n </button>\r\n )}\r\n {onSave && showSaveButton && !isLocked && (\r\n <button\r\n onClick={onSave}\r\n className=\"flex items-center justify-center w-10 h-10 rounded-full text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900 transition-all duration-200 active:scale-95\"\r\n title=\"Save Script\"\r\n aria-label=\"Save Script\"\r\n >\r\n <Save className=\"w-[18px] h-[18px]\" />\r\n </button>\r\n )}\r\n {onSaveAsPdf && showSaveButton && (\r\n <button\r\n onClick={onSaveAsPdf}\r\n className=\"flex items-center justify-center w-10 h-10 rounded-full text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900 transition-all duration-200 active:scale-95\"\r\n title=\"Save as PDF\"\r\n aria-label=\"Save Script as PDF\"\r\n >\r\n <FileDown className=\"w-[18px] h-[18px]\" />\r\n </button>\r\n )}\r\n {onSyncWithCloud && showSyncButton && !isLocked && (\r\n <button\r\n onClick={onSyncWithCloud}\r\n className=\"flex items-center justify-center w-10 h-10 rounded-full text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900 transition-all duration-200 active:scale-95\"\r\n title=\"Sync with Cloud\"\r\n aria-label=\"Sync with Cloud\"\r\n >\r\n <RefreshCcw className=\"w-[18px] h-[18px]\" />\r\n </button>\r\n )}\r\n <div ref={rulesRef} className=\"relative flex items-center\">\r\n <button\r\n onClick={() => setIsRulesOpen(!isRulesOpen)}\r\n className={`flex items-center justify-center w-10 h-10 rounded-full transition-all duration-200 active:scale-95 ${\r\n isRulesOpen\r\n ? \"bg-zinc-900 text-white shadow-md shadow-zinc-900/20\"\r\n : \"text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900\"\r\n }`}\r\n title=\"Settings & Shortcuts\"\r\n aria-label=\"Toggle Settings\"\r\n >\r\n <Cog className=\"w-[18px] h-[18px]\" />\r\n </button>\r\n\r\n {isRulesOpen && (\r\n <div className=\"absolute top-full mt-2 right-0 bg-white/95 backdrop-blur-3xl rounded-[1.5rem] shadow-[0_20px_60px_-15px_rgba(0,0,0,0.1)] p-5 text-sm text-zinc-700 select-none font-sans overflow-hidden transition-all duration-300 w-72 origin-top-right animate-in fade-in zoom-in-95 z-50\">\r\n <h4 className=\"font-bold text-zinc-900 mb-4 text-sm flex items-center gap-2\">\r\n <Cog className=\"w-4 h-4 text-zinc-400\" />\r\n Settings & Shortcuts\r\n </h4>\r\n <div className=\"space-y-4\">\r\n <ul className=\"space-y-2.5\">\r\n <li className=\"flex items-center justify-between gap-6\">\r\n <span className=\"font-medium text-zinc-600\">\r\n New Block\r\n </span>\r\n <kbd className=\"px-2 py-1 text-[11px] font-bold text-zinc-700 bg-white border border-zinc-200/80 shadow-[0_2px_4px_rgb(0,0,0,0.02)] rounded-md\">\r\n Enter\r\n </kbd>\r\n </li>\r\n <li className=\"flex items-center justify-between gap-6\">\r\n <span className=\"font-medium text-zinc-600\">\r\n Delete Block\r\n </span>\r\n <kbd className=\"px-2 py-1 text-[11px] font-bold text-zinc-700 bg-white border border-zinc-200/80 shadow-[0_2px_4px_rgb(0,0,0,0.02)] rounded-md\">\r\n Backspace\r\n </kbd>\r\n </li>\r\n <li className=\"flex items-center justify-between gap-6\">\r\n <span className=\"font-medium text-zinc-600\">\r\n Change Type\r\n </span>\r\n <div className=\"flex items-center gap-1\">\r\n <kbd className=\"px-2 py-1 text-[11px] font-bold text-zinc-700 bg-white border border-zinc-200/80 shadow-[0_2px_4px_rgb(0,0,0,0.02)] rounded-md\">\r\n Ctrl\r\n </kbd>\r\n <span className=\"text-zinc-400 font-medium\">+</span>\r\n <kbd className=\"px-2 py-1 text-[11px] font-bold text-zinc-700 bg-white border border-zinc-200/80 shadow-[0_2px_4px_rgb(0,0,0,0.02)] rounded-md\">\r\n ↑/↓\r\n </kbd>\r\n </div>\r\n </li>\r\n </ul>\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 w-full items-center pb-24\">\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-sky-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 </>\r\n )}\r\n </div>\r\n ))}\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","\"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}\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 blurTimeout = useRef<NodeJS.Timeout | null>(null);\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\r\n useEffect(() => {\r\n onSaveRef.current = options?.onSave;\r\n }, [options?.onSave]);\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 (title: string, content: string, preParsedBlocks?: Partial<Block>[], isInitialLoad?: boolean) => {\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 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 const sbxData = finalizedBlocks\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 (\r\n block.type === \"CHARACTER\" ||\r\n block.type === \"TRANSITION\"\r\n ) {\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 // 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 loadFromUrl = useCallback(\r\n async (url: string, fetchOptions: RequestInit = {}, isInitialLoad?: boolean) => {\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(\"&lt;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(filename, scriptContent, preParsedBlocks, isInitialLoad);\r\n } catch (error) {\r\n console.error(\r\n \"[useScreenplayEditor] Error loading script from URL:\",\r\n error,\r\n );\r\n throw error;\r\n }\r\n },\r\n [handleScriptImport],\r\n );\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 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 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","export 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 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}[] = [\r\n { id: \"CAST\", label: \"Cast\", color: \"#7C3AED\", hex: \"#A78BFA\" },\r\n { id: \"PROP\", label: \"Prop\", color: \"#FF6A00\", hex: \"#FFB86B\" },\r\n { id: \"COSTUME\", label: \"Costume\", color: \"#FF2E93\", hex: \"#FF8AC2\" },\r\n { id: \"VEHICLE\", label: \"Vehicle\", color: \"#00A6FF\", hex: \"#6ED6FF\" },\r\n { id: \"SET_PROP\", label: \"Set Prop\", color: \"#00C853\", hex: \"#69F0AE\" },\r\n { id: \"EXTRA\", label: \"Extra\", color: \"#00B8D4\", hex: \"#62EFFF\" },\r\n { id: \"LOCATION\", label: \"Location\", color: \"#FFB300\", hex: \"#FFE082\" },\r\n { id: \"SUBLOCATION\", label: \"Sublocation\", color: \"#004CFF\", hex: \"#004CFF\" },\r\n { id: \"OTHER\", label: \"Other\", color: \"#9E9E9E\", hex: \"#E0E0E0\" },\r\n];\r\n","import React from \"react\";\r\nimport { Popcorn } from \"lucide-react\";\r\n\r\nconst PopcornIcon = ({ isSummarizing }: { isSummarizing?: boolean }) => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n className={`w-6 h-6 transition-all duration-500 ${\r\n isSummarizing\r\n ? \"animate-cook\"\r\n : \"group-hover:scale-110 group-hover:-rotate-12\"\r\n }`}\r\n >\r\n {/* 1. THE POPCORN (Top Bubbles) - Yellow */}\r\n <path\r\n d=\"M18 8a2 2 0 0 0 0-4 2 2 0 0 0-4 0 2 2 0 0 0-4 0 2 2 0 0 0-4 0 2 2 0 0 0 0 4\"\r\n stroke=\"#facc15\"\r\n strokeWidth=\"2\"\r\n />\r\n\r\n {/* 2. THE CONTAINER (Bucket) - Red */}\r\n <g stroke=\"#ef4444\" strokeWidth=\"2\">\r\n {/* Outer Shell */}\r\n <path d=\"M20 8c.5 0 .9.4.8 1l-2.6 12c-.1.5-.7 1-1.2 1H7c-.6 0-1.1-.4-1.2-1L3.2 9c-.1-.6.3-1 .8-1Z\" />\r\n {/* Vertical Detail Lines */}\r\n <path d=\"M10 22 9 8\" strokeWidth=\"1\" />\r\n <path d=\"m14 22 1-14\" strokeWidth=\"1\" />\r\n </g>\r\n </svg>\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={`group relative w-full py-4 px-8 rounded-[3rem] transition-all duration-500 ease-[cubic-bezier(0.22,1,0.36,1)] border ${\r\n isSummarizing\r\n ? \"bg-zinc-100 border-zinc-300 opacity-100 cursor-wait shadow-inner\"\r\n : \"bg-gradient-to-b from-white via-zinc-50 to-zinc-100 border-white/70 shadow-[0_10px_30px_-10px_rgba(0,0,0,0.12),inset_0_1px_0_rgba(255,255,255,0.8)] hover:shadow-[0_20px_50px_-15px_rgba(139,92,246,0.3)] hover:-translate-y-[2px] active:scale-[0.98]\"\r\n }`}\r\n >\r\n {/* 1. Background Glow (Hover) */}\r\n <span className=\"absolute inset-0 opacity-0 group-hover:opacity-100 transition duration-700\">\r\n <span\r\n className=\"absolute inset-0 blur-3xl opacity-20\"\r\n style={{\r\n backgroundImage: \"conic-gradient(from 0deg at 50% 50%, #c084fc, transparent 60%, #fb7185, transparent 90%)\",\r\n animation: \"custom-spin 10s linear infinite\"\r\n }}\r\n />\r\n </span>\r\n\r\n {/* 2. Heat Glow (Stronger Contrast for Summarizing) */}\r\n <span\r\n className={`absolute inset-0 transition-opacity duration-700 ${isSummarizing ? \"opacity-100\" : \"opacity-0\"}`}\r\n style={{\r\n backgroundImage: \"radial-gradient(circle at 50% 50%, rgba(139, 92, 246, 0.1), transparent 70%)\"\r\n }}\r\n />\r\n\r\n <div className=\"relative flex items-center justify-center gap-4\">\r\n <style>{`\r\n @keyframes custom-spin {\r\n from { transform: rotate(0deg); }\r\n to { transform: rotate(360deg); }\r\n }\r\n @keyframes kernel-pop {\r\n 0% { transform: translate(0, 0) scale(0) rotate(0deg); opacity: 0; }\r\n 10% { opacity: 1; transform: translate(var(--tx1), var(--ty1)) scale(1.3) rotate(45deg); }\r\n 40% { transform: translate(var(--tx2), var(--ty2)) scale(1) rotate(180deg); opacity: 1; }\r\n 100% { transform: translate(var(--tx3), var(--ty3)) scale(0.4) rotate(360deg); opacity: 0; }\r\n }\r\n @keyframes icon-cook {\r\n 0%, 100% { transform: scale(1.1) translateY(0); }\r\n 50% { transform: scale(0.9, 1.1) translateY(-3px) rotate(3deg); }\r\n }\r\n .animate-kernel { \r\n animation: kernel-pop var(--dur) cubic-bezier(0.34, 1.56, 0.64, 1) infinite;\r\n animation-delay: var(--delay);\r\n filter: drop-shadow(0 4px 6px rgba(0,0,0,0.15)); /* Added shadow for visibility */\r\n }\r\n .animate-cook { animation: icon-cook 0.3s ease-in-out infinite; }\r\n `}</style>\r\n\r\n <div className=\"relative flex items-center justify-center\">\r\n \r\n <PopcornIcon isSummarizing={isSummarizing} />\r\n\r\n {isSummarizing && (\r\n <div className=\"absolute inset-0 pointer-events-none\">\r\n {/* Kernel 1 - Bright Amber/Yellow */}\r\n <svg\r\n className=\"animate-kernel absolute w-4 h-4\"\r\n style={{\r\n \"--dur\": \"1.2s\",\r\n \"--delay\": \"0s\",\r\n \"--tx1\": \"-18px\",\r\n \"--ty1\": \"-22px\",\r\n \"--tx2\": \"-28px\",\r\n \"--ty2\": \"-28px\",\r\n \"--tx3\": \"-38px\",\r\n \"--ty3\": \"12px\",\r\n }}\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n d=\"M12 2a4 4 0 0 0-4 4 4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0 4-4 4 4 0 0 0-4-4 4 4 0 0 0-4-4z\"\r\n fill=\"#FBBF24\" // Amber-400\r\n stroke=\"#F59E0B\" // Amber-500\r\n strokeWidth=\"0.5\"\r\n />\r\n </svg>\r\n\r\n {/* Kernel 2 - Bright Yellow */}\r\n <svg\r\n className=\"animate-kernel absolute w-3.5 h-3.5\"\r\n style={{\r\n \"--dur\": \"1.5s\",\r\n \"--delay\": \"0.3s\",\r\n \"--tx1\": \"18px\",\r\n \"--ty1\": \"-28px\",\r\n \"--tx2\": \"28px\",\r\n \"--ty2\": \"-38px\",\r\n \"--tx3\": \"38px\",\r\n \"--ty3\": \"18px\",\r\n }}\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n d=\"M12 3c-2 0-3 1-4 2-1-1-3-1-4 1-1 2 0 4 1 5-1 1-1 3 1 4 2 1 4 0 6-1 2 1 4 2 6 1 2-1 2-3 1-4 1-1 2-3 1-5-1-2-3-2-4-1-1-1-2-2-4-2z\"\r\n fill=\"#FDE68A\" // Amber-200\r\n stroke=\"#FBBF24\" // Amber-400\r\n strokeWidth=\"0.5\"\r\n />\r\n </svg>\r\n\r\n {/* Kernel 3 - White Highlight Kernel */}\r\n <svg\r\n className=\"animate-kernel absolute w-4 h-4\"\r\n style={{\r\n \"--dur\": \"1.8s\",\r\n \"--delay\": \"0.7s\",\r\n \"--tx1\": \"-2px\",\r\n \"--ty1\": \"-28px\",\r\n \"--tx2\": \"5px\",\r\n \"--ty2\": \"-48px\",\r\n \"--tx3\": \"10px\",\r\n \"--ty3\": \"18px\",\r\n }}\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n d=\"M12 2a4 4 0 0 0-4 4 4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0 4-4 4 4 0 0 0-4-4 4 4 0 0 0-4-4z\"\r\n fill=\"#FEF3C7\" // Amber-50\r\n />\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <span\r\n className={`text-[12px] font-bold tracking-[0.25em] uppercase transition-all duration-300 ${\r\n isSummarizing\r\n ? \"text-violet-700\"\r\n : \"text-zinc-500 group-hover:text-zinc-900\"\r\n }`}\r\n >\r\n {isSummarizing ? \"Summarizing...\" : \"Summarize Scene\"}\r\n </span>\r\n </div>\r\n\r\n <span className=\"absolute bottom-0 left-0 right-0 h-[1px] bg-gradient-to-r from-transparent via-white/40 to-transparent\" />\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 } 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}: {\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?: (id: string, categoryId: ElementCategory) => 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}) {\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=\"p-8 md:p-12 mx-auto w-full min-h-screen flex flex-col gap-8\">\r\n <div className=\"flex flex-col lg:flex-row gap-8 items-start\">\r\n <div className=\"flex flex-col gap-4\">\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 {/* Menu rendered natively inside the relative block so it travels with the scroll */}\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={`absolute left-1/2 -translate-x-1/2 w-3.5 h-3.5 bg-white/90 border-white shadow-[4px_4px_10px_rgb(0,0,0,0.02)] rotate-45 rounded-sm ${menuPlacement === \"top\" ? \"-bottom-1.5 border-b border-r\" : \"-top-1.5 border-t border-l\"}`} /> */}\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 <div\r\n className=\"w-2 h-2 rounded-full shadow-sm group-hover:scale-125 transition-transform duration-300\"\r\n style={{ backgroundColor: cat.hex }}\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 {/* Allow removing existing tags that match the selection exactly */}\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 <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>\r\n </div>\r\n </div>\r\n\r\n <div className=\"w-full flex flex-col gap-6 sticky top-6\">\r\n {!aiSummarized && (\r\n <SummarizeButton\r\n isSummarizing={isSummarizing}\r\n onSummarize={onSummarize}\r\n />\r\n )}\r\n <div className=\"bg-white/50 backdrop-blur-2xl border border-white shadow-[0_8px_30px_rgb(0,0,0,0.04)] rounded-[2.5rem] p-8 w-full\">\r\n <h3 className=\"text-xs font-extrabold text-slate-800 uppercase tracking-[0.25em] mb-8 flex items-center gap-3\">\r\n <span className=\"flex items-center justify-center w-8 h-8 rounded-full bg-white/80 shadow-[0_4px_15px_rgb(0,0,0,0.04)] border border-white\">\r\n <Tags className=\"w-3.5 h-3.5 text-slate-500\" />\r\n </span>\r\n Tags\r\n <span className=\"ml-auto bg-slate-100/80 text-slate-500 px-2.5 py-1 rounded-lg text-[10px] font-bold tracking-widest border border-slate-200/50 shadow-inner\">\r\n {tags.length}\r\n </span>\r\n </h3>\r\n {tags.length > 0 ? (\r\n <div className=\"flex flex-col gap-8\">\r\n {CATEGORIES.map((cat) => {\r\n if (cat.id === \"SUBLOCATION\" && !hasLocationTag) return null;\r\n\r\n const catTags = Array.from(\r\n new Map(\r\n tags\r\n .filter((t) => t.category_id === cat.id)\r\n .map((tag) => [tag.name.toLowerCase(), tag]),\r\n ).values(),\r\n );\r\n if (catTags.length === 0) return null;\r\n return (\r\n <div key={cat.id} className=\"flex flex-col gap-4\">\r\n <h4 className=\"text-[10px] font-bold text-slate-400 uppercase tracking-[0.2em] flex items-center gap-2 border-b border-white/60 pb-2\">\r\n <div\r\n className=\"w-2 h-2 rounded-full shadow-sm\"\r\n style={{ backgroundColor: cat.hex }}\r\n />\r\n {cat.label}\r\n </h4>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {catTags.map((tag, index) => (\r\n <span\r\n key={index}\r\n className=\"text-[11px] font-bold px-3 py-1.5 rounded-xl bg-white/80 backdrop-blur-md border border-white shadow-[0_4px_15px_rgb(0,0,0,0.03)] hover:shadow-[0_4px_20px_rgb(0,0,0,0.06)] hover:-translate-y-0.5 transition-all duration-300 cursor-default\"\r\n style={{ color: cat.color }}\r\n >\r\n {tag.name}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : (\r\n <p className=\"text-xs font-medium text-slate-400 italic bg-white/40 p-6 rounded-[2rem] border border-white border-dashed text-center shadow-[0_4px_20px_rgb(0,0,0,0.02)]\">\r\n Highlight text to tag elements.\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\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?: (tagId: string, categoryId: ElementCategory) => void;\r\n preLoadedTags?: Tag[];\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 newTags.push({\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\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 });\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 && !autoTaggedSceneRef.current) {\r\n // If pre-loaded tags are provided, we should not run the initial auto-tagging.\r\n // This prevents creating duplicate tags, which might have different IDs but\r\n // represent the same element.\r\n const hasPreloadedTags =\r\n options.preLoadedTags && options.preLoadedTags.length > 0;\r\n\r\n if (hasPreloadedTags) {\r\n autoTaggedSceneRef.current = options.scene_url;\r\n return;\r\n }\r\n\r\n autoTaggedSceneRef.current = options.scene_url;\r\n await bulkCreateTags();\r\n }\r\n };\r\n doBulkCreate();\r\n }, [blocks, options.scene_url, options.preLoadedTags, bulkCreateTags]);\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 // 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 (id: string, categoryId: ElementCategory) => {\r\n const tagToUpdate = tags.find((t) => t.id === id);\r\n if (!tagToUpdate) return;\r\n\r\n // Optimistically update the UI\r\n setTags((prev) =>\r\n prev.map((t) => (t.id === id ? { ...t, category_id: categoryId } : t)),\r\n );\r\n clearSelection();\r\n\r\n try {\r\n await options.onTagUpdated?.(id, categoryId);\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) =>\r\n prev.map((t) =>\r\n t.id === id ? { ...t, category_id: tagToUpdate.category_id } : t,\r\n ),\r\n );\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"]}