@doxi/react 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -0
  3. package/dist/DoxivaEditor.d.ts +20 -0
  4. package/dist/DoxivaEditor.d.ts.map +1 -0
  5. package/dist/DoxivaEditor.js +448 -0
  6. package/dist/DoxivaEditor.js.map +1 -0
  7. package/dist/Editor.d.ts +21 -0
  8. package/dist/Editor.d.ts.map +1 -0
  9. package/dist/Editor.js +49 -0
  10. package/dist/Editor.js.map +1 -0
  11. package/dist/HeaderFooterPopover.d.ts +49 -0
  12. package/dist/HeaderFooterPopover.d.ts.map +1 -0
  13. package/dist/HeaderFooterPopover.js +139 -0
  14. package/dist/HeaderFooterPopover.js.map +1 -0
  15. package/dist/ImagePopover.d.ts +23 -0
  16. package/dist/ImagePopover.d.ts.map +1 -0
  17. package/dist/ImagePopover.js +59 -0
  18. package/dist/ImagePopover.js.map +1 -0
  19. package/dist/LinkPopover.d.ts +25 -0
  20. package/dist/LinkPopover.d.ts.map +1 -0
  21. package/dist/LinkPopover.js +67 -0
  22. package/dist/LinkPopover.js.map +1 -0
  23. package/dist/PageSettingsPopover.d.ts +33 -0
  24. package/dist/PageSettingsPopover.d.ts.map +1 -0
  25. package/dist/PageSettingsPopover.js +48 -0
  26. package/dist/PageSettingsPopover.js.map +1 -0
  27. package/dist/TablePicker.d.ts +27 -0
  28. package/dist/TablePicker.d.ts.map +1 -0
  29. package/dist/TablePicker.js +38 -0
  30. package/dist/TablePicker.js.map +1 -0
  31. package/dist/Toolbar.d.ts +103 -0
  32. package/dist/Toolbar.d.ts.map +1 -0
  33. package/dist/Toolbar.js +161 -0
  34. package/dist/Toolbar.js.map +1 -0
  35. package/dist/index.d.ts +14 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +14 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/toolbar-builders/alignment.d.ts +4 -0
  40. package/dist/toolbar-builders/alignment.d.ts.map +1 -0
  41. package/dist/toolbar-builders/alignment.js +56 -0
  42. package/dist/toolbar-builders/alignment.js.map +1 -0
  43. package/dist/toolbar-builders/blocks.d.ts +4 -0
  44. package/dist/toolbar-builders/blocks.d.ts.map +1 -0
  45. package/dist/toolbar-builders/blocks.js +39 -0
  46. package/dist/toolbar-builders/blocks.js.map +1 -0
  47. package/dist/toolbar-builders/font-size.d.ts +4 -0
  48. package/dist/toolbar-builders/font-size.d.ts.map +1 -0
  49. package/dist/toolbar-builders/font-size.js +41 -0
  50. package/dist/toolbar-builders/font-size.js.map +1 -0
  51. package/dist/toolbar-builders/headings.d.ts +4 -0
  52. package/dist/toolbar-builders/headings.d.ts.map +1 -0
  53. package/dist/toolbar-builders/headings.js +18 -0
  54. package/dist/toolbar-builders/headings.js.map +1 -0
  55. package/dist/toolbar-builders/history.d.ts +3 -0
  56. package/dist/toolbar-builders/history.d.ts.map +1 -0
  57. package/dist/toolbar-builders/history.js +13 -0
  58. package/dist/toolbar-builders/history.js.map +1 -0
  59. package/dist/toolbar-builders/images.d.ts +4 -0
  60. package/dist/toolbar-builders/images.d.ts.map +1 -0
  61. package/dist/toolbar-builders/images.js +8 -0
  62. package/dist/toolbar-builders/images.js.map +1 -0
  63. package/dist/toolbar-builders/line-height.d.ts +4 -0
  64. package/dist/toolbar-builders/line-height.d.ts.map +1 -0
  65. package/dist/toolbar-builders/line-height.js +46 -0
  66. package/dist/toolbar-builders/line-height.js.map +1 -0
  67. package/dist/toolbar-builders/links.d.ts +4 -0
  68. package/dist/toolbar-builders/links.d.ts.map +1 -0
  69. package/dist/toolbar-builders/links.js +19 -0
  70. package/dist/toolbar-builders/links.js.map +1 -0
  71. package/dist/toolbar-builders/lists.d.ts +4 -0
  72. package/dist/toolbar-builders/lists.d.ts.map +1 -0
  73. package/dist/toolbar-builders/lists.js +38 -0
  74. package/dist/toolbar-builders/lists.js.map +1 -0
  75. package/dist/toolbar-builders/marks.d.ts +4 -0
  76. package/dist/toolbar-builders/marks.d.ts.map +1 -0
  77. package/dist/toolbar-builders/marks.js +41 -0
  78. package/dist/toolbar-builders/marks.js.map +1 -0
  79. package/dist/toolbar-builders/system.d.ts +12 -0
  80. package/dist/toolbar-builders/system.d.ts.map +1 -0
  81. package/dist/toolbar-builders/system.js +28 -0
  82. package/dist/toolbar-builders/system.js.map +1 -0
  83. package/dist/toolbar-builders/tables.d.ts +4 -0
  84. package/dist/toolbar-builders/tables.d.ts.map +1 -0
  85. package/dist/toolbar-builders/tables.js +235 -0
  86. package/dist/toolbar-builders/tables.js.map +1 -0
  87. package/dist/toolbar-builders/typography.d.ts +4 -0
  88. package/dist/toolbar-builders/typography.d.ts.map +1 -0
  89. package/dist/toolbar-builders/typography.js +123 -0
  90. package/dist/toolbar-builders/typography.js.map +1 -0
  91. package/dist/types.d.ts +85 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +28 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/useDoxivaEditor.d.ts +10 -0
  96. package/dist/useDoxivaEditor.d.ts.map +1 -0
  97. package/dist/useDoxivaEditor.js +30 -0
  98. package/dist/useDoxivaEditor.js.map +1 -0
  99. package/package.json +48 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mahbub Hasan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # @doxi/react
