react-os-shell 1.3.0 → 1.4.0

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.
Files changed (30) hide show
  1. package/dist/{Browser-VTTA3X6R.js → Browser-L5CB7K7B.js} +4 -4
  2. package/dist/{Browser-VTTA3X6R.js.map → Browser-L5CB7K7B.js.map} +1 -1
  3. package/dist/{Documents-RRKY4LNJ.js → Documents-3V4WI42V.js} +3 -3
  4. package/dist/{Documents-RRKY4LNJ.js.map → Documents-3V4WI42V.js.map} +1 -1
  5. package/dist/{Files-QM7OERST.js → Files-3R7EHNSF.js} +7 -7
  6. package/dist/{Files-QM7OERST.js.map → Files-3R7EHNSF.js.map} +1 -1
  7. package/dist/{Notepad-7HBOCTJX.js → Notepad-6V4JVBVJ.js} +3 -3
  8. package/dist/{Notepad-7HBOCTJX.js.map → Notepad-6V4JVBVJ.js.map} +1 -1
  9. package/dist/Preview-BTFJ7A6T.js +9 -0
  10. package/dist/{Preview-S54JZBKK.js.map → Preview-BTFJ7A6T.js.map} +1 -1
  11. package/dist/{Spreadsheet-PRO6WI45.js → Spreadsheet-UAYZUO4B.js} +4 -4
  12. package/dist/{Spreadsheet-PRO6WI45.js.map → Spreadsheet-UAYZUO4B.js.map} +1 -1
  13. package/dist/apps/index.js +12 -12
  14. package/dist/{chunk-V2BMSY64.js → chunk-2HWXLIAQ.js} +4 -4
  15. package/dist/{chunk-V2BMSY64.js.map → chunk-2HWXLIAQ.js.map} +1 -1
  16. package/dist/{chunk-T4USMWTS.js → chunk-5BZBQGMU.js} +3 -3
  17. package/dist/{chunk-T4USMWTS.js.map → chunk-5BZBQGMU.js.map} +1 -1
  18. package/dist/{chunk-BDGH2GKX.js → chunk-CJH5U3BW.js} +3 -3
  19. package/dist/{chunk-BDGH2GKX.js.map → chunk-CJH5U3BW.js.map} +1 -1
  20. package/dist/{chunk-DLOIO7UD.js → chunk-EUP5PCNL.js} +3 -3
  21. package/dist/{chunk-DLOIO7UD.js.map → chunk-EUP5PCNL.js.map} +1 -1
  22. package/dist/{chunk-WMOF4TAP.js → chunk-HBJUIVN3.js} +4 -4
  23. package/dist/{chunk-WMOF4TAP.js.map → chunk-HBJUIVN3.js.map} +1 -1
  24. package/dist/{chunk-HQWHWS7V.js → chunk-T6TOGZ2V.js} +3 -3
  25. package/dist/{chunk-HQWHWS7V.js.map → chunk-T6TOGZ2V.js.map} +1 -1
  26. package/dist/index.d.ts +21 -2
  27. package/dist/index.js +49 -18
  28. package/dist/index.js.map +1 -1
  29. package/package.json +1 -1
  30. package/dist/Preview-S54JZBKK.js +0 -9
@@ -1,7 +1,7 @@
1
- export { Browser as default, setBrowserStartUrl } from './chunk-T4USMWTS.js';
2
- import './chunk-DLOIO7UD.js';
1
+ export { Browser as default, setBrowserStartUrl } from './chunk-5BZBQGMU.js';
2
+ import './chunk-EUP5PCNL.js';
3
3
  import './chunk-GWVVILYQ.js';
4
4
  import './chunk-UBN4IUDE.js';
5
5
  import './chunk-ZF6AYO4G.js';
6
- //# sourceMappingURL=Browser-VTTA3X6R.js.map
7
- //# sourceMappingURL=Browser-VTTA3X6R.js.map
6
+ //# sourceMappingURL=Browser-L5CB7K7B.js.map
7
+ //# sourceMappingURL=Browser-L5CB7K7B.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"Browser-VTTA3X6R.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"Browser-L5CB7K7B.js"}
@@ -1,5 +1,5 @@
1
1
  import { toast_default } from './chunk-WIJ45SYD.js';
2
- import { AboutApp } from './chunk-DLOIO7UD.js';
2
+ import { AboutApp } from './chunk-EUP5PCNL.js';
3
3
  import { WindowTitle } from './chunk-GWVVILYQ.js';
4
4
  import './chunk-UBN4IUDE.js';
5
5
  import './chunk-ZF6AYO4G.js';
@@ -300,5 +300,5 @@ function Documents() {
300
300
  }
301
301
 
302
302
  export { Documents as default };
