{"version":3,"sources":["../src/SilentSheet.tsx"],"names":["widths","backgrounds","formatTime","seconds","mins","secs","SilentSheet","placeholder","onChange","instance","useRef","CoreSilentSheet","uiState","setUIState","useState","stats","setStats","actions","textareaRef","timeoutRef","updateUIState","useCallback","updateStats","text","trimmedText","words","chars","saveContent","content","handleContentChange","textarea","lines","prevLines","useEffect","unsubscribe","handleContentBlur","jsx","jsxs","cursorPosition","selectionEnd","currentPos","currentLineEnd","line","clickPosition","selectionStart","FiCopy","blob","url","FiDownload","FiTrash2"],"mappings":"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","file":"index.mjs","sourcesContent":["import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { SilentSheet as CoreSilentSheet, Size, Theme, Font } from '@silentsheet/core';\nimport { FiCopy, FiDownload, FiTrash2 } from 'react-icons/fi';\nimport './styles.css';\n\nconst widths: Record<Size, string> = {\n  small: '50%',\n  medium: '75%',\n  large: '90%',\n  full: '100%'\n};\n\nconst backgrounds: Record<Theme, string> = {\n  sepia: '#f9f7ee',\n  light: '#ffffff',\n  night: '#1a1a1a'\n};\n\ninterface SilentSheetProps {\n  placeholder?: string;\n  onChange?: (text: string) => void;\n}\n\nconst formatTime = (seconds: number): string => {\n  const mins = Math.floor(seconds / 60);\n  const secs = seconds % 60;\n  return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n};\n\nexport const SilentSheet: React.FC<SilentSheetProps> = ({ \n  placeholder = \"Begin your story here...\",\n  onChange \n}) => {\n  const instance = useRef(new CoreSilentSheet());\n  const [uiState, setUIState] = useState(instance.current.getState());\n  const [stats, setStats] = useState({ words: 0, chars: 0 });\n  const actions = instance.current.getActions();\n  const textareaRef = useRef<HTMLTextAreaElement>(null);\n  const timeoutRef = useRef<NodeJS.Timeout>();\n\n  const updateUIState = useCallback(() => {\n    setUIState(instance.current.getState());\n  }, []);\n\n  const updateStats = useCallback((text: string) => {\n    const trimmedText = text.trim();\n    const words = trimmedText ? trimmedText.split(/\\s+/).length : 0;\n    const chars = text.length;\n    setStats({ words, chars });\n  }, []);\n\n  const saveContent = useCallback((content: string) => {\n    actions.setContent(content);\n    actions.saveContent();\n  }, [actions]);\n\n  const handleContentChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n    if (timeoutRef.current) {\n      clearTimeout(timeoutRef.current);\n    }\n    \n    if (uiState.hemingwayMode) {\n      const textarea = e.target;\n      const lines = textarea.value.split('\\n');\n      const prevLines = uiState.content.split('\\n');\n      \n      // Check if any previous lines were modified\n      for (let i = 0; i < prevLines.length - 1; i++) {\n        if (i < lines.length && lines[i] !== prevLines[i]) {\n          // Revert the change\n          textarea.value = uiState.content;\n          return;\n        }\n      }\n    }\n    \n    const text = e.target.value;\n    updateStats(text);\n    onChange?.(text);\n    timeoutRef.current = setTimeout(() => {\n      saveContent(text);\n    }, 1000);\n  }, [saveContent, updateStats, onChange, uiState.hemingwayMode, uiState.content]);\n\n  useEffect(() => {\n    updateStats(uiState.content);\n  }, [uiState.content, updateStats]);\n\n  useEffect(() => {\n    return () => {\n      if (timeoutRef.current) {\n        clearTimeout(timeoutRef.current);\n      }\n    };\n  }, []);\n\n  useEffect(() => {\n    const unsubscribe = instance.current.subscribeToUI(updateUIState);\n    return () => unsubscribe();\n  }, [updateUIState]);\n\n  const handleContentBlur = useCallback(() => {\n    if (textareaRef.current) {\n      saveContent(textareaRef.current.value);\n    }\n  }, [saveContent]);\n\n  return (\n    <div \n      className=\"silentsheet-root\"\n      data-theme={uiState.theme}\n      style={{\n        background: backgrounds[uiState.theme],\n        color: uiState.theme === 'night' ? '#ffffff' : '#000000'\n      }}\n    >\n      <div \n        className=\"container\"\n        style={{\n          width: widths[uiState.size]\n        }}\n      >\n        <a\n          href=\"https://github.com/hamzasaleem2/silentsheet\"\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n          className=\"github-link\"\n        >\n          open source\n        </a>\n        <textarea\n          ref={textareaRef}\n          className={`textarea ${uiState.hemingwayMode ? 'hemingway-mode' : ''}`}\n          style={{\n            fontFamily: uiState.font,\n            fontSize: `${uiState.fontSize}px`\n          }}\n          defaultValue={uiState.content}\n          onChange={handleContentChange}\n          onBlur={handleContentBlur}\n          onKeyDown={e => {\n            if (uiState.hemingwayMode) {\n              const textarea = e.target as HTMLTextAreaElement;\n              const cursorPosition = textarea.selectionStart;\n              const selectionEnd = textarea.selectionEnd;\n              \n              if (cursorPosition === selectionEnd) {\n                if (e.key === 'Backspace') {\n                  const lines = textarea.value.split('\\n');\n                  let currentPos = 0;\n                  let currentLineEnd = 0;\n                  \n                  for (const line of lines) {\n                    currentLineEnd = currentPos + line.length;\n                    if (currentPos <= cursorPosition && cursorPosition <= currentLineEnd) {\n                      if (cursorPosition > currentPos) {\n                        return;\n                      }\n                      break;\n                    }\n                    currentPos = currentLineEnd + 1;\n                  }\n                  e.preventDefault();\n                }\n              } else {\n                e.preventDefault();\n              }\n            }\n          }}\n          onMouseDown={e => {\n            if (uiState.hemingwayMode) {\n              const textarea = e.target as HTMLTextAreaElement;\n              const clickPosition = textarea.selectionStart;\n              const lines = textarea.value.split('\\n');\n              let currentPos = 0;\n              \n              // Find the last line's starting position\n              for (let i = 0; i < lines.length - 1; i++) {\n                currentPos += lines[i].length + 1;\n              }\n              \n              // If click is before the last line, prevent it\n              if (clickPosition < currentPos) {\n                e.preventDefault();\n                e.stopPropagation();\n                // Force cursor to the end\n                setTimeout(() => {\n                  textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n                }, 0);\n              }\n            }\n          }}\n          onClick={e => {\n            if (uiState.hemingwayMode) {\n              const textarea = e.target as HTMLTextAreaElement;\n              const clickPosition = textarea.selectionStart;\n              const lines = textarea.value.split('\\n');\n              let currentPos = 0;\n              \n              for (let i = 0; i < lines.length - 1; i++) {\n                currentPos += lines[i].length + 1;\n              }\n              \n              if (clickPosition < currentPos) {\n                e.preventDefault();\n                e.stopPropagation();\n                textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n              }\n            }\n          }}\n          onSelect={e => {\n            if (uiState.hemingwayMode) {\n              const textarea = e.target as HTMLTextAreaElement;\n              const selectionStart = textarea.selectionStart;\n              const lines = textarea.value.split('\\n');\n              let currentPos = 0;\n              \n              for (let i = 0; i < lines.length - 1; i++) {\n                currentPos += lines[i].length + 1;\n              }\n              \n              if (selectionStart < currentPos) {\n                e.preventDefault();\n                e.stopPropagation();\n                requestAnimationFrame(() => {\n                  textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n                });\n              }\n            }\n          }}\n          placeholder={uiState.hemingwayMode ? \"Write freely. Each line is a fresh start...\" : placeholder}\n          spellCheck={false}\n          autoComplete=\"off\"\n          autoCorrect=\"off\"\n          autoCapitalize=\"off\"\n          data-gramm=\"false\"\n        />\n        <div className=\"controls\">\n          <div className=\"controls-group\">\n            <button\n              className=\"timer-button\"\n              onClick={actions.toggleTimer}\n              title={`${uiState.timerRunning ? 'Stop' : 'Start'} Timer`}\n            >\n              {formatTime(uiState.timerSeconds)}\n            </button>\n            <select\n              className=\"select\"\n              value={uiState.hemingwayMode ? \"hemingway\" : \"edit\"}\n              onChange={e => {\n                if ((e.target.value === \"hemingway\") !== uiState.hemingwayMode) {\n                  actions.toggleHemingwayMode();\n                }\n              }}\n              title={uiState.hemingwayMode ? \"Hemingway Mode: Write forward, no looking back\" : \"Edit Mode: Free editing\"}\n              style={{\n                '--bg-color': backgrounds[uiState.theme],\n                '--text-color': uiState.theme === 'night' ? '#ffffff' : '#000000'\n              } as React.CSSProperties}\n            >\n              <option value=\"edit\">Edit</option>\n              <option value=\"hemingway\">Hemingway</option>\n            </select>\n            <select\n              className=\"select\"\n              value={uiState.font}\n              onChange={e => {\n                actions.setFont(e.target.value as Font);\n                updateUIState();\n              }}\n              title=\"Font Family\"\n              style={{\n                '--bg-color': backgrounds[uiState.theme],\n                '--text-color': uiState.theme === 'night' ? '#ffffff' : '#000000'\n              } as React.CSSProperties}\n            >\n              <option value=\"serif\">Serif</option>\n              <option value=\"sans-serif\">Sans Serif</option>\n              <option value=\"monospace\">Monospace</option>\n            </select>\n            <div className=\"font-size-control\">\n              <input\n                type=\"range\"\n                className=\"range\"\n                min=\"14\"\n                max=\"28\"\n                value={uiState.fontSize}\n                onChange={e => {\n                  actions.setFontSize(Number(e.target.value));\n                  updateUIState();\n                }}\n                title=\"Font Size\"\n              />\n              <span className=\"font-size-value\">{uiState.fontSize}</span>\n            </div>\n          </div>\n          <div className=\"controls-group\">\n            <select\n              className=\"select\"\n              value={uiState.theme}\n              onChange={e => {\n                actions.setTheme(e.target.value as Theme);\n                updateUIState();\n              }}\n              title=\"Theme\"\n              style={{\n                '--bg-color': backgrounds[uiState.theme],\n                '--text-color': uiState.theme === 'night' ? '#ffffff' : '#000000'\n              } as React.CSSProperties}\n            >\n              <option value=\"light\">Light</option>\n              <option value=\"sepia\">Sepia</option>\n              <option value=\"night\">Night</option>\n            </select>\n            <select\n              className=\"select\"\n              value={uiState.size}\n              onChange={e => {\n                actions.setSize(e.target.value as Size);\n                updateUIState();\n              }}\n              title=\"Width\"\n              style={{\n                '--bg-color': backgrounds[uiState.theme],\n                '--text-color': uiState.theme === 'night' ? '#ffffff' : '#000000'\n              } as React.CSSProperties}\n            >\n              <option value=\"small\">Small</option>\n              <option value=\"medium\">Medium</option>\n              <option value=\"large\">Large</option>\n              <option value=\"full\">Full</option>\n            </select>\n          </div>\n          <div className=\"controls-group\">\n            <button \n              className=\"icon-button\"\n              onClick={() => {\n                if (textareaRef.current) {\n                  navigator.clipboard.writeText(textareaRef.current.value);\n                }\n              }}\n              title=\"Copy to Clipboard\"\n            >\n              <FiCopy />\n            </button>\n            <button \n              className=\"icon-button\"\n              onClick={() => {\n                if (textareaRef.current) {\n                  const blob = new Blob([textareaRef.current.value], { type: 'text/plain' });\n                  const url = URL.createObjectURL(blob);\n                  const a = document.createElement('a');\n                  a.href = url;\n                  a.download = 'silentsheet.txt';\n                  a.click();\n                  URL.revokeObjectURL(url);\n                }\n              }}\n              title=\"Download as Text\"\n            >\n              <FiDownload />\n            </button>\n            <button \n              className=\"icon-button\"\n              onClick={() => {\n                if (textareaRef.current) {\n                  textareaRef.current.value = '';\n                  actions.clearContent();\n                  updateUIState();\n                }\n              }}\n              title=\"Clear Content\"\n            >\n              <FiTrash2 />\n            </button>\n          </div>\n        </div>\n        <div className=\"word-count\">\n          {stats.words} words, {stats.chars} characters\n        </div>\n      </div>\n    </div>\n  );\n}; "]}