2
+
3
+ React adapter for [`@doxi/core`](../core). Ships a thin `<Editor>` wrapper around the underlying `EditorView`, plus a `useDoxivaEditor` hook for imperative access.
4
+
5
+ > **Status:** v0.10.x preview. Public API may evolve until v1.0.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ pnpm add @doxi/react @doxi/core react react-dom
11
+ ```
12
+
13
+ Peer-deps: `react` ≥ 18 (works under 19), `@doxi/core`. Zero runtime deps beyond the peers.
14
+
15
+ ## Quickstart
16
+
17
+ ```tsx
18
+ import { Editor, useDoxivaEditor } from '@doxi/react'
19
+ import { defaultRenderer, defaultSchema, historyPlugin } from '@doxi/core'
20
+ import '@doxi/core/styles/base.css'
21
+ import '@doxi/core/styles/light.css'
22
+
23
+ export function App() {
24
+ const editor = useDoxivaEditor({
25
+ schema: defaultSchema,
26
+ plugins: [historyPlugin().plugin],
27
+ })
28
+
29
+ return (
30
+ <Editor
31
+ editor={editor}
32
+ renderer={defaultRenderer}
33
+ ariaLabel="Document editor"
34
+ />
35
+ )
36
+ }
37
+ ```
38
+
39
+ ## Imperative access
40
+
41
+ `useDoxivaEditor` returns a handle exposing the live `EditorView`:
42
+
43
+ ```tsx
44
+ const editor = useDoxivaEditor({ schema: defaultSchema })
45
+ // editor.view → underlying @doxi/core EditorView
46
+ // editor.dispatch(tr) → dispatch a transaction
47
+ // editor.replaceState(newState) → swap the whole state (e.g. after DOCX import)
48
+ ```
49
+
50
+ ## Toolbar
51
+
52
+ `@doxi/react` ships a default toolbar; consumers can compose their own from the per-group builders (`buildHistory`, `buildHeadings`, `buildLists`, `buildMarks`, `buildLinks`, `buildAlignment`, `buildBlocks`, …). See the [example app](../example-react) for a full reference setup.
53
+
54
+ ## Accessibility
55
+
56
+ `<Editor>` exposes an `ariaLabel` prop (default `"Document editor"`) applied to the contenteditable surface alongside `role="textbox"` and `aria-multiline="true"`. Localize for non-English UIs.
57
+
58
+ ## License
59
+
60
+ [MIT](LICENSE)
@@ -0,0 +1,20 @@
1
+ import { type EditorView } from '@doxi/core';
2
+ import { type DoxivaEditorProps } from './types.js';
3
+ /**
4
+ * Imperative handle exposed via `ref` for hosts that need to reach the
5
+ * underlying EditorView (e.g., to wire dev-only debug helpers in example
6
+ * apps). The shape is intentionally minimal in v0.11 — a stable API ships
7
+ * in v0.12.
8
+ */
9
+ export interface DoxivaEditorHandle {
10
+ readonly view: EditorView | null;
11
+ }
12
+ /**
13
+ * The bundled Doxiva editor — a single React component that internally
14
+ * orchestrates the toolbar, popovers, keymap, print bridge, DOCX import/
15
+ * export, and page chrome. Hosts pass `features` to disable parts of the UX
16
+ * and `theme` to switch palettes. The low-level `<Editor>`, `<Toolbar>`,
17
+ * `useDoxivaEditor` primitives remain exported for power users.
18
+ */
19
+ export declare const DoxivaEditor: import("react").ForwardRefExoticComponent<DoxivaEditorProps & import("react").RefAttributes<DoxivaEditorHandle>>;
20
+ //# sourceMappingURL=DoxivaEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DoxivaEditor.d.ts","sourceRoot":"","sources":["../src/DoxivaEditor.tsx"],"names":[],"mappings":"AAAA,OAAO,EAaL,KAAK,UAAU,EAEhB,MAAM,YAAY,CAAA;AA4BnB,OAAO,EAEL,KAAK,iBAAiB,EAGvB,MAAM,YAAY,CAAA;AAqCnB;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;CACjC;AA8ED;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,kHA6bvB,CAED"}
@@ -0,0 +1,448 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { defaultKeymapBindings, defaultRenderer, defaultSchema, EditorState, historyPlugin, insertPageBreak, installClipboardHandlers, installInputPipeline, keymap, printDocument, TextSelection, } from '@doxi/core';
3
+ import { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState, forwardRef, } from 'react';
4
+ import { Editor } from './Editor.js';
5
+ import { useDoxivaEditor } from './useDoxivaEditor.js';
6
+ import { Toolbar, defaultToolbarActions, TOOLBAR_SEPARATOR, } from './Toolbar.js';
7
+ import { LinkPopover } from './LinkPopover.js';
8
+ import { TablePicker } from './TablePicker.js';
9
+ import { ImagePopover } from './ImagePopover.js';
10
+ import { HeaderFooterPopover } from './HeaderFooterPopover.js';
11
+ import { PageSettingsPopover } from './PageSettingsPopover.js';
12
+ import { DEFAULT_FEATURES, } from './types.js';
13
+ /**
14
+ * Pixel dimensions for the page-size presets. Letter / A4 mirror the values
15
+ * the @doxi/core layout engine uses for its built-in named sizes.
16
+ */
17
+ const SIZE_PX = {
18
+ letter: { w: 816, h: 1056 },
19
+ a4: { w: 794, h: 1123 },
20
+ legal: { w: 816, h: 1344 },
21
+ a5: { w: 559, h: 794 },
22
+ };
23
+ const MARGIN_PX = { normal: 96, narrow: 48, wide: 144 };
24
+ const DEFAULT_PAGE_CHROME = {
25
+ headerEnabled: true,
26
+ footerEnabled: true,
27
+ headerHeightPx: 24,
28
+ footerHeightPx: 24,
29
+ };
30
+ // Inline SVG markup, drawn inside the toolbar's shared 24×24 viewBox.
31
+ const ICON_NEW_PAGE = '<rect x="4" y="3" width="13" height="18" rx="2" />' +
32
+ '<path d="M7 10h7M7 14h7M7 18h4" />' +
33
+ '<circle cx="19" cy="6" r="3" />' +
34
+ '<path d="M19 4.5v3M17.5 6h3" />';
35
+ const ICON_HEADER_FOOTER = '<rect x="4" y="3" width="16" height="18" rx="2" />' +
36
+ '<path d="M4 7h16M4 17h16" />' +
37
+ '<path d="M8 11h8M8 14h6" />';
38
+ const ICON_PAGE_SETTINGS = '<rect x="4" y="3" width="13" height="18" rx="2" />' +
39
+ '<path d="M7 8h7M7 12h7M7 16h4" />' +
40
+ '<circle cx="19" cy="19" r="2.2" />';
41
+ /**
42
+ * Filter the default toolbar actions by feature flags. Removes-only — never
43
+ * reorders. After filtering, consecutive `separator` items (and leading /
44
+ * trailing separators) are collapsed so a removed group doesn't leave a
45
+ * double divider.
46
+ */
47
+ function filterByFeatures(actions, features) {
48
+ const kept = actions.filter((item) => {
49
+ const t = item.type;
50
+ if (t === 'separator')
51
+ return true;
52
+ if (t === 'select') {
53
+ const id = item.id;
54
+ if (id === 'font-size')
55
+ return features.fontSize;
56
+ if (id === 'font-family')
57
+ return features.fontFamily;
58
+ return true;
59
+ }
60
+ if (t === 'palette') {
61
+ const id = item.id;
62
+ if (id === 'color')
63
+ return features.color;
64
+ if (id === 'cell-bg')
65
+ return features.tables;
66
+ return true;
67
+ }
68
+ if (t === 'popover') {
69
+ const id = item.id;
70
+ if (id === 'link')
71
+ return features.links;
72
+ if (id === 'table')
73
+ return features.tables;
74
+ if (id === 'image')
75
+ return features.images;
76
+ return true;
77
+ }
78
+ const id = item.id;
79
+ if (id === 'undo' || id === 'redo')
80
+ return features.history;
81
+ if (id === 'body' || id === 'h1' || id === 'h2' || id === 'h3')
82
+ return features.headings;
83
+ if (id === 'bold' || id === 'italic' || id === 'underline')
84
+ return features.marks;
85
+ if (id === 'align-left' ||
86
+ id === 'align-center' ||
87
+ id === 'align-right' ||
88
+ id === 'align-justify')
89
+ return features.alignment;
90
+ if (id === 'line-1' || id === 'line-1-5' || id === 'line-2')
91
+ return features.lineHeight;
92
+ if (id === 'list-bullet' || id === 'list-numbered')
93
+ return features.lists;
94
+ if (id === 'blockquote' || id === 'hr')
95
+ return features.blocks;
96
+ if (id === 'table-header-row')
97
+ return features.tables;
98
+ if (id === 'print')
99
+ return features.print;
100
+ return true;
101
+ });
102
+ return dedupeSeparators(kept);
103
+ }
104
+ function dedupeSeparators(items) {
105
+ const out = [];
106
+ for (const item of items) {
107
+ const isSep = item.type === 'separator';
108
+ if (isSep) {
109
+ // Skip leading and consecutive separators.
110
+ if (out.length === 0)
111
+ continue;
112
+ const prev = out[out.length - 1];
113
+ if (prev.type === 'separator')
114
+ continue;
115
+ }
116
+ out.push(item);
117
+ }
118
+ // Strip trailing separators.
119
+ while (out.length > 0 && out[out.length - 1].type === 'separator') {
120
+ out.pop();
121
+ }
122
+ return out;
123
+ }
124
+ function buildDefaultDoc() {
125
+ return defaultSchema.node('doc', null, [defaultSchema.node('paragraph', null)]);
126
+ }
127
+ /**
128
+ * The bundled Doxiva editor — a single React component that internally
129
+ * orchestrates the toolbar, popovers, keymap, print bridge, DOCX import/
130
+ * export, and page chrome. Hosts pass `features` to disable parts of the UX
131
+ * and `theme` to switch palettes. The low-level `<Editor>`, `<Toolbar>`,
132
+ * `useDoxivaEditor` primitives remain exported for power users.
133
+ */
134
+ export const DoxivaEditor = forwardRef(function DoxivaEditor(props, ref) {
135
+ const features = useMemo(() => ({ ...DEFAULT_FEATURES, ...(props.features ?? {}) }), [props.features]);
136
+ const theme = props.theme ?? 'light';
137
+ const paginated = props.paginated !== false;
138
+ // Initial doc only ever read once — like the example app, subsequent
139
+ // changes to `initialDoc` are ignored (the editor's state is mutated via
140
+ // dispatch). Track G of v0.8 added `replaceState` for wholesale swaps.
141
+ const initialDoc = useMemo(() => props.initialDoc ?? buildDefaultDoc(),
142
+ // eslint-disable-next-line react-hooks/exhaustive-deps
143
+ []);
144
+ const history = useMemo(() => historyPlugin(), []);
145
+ const editor = useDoxivaEditor({
146
+ schema: defaultSchema,
147
+ plugins: [history.plugin],
148
+ doc: initialDoc,
149
+ selection: new TextSelection(1, 1),
150
+ });
151
+ // Page settings + remount key (changing the page config requires a full
152
+ // EditorView remount — the layout engine reads `paginated` at mount).
153
+ const [pageSettings, setPageSettings] = useState({
154
+ size: props.defaultPageSize ?? 'letter',
155
+ orientation: 'portrait',
156
+ margins: 'normal',
157
+ });
158
+ const [editorKey, setEditorKey] = useState(0);
159
+ const paginatedConfig = useMemo(() => {
160
+ if (!paginated)
161
+ return undefined;
162
+ const base = SIZE_PX[pageSettings.size];
163
+ const { w, h } = pageSettings.orientation === 'landscape' ? { w: base.h, h: base.w } : base;
164
+ const m = MARGIN_PX[pageSettings.margins];
165
+ return {
166
+ size: { widthPx: w, heightPx: h },
167
+ margins: { topPx: m, rightPx: m, bottomPx: m, leftPx: m },
168
+ };
169
+ }, [paginated, pageSettings]);
170
+ const updatePageSettings = useCallback((next) => {
171
+ setPageSettings(next);
172
+ setEditorKey((k) => k + 1);
173
+ }, []);
174
+ // Header/footer chrome — pure CSS, not part of the doc.
175
+ const [chrome, setChrome] = useState(DEFAULT_PAGE_CHROME);
176
+ // Import warnings (rendered in the default panel unless onImportWarnings
177
+ // is explicitly `null`).
178
+ const [importWarnings, setImportWarnings] = useState([]);
179
+ // EditorView reference — set by onMount and consumed by export / print /
180
+ // keymap callbacks. `viewVersion` bumps so disabled-state of the top-row
181
+ // buttons re-renders after mount/unmount.
182
+ const viewRef = useRef(null);
183
+ const [viewVersion, setViewVersion] = useState(0);
184
+ useImperativeHandle(ref, () => ({ get view() { return viewRef.current; } }), []);
185
+ // Build the toolbar action list — feature-filtered + tail items added.
186
+ const actions = useMemo(() => {
187
+ const filtered = filterByFeatures(defaultToolbarActions(defaultSchema, features.history ? history : undefined), features);
188
+ const tail = [];
189
+ if (features.newPage) {
190
+ tail.push({
191
+ id: 'new-page',
192
+ label: 'Add new page (Ctrl+Enter)',
193
+ icon: ICON_NEW_PAGE,
194
+ command: (state, dispatch) => {
195
+ const pbType = state.schema.nodes.page_break;
196
+ if (!pbType)
197
+ return false;
198
+ return insertPageBreak(pbType)(state, dispatch);
199
+ },
200
+ });
201
+ }
202
+ if (features.headerFooter) {
203
+ tail.push({
204
+ type: 'popover',
205
+ id: 'headerFooter',
206
+ label: 'Header and footer',
207
+ icon: ICON_HEADER_FOOTER,
208
+ });
209
+ }
210
+ if (features.pageSettings) {
211
+ tail.push({
212
+ type: 'popover',
213
+ id: 'pageSettings',
214
+ label: 'Page settings',
215
+ icon: ICON_PAGE_SETTINGS,
216
+ });
217
+ }
218
+ if (tail.length === 0)
219
+ return filtered;
220
+ return dedupeSeparators([...filtered, TOOLBAR_SEPARATOR, ...tail]);
221
+ }, [features, history]);
222
+ // Build the popover map. The headerFooter / pageSettings entries close
223
+ // over the bundled component's state so the popovers can read/write the
224
+ // current chrome and page-settings values via simple prop callbacks.
225
+ const popovers = useMemo(() => {
226
+ const map = {};
227
+ if (features.links)
228
+ map.link = LinkPopover;
229
+ if (features.tables)
230
+ map.table = TablePicker;
231
+ if (features.images)
232
+ map.image = ImagePopover;
233
+ if (features.headerFooter) {
234
+ const HF = (popProps) => (_jsx(HeaderFooterPopover, { state: popProps.state, dispatch: popProps.dispatch, close: popProps.close, chrome: chrome, onChromeChange: setChrome }));
235
+ HF.displayName = 'BundledHeaderFooterPopover';
236
+ map.headerFooter = HF;
237
+ }
238
+ if (features.pageSettings) {
239
+ const PS = (popProps) => (_jsx(PageSettingsPopover, { state: popProps.state, dispatch: popProps.dispatch, close: popProps.close, current: pageSettings, onChange: updatePageSettings }));
240
+ PS.displayName = 'BundledPageSettingsPopover';
241
+ map.pageSettings = PS;
242
+ }
243
+ return map;
244
+ }, [features, chrome, pageSettings, updatePageSettings]);
245
+ // Keymap handler. Rebuilt when the feature set or history handle changes.
246
+ const handler = useMemo(() => keymap({
247
+ ...defaultKeymapBindings(defaultSchema),
248
+ ...(features.history
249
+ ? {
250
+ 'Mod-z': history.commands.undo,
251
+ 'Mod-Shift-z': history.commands.redo,
252
+ 'Mod-y': history.commands.redo,
253
+ }
254
+ : {}),
255
+ ...(features.links
256
+ ? {
257
+ 'Mod-k': () => {
258
+ if (typeof document === 'undefined')
259
+ return false;
260
+ const btn = document.querySelector('[data-testid="btn-link"]');
261
+ if (!btn)
262
+ return false;
263
+ btn.click();
264
+ return true;
265
+ },
266
+ }
267
+ : {}),
268
+ ...(features.newPage
269
+ ? {
270
+ 'Mod-Enter': (state, dispatch) => {
271
+ const pbType = state.schema.nodes.page_break;
272
+ if (!pbType)
273
+ return false;
274
+ return insertPageBreak(pbType)(state, dispatch);
275
+ },
276
+ }
277
+ : {}),
278
+ ...(features.print
279
+ ? {
280
+ 'Mod-p': () => {
281
+ const v = viewRef.current;
282
+ if (!v)
283
+ return false;
284
+ void printDocument(v);
285
+ return true;
286
+ },
287
+ }
288
+ : {}),
289
+ }), [features, history]);
290
+ const onMount = useCallback((view) => {
291
+ viewRef.current = view;
292
+ setViewVersion((v) => v + 1);
293
+ const uninstallInput = installInputPipeline(view, {
294
+ keymap: (event, state, dispatch) => handler(event, state, dispatch),
295
+ });
296
+ const uninstallClipboard = installClipboardHandlers(view);
297
+ const onPrint = () => {
298
+ const v = viewRef.current;
299
+ if (v)
300
+ void printDocument(v);
301
+ };
302
+ if (typeof document !== 'undefined') {
303
+ document.addEventListener('doxiva:print', onPrint);
304
+ }
305
+ return () => {
306
+ if (typeof document !== 'undefined') {
307
+ document.removeEventListener('doxiva:print', onPrint);
308
+ }
309
+ uninstallInput();
310
+ uninstallClipboard();
311
+ viewRef.current = null;
312
+ setViewVersion((v) => v + 1);
313
+ };
314
+ }, [handler]);
315
+ // Fire host change callbacks. We skip the first render so the host doesn't
316
+ // see an initial spurious notification — the doc/state at mount time was
317
+ // supplied BY the host (initialDoc), so re-emitting it is noise.
318
+ const onChange = props.onChange;
319
+ const onStateChange = props.onStateChange;
320
+ const firedFirstChange = useRef(false);
321
+ useEffect(() => {
322
+ if (!firedFirstChange.current) {
323
+ firedFirstChange.current = true;
324
+ return;
325
+ }
326
+ if (onChange)
327
+ onChange(editor.state.doc);
328
+ }, [editor.state.doc, onChange]);
329
+ const firedFirstState = useRef(false);
330
+ useEffect(() => {
331
+ if (!firedFirstState.current) {
332
+ firedFirstState.current = true;
333
+ return;
334
+ }
335
+ if (onStateChange)
336
+ onStateChange(editor.state);
337
+ }, [editor.state, onStateChange]);
338
+ // Theme: 'auto' follows prefers-color-scheme + listens for changes.
339
+ const [resolvedTheme, setResolvedTheme] = useState(() => {
340
+ if (theme === 'auto') {
341
+ if (typeof window === 'undefined')
342
+ return 'light';
343
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
344
+ }
345
+ return theme;
346
+ });
347
+ useEffect(() => {
348
+ if (theme !== 'auto') {
349
+ setResolvedTheme(theme);
350
+ return;
351
+ }
352
+ if (typeof window === 'undefined')
353
+ return;
354
+ const mq = window.matchMedia('(prefers-color-scheme: dark)');
355
+ const onChangeMedia = (e) => {
356
+ setResolvedTheme(e.matches ? 'dark' : 'light');
357
+ };
358
+ setResolvedTheme(mq.matches ? 'dark' : 'light');
359
+ mq.addEventListener('change', onChangeMedia);
360
+ return () => mq.removeEventListener('change', onChangeMedia);
361
+ }, [theme]);
362
+ // Top-row button handlers.
363
+ const onPrintClick = useCallback(() => {
364
+ const v = viewRef.current;
365
+ if (v)
366
+ void printDocument(v);
367
+ }, []);
368
+ const onDownloadPdfClick = useCallback(() => {
369
+ const v = viewRef.current;
370
+ if (!v)
371
+ return;
372
+ const prev = typeof document !== 'undefined' ? document.title : '';
373
+ if (typeof document !== 'undefined')
374
+ document.title = 'doxiva-document';
375
+ void printDocument(v).finally(() => {
376
+ if (typeof document !== 'undefined')
377
+ document.title = prev;
378
+ });
379
+ }, []);
380
+ const onExportDocxClick = useCallback(async () => {
381
+ const v = viewRef.current;
382
+ if (!v)
383
+ return;
384
+ const { exportDocx } = await import('@doxi/docx');
385
+ const bytes = exportDocx(v.state.doc);
386
+ const blob = new Blob([bytes], {
387
+ type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
388
+ });
389
+ const url = URL.createObjectURL(blob);
390
+ const a = document.createElement('a');
391
+ a.href = url;
392
+ a.download = 'doxiva-document.docx';
393
+ document.body.appendChild(a);
394
+ a.click();
395
+ document.body.removeChild(a);
396
+ setTimeout(() => URL.revokeObjectURL(url), 1000);
397
+ }, []);
398
+ const fileInputRef = useRef(null);
399
+ const onImportClick = useCallback(() => {
400
+ fileInputRef.current?.click();
401
+ }, []);
402
+ const onImportFile = useCallback(async (e) => {
403
+ const file = e.target.files?.[0];
404
+ e.target.value = '';
405
+ if (!file)
406
+ return;
407
+ const { importDocx } = await import('@doxi/docx');
408
+ const bytes = new Uint8Array(await file.arrayBuffer());
409
+ const { doc, warnings } = await importDocx(bytes);
410
+ setImportWarnings(warnings);
411
+ if (props.onImportWarnings && props.onImportWarnings !== null) {
412
+ props.onImportWarnings(warnings);
413
+ }
414
+ editor.replaceState(EditorState.create({
415
+ schema: defaultSchema,
416
+ doc,
417
+ selection: new TextSelection(1, 1),
418
+ plugins: [history.plugin],
419
+ }));
420
+ }, [editor, history, props.onImportWarnings]);
421
+ const shellClass = 'dx-doxiva-shell ' +
422
+ (resolvedTheme === 'dark' ? 'dx-theme-dark ' : 'dx-theme-light ') +
423
+ (chrome.headerEnabled ? '' : 'no-header ') +
424
+ (chrome.footerEnabled ? '' : 'no-footer ');
425
+ const ariaLabel = props.ariaLabel ?? 'Document editor';
426
+ const showWarningsPanel = importWarnings.length > 0 && props.onImportWarnings !== null;
427
+ const shellStyle = {
428
+ ['--dx-header-height']: `${chrome.headerHeightPx}px`,
429
+ ['--dx-footer-height']: `${chrome.footerHeightPx}px`,
430
+ };
431
+ const showTopRow = features.print ||
432
+ features.downloadPdf ||
433
+ features.exportDocx ||
434
+ features.importDocx;
435
+ const viewReady = viewVersion > 0 && viewRef.current != null;
436
+ return (_jsxs("div", { className: shellClass.trim(), "data-doxiva-version": "0.11.0", "data-testid": "doxiva-shell", style: shellStyle, children: [showTopRow && (_jsxs("div", { className: "dx-doxiva-toprow", "data-testid": "doxiva-toprow", children: [features.print && (_jsx("button", { type: "button", "data-testid": "btn-print-top", onClick: onPrintClick, disabled: !viewReady, children: "Print" })), features.downloadPdf && (_jsx("button", { type: "button", "data-testid": "btn-download-pdf", onClick: onDownloadPdfClick, disabled: !viewReady, children: "Download PDF" })), features.exportDocx && (_jsx("button", { type: "button", "data-testid": "btn-export-docx", onClick: () => { void onExportDocxClick(); }, disabled: !viewReady, children: "Export DOCX" })), features.importDocx && (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", "data-testid": "btn-import-docx", onClick: onImportClick, children: "Import DOCX" }), _jsx("input", { ref: fileInputRef, type: "file", accept: ".docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document", "data-testid": "import-file-input", style: {
437
+ position: 'absolute',
438
+ width: 1,
439
+ height: 1,
440
+ opacity: 0,
441
+ pointerEvents: 'none',
442
+ }, onChange: (e) => { void onImportFile(e); } })] }))] })), _jsx(Toolbar, { editor: editor, actions: actions, popovers: popovers }), _jsx("section", { className: "dx-doxiva-editor-wrap", "data-testid": "editor-wrap", children: _jsx(Editor, { editor: editor, renderer: defaultRenderer, ...(paginatedConfig ? { paginated: paginatedConfig } : {}), editable: props.editable !== false, ariaLabel: ariaLabel, onMount: onMount }, editorKey) }), showWarningsPanel && (_jsxs("div", { className: "dx-doxiva-import-warnings", "data-testid": "import-warnings", children: [_jsxs("strong", { children: [importWarnings.length, " warning", importWarnings.length === 1 ? '' : 's', ":"] }), _jsxs("ul", { children: [importWarnings.slice(0, 5).map((w, i) => {
443
+ const entry = w;
444
+ return (_jsxs("li", { children: [entry.code ?? 'WARNING', ": ", entry.message ?? ''] }, i));
445
+ }), importWarnings.length > 5 && (_jsxs("li", { children: ["\u2026 and ", importWarnings.length - 5, " more"] }))] })] }))] }));
446
+ });
447
+ DoxivaEditor.displayName = 'DoxivaEditor';
448
+ //# sourceMappingURL=DoxivaEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DoxivaEditor.js","sourceRoot":"","sources":["../src/DoxivaEditor.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,WAAW,EACX,aAAa,EACb,eAAe,EACf,wBAAwB,EACxB,oBAAoB,EACpB,MAAM,EACN,aAAa,EACb,aAAa,GAId,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,OAAO,EACP,MAAM,EACN,QAAQ,EACR,UAAU,GAIX,MAAM,OAAO,CAAA;AAEd,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EACL,OAAO,EACP,qBAAqB,EACrB,iBAAiB,GAGlB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAwB,MAAM,0BAA0B,CAAA;AACpF,OAAO,EAAE,mBAAmB,EAAqB,MAAM,0BAA0B,CAAA;AACjF,OAAO,EACL,gBAAgB,GAIjB,MAAM,YAAY,CAAA;AAEnB;;;GAGG;AACH,MAAM,OAAO,GAAqD;IAChE,MAAM,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE;IAC3B,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE;IACvB,KAAK,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE;IAC1B,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;CACvB,CAAA;AAED,MAAM,SAAS,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAW,CAAA;AAEhE,MAAM,mBAAmB,GAAoB;IAC3C,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,IAAI;IACnB,cAAc,EAAE,EAAE;IAClB,cAAc,EAAE,EAAE;CACnB,CAAA;AAED,sEAAsE;AACtE,MAAM,aAAa,GACjB,oDAAoD;IACpD,oCAAoC;IACpC,iCAAiC;IACjC,iCAAiC,CAAA;AACnC,MAAM,kBAAkB,GACtB,oDAAoD;IACpD,8BAA8B;IAC9B,6BAA6B,CAAA;AAC/B,MAAM,kBAAkB,GACtB,oDAAoD;IACpD,mCAAmC;IACnC,oCAAoC,CAAA;AAYtC;;;;;GAKG;AACH,SAAS,gBAAgB,CACvB,OAAmC,EACnC,QAAgC;IAEhC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACnC,MAAM,CAAC,GAAI,IAA0B,CAAC,IAAI,CAAA;QAC1C,IAAI,CAAC,KAAK,WAAW;YAAE,OAAO,IAAI,CAAA;QAClC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;YACnB,MAAM,EAAE,GAAI,IAAuB,CAAC,EAAE,CAAA;YACtC,IAAI,EAAE,KAAK,WAAW;gBAAE,OAAO,QAAQ,CAAC,QAAQ,CAAA;YAChD,IAAI,EAAE,KAAK,aAAa;gBAAE,OAAO,QAAQ,CAAC,UAAU,CAAA;YACpD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,MAAM,EAAE,GAAI,IAAuB,CAAC,EAAE,CAAA;YACtC,IAAI,EAAE,KAAK,OAAO;gBAAE,OAAO,QAAQ,CAAC,KAAK,CAAA;YACzC,IAAI,EAAE,KAAK,SAAS;gBAAE,OAAO,QAAQ,CAAC,MAAM,CAAA;YAC5C,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,MAAM,EAAE,GAAI,IAAuB,CAAC,EAAE,CAAA;YACtC,IAAI,EAAE,KAAK,MAAM;gBAAE,OAAO,QAAQ,CAAC,KAAK,CAAA;YACxC,IAAI,EAAE,KAAK,OAAO;gBAAE,OAAO,QAAQ,CAAC,MAAM,CAAA;YAC1C,IAAI,EAAE,KAAK,OAAO;gBAAE,OAAO,QAAQ,CAAC,MAAM,CAAA;YAC1C,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,EAAE,GAAI,IAAuB,CAAC,EAAE,CAAA;QACtC,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,KAAK,MAAM;YAAE,OAAO,QAAQ,CAAC,OAAO,CAAA;QAC3D,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI;YAAE,OAAO,QAAQ,CAAC,QAAQ,CAAA;QACxF,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,WAAW;YAAE,OAAO,QAAQ,CAAC,KAAK,CAAA;QACjF,IACE,EAAE,KAAK,YAAY;YACnB,EAAE,KAAK,cAAc;YACrB,EAAE,KAAK,aAAa;YACpB,EAAE,KAAK,eAAe;YAEtB,OAAO,QAAQ,CAAC,SAAS,CAAA;QAC3B,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,UAAU,IAAI,EAAE,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC,UAAU,CAAA;QACvF,IAAI,EAAE,KAAK,aAAa,IAAI,EAAE,KAAK,eAAe;YAAE,OAAO,QAAQ,CAAC,KAAK,CAAA;QACzE,IAAI,EAAE,KAAK,YAAY,IAAI,EAAE,KAAK,IAAI;YAAE,OAAO,QAAQ,CAAC,MAAM,CAAA;QAC9D,IAAI,EAAE,KAAK,kBAAkB;YAAE,OAAO,QAAQ,CAAC,MAAM,CAAA;QACrD,IAAI,EAAE,KAAK,OAAO;YAAE,OAAO,QAAQ,CAAC,KAAK,CAAA;QACzC,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAiC;IACzD,MAAM,GAAG,GAAkB,EAAE,CAAA;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAI,IAA0B,CAAC,IAAI,KAAK,WAAW,CAAA;QAC9D,IAAI,KAAK,EAAE,CAAC;YACV,2CAA2C;YAC3C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAQ;YAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAsB,CAAA;YACrD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;gBAAE,SAAQ;QACzC,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChB,CAAC;IACD,6BAA6B;IAC7B,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAK,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAuB,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACzF,GAAG,CAAC,GAAG,EAAE,CAAA;IACX,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;AACjF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,YAAY,CAC1D,KAAwB,EACxB,GAAqC;IAErC,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,gBAAgB,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC,EAC1D,CAAC,KAAK,CAAC,QAAQ,CAAC,CACjB,CAAA;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,CAAA;IACpC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAA;IAE3C,qEAAqE;IACrE,yEAAyE;IACzE,uEAAuE;IACvE,MAAM,UAAU,GAAG,OAAO,CACxB,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,IAAI,eAAe,EAAE;IAC3C,uDAAuD;IACvD,EAAE,CACH,CAAA;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,EAAE,EAAE,CAAC,CAAA;IAClD,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QACzB,GAAG,EAAE,UAAU;QACf,SAAS,EAAE,IAAI,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;KACnC,CAAC,CAAA;IAEF,wEAAwE;IACxE,sEAAsE;IACtE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAe;QAC7D,IAAI,EAAE,KAAK,CAAC,eAAe,IAAI,QAAQ;QACvC,WAAW,EAAE,UAAU;QACvB,OAAO,EAAE,QAAQ;KAClB,CAAC,CAAA;IACF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC7C,MAAM,eAAe,GAAG,OAAO,CAAyB,GAAG,EAAE;QAC3D,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS,CAAA;QAChC,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GACZ,YAAY,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QAC5E,MAAM,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;QACzC,OAAO;YACL,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE;YACjC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SAC1D,CAAA;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAA;IAC7B,MAAM,kBAAkB,GAAG,WAAW,CAAC,CAAC,IAAkB,EAAE,EAAE;QAC5D,eAAe,CAAC,IAAI,CAAC,CAAA;QACrB,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAC5B,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,wDAAwD;IACxD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAkB,mBAAmB,CAAC,CAAA;IAE1E,yEAAyE;IACzE,yBAAyB;IACzB,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAyB,EAAE,CAAC,CAAA;IAEhF,yEAAyE;IACzE,yEAAyE;IACzE,0CAA0C;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAA;IAC/C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAEjD,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,KAAK,OAAO,OAAO,CAAC,OAAO,CAAA,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAE/E,uEAAuE;IACvE,MAAM,OAAO,GAAG,OAAO,CAA6B,GAAG,EAAE;QACvD,MAAM,QAAQ,GAAG,gBAAgB,CAC/B,qBAAqB,CAAC,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAC5E,QAAQ,CACT,CAAA;QACD,MAAM,IAAI,GAAkB,EAAE,CAAA;QAC9B,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC;gBACR,EAAE,EAAE,UAAU;gBACd,KAAK,EAAE,2BAA2B;gBAClC,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;oBAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAA;oBAC5C,IAAI,CAAC,MAAM;wBAAE,OAAO,KAAK,CAAA;oBACzB,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;gBACjD,CAAC;aACF,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,SAAS;gBACf,EAAE,EAAE,cAAc;gBAClB,KAAK,EAAE,mBAAmB;gBAC1B,IAAI,EAAE,kBAAkB;aACzB,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,SAAS;gBACf,EAAE,EAAE,cAAc;gBAClB,KAAK,EAAE,eAAe;gBACtB,IAAI,EAAE,kBAAkB;aACzB,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAA;QACtC,OAAO,gBAAgB,CAAC,CAAC,GAAG,QAAQ,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;IACpE,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;IAEvB,uEAAuE;IACvE,wEAAwE;IACxE,qEAAqE;IACrE,MAAM,QAAQ,GAAG,OAAO,CAAmC,GAAG,EAAE;QAC9D,MAAM,GAAG,GAAqC,EAAE,CAAA;QAChD,IAAI,QAAQ,CAAC,KAAK;YAAE,GAAG,CAAC,IAAI,GAAG,WAAW,CAAA;QAC1C,IAAI,QAAQ,CAAC,MAAM;YAAE,GAAG,CAAC,KAAK,GAAG,WAAW,CAAA;QAC5C,IAAI,QAAQ,CAAC,MAAM;YAAE,GAAG,CAAC,KAAK,GAAG,YAAY,CAAA;QAC7C,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAqB,CAAC,QAAQ,EAAE,EAAE,CAAC,CACzC,KAAC,mBAAmB,IAClB,KAAK,EAAE,QAAQ,CAAC,KAAK,EACrB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK,EACrB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,SAAS,GACzB,CACH,CAAA;YACD,EAAE,CAAC,WAAW,GAAG,4BAA4B,CAAA;YAC7C,GAAG,CAAC,YAAY,GAAG,EAAE,CAAA;QACvB,CAAC;QACD,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAqB,CAAC,QAAQ,EAAE,EAAE,CAAC,CACzC,KAAC,mBAAmB,IAClB,KAAK,EAAE,QAAQ,CAAC,KAAK,EACrB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK,EACrB,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,kBAAkB,GAC5B,CACH,CAAA;YACD,EAAE,CAAC,WAAW,GAAG,4BAA4B,CAAA;YAC7C,GAAG,CAAC,YAAY,GAAG,EAAE,CAAA;QACvB,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAExD,0EAA0E;IAC1E,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CACH,MAAM,CAAC;QACL,GAAG,qBAAqB,CAAC,aAAa,CAAC;QACvC,GAAG,CAAC,QAAQ,CAAC,OAAO;YAClB,CAAC,CAAC;gBACE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAC9B,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;gBACpC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;aAC/B;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,QAAQ,CAAC,KAAK;YAChB,CAAC,CAAC;gBACE,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,OAAO,QAAQ,KAAK,WAAW;wBAAE,OAAO,KAAK,CAAA;oBACjD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAoB,0BAA0B,CAAC,CAAA;oBACjF,IAAI,CAAC,GAAG;wBAAE,OAAO,KAAK,CAAA;oBACtB,GAAG,CAAC,KAAK,EAAE,CAAA;oBACX,OAAO,IAAI,CAAA;gBACb,CAAC;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,QAAQ,CAAC,OAAO;YAClB,CAAC,CAAC;gBACE,WAAW,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;oBAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAA;oBAC5C,IAAI,CAAC,MAAM;wBAAE,OAAO,KAAK,CAAA;oBACzB,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;gBACjD,CAAC;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,QAAQ,CAAC,KAAK;YAChB,CAAC,CAAC;gBACE,OAAO,EAAE,GAAG,EAAE;oBACZ,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAA;oBACzB,IAAI,CAAC,CAAC;wBAAE,OAAO,KAAK,CAAA;oBACpB,KAAK,aAAa,CAAC,CAAC,CAAC,CAAA;oBACrB,OAAO,IAAI,CAAA;gBACb,CAAC;aACF;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,EACJ,CAAC,QAAQ,EAAE,OAAO,CAAC,CACpB,CAAA;IAED,MAAM,OAAO,GAAG,WAAW,CACzB,CAAC,IAAgB,EAAE,EAAE;QACnB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAA;QACtB,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAC5B,MAAM,cAAc,GAAG,oBAAoB,CAAC,IAAI,EAAE;YAChD,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC;SACpE,CAAC,CAAA;QACF,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAA;QACzD,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAA;YACzB,IAAI,CAAC;gBAAE,KAAK,aAAa,CAAC,CAAC,CAAC,CAAA;QAC9B,CAAC,CAAA;QACD,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;YACpC,QAAQ,CAAC,gBAAgB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;QACpD,CAAC;QACD,OAAO,GAAG,EAAE;YACV,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;gBACpC,QAAQ,CAAC,mBAAmB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;YACvD,CAAC;YACD,cAAc,EAAE,CAAA;YAChB,kBAAkB,EAAE,CAAA;YACpB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAA;YACtB,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAC9B,CAAC,CAAA;IACH,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAA;IAED,2EAA2E;IAC3E,yEAAyE;IACzE,iEAAiE;IACjE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAA;IAC/B,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAA;IACzC,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACtC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;YAC9B,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAA;YAC/B,OAAM;QACR,CAAC;QACD,IAAI,QAAQ;YAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC1C,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAA;IAChC,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACrC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;YAC7B,eAAe,CAAC,OAAO,GAAG,IAAI,CAAA;YAC9B,OAAM;QACR,CAAC;QACD,IAAI,aAAa;YAAE,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAChD,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAA;IAEjC,oEAAoE;IACpE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAmB,GAAG,EAAE;QACxE,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,IAAI,OAAO,MAAM,KAAK,WAAW;gBAAE,OAAO,OAAO,CAAA;YACjD,OAAO,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;QACrF,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;IACF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,gBAAgB,CAAC,KAAK,CAAC,CAAA;YACvB,OAAM;QACR,CAAC;QACD,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAM;QACzC,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAA;QAC5D,MAAM,aAAa,GAAG,CAAC,CAAsB,EAAQ,EAAE;YACrD,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QAChD,CAAC,CAAA;QACD,gBAAgB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QAC/C,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;QAC5C,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;IAC9D,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEX,2BAA2B;IAC3B,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAA;QACzB,IAAI,CAAC;YAAE,KAAK,aAAa,CAAC,CAAC,CAAC,CAAA;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAA;IACN,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1C,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAA;QACzB,IAAI,CAAC,CAAC;YAAE,OAAM;QACd,MAAM,IAAI,GAAG,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QAClE,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,QAAQ,CAAC,KAAK,GAAG,iBAAiB,CAAA;QACvE,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACjC,IAAI,OAAO,QAAQ,KAAK,WAAW;gBAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAA;QAC5D,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,iBAAiB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC/C,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAA;QACzB,IAAI,CAAC,CAAC;YAAE,OAAM;QACd,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;QACjD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACrC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,KAA+B,CAAC,EAAE;YACvD,IAAI,EAAE,yEAAyE;SAChF,CAAC,CAAA;QACF,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;QACrC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAA;QACZ,CAAC,CAAC,QAAQ,GAAG,sBAAsB,CAAA;QACnC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;QAC5B,CAAC,CAAC,KAAK,EAAE,CAAA;QACT,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;QAC5B,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;IAClD,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,YAAY,GAAG,MAAM,CAA0B,IAAI,CAAC,CAAA;IAC1D,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;QACrC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,CAAA;IAC/B,CAAC,EAAE,EAAE,CAAC,CAAA;IACN,MAAM,YAAY,GAAG,WAAW,CAC9B,KAAK,EAAE,CAAgC,EAAE,EAAE;QACzC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;QAChC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAA;QACnB,IAAI,CAAC,IAAI;YAAE,OAAM;QACjB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;QACjD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QACtD,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAA;QACjD,iBAAiB,CAAC,QAAQ,CAAC,CAAA;QAC3B,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;YAC9D,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QAClC,CAAC;QACD,MAAM,CAAC,YAAY,CACjB,WAAW,CAAC,MAAM,CAAC;YACjB,MAAM,EAAE,aAAa;YACrB,GAAG;YACH,SAAS,EAAE,IAAI,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;YAClC,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;SAC1B,CAAC,CACH,CAAA;IACH,CAAC,EACD,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAC1C,CAAA;IAED,MAAM,UAAU,GACd,kBAAkB;QAClB,CAAC,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAC;QACjE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;QAC1C,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;IAE5C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,iBAAiB,CAAA;IACtD,MAAM,iBAAiB,GACrB,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,gBAAgB,KAAK,IAAI,CAAA;IAE9D,MAAM,UAAU,GAAkB;QAChC,CAAC,oBAA8B,CAAC,EAAE,GAAG,MAAM,CAAC,cAAc,IAAI;QAC9D,CAAC,oBAA8B,CAAC,EAAE,GAAG,MAAM,CAAC,cAAc,IAAI;KAC9C,CAAA;IAElB,MAAM,UAAU,GACd,QAAQ,CAAC,KAAK;QACd,QAAQ,CAAC,WAAW;QACpB,QAAQ,CAAC,UAAU;QACnB,QAAQ,CAAC,UAAU,CAAA;IACrB,MAAM,SAAS,GAAG,WAAW,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI,CAAA;IAE5D,OAAO,CACL,eACE,SAAS,EAAE,UAAU,CAAC,IAAI,EAAE,yBACR,QAAQ,iBAChB,cAAc,EAC1B,KAAK,EAAE,UAAU,aAEhB,UAAU,IAAI,CACb,eAAK,SAAS,EAAC,kBAAkB,iBAAa,eAAe,aAC1D,QAAQ,CAAC,KAAK,IAAI,CACjB,iBACE,IAAI,EAAC,QAAQ,iBACD,eAAe,EAC3B,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,CAAC,SAAS,sBAGb,CACV,EACA,QAAQ,CAAC,WAAW,IAAI,CACvB,iBACE,IAAI,EAAC,QAAQ,iBACD,kBAAkB,EAC9B,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,CAAC,SAAS,6BAGb,CACV,EACA,QAAQ,CAAC,UAAU,IAAI,CACtB,iBACE,IAAI,EAAC,QAAQ,iBACD,iBAAiB,EAC7B,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,iBAAiB,EAAE,CAAA,CAAC,CAAC,EAC3C,QAAQ,EAAE,CAAC,SAAS,4BAGb,CACV,EACA,QAAQ,CAAC,UAAU,IAAI,CACtB,8BACE,iBACE,IAAI,EAAC,QAAQ,iBACD,iBAAiB,EAC7B,OAAO,EAAE,aAAa,4BAGf,EACT,gBACE,GAAG,EAAE,YAAY,EACjB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,+EAA+E,iBAC1E,mBAAmB,EAC/B,KAAK,EAAE;oCACL,QAAQ,EAAE,UAAU;oCACpB,KAAK,EAAE,CAAC;oCACR,MAAM,EAAE,CAAC;oCACT,OAAO,EAAE,CAAC;oCACV,aAAa,EAAE,MAAM;iCACtB,EACD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,GACzC,IACD,CACJ,IACG,CACP,EACD,KAAC,OAAO,IAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAI,EACjE,kBAAS,SAAS,EAAC,uBAAuB,iBAAa,aAAa,YAClE,KAAC,MAAM,IAEL,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,KACrB,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAC3D,QAAQ,EAAE,KAAK,CAAC,QAAQ,KAAK,KAAK,EAClC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,IANX,SAAS,CAOd,GACM,EACT,iBAAiB,IAAI,CACpB,eAAK,SAAS,EAAC,2BAA2B,iBAAa,iBAAiB,aACtE,6BACG,cAAc,CAAC,MAAM,cAAU,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAC/D,EACT,yBACG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gCACvC,MAAM,KAAK,GAAG,CAAwC,CAAA;gCACtD,OAAO,CACL,yBACG,KAAK,CAAC,IAAI,IAAI,SAAS,QAAI,KAAK,CAAC,OAAO,IAAI,EAAE,KADxC,CAAC,CAEL,CACN,CAAA;4BACH,CAAC,CAAC,EACD,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,CAC5B,wCAAW,cAAc,CAAC,MAAM,GAAG,CAAC,aAAW,CAChD,IACE,IACD,CACP,IACG,CACP,CAAA;AACH,CAAC,CAAC,CAED;AAAC,YAAyC,CAAC,WAAW,GAAG,cAAc,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { EditorView, type PageConfig, type Renderer } from '@doxi/core';
2
+ import type { EditorHandle } from './types.js';
3
+ export interface EditorProps {
4
+ readonly editor: EditorHandle;
5
+ readonly renderer: Renderer;
6
+ readonly editable?: boolean;
7
+ readonly paginated?: PageConfig;
8
+ /**
9
+ * Accessible name applied to the editor's contenteditable surface as
10
+ * `aria-label`. Defaults to "Document editor".
11
+ */
12
+ readonly ariaLabel?: string;
13
+ /**
14
+ * Called once the EditorView is mounted. May return a cleanup function
15
+ * (called on unmount). Use this to install the input pipeline, clipboard
16
+ * handlers, mutation observer, etc.
17
+ */
18
+ readonly onMount?: (view: EditorView) => void | (() => void);
19
+ }
20
+ export declare function Editor(props: EditorProps): JSX.Element;
21
+ //# sourceMappingURL=Editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Editor.d.ts","sourceRoot":"","sources":["../src/Editor.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AAEvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,UAAU,CAAA;IAC/B;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAA;CAC7D;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,CAAC,OAAO,CA4CtD"}