@overlap/rte 0.1.10 → 1.0.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 (49) hide show
  1. package/README.md +45 -5
  2. package/dist/components/Dropdown.d.ts +1 -0
  3. package/dist/components/Dropdown.d.ts.map +1 -1
  4. package/dist/components/Editor.d.ts.map +1 -1
  5. package/dist/components/FloatingToolbar.d.ts +4 -0
  6. package/dist/components/FloatingToolbar.d.ts.map +1 -1
  7. package/dist/components/Icons.d.ts +3 -0
  8. package/dist/components/Icons.d.ts.map +1 -1
  9. package/dist/components/LinkTooltip.d.ts +11 -0
  10. package/dist/components/LinkTooltip.d.ts.map +1 -0
  11. package/dist/components/Toolbar.d.ts.map +1 -1
  12. package/dist/hooks/useCheckbox.d.ts +3 -1
  13. package/dist/hooks/useCheckbox.d.ts.map +1 -1
  14. package/dist/hooks/useEditorEvents.d.ts +11 -4
  15. package/dist/hooks/useEditorEvents.d.ts.map +1 -1
  16. package/dist/hooks/useEditorInit.d.ts +7 -3
  17. package/dist/hooks/useEditorInit.d.ts.map +1 -1
  18. package/dist/hooks/useEditorSelection.d.ts +3 -1
  19. package/dist/hooks/useEditorSelection.d.ts.map +1 -1
  20. package/dist/index.d.ts +90 -12
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.esm.js +4235 -3024
  23. package/dist/index.esm.js.map +1 -1
  24. package/dist/index.js +4240 -3023
  25. package/dist/index.js.map +1 -1
  26. package/dist/plugins/blockFormat.d.ts.map +1 -1
  27. package/dist/plugins/colors.d.ts.map +1 -1
  28. package/dist/plugins/image.d.ts +1 -1
  29. package/dist/plugins/image.d.ts.map +1 -1
  30. package/dist/plugins/index.d.ts +4 -0
  31. package/dist/plugins/index.d.ts.map +1 -1
  32. package/dist/plugins/linkDialog.d.ts.map +1 -1
  33. package/dist/plugins/optional.d.ts.map +1 -1
  34. package/dist/styles.css +210 -13
  35. package/dist/types.d.ts +13 -4
  36. package/dist/types.d.ts.map +1 -1
  37. package/dist/utils/autoLink.d.ts +12 -0
  38. package/dist/utils/autoLink.d.ts.map +1 -0
  39. package/dist/utils/content.d.ts +2 -1
  40. package/dist/utils/content.d.ts.map +1 -1
  41. package/dist/utils/history.d.ts +9 -4
  42. package/dist/utils/history.d.ts.map +1 -1
  43. package/dist/utils/markdownShortcuts.d.ts +15 -0
  44. package/dist/utils/markdownShortcuts.d.ts.map +1 -0
  45. package/dist/utils/sanitize.d.ts +20 -0
  46. package/dist/utils/sanitize.d.ts.map +1 -0
  47. package/dist/utils/selection.d.ts +28 -0
  48. package/dist/utils/selection.d.ts.map +1 -0
  49. package/package.json +1 -4
