react-next-editor-js 0.1.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 (102) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +877 -0
  3. package/dist/chunk-3QWXTDLY.cjs +486 -0
  4. package/dist/chunk-3QWXTDLY.cjs.map +1 -0
  5. package/dist/chunk-5F6SPYCN.cjs +180 -0
  6. package/dist/chunk-5F6SPYCN.cjs.map +1 -0
  7. package/dist/chunk-6NTSXJX4.js +174 -0
  8. package/dist/chunk-6NTSXJX4.js.map +1 -0
  9. package/dist/chunk-7VYJDBH7.js +261 -0
  10. package/dist/chunk-7VYJDBH7.js.map +1 -0
  11. package/dist/chunk-DBSFCCBG.cjs +1712 -0
  12. package/dist/chunk-DBSFCCBG.cjs.map +1 -0
  13. package/dist/chunk-EFE6RHDL.cjs +4 -0
  14. package/dist/chunk-EFE6RHDL.cjs.map +1 -0
  15. package/dist/chunk-G6YRIEK4.js +3 -0
  16. package/dist/chunk-G6YRIEK4.js.map +1 -0
  17. package/dist/chunk-GFNFJ3FL.cjs +119 -0
  18. package/dist/chunk-GFNFJ3FL.cjs.map +1 -0
  19. package/dist/chunk-IG2YLUFW.js +114 -0
  20. package/dist/chunk-IG2YLUFW.js.map +1 -0
  21. package/dist/chunk-JQXTWLHL.js +176 -0
  22. package/dist/chunk-JQXTWLHL.js.map +1 -0
  23. package/dist/chunk-NJCEHQV3.cjs +454 -0
  24. package/dist/chunk-NJCEHQV3.cjs.map +1 -0
  25. package/dist/chunk-O4GTLC3T.js +478 -0
  26. package/dist/chunk-O4GTLC3T.js.map +1 -0
  27. package/dist/chunk-ODHABIIC.cjs +82 -0
  28. package/dist/chunk-ODHABIIC.cjs.map +1 -0
  29. package/dist/chunk-PZ5AY32C.js +9 -0
  30. package/dist/chunk-PZ5AY32C.js.map +1 -0
  31. package/dist/chunk-Q7SFCCGT.cjs +11 -0
  32. package/dist/chunk-Q7SFCCGT.cjs.map +1 -0
  33. package/dist/chunk-QIUIYBCZ.js +80 -0
  34. package/dist/chunk-QIUIYBCZ.js.map +1 -0
  35. package/dist/chunk-QROUNVQK.js +450 -0
  36. package/dist/chunk-QROUNVQK.js.map +1 -0
  37. package/dist/chunk-T6FR37IC.js +41 -0
  38. package/dist/chunk-T6FR37IC.js.map +1 -0
  39. package/dist/chunk-TI44I654.cjs +265 -0
  40. package/dist/chunk-TI44I654.cjs.map +1 -0
  41. package/dist/chunk-TXPLBAH5.cjs +47 -0
  42. package/dist/chunk-TXPLBAH5.cjs.map +1 -0
  43. package/dist/chunk-U3O54IYI.cjs +187 -0
  44. package/dist/chunk-U3O54IYI.cjs.map +1 -0
  45. package/dist/chunk-VLC7SZMT.js +1669 -0
  46. package/dist/chunk-VLC7SZMT.js.map +1 -0
  47. package/dist/core/index.cjs +232 -0
  48. package/dist/core/index.cjs.map +1 -0
  49. package/dist/core/index.d.cts +122 -0
  50. package/dist/core/index.d.ts +122 -0
  51. package/dist/core/index.js +7 -0
  52. package/dist/core/index.js.map +1 -0
  53. package/dist/defaults-EQD5QKCU.js +4 -0
  54. package/dist/defaults-EQD5QKCU.js.map +1 -0
  55. package/dist/defaults-MLYXD2BG.cjs +49 -0
  56. package/dist/defaults-MLYXD2BG.cjs.map +1 -0
  57. package/dist/docx-BUrf4PFj.d.ts +49 -0
  58. package/dist/docx-DLfSdvXm.d.cts +49 -0
  59. package/dist/docx-LDETXV3L.js +5 -0
  60. package/dist/docx-LDETXV3L.js.map +1 -0
  61. package/dist/docx-N2LKIOK3.cjs +14 -0
  62. package/dist/docx-N2LKIOK3.cjs.map +1 -0
  63. package/dist/export/index.cjs +54 -0
  64. package/dist/export/index.cjs.map +1 -0
  65. package/dist/export/index.d.cts +60 -0
  66. package/dist/export/index.d.ts +60 -0
  67. package/dist/export/index.js +9 -0
  68. package/dist/export/index.js.map +1 -0
  69. package/dist/html-5BXJPQU3.js +7 -0
  70. package/dist/html-5BXJPQU3.js.map +1 -0
  71. package/dist/html-KU2KHLRF.cjs +24 -0
  72. package/dist/html-KU2KHLRF.cjs.map +1 -0
  73. package/dist/import/index.cjs +15 -0
  74. package/dist/import/index.cjs.map +1 -0
  75. package/dist/import/index.d.cts +37 -0
  76. package/dist/import/index.d.ts +37 -0
  77. package/dist/import/index.js +6 -0
  78. package/dist/import/index.js.map +1 -0
  79. package/dist/index.cjs +1035 -0
  80. package/dist/index.cjs.map +1 -0
  81. package/dist/index.d.cts +248 -0
  82. package/dist/index.d.ts +248 -0
  83. package/dist/index.js +885 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/persistence/index.cjs +37 -0
  86. package/dist/persistence/index.cjs.map +1 -0
  87. package/dist/persistence/index.d.cts +279 -0
  88. package/dist/persistence/index.d.ts +279 -0
  89. package/dist/persistence/index.js +4 -0
  90. package/dist/persistence/index.js.map +1 -0
  91. package/dist/sanitize-7IZ-SW1f.d.ts +361 -0
  92. package/dist/sanitize-CvmgqbsA.d.cts +361 -0
  93. package/dist/server/index.cjs +400 -0
  94. package/dist/server/index.cjs.map +1 -0
  95. package/dist/server/index.d.cts +229 -0
  96. package/dist/server/index.d.ts +229 -0
  97. package/dist/server/index.js +390 -0
  98. package/dist/server/index.js.map +1 -0
  99. package/dist/styles.css +680 -0
  100. package/dist/types-B4z0Quvv.d.cts +193 -0
  101. package/dist/types-B4z0Quvv.d.ts +193 -0
  102. package/package.json +183 -0
