react-os-shell 2.7.0 → 2.8.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.
- package/dist/{Browser-YEOBTPST.js → Browser-LVWMQSR3.js} +4 -4
- package/dist/{Browser-YEOBTPST.js.map → Browser-LVWMQSR3.js.map} +1 -1
- package/dist/{Documents-D7UN7W6P.js → Documents-AEZKXAW3.js} +3 -3
- package/dist/{Documents-D7UN7W6P.js.map → Documents-AEZKXAW3.js.map} +1 -1
- package/dist/{Files-VXHZY7NY.js → Files-3WHYRZI6.js} +7 -7
- package/dist/{Files-VXHZY7NY.js.map → Files-3WHYRZI6.js.map} +1 -1
- package/dist/{Notepad-THWCG35G.js → Notepad-R2OY27CY.js} +3 -3
- package/dist/{Notepad-THWCG35G.js.map → Notepad-R2OY27CY.js.map} +1 -1
- package/dist/Preview-F75CICNY.js +9 -0
- package/dist/{Preview-5SOLJFFK.js.map → Preview-F75CICNY.js.map} +1 -1
- package/dist/{Sidebar-BW7SYNBA.js → Sidebar-PY762ANK.js} +3 -3
- package/dist/Sidebar-PY762ANK.js.map +1 -0
- package/dist/{Spreadsheet-UVBEPLQB.js → Spreadsheet-P4MBJWSH.js} +4 -4
- package/dist/{Spreadsheet-UVBEPLQB.js.map → Spreadsheet-P4MBJWSH.js.map} +1 -1
- package/dist/apps/index.js +12 -12
- package/dist/{chunk-UATWDGLV.js → chunk-4YBNDCJV.js} +3 -3
- package/dist/{chunk-UATWDGLV.js.map → chunk-4YBNDCJV.js.map} +1 -1
- package/dist/{chunk-YZEQWMO5.js → chunk-BLYEAKGC.js} +4 -4
- package/dist/{chunk-YZEQWMO5.js.map → chunk-BLYEAKGC.js.map} +1 -1
- package/dist/{chunk-AAKIF7SW.js → chunk-KQBZLA6K.js} +3 -3
- package/dist/{chunk-AAKIF7SW.js.map → chunk-KQBZLA6K.js.map} +1 -1
- package/dist/{chunk-FX77XLQZ.js → chunk-SAKVRVNB.js} +4 -4
- package/dist/{chunk-FX77XLQZ.js.map → chunk-SAKVRVNB.js.map} +1 -1
- package/dist/{chunk-MJIMKMSJ.js → chunk-XGWARUR7.js} +3 -3
- package/dist/{chunk-MJIMKMSJ.js.map → chunk-XGWARUR7.js.map} +1 -1
- package/dist/{chunk-LD2JBHD3.js → chunk-ZW2JB5CK.js} +3 -3
- package/dist/{chunk-LD2JBHD3.js.map → chunk-ZW2JB5CK.js.map} +1 -1
- package/dist/index.js +7 -7
- package/dist/styles.css +187 -2
- package/dist/themes.css +244 -0
- package/package.json +4 -3
- package/dist/Preview-5SOLJFFK.js +0 -9
- package/dist/Sidebar-BW7SYNBA.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { Browser as default, setBrowserStartUrl } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { Browser as default, setBrowserStartUrl } from './chunk-ZW2JB5CK.js';
|
|
2
|
+
import './chunk-XGWARUR7.js';
|
|
3
3
|
import './chunk-JNF5VRPB.js';
|
|
4
4
|
import './chunk-UBN4IUDE.js';
|
|
5
5
|
import './chunk-ZF6AYO4G.js';
|
|
6
|
-
//# sourceMappingURL=Browser-
|
|
7
|
-
//# sourceMappingURL=Browser-
|
|
6
|
+
//# sourceMappingURL=Browser-LVWMQSR3.js.map
|
|
7
|
+
//# sourceMappingURL=Browser-LVWMQSR3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"Browser-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"Browser-LVWMQSR3.js"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { toast_default } from './chunk-WIJ45SYD.js';
|
|
2
|
-
import { AboutApp } from './chunk-
|
|
2
|
+
import { AboutApp } from './chunk-XGWARUR7.js';
|
|
3
3
|
import { WindowTitle, PopupMenu, PopupMenuLabel, PopupMenuItem, PopupMenuDivider } from './chunk-JNF5VRPB.js';
|
|
4
4
|
import './chunk-UBN4IUDE.js';
|
|
5
5
|
import './chunk-ZF6AYO4G.js';
|
|
@@ -437,5 +437,5 @@ function Documents() {
|
|
|
437
437
|
}
|
|
438
438
|
|
|
439
439
|
export { Documents as default };
|
|
440
|
-
//# sourceMappingURL=Documents-
|
|
441
|
-
//# sourceMappingURL=Documents-
|
|
440
|
+
//# sourceMappingURL=Documents-AEZKXAW3.js.map
|
|
441
|
+
//# sourceMappingURL=Documents-AEZKXAW3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/Documents.tsx"],"names":[],"mappings":"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","file":"Documents-D7UN7W6P.js","sourcesContent":["/**\n * Documents — windowed viewer / editor for plain-text and Word documents.\n * TXT-family files (.txt, .md, .csv, .log, .json, .xml, .html, .css, .ts,\n * .tsx, .js, .jsx, .py, .yml, .yaml, .toml, .sh) open in a full-width\n * monospace editor. Word .docx files (and new blank documents) open on a\n * letter-size page (8.5 × 11 in) with rich formatting: bold/italic/…,\n * font size & color, bulleted / numbered lists, text alignment, and\n * images (toolbar button, paste, or drag-drop; click an image to resize\n * or remove it — images embed as data URLs so saved files stay\n * self-contained). .docx conversion uses 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 { PopupMenu, PopupMenuItem, PopupMenuDivider, PopupMenuLabel } from '../shell/PopupMenu';\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 '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''',\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 // Floating menu shown when an image in the document is clicked.\n const [imgMenu, setImgMenu] = useState<{ x: number; y: number; el: HTMLImageElement } | null>(null);\n const fileRef = useRef<HTMLInputElement>(null);\n const imgInputRef = 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 // ── Images ──\n // Inserted at the caret as data URLs, so the document needs no server-side\n // storage and a saved .html round-trips with its images embedded.\n const insertImageFiles = (files: File[]) => {\n for (const file of files) {\n if (!file.type.startsWith('image/')) continue;\n const reader = new FileReader();\n reader.onload = () => {\n editorRef.current?.focus();\n document.execCommand('insertImage', false, String(reader.result));\n setEdited(true);\n };\n reader.readAsDataURL(file);\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent) => {\n const images = Array.from(e.clipboardData?.items ?? [])\n .filter(i => i.kind === 'file' && i.type.startsWith('image/'))\n .map(i => i.getAsFile())\n .filter((f): f is File => !!f);\n if (images.length) {\n e.preventDefault();\n insertImageFiles(images);\n }\n };\n\n // Click an image → floating resize / remove menu.\n const handleEditorClick = (e: React.MouseEvent) => {\n const target = e.target as HTMLElement;\n if (target.tagName === 'IMG') {\n e.preventDefault();\n setImgMenu({ x: e.clientX, y: e.clientY, el: target as HTMLImageElement });\n }\n };\n\n const setImageWidth = (width: string | null) => {\n if (!imgMenu) return;\n // Pixel width/height attributes (e.g. from pasted HTML) would fight the\n // percentage style — drop them and let height follow the aspect ratio.\n imgMenu.el.removeAttribute('width');\n imgMenu.el.removeAttribute('height');\n imgMenu.el.style.width = width ?? '';\n imgMenu.el.style.height = width ? 'auto' : '';\n setEdited(true);\n setImgMenu(null);\n };\n\n const removeImage = () => {\n imgMenu?.el.remove();\n setEdited(true);\n setImgMenu(null);\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 files = Array.from(e.dataTransfer.files ?? []);\n if (files.length === 0) return;\n // Dropped images go INTO the document; anything else opens as a document.\n if (files.every(f => f.type.startsWith('image/'))) {\n insertImageFiles(files);\n return;\n }\n ingestFile(files[0]);\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 // (`style=\"…text-align` only matches a real attribute — literal text\n // mentioning text-align gets its quotes escaped to " on load.)\n const hasFormatting = /<(b|strong|i|em|u|font|span style|ul|ol|img)|style=\"[^\"]*text-align/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 flex-wrap gap-x-2 gap-y-1 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\n {/* Alignment */}\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('justifyLeft')}\n className=\"px-2 py-1 rounded text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Align left\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}>\n <path strokeLinecap=\"round\" d=\"M3.75 6h16.5M3.75 12h9.75M3.75 18h14.25\" />\n </svg>\n </button>\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('justifyCenter')}\n className=\"px-2 py-1 rounded text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Align center\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}>\n <path strokeLinecap=\"round\" d=\"M3.75 6h16.5M7.125 12h9.75M4.875 18h14.25\" />\n </svg>\n </button>\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('justifyRight')}\n className=\"px-2 py-1 rounded text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Align right\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}>\n <path strokeLinecap=\"round\" d=\"M3.75 6h16.5M10.5 12h9.75M6 18h14.25\" />\n </svg>\n </button>\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('justifyFull')}\n className=\"px-2 py-1 rounded text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Justify\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}>\n <path strokeLinecap=\"round\" d=\"M3.75 6h16.5M3.75 12h16.5M3.75 18h16.5\" />\n </svg>\n </button>\n </div>\n\n {/* Image insert */}\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <input\n ref={imgInputRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n className=\"hidden\"\n onChange={e => {\n if (e.target.files?.length) insertImageFiles(Array.from(e.target.files));\n if (imgInputRef.current) imgInputRef.current.value = '';\n }}\n />\n <button onClick={() => imgInputRef.current?.click()}\n className=\"px-2 py-1 text-xs rounded text-gray-700 hover:bg-gray-200 transition-colors flex items-center gap-1\" title=\"Insert image (or paste / drop one)\">\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=\"M2.25 15.75l5.159-5.159a2.25 2.25 0 013.182 0l5.159 5.159m-1.5-1.5l1.409-1.409a2.25 2.25 0 013.182 0l2.909 2.909m-18 3.75h16.5a1.5 1.5 0 001.5-1.5V6a1.5 1.5 0 00-1.5-1.5H3.75A1.5 1.5 0 002.25 6v12a1.5 1.5 0 001.5 1.5zm10.5-11.25h.008v.008h-.008V8.25zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0z\" />\n </svg>\n Image\n </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-6 py-8' : 'bg-white'}`}>\n {/* Word-style documents render on a US-letter page (8.5 × 11 in,\n 1 in margins) that grows past 11 in as content does; the gray\n \"desk\" scrolls when the window is narrower than the page. */}\n <div\n ref={editorRef}\n contentEditable\n suppressContentEditableWarning\n spellCheck={false}\n onInput={() => setEdited(true)}\n onPaste={handlePaste}\n onClick={handleEditorClick}\n dangerouslySetInnerHTML={{ __html: data.content }}\n className={\n data.kind === 'docx'\n ? 'docs-editor mx-auto w-[8.5in] min-h-[11in] bg-white p-[1in] shadow text-[14px] leading-relaxed text-gray-800 outline-none focus:ring-2 focus:ring-blue-400/40'\n : 'docs-editor 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 a document to open · images insert into the page\n </div>\n </div>\n )}\n\n {/* Image menu — resize / remove the clicked image */}\n {imgMenu && (\n <PopupMenu\n minWidth={150}\n style={{ left: imgMenu.x, top: imgMenu.y }}\n onClose={() => setImgMenu(null)}\n >\n <PopupMenuLabel>Image width</PopupMenuLabel>\n <PopupMenuItem onClick={() => setImageWidth('25%')}>25%</PopupMenuItem>\n <PopupMenuItem onClick={() => setImageWidth('50%')}>50%</PopupMenuItem>\n <PopupMenuItem onClick={() => setImageWidth('75%')}>75%</PopupMenuItem>\n <PopupMenuItem onClick={() => setImageWidth('100%')}>100%</PopupMenuItem>\n <PopupMenuItem onClick={() => setImageWidth(null)}>Original size</PopupMenuItem>\n <PopupMenuDivider />\n <PopupMenuItem danger onClick={removeImage}>Remove image</PopupMenuItem>\n </PopupMenu>\n )}\n </div>\n );\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/apps/Documents.tsx"],"names":[],"mappings":"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","file":"Documents-AEZKXAW3.js","sourcesContent":["/**\n * Documents — windowed viewer / editor for plain-text and Word documents.\n * TXT-family files (.txt, .md, .csv, .log, .json, .xml, .html, .css, .ts,\n * .tsx, .js, .jsx, .py, .yml, .yaml, .toml, .sh) open in a full-width\n * monospace editor. Word .docx files (and new blank documents) open on a\n * letter-size page (8.5 × 11 in) with rich formatting: bold/italic/…,\n * font size & color, bulleted / numbered lists, text alignment, and\n * images (toolbar button, paste, or drag-drop; click an image to resize\n * or remove it — images embed as data URLs so saved files stay\n * self-contained). .docx conversion uses 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 { PopupMenu, PopupMenuItem, PopupMenuDivider, PopupMenuLabel } from '../shell/PopupMenu';\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 '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''',\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 // Floating menu shown when an image in the document is clicked.\n const [imgMenu, setImgMenu] = useState<{ x: number; y: number; el: HTMLImageElement } | null>(null);\n const fileRef = useRef<HTMLInputElement>(null);\n const imgInputRef = 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 // ── Images ──\n // Inserted at the caret as data URLs, so the document needs no server-side\n // storage and a saved .html round-trips with its images embedded.\n const insertImageFiles = (files: File[]) => {\n for (const file of files) {\n if (!file.type.startsWith('image/')) continue;\n const reader = new FileReader();\n reader.onload = () => {\n editorRef.current?.focus();\n document.execCommand('insertImage', false, String(reader.result));\n setEdited(true);\n };\n reader.readAsDataURL(file);\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent) => {\n const images = Array.from(e.clipboardData?.items ?? [])\n .filter(i => i.kind === 'file' && i.type.startsWith('image/'))\n .map(i => i.getAsFile())\n .filter((f): f is File => !!f);\n if (images.length) {\n e.preventDefault();\n insertImageFiles(images);\n }\n };\n\n // Click an image → floating resize / remove menu.\n const handleEditorClick = (e: React.MouseEvent) => {\n const target = e.target as HTMLElement;\n if (target.tagName === 'IMG') {\n e.preventDefault();\n setImgMenu({ x: e.clientX, y: e.clientY, el: target as HTMLImageElement });\n }\n };\n\n const setImageWidth = (width: string | null) => {\n if (!imgMenu) return;\n // Pixel width/height attributes (e.g. from pasted HTML) would fight the\n // percentage style — drop them and let height follow the aspect ratio.\n imgMenu.el.removeAttribute('width');\n imgMenu.el.removeAttribute('height');\n imgMenu.el.style.width = width ?? '';\n imgMenu.el.style.height = width ? 'auto' : '';\n setEdited(true);\n setImgMenu(null);\n };\n\n const removeImage = () => {\n imgMenu?.el.remove();\n setEdited(true);\n setImgMenu(null);\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 files = Array.from(e.dataTransfer.files ?? []);\n if (files.length === 0) return;\n // Dropped images go INTO the document; anything else opens as a document.\n if (files.every(f => f.type.startsWith('image/'))) {\n insertImageFiles(files);\n return;\n }\n ingestFile(files[0]);\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 // (`style=\"…text-align` only matches a real attribute — literal text\n // mentioning text-align gets its quotes escaped to " on load.)\n const hasFormatting = /<(b|strong|i|em|u|font|span style|ul|ol|img)|style=\"[^\"]*text-align/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 flex-wrap gap-x-2 gap-y-1 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\n {/* Alignment */}\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('justifyLeft')}\n className=\"px-2 py-1 rounded text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Align left\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}>\n <path strokeLinecap=\"round\" d=\"M3.75 6h16.5M3.75 12h9.75M3.75 18h14.25\" />\n </svg>\n </button>\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('justifyCenter')}\n className=\"px-2 py-1 rounded text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Align center\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}>\n <path strokeLinecap=\"round\" d=\"M3.75 6h16.5M7.125 12h9.75M4.875 18h14.25\" />\n </svg>\n </button>\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('justifyRight')}\n className=\"px-2 py-1 rounded text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Align right\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}>\n <path strokeLinecap=\"round\" d=\"M3.75 6h16.5M10.5 12h9.75M6 18h14.25\" />\n </svg>\n </button>\n <button onMouseDown={e => e.preventDefault()} onClick={() => exec('justifyFull')}\n className=\"px-2 py-1 rounded text-gray-700 hover:bg-gray-200 transition-colors\" title=\"Justify\">\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.8}>\n <path strokeLinecap=\"round\" d=\"M3.75 6h16.5M3.75 12h16.5M3.75 18h16.5\" />\n </svg>\n </button>\n </div>\n\n {/* Image insert */}\n <div className=\"h-4 w-px bg-gray-300 mx-1\" />\n <input\n ref={imgInputRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n className=\"hidden\"\n onChange={e => {\n if (e.target.files?.length) insertImageFiles(Array.from(e.target.files));\n if (imgInputRef.current) imgInputRef.current.value = '';\n }}\n />\n <button onClick={() => imgInputRef.current?.click()}\n className=\"px-2 py-1 text-xs rounded text-gray-700 hover:bg-gray-200 transition-colors flex items-center gap-1\" title=\"Insert image (or paste / drop one)\">\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=\"M2.25 15.75l5.159-5.159a2.25 2.25 0 013.182 0l5.159 5.159m-1.5-1.5l1.409-1.409a2.25 2.25 0 013.182 0l2.909 2.909m-18 3.75h16.5a1.5 1.5 0 001.5-1.5V6a1.5 1.5 0 00-1.5-1.5H3.75A1.5 1.5 0 002.25 6v12a1.5 1.5 0 001.5 1.5zm10.5-11.25h.008v.008h-.008V8.25zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0z\" />\n </svg>\n Image\n </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-6 py-8' : 'bg-white'}`}>\n {/* Word-style documents render on a US-letter page (8.5 × 11 in,\n 1 in margins) that grows past 11 in as content does; the gray\n \"desk\" scrolls when the window is narrower than the page. */}\n <div\n ref={editorRef}\n contentEditable\n suppressContentEditableWarning\n spellCheck={false}\n onInput={() => setEdited(true)}\n onPaste={handlePaste}\n onClick={handleEditorClick}\n dangerouslySetInnerHTML={{ __html: data.content }}\n className={\n data.kind === 'docx'\n ? 'docs-editor mx-auto w-[8.5in] min-h-[11in] bg-white p-[1in] shadow text-[14px] leading-relaxed text-gray-800 outline-none focus:ring-2 focus:ring-blue-400/40'\n : 'docs-editor 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 a document to open · images insert into the page\n </div>\n </div>\n )}\n\n {/* Image menu — resize / remove the clicked image */}\n {imgMenu && (\n <PopupMenu\n minWidth={150}\n style={{ left: imgMenu.x, top: imgMenu.y }}\n onClose={() => setImgMenu(null)}\n >\n <PopupMenuLabel>Image width</PopupMenuLabel>\n <PopupMenuItem onClick={() => setImageWidth('25%')}>25%</PopupMenuItem>\n <PopupMenuItem onClick={() => setImageWidth('50%')}>50%</PopupMenuItem>\n <PopupMenuItem onClick={() => setImageWidth('75%')}>75%</PopupMenuItem>\n <PopupMenuItem onClick={() => setImageWidth('100%')}>100%</PopupMenuItem>\n <PopupMenuItem onClick={() => setImageWidth(null)}>Original size</PopupMenuItem>\n <PopupMenuDivider />\n <PopupMenuItem danger onClick={removeImage}>Remove image</PopupMenuItem>\n </PopupMenu>\n )}\n </div>\n );\n}\n\n"]}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export { Files as default, openFilesInTrashMode, setFilesDemoTree } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { Files as default, openFilesInTrashMode, setFilesDemoTree } from './chunk-SAKVRVNB.js';
|
|
2
|
+
import './chunk-BLYEAKGC.js';
|
|
3
3
|
import './chunk-VGTEM5RZ.js';
|
|
4
|
-
import './chunk-
|
|
4
|
+
import './chunk-4YBNDCJV.js';
|
|
5
5
|
import './chunk-KUIPWCTJ.js';
|
|
6
6
|
import './chunk-WIJ45SYD.js';
|
|
7
|
-
import './chunk-
|
|
8
|
-
import './chunk-
|
|
7
|
+
import './chunk-KQBZLA6K.js';
|
|
8
|
+
import './chunk-XGWARUR7.js';
|
|
9
9
|
import './chunk-JNF5VRPB.js';
|
|
10
10
|
import './chunk-UBN4IUDE.js';
|
|
11
11
|
import './chunk-ZF6AYO4G.js';
|
|
12
|
-
//# sourceMappingURL=Files-
|
|
13
|
-
//# sourceMappingURL=Files-
|
|
12
|
+
//# sourceMappingURL=Files-3WHYRZI6.js.map
|
|
13
|
+
//# sourceMappingURL=Files-3WHYRZI6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"Files-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"Files-3WHYRZI6.js"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SidebarLayout } from './chunk-VGTEM5RZ.js';
|
|
2
2
|
import { toast_default } from './chunk-WIJ45SYD.js';
|
|
3
|
-
import { AboutApp } from './chunk-
|
|
3
|
+
import { AboutApp } from './chunk-XGWARUR7.js';
|
|
4
4
|
import { useWindowManager, useShellPrefs, client_default } from './chunk-JNF5VRPB.js';
|
|
5
5
|
import './chunk-UBN4IUDE.js';
|
|
6
6
|
import './chunk-ZF6AYO4G.js';
|
|
@@ -398,5 +398,5 @@ Tips:
|
|
|
398
398
|
}
|
|
399
399
|
|
|
400
400
|
export { Notepad as default };
|
|
401
|
-
//# sourceMappingURL=Notepad-
|
|
402
|
-
//# sourceMappingURL=Notepad-
|
|
401
|
+
//# sourceMappingURL=Notepad-R2OY27CY.js.map
|
|
402
|
+
//# sourceMappingURL=Notepad-R2OY27CY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/auth.ts","../src/apps/Notepad.tsx"],"names":[],"mappings":"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","file":"Notepad-THWCG35G.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-R2OY27CY.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-4YBNDCJV.js';
|
|
2
|
+
import './chunk-KUIPWCTJ.js';
|
|
3
|
+
import './chunk-WIJ45SYD.js';
|
|
4
|
+
import './chunk-XGWARUR7.js';
|
|
5
|
+
import './chunk-JNF5VRPB.js';
|
|
6
|
+
import './chunk-UBN4IUDE.js';
|
|
7
|
+
import './chunk-ZF6AYO4G.js';
|
|
8
|
+
//# sourceMappingURL=Preview-F75CICNY.js.map
|
|
9
|
+
//# sourceMappingURL=Preview-F75CICNY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"Preview-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"Preview-F75CICNY.js"}
|
|
@@ -233,7 +233,7 @@ function Sidebar({
|
|
|
233
233
|
)) })
|
|
234
234
|
) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
235
235
|
topItems.map(renderItem),
|
|
236
|
-
/* @__PURE__ */ jsx("div", { className: "border-t border-white/15 my-1.5 mx-2" }),
|
|
236
|
+
topItems.length > 0 && (erpSections.length > 0 || systemSections.length > 0 || virtualSections.length > 0) && /* @__PURE__ */ jsx("div", { className: "border-t border-white/15 my-1.5 mx-2" }),
|
|
237
237
|
erpSections.map((s) => renderSectionAccordion(s, true)),
|
|
238
238
|
systemSections.map((s) => renderSectionAccordion(s, false)),
|
|
239
239
|
virtualSections.map((v) => renderSectionAccordion(v, false)),
|
|
@@ -270,5 +270,5 @@ function Sidebar({
|
|
|
270
270
|
}
|
|
271
271
|
|
|
272
272
|
export { Sidebar as default };
|
|
273
|
-
//# sourceMappingURL=Sidebar-
|
|
274
|
-
//# sourceMappingURL=Sidebar-
|
|
273
|
+
//# sourceMappingURL=Sidebar-PY762ANK.js.map
|
|
274
|
+
//# sourceMappingURL=Sidebar-PY762ANK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shell/Sidebar.tsx"],"names":["navSections","navIcons","sectionIcons"],"mappings":"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","file":"Sidebar-PY762ANK.js","sourcesContent":["/**\n * Sidebar — persistent left strip used when `prefs.layout_mode === 'sidebar'`.\n *\n * Same configuration surface as <StartMenu> (navSections, navIcons,\n * sectionIcons, categories) but rendered inline:\n * - No flyouts. Sections expand/collapse accordion-style below their\n * header, indented one step.\n * - No taskbar-anchored positioning — fixed full-height left strip,\n * width pulled from `--sidebar-width`.\n * - Right edge `rounded-r-2xl` so it matches windowed cards on the\n * right (which use `rounded-2xl`).\n *\n * Designed for small-screen layouts where flyouts would clip and where\n * keeping the menu always-visible saves a tap to switch apps.\n */\n\nimport { useEffect, useMemo, useRef, useState, isValidElement, cloneElement, type ReactElement, type ReactNode } from 'react';\nimport {\n navSections as defaultNavSections,\n navIcons as defaultNavIcons,\n sectionIcons as defaultSectionIcons,\n startMenuCategories as defaultCategories,\n isSection,\n type NavSection,\n type NavItem,\n type StartMenuCategories,\n type VirtualSection,\n} from '../shell-config/nav';\nimport { useAuth } from '../contexts/AuthContext';\nimport { glassStyle, GLASS_INPUT_BG } from '../utils/glass';\n\ninterface SidebarProps {\n width: number;\n openPage: (path: string) => void;\n profile: any;\n user: any;\n onLogout: () => void;\n onNavigate: (path: string) => void;\n navSections?: (NavSection | NavItem)[];\n navIcons?: Record<string, ReactNode>;\n sectionIcons?: Record<string, ReactNode>;\n categories?: StartMenuCategories;\n productName?: string;\n productIcon?: string;\n}\n\nexport default function Sidebar({\n width,\n openPage,\n profile,\n user,\n onLogout,\n onNavigate,\n navSections = defaultNavSections,\n navIcons = defaultNavIcons,\n sectionIcons = defaultSectionIcons,\n categories = defaultCategories,\n productName,\n productIcon,\n}: SidebarProps) {\n const { hasAnyPerm } = useAuth();\n const erpLabels = new Set(categories.erp);\n const systemLabels = new Set(categories.system);\n const footerLabels = new Set(categories.footer ?? []);\n // Flat rows pinned to the footer (next to the profile) — rendered inline,\n // not as an accordion section. Mirrors StartMenu's `footerItems`.\n const footerItems = (categories.footerItems ?? []).filter(it => !it.perms || hasAnyPerm(it.perms));\n const virtualSections = categories.virtual ?? [];\n\n const [search, setSearch] = useState('');\n const [expanded, setExpanded] = useState<Set<string>>(new Set());\n const searchRef = useRef<HTMLInputElement>(null);\n\n const toggleExpanded = (label: string) => {\n setExpanded(prev => {\n const next = new Set(prev);\n if (next.has(label)) next.delete(label);\n else next.add(label);\n return next;\n });\n };\n\n // Top-level items vs sections, mirroring StartMenu's split.\n const topItems = navSections.filter(item => !isSection(item)) as NavItem[];\n const erpSections = navSections.filter(item => isSection(item) && erpLabels.has((item as NavSection).label)) as NavSection[];\n const systemSections = navSections.filter(item => isSection(item) && systemLabels.has((item as NavSection).label)) as NavSection[];\n const footerSections = navSections.filter(item => isSection(item) && footerLabels.has((item as NavSection).label)) as NavSection[];\n\n const getVisibleItems = (section: { items: NavItem[]; perms?: string[] }) => {\n if (section.perms && !hasAnyPerm(section.perms)) return [];\n return section.items.filter(it => !it.perms || hasAnyPerm(it.perms));\n };\n\n // Search across all items + sections (same flat list StartMenu uses).\n // Walks 3rd-level children too so nested entries are still discoverable.\n const matchTree = (it: NavItem, q: string): NavItem[] => {\n if (it.perms && !hasAnyPerm(it.perms)) return [];\n const hits: NavItem[] = [];\n if (it.label.toLowerCase().includes(q)) hits.push(it);\n if (it.children) {\n for (const c of it.children) hits.push(...matchTree(c, q));\n }\n return hits;\n };\n const searchResults = useMemo(() => {\n if (search.length < 2) return [] as NavItem[];\n const q = search.toLowerCase();\n return [\n ...navSections.flatMap((entry) => {\n if (isSection(entry)) {\n return getVisibleItems(entry).flatMap(it => matchTree(it, q));\n }\n return matchTree(entry as NavItem, q);\n }),\n ...footerItems.flatMap(it => matchTree(it, q)),\n ];\n }, [search, navSections, footerItems, hasAnyPerm]);\n\n // Esc collapses any expanded section + clears search; '/' focuses search.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setExpanded(new Set());\n setSearch('');\n } else if (e.key === '/' && document.activeElement?.tagName !== 'INPUT' && document.activeElement?.tagName !== 'TEXTAREA') {\n e.preventDefault();\n searchRef.current?.focus();\n }\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, []);\n\n const handleClick = (path: string) => {\n onNavigate(path);\n onPageOpenedReset();\n };\n\n // Reset search after navigating so the next visit starts clean.\n const onPageOpenedReset = () => {\n setSearch('');\n };\n\n const itemCls = 'w-full flex items-center gap-2 rounded-lg px-3 py-2 text-sm';\n const menuGlass = glassStyle();\n\n // Helper that returns the (possibly recolored) per-route icon.\n const iconEl = (to: string) => {\n const icon = navIcons[to];\n if (icon && isValidElement(icon)) {\n return cloneElement(icon as ReactElement<{ className?: string }>, {\n className: 'h-4 w-4 shrink-0 text-gray-500',\n });\n }\n return <span className=\"h-4 w-4 shrink-0\" />;\n };\n\n const secIcon = (label: string) => {\n const icon = sectionIcons[label];\n if (icon && isValidElement(icon)) {\n return cloneElement(icon as ReactElement<{ className?: string }>, {\n className: 'h-4 w-4 shrink-0 text-gray-500',\n });\n }\n return <span className=\"h-4 w-4 shrink-0\" />;\n };\n\n const renderItem = (item: NavItem) => (\n <div key={item.to}>\n <button\n onClick={() => handleClick(item.to)}\n className={`${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`}\n >\n {iconEl(item.to)}\n <span className=\"truncate\">{item.label}</span>\n </button>\n {item.dividerAfter && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n </div>\n );\n\n // 3rd-level: when a NavItem inside an accordion has children, render the\n // parent as its own mini-accordion (further indented). Expansion key is\n // `child:<to>` so it doesn't clash with the section labels in `expanded`.\n const renderNestedItem = (item: NavItem) => {\n const kids = (item.children ?? []).filter(c => !c.perms || hasAnyPerm(c.perms));\n if (kids.length === 0) return renderItem(item);\n const key = `child:${item.to}`;\n const isOpen = expanded.has(key);\n return (\n <div key={item.to}>\n <button\n onClick={() => toggleExpanded(key)}\n aria-expanded={isOpen}\n className={`${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`}\n >\n {iconEl(item.to)}\n <span className=\"truncate\">{item.label}</span>\n <svg\n className={`h-3.5 w-3.5 ml-auto text-gray-500 transition-transform ${isOpen ? 'rotate-90' : ''}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" />\n </svg>\n </button>\n {isOpen && (\n <div className=\"pl-4 mt-0.5 mb-1 space-y-0.5\">\n {kids.map(c => (\n <button\n key={c.to}\n onClick={() => handleClick(c.to)}\n className={`${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`}\n >\n {iconEl(c.to)}\n <span className=\"truncate\">{c.label}</span>\n </button>\n ))}\n </div>\n )}\n {item.dividerAfter && <div className=\"border-t border-white/20 my-1.5 mx-2\" />}\n </div>\n );\n };\n\n const renderSectionAccordion = (section: NavSection | VirtualSection, isErp: boolean) => {\n const items = 'perms' in section\n ? getVisibleItems(section as NavSection)\n : (section as VirtualSection).items;\n if (items.length === 0) return null;\n const isOpen = expanded.has(section.label);\n return (\n <div key={section.label}>\n <button\n onClick={() => toggleExpanded(section.label)}\n aria-expanded={isOpen}\n className={`${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`}\n >\n {'icon' in section && section.icon\n ? section.icon\n : secIcon(section.label)}\n <span className={`truncate ${isErp ? 'font-medium' : ''}`}>{section.label}</span>\n <svg\n className={`h-3.5 w-3.5 ml-auto text-gray-500 transition-transform ${isOpen ? 'rotate-90' : ''}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" />\n </svg>\n </button>\n {isOpen && (\n <div className=\"pl-4 mt-0.5 mb-1 space-y-0.5\">\n {items.map(it => renderNestedItem(it))}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div\n className=\"fixed top-0 left-0 bottom-0 z-[260] flex flex-col rounded-r-2xl overflow-hidden\"\n style={{ width, ...menuGlass }}\n >\n {/* Brand */}\n <div className=\"flex items-center gap-2 px-4 py-3 border-b border-white/15 shrink-0\">\n {productIcon && <img src={productIcon} alt=\"\" className=\"h-5 w-5 shrink-0 opacity-80\" />}\n <span className=\"text-sm font-semibold text-gray-800 truncate\">{productName ?? 'Apps'}</span>\n </div>\n\n {/* Search */}\n <div className=\"px-3 pt-3 pb-2 shrink-0\">\n <div className={`flex items-center gap-2 ${GLASS_INPUT_BG} rounded-lg px-2.5 py-1.5`}>\n <svg className=\"h-3.5 w-3.5 text-gray-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z\" />\n </svg>\n <input\n ref={searchRef}\n value={search}\n onChange={e => setSearch(e.target.value)}\n placeholder=\"Search...\"\n className=\"flex-1 bg-transparent text-xs outline-none placeholder-gray-400\"\n />\n {search && (\n <button onClick={() => setSearch('')} className=\"text-gray-400 hover:text-gray-600 text-xs\">×</button>\n )}\n </div>\n </div>\n\n {/* Body */}\n <div className=\"flex-1 overflow-y-auto px-1 pb-1\">\n {search.length >= 2 ? (\n // Search results take over the body.\n <div>\n {searchResults.length === 0 ? (\n <div className=\"px-3 py-6 text-center text-xs text-gray-400\">No matches</div>\n ) : (\n searchResults.map(r => (\n <button\n key={r.to}\n onClick={() => handleClick(r.to)}\n className={`${itemCls} text-gray-700 hover:bg-blue-50 hover:text-blue-700 transition-colors`}\n >\n {iconEl(r.to)}\n <span className=\"truncate\">{r.label}</span>\n </button>\n ))\n )}\n </div>\n ) : (\n <>\n {/* Top-level apps */}\n {topItems.map(renderItem)}\n\n {/* Divider only when both sides have content — with every top-group\n entry moved into the footer group the top group can be empty, and\n an unconditional rule would collapse against the search box\n (mirrors StartMenu's hasAppsGroup condition). */}\n {topItems.length > 0 && (erpSections.length > 0 || systemSections.length > 0 || virtualSections.length > 0) && (\n <div className=\"border-t border-white/15 my-1.5 mx-2\" />\n )}\n\n {/* ERP sections then system sections — same order as StartMenu's vertical layout. */}\n {erpSections.map(s => renderSectionAccordion(s, true))}\n {systemSections.map(s => renderSectionAccordion(s, false))}\n {virtualSections.map(v => renderSectionAccordion(v, false))}\n {/* Footer items + sections: pinned just above the profile, divided from the rest. */}\n {(footerSections.length > 0 || footerItems.length > 0) && <div className=\"border-t border-white/15 my-1.5 mx-2\" />}\n {footerSections.map(s => renderSectionAccordion(s, false))}\n {footerItems.map(renderItem)}\n </>\n )}\n </div>\n\n {/* Profile + Sign out at the bottom — mirrors StartMenu's user row. */}\n <div className=\"border-t border-white/15 p-1 shrink-0\">\n <div\n onClick={() => handleClick('/profile')}\n className=\"rounded-lg px-2 py-1.5 flex items-center gap-2.5 hover:bg-blue-50 hover:text-blue-700 transition-colors cursor-pointer\"\n >\n {profile?.avatar_url ? (\n <img src={profile.avatar_url} alt=\"\" className=\"h-8 w-8 rounded-full object-cover border border-white/20 shrink-0\" />\n ) : (\n <div className=\"h-8 w-8 rounded-full bg-blue-100 flex items-center justify-center text-sm font-bold text-blue-700 shrink-0\">\n {(profile?.first_name?.charAt(0) || user?.email?.charAt(0) || '?').toUpperCase()}\n </div>\n )}\n <p className=\"flex-1 min-w-0 text-sm font-medium text-gray-900 truncate\">\n {profile?.first_name ? `${profile.first_name} ${profile.last_name || ''}`.trim() : user?.email}\n </p>\n <button\n onClick={e => { e.stopPropagation(); onLogout(); }}\n title=\"Sign Out\"\n className=\"shrink-0 p-1.5 rounded-md text-gray-500 hover:text-red-600 hover:bg-red-50 transition-colors\"\n >\n <svg className=\"h-5 w-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15m3 0l3-3m0 0l-3-3m3 3H9\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { Spreadsheet as default, setSpreadsheetPreview } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
export { Spreadsheet as default, setSpreadsheetPreview } from './chunk-KQBZLA6K.js';
|
|
2
|
+
import './chunk-XGWARUR7.js';
|
|
3
3
|
import './chunk-JNF5VRPB.js';
|
|
4
4
|
import './chunk-UBN4IUDE.js';
|
|
5
5
|
import './chunk-ZF6AYO4G.js';
|
|
6
|
-
//# sourceMappingURL=Spreadsheet-
|
|
7
|
-
//# sourceMappingURL=Spreadsheet-
|
|
6
|
+
//# sourceMappingURL=Spreadsheet-P4MBJWSH.js.map
|
|
7
|
+
//# sourceMappingURL=Spreadsheet-P4MBJWSH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"Spreadsheet-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"Spreadsheet-P4MBJWSH.js"}
|