@editneo/react 0.1.0 → 0.1.2

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 (37) hide show
  1. package/README.md +334 -0
  2. package/dist/EditableBlock.d.ts.map +1 -1
  3. package/dist/EditableBlock.js +123 -15
  4. package/dist/EditableBlock.js.map +1 -1
  5. package/dist/NeoCanvas.d.ts.map +1 -1
  6. package/dist/NeoCanvas.js +33 -8
  7. package/dist/NeoCanvas.js.map +1 -1
  8. package/dist/NeoEditor.d.ts +12 -4
  9. package/dist/NeoEditor.d.ts.map +1 -1
  10. package/dist/NeoEditor.js +51 -15
  11. package/dist/NeoEditor.js.map +1 -1
  12. package/dist/blocks/ListBlock.d.ts.map +1 -1
  13. package/dist/blocks/ListBlock.js +17 -1
  14. package/dist/blocks/ListBlock.js.map +1 -1
  15. package/dist/components/Aeropeak.d.ts +3 -1
  16. package/dist/components/Aeropeak.d.ts.map +1 -1
  17. package/dist/components/Aeropeak.js +46 -24
  18. package/dist/components/Aeropeak.js.map +1 -1
  19. package/dist/components/CursorOverlay.d.ts +4 -1
  20. package/dist/components/CursorOverlay.d.ts.map +1 -1
  21. package/dist/components/CursorOverlay.js +113 -10
  22. package/dist/components/CursorOverlay.js.map +1 -1
  23. package/dist/components/PDFDropZone.d.ts.map +1 -1
  24. package/dist/components/PDFDropZone.js +23 -33
  25. package/dist/components/PDFDropZone.js.map +1 -1
  26. package/dist/components/SlashMenu.d.ts.map +1 -1
  27. package/dist/components/SlashMenu.js +50 -46
  28. package/dist/components/SlashMenu.js.map +1 -1
  29. package/dist/hooks.d.ts +25 -0
  30. package/dist/hooks.d.ts.map +1 -1
  31. package/dist/hooks.js +19 -6
  32. package/dist/hooks.js.map +1 -1
  33. package/dist/index.d.ts +9 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +13 -1
  36. package/dist/index.js.map +1 -1
  37. package/package.json +23 -5
package/dist/NeoEditor.js CHANGED
@@ -1,40 +1,76 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { createContext, useEffect, useMemo, useState } from 'react';
3
- import { SyncManager } from '@editneo/sync';
2
+ import { createContext, useContext, useEffect, useMemo, useRef, useState } from 'react';
3
+ import { createEditorStore } from '@editneo/core';
4
+ import { useStore } from 'zustand';
4
5
  import { NeoCanvas } from './NeoCanvas';
5
6
  import './styles.css';
6
7
  export const EditorContext = createContext(null);
8
+ /**
9
+ * Hook to access the current editor's Zustand store via context.
10
+ * Supports selectors for fine-grained re-render control.
11
+ */
12
+ export function useEditorStoreContext(selector) {
13
+ const ctx = useContext(EditorContext);
14
+ if (!ctx) {
15
+ throw new Error('useEditorStoreContext must be used within a <NeoEditor />');
16
+ }
17
+ return useStore(ctx.store, selector);
18
+ }
7
19
  export const NeoEditor = ({ id, offline = true, syncConfig, renderBlock, className, theme, children }) => {
20
+ // Create a store instance that lives for the lifetime of this editor.
21
+ const storeRef = useRef();
22
+ if (!storeRef.current) {
23
+ storeRef.current = createEditorStore();
24
+ }
25
+ const editorRootRef = useRef(null);
8
26
  const [syncManager, setSyncManager] = useState(null);
9
- // Initialize Sync Manager
27
+ // (#13) Only create SyncManager when sync or offline persistence is needed
10
28
  useEffect(() => {
11
- const manager = new SyncManager(id);
12
- // TODO: Configure websocket if syncConfig is present (will be added to SyncManager later)
13
- setSyncManager(manager);
29
+ // Lazy-import sync to avoid forcing all consumers to install @editneo/sync
30
+ const needsSync = syncConfig || offline;
31
+ if (!needsSync)
32
+ return;
33
+ let manager = null;
34
+ import('@editneo/sync').then(({ SyncManager }) => {
35
+ manager = new SyncManager(id, syncConfig);
36
+ manager.bindStore(storeRef.current);
37
+ setSyncManager(manager);
38
+ }).catch(() => {
39
+ // @editneo/sync not installed — silently skip
40
+ console.warn('@editneo/sync is not installed. Sync and offline persistence are disabled.');
41
+ });
14
42
  return () => {
15
- // manager.destroy(); // Implement destroy in SyncManager
43
+ if (manager)
44
+ manager.destroy();
16
45
  };
17
- }, [id, syncConfig]);
18
- // Apply Theme
46
+ }, [id, syncConfig, offline]);
47
+ // (#22) Scope theme to this editor's root element, not document.documentElement
19
48
  useEffect(() => {
20
- const root = document.documentElement;
49
+ const el = editorRootRef.current;
50
+ if (!el)
51
+ return;
21
52
  if ((theme === null || theme === void 0 ? void 0 : theme.mode) === 'dark') {
22
- root.style.setProperty('--neo-bg-canvas', '#0f172a');
23
- root.style.setProperty('--neo-text-primary', '#f3f4f6');
53
+ el.style.setProperty('--neo-bg-canvas', '#0f172a');
54
+ el.style.setProperty('--neo-text-primary', '#f3f4f6');
55
+ el.style.setProperty('--neo-selection-color', '#334155');
24
56
  }
25
57
  else {
26
- root.style.setProperty('--neo-bg-canvas', '#ffffff');
27
- root.style.setProperty('--neo-text-primary', '#111827');
58
+ el.style.setProperty('--neo-bg-canvas', '#ffffff');
59
+ el.style.setProperty('--neo-text-primary', '#111827');
60
+ el.style.setProperty('--neo-selection-color', '#b4d5fe');
28
61
  }
29
62
  }, [theme]);
