@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.
- package/dist/BlockRenderer.d.ts +2 -0
- package/dist/BlockRenderer.d.ts.map +1 -1
- package/dist/BlockRenderer.js +4 -4
- package/dist/BlockRenderer.js.map +1 -1
- package/dist/EditableBlock.d.ts.map +1 -1
- package/dist/EditableBlock.js +251 -44
- package/dist/EditableBlock.js.map +1 -1
- package/dist/NeoCanvas.d.ts.map +1 -1
- package/dist/NeoCanvas.js +18 -1
- package/dist/NeoCanvas.js.map +1 -1
- package/dist/blocks/ListBlock.d.ts +6 -2
- package/dist/blocks/ListBlock.d.ts.map +1 -1
- package/dist/blocks/ListBlock.js +4 -2
- package/dist/blocks/ListBlock.js.map +1 -1
- package/dist/hooks.d.ts +3 -1
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +22 -2
- package/dist/hooks.js.map +1 -1
- package/dist/styles.css +141 -0
- package/package.json +7 -6
package/dist/BlockRenderer.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/BlockRenderer.js
CHANGED
|
@@ -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;
|
|
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,
|
|
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"}
|
package/dist/EditableBlock.js
CHANGED
|
@@ -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, '&')
|
|
117
|
+
.replace(/</g, '<')
|
|
118
|
+
.replace(/>/g, '>')
|
|
119
|
+
.replace(/"/g, '"');
|
|
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
|
-
|
|
96
|
-
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
/**
|
|
108
|
-
const
|
|
109
|
-
|
|
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)
|
|
304
|
+
// Shift+Enter: let browser insert <br> (soft break)
|
|
128
305
|
}
|
|
129
|
-
else if (e.key === 'Backspace' && (
|
|
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
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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
|
-
|
|
167
|
-
|
|
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
|
-
|
|
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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"}
|
package/dist/NeoCanvas.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NeoCanvas.d.ts","sourceRoot":"","sources":["../src/NeoCanvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,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
|
package/dist/NeoCanvas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NeoCanvas.js","sourceRoot":"","sources":["../src/NeoCanvas.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
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
|
-
|
|
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,
|
|
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"}
|
package/dist/blocks/ListBlock.js
CHANGED
|
@@ -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
|
-
? `${
|
|
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;
|
|
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
|
package/dist/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;+
|
|
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
|
-
|
|
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;
|
|
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"}
|
package/dist/styles.css
ADDED
|
@@ -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.
|
|
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
|
}
|