303
- //# sourceMappingURL=Documents-RRKY4LNJ.js.map
304
- //# sourceMappingURL=Documents-RRKY4LNJ.js.map
303
+ //# sourceMappingURL=Documents-3V4WI42V.js.map
304
+ //# sourceMappingURL=Documents-3V4WI42V.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/Documents.tsx"],"names":[],"mappings":"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","file":"Documents-RRKY4LNJ.js","sourcesContent":["/**\n * Documents — windowed viewer / light editor for plain-text and Word\n * documents. TXT-family files (.txt, .md, .csv, .log, .json, .xml,\n * .html, .css, .ts, .tsx, .js, .jsx, .py, .yml, .yaml, .toml, .sh)\n * open in an editable textarea. Word .docx files are converted to\n * read-only HTML via mammoth (an optional peer dep).\n *\n * Open files via the toolbar's Open button or by dragging them onto\n * the window.\n */\nimport { useState, useRef, useEffect } from 'react';\nimport { WindowTitle } from '../shell/Modal';\nimport toast from '../shell/toast';\nimport AboutApp from './_about';\n\nconst TITLE_DISPLAY_MAX = 24;\nfunction truncateForTitle(s: string) {\n return s.length > TITLE_DISPLAY_MAX ? `${s.slice(0, TITLE_DISPLAY_MAX - 1)}…` : s;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"']/g, c => ({\n '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;',\n }[c] || c));\n}\n\nconst TEXT_EXTS = new Set([\n 'txt', 'md', 'markdown', 'csv', 'tsv', 'log', 'json', 'xml',\n 'html', 'htm', 'css', 'js', 'jsx', 'ts', 'tsx', 'py', 'rb',\n 'go', 'rs', 'java', 'c', 'h', 'cpp', 'hpp', 'sh', 'bash',\n 'yml', 'yaml', 'toml', 'ini', 'conf', 'env', 'sql',\n]);\nconst DOCX_EXTS = new Set(['docx']);\n\ninterface DocData {\n filename: string;\n kind: 'text' | 'docx';\n content: string;\n /** Original mime / extension hint for the download button. */\n ext: string;\n}\n\nconst BLANK_DOC: DocData = { filename: 'Untitled', kind: 'docx', content: '', ext: 'docx' };\n\nexport default function Documents() {\n // Documents is for editing — open with a blank paper-style canvas so the\n // user can start typing immediately. Loading a file replaces this state.\n const [data, setData] = useState<DocData>(BLANK_DOC);\n const [busy, setBusy] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [edited, setEdited] = useState(false);\n const fileRef = useRef<HTMLInputElement>(null);\n const editorRef = useRef<HTMLDivElement>(null);\n\n // Apply a formatting command to the current selection in the editor.\n const exec = (cmd: string, value?: string) => {\n editorRef.current?.focus();\n document.execCommand(cmd, false, value);\n setEdited(true);\n };\n\n // Pull current HTML out of the editor (for save).\n const getEditorHtml = () => editorRef.current?.innerHTML ?? '';\n const getEditorText = () => editorRef.current?.innerText ?? '';\n\n const ingestFile = async (file: File) => {\n const ext = (file.name.split('.').pop() || '').toLowerCase();\n setBusy(true);\n try {\n if (TEXT_EXTS.has(ext) || (!DOCX_EXTS.has(ext) && file.type.startsWith('text/'))) {\n const text = await file.text();\n // Convert plain text → HTML so the contenteditable shows\n // line breaks correctly. Escape HTML special chars first.\n const html = escapeHtml(text).replace(/\\n/g, '<br>');\n setData({ filename: file.name, kind: 'text', content: html, ext });\n setEdited(false);\n } else if (DOCX_EXTS.has(ext)) {\n try {\n // mammoth is an optional peer dep — convert .docx → HTML.\n const mammoth = await import(/* @vite-ignore */ 'mammoth' as any);\n const buf = await file.arrayBuffer();\n const result = await mammoth.convertToHtml({ arrayBuffer: buf });\n setData({ filename: file.name, kind: 'docx', content: result.value || '<p><em>(empty document)</em></p>', ext });\n setEdited(false);\n } catch (err) {\n toast.error('Install the optional \"mammoth\" peer dep to read .docx files.');\n }\n } else if (ext === 'doc') {\n toast.error('.doc is the legacy Word binary format — convert to .docx first.');\n } else {\n toast.error(`Unsupported file type: .${ext || 'unknown'}`);\n }\n } finally {\n setBusy(false);\n }\n };\n\n const handlePick = () => fileRef.current?.click();\n const handleFile = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) ingestFile(file);\n if (fileRef.current) fileRef.current.value = '';\n };\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n const file = e.dataTransfer.files?.[0];\n if (file) ingestFile(file);\n };\n\n const downloadCurrent = () => {\n if (!data) return;\n const html = getEditorHtml();\n if (data.kind === 'text') {\n // If the user added formatting, save as .html alongside; otherwise\n // strip back to plain text so the original .txt round-trips cleanly.\n const hasFormatting = /<(b|strong|i|em|u|font|span style)/i.test(html);\n if (hasFormatting) {\n const blob = new Blob([`<!doctype html><meta charset=\"utf-8\"><title>${escapeHtml(data.filename)}</title><body style=\"font-family:ui-monospace,monospace;white-space:pre-wrap\">${html}`], { type: 'text/html' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a'); a.href = url; a.download = `${data.filename.replace(/\\.[^.]+$/, '')}.html`; a.click();\n URL.revokeObjectURL(url);\n } else {\n const text = getEditorText();\n const blob = new Blob([text], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a'); a.href = url; a.download = data.filename; a.click();\n URL.revokeObjectURL(url);\n }\n } else {\n const blob = new Blob([`<!doctype html><meta charset=\"utf-8\"><title>${escapeHtml(data.filename)}</title>${html}`], { type: 'text/html' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url; a.download = `${data.filename.replace(/\\.docx$/i, '')}.html`; a.click();\n URL.revokeObjectURL(url);\n }\n };\n\n const titleName = data?.filename ? truncateForTitle(data.filename) : 'Untitled';\n\n return (\n <div\n className=\"relative flex flex-col h-full\"\n onDragOver={(e) => { e.preventDefault(); if (!isDragging) setIsDragging(true); }}\n onDragLeave={(e) => { if (e.currentTarget === e.target) setIsDragging(false); }}\n onDrop={handleDrop}\n >\n <WindowTitle title={`${titleName}${edited ? ' •' : ''} - Documents`} />\n <AboutApp app=\"documents\" />\n\n {/* Toolbar */}\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-gray-200 bg-gray-50 shrink-0\">\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".txt,.md,.csv,.tsv,.log,.json,.xml,.html,.htm,.css,.js,.jsx,.ts,.tsx,.py,.rb,.go,.rs,.java,.c,.h,.cpp,.hpp,.sh,.bash,.yml,.yaml,.toml,.ini,.conf,.env,.sql,.docx,text/*\"\n onChange={handleFile}\n className=\"hidden\"\n />\n <button onClick={handlePick} className=\"text-xs text-gray-700 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors flex items-center gap-1\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 9.776c.112-.017.227-.026.344-.026h15.812c.117 0 .232.009.344.026m-16.5 0a2.25 2.25 0 00-1.883 2.542l.857 6a2.25 2.25 0 002.227 1.932H19.05a2.25 2.25 0 002.227-1.932l.857-6a2.25 2.25 0 00-1.883-2.542m-16.5 0V6A2.25 2.25 0 016 3.75h3.879a1.5 1.5 0 011.06.44l2.122 2.12a1.5 1.5 0 001.06.44H18A2.25 2.25 0 0120.25 9v.776\" />\n </svg>\n Open\n </button>\n <button onClick={downloadCurrent} className=\"text-xs text-gray-700 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n Save\n </button>\n <span className=\"text-[10px] text-gray-400 ml-1\">TXT · DOCX · Code</span>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <span className=\"text-xs font-medium text-gray-700 truncate max-w-[200px]\" title={data.filename}>\n {data.filename}{edited ? ' •' : ''}\n </span>\n\n {/* Formatting toolbar */}\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <div className=\"flex items-center gap-0.5\">\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('bold')}\n className=\"px-2 py-1 text-xs rounded font-bold text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Bold\">B</button>\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('italic')}\n className=\"px-2 py-1 text-xs rounded italic text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Italic\">I</button>\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('underline')}\n className=\"px-2 py-1 text-xs rounded underline text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Underline\">U</button>\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('strikeThrough')}\n className=\"px-2 py-1 text-xs rounded line-through text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Strikethrough\">S</button>\n </div>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <select onMouseDown={e => e.preventDefault()} onChange={e => { exec('fontSize', e.target.value); e.currentTarget.value = ''; }}\n defaultValue=\"\" className=\"text-xs border border-gray-300 rounded px-1 py-0.5 bg-white\">\n <option value=\"\" disabled>Size</option>\n <option value=\"1\">XS</option>\n <option value=\"2\">S</option>\n <option value=\"3\">M</option>\n <option value=\"4\">L</option>\n <option value=\"5\">XL</option>\n <option value=\"6\">2XL</option>\n </select>\n <input type=\"color\" defaultValue=\"#000000\" onChange={e => exec('foreColor', e.target.value)}\n className=\"w-7 h-6 border border-gray-300 rounded cursor-pointer\" title=\"Text color\" />\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('insertUnorderedList')}\n className=\"px-2 py-1 text-xs rounded text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Bulleted list\">• List</button>\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('insertOrderedList')}\n className=\"px-2 py-1 text-xs rounded text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Numbered list\">1.</button>\n </div>\n\n {/* Body */}\n <div className=\"flex-1 min-h-0 overflow-hidden\">\n {busy ? (\n <div className=\"flex items-center justify-center h-full text-sm text-gray-400\">Loading…</div>\n ) : (\n <div className={`h-full overflow-auto ${data.kind === 'docx' ? 'bg-gray-100 px-12 py-10' : 'bg-white'}`}>\n <div\n ref={editorRef}\n contentEditable\n suppressContentEditableWarning\n spellCheck={false}\n onInput={() => setEdited(true)}\n dangerouslySetInnerHTML={{ __html: data.content }}\n className={\n data.kind === 'docx'\n ? 'mx-auto max-w-[760px] bg-white p-12 shadow text-[14px] leading-relaxed text-gray-800 outline-none focus:ring-2 focus:ring-blue-400/40 prose prose-sm'\n : 'block w-full min-h-full p-4 font-mono text-[13px] leading-relaxed text-gray-800 bg-white outline-none whitespace-pre-wrap'\n }\n />\n </div>\n )}\n </div>\n\n {isDragging && (\n <div className=\"absolute inset-0 bg-blue-500/15 border-4 border-dashed border-blue-500 pointer-events-none flex items-center justify-center z-20\">\n <div className=\"px-4 py-2 rounded-md bg-blue-600 text-white text-sm font-medium shadow-lg\">\n Drop to open\n </div>\n </div>\n )}\n </div>\n );\n}\n\n"]}
1
+ {"version":3,"sources":["../src/apps/Documents.tsx"],"names":[],"mappings":";;;;;;;;AAeA,IAAM,iBAAA,GAAoB,EAAA;AAC1B,SAAS,iBAAiB,CAAA,EAAW;AACnC,EAAA,OAAO,CAAA,CAAE,MAAA,GAAS,iBAAA,GAAoB,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,iBAAA,GAAoB,CAAC,CAAC,CAAA,MAAA,CAAA,GAAM,CAAA;AAClF;AAEA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,UAAA,EAAY,CAAA,CAAA,KAAA,CAAM;AAAA,IACjC,GAAA,EAAK,OAAA;AAAA,IAAS,GAAA,EAAK,MAAA;AAAA,IAAQ,GAAA,EAAK,MAAA;AAAA,IAAQ,GAAA,EAAK,QAAA;AAAA,IAAU,GAAA,EAAK;AAAA,GAC9D,EAAE,CAAC,CAAA,IAAK,CAAE,CAAA;AACZ;AAEA,IAAM,SAAA,uBAAgB,GAAA,CAAI;AAAA,EACxB,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,UAAA;AAAA,EAAY,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,KAAA;AAAA,EACtD,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,IAAA;AAAA,EACtD,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,MAAA;AAAA,EAClD,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO;AAC/C,CAAC,CAAA;AACD,IAAM,SAAA,mBAAY,IAAI,GAAA,CAAI,CAAC,MAAM,CAAC,CAAA;AAUlC,IAAM,SAAA,GAAqB,EAAE,QAAA,EAAU,UAAA,EAAY,MAAM,MAAA,EAAQ,OAAA,EAAS,EAAA,EAAI,GAAA,EAAK,MAAA,EAAO;AAE3E,SAAR,SAAA,GAA6B;AAGlC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAkB,SAAS,CAAA;AACnD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,OAAyB,IAAI,CAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,OAAuB,IAAI,CAAA;AAG7C,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,EAAa,KAAA,KAAmB;AAC5C,IAAA,SAAA,CAAU,SAAS,KAAA,EAAM;AACzB,IAAA,QAAA,CAAS,WAAA,CAAY,GAAA,EAAK,KAAA,EAAO,KAAK,CAAA;AACtC,IAAA,SAAA,CAAU,IAAI,CAAA;AAAA,EAChB,CAAA;AAGA,EAAA,MAAM,aAAA,GAAgB,MAAM,SAAA,CAAU,OAAA,EAAS,SAAA,IAAa,EAAA;AAC5D,EAAA,MAAM,aAAA,GAAgB,MAAM,SAAA,CAAU,OAAA,EAAS,SAAA,IAAa,EAAA;AAE5D,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,KAAe;AACvC,IAAA,MAAM,GAAA,GAAA,CAAO,KAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,EAAA,EAAI,WAAA,EAAY;AAC3D,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,IAAI;AACF,MAAA,IAAI,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,IAAM,CAAC,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAI;AAChF,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAG7B,QAAA,MAAM,OAAO,UAAA,CAAW,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,MAAM,CAAA;AACnD,QAAA,OAAA,CAAQ,EAAE,UAAU,IAAA,CAAK,IAAA,EAAM,MAAM,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,CAAA;AACjE,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB,CAAA,MAAA,IAAW,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,QAAA,IAAI;AAEF,UAAA,MAAM,UAAU,MAAM;AAAA;AAAA,YAA0B;AAAA,WAAgB;AAChE,UAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,WAAA,EAAY;AACnC,UAAA,MAAM,SAAS,MAAM,OAAA,CAAQ,cAAc,EAAE,WAAA,EAAa,KAAK,CAAA;AAC/D,UAAA,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAA,CAAO,KAAA,IAAS,kCAAA,EAAoC,GAAA,EAAK,CAAA;AAC/G,UAAA,SAAA,CAAU,KAAK,CAAA;AAAA,QACjB,SAAS,GAAA,EAAK;AACZ,UAAA,aAAA,CAAM,MAAM,8DAA8D,CAAA;AAAA,QAC5E;AAAA,MACF,CAAA,MAAA,IAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,aAAA,CAAM,MAAM,sEAAiE,CAAA;AAAA,MAC/E,CAAA,MAAO;AACL,QAAA,aAAA,CAAM,KAAA,CAAM,CAAA,wBAAA,EAA2B,GAAA,IAAO,SAAS,CAAA,CAAE,CAAA;AAAA,MAC3D;AAAA,IACF,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAM;AAChD,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAA2C;AAC7D,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC/B,IAAA,IAAI,IAAA,aAAiB,IAAI,CAAA;AACzB,IAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,KAAA,GAAQ,EAAA;AAAA,EAC/C,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAuB;AACzC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,YAAA,CAAa,KAAA,GAAQ,CAAC,CAAA;AACrC,IAAA,IAAI,IAAA,aAAiB,IAAI,CAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,OAAO,aAAA,EAAc;AAC3B,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AAGxB,MAAA,MAAM,aAAA,GAAgB,qCAAA,CAAsC,IAAA,CAAK,IAAI,CAAA;AACrE,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAM,OAAO,IAAI,IAAA,CAAK,CAAC,CAAA,4CAAA,EAA+C,WAAW,IAAA,CAAK,QAAQ,CAAC,CAAA,8EAAA,EAAiF,IAAI,CAAA,CAAE,CAAA,EAAG,EAAE,IAAA,EAAM,aAAa,CAAA;AAC9M,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AAAG,QAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AAAK,QAAA,CAAA,CAAE,WAAW,CAAA,EAAG,IAAA,CAAK,SAAS,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAC,CAAA,KAAA,CAAA;AAAS,QAAA,CAAA,CAAE,KAAA,EAAM;AAC3H,QAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,MAAM,OAAO,aAAA,EAAc;AAC3B,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG,EAAE,IAAA,EAAM,YAAA,EAAc,CAAA;AACpD,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AAAG,QAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AAAK,QAAA,CAAA,CAAE,WAAW,IAAA,CAAK,QAAA;AAAU,QAAA,CAAA,CAAE,KAAA,EAAM;AACzF,QAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,MACzB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,OAAO,IAAI,IAAA,CAAK,CAAC,CAAA,4CAAA,EAA+C,WAAW,IAAA,CAAK,QAAQ,CAAC,CAAA,QAAA,EAAW,IAAI,CAAA,CAAE,CAAA,EAAG,EAAE,IAAA,EAAM,aAAa,CAAA;AACxI,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,MAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AAAK,MAAA,CAAA,CAAE,WAAW,CAAA,EAAG,IAAA,CAAK,SAAS,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAC,CAAA,KAAA,CAAA;AAAS,MAAA,CAAA,CAAE,KAAA,EAAM;AACpF,MAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,IACzB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAY,IAAA,EAAM,QAAA,GAAW,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA,GAAI,UAAA;AAErE,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,+BAAA;AAAA,MACV,UAAA,EAAY,CAAC,CAAA,KAAM;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,IAAI,CAAC,UAAA,EAAY,aAAA,CAAc,IAAI,CAAA;AAAA,MAAG,CAAA;AAAA,MAC/E,WAAA,EAAa,CAAC,CAAA,KAAM;AAAE,QAAA,IAAI,CAAA,CAAE,aAAA,KAAkB,CAAA,CAAE,MAAA,gBAAsB,KAAK,CAAA;AAAA,MAAG,CAAA;AAAA,MAC9E,MAAA,EAAQ,UAAA;AAAA,MAER,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,OAAO,CAAA,EAAG,SAAS,GAAG,MAAA,GAAS,SAAA,GAAO,EAAE,CAAA,YAAA,CAAA,EAAgB,CAAA;AAAA,wBACrE,GAAA,CAAC,QAAA,EAAA,EAAS,GAAA,EAAI,WAAA,EAAY,CAAA;AAAA,wBAG1B,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAK,MAAA;AAAA,cACL,MAAA,EAAO,yKAAA;AAAA,cACP,QAAA,EAAU,UAAA;AAAA,cACV,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACA,IAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,UAAA,EAAY,WAAU,yHAAA,EACrC,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EAAc,MAAK,MAAA,EAAO,OAAA,EAAQ,aAAY,MAAA,EAAO,cAAA,EAAe,aAAa,GAAA,EAC9F,QAAA,kBAAA,GAAA,CAAC,UAAK,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,CAAA,EAAE,sUAAqU,CAAA,EAC5X,CAAA;AAAA,YAAM;AAAA,WAAA,EAER,CAAA;AAAA,8BACC,QAAA,EAAA,EAAO,OAAA,EAAS,eAAA,EAAiB,SAAA,EAAU,mGAAkG,QAAA,EAAA,MAAA,EAE9I,CAAA;AAAA,0BACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EAAiC,QAAA,EAAA,yBAAA,EAAiB,CAAA;AAAA,0BAClE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,+BAC1C,MAAA,EAAA,EAAK,SAAA,EAAU,0DAAA,EAA2D,KAAA,EAAO,KAAK,QAAA,EACpF,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,QAAA;AAAA,YAAU,SAAS,SAAA,GAAO;AAAA,WAAA,EAClC,CAAA;AAAA,0BAGA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,0BAC3C,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAAO,WAAA,EAAa,CAAA,CAAA,KAAK,CAAA,CAAE,cAAA,EAAe;AAAA,gBAAG,OAAA,EAAS,MAAM,IAAA,CAAK,MAAM,CAAA;AAAA,gBACtE,SAAA,EAAU,uFAAA;AAAA,gBAAwF,KAAA,EAAM,MAAA;AAAA,gBAAO,QAAA,EAAA;AAAA;AAAA,aAAC;AAAA,4BAClH,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAAO,WAAA,EAAa,CAAA,CAAA,KAAK,CAAA,CAAE,cAAA,EAAe;AAAA,gBAAG,OAAA,EAAS,MAAM,IAAA,CAAK,QAAQ,CAAA;AAAA,gBACxE,SAAA,EAAU,oFAAA;AAAA,gBAAqF,KAAA,EAAM,QAAA;AAAA,gBAAS,QAAA,EAAA;AAAA;AAAA,aAAC;AAAA,4BACjH,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAAO,WAAA,EAAa,CAAA,CAAA,KAAK,CAAA,CAAE,cAAA,EAAe;AAAA,gBAAG,OAAA,EAAS,MAAM,IAAA,CAAK,WAAW,CAAA;AAAA,gBAC3E,SAAA,EAAU,uFAAA;AAAA,gBAAwF,KAAA,EAAM,WAAA;AAAA,gBAAY,QAAA,EAAA;AAAA;AAAA,aAAC;AAAA,4BACvH,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAAO,WAAA,EAAa,CAAA,CAAA,KAAK,CAAA,CAAE,cAAA,EAAe;AAAA,gBAAG,OAAA,EAAS,MAAM,IAAA,CAAK,eAAe,CAAA;AAAA,gBAC/E,SAAA,EAAU,0FAAA;AAAA,gBAA2F,KAAA,EAAM,eAAA;AAAA,gBAAgB,QAAA,EAAA;AAAA;AAAA;AAAC,WAAA,EAChI,CAAA;AAAA,0BACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,0BAC3C,IAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAAO,WAAA,EAAa,CAAA,CAAA,KAAK,CAAA,CAAE,cAAA,EAAe;AAAA,cAAG,UAAU,CAAA,CAAA,KAAK;AAAE,gBAAA,IAAA,CAAK,UAAA,EAAY,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAG,gBAAA,CAAA,CAAE,cAAc,KAAA,GAAQ,EAAA;AAAA,cAAI,CAAA;AAAA,cAC3H,YAAA,EAAa,EAAA;AAAA,cAAG,SAAA,EAAU,6DAAA;AAAA,cAC1B,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAG,QAAA,EAAQ,MAAC,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,gCAC9B,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,GAAA,EAAI,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,gCACpB,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,GAAA,EAAI,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,gCACnB,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,GAAA,EAAI,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,gCACnB,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,GAAA,EAAI,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,gCACnB,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,GAAA,EAAI,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,gCACpB,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,GAAA,EAAI,QAAA,EAAA,KAAA,EAAG;AAAA;AAAA;AAAA,WACvB;AAAA,0BACA,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cAAM,IAAA,EAAK,OAAA;AAAA,cAAQ,YAAA,EAAa,SAAA;AAAA,cAAU,UAAU,CAAA,CAAA,KAAK,IAAA,CAAK,WAAA,EAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACxF,SAAA,EAAU,uDAAA;AAAA,cAAwD,KAAA,EAAM;AAAA;AAAA,WAAa;AAAA,0BACvF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA4B,CAAA;AAAA,0BAC3C,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAAO,WAAA,EAAa,CAAA,CAAA,KAAK,CAAA,CAAE,cAAA,EAAe;AAAA,cAAG,OAAA,EAAS,MAAM,IAAA,CAAK,qBAAqB,CAAA;AAAA,cACrF,SAAA,EAAU,6EAAA;AAAA,cAA8E,KAAA,EAAM,eAAA;AAAA,cAAgB,QAAA,EAAA;AAAA;AAAA,WAAM;AAAA,0BACtH,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAAO,WAAA,EAAa,CAAA,CAAA,KAAK,CAAA,CAAE,cAAA,EAAe;AAAA,cAAG,OAAA,EAAS,MAAM,IAAA,CAAK,mBAAmB,CAAA;AAAA,cACnF,SAAA,EAAU,6EAAA;AAAA,cAA8E,KAAA,EAAM,eAAA;AAAA,cAAgB,QAAA,EAAA;AAAA;AAAA;AAAE,SAAA,EACpH,CAAA;AAAA,wBAGA,GAAA,CAAC,SAAI,SAAA,EAAU,gCAAA,EACZ,iCACC,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+DAAA,EAAgE,QAAA,EAAA,eAAA,EAAQ,oBAEvF,GAAA,CAAC,KAAA,EAAA,EAAI,WAAW,CAAA,qBAAA,EAAwB,IAAA,CAAK,SAAS,MAAA,GAAS,yBAAA,GAA4B,UAAU,CAAA,CAAA,EACnG,QAAA,kBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,SAAA;AAAA,YACL,eAAA,EAAe,IAAA;AAAA,YACf,8BAAA,EAA8B,IAAA;AAAA,YAC9B,UAAA,EAAY,KAAA;AAAA,YACZ,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,YAC7B,uBAAA,EAAyB,EAAE,MAAA,EAAQ,IAAA,CAAK,OAAA,EAAQ;AAAA,YAChD,SAAA,EACE,IAAA,CAAK,IAAA,KAAS,MAAA,GACV,sJAAA,GACA;AAAA;AAAA,WAGV,CAAA,EAEJ,CAAA;AAAA,QAEC,UAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kIAAA,EACb,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2EAAA,EAA4E,QAAA,EAAA,cAAA,EAE3F,CAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ","file":"Documents-3V4WI42V.js","sourcesContent":["/**\n * Documents — windowed viewer / light editor for plain-text and Word\n * documents. TXT-family files (.txt, .md, .csv, .log, .json, .xml,\n * .html, .css, .ts, .tsx, .js, .jsx, .py, .yml, .yaml, .toml, .sh)\n * open in an editable textarea. Word .docx files are converted to\n * read-only HTML via mammoth (an optional peer dep).\n *\n * Open files via the toolbar's Open button or by dragging them onto\n * the window.\n */\nimport { useState, useRef, useEffect } from 'react';\nimport { WindowTitle } from '../shell/Modal';\nimport toast from '../shell/toast';\nimport AboutApp from './_about';\n\nconst TITLE_DISPLAY_MAX = 24;\nfunction truncateForTitle(s: string) {\n return s.length > TITLE_DISPLAY_MAX ? `${s.slice(0, TITLE_DISPLAY_MAX - 1)}…` : s;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"']/g, c => ({\n '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;',\n }[c] || c));\n}\n\nconst TEXT_EXTS = new Set([\n 'txt', 'md', 'markdown', 'csv', 'tsv', 'log', 'json', 'xml',\n 'html', 'htm', 'css', 'js', 'jsx', 'ts', 'tsx', 'py', 'rb',\n 'go', 'rs', 'java', 'c', 'h', 'cpp', 'hpp', 'sh', 'bash',\n 'yml', 'yaml', 'toml', 'ini', 'conf', 'env', 'sql',\n]);\nconst DOCX_EXTS = new Set(['docx']);\n\ninterface DocData {\n filename: string;\n kind: 'text' | 'docx';\n content: string;\n /** Original mime / extension hint for the download button. */\n ext: string;\n}\n\nconst BLANK_DOC: DocData = { filename: 'Untitled', kind: 'docx', content: '', ext: 'docx' };\n\nexport default function Documents() {\n // Documents is for editing — open with a blank paper-style canvas so the\n // user can start typing immediately. Loading a file replaces this state.\n const [data, setData] = useState<DocData>(BLANK_DOC);\n const [busy, setBusy] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const [edited, setEdited] = useState(false);\n const fileRef = useRef<HTMLInputElement>(null);\n const editorRef = useRef<HTMLDivElement>(null);\n\n // Apply a formatting command to the current selection in the editor.\n const exec = (cmd: string, value?: string) => {\n editorRef.current?.focus();\n document.execCommand(cmd, false, value);\n setEdited(true);\n };\n\n // Pull current HTML out of the editor (for save).\n const getEditorHtml = () => editorRef.current?.innerHTML ?? '';\n const getEditorText = () => editorRef.current?.innerText ?? '';\n\n const ingestFile = async (file: File) => {\n const ext = (file.name.split('.').pop() || '').toLowerCase();\n setBusy(true);\n try {\n if (TEXT_EXTS.has(ext) || (!DOCX_EXTS.has(ext) && file.type.startsWith('text/'))) {\n const text = await file.text();\n // Convert plain text → HTML so the contenteditable shows\n // line breaks correctly. Escape HTML special chars first.\n const html = escapeHtml(text).replace(/\\n/g, '<br>');\n setData({ filename: file.name, kind: 'text', content: html, ext });\n setEdited(false);\n } else if (DOCX_EXTS.has(ext)) {\n try {\n // mammoth is an optional peer dep — convert .docx → HTML.\n const mammoth = await import(/* @vite-ignore */ 'mammoth' as any);\n const buf = await file.arrayBuffer();\n const result = await mammoth.convertToHtml({ arrayBuffer: buf });\n setData({ filename: file.name, kind: 'docx', content: result.value || '<p><em>(empty document)</em></p>', ext });\n setEdited(false);\n } catch (err) {\n toast.error('Install the optional \"mammoth\" peer dep to read .docx files.');\n }\n } else if (ext === 'doc') {\n toast.error('.doc is the legacy Word binary format — convert to .docx first.');\n } else {\n toast.error(`Unsupported file type: .${ext || 'unknown'}`);\n }\n } finally {\n setBusy(false);\n }\n };\n\n const handlePick = () => fileRef.current?.click();\n const handleFile = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) ingestFile(file);\n if (fileRef.current) fileRef.current.value = '';\n };\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n const file = e.dataTransfer.files?.[0];\n if (file) ingestFile(file);\n };\n\n const downloadCurrent = () => {\n if (!data) return;\n const html = getEditorHtml();\n if (data.kind === 'text') {\n // If the user added formatting, save as .html alongside; otherwise\n // strip back to plain text so the original .txt round-trips cleanly.\n const hasFormatting = /<(b|strong|i|em|u|font|span style)/i.test(html);\n if (hasFormatting) {\n const blob = new Blob([`<!doctype html><meta charset=\"utf-8\"><title>${escapeHtml(data.filename)}</title><body style=\"font-family:ui-monospace,monospace;white-space:pre-wrap\">${html}`], { type: 'text/html' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a'); a.href = url; a.download = `${data.filename.replace(/\\.[^.]+$/, '')}.html`; a.click();\n URL.revokeObjectURL(url);\n } else {\n const text = getEditorText();\n const blob = new Blob([text], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a'); a.href = url; a.download = data.filename; a.click();\n URL.revokeObjectURL(url);\n }\n } else {\n const blob = new Blob([`<!doctype html><meta charset=\"utf-8\"><title>${escapeHtml(data.filename)}</title>${html}`], { type: 'text/html' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url; a.download = `${data.filename.replace(/\\.docx$/i, '')}.html`; a.click();\n URL.revokeObjectURL(url);\n }\n };\n\n const titleName = data?.filename ? truncateForTitle(data.filename) : 'Untitled';\n\n return (\n <div\n className=\"relative flex flex-col h-full\"\n onDragOver={(e) => { e.preventDefault(); if (!isDragging) setIsDragging(true); }}\n onDragLeave={(e) => { if (e.currentTarget === e.target) setIsDragging(false); }}\n onDrop={handleDrop}\n >\n <WindowTitle title={`${titleName}${edited ? ' •' : ''} - Documents`} />\n <AboutApp app=\"documents\" />\n\n {/* Toolbar */}\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-gray-200 bg-gray-50 shrink-0\">\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".txt,.md,.csv,.tsv,.log,.json,.xml,.html,.htm,.css,.js,.jsx,.ts,.tsx,.py,.rb,.go,.rs,.java,.c,.h,.cpp,.hpp,.sh,.bash,.yml,.yaml,.toml,.ini,.conf,.env,.sql,.docx,text/*\"\n onChange={handleFile}\n className=\"hidden\"\n />\n <button onClick={handlePick} className=\"text-xs text-gray-700 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors flex items-center gap-1\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 9.776c.112-.017.227-.026.344-.026h15.812c.117 0 .232.009.344.026m-16.5 0a2.25 2.25 0 00-1.883 2.542l.857 6a2.25 2.25 0 002.227 1.932H19.05a2.25 2.25 0 002.227-1.932l.857-6a2.25 2.25 0 00-1.883-2.542m-16.5 0V6A2.25 2.25 0 016 3.75h3.879a1.5 1.5 0 011.06.44l2.122 2.12a1.5 1.5 0 001.06.44H18A2.25 2.25 0 0120.25 9v.776\" />\n </svg>\n Open\n </button>\n <button onClick={downloadCurrent} className=\"text-xs text-gray-700 hover:text-gray-900 px-2 py-1 rounded hover:bg-gray-200 transition-colors\">\n Save\n </button>\n <span className=\"text-[10px] text-gray-400 ml-1\">TXT · DOCX · Code</span>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <span className=\"text-xs font-medium text-gray-700 truncate max-w-[200px]\" title={data.filename}>\n {data.filename}{edited ? ' •' : ''}\n </span>\n\n {/* Formatting toolbar */}\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <div className=\"flex items-center gap-0.5\">\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('bold')}\n className=\"px-2 py-1 text-xs rounded font-bold text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Bold\">B</button>\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('italic')}\n className=\"px-2 py-1 text-xs rounded italic text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Italic\">I</button>\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('underline')}\n className=\"px-2 py-1 text-xs rounded underline text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Underline\">U</button>\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('strikeThrough')}\n className=\"px-2 py-1 text-xs rounded line-through text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Strikethrough\">S</button>\n </div>\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <select onMouseDown={e => e.preventDefault()} onChange={e => { exec('fontSize', e.target.value); e.currentTarget.value = ''; }}\n defaultValue=\"\" className=\"text-xs border border-gray-300 rounded px-1 py-0.5 bg-white\">\n <option value=\"\" disabled>Size</option>\n <option value=\"1\">XS</option>\n <option value=\"2\">S</option>\n <option value=\"3\">M</option>\n <option value=\"4\">L</option>\n <option value=\"5\">XL</option>\n <option value=\"6\">2XL</option>\n </select>\n <input type=\"color\" defaultValue=\"#000000\" onChange={e => exec('foreColor', e.target.value)}\n className=\"w-7 h-6 border border-gray-300 rounded cursor-pointer\" title=\"Text color\" />\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('insertUnorderedList')}\n className=\"px-2 py-1 text-xs rounded text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Bulleted list\">• List</button>\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('insertOrderedList')}\n className=\"px-2 py-1 text-xs rounded text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Numbered list\">1.</button>\n </div>\n\n {/* Body */}\n <div className=\"flex-1 min-h-0 overflow-hidden\">\n {busy ? (\n <div className=\"flex items-center justify-center h-full text-sm text-gray-400\">Loading…</div>\n ) : (\n <div className={`h-full overflow-auto ${data.kind === 'docx' ? 'bg-gray-100 px-12 py-10' : 'bg-white'}`}>\n <div\n ref={editorRef}\n contentEditable\n suppressContentEditableWarning\n spellCheck={false}\n onInput={() => setEdited(true)}\n dangerouslySetInnerHTML={{ __html: data.content }}\n className={\n data.kind === 'docx'\n ? 'mx-auto max-w-[760px] bg-white p-12 shadow text-[14px] leading-relaxed text-gray-800 outline-none focus:ring-2 focus:ring-blue-400/40 prose prose-sm'\n : 'block w-full min-h-full p-4 font-mono text-[13px] leading-relaxed text-gray-800 bg-white outline-none whitespace-pre-wrap'\n }\n />\n </div>\n )}\n </div>\n\n {isDragging && (\n <div className=\"absolute inset-0 bg-blue-500/15 border-4 border-dashed border-blue-500 pointer-events-none flex items-center justify-center z-20\">\n <div className=\"px-4 py-2 rounded-md bg-blue-600 text-white text-sm font-medium shadow-lg\">\n Drop to open\n </div>\n </div>\n )}\n </div>\n );\n}\n\n"]}
@@ -1,13 +1,13 @@
1
- export { Files as default, openFilesInTrashMode, setFilesDemoTree } from './chunk-V2BMSY64.js';
2
- import './chunk-WMOF4TAP.js';
1
+ export { Files as default, openFilesInTrashMode, setFilesDemoTree } from './chunk-2HWXLIAQ.js';
2
+ import './chunk-HBJUIVN3.js';
3
3
  import './chunk-VGTEM5RZ.js';