30
63
  const value = useMemo(() => ({
31
64
  editorId: id,
65
+ store: storeRef.current,
32
66
  syncManager,
33
67
  renderBlock
34
68
  }), [id, syncManager, renderBlock]);
35
- return (_jsx(EditorContext.Provider, { value: value, children: _jsxs("div", { className: `neo-editor ${className || ''}`, style: {
69
+ return (_jsx(EditorContext.Provider, { value: value, children: _jsxs("div", { ref: editorRootRef, className: `neo-editor ${className || ''}`, style: {
36
70
  backgroundColor: 'var(--neo-bg-canvas)',
37
71
  color: 'var(--neo-text-primary)',
72
+ fontFamily: 'var(--neo-font-family)',
73
+ fontSize: 'var(--neo-font-size-body)',
38
74
  height: '100%',
39
75
  display: 'flex',
40
76
  flexDirection: 'column',
@@ -1 +1 @@
1
- {"version":3,"file":"NeoEditor.js","sourceRoot":"","sources":["../src/NeoEditor.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE3E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,cAAc,CAAC;AAmBtB,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAIhC,IAAI,CAAC,CAAC;AAEhB,MAAM,CAAC,MAAM,SAAS,GAA6B,CAAC,EAClD,EAAE,EACF,OAAO,GAAG,IAAI,EACd,UAAU,EACV,WAAW,EACX,SAAS,EACT,KAAK,EACL,QAAQ,EACT,EAAE,EAAE;IACH,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAqB,IAAI,CAAC,CAAC;IAEzE,0BAA0B;IAC1B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;QACpC,0FAA0F;QAC1F,cAAc,CAAC,OAAO,CAAC,CAAC;QAExB,OAAO,GAAG,EAAE;YACV,yDAAyD;QAC3D,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAErB,cAAc;IACd,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC;QACtC,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,MAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;YACrD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;YACrD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3B,QAAQ,EAAE,EAAE;QACZ,WAAW;QACX,WAAW;KACZ,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;IAEpC,OAAO,CACL,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAClC,eAAK,SAAS,EAAE,cAAc,SAAS,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE;gBACtD,eAAe,EAAE,sBAAsB;gBACvC,KAAK,EAAE,yBAAyB;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,MAAM;gBACf,aAAa,EAAE,QAAQ;gBACvB,QAAQ,EAAE,UAAU;aACrB,aAEE,QAAQ,EAGT,cAAK,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,YACxC,KAAC,SAAS,KAAG,GACZ,IACF,GACiB,CAC1B,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"NeoEditor.js","sourceRoot":"","sources":["../src/NeoEditor.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ListBlock.d.ts","sourceRoot":"","sources":["../../src/blocks/ListBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,CAcnD,CAAC"}
1
+ {"version":3,"file":"ListBlock.d.ts","sourceRoot":"","sources":["../../src/blocks/ListBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAKzC,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,CAiCnD,CAAC"}
@@ -1,8 +1,24 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useContext } from 'react';
3
+ import { useStore } from 'zustand';
2
4
  import { EditableBlock } from '../EditableBlock';
5
+ import { EditorContext } from '../NeoEditor';
3
6
  export const ListBlock = ({ block }) => {
7
+ var _a, _b, _c;
4
8
  const isOrdered = block.type === 'ordered-list';
5
9
  const isTodo = block.type === 'todo-list';
6
- return (_jsxs("div", { className: "neo-list-item", style: { display: 'flex', alignItems: 'flex-start', marginLeft: '1.5em' }, children: [_jsx("span", { style: { marginRight: '0.5em', userSelect: 'none' }, children: isOrdered ? '1.' : isTodo ? _jsx("input", { type: "checkbox", disabled: true }) : '•' }), _jsx("div", { style: { flex: 1 }, children: _jsx(EditableBlock, { block: block }) })] }));
10
+ const context = useContext(EditorContext);
11
+ const updateBlock = context ? useStore(context.store, (s) => s.updateBlock) : null;
12
+ // (#27) Interactive checkbox for todo-list
13
+ const handleCheckboxChange = (e) => {
14
+ if (updateBlock) {
15
+ updateBlock(block.id, { props: { ...block.props, checked: e.target.checked } });
16
+ }
17
+ };
18
+ return (_jsxs("div", { className: "neo-list-item", style: { display: 'flex', alignItems: 'flex-start', marginLeft: '1.5em' }, children: [_jsx("span", { style: { marginRight: '0.5em', userSelect: 'none', flexShrink: 0, marginTop: '4px' }, children: isOrdered
19
+ ? `${((_b = (_a = block.props) === null || _a === void 0 ? void 0 : _a.order) !== null && _b !== void 0 ? _b : 1)}.`
20
+ : isTodo
21
+ ? _jsx("input", { type: "checkbox", checked: !!((_c = block.props) === null || _c === void 0 ? void 0 : _c.checked), onChange: handleCheckboxChange, style: { cursor: 'pointer' } })
22
+ : '\u2022' }), _jsx("div", { style: { flex: 1 }, children: _jsx(EditableBlock, { block: block }) })] }));
7
23
  };
8
24
  //# sourceMappingURL=ListBlock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ListBlock.js","sourceRoot":"","sources":["../../src/blocks/ListBlock.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,CAAC,MAAM,SAAS,GAAkC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IACpE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC;IAE1C,OAAO,CACL,eAAK,SAAS,EAAC,eAAe,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,aACtG,eAAM,KAAK,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,YACtD,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAO,IAAI,EAAC,UAAU,EAAC,QAAQ,SAAG,CAAC,CAAC,CAAC,GAAG,GAChE,EACP,cAAK,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,YACrB,KAAC,aAAa,IAAC,KAAK,EAAE,KAAK,GAAI,GAC3B,IACF,CACP,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"ListBlock.js","sourceRoot":"","sources":["../../src/blocks/ListBlock.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,CAAC,MAAM,SAAS,GAAkC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;;IACpE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC;IAC1C,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAE1C,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEnF,2CAA2C;IAC3C,MAAM,oBAAoB,GAAG,CAAC,CAAsC,EAAE,EAAE;QACtE,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,eAAe,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,aACtG,eAAM,KAAK,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,YACvF,SAAS;oBACR,CAAC,CAAC,GAAG,CAAC,MAAA,MAAA,KAAK,CAAC,KAAK,0CAAE,KAAK,mCAAI,CAAC,CAAC,GAAG;oBACjC,CAAC,CAAC,MAAM;wBACR,CAAC,CAAC,gBACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,CAAC,CAAC,CAAA,MAAA,KAAK,CAAC,KAAK,0CAAE,OAAO,CAAA,EAC/B,QAAQ,EAAE,oBAAoB,EAC9B,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAC5B;wBACJ,CAAC,CAAC,QAAQ,GACP,EACP,cAAK,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,YACrB,KAAC,aAAa,IAAC,KAAK,EAAE,KAAK,GAAI,GAC3B,IACF,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -7,13 +7,15 @@ interface AeropeakProps {
7
7
  export declare const Aeropeak: React.FC<AeropeakProps> & {
8
8
  Bold: React.FC;
9
9
  Italic: React.FC;
10
+ Underline: React.FC;
10
11
  Strike: React.FC;
12
+ Code: React.FC;
11
13
  Link: React.FC;
12
14
  };
13
15
  export declare const AeroButton: React.FC<{
14
16
  icon: React.ReactNode;
15
17
  label?: string;
16
- onClick: (editor: any) => void;
18
+ onClick: () => void;
17
19
  }>;
18
20
  export declare const Separator: React.FC;
19
21
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"Aeropeak.d.ts","sourceRoot":"","sources":["../../src/components/Aeropeak.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAGnD,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;CACvC;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG;IAC/C,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;IACf,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;IACjB,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;CAgEhB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;IAChC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;CAChC,CAoBA,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAE7B,CAAC"}
1
+ {"version":3,"file":"Aeropeak.d.ts","sourceRoot":"","sources":["../../src/components/Aeropeak.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAI/D,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;CACvC;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG;IAC/C,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;IACf,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;IACjB,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;IACpB,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;IACjB,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;IACf,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;CAiEhB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC;IAChC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAuBA,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAE7B,CAAC"}
@@ -1,10 +1,13 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useState } from 'react';
3
- import { useEditor } from '../hooks';
2
+ import { useEffect, useState, useContext } from 'react';
3
+ import { useStore } from 'zustand';
4
+ import { EditorContext } from '../NeoEditor';
4
5
  export const Aeropeak = ({ children, offset = 10, animation = 'fade' }) => {
5
- const { selection, toggleMark } = useEditor(); // toggleMark to be implemented in useEditor/store
6
6
  const [position, setPosition] = useState(null);
7
7
  useEffect(() => {
8
+ // (#44) SSR guard
9
+ if (typeof window === 'undefined')
10
+ return;
8
11
  const handleSelectionChange = () => {
9
12
  const sel = window.getSelection();
10
13
  if (!sel || sel.rangeCount === 0 || sel.isCollapsed) {
@@ -13,9 +16,6 @@ export const Aeropeak = ({ children, offset = 10, animation = 'fade' }) => {
13
16
  }
14
17
  const range = sel.getRangeAt(0);
15
18
  const rect = range.getBoundingClientRect();
16
- // Calculate position relative to viewport (fixed positioning usually easiest for portals)
17
- // or relative to editor container if using absolute.
18
- // For now, let's use fixed/absolute coordinates based on rect.
19
19
  if (rect.width > 0) {
20
20
  setPosition({
21
21
  x: rect.left + rect.width / 2,
@@ -32,36 +32,58 @@ export const Aeropeak = ({ children, offset = 10, animation = 'fade' }) => {
32
32
  if (!position)
33
33
  return null;
34
34
  return (_jsx("div", { className: `neo-aeropeak neo-anim-${animation}`, style: {
35
- position: 'fixed', // Using fixed for simplicity with viewport coords
35
+ position: 'fixed',
36
36
  top: position.y,
37
37
  left: position.x,
38
38
  transform: 'translate(-50%, -100%)',
39
39
  zIndex: 1000,
40
- backgroundColor: '#333',
41
- color: 'white',
42
- borderRadius: '4px',
40
+ backgroundColor: '#1f2937',
41
+ color: '#ffffff',
42
+ borderRadius: '6px',
43
43
  padding: '4px',
44
44
  display: 'flex',
45
- gap: '4px',
46
- boxShadow: '0 2px 10px rgba(0,0,0,0.2)'
47
- }, onMouseDown: (e) => e.preventDefault(), children: children || (_jsxs(_Fragment, { children: [_jsx(Aeropeak.Bold, {}), _jsx(Aeropeak.Italic, {}), _jsx(Aeropeak.Strike, {}), _jsx(Aeropeak.Link, {})] })) }));
45
+ gap: '2px',
46
+ boxShadow: '0 4px 12px rgba(0,0,0,0.25)'
47
+ }, onMouseDown: (e) => e.preventDefault(), children: children || (_jsxs(_Fragment, { children: [_jsx(Aeropeak.Bold, {}), _jsx(Aeropeak.Italic, {}), _jsx(Aeropeak.Underline, {}), _jsx(Aeropeak.Strike, {}), _jsx(Aeropeak.Code, {}), _jsx(Aeropeak.Link, {})] })) }));
48
48
  };
49
49
  export const AeroButton = ({ icon, label, onClick }) => {
50
- const editor = useEditor();
51
- return (_jsx("button", { onClick: () => onClick(editor), className: "neo-aero-button", title: label, style: {
50
+ return (_jsx("button", { onClick: onClick, className: "neo-aero-button", title: label, style: {
52
51
  background: 'none',
53
52
  border: 'none',
54
53
  color: 'inherit',
55
54
  cursor: 'pointer',
56
55
  padding: '4px 8px',
57
- borderRadius: '2px',
58
- display: 'flex', alignItems: 'center'
59
- }, children: icon }));
56
+ borderRadius: '4px',
57
+ display: 'flex',
58
+ alignItems: 'center',
59
+ fontSize: '14px',
60
+ }, onMouseEnter: (e) => { e.target.style.backgroundColor = 'rgba(255,255,255,0.15)'; }, onMouseLeave: (e) => { e.target.style.backgroundColor = 'transparent'; }, children: icon }));
61
+ };
62
+ export const Separator = () => (_jsx("div", { style: { width: '1px', backgroundColor: 'rgba(255,255,255,0.2)', margin: '0 2px' } }));
63
+ /** Helper component that connects to context store */
64
+ function MarkButton({ mark, icon, label }) {
65
+ const context = useContext(EditorContext);
66
+ const toggleMark = context ? useStore(context.store, (s) => s.toggleMark) : null;
67
+ return _jsx(AeroButton, { icon: icon, label: label, onClick: () => toggleMark === null || toggleMark === void 0 ? void 0 : toggleMark(mark) });
68
+ }
69
+ // (#28) Added Underline and Code buttons
70
+ Aeropeak.Bold = () => _jsx(MarkButton, { mark: "bold", icon: _jsx("strong", { children: "B" }), label: "Bold" });
71
+ Aeropeak.Italic = () => _jsx(MarkButton, { mark: "italic", icon: _jsx("em", { children: "I" }), label: "Italic" });
72
+ Aeropeak.Underline = () => _jsx(MarkButton, { mark: "underline", icon: _jsx("u", { children: "U" }), label: "Underline" });
73
+ Aeropeak.Strike = () => _jsx(MarkButton, { mark: "strike", icon: _jsx("s", { children: "S" }), label: "Strikethrough" });
74
+ Aeropeak.Code = () => _jsx(MarkButton, { mark: "code", icon: _jsx("span", { style: { fontFamily: 'monospace' }, children: "</>" }), label: "Code" });
75
+ // (#19) Link button prompts for URL and calls setLink
76
+ Aeropeak.Link = () => {
77
+ const context = useContext(EditorContext);
78
+ const setLink = context ? useStore(context.store, (s) => s.setLink) : null;
79
+ const handleClick = () => {
80
+ if (!setLink)
81
+ return;
82
+ const url = prompt('Enter URL:');
83
+ if (url !== null) {
84
+ setLink(url || null);
85
+ }
86
+ };
87
+ return _jsx(AeroButton, { icon: _jsx("span", { style: { fontSize: '12px' }, children: "Link" }), label: "Link", onClick: handleClick });
60
88
  };
61
- export const Separator = () => (_jsx("div", { style: { width: '1px', backgroundColor: 'rgba(255,255,255,0.2)', margin: '0 4px' } }));
62
- // Default Buttons
63
- Aeropeak.Bold = () => _jsx(AeroButton, { icon: _jsx("strong", { children: "B" }), label: "Bold", onClick: (e) => e.toggleMark && e.toggleMark('bold') });
64
- Aeropeak.Italic = () => _jsx(AeroButton, { icon: _jsx("em", { children: "I" }), label: "Italic", onClick: (e) => e.toggleMark && e.toggleMark('italic') });
65
- Aeropeak.Strike = () => _jsx(AeroButton, { icon: _jsx("s", { children: "S" }), label: "Strike", onClick: (e) => e.toggleMark && e.toggleMark('strike') });
66
- Aeropeak.Link = () => _jsx(AeroButton, { icon: _jsx("span", { children: "\uD83D\uDD17" }), label: "Link", onClick: (e) => e.toggleMark && e.toggleMark('link') });
67
89
  //# sourceMappingURL=Aeropeak.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Aeropeak.js","sourceRoot":"","sources":["../../src/components/Aeropeak.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Aeropeak.js","sourceRoot":"","sources":["../../src/components/Aeropeak.tsx"],"names":[],"mappings":"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"}
@@ -1,7 +1,10 @@
1
1
  import React from 'react';
2
2
  interface CursorOverlayProps {
3
3
  colors?: string[];
4
- renderLabel?: (user: any) => React.ReactNode;
4
+ renderLabel?: (user: {
5
+ name: string;
6
+ color: string;
7
+ }) => React.ReactNode;
5
8
  }
6
9
  export declare const CursorOverlay: React.FC<CursorOverlayProps>;
7
10
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"CursorOverlay.d.ts","sourceRoot":"","sources":["../../src/components/CursorOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAgB/D,UAAU,kBAAkB;IAC1B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,KAAK,CAAC,SAAS,CAAC;CAC9C;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAsDtD,CAAC"}
1
+ {"version":3,"file":"CursorOverlay.d.ts","sourceRoot":"","sources":["../../src/components/CursorOverlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuD,MAAM,OAAO,CAAC;AAsB5E,UAAU,kBAAkB;IAC1B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC;CAC1E;AAwDD,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAiHtD,CAAC"}
@@ -1,9 +1,60 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useContext, useEffect, useState } from 'react';
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useContext, useEffect, useState, useCallback } from 'react';
3
3
  import { EditorContext } from '../NeoEditor';
4
- export const CursorOverlay = ({ colors = ['#FF5733', '#33FF57', '#3357FF'], renderLabel }) => {
4
+ /**
5
+ * (#25) Calculate the pixel position of a cursor within a contentEditable block.
6
+ * Walks text nodes to find the correct offset, then uses Range.getBoundingClientRect().
7
+ */
8
+ function getCursorRect(blockId, charIndex, containerEl) {
9
+ const blockEl = containerEl.querySelector(`[data-block-id="${blockId}"] [contenteditable]`);
10
+ if (!blockEl)
11
+ return null;
12
+ // Walk text nodes to find the correct one
13
+ const walker = document.createTreeWalker(blockEl, NodeFilter.SHOW_TEXT);
14
+ let currentOffset = 0;
15
+ let targetNode = null;
16
+ let targetOffset = 0;
17
+ while (walker.nextNode()) {
18
+ const textNode = walker.currentNode;
19
+ const len = textNode.length;
20
+ if (currentOffset + len >= charIndex) {
21
+ targetNode = textNode;
22
+ targetOffset = charIndex - currentOffset;
23
+ break;
24
+ }
25
+ currentOffset += len;
26
+ }
27
+ if (!targetNode) {
28
+ // Fallback: cursor at end of block
29
+ const rect = blockEl.getBoundingClientRect();
30
+ const containerRect = containerEl.getBoundingClientRect();
31
+ return {
32
+ top: rect.top - containerRect.top,
33
+ left: rect.right - containerRect.left,
34
+ height: rect.height || 20,
35
+ };
36
+ }
37
+ try {
38
+ const range = document.createRange();
39
+ range.setStart(targetNode, Math.min(targetOffset, targetNode.length));
40
+ range.setEnd(targetNode, Math.min(targetOffset, targetNode.length));
41
+ const rect = range.getBoundingClientRect();
42
+ const containerRect = containerEl.getBoundingClientRect();
43
+ return {
44
+ top: rect.top - containerRect.top,
45
+ left: rect.left - containerRect.left,
46
+ height: rect.height || 20,
47
+ };
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ export const CursorOverlay = ({ renderLabel }) => {
5
54
  const context = useContext(EditorContext);
6
55
  const [cursors, setCursors] = useState([]);
56
+ const [cursorRects, setCursorRects] = useState(new Map());
57
+ const overlayRef = React.useRef(null);
7
58
  useEffect(() => {
8
59
  const manager = context === null || context === void 0 ? void 0 : context.syncManager;
9
60
  if (!manager || !manager.awareness)
@@ -28,14 +79,66 @@ export const CursorOverlay = ({ colors = ['#FF5733', '#33FF57', '#3357FF'], rend
28
79
  awareness.off('change', handleChange);
29
80
  };
30
81
  }, [context === null || context === void 0 ? void 0 : context.syncManager]);
82
+ // Recalculate cursor positions when cursors change
83
+ const updateRects = useCallback(() => {
84
+ var _a;
85
+ const container = (_a = overlayRef.current) === null || _a === void 0 ? void 0 : _a.parentElement;
86
+ if (!container)
87
+ return;
88
+ const newRects = new Map();
89
+ for (const cursor of cursors) {
90
+ if (cursor.cursor) {
91
+ const rect = getCursorRect(cursor.cursor.blockId, cursor.cursor.index, container);
92
+ if (rect) {
93
+ newRects.set(cursor.clientId, rect);
94
+ }
95
+ }
96
+ }
97
+ setCursorRects(newRects);
98
+ }, [cursors]);
99
+ useEffect(() => {
100
+ var _a;
101
+ updateRects();
102
+ // Also update on scroll/resize
103
+ const container = (_a = overlayRef.current) === null || _a === void 0 ? void 0 : _a.parentElement;
104
+ if (!container)
105
+ return;
106
+ const observer = new MutationObserver(updateRects);
107
+ observer.observe(container, { childList: true, subtree: true, characterData: true });
108
+ window.addEventListener('resize', updateRects);
109
+ return () => {
110
+ observer.disconnect();
111
+ window.removeEventListener('resize', updateRects);
112
+ };
113
+ }, [updateRects]);
31
114
  if (!(context === null || context === void 0 ? void 0 : context.syncManager))
32
115
  return null;
33
- return (_jsx("div", { className: "neo-cursor-overlay", style: { position: 'absolute', inset: 0, pointerEvents: 'none', zIndex: 999 }, children: cursors.map(cursor => (_jsx("div", { style: {
34
- // Positioning logic would go here based on cursor.cursor props (blockId, index)
35
- // For MVP we just render a dummy marker at top left or log it
36
- // Real implementation requires integration effectively with EditableBlock measurements
37
- position: 'absolute',
38
- display: 'none' // Hidden for now as we lack rect calculation
39
- }, children: _jsx("span", { style: { backgroundColor: cursor.user.color }, children: cursor.user.name }) }, cursor.clientId))) }));
116
+ return (_jsx("div", { ref: overlayRef, className: "neo-cursor-overlay", style: { position: 'absolute', inset: 0, pointerEvents: 'none', zIndex: 999 }, children: cursors.map(cursor => {
117
+ const rect = cursorRects.get(cursor.clientId);
118
+ if (!rect || !cursor.cursor)
119
+ return null;
120
+ return (_jsxs("div", { style: {
121
+ position: 'absolute',
122
+ top: rect.top,
123
+ left: rect.left,
124
+ transition: 'top 0.1s ease, left 0.1s ease',
125
+ }, children: [_jsx("div", { style: {
126
+ width: '2px',
127
+ height: `${rect.height}px`,
128
+ backgroundColor: cursor.user.color,
129
+ } }), _jsx("div", { style: {
130
+ position: 'absolute',
131
+ top: -18,
132
+ left: 0,
133
+ backgroundColor: cursor.user.color,
134
+ color: '#fff',
135
+ fontSize: '11px',
136
+ padding: '1px 6px',
137
+ borderRadius: '3px 3px 3px 0',
138
+ whiteSpace: 'nowrap',
139
+ fontWeight: 500,
140
+ lineHeight: '16px',
141
+ }, children: renderLabel ? renderLabel(cursor.user) : cursor.user.name })] }, cursor.clientId));
142
+ }) }));
40
143
  };
41
144
  //# sourceMappingURL=CursorOverlay.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CursorOverlay.js","sourceRoot":"","sources":["../../src/components/CursorOverlay.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAoB7C,MAAM,CAAC,MAAM,aAAa,GAAiC,CAAC,EAC1D,MAAM,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAC1C,WAAW,EACZ,EAAE,EAAE;IACH,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC1C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IAErD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAC;QACrC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS;YAAE,OAAO;QAE3C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAEpC,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;YACrC,MAAM,UAAU,GAAa,EAAE,CAAC;YAChC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,QAAgB,EAAE,EAAE;gBAC9C,IAAI,QAAQ,KAAK,SAAS,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAClE,UAAU,CAAC,IAAI,CAAC;wBACd,QAAQ;wBACR,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,MAAM,EAAE,KAAK,CAAC,MAAM;qBACrB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;YACH,UAAU,CAAC,UAAU,CAAC,CAAC;QACzB,CAAC,CAAC;QAEF,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACrC,OAAO,GAAG,EAAE;YACV,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACxC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAC,CAAC,CAAC;IAE3B,IAAI,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAA;QAAE,OAAO,IAAI,CAAC;IAEvC,OAAO,CACL,cAAK,SAAS,EAAC,oBAAoB,EAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,YAC9G,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CACrB,cAEE,KAAK,EAAE;gBACJ,gFAAgF;gBAChF,8DAA8D;gBAC9D,uFAAuF;gBACvF,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,MAAM,CAAC,6CAA6C;aAC/D,YAED,eAAM,KAAK,EAAE,EAAE,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,YAAG,MAAM,CAAC,IAAI,CAAC,IAAI,GAAQ,IATzE,MAAM,CAAC,QAAQ,CAUhB,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"CursorOverlay.js","sourceRoot":"","sources":["../../src/components/CursorOverlay.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PDFDropZone.d.ts","sourceRoot":"","sources":["../../src/components/PDFDropZone.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAKrD,UAAU,gBAAgB;IACxB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC;IAChE,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA8FlD,CAAC"}
1
+ {"version":3,"file":"PDFDropZone.d.ts","sourceRoot":"","sources":["../../src/components/PDFDropZone.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4C,MAAM,OAAO,CAAC;AAKjE,UAAU,gBAAgB;IACxB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC;IAChE,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAmFlD,CAAC"}
@@ -1,10 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useCallback } from 'react';
3
- import { extractBlocksFromPdf } from '@editneo/pdf'; // We'll need to export this or handle worker loading
4
- import { useEditor } from '../hooks';
2
+ import { useState, useCallback, useContext } from 'react';
3
+ import { useStore } from 'zustand';
4
+ import { EditorContext } from '../NeoEditor';
5
5
  export const PDFDropZone = ({ onDrop, renderOverlay, children }) => {
6
6
  const [isOver, setIsOver] = useState(false);
7
- const { addBlock } = useEditor();
7
+ const [isProcessing, setIsProcessing] = useState(false);
8
+ const context = useContext(EditorContext);
9
+ const insertFullBlocks = context ? useStore(context.store, (s) => s.insertFullBlocks) : null;
8
10
  const handleDragOver = useCallback((e) => {
9
11
  e.preventDefault();
10
12
  setIsOver(true);
@@ -19,41 +21,28 @@ export const PDFDropZone = ({ onDrop, renderOverlay, children }) => {
19
21
  const files = Array.from(e.dataTransfer.files);
20
22
  if (onDrop) {
21
23
  onDrop(files);
22
- return; // If custom onDrop is provided, we might not want default behavior?
23
- // The guide says "Intercept the file before processing".
24
- // User might want to run default logic too. For now let's assume if onDrop is present, user handles it.
25
- // But actually, usually onDrop is for side effects.
26
- // Let's check the guide: "Intercept the file before processing." implies we might stop there.
24
+ return;
27
25
  }
28
- // Default processing for PDFs
26
+ // Default processing for PDFs (#11)
29
27
  const pdfFile = files.find(f => f.type === 'application/pdf');
30
- if (pdfFile) {
31
- const buffer = await pdfFile.arrayBuffer();
32
- // Note: In a real app we'd use a worker.
33
- // For this implementation we call the logic directly but wrapped async.
34
- // We need to ensure @editneo/pdf exports this.
28
+ if (pdfFile && insertFullBlocks) {
29
+ setIsProcessing(true);
35
30
  try {
31
+ // Lazy-import @editneo/pdf so it's not a hard requirement
32
+ const { extractBlocksFromPdf } = await import('@editneo/pdf');
33
+ const buffer = await pdfFile.arrayBuffer();
36
34
  const blocks = await extractBlocksFromPdf(buffer);
37
- blocks.forEach((block) => {
38
- // We need a way to add a full block with content, not just type.
39
- // store.addBlock currently only takes type.
40
- // We need to enhance store.addBlock or add a new action `insertBlock` that takes a full block.
41
- // For now, we'll manually use the internal store update if possible or add the action.
42
- // Let's assume we update store actions in next steps or just map it.
43
- // Actually, the blocks from PDF are full NeoBlocks.
44
- // We need `addBlock` to support full block object or a new action `insertFullBlock`.
45
- // I'll add `insertBlocks` to the store types later.
46
- // For now, let's log or assume the hook exposes it.
47
- console.log('PDF Blocks extracted:', blocks);
48
- // useEditorStore.getState().insertBlocks(blocks); // TODO: Add this action
49
- });
35
+ insertFullBlocks(blocks);
50
36
  }
51
37
  catch (err) {
52
- console.error('PDF Extraction failed:', err);
38
+ console.error('PDF extraction failed:', err);
39
+ }
40
+ finally {
41
+ setIsProcessing(false);
53
42
  }
54
43
  }
55
- }, [onDrop, addBlock]);
56
- return (_jsxs("div", { onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, style: { position: 'relative', height: '100%', width: '100%' }, children: [children, isOver && (_jsx("div", { style: {
44
+ }, [onDrop, insertFullBlocks]);
45
+ return (_jsxs("div", { onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, style: { position: 'relative', height: '100%', width: '100%' }, children: [children, (isOver || isProcessing) && (_jsx("div", { style: {
57
46
  position: 'absolute',
58
47
  top: 0, left: 0, right: 0, bottom: 0,
59
48
  backgroundColor: 'rgba(59, 130, 246, 0.1)',
@@ -63,10 +52,11 @@ export const PDFDropZone = ({ onDrop, renderOverlay, children }) => {
63
52
  alignItems: 'center',
64
53
  justifyContent: 'center'
65
54
  }, children: renderOverlay ? renderOverlay({ isOver }) : (_jsx("div", { style: {
66
- backgroundColor: 'white',
55
+ backgroundColor: 'var(--neo-bg-canvas, white)',
56
+ color: 'var(--neo-text-primary, #111)',
67
57
  padding: '20px',
68
58
  borderRadius: '8px',
69
59
  boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1)'
70
- }, children: "\u2728 Release to Transmute PDF \u2728" })) }))] }));
60
+ }, children: isProcessing ? 'Processing PDF...' : 'Drop PDF to convert to blocks' })) }))] }));
71
61
  };
72
62
  //# sourceMappingURL=PDFDropZone.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PDFDropZone.js","sourceRoot":"","sources":["../../src/components/PDFDropZone.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PDFDropZone.js","sourceRoot":"","sources":["../../src/components/PDFDropZone.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SlashMenu.d.ts","sourceRoot":"","sources":["../../src/components/SlashMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAGhE,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;CAChC;AAED,UAAU,cAAc;IACtB,cAAc,CAAC,EAAE,WAAW,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC;IACvC,aAAa,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;CAC1C;AAED,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA8I9C,CAAC"}
1
+ {"version":3,"file":"SlashMenu.d.ts","sourceRoot":"","sources":["../../src/components/SlashMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAI/D,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;CAChC;AAED,UAAU,cAAc;IACtB,cAAc,CAAC,EAAE,WAAW,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC;IACvC,aAAa,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;CAC1C;AAED,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAkJ9C,CAAC"}