@vishu1301/script-writing 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +384 -42
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -2
- package/dist/index.d.ts +6 -2
- package/dist/index.js +365 -43
- package/dist/index.js.map +1 -1
- package/package.json +3 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../app/types/screenplay-editor.types.tsx","../app/view/screenplay-editor.view.tsx","../app/service/screenplay-editor.service.ts","../app/hook/use-screenplay-editor.ts"],"names":["jsx","Clapperboard","Sparkles","UserRound","Brackets","MessageCircle","ArrowRightLeft","useState","jsxs","Fragment","ArrowRight","User","ChevronRight","Save","FileDown","Cog","useRef","useCallback","useMemo","useEffect","newBlockId"],"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 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\nimport React, { useState } 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} from \"lucide-react\";\r\n\r\ntype ScreenplayEditorViewProps = ReturnType<typeof useScreenplayEditor> & {\r\n onSave?: () => void;\r\n onSaveAsPdf?: () => void;\r\n onSyncWithCloud?: () => void;\r\n};\r\nexport function ScreenplayEditorView({\r\n blocks,\r\n pages,\r\n isPageSplitEnabled,\r\n togglePageSplit,\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 handleFocus,\r\n handleBlur,\r\n onSave,\r\n onSaveAsPdf,\r\n onSyncWithCloud,\r\n}: ScreenplayEditorViewProps) {\r\n const [isRulesOpen, setIsRulesOpen] = useState(false);\r\n return (\r\n <>\r\n <div className=\"sticky top-6 z-50 bg-white backdrop-blur-xl border border-white/10 rounded-full shadow-2xl flex gap-1 max-w-fit p-1.5 mb-12 select-none overflow-x-auto custom-scrollbar\">\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 className={`flex items-center gap-2 px-4 py-2.5 rounded-full font-medium text-sm transition-all duration-300 ${\r\n selected\r\n ? \"bg-zinc-900 text-white shadow-sm\"\r\n : \"text-zinc-400 hover:bg-zinc-800/10 hover:text-zinc-800\"\r\n }`}\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\"\r\n >\r\n {icons[type]}\r\n <span className=\"whitespace-nowrap hidden sm:inline\">\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 flex-col gap-12 w-full items-center pb-24\">\r\n {pages.map((pageBlocks, pageIndex) => (\r\n <div\r\n key={pageIndex}\r\n className=\"relative bg-[#fdfdfc] shadow-2xl shadow-zinc-300/60 ring-1 ring-zinc-200/50 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:\r\n \"var(--font-courier-prime, 'Courier New', Courier, monospace)\",\r\n }}\r\n >\r\n {pageBlocks.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 <span className=\"absolute -left-16 top-2 w-12 text-right text-zinc-400 font-semibold select-none\">\r\n {String(sceneNumbers[block.id] || 0)}\r\n </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 w-fit transition-colors\"\r\n aria-label=\"Scene Type\"\r\n value={block.sceneType ?? \"INT.\"}\r\n onChange={(e) =>\r\n handleSceneTypeChange(block.id, e.target.value as any)\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\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 onInput={(e) =>\r\n handleBlockTextChange(\r\n block.id,\r\n (e.target as HTMLDivElement).innerText,\r\n )\r\n }\r\n onKeyDown={(e) =>\r\n handleKeyDown(e, block.id, block.text)\r\n }\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 value={block.timeOfDay ?? \"DAY\"}\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\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 {isPageSplitEnabled && (\r\n <div className=\"absolute bottom-10 right-16 md:right-20 text-zinc-400 font-semibold text-sm select-none pointer-events-none\">\r\n {pageIndex + 1}.\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n <div className=\"fixed bottom-6 right-6 flex flex-col items-end gap-4 z-50\">\r\n {onSave && (\r\n <button\r\n onClick={onSave}\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\"\r\n aria-label=\"Save Script\"\r\n >\r\n <Save className=\"w-5 h-5\" />\r\n <span className=\"text-sm font-semibold\">Save</span>\r\n </button>\r\n )}\r\n {onSaveAsPdf && (\r\n <button\r\n onClick={onSaveAsPdf}\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\"\r\n aria-label=\"Save Script as PDF\"\r\n >\r\n <FileDown className=\"w-5 h-5\" />\r\n <span className=\"text-sm font-semibold\">Save as PDF</span>\r\n </button>\r\n )}\r\n {isRulesOpen && (\r\n <div className=\"bg-white/80 backdrop-blur-md rounded-xl shadow-lg border border-zinc-200/50 p-4 text-xs text-zinc-700 select-none font-sans overflow-hidden transition-all duration-300 w-64 origin-bottom-right animate-in fade-in zoom-in-95\">\r\n <h4 className=\"font-bold text-zinc-800 mb-3 text-sm\">\r\n Settings & Shortcuts\r\n </h4>\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between gap-6\">\r\n <span className=\"font-semibold text-zinc-800\">\r\n A4 Page Split\r\n </span>\r\n <button\r\n type=\"button\"\r\n role=\"switch\"\r\n aria-checked={isPageSplitEnabled}\r\n onClick={togglePageSplit}\r\n className={`${\r\n isPageSplitEnabled ? \"bg-zinc-900\" : \"bg-zinc-300\"\r\n } relative inline-flex h-5 w-9 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none`}\r\n >\r\n <span\r\n aria-hidden=\"true\"\r\n className={`${\r\n isPageSplitEnabled ? \"translate-x-4\" : \"translate-x-0\"\r\n } pointer-events-none inline-block h-4 w-4 transform rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out`}\r\n />\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-1.5 pt-3 border-t border-zinc-200/50\">\r\n <ul className=\"space-y-1.5\">\r\n <li className=\"flex items-center justify-between gap-6\">\r\n <span>New Block</span>\r\n <kbd className=\"px-2 py-1 text-xs font-semibold text-zinc-800 bg-zinc-200/70 border border-zinc-300/70 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>Delete Block</span>\r\n <kbd className=\"px-2 py-1 text-xs font-semibold text-zinc-800 bg-zinc-200/70 border border-zinc-300/70 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>Change Type</span>\r\n <div className=\"flex items-center gap-1\">\r\n <kbd className=\"px-2 py-1 text-xs font-semibold text-zinc-800 bg-zinc-200/70 border border-zinc-300/70 rounded-md\">\r\n Ctrl\r\n </kbd>\r\n <span>+</span>\r\n <kbd className=\"px-2 py-1 text-xs font-semibold text-zinc-800 bg-zinc-200/70 border border-zinc-300/70 rounded-md\">\r\n ↑/↓\r\n </kbd>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n <button\r\n onClick={() => setIsRulesOpen(!isRulesOpen)}\r\n className={`flex items-center justify-center w-12 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 ${\r\n isRulesOpen ? \"rotate-90\" : \"rotate-0\"\r\n }`}\r\n aria-label=\"Toggle Settings\"\r\n >\r\n <Cog className=\"w-5 h-5\" />\r\n </button>\r\n </div>\r\n </>\r\n );\r\n}\r\n","import { Block, BlockType, uuid } 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 if (type === \"SCENE_HEADING\") {\r\n newBlock.sceneType = \"INT.\";\r\n newBlock.timeOfDay = \"DAY\";\r\n } else if (type === \"PARENTHETICAL\") {\r\n newBlock.text = \"()\";\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) {\r\n return { newBlocks: blocks, newBlockId: \"\" };\r\n }\r\n\r\n const currentBlock = blocks[currentIndex];\r\n const nextType = getNextBlockType(currentBlock.type);\r\n const newBlock = createNewBlock(nextType);\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\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 function changeBlockType(blocks: Block[], id: string, newType: BlockType) {\r\n const newBlock = createNewBlock(newType);\r\n return blocks.map((b) => (b.id === id ? { ...newBlock, id: b.id } : b));\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 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 function useScreenplayEditor() {\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] = useState(false);\r\n const blurTimeout = useRef<NodeJS.Timeout | null>(null);\r\n\r\n const [isPageSplitEnabled, setIsPageSplitEnabled] = useState(false);\r\n const [pageBreaks, setPageBreaks] = useState<string[]>([]);\r\n const focusStateRef = useRef<{ id: string; offset: number } | null>(null);\r\n\r\n const togglePageSplit = useCallback(() => {\r\n if (\r\n focusedBlockId &&\r\n document.activeElement &&\r\n document.activeElement.hasAttribute(\"contenteditable\")\r\n ) {\r\n const el = refs.current[focusedBlockId];\r\n if (el) {\r\n const offset = getCaretCharacterOffsetWithin(el);\r\n focusStateRef.current = { id: focusedBlockId, offset };\r\n }\r\n }\r\n setIsPageSplitEnabled((prev) => !prev);\r\n }, [focusedBlockId]);\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 // 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, number> = {};\r\n let count = 0;\r\n blocks.forEach((block) => {\r\n if (block.type === \"SCENE_HEADING\") {\r\n count++;\r\n map[block.id] = count;\r\n }\r\n });\r\n return map;\r\n }, [blocks]);\r\n\r\n // Effects\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 (\r\n element &&\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 }, [blocks, isPageSplitEnabled, pageBreaks]);\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 useEffect(() => {\r\n if (!isPageSplitEnabled) {\r\n setPageBreaks([]);\r\n return;\r\n }\r\n\r\n const saveFocus = () => {\r\n if (\r\n focusedBlockId &&\r\n document.activeElement &&\r\n document.activeElement.hasAttribute(\"contenteditable\")\r\n ) {\r\n const el = refs.current[focusedBlockId];\r\n if (el) {\r\n const offset = getCaretCharacterOffsetWithin(el);\r\n focusStateRef.current = { id: focusedBlockId, offset };\r\n }\r\n } else {\r\n focusStateRef.current = null;\r\n }\r\n };\r\n\r\n const timeoutId = setTimeout(() => {\r\n let currentHeight = 0;\r\n let hasSceneOnCurrentPage = false;\r\n const A4_HEIGHT = 960; // Approximate content height of A4 inside padding limits\r\n const newPageBreaks: string[] = [];\r\n\r\n blocks.forEach((block) => {\r\n const el = refs.current[block.id];\r\n if (el) {\r\n const measureEl =\r\n document.querySelector(`[data-block-id=\"${block.id}\"]`) || el;\r\n const style = window.getComputedStyle(measureEl);\r\n const marginTop = parseFloat(style.marginTop) || 0;\r\n const marginBottom = parseFloat(style.marginBottom) || 0;\r\n const height =\r\n measureEl.getBoundingClientRect().height + marginTop + marginBottom;\r\n\r\n let breakPage = false;\r\n if (currentHeight + height > A4_HEIGHT) {\r\n breakPage = true;\r\n } else if (block.type === \"SCENE_HEADING\") {\r\n if (hasSceneOnCurrentPage) {\r\n breakPage = true;\r\n } else if (currentHeight > A4_HEIGHT - 120) {\r\n // Widow control for SCENE_HEADING: if near bottom, push to next page\r\n breakPage = true;\r\n }\r\n }\r\n\r\n if (breakPage && currentHeight > 0) {\r\n newPageBreaks.push(block.id);\r\n currentHeight = height;\r\n hasSceneOnCurrentPage = block.type === \"SCENE_HEADING\";\r\n } else {\r\n currentHeight += height;\r\n if (block.type === \"SCENE_HEADING\") {\r\n hasSceneOnCurrentPage = true;\r\n }\r\n }\r\n }\r\n });\r\n\r\n setPageBreaks((prev) => {\r\n if (prev.length !== newPageBreaks.length) {\r\n saveFocus();\r\n return newPageBreaks;\r\n }\r\n for (let i = 0; i < prev.length; i++) {\r\n if (prev[i] !== newPageBreaks[i]) {\r\n saveFocus();\r\n return newPageBreaks;\r\n }\r\n }\r\n return prev;\r\n });\r\n }, 300);\r\n\r\n return () => clearTimeout(timeoutId);\r\n }, [blocks, isPageSplitEnabled, focusedBlockId]);\r\n\r\n const pages = useMemo(() => {\r\n if (!isPageSplitEnabled || pageBreaks.length === 0) return [blocks];\r\n const result: Block[][] = [];\r\n let currentPage: Block[] = [];\r\n for (const block of blocks) {\r\n if (pageBreaks.includes(block.id) && currentPage.length > 0) {\r\n result.push(currentPage);\r\n currentPage = [];\r\n }\r\n currentPage.push(block);\r\n }\r\n if (currentPage.length > 0) result.push(currentPage);\r\n return result;\r\n }, [blocks, isPageSplitEnabled, pageBreaks]);\r\n\r\n useEffect(() => {\r\n if (focusStateRef.current) {\r\n const { id, offset } = focusStateRef.current;\r\n const el = refs.current[id];\r\n if (el && document.activeElement !== el) {\r\n el.focus();\r\n setCaretPosition(el, offset);\r\n }\r\n focusStateRef.current = null;\r\n }\r\n }, [pages]);\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.substring(0, offset).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 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 const newBlock = ScreenplayService.createNewBlock(newType);\r\n el.innerText = newBlock.text;\r\n if (newType === \"PARENTHETICAL\") {\r\n setCaretPosition(el, 1);\r\n } else {\r\n setCaretPosition(el, newBlock.text.length);\r\n }\r\n }\r\n }, 0);\r\n },\r\n [focusedBlockId],\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\r\n ? block.text.substring(0, parenIndex)\r\n : 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 const newBlock = ScreenplayService.createNewBlock(newType);\r\n el.innerText = newBlock.text;\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 (e.key === \"Delete\" && (offset >= text.length - 1 || text === \"()\")) {\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 handleFocus = useCallback((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 }, [blocks]);\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 return {\r\n blocks,\r\n pages,\r\n isPageSplitEnabled,\r\n togglePageSplit,\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 handleFocus,\r\n handleBlur,\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"],"names":["jsx","Clapperboard","Sparkles","UserRound","Brackets","MessageCircle","ArrowRightLeft","pdfjs","useState","useRef","jsxs","Fragment","ArrowRight","User","ChevronRight","Upload","Save","FileDown","Cog","useCallback","useMemo","useEffect","newBlockId"],"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: (title: string, content: string) => void;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function PdfImporter({ onScriptImported, 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 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((item): item is pdfjs.TextItem => 'str' in item && item.str.trim().length > 0);\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 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) { // 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({ y: item.transform[5], items: [{ x: item.transform[4], text: item.str }] });\r\n }\r\n }\r\n\r\n lines.sort((a, b) => b.y - a.y);\r\n\r\n return lines.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 }).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 = 2; 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(err instanceof Error ? `Error processing PDF: ${err.message}` : 'An unknown error occurred.');\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=\"application/pdf\"\r\n onChange={handleFileChange}\r\n disabled={isProcessing}\r\n className=\"hidden\"\r\n id=\"pdf-importer-input\"\r\n />\r\n <button\r\n onClick={handleClick}\r\n disabled={isProcessing}\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\"\r\n aria-label=\"Import Script from PDF\"\r\n >\r\n {isProcessing ? <span className=\"text-sm font-semibold\">Processing...</span> : children}\r\n </button>\r\n {error && <p className=\"sr-only\">Error: {error}</p>}\r\n </>\r\n );\r\n}","\"use client\";\r\nimport React, { useState } 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} from \"lucide-react\";\r\n\r\nimport { PdfImporter } from \"../components/PdfImporter\";\r\n\r\ntype ScreenplayEditorViewProps = ReturnType<typeof useScreenplayEditor> & {\r\n onSave?: () => void;\r\n onSaveAsPdf?: () => void;\r\n onSyncWithCloud?: () => void;\r\n handleSceneNumberChange: (blockId: string, value: string) => void;\r\n};\r\nexport function ScreenplayEditorView({\r\n blocks,\r\n pages,\r\n isPageSplitEnabled,\r\n togglePageSplit,\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 handleFocus,\r\n handleBlur,\r\n handleScriptImport,\r\n onSave,\r\n onSaveAsPdf,\r\n onSyncWithCloud,\r\n handleSceneNumberChange,\r\n}: ScreenplayEditorViewProps) {\r\n const [isRulesOpen, setIsRulesOpen] = useState(false);\r\n return (\r\n <>\r\n <div className=\"sticky top-6 z-50 bg-white backdrop-blur-xl border border-white/10 rounded-full shadow-2xl flex gap-1 max-w-fit p-1.5 mb-12 select-none overflow-x-auto custom-scrollbar\">\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 className={`flex items-center gap-2 px-4 py-2.5 rounded-full font-medium text-sm transition-all duration-300 ${\r\n selected\r\n ? \"bg-zinc-900 text-white shadow-sm\"\r\n : \"text-zinc-400 hover:bg-zinc-800/10 hover:text-zinc-800\"\r\n }`}\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\"\r\n >\r\n {icons[type]}\r\n <span className=\"whitespace-nowrap hidden sm:inline\">\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 flex-col gap-12 w-full items-center pb-24\">\r\n {pages.map((pageBlocks, pageIndex) => (\r\n <div\r\n key={pageIndex}\r\n className=\"relative bg-[#fdfdfc] shadow-2xl shadow-zinc-300/60 ring-1 ring-zinc-200/50 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:\r\n \"var(--font-courier-prime, 'Courier New', Courier, monospace)\",\r\n }}\r\n >\r\n {pageBlocks.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 // 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 value={block.sceneType ?? \"INT.\"}\r\n onChange={(e) =>\r\n handleSceneTypeChange(block.id, e.target.value as any)\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\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 onInput={(e) =>\r\n handleBlockTextChange(\r\n block.id,\r\n (e.target as HTMLDivElement).innerText,\r\n )\r\n }\r\n onKeyDown={(e) =>\r\n handleKeyDown(e, block.id, block.text)\r\n }\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 value={block.timeOfDay ?? \"DAY\"}\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\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 {isPageSplitEnabled && (\r\n <div className=\"absolute bottom-10 right-16 md:right-20 text-zinc-400 font-semibold text-sm select-none pointer-events-none\">\r\n {pageIndex + 1}.\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n <div className=\"fixed bottom-6 right-6 flex flex-col items-end gap-4 z-50\">\r\n <PdfImporter onScriptImported={handleScriptImport}>\r\n <>\r\n <Upload className=\"w-5 h-5\" />\r\n <span className=\"text-sm font-semibold\">Import</span>\r\n </>\r\n </PdfImporter>\r\n {onSave && (\r\n <button\r\n onClick={onSave}\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\"\r\n aria-label=\"Save Script\"\r\n >\r\n <Save className=\"w-5 h-5\" />\r\n <span className=\"text-sm font-semibold\">Save</span>\r\n </button>\r\n )}\r\n {onSaveAsPdf && (\r\n <button\r\n onClick={onSaveAsPdf}\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\"\r\n aria-label=\"Save Script as PDF\"\r\n >\r\n <FileDown className=\"w-5 h-5\" />\r\n <span className=\"text-sm font-semibold\">Save as PDF</span>\r\n </button>\r\n )}\r\n {isRulesOpen && (\r\n <div className=\"bg-white/80 backdrop-blur-md rounded-xl shadow-lg border border-zinc-200/50 p-4 text-xs text-zinc-700 select-none font-sans overflow-hidden transition-all duration-300 w-64 origin-bottom-right animate-in fade-in zoom-in-95\">\r\n <h4 className=\"font-bold text-zinc-800 mb-3 text-sm\">\r\n Settings & Shortcuts\r\n </h4>\r\n <div className=\"space-y-4\">\r\n <div className=\"flex items-center justify-between gap-6\">\r\n <span className=\"font-semibold text-zinc-800\">\r\n A4 Page Split\r\n </span>\r\n <button\r\n type=\"button\"\r\n role=\"switch\"\r\n aria-checked={isPageSplitEnabled}\r\n onClick={togglePageSplit}\r\n className={`${\r\n isPageSplitEnabled ? \"bg-zinc-900\" : \"bg-zinc-300\"\r\n } relative inline-flex h-5 w-9 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none`}\r\n >\r\n <span\r\n aria-hidden=\"true\"\r\n className={`${\r\n isPageSplitEnabled ? \"translate-x-4\" : \"translate-x-0\"\r\n } pointer-events-none inline-block h-4 w-4 transform rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out`}\r\n />\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-1.5 pt-3 border-t border-zinc-200/50\">\r\n <ul className=\"space-y-1.5\">\r\n <li className=\"flex items-center justify-between gap-6\">\r\n <span>New Block</span>\r\n <kbd className=\"px-2 py-1 text-xs font-semibold text-zinc-800 bg-zinc-200/70 border border-zinc-300/70 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>Delete Block</span>\r\n <kbd className=\"px-2 py-1 text-xs font-semibold text-zinc-800 bg-zinc-200/70 border border-zinc-300/70 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>Change Type</span>\r\n <div className=\"flex items-center gap-1\">\r\n <kbd className=\"px-2 py-1 text-xs font-semibold text-zinc-800 bg-zinc-200/70 border border-zinc-300/70 rounded-md\">\r\n Ctrl\r\n </kbd>\r\n <span>+</span>\r\n <kbd className=\"px-2 py-1 text-xs font-semibold text-zinc-800 bg-zinc-200/70 border border-zinc-300/70 rounded-md\">\r\n ↑/↓\r\n </kbd>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n <button\r\n onClick={() => setIsRulesOpen(!isRulesOpen)}\r\n className={`flex items-center justify-center w-12 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 ${\r\n isRulesOpen ? \"rotate-90\" : \"rotate-0\"\r\n }`}\r\n aria-label=\"Toggle Settings\"\r\n >\r\n <Cog className=\"w-5 h-5\" />\r\n </button>\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 function useScreenplayEditor() {\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\r\n const [isPageSplitEnabled, setIsPageSplitEnabled] = useState(false);\r\n const [pageBreaks, setPageBreaks] = useState<string[]>([]);\r\n const focusStateRef = useRef<{ id: string; offset: number } | null>(null);\r\n\r\n const togglePageSplit = useCallback(() => {\r\n if (\r\n focusedBlockId &&\r\n document.activeElement &&\r\n document.activeElement.hasAttribute(\"contenteditable\")\r\n ) {\r\n const el = refs.current[focusedBlockId];\r\n if (el) {\r\n const offset = getCaretCharacterOffsetWithin(el);\r\n focusStateRef.current = { id: focusedBlockId, offset };\r\n }\r\n }\r\n setIsPageSplitEnabled((prev) => !prev);\r\n }, [focusedBlockId]);\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 const renumberScript = useCallback(() => {\r\n let count = 1;\r\n setBlocks((prev) =>\r\n prev.map((b) => {\r\n if (b.type === \"SCENE_HEADING\") {\r\n // Ignore what was imported and force 1, 2, 3...\r\n return { ...b, sceneNumber: String(count++) };\r\n }\r\n return b;\r\n }),\r\n );\r\n }, []);\r\n\r\n // Effects\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 useEffect(() => {\r\n if (!isPageSplitEnabled) {\r\n setPageBreaks([]);\r\n return;\r\n }\r\n\r\n const saveFocus = () => {\r\n if (\r\n focusedBlockId &&\r\n document.activeElement &&\r\n document.activeElement.hasAttribute(\"contenteditable\")\r\n ) {\r\n const el = refs.current[focusedBlockId];\r\n if (el) {\r\n const offset = getCaretCharacterOffsetWithin(el);\r\n focusStateRef.current = { id: focusedBlockId, offset };\r\n }\r\n } else {\r\n focusStateRef.current = null;\r\n }\r\n };\r\n\r\n const timeoutId = setTimeout(() => {\r\n let currentHeight = 0;\r\n let hasSceneOnCurrentPage = false;\r\n const A4_HEIGHT = 960; // Approximate content height of A4 inside padding limits\r\n const newPageBreaks: string[] = [];\r\n\r\n blocks.forEach((block) => {\r\n const el = refs.current[block.id];\r\n if (el) {\r\n const measureEl =\r\n document.querySelector(`[data-block-id=\"${block.id}\"]`) || el;\r\n const style = window.getComputedStyle(measureEl);\r\n const marginTop = parseFloat(style.marginTop) || 0;\r\n const marginBottom = parseFloat(style.marginBottom) || 0;\r\n const height =\r\n measureEl.getBoundingClientRect().height + marginTop + marginBottom;\r\n\r\n let breakPage = false;\r\n if (currentHeight + height > A4_HEIGHT) {\r\n breakPage = true;\r\n } else if (block.type === \"SCENE_HEADING\") {\r\n if (hasSceneOnCurrentPage) {\r\n breakPage = true;\r\n } else if (currentHeight > A4_HEIGHT - 120) {\r\n // Widow control for SCENE_HEADING: if near bottom, push to next page\r\n breakPage = true;\r\n }\r\n }\r\n\r\n if (breakPage && currentHeight > 0) {\r\n newPageBreaks.push(block.id);\r\n currentHeight = height;\r\n hasSceneOnCurrentPage = block.type === \"SCENE_HEADING\";\r\n } else {\r\n currentHeight += height;\r\n if (block.type === \"SCENE_HEADING\") {\r\n hasSceneOnCurrentPage = true;\r\n }\r\n }\r\n }\r\n });\r\n\r\n setPageBreaks((prev) => {\r\n if (prev.length !== newPageBreaks.length) {\r\n saveFocus();\r\n return newPageBreaks;\r\n }\r\n for (let i = 0; i < prev.length; i++) {\r\n if (prev[i] !== newPageBreaks[i]) {\r\n saveFocus();\r\n return newPageBreaks;\r\n }\r\n }\r\n return prev;\r\n });\r\n }, 300);\r\n\r\n return () => clearTimeout(timeoutId);\r\n }, [blocks, isPageSplitEnabled, focusedBlockId]);\r\n\r\n const pages = useMemo(() => {\r\n if (!isPageSplitEnabled || pageBreaks.length === 0) return [blocks];\r\n const result: Block[][] = [];\r\n let currentPage: Block[] = [];\r\n for (const block of blocks) {\r\n if (pageBreaks.includes(block.id) && currentPage.length > 0) {\r\n result.push(currentPage);\r\n currentPage = [];\r\n }\r\n currentPage.push(block);\r\n }\r\n if (currentPage.length > 0) result.push(currentPage);\r\n return result;\r\n }, [blocks, isPageSplitEnabled, pageBreaks]);\r\n\r\n useEffect(() => {\r\n if (focusStateRef.current) {\r\n const { id, offset } = focusStateRef.current;\r\n const el = refs.current[id];\r\n if (el && document.activeElement !== el) {\r\n el.focus();\r\n setCaretPosition(el, offset);\r\n }\r\n focusStateRef.current = null;\r\n }\r\n }, [pages]);\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) => {\r\n const parsedBlocks = ScreenplayService.parseScreenplayText(content);\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 // 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 return {\r\n blocks,\r\n pages,\r\n isPageSplitEnabled,\r\n togglePageSplit,\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 };\r\n}\r\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -8,6 +8,7 @@ interface Block {
|
|
|
8
8
|
id: string;
|
|
9
9
|
type: BlockType;
|
|
10
10
|
text: string;
|
|
11
|
+
sceneNumber?: string;
|
|
11
12
|
sceneType?: "INT." | "EXT." | "INT/EXT.";
|
|
12
13
|
timeOfDay?: TimeOfDay;
|
|
13
14
|
}
|
|
@@ -32,13 +33,15 @@ declare function useScreenplayEditor(): {
|
|
|
32
33
|
characterExtensions: string[];
|
|
33
34
|
locations: string[];
|
|
34
35
|
characters: string[];
|
|
35
|
-
sceneNumbers: Record<string,
|
|
36
|
+
sceneNumbers: Record<string, string>;
|
|
36
37
|
handleBlockTextChange: (id: string, text: string) => void;
|
|
37
38
|
handleSceneTypeChange: (id: string, sceneType: "INT." | "EXT." | "INT/EXT.") => void;
|
|
38
39
|
handleTimeOfDayChange: (id: string, time: TimeOfDay) => void;
|
|
39
40
|
handleBlockTypeChange: (newType: BlockType) => void;
|
|
40
41
|
handleSelectCharacterExtension: (extension: string) => void;
|
|
41
42
|
handleKeyDown: (e: KeyboardEvent<HTMLDivElement>, id: string, text: string) => void;
|
|
43
|
+
handleScriptImport: (title: string, content: string) => void;
|
|
44
|
+
handleSceneNumberChange: (id: string, newNumber: string) => void;
|
|
42
45
|
handleFocus: (id: string) => void;
|
|
43
46
|
handleBlur: (id: string) => void;
|
|
44
47
|
};
|
|
@@ -47,7 +50,8 @@ type ScreenplayEditorViewProps = ReturnType<typeof useScreenplayEditor> & {
|
|
|
47
50
|
onSave?: () => void;
|
|
48
51
|
onSaveAsPdf?: () => void;
|
|
49
52
|
onSyncWithCloud?: () => void;
|
|
53
|
+
handleSceneNumberChange: (blockId: string, value: string) => void;
|
|
50
54
|
};
|
|
51
|
-
declare function ScreenplayEditorView({ blocks, pages, isPageSplitEnabled, togglePageSplit, refs, focusedBlockId, showSuggestions, showExtensionSuggestions, characterExtensions, locations, characters, sceneNumbers, handleBlockTextChange, handleSceneTypeChange, handleTimeOfDayChange, handleBlockTypeChange, handleSelectCharacterExtension, handleKeyDown, handleFocus, handleBlur, onSave, onSaveAsPdf, onSyncWithCloud, }: ScreenplayEditorViewProps): react_jsx_runtime.JSX.Element;
|
|
55
|
+
declare function ScreenplayEditorView({ blocks, pages, isPageSplitEnabled, togglePageSplit, refs, focusedBlockId, showSuggestions, showExtensionSuggestions, characterExtensions, locations, characters, sceneNumbers, handleBlockTextChange, handleSceneTypeChange, handleTimeOfDayChange, handleBlockTypeChange, handleSelectCharacterExtension, handleKeyDown, handleFocus, handleBlur, handleScriptImport, onSave, onSaveAsPdf, onSyncWithCloud, handleSceneNumberChange, }: ScreenplayEditorViewProps): react_jsx_runtime.JSX.Element;
|
|
52
56
|
|
|
53
57
|
export { type Block, type BlockType, ScreenplayEditorView, type TimeOfDay, blockStyles, blockTypes, icons, timeOfDayOptions, useScreenplayEditor, uuid };
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ interface Block {
|
|
|
8
8
|
id: string;
|
|
9
9
|
type: BlockType;
|
|
10
10
|
text: string;
|
|
11
|
+
sceneNumber?: string;
|
|
11
12
|
sceneType?: "INT." | "EXT." | "INT/EXT.";
|
|
12
13
|
timeOfDay?: TimeOfDay;
|
|
13
14
|
}
|
|
@@ -32,13 +33,15 @@ declare function useScreenplayEditor(): {
|
|
|
32
33
|
characterExtensions: string[];
|
|
33
34
|
locations: string[];
|
|
34
35
|
characters: string[];
|
|
35
|
-
sceneNumbers: Record<string,
|
|
36
|
+
sceneNumbers: Record<string, string>;
|
|
36
37
|
handleBlockTextChange: (id: string, text: string) => void;
|
|
37
38
|
handleSceneTypeChange: (id: string, sceneType: "INT." | "EXT." | "INT/EXT.") => void;
|
|
38
39
|
handleTimeOfDayChange: (id: string, time: TimeOfDay) => void;
|
|
39
40
|
handleBlockTypeChange: (newType: BlockType) => void;
|
|
40
41
|
handleSelectCharacterExtension: (extension: string) => void;
|
|
41
42
|
handleKeyDown: (e: KeyboardEvent<HTMLDivElement>, id: string, text: string) => void;
|
|
43
|
+
handleScriptImport: (title: string, content: string) => void;
|
|
44
|
+
handleSceneNumberChange: (id: string, newNumber: string) => void;
|
|
42
45
|
handleFocus: (id: string) => void;
|
|
43
46
|
handleBlur: (id: string) => void;
|
|
44
47
|
};
|
|
@@ -47,7 +50,8 @@ type ScreenplayEditorViewProps = ReturnType<typeof useScreenplayEditor> & {
|
|
|
47
50
|
onSave?: () => void;
|
|
48
51
|
onSaveAsPdf?: () => void;
|
|
49
52
|
onSyncWithCloud?: () => void;
|
|
53
|
+
handleSceneNumberChange: (blockId: string, value: string) => void;
|
|
50
54
|
};
|
|
51
|
-
declare function ScreenplayEditorView({ blocks, pages, isPageSplitEnabled, togglePageSplit, refs, focusedBlockId, showSuggestions, showExtensionSuggestions, characterExtensions, locations, characters, sceneNumbers, handleBlockTextChange, handleSceneTypeChange, handleTimeOfDayChange, handleBlockTypeChange, handleSelectCharacterExtension, handleKeyDown, handleFocus, handleBlur, onSave, onSaveAsPdf, onSyncWithCloud, }: ScreenplayEditorViewProps): react_jsx_runtime.JSX.Element;
|
|
55
|
+
declare function ScreenplayEditorView({ blocks, pages, isPageSplitEnabled, togglePageSplit, refs, focusedBlockId, showSuggestions, showExtensionSuggestions, characterExtensions, locations, characters, sceneNumbers, handleBlockTextChange, handleSceneTypeChange, handleTimeOfDayChange, handleBlockTypeChange, handleSelectCharacterExtension, handleKeyDown, handleFocus, handleBlur, handleScriptImport, onSave, onSaveAsPdf, onSyncWithCloud, handleSceneNumberChange, }: ScreenplayEditorViewProps): react_jsx_runtime.JSX.Element;
|
|
52
56
|
|
|
53
57
|
export { type Block, type BlockType, ScreenplayEditorView, type TimeOfDay, blockStyles, blockTypes, icons, timeOfDayOptions, useScreenplayEditor, uuid };
|