4
- import './chunk-BDGH2GKX.js';
4
+ import './chunk-CJH5U3BW.js';
5
5
  import './chunk-KUIPWCTJ.js';
6
6
  import './chunk-WIJ45SYD.js';
7
- import './chunk-HQWHWS7V.js';
8
- import './chunk-DLOIO7UD.js';
7
+ import './chunk-T6TOGZ2V.js';
8
+ import './chunk-EUP5PCNL.js';
9
9
  import './chunk-GWVVILYQ.js';
10
10
  import './chunk-UBN4IUDE.js';
11
11
  import './chunk-ZF6AYO4G.js';
12
- //# sourceMappingURL=Files-QM7OERST.js.map
13
- //# sourceMappingURL=Files-QM7OERST.js.map
12
+ //# sourceMappingURL=Files-3R7EHNSF.js.map
13
+ //# sourceMappingURL=Files-3R7EHNSF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"Files-QM7OERST.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"Files-3R7EHNSF.js"}
@@ -1,7 +1,7 @@
1
1
  import { useShellPrefs } from './chunk-36VM54SC.js';
2
2
  import { SidebarLayout } from './chunk-VGTEM5RZ.js';
3
3
  import { toast_default } from './chunk-WIJ45SYD.js';
4
- import { AboutApp } from './chunk-DLOIO7UD.js';
4
+ import { AboutApp } from './chunk-EUP5PCNL.js';
5
5
  import { useWindowManager, client_default } from './chunk-GWVVILYQ.js';