@@ -1 +1 @@
1
- {"version":3,"file":"blockFormat.d.ts","sourceRoot":"","sources":["../../src/plugins/blockFormat.tsx"],"names":[],"mappings":"AACA,OAAO,EAAa,MAAM,EAAE,MAAM,UAAU,CAAC;AAc7C,MAAM,WAAW,kBAAkB;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACnC,QAAQ,GAAE,MAAM,EAAoB,EACpC,YAAY,GAAE,kBAAuB,GACtC,MAAM,CAyLR"}
1
+ {"version":3,"file":"blockFormat.d.ts","sourceRoot":"","sources":["../../src/plugins/blockFormat.tsx"],"names":[],"mappings":"AACA,OAAO,EAAa,MAAM,EAAE,MAAM,UAAU,CAAC;AAc7C,MAAM,WAAW,kBAAkB;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACnC,QAAQ,GAAE,MAAM,EAAoB,EACpC,YAAY,GAAE,kBAAuB,GACtC,MAAM,CA2OR"}
@@ -1 +1 @@
1
- {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/plugins/colors.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAA0B,MAAM,UAAU,CAAC;AAe1D,wBAAgB,qBAAqB,CAAC,MAAM,GAAE,MAAM,EAAoC,GAAG,MAAM,CAmDhG;AAED,wBAAgB,2BAA2B,CAAC,MAAM,GAAE,MAAM,EAAoC,GAAG,MAAM,CAmDtG"}
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/plugins/colors.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAA0B,MAAM,UAAU,CAAC;AAe1D,wBAAgB,qBAAqB,CAAC,MAAM,GAAE,MAAM,EAAoC,GAAG,MAAM,CAoDhG;AAED,wBAAgB,2BAA2B,CAAC,MAAM,GAAE,MAAM,EAAoC,GAAG,MAAM,CAoDtG"}
@@ -1,6 +1,6 @@
1
1
  import { Plugin } from '../types';
2
2
  /**
3
- * Image-Plugin mit URL-Eingabe und File-Upload
3
+ * Image plugin with URL input and file upload support.
4
4
  */
5
5
  export declare function createImagePlugin(onImageUpload?: (file: File) => Promise<string>): Plugin;
6
6
  //# sourceMappingURL=image.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/plugins/image.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAA0B,MAAM,UAAU,CAAC;AAc1D;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CA6LzF"}
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/plugins/image.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAA0B,MAAM,UAAU,CAAC;AAe1D;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAwMzF"}
@@ -9,6 +9,10 @@ export declare const strikethroughPlugin: Plugin;
9
9
  export declare const subscriptPlugin: Plugin;
10
10
  export declare const superscriptPlugin: Plugin;
11
11
  export declare const codeInlinePlugin: Plugin;
12
+ /**
13
+ * Horizontal Rule Plugin
14
+ */
15
+ export declare const horizontalRulePlugin: Plugin;
12
16
  export declare const undoPlugin: Plugin;
13
17
  export declare const redoPlugin: Plugin;
14
18
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAA0B,MAAM,EAAE,MAAM,UAAU,CAAC;AAO1D;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,MAKxB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAK1B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAK7B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAKjC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAK7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAK/B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MA8D9B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAKxB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAKxB,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,oBAAoB,EAAE,MAmC3B,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,qBAAqB,EAAE,MA2C5B,CAAC;AAGF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAC;AAevD,eAAO,MAAM,cAAc,EAAE,MAAM,EAUlC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAA0B,MAAM,EAAE,MAAM,UAAU,CAAC;AAO1D;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,MAKxB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAK1B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAK7B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAKjC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAK7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAK/B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MA8D9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAmBlC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAKxB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAKxB,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,oBAAoB,EAAE,MAmC3B,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,qBAAqB,EAAE,MA2C5B,CAAC;AAGF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAC;AAevD,eAAO,MAAM,cAAc,EAAE,MAAM,EAelC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"linkDialog.d.ts","sourceRoot":"","sources":["../../src/plugins/linkDialog.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA0B,MAAM,EAAE,MAAM,UAAU,CAAC;AAa1D;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC5B,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,aAAa,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sEAAsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAChC,yDAAyD;IACzD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iEAAiE;IACjE,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;CACpC;AA+kBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CACpC,OAAO,GAAE,mBAAwB,GAClC,MAAM,CA2BR;AAED,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,EAAE,MAAmC,CAAC"}
1
+ {"version":3,"file":"linkDialog.d.ts","sourceRoot":"","sources":["../../src/plugins/linkDialog.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA0B,MAAM,EAAE,MAAM,UAAU,CAAC;AAc1D;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC5B,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,aAAa,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sEAAsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAChC,yDAAyD;IACzD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iEAAiE;IACjE,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;CACpC;AAklBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CACpC,OAAO,GAAE,mBAAwB,GAClC,MAAM,CA2BR;AAED,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,EAAE,MAAmC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"optional.d.ts","sourceRoot":"","sources":["../../src/plugins/optional.tsx"],"names":[],"mappings":"AACA,OAAO,EAA0B,MAAM,EAAE,MAAM,UAAU,CAAC;AAE1D;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CA+FzC;AAED,eAAO,MAAM,UAAU,QAAqB,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MA0D9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAiCjC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAiC/B,CAAC"}
1
+ {"version":3,"file":"optional.d.ts","sourceRoot":"","sources":["../../src/plugins/optional.tsx"],"names":[],"mappings":"AACA,OAAO,EAA0B,MAAM,EAAE,MAAM,UAAU,CAAC;AAG1D;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CA+FzC;AAED,eAAO,MAAM,UAAU,QAAqB,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MA0D9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAiCjC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAiC/B,CAAC"}
package/dist/styles.css CHANGED
@@ -9,9 +9,9 @@
9
9
  --rte-content-bg: #ffffff;
10
10
  --rte-text-color: #111827;
11
11
  --rte-text-secondary: #6b7280;
12
- --rte-primary-color: #3b82f6;
13
- --rte-primary-hover: #2563eb;
14
- --rte-primary-light: rgba(59, 130, 246, 0.15);
12
+ --rte-primary-color: #339192;
13
+ --rte-primary-hover: #2a7a7b;
14
+ --rte-primary-light: rgba(51, 145, 146, 0.15);
15
15
  --rte-danger-color: #dc2626;
16
16
  --rte-danger-light: #fef2f2;
17
17
  --rte-danger-border: #fca5a5;
@@ -98,6 +98,35 @@
98
98
  flex-shrink: 0;
99
99
  }
100
100
 
101
+ /* Floating Toolbar (appears on text selection) */
102
+ .rte-floating-toolbar {
103
+ z-index: 1001;
104
+ background: var(--rte-content-bg);
105
+ border: 1px solid var(--rte-border-color);
106
+ border-radius: 8px;
107
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.04);
108
+ padding: var(--rte-padding-xs);
109
+ animation: rte-float-in 0.12s ease-out;
110
+ pointer-events: auto;
111
+ }
112
+
113
+ @keyframes rte-float-in {
114
+ from {
115
+ opacity: 0;
116
+ transform: translateY(4px);
117
+ }
118
+ to {
119
+ opacity: 1;
120
+ transform: translateY(0);
121
+ }
122
+ }
123
+
124
+ .rte-floating-toolbar-content {
125
+ display: flex;
126
+ align-items: center;
127
+ gap: 2px;
128
+ }
129
+
101
130
  /* Toolbar Buttons - Ghost/Subtle Style */
102
131
  .rte-toolbar-button {
103
132
  display: flex;
@@ -276,11 +305,11 @@
276
305
  content: "";
277
306
  position: absolute;
278
307
  left: -24px;
279
- top: 2px;
280
- width: 18px;
281
- height: 18px;
282
- border: 2px solid var(--rte-primary-color, #000);
283
- border-radius: 3px;
308
+ top: 3px;
309
+ width: 16px;
310
+ height: 16px;
311
+ border: 2px solid var(--rte-primary-color);
312
+ border-radius: 4px;
284
313
  background-color: transparent;
285
314
  cursor: pointer;
286
315
  -webkit-user-select: none;
@@ -288,27 +317,32 @@
288
317
  user-select: none;
289
318
  z-index: 101;
290
319
  pointer-events: none;
320
+ transition: all 0.15s ease;
321
+ box-sizing: border-box;
291
322
  }
292
323
 
293
324
  /* Checked state: show checkmark */
294
325
  .rte-editor li[role="checkbox"][aria-checked="true"]::before {
295
- background-color: var(--rte-primary-color, #000);
296
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='white' d='M10 3L4.5 8.5L2 6' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
326
+ background-color: var(--rte-primary-color);
327
+ border-color: var(--rte-primary-color);
328
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E");
297
329
  background-repeat: no-repeat;
298
330
  background-position: center;
299
- background-size: 12px 12px;
331
+ background-size: 10px 10px;
300
332
  }
301
333
 
302
334
  /* Checked state: strikethrough + reduced opacity */
303
335
  .rte-editor li[role="checkbox"][aria-checked="true"] {
304
- opacity: 0.6;
336
+ opacity: 0.55;
305
337
  text-decoration: line-through;
338
+ text-decoration-color: var(--rte-text-secondary);
306
339
  }
307
340
 
308
341
  /* Focus state */
309
342
  .rte-editor li[role="checkbox"]:focus {
310
- outline: 2px solid var(--rte-primary-color, #000);
343
+ outline: 2px solid var(--rte-primary-color);
311
344
  outline-offset: 2px;
345
+ border-radius: 2px;
312
346
  }
313
347
 
314
348
  /* RTL support */
@@ -1079,6 +1113,20 @@
1079
1113
  Inline code, sub, sup styles
1080
1114
  ═══════════════════════════════════════════════════════════════════ */
1081
1115
 
1116
+ .rte-editor pre,
1117
+ .rte-content pre {
1118
+ background: rgba(0, 0, 0, 0.06);
1119
+ padding: 12px 16px;
1120
+ border-radius: 6px;
1121
+ font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
1122
+ font-size: 0.9em;
1123
+ overflow-x: auto;
1124
+ white-space: pre-wrap;
1125
+ word-wrap: break-word;
1126
+ margin: 8px 0;
1127
+ border: 1px solid rgba(0, 0, 0, 0.08);
1128
+ }
1129
+
1082
1130
  .rte-content code {
1083
1131
  background: rgba(0, 0, 0, 0.06);
1084
1132
  padding: 2px 5px;
@@ -1096,3 +1144,152 @@
1096
1144
  font-size: 0.75em;
1097
1145
  vertical-align: super;
1098
1146
  }
1147
+
1148
+ /* ═══════════════════════════════════════════════════════════════════════
1149
+ Read-Only Mode
1150
+ ═══════════════════════════════════════════════════════════════════ */
1151
+
1152
+ .rte-container-readonly {
1153
+ border-color: transparent;
1154
+ box-shadow: none;
1155
+ }
1156
+
1157
+ .rte-editor-readonly {
1158
+ cursor: default;
1159
+ background: transparent;
1160
+ }
1161
+
1162
+ /* ═══════════════════════════════════════════════════════════════════════
1163
+ Word Count
1164
+ ═══════════════════════════════════════════════════════════════════ */
1165
+
1166
+ .rte-word-count {
1167
+ display: flex;
1168
+ justify-content: flex-end;
1169
+ padding: var(--rte-padding-sm) var(--rte-padding-lg);
1170
+ font-size: 12px;
1171
+ color: var(--rte-text-secondary);
1172
+ border-top: 1px solid var(--rte-border-color);
1173
+ background: var(--rte-toolbar-bg);
1174
+ border-bottom-left-radius: var(--rte-border-radius);
1175
+ border-bottom-right-radius: var(--rte-border-radius);
1176
+ }
1177
+
1178
+ /* ═══════════════════════════════════════════════════════════════════════
1179
+ Horizontal Rule
1180
+ ═══════════════════════════════════════════════════════════════════ */
1181
+
1182
+ .rte-editor hr {
1183
+ border: none;
1184
+ border-top: 2px solid var(--rte-border-color);
1185
+ margin: var(--rte-padding-xl) 0;
1186
+ }
1187
+
1188
+ /* ═══════════════════════════════════════════════════════════════════════
1189
+ Link Hover Tooltip
1190
+ ═══════════════════════════════════════════════════════════════════ */
1191
+
1192
+ .rte-link-tooltip {
1193
+ position: fixed;
1194
+ z-index: 1002;
1195
+ background: var(--rte-content-bg);
1196
+ border: 1px solid var(--rte-border-color);
1197
+ border-radius: 6px;
1198
+ box-shadow: var(--rte-shadow-md);
1199
+ padding: var(--rte-padding-sm) var(--rte-padding-md);
1200
+ font-size: 13px;
1201
+ display: flex;
1202
+ align-items: center;
1203
+ gap: var(--rte-padding-md);
1204
+ max-width: 400px;
1205
+ animation: rte-float-in 0.1s ease-out;
1206
+ }
1207
+
1208
+ .rte-link-tooltip-url {
1209
+ color: var(--rte-text-secondary);
1210
+ overflow: hidden;
1211
+ text-overflow: ellipsis;
1212
+ white-space: nowrap;
1213
+ max-width: 250px;
1214
+ font-family: var(--rte-font-family);
1215
+ }
1216
+
1217
+ .rte-link-tooltip-actions {
1218
+ display: flex;
1219
+ gap: 2px;
1220
+ flex-shrink: 0;
1221
+ }
1222
+
1223
+ .rte-link-tooltip-btn {
1224
+ display: flex;
1225
+ align-items: center;
1226
+ justify-content: center;
1227
+ width: 28px;
1228
+ height: 28px;
1229
+ border: none;
1230
+ background: transparent;
1231
+ border-radius: 4px;
1232
+ cursor: pointer;
1233
+ color: var(--rte-text-secondary);
1234
+ transition: all 0.15s ease;
1235
+ }
1236
+
1237
+ .rte-link-tooltip-btn:hover {
1238
+ background: var(--rte-button-hover-bg);
1239
+ color: var(--rte-primary-color);
1240
+ }
1241
+
1242
+ /* ═══════════════════════════════════════════════════════════════════════
1243
+ Custom Color Input
1244
+ ═══════════════════════════════════════════════════════════════════ */
1245
+
1246
+ .rte-color-custom-input {
1247
+ display: flex;
1248
+ align-items: center;
1249
+ gap: var(--rte-padding-sm);
1250
+ padding: var(--rte-padding-sm) var(--rte-padding-md);
1251
+ margin-top: var(--rte-padding-xs);
1252
+ border-top: 1px solid var(--rte-border-color);
1253
+ }
1254
+
1255
+ .rte-color-custom-input input[type="text"] {
1256
+ flex: 1;
1257
+ padding: var(--rte-padding-xs) var(--rte-padding-sm);
1258
+ border: 1px solid var(--rte-border-color);
1259
+ border-radius: 4px;
1260
+ font-size: 12px;
1261
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
1262
+ outline: none;
1263
+ min-width: 0;
1264
+ }
1265
+
1266
+ .rte-color-custom-input input[type="text"]:focus {
1267
+ border-color: var(--rte-primary-color);
1268
+ box-shadow: 0 0 0 2px var(--rte-primary-light);
1269
+ }
1270
+
1271
+ .rte-color-custom-input input[type="color"] {
1272
+ width: 24px;
1273
+ height: 24px;
1274
+ border: 1px solid var(--rte-border-color);
1275
+ border-radius: 4px;
1276
+ padding: 0;
1277
+ cursor: pointer;
1278
+ background: transparent;
1279
+ }
1280
+
1281
+ .rte-color-custom-apply {
1282
+ padding: var(--rte-padding-xs) var(--rte-padding-sm);
1283
+ border: none;
1284
+ background: var(--rte-primary-color);
1285
+ color: white;
1286
+ border-radius: 4px;
1287
+ font-size: 12px;
1288
+ cursor: pointer;
1289
+ font-weight: 500;
1290
+ transition: background 0.15s;
1291
+ }
1292
+
1293
+ .rte-color-custom-apply:hover {
1294
+ background: var(--rte-primary-hover);
1295
+ }
package/dist/types.d.ts CHANGED
@@ -13,7 +13,7 @@ export interface Plugin {
13
13
  command?: string;
14
14
  renderButton?: (props: ButtonProps & {
15
15
  [key: string]: unknown;
16
- }) => React.ReactElement;
16
+ }) => React.ReactNode;
17
17
  execute?: (editor: EditorAPI, value?: string) => void;
18
18
  isActive?: (editor: EditorAPI) => boolean;
19
19
  canExecute?: (editor: EditorAPI) => boolean;
@@ -46,10 +46,14 @@ export interface EditorAPI {
46
46
  clearLinks: () => void;
47
47
  indentListItem: () => void;
48
48
  outdentListItem: () => void;
49
+ getTextStats: () => {
50
+ characters: number;
51
+ words: number;
52
+ };
49
53
  }
50
54
  export interface CustomRenderer {
51
- renderNode?: (node: EditorNode, children: React.ReactNode) => React.ReactElement | null;
52
- renderMark?: (mark: string, attributes: Record<string, string>, children: React.ReactNode) => React.ReactElement | null;
55
+ renderNode?: (node: EditorNode, children: React.ReactNode) => React.ReactNode;
56
+ renderMark?: (mark: string, attributes: Record<string, string>, children: React.ReactNode) => React.ReactNode;
53
57
  }
54
58
  export interface EditorProps {
55
59
  initialContent?: EditorContent;
@@ -67,7 +71,7 @@ export interface EditorProps {
67
71
  fontSizes?: number[];
68
72
  colors?: string[];
69
73
  headings?: string[];
70
- customHeadingRenderer?: (level: string, children: React.ReactNode) => React.ReactElement;
74
+ customHeadingRenderer?: (level: string, children: React.ReactNode) => React.ReactNode;
71
75
  customRenderer?: CustomRenderer;
72
76
  onEditorAPIReady?: (api: EditorAPI) => void;
73
77
  theme?: {
@@ -81,5 +85,10 @@ export interface EditorProps {
81
85
  onImageUpload?: (file: File) => Promise<string>;
82
86
  settings?: import('./utils/settings').EditorSettings;
83
87
  settingsOptions?: import('./utils/settings').BuildPluginsOptions;
88
+ readOnly?: boolean;
89
+ onFocus?: () => void;
90
+ onBlur?: () => void;
91
+ maxLength?: number;
92
+ showWordCount?: boolean;
84
93
  }
85
94
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,KAAK,KAAK,CAAC,YAAY,CAAC;IACvF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC;IAC1C,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC;IAE5C,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,GAAG,SAAS,CAAC;CAC7D;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7D,YAAY,EAAE,MAAM,SAAS,GAAG,IAAI,CAAC;IACrC,UAAU,EAAE,MAAM,aAAa,CAAC;IAChC,UAAU,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAC7C,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IACzE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IAC1E,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,OAAO,EAAE,MAAM,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,OAAO,CAAC;IAEvB,UAAU,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,aAAa,CAAC;IAClD,UAAU,EAAE,MAAM,MAAM,CAAC;IAEzB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,IAAI,CAAC;IAEvB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;IACxF,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;CACzH;AAED,MAAM,WAAW,WAAW;IAC1B,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,mBAAmB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IAE/G,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,YAAY,CAAC;IAEzF,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC;IAE5C,KAAK,CAAC,EAAE;QACN,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IAEF,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhD,QAAQ,CAAC,EAAE,OAAO,kBAAkB,EAAE,cAAc,CAAC;IAErD,eAAe,CAAC,EAAE,OAAO,kBAAkB,EAAE,mBAAmB,CAAC;CAClE"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Auto-link utility.
3
+ *
4
+ * Detects URLs in text nodes and wraps them in <a> tags.
5
+ * Triggered after space/enter when the preceding word looks like a URL.
6
+ */
7
+ /**
8
+ * Check if the word before the cursor is a URL and wrap it in an <a> tag.
9
+ * Called on space/enter keypress in the editor.
10
+ */
11
+ export declare function handleAutoLink(editor: HTMLElement, e: KeyboardEvent): boolean;
12
+ //# sourceMappingURL=autoLink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoLink.d.ts","sourceRoot":"","sources":["../../src/utils/autoLink.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,aAAa,GAAG,OAAO,CA8E7E"}
@@ -12,7 +12,7 @@ export declare function contentToDOM(content: EditorContent, container: HTMLElem
12
12
  href: string;
13
13
  children: React.ReactNode;
14
14
  [key: string]: unknown;
15
- }>, customHeadingRenderer?: (level: string, children: React.ReactNode) => React.ReactElement): void;
15
+ }>, customHeadingRenderer?: (level: string, children: React.ReactNode) => React.ReactNode): void;
16
16
  /**
17
17
  * Creates empty editor content with a single paragraph.
18
18
  */
@@ -24,6 +24,7 @@ export declare function contentToHTML(content: EditorContent): string;
24
24
  /**
25
25
  * Converts an HTML string to EditorContent.
26
26
  * Supports Lexical, GitHub, and standard HTML formats.
27
+ * Sanitizes HTML before parsing to prevent XSS.
27
28
  */
28
29
  export declare function htmlToContent(htmlString: string): EditorContent;
29
30
  //# sourceMappingURL=content.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/utils/content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAc,MAAM,UAAU,CAAC;AAIrD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,CAqVhE;AAED;;GAEG;AACH,wBAAgB,YAAY,CACxB,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,WAAW,EACtB,mBAAmB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B,CAAC,EACF,qBAAqB,CAAC,EAAE,CACpB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,KAAK,CAAC,SAAS,KACxB,KAAK,CAAC,YAAY,GACxB,IAAI,CAoHN;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,aAAa,CAIlD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAI5D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAI/D"}
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/utils/content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAc,MAAM,UAAU,CAAC;AA4CrD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,CAqVhE;AAED;;GAEG;AACH,wBAAgB,YAAY,CACxB,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,WAAW,EACtB,mBAAmB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B,CAAC,EACF,qBAAqB,CAAC,EAAE,CACpB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,KAAK,CAAC,SAAS,KACxB,KAAK,CAAC,SAAS,GACrB,IAAI,CAoIN;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,aAAa,CAIlD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAI5D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,CAK/D"}
@@ -1,14 +1,19 @@
1
1
  import { EditorContent } from '../types';
2
+ import { SelectionState } from './selection';
3
+ export interface HistoryEntry {
4
+ content: EditorContent;
5
+ selection: SelectionState | null;
6
+ }
2
7
  export declare class HistoryManager {
3
8
  private history;
4
9
  private currentIndex;
5
10
  private maxHistorySize;
6
- push(content: EditorContent): void;
7
- undo(): EditorContent | null;
8
- redo(): EditorContent | null;
11
+ push(content: EditorContent, selection?: SelectionState | null): void;
12
+ undo(): HistoryEntry | null;
13
+ redo(): HistoryEntry | null;
9
14
  canUndo(): boolean;
10
15
  canRedo(): boolean;
11
- getCurrent(): EditorContent | null;
16
+ getCurrent(): HistoryEntry | null;
12
17
  reset(): void;
13
18
  }
14
19
  //# sourceMappingURL=history.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/utils/history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,cAAc,CAAc;IAEpC,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAelC,IAAI,IAAI,aAAa,GAAG,IAAI;IAQ5B,IAAI,IAAI,aAAa,GAAG,IAAI;IAQ5B,OAAO,IAAI,OAAO;IAIlB,OAAO,IAAI,OAAO;IAIlB,UAAU,IAAI,aAAa,GAAG,IAAI;IAOlC,KAAK,IAAI,IAAI;CAId"}
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/utils/history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,aAAa,CAAC;IACvB,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;CAClC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,cAAc,CAAc;IAEpC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,GAAE,cAAc,GAAG,IAAW,GAAG,IAAI;IAkB3E,IAAI,IAAI,YAAY,GAAG,IAAI;IAY3B,IAAI,IAAI,YAAY,GAAG,IAAI;IAY3B,OAAO,IAAI,OAAO;IAIlB,OAAO,IAAI,OAAO;IAIlB,UAAU,IAAI,YAAY,GAAG,IAAI;IAWjC,KAAK,IAAI,IAAI;CAId"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Markdown-style input shortcuts.
3
+ *
4
+ * Detects markdown patterns at the start of a block element
5
+ * (after a Space key press) and auto-converts them:
6
+ * # through ###### → H1–H6
7
+ * - or * → Bullet list
8
+ * 1. → Numbered list
9
+ * > → Blockquote
10
+ * [] → Checkbox list
11
+ * ``` → Code block (<pre>)
12
+ * --- → Horizontal rule (<hr>)
13
+ */
14
+ export declare function handleMarkdownShortcut(editor: HTMLElement, e: KeyboardEvent): boolean;
15
+ //# sourceMappingURL=markdownShortcuts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdownShortcuts.d.ts","sourceRoot":"","sources":["../../src/utils/markdownShortcuts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,wBAAgB,sBAAsB,CAClC,MAAM,EAAE,WAAW,EACnB,CAAC,EAAE,aAAa,GACjB,OAAO,CAsIT"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Lightweight HTML sanitizer (no external dependencies).
3
+ *
4
+ * Uses an allowlist approach to strip dangerous elements and attributes
5
+ * from pasted/imported HTML before it enters the editor.
6
+ */
7
+ /**
8
+ * Check if a URL is safe to set as href/src.
9
+ * Blocks javascript:, data:, vbscript:, and unknown schemes.
10
+ * Strips control characters before checking.
11
+ */
12
+ export declare function isUrlSafe(url: string): boolean;
13
+ /**
14
+ * Sanitize an HTML string by stripping dangerous tags and attributes.
15
+ *
16
+ * @param html - Raw HTML string
17
+ * @returns Sanitized HTML string
18
+ */
19
+ export declare function sanitizeHtml(html: string): string;
20
+ //# sourceMappingURL=sanitize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0CH;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAS9C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQjD"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Path-based selection serialization and restoration.
3
+ *
4
+ * DOM Range references become invalid after innerHTML replacement (undo/redo).
5
+ * This module converts a live selection into a serializable path representation
6
+ * (child indices from editor root to target node + character offset) and can
7
+ * restore that path back to a live DOM selection after the DOM has been rebuilt
8
+ * with identical structure.
9
+ */
10
+ export interface SelectionPoint {
11
+ path: number[];
12
+ offset: number;
13
+ }
14
+ export interface SelectionState {
15
+ anchor: SelectionPoint;
16
+ focus: SelectionPoint;
17
+ }
18
+ /**
19
+ * Serialize the current window selection relative to `editor`.
20
+ * Returns null if there is no selection or it is outside the editor.
21
+ */
22
+ export declare function serializeSelection(editor: HTMLElement): SelectionState | null;
23
+ /**
24
+ * Restore a previously serialized selection on `editor`.
25
+ * Silently does nothing if the paths no longer match the DOM.
26
+ */
27
+ export declare function restoreSerializedSelection(editor: HTMLElement, state: SelectionState | null): void;
28
+ //# sourceMappingURL=selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/utils/selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,cAAc,CAAC;CACzB;AA6CD;;;GAGG;AACH,wBAAgB,kBAAkB,CAC9B,MAAM,EAAE,WAAW,GACpB,cAAc,GAAG,IAAI,CAsBvB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACtC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,cAAc,GAAG,IAAI,GAC7B,IAAI,CAiCN"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@overlap/rte",
3
- "version": "0.1.10",
3
+ "version": "1.0.0",
4
4
  "description": "A lightweight, extensible Rich Text Editor for React",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -35,9 +35,6 @@
35
35
  "react": ">=18.0.0",
36
36
  "react-dom": ">=18.0.0"
37
37
  },
38
- "dependencies": {
39
- "tslib": "^2.8.1"
40
- },
41
38
  "devDependencies": {
42
39
  "@rollup/plugin-commonjs": "^25.0.7",
43
40
  "@rollup/plugin-node-resolve": "^15.2.3",