@overlap/rte 0.1.10 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Dropdown.d.ts +1 -0
- package/dist/components/Dropdown.d.ts.map +1 -1
- package/dist/components/Editor.d.ts.map +1 -1
- package/dist/components/FloatingToolbar.d.ts +4 -0
- package/dist/components/FloatingToolbar.d.ts.map +1 -1
- package/dist/components/Icons.d.ts +3 -0
- package/dist/components/Icons.d.ts.map +1 -1
- package/dist/components/LinkTooltip.d.ts +11 -0
- package/dist/components/LinkTooltip.d.ts.map +1 -0
- package/dist/components/Toolbar.d.ts.map +1 -1
- package/dist/hooks/useCheckbox.d.ts +3 -1
- package/dist/hooks/useCheckbox.d.ts.map +1 -1
- package/dist/hooks/useEditorEvents.d.ts +7 -3
- package/dist/hooks/useEditorEvents.d.ts.map +1 -1
- package/dist/hooks/useEditorInit.d.ts +7 -3
- package/dist/hooks/useEditorInit.d.ts.map +1 -1
- package/dist/hooks/useEditorSelection.d.ts +3 -1
- package/dist/hooks/useEditorSelection.d.ts.map +1 -1
- package/dist/index.d.ts +82 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +3762 -2749
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +3766 -2748
- package/dist/index.js.map +1 -1
- package/dist/plugins/blockFormat.d.ts.map +1 -1
- package/dist/plugins/colors.d.ts.map +1 -1
- package/dist/plugins/index.d.ts +4 -0
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/styles.css +210 -13
- package/dist/types.d.ts +13 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/autoLink.d.ts +12 -0
- package/dist/utils/autoLink.d.ts.map +1 -0
- package/dist/utils/content.d.ts +1 -1
- package/dist/utils/content.d.ts.map +1 -1
- package/dist/utils/history.d.ts +9 -4
- package/dist/utils/history.d.ts.map +1 -1
- package/dist/utils/markdownShortcuts.d.ts +15 -0
- package/dist/utils/markdownShortcuts.d.ts.map +1 -0
- package/dist/utils/sanitize.d.ts +14 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/selection.d.ts +28 -0
- package/dist/utils/selection.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -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,
|
|
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,
|
|
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"}
|
package/dist/plugins/index.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
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: #
|
|
13
|
-
--rte-primary-hover: #
|
|
14
|
-
--rte-primary-light: rgba(
|
|
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:
|
|
280
|
-
width:
|
|
281
|
-
height:
|
|
282
|
-
border: 2px solid var(--rte-primary-color
|
|
283
|
-
border-radius:
|
|
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
|
|
296
|
-
|
|
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:
|
|
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.
|
|
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
|
|
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.
|
|
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.
|
|
52
|
-
renderMark?: (mark: string, attributes: Record<string, string>, children: React.ReactNode) => React.
|
|
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.
|
|
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
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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,
|
|
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;AAKH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,aAAa,GAAG,OAAO,CA2E7E"}
|
package/dist/utils/content.d.ts
CHANGED
|
@@ -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.
|
|
15
|
+
}>, customHeadingRenderer?: (level: string, children: React.ReactNode) => React.ReactNode): void;
|
|
16
16
|
/**
|
|
17
17
|
* Creates empty editor content with a single paragraph.
|
|
18
18
|
*/
|
|
@@ -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,
|
|
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,SAAS,GACrB,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"}
|
package/dist/utils/history.d.ts
CHANGED
|
@@ -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():
|
|
8
|
-
redo():
|
|
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():
|
|
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;
|
|
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,14 @@
|
|
|
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
|
+
* Sanitize an HTML string by stripping dangerous tags and attributes.
|
|
9
|
+
*
|
|
10
|
+
* @param html - Raw HTML string
|
|
11
|
+
* @returns Sanitized HTML string
|
|
12
|
+
*/
|
|
13
|
+
export declare function sanitizeHtml(html: string): string;
|
|
14
|
+
//# 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;AAmCH;;;;;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"}
|