6
6
  import './chunk-UBN4IUDE.js';
7
7
  import './chunk-ZF6AYO4G.js';
@@ -399,5 +399,5 @@ Tips:
399
399
  }
400
400
 
401
401
  export { Notepad as default };
402
- //# sourceMappingURL=Notepad-7HBOCTJX.js.map
403
- //# sourceMappingURL=Notepad-7HBOCTJX.js.map
402
+ //# sourceMappingURL=Notepad-6V4JVBVJ.js.map
403
+ //# sourceMappingURL=Notepad-6V4JVBVJ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/auth.ts","../src/apps/Notepad.tsx"],"names":[],"mappings":"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","file":"Notepad-7HBOCTJX.js","sourcesContent":["/** User-profile API — calls below proxy to the consumer-supplied apiClient\n * via setShellApiClient(). Prefs reads/writes go through <ShellPrefsProvider>. */\nimport apiClient from './client';\nexport const getMe = () => apiClient.get('/auth/me/').then((r: any) => r.data);\nexport const updateMe = (patch: any) => apiClient.patch('/auth/me/', patch).then((r: any) => r.data);\nexport const getNumberingConfigs = () => apiClient.get('/auth/numbering-configs/').then((r: any) => r.data?.results ?? r.data ?? []);\n","import { useState, useEffect, useRef, useCallback, type ReactNode } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { getNumberingConfigs } from '../api/auth';\nimport apiClient from '../api/client';\nimport toast from '../shell/toast';\nimport { useWindowManager } from '../shell/WindowManager';\nimport { useShellPrefs } from '../shell/ShellPrefs';\nimport SidebarLayout from '../shell/SidebarLayout';\nimport AboutApp from './_about';\n\ninterface Note {\n id: string;\n title: string;\n content: string;\n color: string;\n sticky: boolean; // pinned to desktop\n updated_at: string;\n}\n\nconst COLORS = [\n { key: 'yellow', bg: 'bg-yellow-100', border: 'border-yellow-300', text: 'text-yellow-900', dot: 'bg-yellow-400' },\n { key: 'blue', bg: 'bg-blue-100', border: 'border-blue-300', text: 'text-blue-900', dot: 'bg-blue-400' },\n { key: 'green', bg: 'bg-green-100', border: 'border-green-300', text: 'text-green-900', dot: 'bg-green-400' },\n { key: 'pink', bg: 'bg-pink-100', border: 'border-pink-300', text: 'text-pink-900', dot: 'bg-pink-400' },\n { key: 'purple', bg: 'bg-purple-100', border: 'border-purple-300', text: 'text-purple-900', dot: 'bg-purple-400' },\n { key: 'orange', bg: 'bg-orange-100', border: 'border-orange-300', text: 'text-orange-900', dot: 'bg-orange-400' },\n { key: 'white', bg: 'bg-white', border: 'border-gray-300', text: 'text-gray-900', dot: 'bg-gray-300' },\n];\n\nfunction getColor(key: string) {\n return COLORS.find(c => c.key === key) || COLORS[0];\n}\n\nfunction newNote(): Note {\n return {\n id: `note-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,\n title: '',\n content: '',\n color: 'yellow',\n sticky: false,\n updated_at: new Date().toISOString(),\n };\n}\n\n// ── Entity reference mapping ──\n// Maps entity_type from NumberingConfig to modal registry entityType and search endpoint\nconst ENTITY_TYPE_MAP: Record<string, { entityType: string; endpoint: string }> = {\n sales_order: { entityType: 'order', endpoint: '/orders/sales-orders/' },\n purchase_order: { entityType: 'purchase_order', endpoint: '/purchase-orders/' },\n invoice: { entityType: 'invoice', endpoint: '/invoicing/invoices/' },\n vendor_invoice: { entityType: 'vendor_invoice', endpoint: '/invoicing/vendor-invoices/' },\n shipment: { entityType: 'shipment', endpoint: '/shipments/delivery-notes/' },\n receipt: { entityType: 'payment', endpoint: '/invoicing/payments/' },\n vendor_payment: { entityType: 'vendor_payment', endpoint: '/invoicing/vendor-payments/' },\n vendor_price_sheet: { entityType: 'vendor_price_sheet', endpoint: '/pricing/manufacturer-price-sheets/' },\n client_price_sheet: { entityType: 'price_sheet', endpoint: '/pricing/price-sheets/' },\n qc_report: { entityType: 'qc_report', endpoint: '/qc-reports/' },\n warranty_claim: { entityType: 'warranty_claim', endpoint: '/warranty-claims/claims/' },\n vendor_shipment: { entityType: 'vendor_shipment', endpoint: '/shipments/goods-receipts/' },\n};\n\n// Match checkboxes: [] or [x] or [X]\nconst CHECKBOX_REGEX = /\\[([ xX]?)\\]/g;\n\nexport default function Notepad() {\n const { openEntity } = useWindowManager();\n const { prefs, save } = useShellPrefs();\n\n // Fetch numbering configs to build dynamic prefix map (optional — only used\n // for entity-reference autolinking; safe to fail when no apiClient is wired).\n const { data: numberingConfigs } = useQuery({\n queryKey: ['numbering-configs'],\n queryFn: () => getNumberingConfigs(),\n retry: false,\n });\n\n // Build prefix → { entityType, endpoint } map from DB configs\n const prefixMap = useRef<Record<string, { entityType: string; endpoint: string; prefix: string }>>({});\n useEffect(() => {\n if (!numberingConfigs) return;\n const map: Record<string, { entityType: string; endpoint: string; prefix: string }> = {};\n for (const cfg of numberingConfigs) {\n const mapping = ENTITY_TYPE_MAP[cfg.entity_type];\n if (!mapping) continue;\n // prefix from DB is like \"SO#\" — strip the # to get \"SO\"\n const rawPrefix = (cfg.prefix || '').replace('#', '').toUpperCase();\n if (rawPrefix) {\n map[rawPrefix] = { ...mapping, prefix: cfg.prefix };\n }\n // Also register alt_prefix if set\n if (cfg.alt_prefix) {\n const altRaw = cfg.alt_prefix.replace('#', '').toUpperCase();\n if (altRaw) map[altRaw] = { ...mapping, prefix: cfg.alt_prefix };\n }\n }\n prefixMap.current = map;\n }, [numberingConfigs]);\n\n const notes: Note[] = prefs.notepad_notes || [];\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [editTitle, setEditTitle] = useState('');\n const [editContent, setEditContent] = useState('');\n const [editColor, setEditColor] = useState('yellow');\n const [dirty, setDirty] = useState(false);\n const [editing, setEditing] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const saveTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n const selected = notes.find(n => n.id === selectedId);\n\n // Select first note on load\n useEffect(() => {\n if (!selectedId && notes.length > 0) {\n const n = notes[0];\n setSelectedId(n.id);\n setEditTitle(n.title);\n setEditContent(n.content);\n setEditColor(n.color);\n }\n }, [notes.length]);\n\n const saveNotes = useCallback((updated: Note[]) => {\n save({ notepad_notes: updated });\n }, [save]);\n\n const autoSave = useCallback(() => {\n if (!selectedId || !dirty) return;\n const updated = notes.map(n =>\n n.id === selectedId ? { ...n, title: editTitle, content: editContent, color: editColor, updated_at: new Date().toISOString() } : n\n );\n saveNotes(updated);\n setDirty(false);\n }, [selectedId, dirty, editTitle, editContent, editColor, notes, saveNotes]);\n\n // Debounced auto-save\n useEffect(() => {\n if (!dirty) return;\n if (saveTimerRef.current) clearTimeout(saveTimerRef.current);\n saveTimerRef.current = setTimeout(autoSave, 800);\n return () => { if (saveTimerRef.current) clearTimeout(saveTimerRef.current); };\n }, [dirty, autoSave]);\n\n // Save on unmount\n useEffect(() => () => { if (dirty) autoSave(); }, []);\n\n const selectNote = (n: Note) => {\n if (dirty) autoSave();\n setSelectedId(n.id);\n setEditTitle(n.title);\n setEditContent(n.content);\n setEditColor(n.color);\n setDirty(false);\n setEditing(false);\n };\n\n const createNote = () => {\n if (dirty) autoSave();\n const n = newNote();\n const updated = [n, ...notes];\n saveNotes(updated);\n setSelectedId(n.id);\n setEditTitle('');\n setEditContent('');\n setEditColor('yellow');\n setDirty(false);\n setEditing(true);\n setTimeout(() => textareaRef.current?.focus(), 50);\n };\n\n const deleteNote = (id: string) => {\n const updated = notes.filter(n => n.id !== id);\n saveNotes(updated);\n if (selectedId === id) {\n const next = updated[0];\n if (next) selectNote(next);\n else { setSelectedId(null); setEditTitle(''); setEditContent(''); }\n }\n };\n\n const toggleSticky = (id: string) => {\n const updated = notes.map(n =>\n n.id === id ? { ...n, sticky: !n.sticky } : n\n );\n saveNotes(updated);\n const note = updated.find(n => n.id === id);\n toast.success(note?.sticky ? 'Pinned to desktop' : 'Removed from desktop');\n };\n\n const timeAgo = (iso: string) => {\n const diff = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n const days = Math.floor(hrs / 24);\n return `${days}d ago`;\n };\n\n // ── Toggle checkbox in content ──\n const toggleCheckbox = (charIndex: number) => {\n const before = editContent.slice(0, charIndex);\n const match = editContent.slice(charIndex).match(/^\\[([ xX]?)\\]/);\n if (!match) return;\n const isChecked = match[1] === 'x' || match[1] === 'X';\n const replacement = isChecked ? '[ ]' : '[x]';\n const after = editContent.slice(charIndex + match[0].length);\n setEditContent(before + replacement + after);\n setDirty(true);\n };\n\n // ── Open entity reference ──\n const openRef = async (prefix: string, number: string) => {\n const mapping = prefixMap.current[prefix];\n if (!mapping) return;\n const refNum = `${prefix}#${number}`;\n try {\n const { data } = await apiClient.get(mapping.endpoint, { params: { search: refNum, page_size: 1 } });\n const results = data?.results ?? data ?? [];\n const entity = results[0];\n if (entity) {\n openEntity(mapping.entityType, entity.id, entity, refNum);\n } else {\n toast.error(`${refNum} not found`);\n }\n } catch {\n toast.error(`Failed to look up ${refNum}`);\n }\n };\n\n // ── Render content with links and checkboxes ──\n const renderContent = (text: string): ReactNode[] => {\n if (!text) return [];\n const lines = text.split('\\n');\n return lines.map((line, li) => {\n const parts: ReactNode[] = [];\n let lastIdx = 0;\n // Find all special tokens in the line\n const tokens: { idx: number; len: number; render: () => ReactNode }[] = [];\n\n // Entity references — match XX#NNNNN (2+ letters + # + 4-6 digits)\n const refRegex = /([A-Z]{2,4})#(\\d{4,6})/g;\n let m: RegExpExecArray | null;\n while ((m = refRegex.exec(line)) !== null) {\n const prefix = m[1];\n const num = m[2];\n if (prefixMap.current[prefix]) {\n const startIdx = m.index;\n const matchText = m[0];\n tokens.push({\n idx: startIdx,\n len: matchText.length,\n render: () => (\n <button key={`ref-${li}-${startIdx}`} onClick={() => openRef(prefix, num)}\n className=\"text-blue-600 hover:text-blue-800 hover:underline font-medium cursor-pointer\">\n {matchText}\n </button>\n ),\n });\n }\n }\n\n // Checkboxes\n CHECKBOX_REGEX.lastIndex = 0;\n // Calculate the character offset in the full content for this line\n let lineStartInContent = 0;\n for (let i = 0; i < li; i++) lineStartInContent += lines[i].length + 1;\n while ((m = CHECKBOX_REGEX.exec(line)) !== null) {\n const isChecked = m[1] === 'x' || m[1] === 'X';\n const startIdx = m.index;\n const contentCharIdx = lineStartInContent + startIdx;\n tokens.push({\n idx: startIdx,\n len: m[0].length,\n render: () => (\n <button key={`cb-${li}-${startIdx}`} onClick={() => toggleCheckbox(contentCharIdx)}\n className={`inline-flex items-center justify-center w-4 h-4 rounded border ${isChecked ? 'bg-blue-500 border-blue-500 text-white' : 'border-gray-400 bg-white hover:border-blue-400'} cursor-pointer align-text-bottom mr-0.5`}>\n {isChecked && <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" /></svg>}\n </button>\n ),\n });\n }\n\n // Sort tokens by position\n tokens.sort((a, b) => a.idx - b.idx);\n\n // Build line with tokens interspersed\n for (const token of tokens) {\n if (token.idx > lastIdx) {\n // Check if text after a checked checkbox should be struck through\n parts.push(<span key={`t-${li}-${lastIdx}`}>{line.slice(lastIdx, token.idx)}</span>);\n }\n parts.push(token.render());\n lastIdx = token.idx + token.len;\n }\n if (lastIdx < line.length) {\n parts.push(<span key={`t-${li}-${lastIdx}`}>{line.slice(lastIdx)}</span>);\n }\n if (parts.length === 0) parts.push(<span key={`empty-${li}`}>{'\\u200B'}</span>); // zero-width space for empty lines\n\n // Check if line starts with a checked checkbox → strikethrough the rest\n const lineHasChecked = /^\\[x\\]/i.test(line.trimStart());\n return (\n <div key={li} className={lineHasChecked ? 'line-through text-gray-400' : ''}>\n {parts}\n </div>\n );\n });\n };\n\n const startEditing = () => {\n setEditing(true);\n setTimeout(() => textareaRef.current?.focus(), 50);\n };\n\n const stopEditing = () => {\n setEditing(false);\n if (dirty) autoSave();\n };\n\n const PLACEHOLDER_HINT = `Start writing...\n\nTips:\n [] Type [] for a checkbox, click to toggle\n SO#35001 Type XX#NNNNN to link entities (SO, PO, CI, VI, PL, etc.)`;\n\n const sidebar = (\n <>\n <div className=\"p-2 border-b border-gray-200\">\n <button onClick={createNote}\n className=\"w-full flex items-center justify-center gap-1.5 rounded-lg bg-blue-600 text-white px-3 py-1.5 text-sm font-medium hover:bg-blue-700 transition-colors\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\" /></svg>\n New Note\n </button>\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n {notes.length === 0 ? (\n <p className=\"text-sm text-gray-400 text-center py-8 px-4\">No notes yet. Create one to get started.</p>\n ) : (\n notes.map(n => {\n const c = getColor(n.color);\n return (\n <button key={n.id} onClick={() => selectNote(n)}\n className={`w-full text-left px-3 py-2.5 border-b border-gray-100 transition-colors ${selectedId === n.id ? 'bg-blue-50' : 'hover:bg-gray-50'}`}>\n <div className=\"flex items-center gap-2\">\n <div className={`w-2.5 h-2.5 rounded-full shrink-0 ${c.dot}`} />\n <span className=\"text-sm font-medium text-gray-900 truncate flex-1\">\n {n.title || 'Untitled'}\n </span>\n {n.sticky && (\n <svg className=\"h-3 w-3 text-amber-500 shrink-0\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\" /></svg>\n )}\n </div>\n <p className=\"text-xs text-gray-400 mt-0.5 truncate ml-4.5\">{n.content.replace(/\\[[ xX]?\\]/g, '').slice(0, 60) || 'Empty note'}</p>\n <p className=\"text-[10px] text-gray-300 mt-0.5 ml-4.5\">{timeAgo(n.updated_at)}</p>\n </button>\n );\n })\n )}\n </div>\n </>\n );\n\n return (\n <div className=\"h-full\">\n <AboutApp app=\"notepad\" />\n <SidebarLayout\n sidebar={sidebar}\n storageKey=\"notepad.sidebarWidth\"\n defaultWidth={224}\n minWidth={180}\n maxWidth={360}\n >\n {/* Editor */}\n {selectedId ? (\n <div className=\"flex-1 flex flex-col min-w-0\">\n {/* Title */}\n <div className=\"flex items-center gap-2 px-4 py-2 border-b border-gray-200\">\n <input\n value={editTitle}\n onChange={e => { setEditTitle(e.target.value); setDirty(true); }}\n placeholder=\"Note title...\"\n className=\"flex-1 text-lg font-semibold text-gray-900 outline-none bg-transparent placeholder:text-gray-300\"\n />\n {/* Color picker */}\n <div className=\"flex gap-1\">\n {COLORS.map(c => (\n <button key={c.key} onClick={() => { setEditColor(c.key); setDirty(true); }}\n className={`w-5 h-5 rounded-full border-2 transition-all ${c.dot} ${editColor === c.key ? 'border-gray-600 scale-110' : 'border-transparent hover:border-gray-400'}`}\n title={c.key} />\n ))}\n </div>\n {/* Sticky toggle */}\n <button onClick={() => toggleSticky(selectedId)} title={selected?.sticky ? 'Remove from desktop' : 'Pin to desktop'}\n className={`p-1 rounded transition-colors ${selected?.sticky ? 'text-amber-500 hover:text-amber-600' : 'text-gray-300 hover:text-amber-400'}`}>\n <svg className=\"h-4 w-4\" fill={selected?.sticky ? 'currentColor' : 'none'} viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\" /></svg>\n </button>\n {/* Delete */}\n <button onClick={() => deleteNote(selectedId)} title=\"Delete note\"\n className=\"p-1 rounded text-gray-300 hover:text-red-500 transition-colors\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0\" /></svg>\n </button>\n </div>\n {/* Content — toggle between textarea (edit) and rendered view */}\n {editing ? (\n <textarea\n ref={textareaRef}\n value={editContent}\n onChange={e => { setEditContent(e.target.value); setDirty(true); }}\n onBlur={stopEditing}\n placeholder={PLACEHOLDER_HINT}\n className=\"flex-1 p-4 text-sm text-gray-700 outline-none resize-none bg-transparent leading-relaxed placeholder:text-gray-300 font-mono\"\n />\n ) : (\n <div\n onClick={startEditing}\n className=\"flex-1 p-4 text-sm text-gray-700 overflow-y-auto leading-relaxed cursor-text\"\n >\n {editContent ? renderContent(editContent) : (\n <p className=\"text-gray-300 whitespace-pre-line\">{PLACEHOLDER_HINT}</p>\n )}\n </div>\n )}\n {/* Bottom hint bar */}\n <div className=\"px-4 py-1.5 border-t border-gray-100 flex items-center gap-4 text-[10px] text-gray-400\">\n <span>[] checkbox</span>\n <span>SO#35001 entity link</span>\n <span className=\"ml-auto\">{editing ? 'Editing' : 'Click to edit'}</span>\n </div>\n </div>\n ) : (\n <div className=\"flex-1 flex items-center justify-center\">\n <div className=\"text-center text-gray-400\">\n <svg className=\"h-12 w-12 mx-auto mb-3 text-gray-300\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" /></svg>\n <p className=\"text-sm\">Select a note or create a new one</p>\n </div>\n </div>\n )}\n </SidebarLayout>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/api/auth.ts","../src/apps/Notepad.tsx"],"names":[],"mappings":"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","file":"Notepad-6V4JVBVJ.js","sourcesContent":["/** User-profile API — calls below proxy to the consumer-supplied apiClient\n * via setShellApiClient(). Prefs reads/writes go through <ShellPrefsProvider>. */\nimport apiClient from './client';\nexport const getMe = () => apiClient.get('/auth/me/').then((r: any) => r.data);\nexport const updateMe = (patch: any) => apiClient.patch('/auth/me/', patch).then((r: any) => r.data);\nexport const getNumberingConfigs = () => apiClient.get('/auth/numbering-configs/').then((r: any) => r.data?.results ?? r.data ?? []);\n","import { useState, useEffect, useRef, useCallback, type ReactNode } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { getNumberingConfigs } from '../api/auth';\nimport apiClient from '../api/client';\nimport toast from '../shell/toast';\nimport { useWindowManager } from '../shell/WindowManager';\nimport { useShellPrefs } from '../shell/ShellPrefs';\nimport SidebarLayout from '../shell/SidebarLayout';\nimport AboutApp from './_about';\n\ninterface Note {\n id: string;\n title: string;\n content: string;\n color: string;\n sticky: boolean; // pinned to desktop\n updated_at: string;\n}\n\nconst COLORS = [\n { key: 'yellow', bg: 'bg-yellow-100', border: 'border-yellow-300', text: 'text-yellow-900', dot: 'bg-yellow-400' },\n { key: 'blue', bg: 'bg-blue-100', border: 'border-blue-300', text: 'text-blue-900', dot: 'bg-blue-400' },\n { key: 'green', bg: 'bg-green-100', border: 'border-green-300', text: 'text-green-900', dot: 'bg-green-400' },\n { key: 'pink', bg: 'bg-pink-100', border: 'border-pink-300', text: 'text-pink-900', dot: 'bg-pink-400' },\n { key: 'purple', bg: 'bg-purple-100', border: 'border-purple-300', text: 'text-purple-900', dot: 'bg-purple-400' },\n { key: 'orange', bg: 'bg-orange-100', border: 'border-orange-300', text: 'text-orange-900', dot: 'bg-orange-400' },\n { key: 'white', bg: 'bg-white', border: 'border-gray-300', text: 'text-gray-900', dot: 'bg-gray-300' },\n];\n\nfunction getColor(key: string) {\n return COLORS.find(c => c.key === key) || COLORS[0];\n}\n\nfunction newNote(): Note {\n return {\n id: `note-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,\n title: '',\n content: '',\n color: 'yellow',\n sticky: false,\n updated_at: new Date().toISOString(),\n };\n}\n\n// ── Entity reference mapping ──\n// Maps entity_type from NumberingConfig to modal registry entityType and search endpoint\nconst ENTITY_TYPE_MAP: Record<string, { entityType: string; endpoint: string }> = {\n sales_order: { entityType: 'order', endpoint: '/orders/sales-orders/' },\n purchase_order: { entityType: 'purchase_order', endpoint: '/purchase-orders/' },\n invoice: { entityType: 'invoice', endpoint: '/invoicing/invoices/' },\n vendor_invoice: { entityType: 'vendor_invoice', endpoint: '/invoicing/vendor-invoices/' },\n shipment: { entityType: 'shipment', endpoint: '/shipments/delivery-notes/' },\n receipt: { entityType: 'payment', endpoint: '/invoicing/payments/' },\n vendor_payment: { entityType: 'vendor_payment', endpoint: '/invoicing/vendor-payments/' },\n vendor_price_sheet: { entityType: 'vendor_price_sheet', endpoint: '/pricing/manufacturer-price-sheets/' },\n client_price_sheet: { entityType: 'price_sheet', endpoint: '/pricing/price-sheets/' },\n qc_report: { entityType: 'qc_report', endpoint: '/qc-reports/' },\n warranty_claim: { entityType: 'warranty_claim', endpoint: '/warranty-claims/claims/' },\n vendor_shipment: { entityType: 'vendor_shipment', endpoint: '/shipments/goods-receipts/' },\n};\n\n// Match checkboxes: [] or [x] or [X]\nconst CHECKBOX_REGEX = /\\[([ xX]?)\\]/g;\n\nexport default function Notepad() {\n const { openEntity } = useWindowManager();\n const { prefs, save } = useShellPrefs();\n\n // Fetch numbering configs to build dynamic prefix map (optional — only used\n // for entity-reference autolinking; safe to fail when no apiClient is wired).\n const { data: numberingConfigs } = useQuery({\n queryKey: ['numbering-configs'],\n queryFn: () => getNumberingConfigs(),\n retry: false,\n });\n\n // Build prefix → { entityType, endpoint } map from DB configs\n const prefixMap = useRef<Record<string, { entityType: string; endpoint: string; prefix: string }>>({});\n useEffect(() => {\n if (!numberingConfigs) return;\n const map: Record<string, { entityType: string; endpoint: string; prefix: string }> = {};\n for (const cfg of numberingConfigs) {\n const mapping = ENTITY_TYPE_MAP[cfg.entity_type];\n if (!mapping) continue;\n // prefix from DB is like \"SO#\" — strip the # to get \"SO\"\n const rawPrefix = (cfg.prefix || '').replace('#', '').toUpperCase();\n if (rawPrefix) {\n map[rawPrefix] = { ...mapping, prefix: cfg.prefix };\n }\n // Also register alt_prefix if set\n if (cfg.alt_prefix) {\n const altRaw = cfg.alt_prefix.replace('#', '').toUpperCase();\n if (altRaw) map[altRaw] = { ...mapping, prefix: cfg.alt_prefix };\n }\n }\n prefixMap.current = map;\n }, [numberingConfigs]);\n\n const notes: Note[] = prefs.notepad_notes || [];\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [editTitle, setEditTitle] = useState('');\n const [editContent, setEditContent] = useState('');\n const [editColor, setEditColor] = useState('yellow');\n const [dirty, setDirty] = useState(false);\n const [editing, setEditing] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const saveTimerRef = useRef<ReturnType<typeof setTimeout>>();\n\n const selected = notes.find(n => n.id === selectedId);\n\n // Select first note on load\n useEffect(() => {\n if (!selectedId && notes.length > 0) {\n const n = notes[0];\n setSelectedId(n.id);\n setEditTitle(n.title);\n setEditContent(n.content);\n setEditColor(n.color);\n }\n }, [notes.length]);\n\n const saveNotes = useCallback((updated: Note[]) => {\n save({ notepad_notes: updated });\n }, [save]);\n\n const autoSave = useCallback(() => {\n if (!selectedId || !dirty) return;\n const updated = notes.map(n =>\n n.id === selectedId ? { ...n, title: editTitle, content: editContent, color: editColor, updated_at: new Date().toISOString() } : n\n );\n saveNotes(updated);\n setDirty(false);\n }, [selectedId, dirty, editTitle, editContent, editColor, notes, saveNotes]);\n\n // Debounced auto-save\n useEffect(() => {\n if (!dirty) return;\n if (saveTimerRef.current) clearTimeout(saveTimerRef.current);\n saveTimerRef.current = setTimeout(autoSave, 800);\n return () => { if (saveTimerRef.current) clearTimeout(saveTimerRef.current); };\n }, [dirty, autoSave]);\n\n // Save on unmount\n useEffect(() => () => { if (dirty) autoSave(); }, []);\n\n const selectNote = (n: Note) => {\n if (dirty) autoSave();\n setSelectedId(n.id);\n setEditTitle(n.title);\n setEditContent(n.content);\n setEditColor(n.color);\n setDirty(false);\n setEditing(false);\n };\n\n const createNote = () => {\n if (dirty) autoSave();\n const n = newNote();\n const updated = [n, ...notes];\n saveNotes(updated);\n setSelectedId(n.id);\n setEditTitle('');\n setEditContent('');\n setEditColor('yellow');\n setDirty(false);\n setEditing(true);\n setTimeout(() => textareaRef.current?.focus(), 50);\n };\n\n const deleteNote = (id: string) => {\n const updated = notes.filter(n => n.id !== id);\n saveNotes(updated);\n if (selectedId === id) {\n const next = updated[0];\n if (next) selectNote(next);\n else { setSelectedId(null); setEditTitle(''); setEditContent(''); }\n }\n };\n\n const toggleSticky = (id: string) => {\n const updated = notes.map(n =>\n n.id === id ? { ...n, sticky: !n.sticky } : n\n );\n saveNotes(updated);\n const note = updated.find(n => n.id === id);\n toast.success(note?.sticky ? 'Pinned to desktop' : 'Removed from desktop');\n };\n\n const timeAgo = (iso: string) => {\n const diff = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(diff / 60000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n const days = Math.floor(hrs / 24);\n return `${days}d ago`;\n };\n\n // ── Toggle checkbox in content ──\n const toggleCheckbox = (charIndex: number) => {\n const before = editContent.slice(0, charIndex);\n const match = editContent.slice(charIndex).match(/^\\[([ xX]?)\\]/);\n if (!match) return;\n const isChecked = match[1] === 'x' || match[1] === 'X';\n const replacement = isChecked ? '[ ]' : '[x]';\n const after = editContent.slice(charIndex + match[0].length);\n setEditContent(before + replacement + after);\n setDirty(true);\n };\n\n // ── Open entity reference ──\n const openRef = async (prefix: string, number: string) => {\n const mapping = prefixMap.current[prefix];\n if (!mapping) return;\n const refNum = `${prefix}#${number}`;\n try {\n const { data } = await apiClient.get(mapping.endpoint, { params: { search: refNum, page_size: 1 } });\n const results = data?.results ?? data ?? [];\n const entity = results[0];\n if (entity) {\n openEntity(mapping.entityType, entity.id, entity, refNum);\n } else {\n toast.error(`${refNum} not found`);\n }\n } catch {\n toast.error(`Failed to look up ${refNum}`);\n }\n };\n\n // ── Render content with links and checkboxes ──\n const renderContent = (text: string): ReactNode[] => {\n if (!text) return [];\n const lines = text.split('\\n');\n return lines.map((line, li) => {\n const parts: ReactNode[] = [];\n let lastIdx = 0;\n // Find all special tokens in the line\n const tokens: { idx: number; len: number; render: () => ReactNode }[] = [];\n\n // Entity references — match XX#NNNNN (2+ letters + # + 4-6 digits)\n const refRegex = /([A-Z]{2,4})#(\\d{4,6})/g;\n let m: RegExpExecArray | null;\n while ((m = refRegex.exec(line)) !== null) {\n const prefix = m[1];\n const num = m[2];\n if (prefixMap.current[prefix]) {\n const startIdx = m.index;\n const matchText = m[0];\n tokens.push({\n idx: startIdx,\n len: matchText.length,\n render: () => (\n <button key={`ref-${li}-${startIdx}`} onClick={() => openRef(prefix, num)}\n className=\"text-blue-600 hover:text-blue-800 hover:underline font-medium cursor-pointer\">\n {matchText}\n </button>\n ),\n });\n }\n }\n\n // Checkboxes\n CHECKBOX_REGEX.lastIndex = 0;\n // Calculate the character offset in the full content for this line\n let lineStartInContent = 0;\n for (let i = 0; i < li; i++) lineStartInContent += lines[i].length + 1;\n while ((m = CHECKBOX_REGEX.exec(line)) !== null) {\n const isChecked = m[1] === 'x' || m[1] === 'X';\n const startIdx = m.index;\n const contentCharIdx = lineStartInContent + startIdx;\n tokens.push({\n idx: startIdx,\n len: m[0].length,\n render: () => (\n <button key={`cb-${li}-${startIdx}`} onClick={() => toggleCheckbox(contentCharIdx)}\n className={`inline-flex items-center justify-center w-4 h-4 rounded border ${isChecked ? 'bg-blue-500 border-blue-500 text-white' : 'border-gray-400 bg-white hover:border-blue-400'} cursor-pointer align-text-bottom mr-0.5`}>\n {isChecked && <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={3}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" /></svg>}\n </button>\n ),\n });\n }\n\n // Sort tokens by position\n tokens.sort((a, b) => a.idx - b.idx);\n\n // Build line with tokens interspersed\n for (const token of tokens) {\n if (token.idx > lastIdx) {\n // Check if text after a checked checkbox should be struck through\n parts.push(<span key={`t-${li}-${lastIdx}`}>{line.slice(lastIdx, token.idx)}</span>);\n }\n parts.push(token.render());\n lastIdx = token.idx + token.len;\n }\n if (lastIdx < line.length) {\n parts.push(<span key={`t-${li}-${lastIdx}`}>{line.slice(lastIdx)}</span>);\n }\n if (parts.length === 0) parts.push(<span key={`empty-${li}`}>{'\\u200B'}</span>); // zero-width space for empty lines\n\n // Check if line starts with a checked checkbox → strikethrough the rest\n const lineHasChecked = /^\\[x\\]/i.test(line.trimStart());\n return (\n <div key={li} className={lineHasChecked ? 'line-through text-gray-400' : ''}>\n {parts}\n </div>\n );\n });\n };\n\n const startEditing = () => {\n setEditing(true);\n setTimeout(() => textareaRef.current?.focus(), 50);\n };\n\n const stopEditing = () => {\n setEditing(false);\n if (dirty) autoSave();\n };\n\n const PLACEHOLDER_HINT = `Start writing...\n\nTips:\n [] Type [] for a checkbox, click to toggle\n SO#35001 Type XX#NNNNN to link entities (SO, PO, CI, VI, PL, etc.)`;\n\n const sidebar = (\n <>\n <div className=\"p-2 border-b border-gray-200\">\n <button onClick={createNote}\n className=\"w-full flex items-center justify-center gap-1.5 rounded-lg bg-blue-600 text-white px-3 py-1.5 text-sm font-medium hover:bg-blue-700 transition-colors\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\" /></svg>\n New Note\n </button>\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n {notes.length === 0 ? (\n <p className=\"text-sm text-gray-400 text-center py-8 px-4\">No notes yet. Create one to get started.</p>\n ) : (\n notes.map(n => {\n const c = getColor(n.color);\n return (\n <button key={n.id} onClick={() => selectNote(n)}\n className={`w-full text-left px-3 py-2.5 border-b border-gray-100 transition-colors ${selectedId === n.id ? 'bg-blue-50' : 'hover:bg-gray-50'}`}>\n <div className=\"flex items-center gap-2\">\n <div className={`w-2.5 h-2.5 rounded-full shrink-0 ${c.dot}`} />\n <span className=\"text-sm font-medium text-gray-900 truncate flex-1\">\n {n.title || 'Untitled'}\n </span>\n {n.sticky && (\n <svg className=\"h-3 w-3 text-amber-500 shrink-0\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\" /></svg>\n )}\n </div>\n <p className=\"text-xs text-gray-400 mt-0.5 truncate ml-4.5\">{n.content.replace(/\\[[ xX]?\\]/g, '').slice(0, 60) || 'Empty note'}</p>\n <p className=\"text-[10px] text-gray-300 mt-0.5 ml-4.5\">{timeAgo(n.updated_at)}</p>\n </button>\n );\n })\n )}\n </div>\n </>\n );\n\n return (\n <div className=\"h-full\">\n <AboutApp app=\"notepad\" />\n <SidebarLayout\n sidebar={sidebar}\n storageKey=\"notepad.sidebarWidth\"\n defaultWidth={224}\n minWidth={180}\n maxWidth={360}\n >\n {/* Editor */}\n {selectedId ? (\n <div className=\"flex-1 flex flex-col min-w-0\">\n {/* Title */}\n <div className=\"flex items-center gap-2 px-4 py-2 border-b border-gray-200\">\n <input\n value={editTitle}\n onChange={e => { setEditTitle(e.target.value); setDirty(true); }}\n placeholder=\"Note title...\"\n className=\"flex-1 text-lg font-semibold text-gray-900 outline-none bg-transparent placeholder:text-gray-300\"\n />\n {/* Color picker */}\n <div className=\"flex gap-1\">\n {COLORS.map(c => (\n <button key={c.key} onClick={() => { setEditColor(c.key); setDirty(true); }}\n className={`w-5 h-5 rounded-full border-2 transition-all ${c.dot} ${editColor === c.key ? 'border-gray-600 scale-110' : 'border-transparent hover:border-gray-400'}`}\n title={c.key} />\n ))}\n </div>\n {/* Sticky toggle */}\n <button onClick={() => toggleSticky(selectedId)} title={selected?.sticky ? 'Remove from desktop' : 'Pin to desktop'}\n className={`p-1 rounded transition-colors ${selected?.sticky ? 'text-amber-500 hover:text-amber-600' : 'text-gray-300 hover:text-amber-400'}`}>\n <svg className=\"h-4 w-4\" fill={selected?.sticky ? 'currentColor' : 'none'} viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\" /></svg>\n </button>\n {/* Delete */}\n <button onClick={() => deleteNote(selectedId)} title=\"Delete note\"\n className=\"p-1 rounded text-gray-300 hover:text-red-500 transition-colors\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0\" /></svg>\n </button>\n </div>\n {/* Content — toggle between textarea (edit) and rendered view */}\n {editing ? (\n <textarea\n ref={textareaRef}\n value={editContent}\n onChange={e => { setEditContent(e.target.value); setDirty(true); }}\n onBlur={stopEditing}\n placeholder={PLACEHOLDER_HINT}\n className=\"flex-1 p-4 text-sm text-gray-700 outline-none resize-none bg-transparent leading-relaxed placeholder:text-gray-300 font-mono\"\n />\n ) : (\n <div\n onClick={startEditing}\n className=\"flex-1 p-4 text-sm text-gray-700 overflow-y-auto leading-relaxed cursor-text\"\n >\n {editContent ? renderContent(editContent) : (\n <p className=\"text-gray-300 whitespace-pre-line\">{PLACEHOLDER_HINT}</p>\n )}\n </div>\n )}\n {/* Bottom hint bar */}\n <div className=\"px-4 py-1.5 border-t border-gray-100 flex items-center gap-4 text-[10px] text-gray-400\">\n <span>[] checkbox</span>\n <span>SO#35001 entity link</span>\n <span className=\"ml-auto\">{editing ? 'Editing' : 'Click to edit'}</span>\n </div>\n </div>\n ) : (\n <div className=\"flex-1 flex items-center justify-center\">\n <div className=\"text-center text-gray-400\">\n <svg className=\"h-12 w-12 mx-auto mb-3 text-gray-300\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1}><path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" /></svg>\n <p className=\"text-sm\">Select a note or create a new one</p>\n </div>\n </div>\n )}\n </SidebarLayout>\n </div>\n );\n}\n"]}
@@ -0,0 +1,9 @@
1
+ export { Preview as default, setPdfPreview } from './chunk-CJH5U3BW.js';
2
+ import './chunk-KUIPWCTJ.js';
3
+ import './chunk-WIJ45SYD.js';
4
+ import './chunk-EUP5PCNL.js';
5
+ import './chunk-GWVVILYQ.js';
6
+ import './chunk-UBN4IUDE.js';
7
+ import './chunk-ZF6AYO4G.js';
8
+ //# sourceMappingURL=Preview-BTFJ7A6T.js.map
9
+ //# sourceMappingURL=Preview-BTFJ7A6T.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"Preview-S54JZBKK.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"Preview-BTFJ7A6T.js"}
@@ -1,7 +1,7 @@
1
- export { Spreadsheet as default, setSpreadsheetPreview } from './chunk-HQWHWS7V.js';
2
- import './chunk-DLOIO7UD.js';
1
+ export { Spreadsheet as default, setSpreadsheetPreview } from './chunk-T6TOGZ2V.js';
2
+ import './chunk-EUP5PCNL.js';
3
3
  import './chunk-GWVVILYQ.js';
