@bendyline/squisq-editor-react 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/DropZoneOverlay.d.ts +24 -0
  2. package/dist/DropZoneOverlay.d.ts.map +1 -0
  3. package/dist/DropZoneOverlay.js +53 -0
  4. package/dist/DropZoneOverlay.js.map +1 -0
  5. package/dist/EditorContext.d.ts +79 -0
  6. package/dist/EditorContext.d.ts.map +1 -0
  7. package/dist/EditorContext.js +204 -0
  8. package/dist/EditorContext.js.map +1 -0
  9. package/dist/EditorShell.d.ts +39 -0
  10. package/dist/EditorShell.d.ts.map +1 -0
  11. package/dist/EditorShell.js +104 -0
  12. package/dist/EditorShell.js.map +1 -0
  13. package/dist/MediaBin.d.ts +18 -0
  14. package/dist/MediaBin.d.ts.map +1 -0
  15. package/dist/MediaBin.js +141 -0
  16. package/dist/MediaBin.js.map +1 -0
  17. package/dist/PreviewPanel.d.ts +33 -0
  18. package/dist/PreviewPanel.d.ts.map +1 -0
  19. package/dist/PreviewPanel.js +385 -0
  20. package/dist/PreviewPanel.js.map +1 -0
  21. package/dist/RawEditor.d.ts +25 -0
  22. package/dist/RawEditor.d.ts.map +1 -0
  23. package/dist/RawEditor.js +100 -0
  24. package/dist/RawEditor.js.map +1 -0
  25. package/dist/StatusBar.d.ts +15 -0
  26. package/dist/StatusBar.d.ts.map +1 -0
  27. package/dist/StatusBar.js +24 -0
  28. package/dist/StatusBar.js.map +1 -0
  29. package/dist/TemplateAnnotation.d.ts +20 -0
  30. package/dist/TemplateAnnotation.d.ts.map +1 -0
  31. package/dist/TemplateAnnotation.js +69 -0
  32. package/dist/TemplateAnnotation.js.map +1 -0
  33. package/dist/Toolbar.d.ts +23 -0
  34. package/dist/Toolbar.d.ts.map +1 -0
  35. package/dist/Toolbar.js +350 -0
  36. package/dist/Toolbar.js.map +1 -0
  37. package/dist/ViewSwitcher.d.ts +14 -0
  38. package/dist/ViewSwitcher.d.ts.map +1 -0
  39. package/dist/ViewSwitcher.js +20 -0
  40. package/dist/ViewSwitcher.js.map +1 -0
  41. package/dist/WysiwygEditor.d.ts +28 -0
  42. package/dist/WysiwygEditor.d.ts.map +1 -0
  43. package/dist/WysiwygEditor.js +111 -0
  44. package/dist/WysiwygEditor.js.map +1 -0
  45. package/dist/hooks/useFileDrop.d.ts +41 -0
  46. package/dist/hooks/useFileDrop.d.ts.map +1 -0
  47. package/dist/hooks/useFileDrop.js +167 -0
  48. package/dist/hooks/useFileDrop.js.map +1 -0
  49. package/dist/index.d.ts +43 -268
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +39 -3832
  52. package/dist/index.js.map +1 -1
  53. package/dist/tiptapBridge.d.ts +24 -0
  54. package/dist/tiptapBridge.d.ts.map +1 -0
  55. package/dist/tiptapBridge.js +358 -0
  56. package/dist/tiptapBridge.js.map +1 -0
  57. package/dist/utils/dropUtils.d.ts +36 -0
  58. package/dist/utils/dropUtils.d.ts.map +1 -0
  59. package/dist/utils/dropUtils.js +71 -0
  60. package/dist/utils/dropUtils.js.map +1 -0
  61. package/package.json +5 -5
  62. package/src/DropZoneOverlay.tsx +137 -0
  63. package/src/EditorContext.tsx +56 -0
  64. package/src/EditorShell.tsx +102 -8
  65. package/src/MediaBin.tsx +223 -0
  66. package/src/Toolbar.tsx +21 -1
  67. package/src/hooks/useFileDrop.ts +226 -0
  68. package/src/index.ts +23 -0
  69. package/src/styles/editor.css +318 -0
  70. package/src/utils/dropUtils.ts +88 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toolbar.js","sourceRoot":"","sources":["../src/Toolbar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * ViewSwitcher
