@editneo/react 0.1.2 → 0.1.3

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.
@@ -2,6 +2,8 @@ import React from 'react';
2
2
  import { NeoBlock } from '@editneo/core';
3
3
  interface BlockRendererProps {
4
4
  block: NeoBlock;
5
+ /** Auto-computed order for ordered-list blocks. */
6
+ order?: number;
5
7
  }
6
8
  export declare const BlockRenderer: React.FC<BlockRendererProps>;
7
9
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"BlockRenderer.d.ts","sourceRoot":"","sources":["../src/BlockRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAczC,UAAU,kBAAkB;IAC1B,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAUtD,CAAC"}
1
+ {"version":3,"file":"BlockRenderer.d.ts","sourceRoot":"","sources":["../src/BlockRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAczC,UAAU,kBAAkB;IAC1B,KAAK,EAAE,QAAQ,CAAC;IAChB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAUtD,CAAC"}
@@ -11,7 +11,7 @@ import { CodeBlock } from './blocks/CodeBlock';
11
11
  import { QuoteBlock } from './blocks/QuoteBlock';
12
12
  import { CalloutBlock } from './blocks/CalloutBlock';
13
13
  import { DividerBlock } from './blocks/DividerBlock';
14
- export const BlockRenderer = ({ block }) => {
14
+ export const BlockRenderer = ({ block, order }) => {
15
15
  const context = useContext(EditorContext);
16
16
  // Allow user override
17
17
  if (context === null || context === void 0 ? void 0 : context.renderBlock) {
@@ -19,9 +19,9 @@ export const BlockRenderer = ({ block }) => {
19
19
  if (customRender)
20
20
  return _jsx(_Fragment, { children: customRender });
21
21
  }
22
- return _jsx(DefaultRender, { block: block });
22
+ return _jsx(DefaultRender, { block: block, order: order });
23
23
  };
24
- const DefaultRender = ({ block }) => {
24
+ const DefaultRender = ({ block, order }) => {
25
25
  switch (block.type) {
26
26
  case 'heading-1':
27
27
  case 'heading-2':
@@ -30,7 +30,7 @@ const DefaultRender = ({ block }) => {
30
30
  case 'bullet-list':
31
31
  case 'ordered-list':
32
32
  case 'todo-list':
33
- return _jsx(ListBlock, { block: block });
33
+ return _jsx(ListBlock, { block: block, order: order });
34
34
  case 'image':
35
35
  case 'video':
36
36
  return _jsx(MediaBlock, { block: block });
@@ -1 +1 @@
1
- {"version":3,"file":"BlockRenderer.js","sourceRoot":"","sources":["../src/BlockRenderer.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,2GAA2G;AAC3G,2GAA2G;AAC3G,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAMrD,MAAM,CAAC,MAAM,aAAa,GAAiC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IACvE,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAE1C,sBAAsB;IACtB,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,KAAC,aAAa,IAAC,KAAK,EAAE,CAAC,GAAI,CAAC,CAAC;QAC9F,IAAI,YAAY;YAAE,OAAO,4BAAG,YAAY,GAAI,CAAC;IAC/C,CAAC;IAED,OAAO,KAAC,aAAa,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,aAAa,GAAiC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IAChE,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,WAAW,CAAC;QACjB,KAAK,WAAW,CAAC;QACjB,KAAK,WAAW;YACd,OAAO,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;QACxC,KAAK,aAAa,CAAC;QACnB,KAAK,cAAc,CAAC;QACpB,KAAK,WAAW;YACd,OAAO,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;QACrC,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACV,OAAO,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;QACtC,KAAK,YAAY;YACb,OAAO,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;QACvC,KAAK,OAAO;YACR,OAAO,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;QACxC,KAAK,SAAS;YACV,OAAO,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;QAC1C,KAAK,SAAS;YACV,OAAO,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;QAC1C,KAAK,WAAW,CAAC;QACjB;YACE,OAAO,KAAC,aAAa,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;IAC3C,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"BlockRenderer.js","sourceRoot":"","sources":["../src/BlockRenderer.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,2GAA2G;AAC3G,2GAA2G;AAC3G,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAQrD,MAAM,CAAC,MAAM,aAAa,GAAiC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IAC9E,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAE1C,sBAAsB;IACtB,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAW,EAAE,EAAE,CAAC,KAAC,aAAa,IAAC,KAAK,EAAE,CAAC,GAAI,CAAC,CAAC;QAC9F,IAAI,YAAY;YAAE,OAAO,4BAAG,YAAY,GAAI,CAAC;IAC/C,CAAC;IAED,OAAO,KAAC,aAAa,IAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAI,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,aAAa,GAAiC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IACvE,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,WAAW,CAAC;QACjB,KAAK,WAAW,CAAC;QACjB,KAAK,WAAW;YACd,OAAO,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;QACxC,KAAK,aAAa,CAAC;QACnB,KAAK,cAAc,CAAC;QACpB,KAAK,WAAW;YACd,OAAO,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAI,CAAC;QACnD,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACV,OAAO,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;QACtC,KAAK,YAAY;YACb,OAAO,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;QACvC,KAAK,OAAO;YACR,OAAO,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;QACxC,KAAK,SAAS;YACV,OAAO,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;QAC1C,KAAK,SAAS;YACV,OAAO,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;QAC1C,KAAK,WAAW,CAAC;QACjB;YACE,OAAO,KAAC,aAAa,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;IAC3C,CAAC;AACH,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"EditableBlock.d.ts","sourceRoot":"","sources":["../src/EditableBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwC,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAQ,MAAM,eAAe,CAAC;AAI/C,UAAU,kBAAkB;IAC1B,KAAK,EAAE,QAAQ,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AA8ED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAmGtD,CAAC"}
1
+ {"version":3,"file":"EditableBlock.d.ts","sourceRoot":"","sources":["../src/EditableBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqD,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAQ,MAAM,eAAe,CAAC;AAI/C,UAAU,kBAAkB;IAC1B,KAAK,EAAE,QAAQ,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAuLD,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA4NtD,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useRef, useContext, useEffect } from 'react';
2
+ import { useRef, useContext, useEffect, useCallback } from 'react';
3
3
  import { useStore } from 'zustand';
4
4
  import { EditorContext } from './NeoEditor';
5
5
  /**
@@ -80,9 +80,112 @@ function spansHaveSameFormat(a, b) {
80
80
  (a.highlight || '') === (b.highlight || '') &&
81
81
  (a.link || '') === (b.link || ''));
82
82
  }
83
+ /** Render Span[] to HTML string for innerHTML injection. */
84
+ function spansToHtml(spans) {
85
+ return spans.map((span) => {
86
+ let html = escapeHtml(span.text);
87
+ // Wrap in formatting tags (innermost first)
88
+ if (span.bold)
89
+ html = `<strong>${html}</strong>`;
90
+ if (span.italic)
91
+ html = `<em>${html}</em>`;
92
+ if (span.underline)
93
+ html = `<u>${html}</u>`;
94
+ if (span.strike)
95
+ html = `<s>${html}</s>`;
96
+ if (span.code) {
97
+ html = `<code style="font-family:var(--neo-code-font,monospace);background:#eee;padding:2px 4px;border-radius:3px">${html}</code>`;
98
+ }
99
+ // Apply inline styles for color/highlight
100
+ const styles = [];
101
+ if (span.color)
102
+ styles.push(`color:${span.color}`);
103
+ if (span.highlight)
104
+ styles.push(`background-color:${span.highlight}`);
105
+ if (styles.length > 0) {
106
+ html = `<span style="${styles.join(';')}">${html}</span>`;
107
+ }
108
+ if (span.link) {
109
+ html = `<a href="${escapeHtml(span.link)}" style="color:var(--neo-accent-color,#3b82f6);text-decoration:underline">${html}</a>`;
110
+ }
111
+ return html;
112
+ }).join('');
113
+ }
114
+ function escapeHtml(text) {
115
+ return text
116
+ .replace(/&/g, '&amp;')
117
+ .replace(/</g, '&lt;')
118
+ .replace(/>/g, '&gt;')
119
+ .replace(/"/g, '&quot;');
120
+ }
121
+ /**
122
+ * Calculate the character offset of the current selection within a contentEditable element.
123
+ * Walks all text nodes in document order and sums lengths until we reach the selection anchor/focus.
124
+ */
125
+ function getCharOffset(containerEl, node, offset) {
126
+ const walker = document.createTreeWalker(containerEl, NodeFilter.SHOW_TEXT);
127
+ let charCount = 0;
128
+ while (walker.nextNode()) {
129
+ const textNode = walker.currentNode;
130
+ if (textNode === node) {
131
+ return charCount + offset;
132
+ }
133
+ charCount += (textNode.textContent || '').length;
134
+ }
135
+ // If the node itself is the container or an element node, offset refers to child index
136
+ // Walk text nodes up to that child
137
+ if (node === containerEl || node.nodeType === Node.ELEMENT_NODE) {
138
+ const children = Array.from(node.childNodes);
139
+ const targetChild = children[Math.min(offset, children.length)];
140
+ const allWalker = document.createTreeWalker(containerEl, NodeFilter.SHOW_TEXT);
141
+ let count = 0;
142
+ while (allWalker.nextNode()) {
143
+ if (targetChild && allWalker.currentNode === targetChild)
144
+ break;
145
+ // Check if this text node is before the target
146
+ if (targetChild && node.compareDocumentPosition(allWalker.currentNode) & Node.DOCUMENT_POSITION_FOLLOWING)
147
+ break;
148
+ count += (allWalker.currentNode.textContent || '').length;
149
+ }
150
+ return count;
151
+ }
152
+ return charCount;
153
+ }
154
+ /**
155
+ * Set the cursor position in a contentEditable element to a specific character offset.
156
+ */
157
+ function setCursorToOffset(containerEl, targetOffset) {
158
+ const walker = document.createTreeWalker(containerEl, NodeFilter.SHOW_TEXT);
159
+ let offset = 0;
160
+ while (walker.nextNode()) {
161
+ const textNode = walker.currentNode;
162
+ const len = textNode.length;
163
+ if (offset + len >= targetOffset) {
164
+ const range = document.createRange();
165
+ range.setStart(textNode, targetOffset - offset);
166
+ range.collapse(true);
167
+ const sel = window.getSelection();
168
+ sel === null || sel === void 0 ? void 0 : sel.removeAllRanges();
169
+ sel === null || sel === void 0 ? void 0 : sel.addRange(range);
170
+ return;
171
+ }
172
+ offset += len;
173
+ }
174
+ // If offset exceeds total text, place at end
175
+ const range = document.createRange();
176
+ range.selectNodeContents(containerEl);
177
+ range.collapse(false);
178
+ const sel = window.getSelection();
179
+ sel === null || sel === void 0 ? void 0 : sel.removeAllRanges();
180
+ sel === null || sel === void 0 ? void 0 : sel.addRange(range);
181
+ }
83
182
  export const EditableBlock = ({ block, autoFocus }) => {
84
183
  const contentRef = useRef(null);
85
184
  const context = useContext(EditorContext);
185
+ // Track the content we last wrote to the DOM to detect external changes
186
+ const lastRenderedContentRef = useRef('');
187
+ // Flag to suppress store updates when we're syncing from store → DOM
188
+ const isSyncingFromStoreRef = useRef(false);
86
189
  if (!context) {
87
190
  throw new Error('EditableBlock must be used within a NeoEditor');
88
191
  }
@@ -91,22 +194,95 @@ export const EditableBlock = ({ block, autoFocus }) => {
91
194
  const deleteBlock = useStore(context.store, (state) => state.deleteBlock);
92
195
  const undo = useStore(context.store, (state) => state.undo);
93
196
  const redo = useStore(context.store, (state) => state.redo);
197
+ const setSelection = useStore(context.store, (state) => state.setSelection);
198
+ const rootBlocks = useStore(context.store, (state) => state.rootBlocks);
199
+ // --- Uncontrolled DOM: render spans as innerHTML, not React children ---
200
+ // Initial mount: set innerHTML from block content
94
201
  useEffect(() => {
95
- if (autoFocus && contentRef.current) {
96
- contentRef.current.focus();
202
+ const el = contentRef.current;
203
+ if (!el)
204
+ return;
205
+ const html = spansToHtml(block.content);
206
+ el.innerHTML = html;
207
+ lastRenderedContentRef.current = html;
208
+ if (autoFocus) {
209
+ el.focus();
97
210
  }
98
- }, [autoFocus]);
99
- /** (#9) Parse DOM back into spans preserving formatting */
100
- const handleInput = (e) => {
211
+ // Only run on mount (block.id change means a new block)
212
+ // eslint-disable-next-line react-hooks/exhaustive-deps
213
+ }, [block.id]);
214
+ // External content changes (undo, redo, remote sync): resync innerHTML
215
+ // We compare the new content's HTML to what we last rendered.
216
+ useEffect(() => {
217
+ const el = contentRef.current;
218
+ if (!el)
219
+ return;
220
+ // Don't resync if we're the ones who just updated the store
221
+ if (isSyncingFromStoreRef.current) {
222
+ isSyncingFromStoreRef.current = false;
223
+ return;
224
+ }
225
+ const html = spansToHtml(block.content);
226
+ if (html !== lastRenderedContentRef.current) {
227
+ // Save cursor position
228
+ const sel = window.getSelection();
229
+ let savedOffset = 0;
230
+ if (sel && sel.rangeCount > 0 && el.contains(sel.anchorNode)) {
231
+ savedOffset = getCharOffset(el, sel.anchorNode, sel.anchorOffset);
232
+ }
233
+ el.innerHTML = html;
234
+ lastRenderedContentRef.current = html;
235
+ // Restore cursor if this element was focused
236
+ if (document.activeElement === el || el.contains(document.activeElement)) {
237
+ setCursorToOffset(el, savedOffset);
238
+ }
239
+ }
240
+ }, [block.content]);
241
+ /** Parse DOM back into spans on input */
242
+ const handleInput = useCallback(() => {
101
243
  const el = contentRef.current;
102
244
  if (!el)
103
245
  return;
104
246
  const newSpans = parseContentEditableToSpans(el);
247
+ lastRenderedContentRef.current = el.innerHTML;
248
+ isSyncingFromStoreRef.current = true;
105
249
  updateBlock(block.id, { content: newSpans });
106
- };
107
- /** (#23) Additional keyboard shortcuts */
108
- const handleKeyDown = (e) => {
109
- var _a;
250
+ }, [block.id, updateBlock]);
251
+ /** Sync DOM selection store selection */
252
+ const handleSelect = useCallback(() => {
253
+ const el = contentRef.current;
254
+ if (!el)
255
+ return;
256
+ const sel = window.getSelection();
257
+ if (!sel || sel.rangeCount === 0)
258
+ return;
259
+ if (!el.contains(sel.anchorNode))
260
+ return;
261
+ const startOffset = getCharOffset(el, sel.anchorNode, sel.anchorOffset);
262
+ const endOffset = sel.isCollapsed
263
+ ? startOffset
264
+ : getCharOffset(el, sel.focusNode, sel.focusOffset);
265
+ const lo = Math.min(startOffset, endOffset);
266
+ const hi = Math.max(startOffset, endOffset);
267
+ setSelection(block.id, lo, hi);
268
+ }, [block.id, setSelection]);
269
+ /** Register document selectionchange listener */
270
+ useEffect(() => {
271
+ const onSelectionChange = () => {
272
+ const el = contentRef.current;
273
+ if (!el)
274
+ return;
275
+ // Only handle if this element is focused
276
+ if (document.activeElement === el || el.contains(document.activeElement)) {
277
+ handleSelect();
278
+ }
279
+ };
280
+ document.addEventListener('selectionchange', onSelectionChange);
281
+ return () => document.removeEventListener('selectionchange', onSelectionChange);
282
+ }, [handleSelect]);
283
+ /** Keyboard shortcuts */
284
+ const handleKeyDown = useCallback((e) => {
285
+ var _a, _b;
110
286
  // Ctrl+Z / Cmd+Z = undo
111
287
  if ((e.ctrlKey || e.metaKey) && e.key === 'z' && !e.shiftKey) {
112
288
  e.preventDefault();
@@ -119,54 +295,85 @@ export const EditableBlock = ({ block, autoFocus }) => {
119
295
  redo();
120
296
  return;
121
297
  }
298
+ const el = contentRef.current;
122
299
  if (e.key === 'Enter' && !e.shiftKey) {
123
300
  e.preventDefault();
124
301
  addBlock('paragraph', block.id);
125
302
  }
126
303
  else if (e.key === 'Enter' && e.shiftKey) {
127
- // Shift+Enter: let browser insert <br> (soft break) — don't prevent default
304
+ // Shift+Enter: let browser insert <br> (soft break)
128
305
  }
129
- else if (e.key === 'Backspace' && ((_a = contentRef.current) === null || _a === void 0 ? void 0 : _a.innerText) === '') {
306
+ else if (e.key === 'Backspace' && (el === null || el === void 0 ? void 0 : el.innerText.trim()) === '') {
130
307
  e.preventDefault();
131
308
  deleteBlock(block.id);
132
309
  }
133
310
  else if (e.key === 'Tab') {
134
311
  e.preventDefault();
135
- // Insert 2 spaces for now — real indent to be added
136
312
  document.execCommand('insertText', false, ' ');
137
313
  }
138
- };
139
- return (_jsx("div", { ref: contentRef, contentEditable: true, suppressContentEditableWarning: true, onInput: handleInput, onKeyDown: handleKeyDown, style: {
140
- minHeight: '24px',
141
- outline: 'none',
142
- padding: '4px 0',
143
- fontSize: block.type === 'heading-1' ? '2em'
144
- : block.type === 'heading-2' ? '1.5em'
145
- : block.type === 'heading-3' ? '1.25em'
146
- : '1em',
147
- fontWeight: block.type.startsWith('heading') ? 'bold' : 'normal',
148
- }, children: block.content.map((span, i) => {
149
- let style = {};
150
- if (span.bold)
151
- style.fontWeight = 'bold';
152
- if (span.italic)
153
- style.fontStyle = 'italic';
154
- if (span.underline)
155
- style.textDecoration = 'underline';
156
- if (span.strike)
157
- style.textDecoration = (style.textDecoration ? style.textDecoration + ' ' : '') + 'line-through';
158
- if (span.color)
159
- style.color = span.color;
160
- if (span.highlight)
161
- style.backgroundColor = span.highlight;
162
- const content = _jsx("span", { style: style, children: span.text }, i);
163
- if (span.code) {
164
- return _jsx("code", { style: { fontFamily: 'var(--neo-code-font, monospace)', backgroundColor: '#eee', padding: '2px 4px', borderRadius: '3px' }, children: content }, i);
314
+ else if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {
315
+ // Navigate to previous block if at the start
316
+ if (el) {
317
+ const sel = window.getSelection();
318
+ if (sel && sel.isCollapsed) {
319
+ const offset = getCharOffset(el, sel.anchorNode, sel.anchorOffset);
320
+ if (offset === 0) {
321
+ e.preventDefault();
322
+ const idx = rootBlocks.indexOf(block.id);
323
+ if (idx > 0) {
324
+ const prevBlockId = rootBlocks[idx - 1];
325
+ setSelection(prevBlockId, Infinity, Infinity);
326
+ // Focus the previous block's contentEditable
327
+ const prevEl = (_a = el.closest('.neo-editor')) === null || _a === void 0 ? void 0 : _a.querySelector(`[data-block-id="${prevBlockId}"] [contenteditable]`);
328
+ if (prevEl) {
329
+ prevEl.focus();
330
+ // Place cursor at end
331
+ const range = document.createRange();
332
+ range.selectNodeContents(prevEl);
333
+ range.collapse(false);
334
+ sel.removeAllRanges();
335
+ sel.addRange(range);
336
+ }
337
+ }
338
+ }
339
+ }
165
340
  }
166
- if (span.link) {
167
- return _jsx("a", { href: span.link, style: { color: 'var(--neo-accent-color, #3b82f6)', textDecoration: 'underline' }, children: content }, i);
341
+ }
342
+ else if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {
343
+ // Navigate to next block if at the end
344
+ if (el) {
345
+ const sel = window.getSelection();
346
+ if (sel && sel.isCollapsed) {
347
+ const offset = getCharOffset(el, sel.anchorNode, sel.anchorOffset);
348
+ const totalLen = (el.textContent || '').length;
349
+ if (offset >= totalLen) {
350
+ e.preventDefault();
351
+ const idx = rootBlocks.indexOf(block.id);
352
+ if (idx < rootBlocks.length - 1) {
353
+ const nextBlockId = rootBlocks[idx + 1];
354
+ setSelection(nextBlockId, 0, 0);
355
+ const nextEl = (_b = el.closest('.neo-editor')) === null || _b === void 0 ? void 0 : _b.querySelector(`[data-block-id="${nextBlockId}"] [contenteditable]`);
356
+ if (nextEl) {
357
+ nextEl.focus();
358
+ setCursorToOffset(nextEl, 0);
359
+ }
360
+ }
361
+ }
362
+ }
168
363
  }
169
- return content;
170
- }) }));
364
+ }
365
+ }, [undo, redo, addBlock, deleteBlock, block.id, rootBlocks, setSelection]);
366
+ return (_jsx("div", { "data-block-id": block.id, style: { position: 'relative' }, children: _jsx("div", { ref: contentRef, contentEditable: true, suppressContentEditableWarning: true, onInput: handleInput, onKeyDown: handleKeyDown, className: "neo-editable-block", style: {
367
+ minHeight: '24px',
368
+ outline: 'none',
369
+ padding: '4px 0',
370
+ whiteSpace: 'pre-wrap',
371
+ wordBreak: 'break-word',
372
+ fontSize: block.type === 'heading-1' ? '2em'
373
+ : block.type === 'heading-2' ? '1.5em'
374
+ : block.type === 'heading-3' ? '1.25em'
375
+ : '1em',
376
+ fontWeight: block.type.startsWith('heading') ? 'bold' : 'normal',
377
+ } }) }));
171
378
  };
172
379
  //# sourceMappingURL=EditableBlock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditableBlock.js","sourceRoot":"","sources":["../src/EditableBlock.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EditableBlock.js","sourceRoot":"","sources":["../src/EditableBlock.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"NeoCanvas.d.ts","sourceRoot":"","sources":["../src/NeoCanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAMlD,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAkF7B,CAAC"}
1
+ {"version":3,"file":"NeoCanvas.d.ts","sourceRoot":"","sources":["../src/NeoCanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAC;AA4BlD,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAkF7B,CAAC"}
package/dist/NeoCanvas.js CHANGED
@@ -4,6 +4,23 @@ import { useVirtualizer } from '@tanstack/react-virtual';
4
4
  import { useStore } from 'zustand';
5
5
  import { EditorContext } from './NeoEditor';
6
6
  import { BlockRenderer } from './BlockRenderer';
7
+ /**
8
+ * (#27a) Compute the sequential order for an ordered-list block.
9
+ * Counts consecutive ordered-list blocks backwards from the given index.
10
+ */
11
+ function computeOrder(rootBlocks, blocks, index) {
12
+ const block = blocks[rootBlocks[index]];
13
+ if (!block || block.type !== 'ordered-list')
14
+ return undefined;
15
+ let order = 1;
16
+ for (let i = index - 1; i >= 0; i--) {
17
+ const prev = blocks[rootBlocks[i]];
18
+ if (!prev || prev.type !== 'ordered-list')
19
+ break;
20
+ order++;
21
+ }
22
+ return order;
23
+ }
7
24
  export const NeoCanvas = () => {
8
25
  const context = useContext(EditorContext);
9
26
  if (!context) {
@@ -57,7 +74,7 @@ export const NeoCanvas = () => {
57
74
  left: 0,
58
75
  width: '100%',
59
76
  transform: `translateY(${virtualRow.start}px)`,
60
- }, children: _jsx(BlockRenderer, { block: block }) }, virtualRow.key));
77
+ }, children: _jsx(BlockRenderer, { block: block, order: computeOrder(rootBlocks, blocks, virtualRow.index) }) }, virtualRow.key));
61
78
  }) }) }));
62
79
  };
63
80
  //# sourceMappingURL=NeoCanvas.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NeoCanvas.js","sourceRoot":"","sources":["../src/NeoCanvas.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NeoCanvas.js","sourceRoot":"","sources":["../src/NeoCanvas.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,10 @@
1
1
  import React from 'react';
2
2
  import { NeoBlock } from '@editneo/core';
3
- export declare const ListBlock: React.FC<{
3
+ interface ListBlockProps {
4
4
  block: NeoBlock;
5
- }>;
5
+ /** Auto-computed order for ordered-list blocks. */
6
+ order?: number;
7
+ }
8
+ export declare const ListBlock: React.FC<ListBlockProps>;
9
+ export {};
6
10
  //# sourceMappingURL=ListBlock.d.ts.map
@@ -1 +1 @@
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
+ {"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,UAAU,cAAc;IACtB,KAAK,EAAE,QAAQ,CAAC;IAChB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAoC9C,CAAC"}
@@ -3,7 +3,7 @@ import { useContext } from 'react';
3
3
  import { useStore } from 'zustand';
4
4
  import { EditableBlock } from '../EditableBlock';
5
5
  import { EditorContext } from '../NeoEditor';
6
- export const ListBlock = ({ block }) => {
6
+ export const ListBlock = ({ block, order }) => {
7
7
  var _a, _b, _c;
8
8
  const isOrdered = block.type === 'ordered-list';
9
9
  const isTodo = block.type === 'todo-list';
@@ -15,8 +15,10 @@ export const ListBlock = ({ block }) => {
15
15
  updateBlock(block.id, { props: { ...block.props, checked: e.target.checked } });
16
16
  }
17
17
  };
18
+ // (#27a) Use computed order from parent, fall back to props, then 1
19
+ const displayOrder = (_b = order !== null && order !== void 0 ? order : (_a = block.props) === null || _a === void 0 ? void 0 : _a.order) !== null && _b !== void 0 ? _b : 1;
18
20
  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)}.`
21
+ ? `${displayOrder}.`
20
22
  : isTodo
21
23
  ? _jsx("input", { type: "checkbox", checked: !!((_c = block.props) === null || _c === void 0 ? void 0 : _c.checked), onChange: handleCheckboxChange, style: { cursor: 'pointer' } })
22
24
  : '\u2022' }), _jsx("div", { style: { flex: 1 }, children: _jsx(EditableBlock, { block: block }) })] }));
@@ -1 +1 @@
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"}
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;AAQ7C,MAAM,CAAC,MAAM,SAAS,GAA6B,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;;IACtE,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,oEAAoE;IACpE,MAAM,YAAY,GAAG,MAAA,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,MAAA,KAAK,CAAC,KAAK,0CAAE,KAAK,mCAAI,CAAC,CAAC;IAEtD,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,YAAY,GAAG;oBACpB,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"}
package/dist/hooks.d.ts CHANGED
@@ -21,6 +21,7 @@ export declare const useEditor: () => {
21
21
  deleteBlock: (id: string) => void;
22
22
  moveBlock: (id: string, afterId: string | null) => void;
23
23
  setBlockType: (id: string, newType: import("@editneo/core").BlockType) => void;
24
+ setSelection: (blockId: string | null, startOffset: number, endOffset: number) => void;
24
25
  toggleMark: (mark: keyof Pick<import("@editneo/core").Span, "bold" | "italic" | "underline" | "strike" | "code">) => void;
25
26
  setLink: (url: string | null) => void;
26
27
  undo: () => void;
@@ -45,6 +46,7 @@ export declare const useSelection: () => {
45
46
  };
46
47
  /**
47
48
  * Returns the current sync connection status.
49
+ * Reflects real WebSocket state: 'connecting' | 'connected' | 'disconnected'.
48
50
  */
49
- export declare const useSyncStatus: () => "connected" | "disconnected";
51
+ export declare const useSyncStatus: () => "connecting" | "connected" | "disconnected";
50
52
  //# sourceMappingURL=hooks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;+DAPD,CAAC;sEAGsB,CAAC;0EAEhC,CAAC;;;;;;;;;;;;;;;;;CAeb,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;CAMxB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,oCAGzB,CAAC"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;+DAPtB,CAAC;sEAGsB,CAAC;0EACU,CAAC;;;;;;;;;;;;;;;;;;CAgBlC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;CAMxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,QAAO,YAAY,GAAG,WAAW,GAAG,cA0B7D,CAAC"}
package/dist/hooks.js CHANGED
@@ -1,4 +1,4 @@
1
- import { useContext } from 'react';
1
+ import { useContext, useState, useEffect } from 'react';
2
2
  import { useStore } from 'zustand';
3
3
  import { EditorContext } from './NeoEditor';
4
4
  /**
@@ -30,9 +30,29 @@ export const useSelection = () => {
30
30
  };
31
31
  /**
32
32
  * Returns the current sync connection status.
33
+ * Reflects real WebSocket state: 'connecting' | 'connected' | 'disconnected'.
33
34
  */
34
35
  export const useSyncStatus = () => {
35
36
  const context = useContext(EditorContext);
36
- return (context === null || context === void 0 ? void 0 : context.syncManager) ? 'connected' : 'disconnected';
37
+ const [status, setStatus] = useState('disconnected');
38
+ useEffect(() => {
39
+ const manager = context === null || context === void 0 ? void 0 : context.syncManager;
40
+ if (!manager) {
41
+ setStatus('disconnected');
42
+ return;
43
+ }
44
+ // Read initial status
45
+ if (typeof manager.getStatus === 'function') {
46
+ setStatus(manager.getStatus());
47
+ }
48
+ // Subscribe to changes
49
+ if (typeof manager.onStatusChange === 'function') {
50
+ const unsubscribe = manager.onStatusChange((newStatus) => {
51
+ setStatus(newStatus);
52
+ });
53
+ return unsubscribe;
54
+ }
55
+ }, [context === null || context === void 0 ? void 0 : context.syncManager]);
56
+ return status;
37
57
  };
38
58
  //# sourceMappingURL=hooks.js.map
package/dist/hooks.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE;IAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAE1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEtC,OAAO;QACL,GAAG,KAAK;QACR,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,eAAe;KAC7C,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE;IAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAkB,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,EAAE;IAChC,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC1C,OAAO,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,EAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC;AAC7D,CAAC,CAAC"}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE;IAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAE1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEtC,OAAO;QACL,GAAG,KAAK;QACR,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE,eAAe;KAC7C,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE;IAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAkB,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,GAAgD,EAAE;IAC7E,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC1C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAA8C,cAAc,CAAC,CAAC;IAElG,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAC;QACrC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAS,CAAC,cAAc,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,sBAAsB;QACtB,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YAC5C,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACjC,CAAC;QAED,uBAAuB;QACvB,IAAI,OAAO,OAAO,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;YACjD,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,SAAiB,EAAE,EAAE;gBAC/D,SAAS,CAAC,SAAgB,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YACH,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,CAAC,CAAC,CAAC;IAE3B,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1,141 @@
1
+ /* ─────────────────────────────────────────────────────────────────────
2
+ @editneo/react — Default Styles & Design Tokens
3
+ ───────────────────────────────────────────────────────────────────── */
4
+
5
+ :root {
6
+ /* Typography */
7
+ --neo-font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
8
+ --neo-font-size-body: 16px;
9
+ --neo-code-font: "Fira Code", "JetBrains Mono", "Cascadia Code", "Consolas", monospace;
10
+
11
+ /* Colors */
12
+ --neo-bg-canvas: #ffffff;
13
+ --neo-text-primary: #111827;
14
+ --neo-text-secondary: #6b7280;
15
+ --neo-selection-color: #b4d5fe;
16
+ --neo-accent-color: #3b82f6;
17
+ --neo-border-color: #e5e7eb;
18
+
19
+ /* Layout */
20
+ --neo-block-spacing: 4px;
21
+ --neo-content-width: 800px;
22
+ --neo-border-radius: 4px;
23
+ }
24
+
25
+ /* Dark Mode via data attribute */
26
+ [data-theme="dark"] {
27
+ --neo-bg-canvas: #0f172a;
28
+ --neo-text-primary: #f3f4f6;
29
+ --neo-text-secondary: #9ca3af;
30
+ --neo-selection-color: #334155;
31
+ --neo-accent-color: #60a5fa;
32
+ --neo-border-color: #374151;
33
+ }
34
+
35
+ /* ── Editor root ─────────────────────────────────────────────────── */
36
+
37
+ .neo-editor {
38
+ line-height: 1.6;
39
+ -webkit-font-smoothing: antialiased;
40
+ -moz-osx-font-smoothing: grayscale;
41
+ }
42
+
43
+ .neo-editor *::selection {
44
+ background: var(--neo-selection-color);
45
+ }
46
+
47
+ /* ── Block spacing ───────────────────────────────────────────────── */
48
+
49
+ .neo-editor [contenteditable] {
50
+ outline: none;
51
+ }
52
+
53
+ .neo-editor [contenteditable]:empty::before {
54
+ content: "Type '/' for commands";
55
+ color: var(--neo-text-secondary);
56
+ pointer-events: none;
57
+ }
58
+
59
+ /* ── Heading styles ──────────────────────────────────────────────── */
60
+
61
+ .neo-heading-1 {
62
+ margin: 1em 0 0.25em;
63
+ }
64
+
65
+ .neo-heading-2 {
66
+ margin: 0.75em 0 0.2em;
67
+ }
68
+
69
+ .neo-heading-3 {
70
+ margin: 0.5em 0 0.15em;
71
+ }
72
+
73
+ /* ── Code block ──────────────────────────────────────────────────── */
74
+
75
+ .neo-code-block {
76
+ font-family: var(--neo-code-font);
77
+ font-size: 0.9em;
78
+ tab-size: 2;
79
+ }
80
+
81
+ /* ── Quote ────────────────────────────────────────────────────────── */
82
+
83
+ .neo-quote {
84
+ border-left: 3px solid var(--neo-accent-color);
85
+ padding-left: 1em;
86
+ color: var(--neo-text-secondary);
87
+ font-style: italic;
88
+ }
89
+
90
+ /* ── Callout ──────────────────────────────────────────────────────── */
91
+
92
+ .neo-callout {
93
+ border-radius: var(--neo-border-radius);
94
+ }
95
+
96
+ /* ── Divider ──────────────────────────────────────────────────────── */
97
+
98
+ .neo-divider hr {
99
+ border: none;
100
+ border-top: 1px solid var(--neo-border-color);
101
+ margin: 1em 0;
102
+ }
103
+
104
+ /* ── Aeropeak animations ─────────────────────────────────────────── */
105
+
106
+ .neo-anim-fade {
107
+ animation: neoFadeIn 0.15s ease-out;
108
+ }
109
+
110
+ .neo-anim-scale {
111
+ animation: neoScaleIn 0.15s ease-out;
112
+ }
113
+
114
+ @keyframes neoFadeIn {
115
+ from { opacity: 0; }
116
+ to { opacity: 1; }
117
+ }
118
+
119
+ @keyframes neoScaleIn {
120
+ from { opacity: 0; transform: translate(-50%, -100%) scale(0.95); }
121
+ to { opacity: 1; transform: translate(-50%, -100%) scale(1); }
122
+ }
123
+
124
+ /* ── Slash menu ──────────────────────────────────────────────────── */
125
+
126
+ .neo-slash-menu {
127
+ animation: neoFadeIn 0.1s ease-out;
128
+ }
129
+
130
+ /* ── Toolbar button hover ────────────────────────────────────────── */
131
+
132
+ .neo-aero-button:hover {
133
+ background-color: rgba(255, 255, 255, 0.15) !important;
134
+ }
135
+
136
+ /* ── List items ──────────────────────────────────────────────────── */
137
+
138
+ .neo-list-item input[type="checkbox"] {
139
+ accent-color: var(--neo-accent-color);
140
+ margin-top: 2px;
141
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@editneo/react",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "React components for EditNeo — NeoEditor, Aeropeak, SlashMenu, and more",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -10,18 +10,19 @@
10
10
  "types": "./dist/index.d.ts",
11
11
  "import": "./dist/index.js",
12
12
  "default": "./dist/index.js"
13
- }
13
+ },
14
+ "./styles.css": "./dist/styles.css"
14
15
  },
15
16
  "files": ["dist"],
16
17
  "scripts": {
17
- "build": "tsc",
18
+ "build": "tsc && node -e \"fs=require('fs');fs.cpSync('src/styles.css','dist/styles.css')\"",
18
19
  "check-types": "tsc --noEmit"
19
20
  },
20
21
  "publishConfig": {
21
22
  "access": "public"
22
23
  },
23
24
  "dependencies": {
24
- "@editneo/core": "*",
25
+ "@editneo/core": "^0.1.2",
25
26
  "@tanstack/react-virtual": "^3.0.0",
26
27
  "zustand": "^4.5.1"
27
28
  },
@@ -43,8 +44,8 @@
43
44
  "typescript": "^5.3.3",
44
45
  "@types/react": "^18.2.0",
45
46
  "@types/react-dom": "^18.2.0",
46
- "@editneo/sync": "*",
47
- "@editneo/pdf": "*"
47
+ "@editneo/sync": "^0.1.2",
48
+ "@editneo/pdf": "^0.1.2"
48
49
  },
49
50
  "license": "MIT"
50
51
  }