4
4
  import './chunk-UBN4IUDE.js';
5
5
  import './chunk-ZF6AYO4G.js';
6
- //# sourceMappingURL=Spreadsheet-PRO6WI45.js.map
7
- //# sourceMappingURL=Spreadsheet-PRO6WI45.js.map
6
+ //# sourceMappingURL=Spreadsheet-UAYZUO4B.js.map
7
+ //# sourceMappingURL=Spreadsheet-UAYZUO4B.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"Spreadsheet-PRO6WI45.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"Spreadsheet-UAYZUO4B.js"}
@@ -1,23 +1,23 @@
1
- export { setBrowserStartUrl } from '../chunk-T4USMWTS.js';
2
- export { openFilesInTrashMode, setFilesDemoTree } from '../chunk-V2BMSY64.js';
3
- import '../chunk-WMOF4TAP.js';
1
+ export { setBrowserStartUrl } from '../chunk-5BZBQGMU.js';
2
+ export { openFilesInTrashMode, setFilesDemoTree } from '../chunk-2HWXLIAQ.js';
3
+ import '../chunk-HBJUIVN3.js';
4
4
  import '../chunk-VGTEM5RZ.js';
5
- export { setPdfPreview } from '../chunk-BDGH2GKX.js';
5
+ export { setPdfPreview } from '../chunk-CJH5U3BW.js';
6
6
  import '../chunk-KUIPWCTJ.js';