3
+ *
4
+ * Tab bar for switching between Raw, WYSIWYG, and Preview editor views.
5
+ */
6
+ export interface ViewSwitcherProps {
7
+ /** Additional class name */
8
+ className?: string;
9
+ }
10
+ /**
11
+ * Tab-style view switcher for the three editor modes.
12
+ */
13
+ export declare function ViewSwitcher({ className }: ViewSwitcherProps): import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=ViewSwitcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewSwitcher.d.ts","sourceRoot":"","sources":["../src/ViewSwitcher.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,EAAE,iBAAiB,2CAuB5D"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * ViewSwitcher
4
+ *
5
+ * Tab bar for switching between Raw, WYSIWYG, and Preview editor views.
6
+ */
7
+ import { useEditorContext } from './EditorContext';
8
+ const VIEWS = [
9
+ { id: 'raw', label: 'Raw', shortcut: '⌘1' },
10
+ { id: 'wysiwyg', label: 'Editor', shortcut: '⌘2' },
11
+ { id: 'preview', label: 'Preview', shortcut: '⌘3' },
12
+ ];
13
+ /**
14
+ * Tab-style view switcher for the three editor modes.
15
+ */
16
+ export function ViewSwitcher({ className }) {
17
+ const { activeView, setActiveView } = useEditorContext();
18
+ return (_jsx("div", { className: `squisq-view-switcher ${className || ''}`, role: "tablist", "aria-label": "Editor view", children: VIEWS.map((view) => (_jsx("button", { role: "tab", "aria-selected": activeView === view.id, className: `squisq-view-tab ${activeView === view.id ? 'squisq-view-tab--active' : ''}`, onClick: () => setActiveView(view.id), title: `${view.label} (${view.shortcut})`, children: view.label }, view.id))) }));
19
+ }
20
+ //# sourceMappingURL=ViewSwitcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewSwitcher.js","sourceRoot":"","sources":["../src/ViewSwitcher.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAmB,MAAM,iBAAiB,CAAC;AAEpE,MAAM,KAAK,GAA0D;IACnE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC3C,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClD,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;CACpD,CAAC;AAOF;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,SAAS,EAAqB;IAC3D,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAEzD,OAAO,CACL,cACE,SAAS,EAAE,wBAAwB,SAAS,IAAI,EAAE,EAAE,EACpD,IAAI,EAAC,SAAS,gBACH,aAAa,YAEvB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,iBAEE,IAAI,EAAC,KAAK,mBACK,UAAU,KAAK,IAAI,CAAC,EAAE,EACrC,SAAS,EAAE,mBAAmB,UAAU,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,EAAE,EACvF,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EACrC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,GAAG,YAExC,IAAI,CAAC,KAAK,IAPN,IAAI,CAAC,EAAE,CAQL,CACV,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * WysiwygEditor
3
+ *
4
+ * Tiptap-based rich text editor that provides a WYSIWYG editing experience
5
+ * for markdown content. Uses squisq's parseMarkdown/stringifyMarkdown for
6
+ * conversion rather than Tiptap's built-in HTML serialization, ensuring
7
+ * perfect fidelity with the markdown format.
8
+ *
9
+ * Includes extensions for GFM features: tables, task lists, strikethrough,
10
+ * and code blocks.
11
+ */
12
+ export interface WysiwygEditorProps {
13
+ /** Placeholder text when editor is empty */
14
+ placeholder?: string;
15
+ /** Additional class name for the container */
16
+ className?: string;
17
+ }
18
+ /**
19
+ * Rich WYSIWYG markdown editor built on Tiptap (ProseMirror).
20
+ * Binds to the shared EditorContext for source synchronization.
21
+ */
22
+ export declare function WysiwygEditor({ placeholder, className, }: WysiwygEditorProps): import("react/jsx-runtime").JSX.Element;
23
+ /**
24
+ * Hook to access the Tiptap editor instance for toolbar commands.
25
+ * The WysiwygEditor must be mounted as a sibling or descendant.
26
+ */
27
+ export { useEditor as useTiptapEditor } from '@tiptap/react';
28
+ //# sourceMappingURL=WysiwygEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WysiwygEditor.d.ts","sourceRoot":"","sources":["../src/WysiwygEditor.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA4BH,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAC5B,WAA2C,EAC3C,SAAS,GACV,EAAE,kBAAkB,2CA0EpB;AAED;;;GAGG;AAEH,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,111 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * WysiwygEditor
4
+ *
5
+ * Tiptap-based rich text editor that provides a WYSIWYG editing experience
6
+ * for markdown content. Uses squisq's parseMarkdown/stringifyMarkdown for
7
+ * conversion rather than Tiptap's built-in HTML serialization, ensuring
8
+ * perfect fidelity with the markdown format.
9
+ *
10
+ * Includes extensions for GFM features: tables, task lists, strikethrough,
11
+ * and code blocks.
12
+ */
13
+ import { useEffect, useRef } from 'react';
14
+ import { useEditor, EditorContent } from '@tiptap/react';
15
+ import StarterKit from '@tiptap/starter-kit';
16
+ import Table from '@tiptap/extension-table';
17
+ import TableRow from '@tiptap/extension-table-row';
18
+ import TableCell from '@tiptap/extension-table-cell';
19
+ import TableHeader from '@tiptap/extension-table-header';
20
+ import TaskList from '@tiptap/extension-task-list';
21
+ import TaskItem from '@tiptap/extension-task-item';
22
+ import Placeholder from '@tiptap/extension-placeholder';
23
+ import { HeadingWithTemplate } from './TemplateAnnotation';
24
+ import { useEditorContext } from './EditorContext';
25
+ import { markdownToTiptap, tiptapToMarkdown } from './tiptapBridge';
26
+ // ── Frontmatter helpers ────────────────────────────────────────────
27
+ /** Regex matching a YAML frontmatter block at the start of the document. */
28
+ const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/;
29
+ /** Strip YAML frontmatter from markdown, returning both parts. */
30
+ function stripFrontmatter(md) {
31
+ const m = md.match(FRONTMATTER_RE);
32
+ if (!m)
33
+ return { body: md, frontmatter: '' };
34
+ return { body: md.slice(m[0].length), frontmatter: m[0] };
35
+ }
36
+ /**
37
+ * Rich WYSIWYG markdown editor built on Tiptap (ProseMirror).
38
+ * Binds to the shared EditorContext for source synchronization.
39
+ */
40
+ export function WysiwygEditor({ placeholder = 'Start typing your markdown…', className, }) {
41
+ const { markdownSource, setMarkdownSource, setTiptapEditor } = useEditorContext();
42
+ const isExternalUpdate = useRef(false);
43
+ const lastSourceRef = useRef(markdownSource);
44
+ // Preserve frontmatter across edits — hidden from WYSIWYG but prepended on save
45
+ const frontmatterRef = useRef(stripFrontmatter(markdownSource).frontmatter);
46
+ const editor = useEditor({
47
+ extensions: [
48
+ StarterKit.configure({
49
+ // Disable built-in heading; we use HeadingWithTemplate instead
50
+ heading: false,
51
+ codeBlock: {
52
+ HTMLAttributes: { class: 'squisq-code-block' },
53
+ },
54
+ }),
55
+ HeadingWithTemplate.configure({ levels: [1, 2, 3, 4, 5, 6] }),
56
+ Table.configure({ resizable: true }),
57
+ TableRow,
58
+ TableCell,
59
+ TableHeader,
60
+ TaskList,
61
+ TaskItem.configure({ nested: true }),
62
+ Placeholder.configure({ placeholder }),
63
+ ],
64
+ content: markdownToTiptap(stripFrontmatter(markdownSource).body),
65
+ onUpdate: ({ editor: ed }) => {
66
+ if (isExternalUpdate.current)
67
+ return;
68
+ const html = ed.getHTML();
69
+ const bodyMd = tiptapToMarkdown(html);
70
+ const newSource = frontmatterRef.current + bodyMd;
71
+ lastSourceRef.current = newSource;
72
+ setMarkdownSource(newSource);
73
+ },
74
+ editorProps: {
75
+ attributes: {
76
+ class: 'squisq-wysiwyg-editor',
77
+ 'data-testid': 'wysiwyg-editor',
78
+ },
79
+ },
80
+ });
81
+ // Register / unregister the Tiptap editor instance with the shared context
82
+ useEffect(() => {
83
+ if (editor) {
84
+ setTiptapEditor(editor);
85
+ }
86
+ return () => setTiptapEditor(null);
87
+ }, [editor, setTiptapEditor]);
88
+ // Sync external changes into Tiptap
89
+ useEffect(() => {
90
+ if (!editor)
91
+ return;
92
+ // Only update if the source changed externally (not from our own onUpdate)
93
+ if (markdownSource !== lastSourceRef.current) {
94
+ isExternalUpdate.current = true;
95
+ const { body, frontmatter } = stripFrontmatter(markdownSource);
96
+ frontmatterRef.current = frontmatter;
97
+ const content = markdownToTiptap(body);
98
+ editor.commands.setContent(content);
99
+ lastSourceRef.current = markdownSource;
100
+ isExternalUpdate.current = false;
101
+ }
102
+ }, [markdownSource, editor]);
103
+ return (_jsx("div", { className: className, style: { width: '100%', height: '100%', overflow: 'auto' }, "data-testid": "wysiwyg-container", children: _jsx(EditorContent, { editor: editor, style: { height: '100%' } }) }));
104
+ }
105
+ /**
106
+ * Hook to access the Tiptap editor instance for toolbar commands.
107
+ * The WysiwygEditor must be mounted as a sibling or descendant.
108
+ */
109
+ // eslint-disable-next-line react-refresh/only-export-components
110
+ export { useEditor as useTiptapEditor } from '@tiptap/react';
111
+ //# sourceMappingURL=WysiwygEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WysiwygEditor.js","sourceRoot":"","sources":["../src/WysiwygEditor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * useFileDrop
3
+ *
4
+ * React hook that manages HTML5 drag-and-drop state for file uploads.
5
+ * Tracks whether files are being dragged over the target element,
6
+ * classifies dragged file types (media vs text), and dispatches
7
+ * drop events to callers.
8
+ */
9
+ export type FileCategory = 'media' | 'text' | 'unknown';
10
+ export type DragContentType = 'media' | 'text' | 'mixed' | null;
11
+ export type DropTarget = 'media' | 'insert' | 'replace';
12
+ export declare function classifyFile(file: {
13
+ name: string;
14
+ type: string;
15
+ }): FileCategory;
16
+ export interface UseFileDropOptions {
17
+ /** Called when files are dropped on a specific target zone. */
18
+ onDrop: (files: File[], target: DropTarget) => void;
19
+ /** Whether drop is enabled (default: true) */
20
+ enabled?: boolean;
21
+ }
22
+ export interface UseFileDropResult {
23
+ /** Whether a drag-with-files is currently hovering over the container */
24
+ isDragging: boolean;
25
+ /** Classification of the dragged content */
26
+ dragContentType: DragContentType;
27
+ /** Attach these to the container element */
28
+ containerProps: {
29
+ onDragEnter: (e: React.DragEvent) => void;
30
+ onDragOver: (e: React.DragEvent) => void;
31
+ onDragLeave: (e: React.DragEvent) => void;
32
+ onDrop: (e: React.DragEvent) => void;
33
+ };
34
+ /** Create props for an individual drop zone target */
35
+ zoneProps: (target: DropTarget) => {
36
+ onDragOver: (e: React.DragEvent) => void;
37
+ onDrop: (e: React.DragEvent) => void;
38
+ };
39
+ }
40
+ export declare function useFileDrop({ onDrop, enabled }: UseFileDropOptions): UseFileDropResult;
41
+ //# sourceMappingURL=useFileDrop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFileDrop.d.ts","sourceRoot":"","sources":["../../src/hooks/useFileDrop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA6BH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AACxD,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AAOxD,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAiB/E;AAwCD,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACpD,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,UAAU,EAAE,OAAO,CAAC;IACpB,4CAA4C;IAC5C,eAAe,EAAE,eAAe,CAAC;IACjC,4CAA4C;IAC5C,cAAc,EAAE;QACd,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;QAC1C,UAAU,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;QACzC,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;QAC1C,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;KACtC,CAAC;IACF,sDAAsD;IACtD,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK;QACjC,UAAU,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;QACzC,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC;KACtC,CAAC;CACH;AAED,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,OAAc,EAAE,EAAE,kBAAkB,GAAG,iBAAiB,CAiG7F"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * useFileDrop
3
+ *
4
+ * React hook that manages HTML5 drag-and-drop state for file uploads.
5
+ * Tracks whether files are being dragged over the target element,
6
+ * classifies dragged file types (media vs text), and dispatches
7
+ * drop events to callers.
8
+ */
9
+ import { useCallback, useRef, useState } from 'react';
10
+ // ─── File classification ────────────────────────────────
11
+ const MEDIA_EXTENSIONS = new Set([
12
+ 'png',
13
+ 'jpg',
14
+ 'jpeg',
15
+ 'gif',
16
+ 'webp',
17
+ 'svg',
18
+ 'avif',
19
+ 'ico',
20
+ 'mp4',
21
+ 'webm',
22
+ 'mov',
23
+ 'avi',
24
+ 'mp3',
25
+ 'wav',
26
+ 'ogg',
27
+ 'aac',
28
+ 'm4a',
29
+ 'flac',
30
+ ]);
31
+ const TEXT_EXTENSIONS = new Set(['md', 'txt', 'docx']);
32
+ function extensionOf(name) {
33
+ const dot = name.lastIndexOf('.');
34
+ return dot >= 0 ? name.slice(dot + 1).toLowerCase() : '';
35
+ }
36
+ export function classifyFile(file) {
37
+ const ext = extensionOf(file.name);
38
+ if (MEDIA_EXTENSIONS.has(ext))
39
+ return 'media';
40
+ if (TEXT_EXTENSIONS.has(ext))
41
+ return 'text';
42
+ // Fallback to MIME type
43
+ if (file.type.startsWith('image/') ||
44
+ file.type.startsWith('video/') ||
45
+ file.type.startsWith('audio/')) {
46
+ return 'media';
47
+ }
48
+ if (file.type === 'text/plain' || file.type === 'text/markdown') {
49
+ return 'text';
50
+ }
51
+ return 'unknown';
52
+ }
53
+ /**
54
+ * Classify dragged items from a DataTransfer during dragenter/dragover.
55
+ * Browsers restrict full file access during drag — only MIME types are
56
+ * available via DataTransferItem.type.
57
+ */
58
+ function classifyDataTransferItems(items) {
59
+ let hasMedia = false;
60
+ let hasText = false;
61
+ for (let i = 0; i < items.length; i++) {
62
+ const item = items[i];
63
+ if (item.kind !== 'file')
64
+ continue;
65
+ const mime = item.type.toLowerCase();
66
+ if (mime.startsWith('image/') || mime.startsWith('video/') || mime.startsWith('audio/')) {
67
+ hasMedia = true;
68
+ }
69
+ else if (mime === 'text/plain' ||
70
+ mime === 'text/markdown' ||
71
+ mime === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') {
72
+ hasText = true;
73
+ }
74
+ else {
75
+ // Unknown MIME — browsers often report '' for many file types during drag.
76
+ // We can't classify, so assume mixed to show all drop zones.
77
+ hasMedia = true;
78
+ hasText = true;
79
+ }
80
+ }
81
+ if (hasMedia && hasText)
82
+ return 'mixed';
83
+ if (hasMedia)
84
+ return 'media';
85
+ if (hasText)
86
+ return 'text';
87
+ return null;
88
+ }
89
+ export function useFileDrop({ onDrop, enabled = true }) {
90
+ const [isDragging, setIsDragging] = useState(false);
91
+ const [dragContentType, setDragContentType] = useState(null);
92
+ // Counter-based tracking: dragenter/dragleave fire on child elements,
93
+ // so we track a count rather than a boolean.
94
+ const dragCounterRef = useRef(0);
95
+ const handleDragEnter = useCallback((e) => {
96
+ if (!enabled)
97
+ return;
98
+ e.preventDefault();
99
+ dragCounterRef.current++;
100
+ if (dragCounterRef.current === 1) {
101
+ setIsDragging(true);
102
+ if (e.dataTransfer.items) {
103
+ setDragContentType(classifyDataTransferItems(e.dataTransfer.items));
104
+ }
105
+ else {
106
+ // Fallback: can't classify, show all zones
107
+ setDragContentType('mixed');
108
+ }
109
+ }
110
+ }, [enabled]);
111
+ const handleDragOver = useCallback((e) => {
112
+ if (!enabled)
113
+ return;
114
+ e.preventDefault();
115
+ // Required to allow drop
116
+ e.dataTransfer.dropEffect = 'copy';
117
+ }, [enabled]);
118
+ const handleDragLeave = useCallback((e) => {
119
+ if (!enabled)
120
+ return;
121
+ e.preventDefault();
122
+ dragCounterRef.current = Math.max(0, dragCounterRef.current - 1);
123
+ if (dragCounterRef.current === 0) {
124
+ setIsDragging(false);
125
+ setDragContentType(null);
126
+ }
127
+ }, [enabled]);
128
+ const handleDrop = useCallback((e) => {
129
+ if (!enabled)
130
+ return;
131
+ e.preventDefault();
132
+ dragCounterRef.current = 0;
133
+ setIsDragging(false);
134
+ setDragContentType(null);
135
+ // Actual file handling is done by zone-specific onDrop
136
+ }, [enabled]);
137
+ const zoneProps = useCallback((target) => ({
138
+ onDragOver: (e) => {
139
+ e.preventDefault();
140
+ e.stopPropagation();
141
+ e.dataTransfer.dropEffect = 'copy';
142
+ },
143
+ onDrop: (e) => {
144
+ e.preventDefault();
145
+ e.stopPropagation();
146
+ dragCounterRef.current = 0;
147
+ setIsDragging(false);
148
+ setDragContentType(null);
149
+ const files = Array.from(e.dataTransfer.files);
150
+ if (files.length > 0) {
151
+ onDrop(files, target);
152
+ }
153
+ },
154
+ }), [onDrop]);
155
+ return {
156
+ isDragging,
157
+ dragContentType,
158
+ containerProps: {
159
+ onDragEnter: handleDragEnter,
160
+ onDragOver: handleDragOver,
161
+ onDragLeave: handleDragLeave,
162
+ onDrop: handleDrop,
163
+ },
164
+ zoneProps,
165
+ };
166
+ }
167
+ //# sourceMappingURL=useFileDrop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFileDrop.js","sourceRoot":"","sources":["../../src/hooks/useFileDrop.ts"],"names":[],"mappings":"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"}