@vishu1301/script-writing 0.3.3 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../app/index.ts","../app/view/screenplay-editor.view.tsx","../app/types/screenplay-editor.types.tsx","../app/hook/use-screenplay-editor.ts","../app/service/screenplay-editor.service.ts"],"sourcesContent":["export { ScreenplayEditorView } from \"./view/screenplay-editor.view\";\r\nexport { useScreenplayEditor } from \"./hook/use-screenplay-editor\";\r\nexport * from \"./types/screenplay-editor.types\";\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 locations,\r\n characters,\r\n sceneNumbers,\r\n handleBlockTextChange,\r\n handleSceneTypeChange,\r\n handleTimeOfDayChange,\r\n handleBlockTypeChange,\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\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 p-16 md:p-20 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-[5rem] 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 </>\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 {\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 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 leading-relaxed\",\r\n inputStyle: {\r\n outline: \"none\",\r\n whiteSpace: \"pre-wrap\",\r\n overflowWrap: \"break-word\",\r\n wordBreak: \"break-word\",\r\n lineHeight: 1.7,\r\n },\r\n },\r\n CHARACTER: {\r\n label: \"Character\",\r\n className:\r\n \"uppercase font-bold text-center text-zinc-900 tracking-widest\",\r\n inputStyle: {\r\n textTransform: \"uppercase\",\r\n textAlign: \"center\",\r\n fontWeight: 700,\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-center text-zinc-600\",\r\n inputStyle: {\r\n fontStyle: \"normal\",\r\n maxWidth: \"20rem\",\r\n margin: \"0 auto\",\r\n outline: \"none\",\r\n whiteSpace: \"pre-wrap\",\r\n overflowWrap: \"break-word\",\r\n wordBreak: \"break-word\",\r\n textAlign: \"center\",\r\n },\r\n },\r\n DIALOGUE: {\r\n label: \"Dialogue\",\r\n className: \"text-zinc-900 leading-relaxed max-w-[30rem] mx-auto\",\r\n inputStyle: {\r\n marginLeft: \"auto\",\r\n marginRight: \"auto\",\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: 1.7,\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};","\"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 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 // 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) => b.text.trim().toUpperCase());\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 refs.current[newBlockId]?.focus();\r\n setFocusedBlockId(newBlockId);\r\n setNewBlockId(null);\r\n }\r\n }, [newBlockId]);\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 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((id: string, text: string) => {\r\n setBlocks((bs) => ScreenplayService.updateBlock(bs, id, \"text\", text));\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 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.innerText = \"\";\r\n el.focus();\r\n }\r\n }, 0);\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 setBlocks((bs) => {\r\n const block = bs.find((b) => b.id === id);\r\n if (!block) return bs;\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 return ScreenplayService.updateBlock(bs, id, \"type\", blockTypes[newIdx]);\r\n });\r\n };\r\n\r\n const handleKeyDown = useCallback(\r\n (e: KeyboardEvent<HTMLDivElement>, id: string, text: string) => {\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 requestAnimationFrame(() => focusBlock(id));\r\n } else if (e.key === \"ArrowDown\" && e.ctrlKey) {\r\n e.preventDefault();\r\n cycleBlockType(id, \"down\");\r\n requestAnimationFrame(() => focusBlock(id));\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],\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 setShowSuggestions(true);\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(() => setShowSuggestions(false), 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 locations,\r\n characters,\r\n sceneNumbers,\r\n handleBlockTextChange,\r\n handleSceneTypeChange,\r\n handleTimeOfDayChange,\r\n handleBlockTypeChange,\r\n handleKeyDown,\r\n handleFocus,\r\n handleBlur,\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 }\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}"],"mappings":"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","names":["import_lucide_react","import_jsx_runtime","import_react","newBlockId"]}