7
7
  import '../chunk-WIJ45SYD.js';
8
- export { setSpreadsheetPreview } from '../chunk-HQWHWS7V.js';
9
- export { BUILTIN_APP_INFO } from '../chunk-DLOIO7UD.js';
8
+ export { setSpreadsheetPreview } from '../chunk-T6TOGZ2V.js';
9
+ export { BUILTIN_APP_INFO } from '../chunk-EUP5PCNL.js';
10
10
  import '../chunk-GWVVILYQ.js';
11
11
  import '../chunk-UBN4IUDE.js';
12
12
  import '../chunk-ZF6AYO4G.js';
13
13
  import { lazy } from 'react';
14
14
 
15
15
  var Calculator = lazy(() => import('../Calculator-X26IEHCN.js'));
16
- var Spreadsheet = lazy(() => import('../Spreadsheet-PRO6WI45.js'));
16
+ var Spreadsheet = lazy(() => import('../Spreadsheet-UAYZUO4B.js'));
17
17
  var Weather = lazy(() => import('../Weather-WVDLOH74.js'));
18
18
  var CurrencyConverter = lazy(() => import('../CurrencyConverter-5UHIRF2P.js'));
19
19
  var PomodoroTimer = lazy(() => import('../PomodoroTimer-PG4J5NNI.js'));