@@ -0,0 +1,114 @@
1
+ import { documentToText, documentToDocxBlob } from './chunk-QROUNVQK.js';
2
+ import { buildPrintDocument } from './chunk-7VYJDBH7.js';
3
+ import { DEFAULT_PAGE } from './chunk-JQXTWLHL.js';
4
+
5
+ // src/export/pdf.ts
6
+ function printDocumentToPdf(doc, options = {}) {
7
+ if (typeof document === "undefined") {
8
+ return Promise.reject(new Error("printDocumentToPdf requires a browser environment."));
9
+ }
10
+ const page = options.page ?? DEFAULT_PAGE;
11
+ const html = buildPrintDocument(doc, page, options.title);
12
+ return new Promise((resolve, reject) => {
13
+ try {
14
+ const iframe = document.createElement("iframe");
15
+ iframe.setAttribute("aria-hidden", "true");
16
+ iframe.style.position = "fixed";
17
+ iframe.style.right = "0";
18
+ iframe.style.bottom = "0";
19
+ iframe.style.width = "0";
20
+ iframe.style.height = "0";
21
+ iframe.style.border = "0";
22
+ document.body.appendChild(iframe);
23
+ const cleanup = () => {
24
+ setTimeout(() => {
25
+ if (iframe.parentNode) iframe.parentNode.removeChild(iframe);
26
+ }, 1e3);
27
+ };
28
+ const win = iframe.contentWindow;
29
+ const docu = iframe.contentDocument || win?.document;
30
+ if (!win || !docu) {
31
+ cleanup();
32
+ reject(new Error("Unable to access print frame document."));
33
+ return;
34
+ }
35
+ docu.open();
36
+ docu.write(html);
37
+ docu.close();
38
+ const doPrint = () => {
39
+ try {
40
+ win.focus();
41
+ win.print();
42
+ resolve();
43
+ } catch (err) {
44
+ reject(err);
45
+ } finally {
46
+ cleanup();
47
+ }
48
+ };
49
+ if (docu.readyState === "complete") {
50
+ setTimeout(doPrint, 50);
51
+ } else {
52
+ iframe.addEventListener("load", () => setTimeout(doPrint, 50), { once: true });
53
+ }
54
+ } catch (err) {
55
+ reject(err);
56
+ }
57
+ });
58
+ }
59
+
60
+ // src/export/download.ts
61
+ function downloadBlob(blob, filename) {
62
+ if (typeof document === "undefined" || typeof URL === "undefined") {
63
+ throw new Error("downloadBlob requires a browser environment.");
64
+ }
65
+ const url = URL.createObjectURL(blob);
66
+ const anchor = document.createElement("a");
67
+ anchor.href = url;
68
+ anchor.download = filename;
69
+ anchor.rel = "noopener";
70
+ anchor.style.display = "none";
71
+ document.body.appendChild(anchor);
72
+ anchor.click();
73
+ document.body.removeChild(anchor);
74
+ setTimeout(() => URL.revokeObjectURL(url), 1e3);
75
+ }
76
+ function downloadText(text, filename, mime = "text/plain") {
77
+ downloadBlob(new Blob([text], { type: `${mime};charset=utf-8` }), filename);
78
+ }
79
+
80
+ // src/export/index.ts
81
+ async function exportDocument(doc, format, options = {}) {
82
+ const base = options.filename ?? options.title ?? "document";
83
+ switch (format) {
84
+ case "docx": {
85
+ const blob = await documentToDocxBlob(doc, { page: options.page, title: options.title });
86
+ downloadBlob(blob, ensureExt(base, "docx"));
87
+ return;
88
+ }
89
+ case "pdf":
90
+ await printDocumentToPdf(doc, { page: options.page, title: options.title });
91
+ return;
92
+ case "txt":
93
+ downloadText(documentToText(doc, options.text), ensureExt(base, "txt"));
94
+ return;
95
+ case "html": {
96
+ const { buildPrintDocument: buildPrintDocument2 } = await import('./html-5BXJPQU3.js');
97
+ downloadText(
98
+ buildPrintDocument2(doc, options.page ?? (await import('./defaults-EQD5QKCU.js')).DEFAULT_PAGE, options.title),
99
+ ensureExt(base, "html"),
100
+ "text/html"
101
+ );
102
+ return;
103
+ }
104
+ default:
105
+ throw new Error(`Unsupported export format: ${String(format)}`);
106
+ }
107
+ }
108
+ function ensureExt(name, ext) {
109
+ return name.toLowerCase().endsWith(`.${ext}`) ? name : `${name}.${ext}`;
110
+ }
111
+
112
+ export { downloadBlob, downloadText, exportDocument, printDocumentToPdf };
113
+ //# sourceMappingURL=chunk-IG2YLUFW.js.map
114
+ //# sourceMappingURL=chunk-IG2YLUFW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/export/pdf.ts","../src/export/download.ts","../src/export/index.ts"],"names":["buildPrintDocument"],"mappings":"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","file":"chunk-IG2YLUFW.js","sourcesContent":["import type { DocumentJSON, PageConfig } from '../config/types';\nimport { DEFAULT_PAGE } from '../config/defaults';\nimport { buildPrintDocument } from './html';\n\nexport interface PdfPrintOptions {\n page?: PageConfig;\n title?: string;\n}\n\n/**\n * Client-side PDF export via the browser's print-to-PDF (§8.4). Renders the\n * shared print HTML (matching the on-screen document and the server renderer)\n * into a hidden iframe and invokes print. Vector output with selectable text,\n * works fully offline, no server round-trip (F-6.3, F-6.4, NF-8).\n *\n * Resolves once printing has been initiated. The user chooses \"Save as PDF\" in\n * the browser's print dialog.\n */\nexport function printDocumentToPdf(doc: DocumentJSON, options: PdfPrintOptions = {}): Promise<void> {\n if (typeof document === 'undefined') {\n return Promise.reject(new Error('printDocumentToPdf requires a browser environment.'));\n }\n const page = options.page ?? DEFAULT_PAGE;\n const html = buildPrintDocument(doc, page, options.title);\n\n return new Promise<void>((resolve, reject) => {\n try {\n const iframe = document.createElement('iframe');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.style.position = 'fixed';\n iframe.style.right = '0';\n iframe.style.bottom = '0';\n iframe.style.width = '0';\n iframe.style.height = '0';\n iframe.style.border = '0';\n document.body.appendChild(iframe);\n\n const cleanup = () => {\n // Delay removal so the print dialog can read the document.\n setTimeout(() => {\n if (iframe.parentNode) iframe.parentNode.removeChild(iframe);\n }, 1000);\n };\n\n const win = iframe.contentWindow;\n const docu = iframe.contentDocument || win?.document;\n if (!win || !docu) {\n cleanup();\n reject(new Error('Unable to access print frame document.'));\n return;\n }\n\n docu.open();\n docu.write(html);\n docu.close();\n\n const doPrint = () => {\n try {\n win.focus();\n win.print();\n resolve();\n } catch (err) {\n reject(err as Error);\n } finally {\n cleanup();\n }\n };\n\n // Give the frame a tick to lay out before printing.\n if (docu.readyState === 'complete') {\n setTimeout(doPrint, 50);\n } else {\n iframe.addEventListener('load', () => setTimeout(doPrint, 50), { once: true });\n }\n } catch (err) {\n reject(err as Error);\n }\n });\n}\n\nexport { buildPrintDocument, printStylesheet } from './html';\n","/**\n * Trigger a client-side file download without a server round-trip (F-6.6).\n * Browser-only; throws a clear error if called without a DOM.\n */\nexport function downloadBlob(blob: Blob, filename: string): void {\n if (typeof document === 'undefined' || typeof URL === 'undefined') {\n throw new Error('downloadBlob requires a browser environment.');\n }\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.rel = 'noopener';\n anchor.style.display = 'none';\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n // Revoke on the next tick so the download has started.\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\n/** Convenience: download a UTF-8 text string as a file. */\nexport function downloadText(text: string, filename: string, mime = 'text/plain'): void {\n downloadBlob(new Blob([text], { type: `${mime};charset=utf-8` }), filename);\n}\n","/**\n * Export pipeline (§5.6). Shared, isomorphic converters from document JSON to\n * plain text, HTML, DOCX and (client) PDF — the same code powers interactive\n * download and the programmatic API so output is consistent (F-6.7, F-6.11).\n */\nexport { documentToText, type TextConversionOptions } from './text';\nexport {\n documentToHtml,\n buildPrintDocument,\n printStylesheet,\n} from './html';\nexport {\n documentToDocxBlob,\n documentToDocxBuffer,\n type DocxExportOptions,\n type DocxNodeConverter,\n type DocxContext,\n} from './docx';\nexport { printDocumentToPdf, type PdfPrintOptions } from './pdf';\nexport { downloadBlob, downloadText } from './download';\n\nimport type { DocumentJSON, PageConfig } from '../config/types';\nimport { documentToText, type TextConversionOptions } from './text';\nimport { documentToDocxBlob } from './docx';\nimport { printDocumentToPdf } from './pdf';\nimport { downloadBlob, downloadText } from './download';\n\n/** Supported export target formats. */\nexport type ExportFormat = 'docx' | 'pdf' | 'txt' | 'html';\n\n/**\n * High-level interactive export helper used by the toolbar/host: convert the\n * given document to the requested format and trigger a client download (DOCX,\n * TXT) or open the print dialog (PDF). Returns once the action has started.\n */\nexport async function exportDocument(\n doc: DocumentJSON,\n format: ExportFormat,\n options: {\n filename?: string;\n page?: PageConfig;\n title?: string;\n text?: TextConversionOptions;\n } = {},\n): Promise<void> {\n const base = options.filename ?? options.title ?? 'document';\n switch (format) {\n case 'docx': {\n const blob = await documentToDocxBlob(doc, { page: options.page, title: options.title });\n downloadBlob(blob, ensureExt(base, 'docx'));\n return;\n }\n case 'pdf':\n await printDocumentToPdf(doc, { page: options.page, title: options.title });\n return;\n case 'txt':\n downloadText(documentToText(doc, options.text), ensureExt(base, 'txt'));\n return;\n case 'html': {\n const { buildPrintDocument } = await import('./html');\n downloadText(\n buildPrintDocument(doc, options.page ?? (await import('../config/defaults')).DEFAULT_PAGE, options.title),\n ensureExt(base, 'html'),\n 'text/html',\n );\n return;\n }\n default:\n throw new Error(`Unsupported export format: ${String(format)}`);\n }\n}\n\nfunction ensureExt(name: string, ext: string): string {\n return name.toLowerCase().endsWith(`.${ext}`) ? name : `${name}.${ext}`;\n}\n"]}
@@ -0,0 +1,176 @@
1
+ // src/config/defaults.ts
2
+ var DEFAULT_FEATURES = {
3
+ bold: true,
4
+ italic: true,
5
+ underline: true,
6
+ strikethrough: true,
7
+ superscript: true,
8
+ subscript: true,
9
+ code: true,
10
+ fontFamily: true,
11
+ fontSize: true,
12
+ textColor: true,
13
+ highlight: true,
14
+ clearFormatting: true,
15
+ headings: true,
16
+ alignment: true,
17
+ lineSpacing: true,
18
+ indentation: true,
19
+ bulletList: true,
20
+ orderedList: true,
21
+ taskList: true,
22
+ blockquote: true,
23
+ horizontalRule: true,
24
+ table: true,
25
+ image: true,
26
+ link: true,
27
+ pageBreak: true,
28
+ history: true,
29
+ wordCount: true,
30
+ docxImport: true
31
+ };
32
+ var PAGE_DIMENSIONS_MM = {
33
+ A4: { width: 210, height: 297 },
34
+ Letter: { width: 215.9, height: 279.4 },
35
+ Legal: { width: 215.9, height: 355.6 },
36
+ A5: { width: 148, height: 210 }
37
+ };
38
+ var DEFAULT_PAGE = {
39
+ size: "A4",
40
+ orientation: "portrait",
41
+ margins: { top: 25.4, right: 25.4, bottom: 25.4, left: 25.4 },
42
+ showPageChrome: true
43
+ };
44
+ function resolvePageDimensions(page) {
45
+ let width;
46
+ let height;
47
+ if (page.size === "custom") {
48
+ width = page.widthMm ?? PAGE_DIMENSIONS_MM.A4.width;
49
+ height = page.heightMm ?? PAGE_DIMENSIONS_MM.A4.height;
50
+ } else {
51
+ ({ width, height } = PAGE_DIMENSIONS_MM[page.size]);
52
+ }
53
+ if (page.orientation === "landscape") {
54
+ return { width: height, height: width };
55
+ }
56
+ return { width, height };
57
+ }
58
+ var DEFAULT_STRINGS = {
59
+ bold: "Bold",
60
+ italic: "Italic",
61
+ underline: "Underline",
62
+ strikethrough: "Strikethrough",
63
+ superscript: "Superscript",
64
+ subscript: "Subscript",
65
+ code: "Inline code",
66
+ textColor: "Text color",
67
+ highlight: "Highlight",
68
+ clearFormatting: "Clear formatting",
69
+ fontFamily: "Font",
70
+ fontSize: "Font size",
71
+ paragraphStyle: "Style",
72
+ paragraph: "Normal text",
73
+ heading: "Heading",
74
+ alignLeft: "Align left",
75
+ alignCenter: "Align center",
76
+ alignRight: "Align right",
77
+ alignJustify: "Justify",
78
+ bulletList: "Bulleted list",
79
+ orderedList: "Numbered list",
80
+ taskList: "Task list",
81
+ indent: "Increase indent",
82
+ outdent: "Decrease indent",
83
+ blockquote: "Blockquote",
84
+ horizontalRule: "Horizontal rule",
85
+ link: "Link",
86
+ linkPrompt: "Enter URL",
87
+ removeLink: "Remove link",
88
+ image: "Image",
89
+ imagePrompt: "Enter image URL",
90
+ imageAltPrompt: "Describe the image (alt text)",
91
+ table: "Table",
92
+ insertTable: "Insert table",
93
+ addRowBefore: "Insert row above",
94
+ addRowAfter: "Insert row below",
95
+ deleteRow: "Delete row",
96
+ addColumnBefore: "Insert column left",
97
+ addColumnAfter: "Insert column right",
98
+ deleteColumn: "Delete column",
99
+ mergeCells: "Merge cells",
100
+ splitCell: "Split cell",
101
+ deleteTable: "Delete table",
102
+ pageBreak: "Page break",
103
+ importDocx: "Import .docx",
104
+ undo: "Undo",
105
+ redo: "Redo",
106
+ words: "words",
107
+ characters: "characters",
108
+ readOnly: "Read only"
109
+ };
110
+ var DEFAULT_FONT_FAMILIES = [
111
+ "Arial",
112
+ "Calibri",
113
+ "Cambria",
114
+ "Georgia",
115
+ "Helvetica",
116
+ "Times New Roman",
117
+ "Trebuchet MS",
118
+ "Verdana",
119
+ "Courier New"
120
+ ];
121
+ var DEFAULT_FONT_SIZES = [8, 9, 10, 11, 12, 14, 16, 18, 24, 30, 36, 48, 60, 72];
122
+ var DEFAULT_COLOR_PALETTE = [
123
+ "#000000",
124
+ "#434343",
125
+ "#666666",
126
+ "#999999",
127
+ "#b7b7b7",
128
+ "#cccccc",
129
+ "#ffffff",
130
+ "#df4a36",
131
+ "#e69138",
132
+ "#f1c232",
133
+ "#6aa84f",
134
+ "#45818e",
135
+ "#3d85c6",
136
+ "#674ea7",
137
+ "#a64d79"
138
+ ];
139
+ var DEFAULT_TOOLBAR_GROUPS = [
140
+ ["undo", "redo"],
141
+ ["paragraphStyle", "fontFamily", "fontSize"],
142
+ ["bold", "italic", "underline", "strikethrough", "superscript", "subscript", "code"],
143
+ ["textColor", "highlight", "clearFormatting"],
144
+ ["alignLeft", "alignCenter", "alignRight", "alignJustify"],
145
+ ["bulletList", "orderedList", "taskList", "indent", "outdent"],
146
+ ["blockquote", "horizontalRule", "link", "image", "table", "pageBreak"],
147
+ ["importDocx"]
148
+ ];
149
+ function themeToCssVars(theme) {
150
+ if (!theme) return {};
151
+ const map = [
152
+ ["fontFamily", "--rne-font-family"],
153
+ ["fontSize", "--rne-font-size"],
154
+ ["textColor", "--rne-text-color"],
155
+ ["background", "--rne-background"],
156
+ ["canvasBackground", "--rne-canvas-background"],
157
+ ["pageBackground", "--rne-page-background"],
158
+ ["accent", "--rne-accent"],
159
+ ["toolbarBackground", "--rne-toolbar-background"],
160
+ ["toolbarColor", "--rne-toolbar-color"],
161
+ ["toolbarActiveBackground", "--rne-toolbar-active-background"],
162
+ ["borderColor", "--rne-border-color"],
163
+ ["borderRadius", "--rne-border-radius"],
164
+ ["selectionColor", "--rne-selection-color"]
165
+ ];
166
+ const out = {};
167
+ for (const [key, cssVar] of map) {
168
+ const value = theme[key];
169
+ if (value != null) out[cssVar] = value;
170
+ }
171
+ return out;
172
+ }
173
+
174
+ export { DEFAULT_COLOR_PALETTE, DEFAULT_FEATURES, DEFAULT_FONT_FAMILIES, DEFAULT_FONT_SIZES, DEFAULT_PAGE, DEFAULT_STRINGS, DEFAULT_TOOLBAR_GROUPS, PAGE_DIMENSIONS_MM, resolvePageDimensions, themeToCssVars };
175
+ //# sourceMappingURL=chunk-JQXTWLHL.js.map
176
+ //# sourceMappingURL=chunk-JQXTWLHL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/defaults.ts"],"names":[],"mappings":"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","file":"chunk-JQXTWLHL.js","sourcesContent":["import type {\n EditorStrings,\n FeatureFlags,\n PageConfig,\n PageSize,\n ThemeTokens,\n ToolbarItemId,\n} from './types';\n\n/** All features enabled by default; integrations opt out per instance. */\nexport const DEFAULT_FEATURES: FeatureFlags = {\n bold: true,\n italic: true,\n underline: true,\n strikethrough: true,\n superscript: true,\n subscript: true,\n code: true,\n fontFamily: true,\n fontSize: true,\n textColor: true,\n highlight: true,\n clearFormatting: true,\n headings: true,\n alignment: true,\n lineSpacing: true,\n indentation: true,\n bulletList: true,\n orderedList: true,\n taskList: true,\n blockquote: true,\n horizontalRule: true,\n table: true,\n image: true,\n link: true,\n pageBreak: true,\n history: true,\n wordCount: true,\n docxImport: true,\n};\n\n/** Physical page dimensions in millimetres for the supported standard sizes. */\nexport const PAGE_DIMENSIONS_MM: Record<Exclude<PageSize, 'custom'>, { width: number; height: number }> =\n {\n A4: { width: 210, height: 297 },\n Letter: { width: 215.9, height: 279.4 },\n Legal: { width: 215.9, height: 355.6 },\n A5: { width: 148, height: 210 },\n };\n\nexport const DEFAULT_PAGE: PageConfig = {\n size: 'A4',\n orientation: 'portrait',\n margins: { top: 25.4, right: 25.4, bottom: 25.4, left: 25.4 },\n showPageChrome: true,\n};\n\n/** Resolve a {@link PageConfig} to concrete content-box dimensions in millimetres. */\nexport function resolvePageDimensions(page: PageConfig): { width: number; height: number } {\n let width: number;\n let height: number;\n if (page.size === 'custom') {\n width = page.widthMm ?? PAGE_DIMENSIONS_MM.A4.width;\n height = page.heightMm ?? PAGE_DIMENSIONS_MM.A4.height;\n } else {\n ({ width, height } = PAGE_DIMENSIONS_MM[page.size]);\n }\n if (page.orientation === 'landscape') {\n return { width: height, height: width };\n }\n return { width, height };\n}\n\n/** Default English UI strings (NF-6: externalized for localization). */\nexport const DEFAULT_STRINGS: EditorStrings = {\n bold: 'Bold',\n italic: 'Italic',\n underline: 'Underline',\n strikethrough: 'Strikethrough',\n superscript: 'Superscript',\n subscript: 'Subscript',\n code: 'Inline code',\n textColor: 'Text color',\n highlight: 'Highlight',\n clearFormatting: 'Clear formatting',\n fontFamily: 'Font',\n fontSize: 'Font size',\n paragraphStyle: 'Style',\n paragraph: 'Normal text',\n heading: 'Heading',\n alignLeft: 'Align left',\n alignCenter: 'Align center',\n alignRight: 'Align right',\n alignJustify: 'Justify',\n bulletList: 'Bulleted list',\n orderedList: 'Numbered list',\n taskList: 'Task list',\n indent: 'Increase indent',\n outdent: 'Decrease indent',\n blockquote: 'Blockquote',\n horizontalRule: 'Horizontal rule',\n link: 'Link',\n linkPrompt: 'Enter URL',\n removeLink: 'Remove link',\n image: 'Image',\n imagePrompt: 'Enter image URL',\n imageAltPrompt: 'Describe the image (alt text)',\n table: 'Table',\n insertTable: 'Insert table',\n addRowBefore: 'Insert row above',\n addRowAfter: 'Insert row below',\n deleteRow: 'Delete row',\n addColumnBefore: 'Insert column left',\n addColumnAfter: 'Insert column right',\n deleteColumn: 'Delete column',\n mergeCells: 'Merge cells',\n splitCell: 'Split cell',\n deleteTable: 'Delete table',\n pageBreak: 'Page break',\n importDocx: 'Import .docx',\n undo: 'Undo',\n redo: 'Redo',\n words: 'words',\n characters: 'characters',\n readOnly: 'Read only',\n};\n\n/** Font families offered by the font picker. Consumers can override via config. */\nexport const DEFAULT_FONT_FAMILIES: string[] = [\n 'Arial',\n 'Calibri',\n 'Cambria',\n 'Georgia',\n 'Helvetica',\n 'Times New Roman',\n 'Trebuchet MS',\n 'Verdana',\n 'Courier New',\n];\n\n/** Font sizes (pt) offered by the size picker. */\nexport const DEFAULT_FONT_SIZES: number[] = [8, 9, 10, 11, 12, 14, 16, 18, 24, 30, 36, 48, 60, 72];\n\n/** A palette of colors offered by the color/highlight pickers. */\nexport const DEFAULT_COLOR_PALETTE: string[] = [\n '#000000',\n '#434343',\n '#666666',\n '#999999',\n '#b7b7b7',\n '#cccccc',\n '#ffffff',\n '#df4a36',\n '#e69138',\n '#f1c232',\n '#6aa84f',\n '#45818e',\n '#3d85c6',\n '#674ea7',\n '#a64d79',\n];\n\n/** Default toolbar layout, grouped. Filtered by enabled features at render time. */\nexport const DEFAULT_TOOLBAR_GROUPS: ToolbarItemId[][] = [\n ['undo', 'redo'],\n ['paragraphStyle', 'fontFamily', 'fontSize'],\n ['bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'code'],\n ['textColor', 'highlight', 'clearFormatting'],\n ['alignLeft', 'alignCenter', 'alignRight', 'alignJustify'],\n ['bulletList', 'orderedList', 'taskList', 'indent', 'outdent'],\n ['blockquote', 'horizontalRule', 'link', 'image', 'table', 'pageBreak'],\n ['importDocx'],\n];\n\n/** Map a {@link ThemeTokens} object to a CSS custom-property style record. */\nexport function themeToCssVars(theme: ThemeTokens | undefined): Record<string, string> {\n if (!theme) return {};\n const map: Array<[keyof ThemeTokens, string]> = [\n ['fontFamily', '--rne-font-family'],\n ['fontSize', '--rne-font-size'],\n ['textColor', '--rne-text-color'],\n ['background', '--rne-background'],\n ['canvasBackground', '--rne-canvas-background'],\n ['pageBackground', '--rne-page-background'],\n ['accent', '--rne-accent'],\n ['toolbarBackground', '--rne-toolbar-background'],\n ['toolbarColor', '--rne-toolbar-color'],\n ['toolbarActiveBackground', '--rne-toolbar-active-background'],\n ['borderColor', '--rne-border-color'],\n ['borderRadius', '--rne-border-radius'],\n ['selectionColor', '--rne-selection-color'],\n ];\n const out: Record<string, string> = {};\n for (const [key, cssVar] of map) {\n const value = theme[key];\n if (value != null) out[cssVar] = value;\n }\n return out;\n}\n"]}