@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.
- package/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/DoxivaEditor.d.ts +20 -0
- package/dist/DoxivaEditor.d.ts.map +1 -0
- package/dist/DoxivaEditor.js +448 -0
- package/dist/DoxivaEditor.js.map +1 -0
- package/dist/Editor.d.ts +21 -0
- package/dist/Editor.d.ts.map +1 -0
- package/dist/Editor.js +49 -0
- package/dist/Editor.js.map +1 -0
- package/dist/HeaderFooterPopover.d.ts +49 -0
- package/dist/HeaderFooterPopover.d.ts.map +1 -0
- package/dist/HeaderFooterPopover.js +139 -0
- package/dist/HeaderFooterPopover.js.map +1 -0
- package/dist/ImagePopover.d.ts +23 -0
- package/dist/ImagePopover.d.ts.map +1 -0
- package/dist/ImagePopover.js +59 -0
- package/dist/ImagePopover.js.map +1 -0
- package/dist/LinkPopover.d.ts +25 -0
- package/dist/LinkPopover.d.ts.map +1 -0
- package/dist/LinkPopover.js +67 -0
- package/dist/LinkPopover.js.map +1 -0
- package/dist/PageSettingsPopover.d.ts +33 -0
- package/dist/PageSettingsPopover.d.ts.map +1 -0
- package/dist/PageSettingsPopover.js +48 -0
- package/dist/PageSettingsPopover.js.map +1 -0
- package/dist/TablePicker.d.ts +27 -0
- package/dist/TablePicker.d.ts.map +1 -0
- package/dist/TablePicker.js +38 -0
- package/dist/TablePicker.js.map +1 -0
- package/dist/Toolbar.d.ts +103 -0
- package/dist/Toolbar.d.ts.map +1 -0
- package/dist/Toolbar.js +161 -0
- package/dist/Toolbar.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/toolbar-builders/alignment.d.ts +4 -0
- package/dist/toolbar-builders/alignment.d.ts.map +1 -0
- package/dist/toolbar-builders/alignment.js +56 -0
- package/dist/toolbar-builders/alignment.js.map +1 -0
- package/dist/toolbar-builders/blocks.d.ts +4 -0
- package/dist/toolbar-builders/blocks.d.ts.map +1 -0
- package/dist/toolbar-builders/blocks.js +39 -0
- package/dist/toolbar-builders/blocks.js.map +1 -0
- package/dist/toolbar-builders/font-size.d.ts +4 -0
- package/dist/toolbar-builders/font-size.d.ts.map +1 -0
- package/dist/toolbar-builders/font-size.js +41 -0
- package/dist/toolbar-builders/font-size.js.map +1 -0
- package/dist/toolbar-builders/headings.d.ts +4 -0
- package/dist/toolbar-builders/headings.d.ts.map +1 -0
- package/dist/toolbar-builders/headings.js +18 -0
- package/dist/toolbar-builders/headings.js.map +1 -0
- package/dist/toolbar-builders/history.d.ts +3 -0
- package/dist/toolbar-builders/history.d.ts.map +1 -0
- package/dist/toolbar-builders/history.js +13 -0
- package/dist/toolbar-builders/history.js.map +1 -0
- package/dist/toolbar-builders/images.d.ts +4 -0
- package/dist/toolbar-builders/images.d.ts.map +1 -0
- package/dist/toolbar-builders/images.js +8 -0
- package/dist/toolbar-builders/images.js.map +1 -0
- package/dist/toolbar-builders/line-height.d.ts +4 -0
- package/dist/toolbar-builders/line-height.d.ts.map +1 -0
- package/dist/toolbar-builders/line-height.js +46 -0
- package/dist/toolbar-builders/line-height.js.map +1 -0
- package/dist/toolbar-builders/links.d.ts +4 -0
- package/dist/toolbar-builders/links.d.ts.map +1 -0
- package/dist/toolbar-builders/links.js +19 -0
- package/dist/toolbar-builders/links.js.map +1 -0
- package/dist/toolbar-builders/lists.d.ts +4 -0
- package/dist/toolbar-builders/lists.d.ts.map +1 -0
- package/dist/toolbar-builders/lists.js +38 -0
- package/dist/toolbar-builders/lists.js.map +1 -0
- package/dist/toolbar-builders/marks.d.ts +4 -0
- package/dist/toolbar-builders/marks.d.ts.map +1 -0
- package/dist/toolbar-builders/marks.js +41 -0
- package/dist/toolbar-builders/marks.js.map +1 -0
- package/dist/toolbar-builders/system.d.ts +12 -0
- package/dist/toolbar-builders/system.d.ts.map +1 -0
- package/dist/toolbar-builders/system.js +28 -0
- package/dist/toolbar-builders/system.js.map +1 -0
- package/dist/toolbar-builders/tables.d.ts +4 -0
- package/dist/toolbar-builders/tables.d.ts.map +1 -0
- package/dist/toolbar-builders/tables.js +235 -0
- package/dist/toolbar-builders/tables.js.map +1 -0
- package/dist/toolbar-builders/typography.d.ts +4 -0
- package/dist/toolbar-builders/typography.d.ts.map +1 -0
- package/dist/toolbar-builders/typography.js +123 -0
- package/dist/toolbar-builders/typography.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +28 -0
- package/dist/types.js.map +1 -0
- package/dist/useDoxivaEditor.d.ts +10 -0
- package/dist/useDoxivaEditor.d.ts.map +1 -0
- package/dist/useDoxivaEditor.js +30 -0
- package/dist/useDoxivaEditor.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { clearMark, probeMarkAttr, setMark } from '@doxi/core';
|
|
2
|
+
import { TOOLBAR_BLANK_VALUE } from '../Toolbar.js';
|
|
3
|
+
/**
|
|
4
|
+
* Tasteful Google-Docs-flavoured palette. 36 swatches: 9 hues × 4 shades,
|
|
5
|
+
* arranged so the popover renders a 9-wide × 4-tall grid (matches the
|
|
6
|
+
* `repeat(10, 1fr)` template loosely — extra slots wrap cleanly).
|
|
7
|
+
*
|
|
8
|
+
* Empty `value` for white means the renderer applies `color:#ffffff` only on
|
|
9
|
+
* the explicit "white" swatch; clearing back to the document default is done
|
|
10
|
+
* via the dedicated "Default" affordance.
|
|
11
|
+
*/
|
|
12
|
+
const COLOR_SWATCHES = [
|
|
13
|
+
// Row 1 — light/pastel tints
|
|
14
|
+
{ value: '#ffffff', label: 'White', css: '#ffffff' },
|
|
15
|
+
{ value: '#f4cccc', label: 'Light red', css: '#f4cccc' },
|
|
16
|
+
{ value: '#fce5cd', label: 'Light orange', css: '#fce5cd' },
|
|
17
|
+
{ value: '#fff2cc', label: 'Light yellow', css: '#fff2cc' },
|
|
18
|
+
{ value: '#d9ead3', label: 'Light green', css: '#d9ead3' },
|
|
19
|
+
{ value: '#d0e0e3', label: 'Light teal', css: '#d0e0e3' },
|
|
20
|
+
{ value: '#cfe2f3', label: 'Light blue', css: '#cfe2f3' },
|
|
21
|
+
{ value: '#d9d2e9', label: 'Light purple', css: '#d9d2e9' },
|
|
22
|
+
{ value: '#ead1dc', label: 'Light pink', css: '#ead1dc' },
|
|
23
|
+
// Row 2 — mid tones
|
|
24
|
+
{ value: '#cccccc', label: 'Light grey', css: '#cccccc' },
|
|
25
|
+
{ value: '#ea9999', label: 'Soft red', css: '#ea9999' },
|
|
26
|
+
{ value: '#f9cb9c', label: 'Soft orange', css: '#f9cb9c' },
|
|
27
|
+
{ value: '#ffe599', label: 'Soft yellow', css: '#ffe599' },
|
|
28
|
+
{ value: '#b6d7a8', label: 'Soft green', css: '#b6d7a8' },
|
|
29
|
+
{ value: '#a2c4c9', label: 'Soft teal', css: '#a2c4c9' },
|
|
30
|
+
{ value: '#9fc5e8', label: 'Soft blue', css: '#9fc5e8' },
|
|
31
|
+
{ value: '#b4a7d6', label: 'Soft purple', css: '#b4a7d6' },
|
|
32
|
+
{ value: '#d5a6bd', label: 'Soft pink', css: '#d5a6bd' },
|
|
33
|
+
// Row 3 — vivid Google brand tones
|
|
34
|
+
{ value: '#999999', label: 'Grey', css: '#999999' },
|
|
35
|
+
{ value: '#d93025', label: 'Red', css: '#d93025' },
|
|
36
|
+
{ value: '#e8710a', label: 'Orange', css: '#e8710a' },
|
|
37
|
+
{ value: '#f9ab00', label: 'Yellow', css: '#f9ab00' },
|
|
38
|
+
{ value: '#1e8e3e', label: 'Green', css: '#1e8e3e' },
|
|
39
|
+
{ value: '#00897b', label: 'Teal', css: '#00897b' },
|
|
40
|
+
{ value: '#1a73e8', label: 'Blue', css: '#1a73e8' },
|
|
41
|
+
{ value: '#9334e6', label: 'Purple', css: '#9334e6' },
|
|
42
|
+
{ value: '#d2185c', label: 'Pink', css: '#d2185c' },
|
|
43
|
+
// Row 4 — dark shades + black
|
|
44
|
+
{ value: '#000000', label: 'Black', css: '#000000' },
|
|
45
|
+
{ value: '#990000', label: 'Dark red', css: '#990000' },
|
|
46
|
+
{ value: '#b45f06', label: 'Dark orange', css: '#b45f06' },
|
|
47
|
+
{ value: '#bf9000', label: 'Dark yellow', css: '#bf9000' },
|
|
48
|
+
{ value: '#0b6623', label: 'Dark green', css: '#0b6623' },
|
|
49
|
+
{ value: '#0f5963', label: 'Dark teal', css: '#0f5963' },
|
|
50
|
+
{ value: '#0b5394', label: 'Dark blue', css: '#0b5394' },
|
|
51
|
+
{ value: '#5b14b3', label: 'Dark purple', css: '#5b14b3' },
|
|
52
|
+
{ value: '#85104a', label: 'Dark pink', css: '#85104a' },
|
|
53
|
+
];
|
|
54
|
+
// "A" with an underline bar — text-color glyph. Drawn inside the shared
|
|
55
|
+
// 24×24 viewBox used by the rest of the toolbar.
|
|
56
|
+
const ICON_COLOR = '<path d="M6 17l4-11h2l4 11" />' +
|
|
57
|
+
'<path d="M7.5 13.5h5" />' +
|
|
58
|
+
'<path d="M5 20h12" />';
|
|
59
|
+
const FONT_FAMILIES = [
|
|
60
|
+
'Arial',
|
|
61
|
+
'Calibri',
|
|
62
|
+
'Georgia',
|
|
63
|
+
'Inter',
|
|
64
|
+
'Roboto',
|
|
65
|
+
'Times New Roman',
|
|
66
|
+
'Verdana',
|
|
67
|
+
'Courier New',
|
|
68
|
+
];
|
|
69
|
+
export function buildTypography(schema) {
|
|
70
|
+
const items = [];
|
|
71
|
+
const color = schema.marks.color;
|
|
72
|
+
if (color) {
|
|
73
|
+
items.push({
|
|
74
|
+
type: 'palette',
|
|
75
|
+
id: 'color',
|
|
76
|
+
label: 'Text color',
|
|
77
|
+
icon: ICON_COLOR,
|
|
78
|
+
swatches: COLOR_SWATCHES,
|
|
79
|
+
clearLabel: 'Default',
|
|
80
|
+
getValue: (s) => {
|
|
81
|
+
const r = probeMarkAttr(s, color, 'value');
|
|
82
|
+
if (r.state === 'uniform' && typeof r.value === 'string')
|
|
83
|
+
return r.value;
|
|
84
|
+
if (r.state === 'unset')
|
|
85
|
+
return '';
|
|
86
|
+
return TOOLBAR_BLANK_VALUE;
|
|
87
|
+
},
|
|
88
|
+
apply: (s, dispatch, value) => {
|
|
89
|
+
if (!value)
|
|
90
|
+
return clearMark(color)(s, dispatch) || true;
|
|
91
|
+
return setMark(color, { value })(s, dispatch);
|
|
92
|
+
},
|
|
93
|
+
clear: (s, dispatch) => clearMark(color)(s, dispatch),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
const fontFamily = schema.marks.font_family;
|
|
97
|
+
if (fontFamily) {
|
|
98
|
+
items.push({
|
|
99
|
+
type: 'select',
|
|
100
|
+
id: 'font-family',
|
|
101
|
+
label: 'Font family',
|
|
102
|
+
options: [
|
|
103
|
+
{ value: '', label: 'Default' },
|
|
104
|
+
...FONT_FAMILIES.map((n) => ({ value: n, label: n })),
|
|
105
|
+
],
|
|
106
|
+
getValue: (s) => {
|
|
107
|
+
const r = probeMarkAttr(s, fontFamily, 'name');
|
|
108
|
+
if (r.state === 'uniform' && typeof r.value === 'string')
|
|
109
|
+
return r.value;
|
|
110
|
+
if (r.state === 'unset')
|
|
111
|
+
return '';
|
|
112
|
+
return TOOLBAR_BLANK_VALUE;
|
|
113
|
+
},
|
|
114
|
+
apply: (s, dispatch, value) => {
|
|
115
|
+
if (!value)
|
|
116
|
+
return clearMark(fontFamily)(s, dispatch) || true;
|
|
117
|
+
return setMark(fontFamily, { name: value })(s, dispatch);
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return items;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=typography.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typography.js","sourceRoot":"","sources":["../../src/toolbar-builders/typography.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { DxNode, EditorState, Schema, Transaction } from '@doxi/core';
|
|
2
|
+
import type { ImportWarning } from '@doxi/docx';
|
|
3
|
+
/**
|
|
4
|
+
* Handle returned by useDoxivaEditor. Wraps the editor's state + dispatch
|
|
5
|
+
* surface in a stable object the <Editor /> component can read each render.
|
|
6
|
+
*/
|
|
7
|
+
export interface EditorHandle {
|
|
8
|
+
readonly state: EditorState;
|
|
9
|
+
dispatch(tr: Transaction): void;
|
|
10
|
+
readonly schema: Schema;
|
|
11
|
+
/**
|
|
12
|
+
* Replace the editor's state entirely. Used when wholesale-swapping the
|
|
13
|
+
* document — e.g. after importing a DOCX file. Bypasses the normal
|
|
14
|
+
* dispatch/apply flow so callers can hand in a freshly-constructed state.
|
|
15
|
+
*/
|
|
16
|
+
replaceState(newState: EditorState): void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Theme selector for the bundled <DoxivaEditor>. `auto` follows
|
|
20
|
+
* `prefers-color-scheme` and updates if it changes.
|
|
21
|
+
*/
|
|
22
|
+
export type Theme = 'light' | 'dark' | 'auto';
|
|
23
|
+
/**
|
|
24
|
+
* Exhaustive feature toggle map for the bundled editor. Every flag defaults
|
|
25
|
+
* to `true`. Disable a feature by setting its flag to `false`; partial
|
|
26
|
+
* enabling of a feature is intentionally not supported — each flag is a
|
|
27
|
+
* complete unit of UX.
|
|
28
|
+
*/
|
|
29
|
+
export interface FeatureFlags {
|
|
30
|
+
readonly history?: boolean;
|
|
31
|
+
readonly headings?: boolean;
|
|
32
|
+
readonly fontSize?: boolean;
|
|
33
|
+
readonly fontFamily?: boolean;
|
|
34
|
+
readonly color?: boolean;
|
|
35
|
+
readonly marks?: boolean;
|
|
36
|
+
readonly alignment?: boolean;
|
|
37
|
+
readonly lineHeight?: boolean;
|
|
38
|
+
readonly lists?: boolean;
|
|
39
|
+
readonly blocks?: boolean;
|
|
40
|
+
readonly links?: boolean;
|
|
41
|
+
readonly tables?: boolean;
|
|
42
|
+
readonly images?: boolean;
|
|
43
|
+
readonly newPage?: boolean;
|
|
44
|
+
readonly headerFooter?: boolean;
|
|
45
|
+
readonly pageSettings?: boolean;
|
|
46
|
+
readonly print?: boolean;
|
|
47
|
+
readonly downloadPdf?: boolean;
|
|
48
|
+
readonly exportDocx?: boolean;
|
|
49
|
+
readonly importDocx?: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The fully populated default feature set. Typed as `Required<FeatureFlags>`
|
|
53
|
+
* so the compiler enforces a value for every flag — adding a flag to
|
|
54
|
+
* `FeatureFlags` without updating this map is a build error.
|
|
55
|
+
*/
|
|
56
|
+
export declare const DEFAULT_FEATURES: Required<FeatureFlags>;
|
|
57
|
+
/**
|
|
58
|
+
* Supported page-size presets for the bundled editor. Hosts pick one via
|
|
59
|
+
* `defaultPageSize`; users can change it interactively via the Page
|
|
60
|
+
* Settings popover if `features.pageSettings` is enabled.
|
|
61
|
+
*/
|
|
62
|
+
export type PageSizePreset = 'letter' | 'a4' | 'legal' | 'a5';
|
|
63
|
+
/**
|
|
64
|
+
* Props for the bundled `<DoxivaEditor>` component (Track A — v0.11).
|
|
65
|
+
*
|
|
66
|
+
* Hosts mount this with a handful of props instead of wiring up popovers,
|
|
67
|
+
* keymaps, the print bridge, and DOCX import/export by hand.
|
|
68
|
+
*/
|
|
69
|
+
export interface DoxivaEditorProps {
|
|
70
|
+
readonly initialDoc?: DxNode;
|
|
71
|
+
readonly theme?: Theme;
|
|
72
|
+
readonly features?: FeatureFlags;
|
|
73
|
+
readonly paginated?: boolean;
|
|
74
|
+
readonly defaultPageSize?: PageSizePreset;
|
|
75
|
+
readonly editable?: boolean;
|
|
76
|
+
readonly ariaLabel?: string;
|
|
77
|
+
readonly onChange?: (doc: DxNode) => void;
|
|
78
|
+
readonly onStateChange?: (state: EditorState) => void;
|
|
79
|
+
/**
|
|
80
|
+
* Fired after an Import DOCX produces warnings. Pass `null` to suppress
|
|
81
|
+
* the default warnings panel entirely and handle them yourself.
|
|
82
|
+
*/
|
|
83
|
+
readonly onImportWarnings?: ((warnings: ReadonlyArray<ImportWarning>) => void) | null;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAAA;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAA;CAC1C;AAED;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAE7C;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAC9B;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,YAAY,CAqBnD,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAAA;AAE7D;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAA;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,eAAe,CAAC,EAAE,cAAc,CAAA;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;IACrD;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAA;CACtF"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The fully populated default feature set. Typed as `Required<FeatureFlags>`
|
|
3
|
+
* so the compiler enforces a value for every flag — adding a flag to
|
|
4
|
+
* `FeatureFlags` without updating this map is a build error.
|
|
5
|
+
*/
|
|
6
|
+
export const DEFAULT_FEATURES = {
|
|
7
|
+
history: true,
|
|
8
|
+
headings: true,
|
|
9
|
+
fontSize: true,
|
|
10
|
+
fontFamily: true,
|
|
11
|
+
color: true,
|
|
12
|
+
marks: true,
|
|
13
|
+
alignment: true,
|
|
14
|
+
lineHeight: true,
|
|
15
|
+
lists: true,
|
|
16
|
+
blocks: true,
|
|
17
|
+
links: true,
|
|
18
|
+
tables: true,
|
|
19
|
+
images: true,
|
|
20
|
+
newPage: true,
|
|
21
|
+
headerFooter: true,
|
|
22
|
+
pageSettings: true,
|
|
23
|
+
print: true,
|
|
24
|
+
downloadPdf: true,
|
|
25
|
+
exportDocx: true,
|
|
26
|
+
importDocx: true,
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAsDA;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACtD,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,IAAI;IACd,UAAU,EAAE,IAAI;IAChB,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,IAAI;IAChB,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,IAAI;IAClB,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,IAAI;IAChB,UAAU,EAAE,IAAI;CACjB,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Plugin, type DxNode, type Schema, type Selection } from '@doxi/core';
|
|
2
|
+
import type { EditorHandle } from './types.js';
|
|
3
|
+
export interface UseDoxivaEditorOptions {
|
|
4
|
+
readonly schema: Schema;
|
|
5
|
+
readonly plugins?: ReadonlyArray<Plugin<unknown>>;
|
|
6
|
+
readonly doc?: DxNode;
|
|
7
|
+
readonly selection?: Selection;
|
|
8
|
+
}
|
|
9
|
+
export declare function useDoxivaEditor(options: UseDoxivaEditorOptions): EditorHandle;
|
|
10
|
+
//# sourceMappingURL=useDoxivaEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDoxivaEditor.d.ts","sourceRoot":"","sources":["../src/useDoxivaEditor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,SAAS,EAAoB,MAAM,YAAY,CAAA;AAEjH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;IACjD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAA;CAC/B;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,YAAY,CAoC7E"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { EditorState } from '@doxi/core';
|
|
2
|
+
import { useCallback, useMemo, useRef, useState } from 'react';
|
|
3
|
+
export function useDoxivaEditor(options) {
|
|
4
|
+
const initial = useMemo(() => EditorState.create({
|
|
5
|
+
schema: options.schema,
|
|
6
|
+
...(options.doc ? { doc: options.doc } : {}),
|
|
7
|
+
...(options.selection ? { selection: options.selection } : {}),
|
|
8
|
+
plugins: options.plugins ?? [],
|
|
9
|
+
}),
|
|
10
|
+
// We deliberately ignore options.* on subsequent renders — the editor's
|
|
11
|
+
// state is mutated via dispatch, not by re-running create.
|
|
12
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
13
|
+
[]);
|
|
14
|
+
const [state, setState] = useState(initial);
|
|
15
|
+
// We keep a ref to the latest state so dispatch always sees the current
|
|
16
|
+
// value, regardless of stale closures.
|
|
17
|
+
const stateRef = useRef(state);
|
|
18
|
+
stateRef.current = state;
|
|
19
|
+
const dispatch = useCallback((tr) => {
|
|
20
|
+
const next = stateRef.current.apply(tr);
|
|
21
|
+
stateRef.current = next;
|
|
22
|
+
setState(next);
|
|
23
|
+
}, []);
|
|
24
|
+
const replaceState = useCallback((newState) => {
|
|
25
|
+
stateRef.current = newState;
|
|
26
|
+
setState(newState);
|
|
27
|
+
}, []);
|
|
28
|
+
return useMemo(() => ({ state, dispatch, replaceState, schema: options.schema }), [state, dispatch, replaceState, options.schema]);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=useDoxivaEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDoxivaEditor.js","sourceRoot":"","sources":["../src/useDoxivaEditor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA2E,MAAM,YAAY,CAAA;AACjH,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAU9D,MAAM,UAAU,eAAe,CAAC,OAA+B;IAC7D,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CACH,WAAW,CAAC,MAAM,CAAC;QACjB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;KAC/B,CAAC;IACJ,wEAAwE;IACxE,2DAA2D;IAC3D,uDAAuD;IACvD,EAAE,CACH,CAAA;IAED,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAc,OAAO,CAAC,CAAA;IACxD,wEAAwE;IACxE,uCAAuC;IACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC9B,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAA;IAExB,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,EAAe,EAAE,EAAE;QAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACvC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAA;QACvB,QAAQ,CAAC,IAAI,CAAC,CAAA;IAChB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,QAAqB,EAAE,EAAE;QACzD,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAA;QAC3B,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACpB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,EACjE,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,CAChD,CAAA;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@doxi/react",
|
|
3
|
+
"version": "0.11.0",
|
|
4
|
+
"description": "Doxiva React adapter — thin wrapper for @doxi/core's EditorView.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Mahbub Hasan",
|
|
7
|
+
"homepage": "https://github.com/mahbub-hasaan/doxiva#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/mahbub-hasaan/doxiva.git",
|
|
11
|
+
"directory": "packages/react"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/mahbub-hasaan/doxiva/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": ["editor", "react", "rich-text", "doxiva"],
|
|
17
|
+
"publishConfig": {
|
|
18
|
+
"access": "public"
|
|
19
|
+
},
|
|
20
|
+
"type": "module",
|
|
21
|
+
"sideEffects": false,
|
|
22
|
+
"files": ["dist", "README.md", "LICENSE"],
|
|
23
|
+
"exports": {
|
|
24
|
+
".": {
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"import": "./dist/index.js"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsc -p tsconfig.json",
|
|
31
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
32
|
+
"test": "vitest run",
|
|
33
|
+
"test:watch": "vitest",
|
|
34
|
+
"clean": "rimraf dist"
|
|
35
|
+
},
|
|
36
|
+
"peerDependencies": {
|
|
37
|
+
"@doxi/core": "workspace:*",
|
|
38
|
+
"@doxi/docx": "workspace:*",
|
|
39
|
+
"react": "^18.0.0 || ^19.0.0"
|
|
40
|
+
},
|
|
41
|
+
"peerDependenciesMeta": {
|
|
42
|
+
"@doxi/docx": { "optional": true }
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@doxi/docx": "workspace:*",
|
|
46
|
+
"rimraf": "6.0.1"
|
|
47
|
+
}
|
|
48
|
+
}
|