20
- var Notepad = lazy(() => import('../Notepad-7HBOCTJX.js'));
20
+ var Notepad = lazy(() => import('../Notepad-6V4JVBVJ.js'));
21
21
  var WorldClock = lazy(() => import('../WorldClock-OV4GU5J3.js'));
22
22
  var Stock = lazy(() => import('../Stock-TIJVSHPV.js'));
23
23
  var Chess = lazy(() => import('../Chess-C5BY45NA.js'));
@@ -26,10 +26,10 @@ var Sudoku = lazy(() => import('../Sudoku-XHLYCEVT.js'));
26
26
  var Tetris = lazy(() => import('../Tetris-ZHCZYL24.js'));
27
27
  var Game2048 = lazy(() => import('../Game2048-3RH3ELRD.js'));
28
28
  var Minesweeper = lazy(() => import('../Minesweeper-OXRRSCVF.js'));
29
- var Preview = lazy(() => import('../Preview-S54JZBKK.js'));
30
- var Documents = lazy(() => import('../Documents-RRKY4LNJ.js'));
31
- var Files = lazy(() => import('../Files-QM7OERST.js'));
32
- var Browser = lazy(() => import('../Browser-VTTA3X6R.js'));
29
+ var Preview = lazy(() => import('../Preview-BTFJ7A6T.js'));
30
+ var Documents = lazy(() => import('../Documents-3V4WI42V.js'));
31
+ var Files = lazy(() => import('../Files-3R7EHNSF.js'));
32
+ var Browser = lazy(() => import('../Browser-L5CB7K7B.js'));
33
33
  var utilityApps = {
34
34
  "/calculator": { component: Calculator, label: "Calculator", size: "sm", allowPinOnTop: true, utility: true, widget: true, dimensions: [280, 420] },
35
35
  "/spreadsheet": { component: Spreadsheet, label: "Spreadsheets", size: "2xl", appStyle: true, multiInstance: true },
@@ -1,7 +1,7 @@
1
- import { Breadcrumbs, openPreviewFile } from './chunk-WMOF4TAP.js';
1
+ import { Breadcrumbs, openPreviewFile } from './chunk-HBJUIVN3.js';
2
2
  import { SidebarLayout } from './chunk-VGTEM5RZ.js';
3
3
  import { toast_default } from './chunk-WIJ45SYD.js';
4
- import { AboutApp } from './chunk-DLOIO7UD.js';
4
+ import { AboutApp } from './chunk-EUP5PCNL.js';
5
5
  import { useWindowManager, WindowTitle } from './chunk-GWVVILYQ.js';
6
6
  import { confirm, prompt } from './chunk-UBN4IUDE.js';
7
7
  import { useState, useEffect, useRef, useCallback } from 'react';
@@ -680,5 +680,5 @@ function Files() {
680
680
  }
681
681
 
682
682
  export { Files, openFilesInTrashMode, setFilesDemoTree };
683
- //# sourceMappingURL=chunk-V2BMSY64.js.map
684
- //# sourceMappingURL=chunk-V2BMSY64.js.map
683
+ //# sourceMappingURL=chunk-2HWXLIAQ.js.map
684
+ //# sourceMappingURL=chunk-2HWXLIAQ.js.map