react-native-richify 1.0.3 → 1.0.5
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/lib/commonjs/components/RenderedOutput.js +168 -0
- package/lib/commonjs/components/RenderedOutput.js.map +1 -0
- package/lib/commonjs/components/RichTextInput.js +196 -52
- package/lib/commonjs/components/RichTextInput.js.map +1 -1
- package/lib/commonjs/components/Toolbar.js +41 -2
- package/lib/commonjs/components/Toolbar.js.map +1 -1
- package/lib/commonjs/constants/defaultStyles.js +81 -2
- package/lib/commonjs/constants/defaultStyles.js.map +1 -1
- package/lib/commonjs/hooks/useFormatting.js +46 -2
- package/lib/commonjs/hooks/useFormatting.js.map +1 -1
- package/lib/commonjs/hooks/useRichText.js +130 -12
- package/lib/commonjs/hooks/useRichText.js.map +1 -1
- package/lib/commonjs/index.d.js +19 -0
- package/lib/commonjs/index.d.js.map +1 -1
- package/lib/commonjs/index.js +19 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/utils/formatter.js +48 -12
- package/lib/commonjs/utils/formatter.js.map +1 -1
- package/lib/commonjs/utils/parser.js +1 -1
- package/lib/commonjs/utils/parser.js.map +1 -1
- package/lib/commonjs/utils/serializer.d.js +6 -0
- package/lib/commonjs/utils/serializer.d.js.map +1 -0
- package/lib/commonjs/utils/serializer.js +259 -0
- package/lib/commonjs/utils/serializer.js.map +1 -0
- package/lib/commonjs/utils/styleMapper.js +11 -0
- package/lib/commonjs/utils/styleMapper.js.map +1 -1
- package/lib/module/components/RenderedOutput.js +163 -0
- package/lib/module/components/RenderedOutput.js.map +1 -0
- package/lib/module/components/RichTextInput.js +198 -55
- package/lib/module/components/RichTextInput.js.map +1 -1
- package/lib/module/components/Toolbar.js +41 -2
- package/lib/module/components/Toolbar.js.map +1 -1
- package/lib/module/constants/defaultStyles.js +81 -2
- package/lib/module/constants/defaultStyles.js.map +1 -1
- package/lib/module/hooks/useFormatting.js +47 -3
- package/lib/module/hooks/useFormatting.js.map +1 -1
- package/lib/module/hooks/useRichText.js +130 -12
- package/lib/module/hooks/useRichText.js.map +1 -1
- package/lib/module/index.d.js +1 -0
- package/lib/module/index.d.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/utils/formatter.js +46 -12
- package/lib/module/utils/formatter.js.map +1 -1
- package/lib/module/utils/parser.js +1 -1
- package/lib/module/utils/parser.js.map +1 -1
- package/lib/module/utils/serializer.d.js +4 -0
- package/lib/module/utils/serializer.d.js.map +1 -0
- package/lib/module/utils/serializer.js +253 -0
- package/lib/module/utils/serializer.js.map +1 -0
- package/lib/module/utils/styleMapper.js +11 -0
- package/lib/module/utils/styleMapper.js.map +1 -1
- package/lib/typescript/src/components/RenderedOutput.d.ts +9 -0
- package/lib/typescript/src/components/RenderedOutput.d.ts.map +1 -0
- package/lib/typescript/src/components/RichTextInput.d.ts +2 -13
- package/lib/typescript/src/components/RichTextInput.d.ts.map +1 -1
- package/lib/typescript/src/components/Toolbar.d.ts.map +1 -1
- package/lib/typescript/src/constants/defaultStyles.d.ts +3 -0
- package/lib/typescript/src/constants/defaultStyles.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useFormatting.d.ts +4 -1
- package/lib/typescript/src/hooks/useFormatting.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRichText.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/types/index.d.ts +112 -1
- package/lib/typescript/src/types/index.d.ts.map +1 -1
- package/lib/typescript/src/utils/formatter.d.ts +9 -1
- package/lib/typescript/src/utils/formatter.d.ts.map +1 -1
- package/lib/typescript/src/utils/parser.d.ts.map +1 -1
- package/lib/typescript/src/utils/serializer.d.ts +14 -0
- package/lib/typescript/src/utils/serializer.d.ts.map +1 -0
- package/lib/typescript/src/utils/styleMapper.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/RenderedOutput.tsx +231 -0
- package/src/components/RichTextInput.d.ts +3 -14
- package/src/components/RichTextInput.tsx +291 -56
- package/src/components/Toolbar.tsx +54 -2
- package/src/constants/defaultStyles.d.ts +3 -0
- package/src/constants/defaultStyles.ts +47 -1
- package/src/hooks/useFormatting.ts +89 -2
- package/src/hooks/useRichText.ts +193 -11
- package/src/index.d.ts +2 -1
- package/src/index.ts +10 -0
- package/src/types/index.d.ts +112 -1
- package/src/types/index.ts +123 -1
- package/src/utils/formatter.ts +60 -10
- package/src/utils/parser.ts +6 -1
- package/src/utils/serializer.d.ts +13 -0
- package/src/utils/serializer.ts +365 -0
- package/src/utils/styleMapper.ts +21 -0
|
@@ -10,6 +10,9 @@ export const DEFAULT_COLORS = {
|
|
|
10
10
|
placeholder: '#9CA3AF',
|
|
11
11
|
toolbarBackground: '#F9FAFB',
|
|
12
12
|
toolbarBorder: '#E5E7EB',
|
|
13
|
+
outputBackground: '#F8FAFC',
|
|
14
|
+
outputLabel: '#475569',
|
|
15
|
+
link: '#2563EB',
|
|
13
16
|
cursor: '#6366F1',
|
|
14
17
|
activeButtonBg: '#EEF2FF',
|
|
15
18
|
codeBackground: '#F3F4F6'
|
|
@@ -47,7 +50,12 @@ export const EMPTY_FORMAT_STYLE = {
|
|
|
47
50
|
color: undefined,
|
|
48
51
|
backgroundColor: undefined,
|
|
49
52
|
fontSize: undefined,
|
|
50
|
-
heading: undefined
|
|
53
|
+
heading: undefined,
|
|
54
|
+
listType: undefined,
|
|
55
|
+
textAlign: undefined,
|
|
56
|
+
link: undefined,
|
|
57
|
+
imageSrc: undefined,
|
|
58
|
+
imageAlt: undefined
|
|
51
59
|
};
|
|
52
60
|
|
|
53
61
|
/**
|
|
@@ -64,7 +72,7 @@ export const DEFAULT_THEME = {
|
|
|
64
72
|
inputStyle: {
|
|
65
73
|
fontSize: DEFAULT_BASE_TEXT_STYLE.fontSize,
|
|
66
74
|
lineHeight: DEFAULT_BASE_TEXT_STYLE.lineHeight,
|
|
67
|
-
color:
|
|
75
|
+
color: DEFAULT_COLORS.text,
|
|
68
76
|
paddingHorizontal: 16,
|
|
69
77
|
paddingVertical: 12,
|
|
70
78
|
textAlignVertical: 'top'
|
|
@@ -83,6 +91,32 @@ export const DEFAULT_THEME = {
|
|
|
83
91
|
lineHeight: DEFAULT_BASE_TEXT_STYLE.lineHeight,
|
|
84
92
|
color: DEFAULT_COLORS.text
|
|
85
93
|
},
|
|
94
|
+
outputContainerStyle: {
|
|
95
|
+
marginHorizontal: 12,
|
|
96
|
+
marginBottom: 12,
|
|
97
|
+
padding: 12,
|
|
98
|
+
borderRadius: 10,
|
|
99
|
+
borderWidth: 1,
|
|
100
|
+
borderColor: DEFAULT_COLORS.toolbarBorder,
|
|
101
|
+
backgroundColor: DEFAULT_COLORS.outputBackground
|
|
102
|
+
},
|
|
103
|
+
outputLabelStyle: {
|
|
104
|
+
marginBottom: 8,
|
|
105
|
+
fontSize: 12,
|
|
106
|
+
fontWeight: '700',
|
|
107
|
+
letterSpacing: 0.4,
|
|
108
|
+
color: DEFAULT_COLORS.outputLabel,
|
|
109
|
+
textTransform: 'uppercase'
|
|
110
|
+
},
|
|
111
|
+
outputTextStyle: {
|
|
112
|
+
fontSize: 14,
|
|
113
|
+
lineHeight: 20,
|
|
114
|
+
color: DEFAULT_COLORS.text,
|
|
115
|
+
fontFamily: 'monospace'
|
|
116
|
+
},
|
|
117
|
+
renderedOutputStyle: {
|
|
118
|
+
gap: 10
|
|
119
|
+
},
|
|
86
120
|
toolbarStyle: {
|
|
87
121
|
flexDirection: 'row',
|
|
88
122
|
alignItems: 'center',
|
|
@@ -125,6 +159,7 @@ export const DEFAULT_THEME = {
|
|
|
125
159
|
placeholder: DEFAULT_COLORS.placeholder,
|
|
126
160
|
toolbarBackground: DEFAULT_COLORS.toolbarBackground,
|
|
127
161
|
toolbarBorder: DEFAULT_COLORS.toolbarBorder,
|
|
162
|
+
link: DEFAULT_COLORS.link,
|
|
128
163
|
cursor: DEFAULT_COLORS.cursor
|
|
129
164
|
}
|
|
130
165
|
};
|
|
@@ -164,5 +199,49 @@ export const DEFAULT_TOOLBAR_ITEMS = [{
|
|
|
164
199
|
id: 'h3',
|
|
165
200
|
label: 'H3',
|
|
166
201
|
heading: 'h3'
|
|
202
|
+
}, {
|
|
203
|
+
id: 'bullet',
|
|
204
|
+
label: '\u2022',
|
|
205
|
+
listType: 'bullet'
|
|
206
|
+
}, {
|
|
207
|
+
id: 'ordered',
|
|
208
|
+
label: '1.',
|
|
209
|
+
listType: 'ordered'
|
|
210
|
+
}, {
|
|
211
|
+
id: 'link',
|
|
212
|
+
label: 'Link',
|
|
213
|
+
actionType: 'link'
|
|
214
|
+
}, {
|
|
215
|
+
id: 'image',
|
|
216
|
+
label: 'Img',
|
|
217
|
+
actionType: 'image'
|
|
218
|
+
}, {
|
|
219
|
+
id: 'align-left',
|
|
220
|
+
label: 'L',
|
|
221
|
+
textAlign: 'left'
|
|
222
|
+
}, {
|
|
223
|
+
id: 'align-center',
|
|
224
|
+
label: 'C',
|
|
225
|
+
textAlign: 'center'
|
|
226
|
+
}, {
|
|
227
|
+
id: 'align-right',
|
|
228
|
+
label: 'R',
|
|
229
|
+
textAlign: 'right'
|
|
230
|
+
}, {
|
|
231
|
+
id: 'format-markdown',
|
|
232
|
+
label: 'MD',
|
|
233
|
+
outputFormat: 'markdown'
|
|
234
|
+
}, {
|
|
235
|
+
id: 'format-html',
|
|
236
|
+
label: 'HTML',
|
|
237
|
+
outputFormat: 'html'
|
|
238
|
+
}, {
|
|
239
|
+
id: 'preview-literal',
|
|
240
|
+
label: 'Raw',
|
|
241
|
+
outputPreviewMode: 'literal'
|
|
242
|
+
}, {
|
|
243
|
+
id: 'preview-rendered',
|
|
244
|
+
label: 'View',
|
|
245
|
+
outputPreviewMode: 'rendered'
|
|
167
246
|
}];
|
|
168
247
|
//# sourceMappingURL=defaultStyles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DEFAULT_COLORS","primary","background","text","placeholder","toolbarBackground","toolbarBorder","cursor","activeButtonBg","codeBackground","HEADING_FONT_SIZES","h1","h2","h3","none","DEFAULT_BASE_TEXT_STYLE","fontSize","lineHeight","color","fontFamily","undefined","EMPTY_FORMAT_STYLE","bold","italic","underline","strikethrough","code","backgroundColor","heading","DEFAULT_THEME","containerStyle","borderWidth","borderColor","borderRadius","overflow","inputStyle","paddingHorizontal","paddingVertical","textAlignVertical","overlayContainerStyle","position","top","left","right","bottom","baseTextStyle","
|
|
1
|
+
{"version":3,"names":["DEFAULT_COLORS","primary","background","text","placeholder","toolbarBackground","toolbarBorder","outputBackground","outputLabel","link","cursor","activeButtonBg","codeBackground","HEADING_FONT_SIZES","h1","h2","h3","none","DEFAULT_BASE_TEXT_STYLE","fontSize","lineHeight","color","fontFamily","undefined","EMPTY_FORMAT_STYLE","bold","italic","underline","strikethrough","code","backgroundColor","heading","listType","textAlign","imageSrc","imageAlt","DEFAULT_THEME","containerStyle","borderWidth","borderColor","borderRadius","overflow","inputStyle","paddingHorizontal","paddingVertical","textAlignVertical","overlayContainerStyle","position","top","left","right","bottom","baseTextStyle","outputContainerStyle","marginHorizontal","marginBottom","padding","outputLabelStyle","fontWeight","letterSpacing","textTransform","outputTextStyle","renderedOutputStyle","gap","toolbarStyle","flexDirection","alignItems","toolbarButtonStyle","minWidth","justifyContent","toolbarButtonActiveStyle","toolbarButtonTextStyle","toolbarButtonActiveTextStyle","codeStyle","colors","DEFAULT_TOOLBAR_ITEMS","id","label","format","actionType","outputFormat","outputPreviewMode"],"sourceRoot":"../../../src","sources":["constants/defaultStyles.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import { useCallback } from 'react';
|
|
4
|
-
import { toggleFormatOnSelection, setStyleOnSelection, setHeadingOnLine, isFormatActiveInSelection, getSelectionStyle } from '../utils/formatter';
|
|
4
|
+
import { toggleFormatOnSelection, setStyleOnSelection, setHeadingOnLine, setListTypeOnLine, setTextAlignOnLine, isFormatActiveInSelection, getSelectionStyle } from '../utils/formatter';
|
|
5
5
|
/**
|
|
6
6
|
* Hook that provides formatting commands for the rich text editor.
|
|
7
7
|
*
|
|
@@ -40,9 +40,50 @@ export function useFormatting({
|
|
|
40
40
|
}
|
|
41
41
|
}, [segments, selection, activeStyles, onSegmentsChange, onActiveStylesChange]);
|
|
42
42
|
const setHeading = useCallback(level => {
|
|
43
|
-
const
|
|
43
|
+
const currentHeading = selection.start === selection.end ? getSelectionStyle(segments, selection).heading ?? activeStyles.heading : getSelectionStyle(segments, selection).heading;
|
|
44
|
+
const nextHeading = currentHeading === level ? 'none' : level;
|
|
45
|
+
if (selection.start === selection.end) {
|
|
46
|
+
onActiveStylesChange({
|
|
47
|
+
...activeStyles,
|
|
48
|
+
heading: nextHeading === 'none' ? undefined : nextHeading,
|
|
49
|
+
listType: nextHeading === 'none' ? activeStyles.listType : undefined
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const newSegments = setHeadingOnLine(segments, selection, nextHeading);
|
|
44
53
|
onSegmentsChange(newSegments);
|
|
45
|
-
}, [
|
|
54
|
+
}, [activeStyles, onActiveStylesChange, onSegmentsChange, segments, selection]);
|
|
55
|
+
const setListType = useCallback(listType => {
|
|
56
|
+
if (selection.start === selection.end) {
|
|
57
|
+
onActiveStylesChange({
|
|
58
|
+
...activeStyles,
|
|
59
|
+
listType: listType === 'none' ? undefined : listType,
|
|
60
|
+
heading: listType === 'none' ? activeStyles.heading : undefined
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const newSegments = setListTypeOnLine(segments, selection, listType);
|
|
64
|
+
onSegmentsChange(newSegments);
|
|
65
|
+
}, [activeStyles, onActiveStylesChange, onSegmentsChange, segments, selection]);
|
|
66
|
+
const setTextAlign = useCallback(textAlign => {
|
|
67
|
+
if (selection.start === selection.end) {
|
|
68
|
+
onActiveStylesChange({
|
|
69
|
+
...activeStyles,
|
|
70
|
+
textAlign
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
const newSegments = setTextAlignOnLine(segments, selection, textAlign);
|
|
74
|
+
onSegmentsChange(newSegments);
|
|
75
|
+
}, [activeStyles, onActiveStylesChange, onSegmentsChange, segments, selection]);
|
|
76
|
+
const setLink = useCallback(url => {
|
|
77
|
+
if (selection.start === selection.end) {
|
|
78
|
+
onActiveStylesChange({
|
|
79
|
+
...activeStyles,
|
|
80
|
+
link: url
|
|
81
|
+
});
|
|
82
|
+
} else {
|
|
83
|
+
const newSegments = setStyleOnSelection(segments, selection, 'link', url);
|
|
84
|
+
onSegmentsChange(newSegments);
|
|
85
|
+
}
|
|
86
|
+
}, [segments, selection, activeStyles, onSegmentsChange, onActiveStylesChange]);
|
|
46
87
|
const setColor = useCallback(color => {
|
|
47
88
|
setStyleProperty('color', color);
|
|
48
89
|
}, [setStyleProperty]);
|
|
@@ -68,6 +109,9 @@ export function useFormatting({
|
|
|
68
109
|
toggleFormat,
|
|
69
110
|
setStyleProperty,
|
|
70
111
|
setHeading,
|
|
112
|
+
setListType,
|
|
113
|
+
setTextAlign,
|
|
114
|
+
setLink,
|
|
71
115
|
setColor,
|
|
72
116
|
setBackgroundColor,
|
|
73
117
|
setFontSize,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","toggleFormatOnSelection","setStyleOnSelection","setHeadingOnLine","isFormatActiveInSelection","getSelectionStyle","useFormatting","segments","selection","activeStyles","onSegmentsChange","onActiveStylesChange","toggleFormat","format","start","end","newSegments","setStyleProperty","key","value","setHeading","level","setColor","color","setBackgroundColor","setFontSize","size","isFormatActive","currentSelectionStyle"],"sourceRoot":"../../../src","sources":["hooks/useFormatting.ts"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,OAAO;
|
|
1
|
+
{"version":3,"names":["useCallback","toggleFormatOnSelection","setStyleOnSelection","setHeadingOnLine","setListTypeOnLine","setTextAlignOnLine","isFormatActiveInSelection","getSelectionStyle","useFormatting","segments","selection","activeStyles","onSegmentsChange","onActiveStylesChange","toggleFormat","format","start","end","newSegments","setStyleProperty","key","value","setHeading","level","currentHeading","heading","nextHeading","undefined","listType","setListType","setTextAlign","textAlign","setLink","url","link","setColor","color","setBackgroundColor","setFontSize","size","isFormatActive","currentSelectionStyle"],"sourceRoot":"../../../src","sources":["hooks/useFormatting.ts"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,OAAO;AAUnC,SACEC,uBAAuB,EACvBC,mBAAmB,EACnBC,gBAAgB,EAChBC,iBAAiB,EACjBC,kBAAkB,EAClBC,yBAAyB,EACzBC,iBAAiB,QACZ,oBAAoB;AAU3B;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAAC;EAC5BC,QAAQ;EACRC,SAAS;EACTC,YAAY;EACZC,gBAAgB;EAChBC;AACoB,CAAC,EAAE;EACvB,MAAMC,YAAY,GAAGd,WAAW,CAC7Be,MAAkB,IAAK;IACtB,IAAIL,SAAS,CAACM,KAAK,KAAKN,SAAS,CAACO,GAAG,EAAE;MACrC;MACAJ,oBAAoB,CAAC;QACnB,GAAGF,YAAY;QACf,CAACI,MAAM,GAAG,CAACJ,YAAY,CAACI,MAAM;MAChC,CAAC,CAAC;IACJ,CAAC,MAAM;MACL;MACA,MAAMG,WAAW,GAAGjB,uBAAuB,CACzCQ,QAAQ,EACRC,SAAS,EACTK,MACF,CAAC;MACDH,gBAAgB,CAACM,WAAW,CAAC;IAC/B;EACF,CAAC,EACD,CAACT,QAAQ,EAAEC,SAAS,EAAEC,YAAY,EAAEC,gBAAgB,EAAEC,oBAAoB,CAC5E,CAAC;EAED,MAAMM,gBAAgB,GAAGnB,WAAW,CAClC,CAA8BoB,GAAM,EAAEC,KAAqB,KAAK;IAC9D,IAAIX,SAAS,CAACM,KAAK,KAAKN,SAAS,CAACO,GAAG,EAAE;MACrCJ,oBAAoB,CAAC;QACnB,GAAGF,YAAY;QACf,CAACS,GAAG,GAAGC;MACT,CAAC,CAAC;IACJ,CAAC,MAAM;MACL,MAAMH,WAAW,GAAGhB,mBAAmB,CACrCO,QAAQ,EACRC,SAAS,EACTU,GAAG,EACHC,KACF,CAAC;MACDT,gBAAgB,CAACM,WAAW,CAAC;IAC/B;EACF,CAAC,EACD,CAACT,QAAQ,EAAEC,SAAS,EAAEC,YAAY,EAAEC,gBAAgB,EAAEC,oBAAoB,CAC5E,CAAC;EAED,MAAMS,UAAU,GAAGtB,WAAW,CAC3BuB,KAAmB,IAAK;IACvB,MAAMC,cAAc,GAClBd,SAAS,CAACM,KAAK,KAAKN,SAAS,CAACO,GAAG,GAC7BV,iBAAiB,CAACE,QAAQ,EAAEC,SAAS,CAAC,CAACe,OAAO,IAAId,YAAY,CAACc,OAAO,GACtElB,iBAAiB,CAACE,QAAQ,EAAEC,SAAS,CAAC,CAACe,OAAO;IACpD,MAAMC,WAAyB,GAC7BF,cAAc,KAAKD,KAAK,GAAG,MAAM,GAAGA,KAAK;IAE3C,IAAIb,SAAS,CAACM,KAAK,KAAKN,SAAS,CAACO,GAAG,EAAE;MACrCJ,oBAAoB,CAAC;QACnB,GAAGF,YAAY;QACfc,OAAO,EAAEC,WAAW,KAAK,MAAM,GAAGC,SAAS,GAAGD,WAAW;QACzDE,QAAQ,EACNF,WAAW,KAAK,MAAM,GAAGf,YAAY,CAACiB,QAAQ,GAAGD;MACrD,CAAC,CAAC;IACJ;IAEA,MAAMT,WAAW,GAAGf,gBAAgB,CAACM,QAAQ,EAAEC,SAAS,EAAEgB,WAAW,CAAC;IACtEd,gBAAgB,CAACM,WAAW,CAAC;EAC/B,CAAC,EACD,CACEP,YAAY,EACZE,oBAAoB,EACpBD,gBAAgB,EAChBH,QAAQ,EACRC,SAAS,CAEb,CAAC;EAED,MAAMmB,WAAW,GAAG7B,WAAW,CAC5B4B,QAAkB,IAAK;IACtB,IAAIlB,SAAS,CAACM,KAAK,KAAKN,SAAS,CAACO,GAAG,EAAE;MACrCJ,oBAAoB,CAAC;QACnB,GAAGF,YAAY;QACfiB,QAAQ,EAAEA,QAAQ,KAAK,MAAM,GAAGD,SAAS,GAAGC,QAAQ;QACpDH,OAAO,EAAEG,QAAQ,KAAK,MAAM,GAAGjB,YAAY,CAACc,OAAO,GAAGE;MACxD,CAAC,CAAC;IACJ;IAEA,MAAMT,WAAW,GAAGd,iBAAiB,CAACK,QAAQ,EAAEC,SAAS,EAAEkB,QAAQ,CAAC;IACpEhB,gBAAgB,CAACM,WAAW,CAAC;EAC/B,CAAC,EACD,CACEP,YAAY,EACZE,oBAAoB,EACpBD,gBAAgB,EAChBH,QAAQ,EACRC,SAAS,CAEb,CAAC;EAED,MAAMoB,YAAY,GAAG9B,WAAW,CAC7B+B,SAAoB,IAAK;IACxB,IAAIrB,SAAS,CAACM,KAAK,KAAKN,SAAS,CAACO,GAAG,EAAE;MACrCJ,oBAAoB,CAAC;QACnB,GAAGF,YAAY;QACfoB;MACF,CAAC,CAAC;IACJ;IAEA,MAAMb,WAAW,GAAGb,kBAAkB,CAACI,QAAQ,EAAEC,SAAS,EAAEqB,SAAS,CAAC;IACtEnB,gBAAgB,CAACM,WAAW,CAAC;EAC/B,CAAC,EACD,CACEP,YAAY,EACZE,oBAAoB,EACpBD,gBAAgB,EAChBH,QAAQ,EACRC,SAAS,CAEb,CAAC;EAED,MAAMsB,OAAO,GAAGhC,WAAW,CACxBiC,GAAY,IAAK;IAChB,IAAIvB,SAAS,CAACM,KAAK,KAAKN,SAAS,CAACO,GAAG,EAAE;MACrCJ,oBAAoB,CAAC;QACnB,GAAGF,YAAY;QACfuB,IAAI,EAAED;MACR,CAAC,CAAC;IACJ,CAAC,MAAM;MACL,MAAMf,WAAW,GAAGhB,mBAAmB,CAACO,QAAQ,EAAEC,SAAS,EAAE,MAAM,EAAEuB,GAAG,CAAC;MACzErB,gBAAgB,CAACM,WAAW,CAAC;IAC/B;EACF,CAAC,EACD,CAACT,QAAQ,EAAEC,SAAS,EAAEC,YAAY,EAAEC,gBAAgB,EAAEC,oBAAoB,CAC5E,CAAC;EAED,MAAMsB,QAAQ,GAAGnC,WAAW,CACzBoC,KAAa,IAAK;IACjBjB,gBAAgB,CAAC,OAAO,EAAEiB,KAAK,CAAC;EAClC,CAAC,EACD,CAACjB,gBAAgB,CACnB,CAAC;EAED,MAAMkB,kBAAkB,GAAGrC,WAAW,CACnCoC,KAAa,IAAK;IACjBjB,gBAAgB,CAAC,iBAAiB,EAAEiB,KAAK,CAAC;EAC5C,CAAC,EACD,CAACjB,gBAAgB,CACnB,CAAC;EAED,MAAMmB,WAAW,GAAGtC,WAAW,CAC5BuC,IAAY,IAAK;IAChBpB,gBAAgB,CAAC,UAAU,EAAEoB,IAAI,CAAC;EACpC,CAAC,EACD,CAACpB,gBAAgB,CACnB,CAAC;EAED,MAAMqB,cAAc,GAAGxC,WAAW,CAC/Be,MAAkB,IAAc;IAC/B,IAAIL,SAAS,CAACM,KAAK,KAAKN,SAAS,CAACO,GAAG,EAAE;MACrC,OAAO,CAAC,CAACN,YAAY,CAACI,MAAM,CAAC;IAC/B;IACA,OAAOT,yBAAyB,CAACG,QAAQ,EAAEC,SAAS,EAAEK,MAAM,CAAC;EAC/D,CAAC,EACD,CAACN,QAAQ,EAAEC,SAAS,EAAEC,YAAY,CACpC,CAAC;EAED,MAAM8B,qBAAqB,GAAGzC,WAAW,CAAC,MAAmB;IAC3D,IAAIU,SAAS,CAACM,KAAK,KAAKN,SAAS,CAACO,GAAG,EAAE;MACrC,OAAON,YAAY;IACrB;IACA,OAAOJ,iBAAiB,CAACE,QAAQ,EAAEC,SAAS,CAAC;EAC/C,CAAC,EAAE,CAACD,QAAQ,EAAEC,SAAS,EAAEC,YAAY,CAAC,CAAC;EAEvC,OAAO;IACLG,YAAY;IACZK,gBAAgB;IAChBG,UAAU;IACVO,WAAW;IACXC,YAAY;IACZE,OAAO;IACPG,QAAQ;IACRE,kBAAkB;IAClBC,WAAW;IACXE,cAAc;IACdC;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -4,6 +4,7 @@ import { useState, useCallback, useRef } from 'react';
|
|
|
4
4
|
import { EMPTY_FORMAT_STYLE } from '../constants/defaultStyles';
|
|
5
5
|
import { createSegment, segmentsToPlainText, reconcileTextChange, findPositionInSegments } from '../utils/parser';
|
|
6
6
|
import { getSelectionStyle } from '../utils/formatter';
|
|
7
|
+
import { serializeSegments } from '../utils/serializer';
|
|
7
8
|
import { useSelection } from '../hooks/useSelection';
|
|
8
9
|
import { useFormatting } from '../hooks/useFormatting';
|
|
9
10
|
/**
|
|
@@ -42,6 +43,7 @@ export function useRichText(options = {}) {
|
|
|
42
43
|
selectionRef.current = selection;
|
|
43
44
|
const activeStylesRef = useRef(activeStyles);
|
|
44
45
|
activeStylesRef.current = activeStyles;
|
|
46
|
+
const preserveActiveStylesRef = useRef(false);
|
|
45
47
|
|
|
46
48
|
// ─── Segment Change Handler ──────────────────────────────────────────────
|
|
47
49
|
|
|
@@ -66,7 +68,7 @@ export function useRichText(options = {}) {
|
|
|
66
68
|
const handleTextChange = useCallback(newText => {
|
|
67
69
|
const currentSegments = segmentsRef.current;
|
|
68
70
|
const currentSelection = selectionRef.current;
|
|
69
|
-
const currentActiveStyles = currentSelection.start === currentSelection.end ? activeStylesRef.current : getSelectionStyle(currentSegments, currentSelection);
|
|
71
|
+
const currentActiveStyles = sanitizeTypingStyles(currentSelection.start === currentSelection.end ? activeStylesRef.current : getSelectionStyle(currentSegments, currentSelection));
|
|
70
72
|
const newSegments = reconcileTextChange(currentSegments, newText, currentActiveStyles);
|
|
71
73
|
updateSegments(newSegments);
|
|
72
74
|
}, [updateSegments]);
|
|
@@ -74,16 +76,20 @@ export function useRichText(options = {}) {
|
|
|
74
76
|
// ─── Selection Change Handler ────────────────────────────────────────────
|
|
75
77
|
|
|
76
78
|
const onSelectionChange = useCallback(newSelection => {
|
|
79
|
+
const previousSelection = selectionRef.current;
|
|
77
80
|
handleSelectionChange(newSelection);
|
|
81
|
+
const shouldPreserveActiveStyles = preserveActiveStylesRef.current && previousSelection.start === previousSelection.end && newSelection.start === newSelection.end && newSelection.start >= previousSelection.start && newSelection.start - previousSelection.start <= 1;
|
|
82
|
+
if (shouldPreserveActiveStyles) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
preserveActiveStylesRef.current = false;
|
|
78
86
|
|
|
79
87
|
// Update active styles based on cursor position
|
|
80
88
|
if (newSelection.start === newSelection.end) {
|
|
81
89
|
const pos = findPositionInSegments(segmentsRef.current, newSelection.start);
|
|
82
90
|
if (segmentsRef.current.length > 0) {
|
|
83
91
|
const seg = segmentsRef.current[pos.segmentIndex];
|
|
84
|
-
setActiveStyles(
|
|
85
|
-
...seg.styles
|
|
86
|
-
});
|
|
92
|
+
setActiveStyles(sanitizeTypingStyles(seg.styles));
|
|
87
93
|
}
|
|
88
94
|
}
|
|
89
95
|
}, [handleSelectionChange]);
|
|
@@ -93,19 +99,109 @@ export function useRichText(options = {}) {
|
|
|
93
99
|
const getPlainText = useCallback(() => {
|
|
94
100
|
return segmentsToPlainText(segmentsRef.current);
|
|
95
101
|
}, []);
|
|
102
|
+
const getOutput = useCallback((format = 'markdown') => {
|
|
103
|
+
return serializeSegments(segmentsRef.current, format);
|
|
104
|
+
}, []);
|
|
96
105
|
const exportJSON = useCallback(() => {
|
|
97
106
|
return JSON.parse(JSON.stringify(segmentsRef.current));
|
|
98
107
|
}, []);
|
|
99
108
|
const importJSON = useCallback(newSegments => {
|
|
100
109
|
const safeSegments = newSegments.length > 0 ? newSegments : [createSegment('')];
|
|
101
110
|
updateSegments(safeSegments);
|
|
102
|
-
|
|
111
|
+
handleSelectionChange({
|
|
112
|
+
start: 0,
|
|
113
|
+
end: 0
|
|
114
|
+
});
|
|
115
|
+
setActiveStyles({
|
|
116
|
+
...EMPTY_FORMAT_STYLE
|
|
117
|
+
});
|
|
118
|
+
}, [handleSelectionChange, updateSegments]);
|
|
103
119
|
const clear = useCallback(() => {
|
|
104
120
|
updateSegments([createSegment('')]);
|
|
121
|
+
handleSelectionChange({
|
|
122
|
+
start: 0,
|
|
123
|
+
end: 0
|
|
124
|
+
});
|
|
105
125
|
setActiveStyles({
|
|
106
126
|
...EMPTY_FORMAT_STYLE
|
|
107
127
|
});
|
|
108
|
-
|
|
128
|
+
preserveActiveStylesRef.current = false;
|
|
129
|
+
}, [handleSelectionChange, updateSegments]);
|
|
130
|
+
const toggleFormat = useCallback(format => {
|
|
131
|
+
if (selectionRef.current.start === selectionRef.current.end) {
|
|
132
|
+
preserveActiveStylesRef.current = true;
|
|
133
|
+
}
|
|
134
|
+
formatting.toggleFormat(format);
|
|
135
|
+
}, [formatting]);
|
|
136
|
+
const setStyleProperty = useCallback((key, value) => {
|
|
137
|
+
if (selectionRef.current.start === selectionRef.current.end) {
|
|
138
|
+
preserveActiveStylesRef.current = true;
|
|
139
|
+
}
|
|
140
|
+
formatting.setStyleProperty(key, value);
|
|
141
|
+
}, [formatting]);
|
|
142
|
+
const setHeading = useCallback(level => {
|
|
143
|
+
if (selectionRef.current.start === selectionRef.current.end) {
|
|
144
|
+
preserveActiveStylesRef.current = true;
|
|
145
|
+
}
|
|
146
|
+
formatting.setHeading(level);
|
|
147
|
+
}, [formatting]);
|
|
148
|
+
const setListType = useCallback(type => {
|
|
149
|
+
if (selectionRef.current.start === selectionRef.current.end) {
|
|
150
|
+
preserveActiveStylesRef.current = true;
|
|
151
|
+
}
|
|
152
|
+
formatting.setListType(type);
|
|
153
|
+
}, [formatting]);
|
|
154
|
+
const setTextAlign = useCallback(align => {
|
|
155
|
+
if (selectionRef.current.start === selectionRef.current.end) {
|
|
156
|
+
preserveActiveStylesRef.current = true;
|
|
157
|
+
}
|
|
158
|
+
formatting.setTextAlign(align);
|
|
159
|
+
}, [formatting]);
|
|
160
|
+
const setLink = useCallback(url => {
|
|
161
|
+
if (selectionRef.current.start === selectionRef.current.end) {
|
|
162
|
+
preserveActiveStylesRef.current = true;
|
|
163
|
+
}
|
|
164
|
+
formatting.setLink(url);
|
|
165
|
+
}, [formatting]);
|
|
166
|
+
const setColor = useCallback(color => {
|
|
167
|
+
if (selectionRef.current.start === selectionRef.current.end) {
|
|
168
|
+
preserveActiveStylesRef.current = true;
|
|
169
|
+
}
|
|
170
|
+
formatting.setColor(color);
|
|
171
|
+
}, [formatting]);
|
|
172
|
+
const setBackgroundColor = useCallback(color => {
|
|
173
|
+
if (selectionRef.current.start === selectionRef.current.end) {
|
|
174
|
+
preserveActiveStylesRef.current = true;
|
|
175
|
+
}
|
|
176
|
+
formatting.setBackgroundColor(color);
|
|
177
|
+
}, [formatting]);
|
|
178
|
+
const setFontSize = useCallback(size => {
|
|
179
|
+
if (selectionRef.current.start === selectionRef.current.end) {
|
|
180
|
+
preserveActiveStylesRef.current = true;
|
|
181
|
+
}
|
|
182
|
+
formatting.setFontSize(size);
|
|
183
|
+
}, [formatting]);
|
|
184
|
+
const insertImage = useCallback((source, options) => {
|
|
185
|
+
const currentSegments = segmentsRef.current;
|
|
186
|
+
const currentSelection = selectionRef.current;
|
|
187
|
+
const plainText = segmentsToPlainText(currentSegments);
|
|
188
|
+
const start = Math.min(currentSelection.start, currentSelection.end);
|
|
189
|
+
const end = Math.max(currentSelection.start, currentSelection.end);
|
|
190
|
+
const placeholder = options?.placeholder ?? buildImagePlaceholder(source, options?.alt);
|
|
191
|
+
const nextText = `${plainText.slice(0, start)}${placeholder}${plainText.slice(end)}`;
|
|
192
|
+
const insertionStyles = sanitizeTypingStyles(start === end ? activeStylesRef.current : getSelectionStyle(currentSegments, currentSelection));
|
|
193
|
+
const nextSegments = reconcileTextChange(currentSegments, nextText, {
|
|
194
|
+
...insertionStyles,
|
|
195
|
+
imageSrc: source,
|
|
196
|
+
imageAlt: options?.alt
|
|
197
|
+
});
|
|
198
|
+
updateSegments(nextSegments);
|
|
199
|
+
handleSelectionChange({
|
|
200
|
+
start: start + placeholder.length,
|
|
201
|
+
end: start + placeholder.length
|
|
202
|
+
});
|
|
203
|
+
preserveActiveStylesRef.current = false;
|
|
204
|
+
}, [handleSelectionChange, updateSegments]);
|
|
109
205
|
|
|
110
206
|
// ─── Build Return Value ──────────────────────────────────────────────────
|
|
111
207
|
|
|
@@ -115,16 +211,21 @@ export function useRichText(options = {}) {
|
|
|
115
211
|
activeStyles
|
|
116
212
|
};
|
|
117
213
|
const actions = {
|
|
118
|
-
toggleFormat
|
|
119
|
-
setStyleProperty
|
|
120
|
-
setHeading
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
214
|
+
toggleFormat,
|
|
215
|
+
setStyleProperty,
|
|
216
|
+
setHeading,
|
|
217
|
+
setListType,
|
|
218
|
+
setTextAlign,
|
|
219
|
+
setLink,
|
|
220
|
+
insertImage,
|
|
221
|
+
setColor,
|
|
222
|
+
setBackgroundColor,
|
|
223
|
+
setFontSize,
|
|
124
224
|
handleTextChange,
|
|
125
225
|
handleSelectionChange: onSelectionChange,
|
|
126
226
|
isFormatActive: formatting.isFormatActive,
|
|
127
227
|
getSelectionStyle: formatting.currentSelectionStyle,
|
|
228
|
+
getOutput,
|
|
128
229
|
getPlainText,
|
|
129
230
|
exportJSON,
|
|
130
231
|
importJSON,
|
|
@@ -135,4 +236,21 @@ export function useRichText(options = {}) {
|
|
|
135
236
|
actions
|
|
136
237
|
};
|
|
137
238
|
}
|
|
239
|
+
function sanitizeTypingStyles(style) {
|
|
240
|
+
return {
|
|
241
|
+
...style,
|
|
242
|
+
imageSrc: undefined,
|
|
243
|
+
imageAlt: undefined
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
function buildImagePlaceholder(source, alt) {
|
|
247
|
+
if (alt && alt.trim().length > 0) {
|
|
248
|
+
return `[Image: ${alt.trim()}]`;
|
|
249
|
+
}
|
|
250
|
+
const fileName = source.split('/').pop()?.split('?')[0]?.trim();
|
|
251
|
+
if (fileName) {
|
|
252
|
+
return `[Image: ${fileName}]`;
|
|
253
|
+
}
|
|
254
|
+
return '[Image]';
|
|
255
|
+
}
|
|
138
256
|
//# sourceMappingURL=useRichText.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useState","useCallback","useRef","EMPTY_FORMAT_STYLE","createSegment","segmentsToPlainText","reconcileTextChange","findPositionInSegments","getSelectionStyle","useSelection","useFormatting","useRichText","options","initialSegments","onChangeSegments","onChangeText","segments","setSegments","length","activeStyles","setActiveStyles","selection","handleSelectionChange","segmentsRef","current","selectionRef","activeStylesRef","updateSegments","newSegments","formatting","onSegmentsChange","onActiveStylesChange","handleTextChange","newText","currentSegments","currentSelection","currentActiveStyles","start","end","onSelectionChange","newSelection","pos","seg","segmentIndex","styles","getPlainText","exportJSON","JSON","parse","stringify","importJSON","safeSegments","clear","
|
|
1
|
+
{"version":3,"names":["useState","useCallback","useRef","EMPTY_FORMAT_STYLE","createSegment","segmentsToPlainText","reconcileTextChange","findPositionInSegments","getSelectionStyle","serializeSegments","useSelection","useFormatting","useRichText","options","initialSegments","onChangeSegments","onChangeText","segments","setSegments","length","activeStyles","setActiveStyles","selection","handleSelectionChange","segmentsRef","current","selectionRef","activeStylesRef","preserveActiveStylesRef","updateSegments","newSegments","formatting","onSegmentsChange","onActiveStylesChange","handleTextChange","newText","currentSegments","currentSelection","currentActiveStyles","sanitizeTypingStyles","start","end","onSelectionChange","newSelection","previousSelection","shouldPreserveActiveStyles","pos","seg","segmentIndex","styles","getPlainText","getOutput","format","exportJSON","JSON","parse","stringify","importJSON","safeSegments","clear","toggleFormat","setStyleProperty","key","value","setHeading","level","setListType","type","setTextAlign","align","setLink","url","setColor","color","setBackgroundColor","setFontSize","size","insertImage","source","plainText","Math","min","max","placeholder","buildImagePlaceholder","alt","nextText","slice","insertionStyles","nextSegments","imageSrc","imageAlt","state","actions","isFormatActive","currentSelectionStyle","style","undefined","trim","fileName","split","pop"],"sourceRoot":"../../../src","sources":["hooks/useRichText.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/index.d.js
CHANGED
|
@@ -11,5 +11,6 @@ export { RichTextProvider, useRichTextContext } from './context/RichTextContext'
|
|
|
11
11
|
export { createSegment, segmentsToPlainText, getTotalLength, mergeAdjacentSegments, reconcileTextChange } from './utils/parser';
|
|
12
12
|
export { toggleFormatOnSelection, setStyleOnSelection, setHeadingOnLine, isFormatActiveInSelection, getSelectionStyle } from './utils/formatter';
|
|
13
13
|
export { formatStyleToTextStyle, segmentToTextStyle, segmentsToTextStyles } from './utils/styleMapper';
|
|
14
|
+
export { serializeSegments, segmentsToMarkdown, segmentsToHTML } from './utils/serializer';
|
|
14
15
|
export { DEFAULT_COLORS, DEFAULT_THEME, DEFAULT_TOOLBAR_ITEMS, DEFAULT_BASE_TEXT_STYLE, HEADING_FONT_SIZES, EMPTY_FORMAT_STYLE } from './constants/defaultStyles';
|
|
15
16
|
//# sourceMappingURL=index.d.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["RichTextInput","OverlayText","Toolbar","ToolbarButton","useRichText","useSelection","useFormatting","RichTextProvider","useRichTextContext","createSegment","segmentsToPlainText","getTotalLength","mergeAdjacentSegments","reconcileTextChange","toggleFormatOnSelection","setStyleOnSelection","setHeadingOnLine","isFormatActiveInSelection","getSelectionStyle","formatStyleToTextStyle","segmentToTextStyle","segmentsToTextStyles","DEFAULT_COLORS","DEFAULT_THEME","DEFAULT_TOOLBAR_ITEMS","DEFAULT_BASE_TEXT_STYLE","HEADING_FONT_SIZES","EMPTY_FORMAT_STYLE"],"sourceRoot":"../../src","sources":["index.d.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,OAAO,QAAQ,sBAAsB;AAC9C,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,WAAW,QAAQ,qBAAqB;AAEjD,SAASC,YAAY,QAAQ,sBAAsB;AACnD,SAASC,aAAa,QAAQ,uBAAuB;AACrD,SAASC,gBAAgB,EAAEC,kBAAkB,QAAS,2BAA2B;AAEjF,SAASC,aAAa,EAAEC,mBAAmB,EAAEC,cAAc,EAAEC,qBAAqB,EAAEC,mBAAmB,QAAS,gBAAgB;AAChI,SAASC,uBAAuB,EAAEC,mBAAmB,EAAEC,gBAAgB,EAAEC,yBAAyB,EAAEC,iBAAiB,QAAS,mBAAmB;AACjJ,SAASC,sBAAsB,EAAEC,kBAAkB,EAAEC,oBAAoB,QAAS,qBAAqB;AACvG,SAASC,cAAc,EAAEC,aAAa,EAAEC,qBAAqB,EAAEC,uBAAuB,EAAEC,kBAAkB,EAAEC,kBAAkB,QAAS,2BAA2B","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["RichTextInput","OverlayText","Toolbar","ToolbarButton","useRichText","useSelection","useFormatting","RichTextProvider","useRichTextContext","createSegment","segmentsToPlainText","getTotalLength","mergeAdjacentSegments","reconcileTextChange","toggleFormatOnSelection","setStyleOnSelection","setHeadingOnLine","isFormatActiveInSelection","getSelectionStyle","formatStyleToTextStyle","segmentToTextStyle","segmentsToTextStyles","serializeSegments","segmentsToMarkdown","segmentsToHTML","DEFAULT_COLORS","DEFAULT_THEME","DEFAULT_TOOLBAR_ITEMS","DEFAULT_BASE_TEXT_STYLE","HEADING_FONT_SIZES","EMPTY_FORMAT_STYLE"],"sourceRoot":"../../src","sources":["index.d.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,OAAO,QAAQ,sBAAsB;AAC9C,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,WAAW,QAAQ,qBAAqB;AAEjD,SAASC,YAAY,QAAQ,sBAAsB;AACnD,SAASC,aAAa,QAAQ,uBAAuB;AACrD,SAASC,gBAAgB,EAAEC,kBAAkB,QAAS,2BAA2B;AAEjF,SAASC,aAAa,EAAEC,mBAAmB,EAAEC,cAAc,EAAEC,qBAAqB,EAAEC,mBAAmB,QAAS,gBAAgB;AAChI,SAASC,uBAAuB,EAAEC,mBAAmB,EAAEC,gBAAgB,EAAEC,yBAAyB,EAAEC,iBAAiB,QAAS,mBAAmB;AACjJ,SAASC,sBAAsB,EAAEC,kBAAkB,EAAEC,oBAAoB,QAAS,qBAAqB;AACvG,SAASC,iBAAiB,EAAEC,kBAAkB,EAAEC,cAAc,QAAS,oBAAoB;AAC3F,SAASC,cAAc,EAAEC,aAAa,EAAEC,qBAAqB,EAAEC,uBAAuB,EAAEC,kBAAkB,EAAEC,kBAAkB,QAAS,2BAA2B","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -17,6 +17,7 @@ export { RichTextProvider, useRichTextContext } from './context/RichTextContext'
|
|
|
17
17
|
export { createSegment, segmentsToPlainText, getTotalLength, mergeAdjacentSegments, reconcileTextChange } from './utils/parser';
|
|
18
18
|
export { toggleFormatOnSelection, setStyleOnSelection, setHeadingOnLine, isFormatActiveInSelection, getSelectionStyle } from './utils/formatter';
|
|
19
19
|
export { formatStyleToTextStyle, segmentToTextStyle, segmentsToTextStyles } from './utils/styleMapper';
|
|
20
|
+
export { serializeSegments, segmentsToMarkdown, segmentsToHTML } from './utils/serializer';
|
|
20
21
|
|
|
21
22
|
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
22
23
|
export { DEFAULT_COLORS, DEFAULT_THEME, DEFAULT_TOOLBAR_ITEMS, DEFAULT_BASE_TEXT_STYLE, HEADING_FONT_SIZES, EMPTY_FORMAT_STYLE } from './constants/defaultStyles';
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["RichTextInput","OverlayText","Toolbar","ToolbarButton","useRichText","useSelection","useFormatting","RichTextProvider","useRichTextContext","createSegment","segmentsToPlainText","getTotalLength","mergeAdjacentSegments","reconcileTextChange","toggleFormatOnSelection","setStyleOnSelection","setHeadingOnLine","isFormatActiveInSelection","getSelectionStyle","formatStyleToTextStyle","segmentToTextStyle","segmentsToTextStyles","DEFAULT_COLORS","DEFAULT_THEME","DEFAULT_TOOLBAR_ITEMS","DEFAULT_BASE_TEXT_STYLE","HEADING_FONT_SIZES","EMPTY_FORMAT_STYLE"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA;AACA,SAASA,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,OAAO,QAAQ,sBAAsB;AAC9C,SAASC,aAAa,QAAQ,4BAA4B;;AAE1D;AACA,SAASC,WAAW,QAAQ,qBAAqB;AAEjD,SAASC,YAAY,QAAQ,sBAAsB;AACnD,SAASC,aAAa,QAAQ,uBAAuB;;AAErD;AACA,SACEC,gBAAgB,EAChBC,kBAAkB,QACb,2BAA2B;AAGlC;AACA,SACEC,aAAa,EACbC,mBAAmB,EACnBC,cAAc,EACdC,qBAAqB,EACrBC,mBAAmB,QACd,gBAAgB;AACvB,SACEC,uBAAuB,EACvBC,mBAAmB,EACnBC,gBAAgB,EAChBC,yBAAyB,EACzBC,iBAAiB,QACZ,mBAAmB;AAC1B,SACEC,sBAAsB,EACtBC,kBAAkB,EAClBC,oBAAoB,QACf,qBAAqB;;
|
|
1
|
+
{"version":3,"names":["RichTextInput","OverlayText","Toolbar","ToolbarButton","useRichText","useSelection","useFormatting","RichTextProvider","useRichTextContext","createSegment","segmentsToPlainText","getTotalLength","mergeAdjacentSegments","reconcileTextChange","toggleFormatOnSelection","setStyleOnSelection","setHeadingOnLine","isFormatActiveInSelection","getSelectionStyle","formatStyleToTextStyle","segmentToTextStyle","segmentsToTextStyles","serializeSegments","segmentsToMarkdown","segmentsToHTML","DEFAULT_COLORS","DEFAULT_THEME","DEFAULT_TOOLBAR_ITEMS","DEFAULT_BASE_TEXT_STYLE","HEADING_FONT_SIZES","EMPTY_FORMAT_STYLE"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA;AACA,SAASA,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,OAAO,QAAQ,sBAAsB;AAC9C,SAASC,aAAa,QAAQ,4BAA4B;;AAE1D;AACA,SAASC,WAAW,QAAQ,qBAAqB;AAEjD,SAASC,YAAY,QAAQ,sBAAsB;AACnD,SAASC,aAAa,QAAQ,uBAAuB;;AAErD;AACA,SACEC,gBAAgB,EAChBC,kBAAkB,QACb,2BAA2B;AAGlC;AACA,SACEC,aAAa,EACbC,mBAAmB,EACnBC,cAAc,EACdC,qBAAqB,EACrBC,mBAAmB,QACd,gBAAgB;AACvB,SACEC,uBAAuB,EACvBC,mBAAmB,EACnBC,gBAAgB,EAChBC,yBAAyB,EACzBC,iBAAiB,QACZ,mBAAmB;AAC1B,SACEC,sBAAsB,EACtBC,kBAAkB,EAClBC,oBAAoB,QACf,qBAAqB;AAC5B,SACEC,iBAAiB,EACjBC,kBAAkB,EAClBC,cAAc,QACT,oBAAoB;;AAE3B;AACA,SACEC,cAAc,EACdC,aAAa,EACbC,qBAAqB,EACrBC,uBAAuB,EACvBC,kBAAkB,EAClBC,kBAAkB,QACb,2BAA2B;;AAElC","ignoreList":[]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import { createSegment, findPositionInSegments, mergeAdjacentSegments, segmentsToPlainText } from '../utils/parser';
|
|
4
|
-
import { HEADING_FONT_SIZES } from '../constants/defaultStyles';
|
|
5
4
|
|
|
6
5
|
/**
|
|
7
6
|
* Toggle an inline format (bold, italic, etc.) on the selected range.
|
|
@@ -51,17 +50,29 @@ export function setStyleOnSelection(segments, selection, key, value) {
|
|
|
51
50
|
* Apply a heading level to the line containing the cursor/selection.
|
|
52
51
|
*/
|
|
53
52
|
export function setHeadingOnLine(segments, selection, level) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
return
|
|
53
|
+
return setLineStyleOnSelection(segments, selection, {
|
|
54
|
+
heading: level === 'none' ? undefined : level,
|
|
55
|
+
listType: level === 'none' ? undefined : undefined
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Apply a list type to the lines containing the cursor/selection.
|
|
61
|
+
*/
|
|
62
|
+
export function setListTypeOnLine(segments, selection, listType) {
|
|
63
|
+
return setLineStyleOnSelection(segments, selection, {
|
|
64
|
+
listType: listType === 'none' ? undefined : listType,
|
|
65
|
+
heading: listType === 'none' ? undefined : undefined
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Apply text alignment to the lines containing the cursor/selection.
|
|
71
|
+
*/
|
|
72
|
+
export function setTextAlignOnLine(segments, selection, textAlign) {
|
|
73
|
+
return setLineStyleOnSelection(segments, selection, {
|
|
74
|
+
textAlign
|
|
75
|
+
});
|
|
65
76
|
}
|
|
66
77
|
|
|
67
78
|
/**
|
|
@@ -114,6 +125,11 @@ export function getSelectionStyle(segments, selection) {
|
|
|
114
125
|
if (result.backgroundColor !== s.backgroundColor) result.backgroundColor = undefined;
|
|
115
126
|
if (result.fontSize !== s.fontSize) result.fontSize = undefined;
|
|
116
127
|
if (result.heading !== s.heading) result.heading = undefined;
|
|
128
|
+
if (result.listType !== s.listType) result.listType = undefined;
|
|
129
|
+
if (result.textAlign !== s.textAlign) result.textAlign = undefined;
|
|
130
|
+
if (result.link !== s.link) result.link = undefined;
|
|
131
|
+
if (result.imageSrc !== s.imageSrc) result.imageSrc = undefined;
|
|
132
|
+
if (result.imageAlt !== s.imageAlt) result.imageAlt = undefined;
|
|
117
133
|
}
|
|
118
134
|
return result;
|
|
119
135
|
}
|
|
@@ -193,6 +209,14 @@ function applyStyleToRange(segments, start, end, styleDelta) {
|
|
|
193
209
|
}
|
|
194
210
|
return mergeAdjacentSegments(result);
|
|
195
211
|
}
|
|
212
|
+
function setLineStyleOnSelection(segments, selection, styleDelta) {
|
|
213
|
+
const plainText = segmentsToPlainText(segments);
|
|
214
|
+
const {
|
|
215
|
+
lineStart,
|
|
216
|
+
lineEnd
|
|
217
|
+
} = getSelectionLineRange(plainText, selection);
|
|
218
|
+
return applyStyleToRange(segments, lineStart, lineEnd, styleDelta);
|
|
219
|
+
}
|
|
196
220
|
|
|
197
221
|
/**
|
|
198
222
|
* Get the line start and end positions for the line containing the given position.
|
|
@@ -211,6 +235,16 @@ function getLineRange(text, position) {
|
|
|
211
235
|
lineEnd
|
|
212
236
|
};
|
|
213
237
|
}
|
|
238
|
+
function getSelectionLineRange(text, selection) {
|
|
239
|
+
const normalized = normalizeSelection(selection);
|
|
240
|
+
const lineStart = getLineRange(text, normalized.start).lineStart;
|
|
241
|
+
const effectiveEnd = normalized.end > normalized.start ? normalized.end - 1 : normalized.end;
|
|
242
|
+
const lineEnd = getLineRange(text, effectiveEnd).lineEnd;
|
|
243
|
+
return {
|
|
244
|
+
lineStart,
|
|
245
|
+
lineEnd
|
|
246
|
+
};
|
|
247
|
+
}
|
|
214
248
|
|
|
215
249
|
// Re-export for convenience
|
|
216
250
|
export { createSegment } from '../utils/parser';
|