@pega/cosmos-react-rte 9.0.0-build.9.9 → 9.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.
- package/lib/components/DynamicContentEditor/DynamicContentEditor.d.ts +4 -2
- package/lib/components/DynamicContentEditor/DynamicContentEditor.d.ts.map +1 -1
- package/lib/components/DynamicContentEditor/DynamicContentEditor.js +64 -59
- package/lib/components/DynamicContentEditor/DynamicContentEditor.js.map +1 -1
- package/lib/components/Editor/Editor.context.d.ts +6 -6
- package/lib/components/Editor/Editor.context.d.ts.map +1 -1
- package/lib/components/Editor/Editor.context.js +1 -1
- package/lib/components/Editor/Editor.context.js.map +1 -1
- package/lib/components/Editor/Editor.d.ts +1 -10
- package/lib/components/Editor/Editor.d.ts.map +1 -1
- package/lib/components/Editor/Editor.js +301 -490
- package/lib/components/Editor/Editor.js.map +1 -1
- package/lib/components/Editor/Editor.styles.d.ts +37 -7
- package/lib/components/Editor/Editor.styles.d.ts.map +1 -1
- package/lib/components/Editor/Editor.styles.js +60 -30
- package/lib/components/Editor/Editor.styles.js.map +1 -1
- package/lib/components/Editor/Editor.test-ids.d.ts +2 -1
- package/lib/components/Editor/Editor.test-ids.d.ts.map +1 -1
- package/lib/components/Editor/Editor.test-ids.js +2 -0
- package/lib/components/Editor/Editor.test-ids.js.map +1 -1
- package/lib/components/Editor/Editor.types.d.ts +34 -14
- package/lib/components/Editor/Editor.types.d.ts.map +1 -1
- package/lib/components/Editor/Editor.types.js.map +1 -1
- package/lib/components/Editor/IframeTiptapEditor.d.ts +30 -0
- package/lib/components/Editor/IframeTiptapEditor.d.ts.map +1 -0
- package/lib/components/Editor/IframeTiptapEditor.js +695 -0
- package/lib/components/Editor/IframeTiptapEditor.js.map +1 -0
- package/lib/components/Editor/ImageActionButtons.d.ts +20 -0
- package/lib/components/Editor/ImageActionButtons.d.ts.map +1 -0
- package/lib/components/Editor/ImageActionButtons.js +84 -0
- package/lib/components/Editor/ImageActionButtons.js.map +1 -0
- package/lib/components/Editor/ImageEditDialog.d.ts +17 -0
- package/lib/components/Editor/ImageEditDialog.d.ts.map +1 -0
- package/lib/components/Editor/ImageEditDialog.js +90 -0
- package/lib/components/Editor/ImageEditDialog.js.map +1 -0
- package/lib/components/Editor/TableCellMenu.d.ts +35 -0
- package/lib/components/Editor/TableCellMenu.d.ts.map +1 -0
- package/lib/components/Editor/TableCellMenu.js +120 -0
- package/lib/components/Editor/TableCellMenu.js.map +1 -0
- package/lib/components/Editor/Toolbar/AIRewriteButton.d.ts +17 -0
- package/lib/components/Editor/Toolbar/AIRewriteButton.d.ts.map +1 -0
- package/lib/components/Editor/Toolbar/AIRewriteButton.js +79 -0
- package/lib/components/Editor/Toolbar/AIRewriteButton.js.map +1 -0
- package/lib/components/Editor/Toolbar/AlignmentSelect.d.ts +8 -0
- package/lib/components/Editor/Toolbar/AlignmentSelect.d.ts.map +1 -0
- package/lib/components/Editor/Toolbar/AlignmentSelect.js +137 -0
- package/lib/components/Editor/Toolbar/AlignmentSelect.js.map +1 -0
- package/lib/components/Editor/Toolbar/AnchorButton.d.ts +3 -4
- package/lib/components/Editor/Toolbar/AnchorButton.d.ts.map +1 -1
- package/lib/components/Editor/Toolbar/AnchorButton.js +156 -82
- package/lib/components/Editor/Toolbar/AnchorButton.js.map +1 -1
- package/lib/components/Editor/Toolbar/ColorPickerButton.d.ts +9 -0
- package/lib/components/Editor/Toolbar/ColorPickerButton.d.ts.map +1 -0
- package/lib/components/Editor/Toolbar/ColorPickerButton.js +190 -0
- package/lib/components/Editor/Toolbar/ColorPickerButton.js.map +1 -0
- package/lib/components/Editor/Toolbar/FontFamilySelect.d.ts +8 -0
- package/lib/components/Editor/Toolbar/FontFamilySelect.d.ts.map +1 -0
- package/lib/components/Editor/Toolbar/FontFamilySelect.js +150 -0
- package/lib/components/Editor/Toolbar/FontFamilySelect.js.map +1 -0
- package/lib/components/Editor/Toolbar/FontSizeSelect.d.ts +8 -0
- package/lib/components/Editor/Toolbar/FontSizeSelect.d.ts.map +1 -0
- package/lib/components/Editor/Toolbar/FontSizeSelect.js +145 -0
- package/lib/components/Editor/Toolbar/FontSizeSelect.js.map +1 -0
- package/lib/components/Editor/Toolbar/ImageButton.d.ts +5 -5
- package/lib/components/Editor/Toolbar/ImageButton.d.ts.map +1 -1
- package/lib/components/Editor/Toolbar/ImageButton.js +131 -18
- package/lib/components/Editor/Toolbar/ImageButton.js.map +1 -1
- package/lib/components/Editor/Toolbar/SourceCodeButton.d.ts +8 -0
- package/lib/components/Editor/Toolbar/SourceCodeButton.d.ts.map +1 -0
- package/lib/components/Editor/Toolbar/SourceCodeButton.js +49 -0
- package/lib/components/Editor/Toolbar/SourceCodeButton.js.map +1 -0
- package/lib/components/Editor/Toolbar/TableButton.d.ts +8 -0
- package/lib/components/Editor/Toolbar/TableButton.d.ts.map +1 -0
- package/lib/components/Editor/Toolbar/TableButton.js +291 -0
- package/lib/components/Editor/Toolbar/TableButton.js.map +1 -0
- package/lib/components/Editor/Toolbar/TextSelect.d.ts +4 -5
- package/lib/components/Editor/Toolbar/TextSelect.d.ts.map +1 -1
- package/lib/components/Editor/Toolbar/TextSelect.js +61 -30
- package/lib/components/Editor/Toolbar/TextSelect.js.map +1 -1
- package/lib/components/Editor/Toolbar/Toolbar.d.ts +17 -6
- package/lib/components/Editor/Toolbar/Toolbar.d.ts.map +1 -1
- package/lib/components/Editor/Toolbar/Toolbar.js +169 -47
- package/lib/components/Editor/Toolbar/Toolbar.js.map +1 -1
- package/lib/components/Editor/Toolbar/Toolbar.test-ids.d.ts +2 -2
- package/lib/components/Editor/Toolbar/Toolbar.test-ids.d.ts.map +1 -1
- package/lib/components/Editor/Toolbar/Toolbar.test-ids.js +17 -1
- package/lib/components/Editor/Toolbar/Toolbar.test-ids.js.map +1 -1
- package/lib/components/Editor/Toolbar/WordCount.d.ts +8 -0
- package/lib/components/Editor/Toolbar/WordCount.d.ts.map +1 -0
- package/lib/components/Editor/Toolbar/WordCount.js +31 -0
- package/lib/components/Editor/Toolbar/WordCount.js.map +1 -0
- package/lib/components/Editor/extensions/FontSize.d.ts +21 -0
- package/lib/components/Editor/extensions/FontSize.d.ts.map +1 -0
- package/lib/components/Editor/extensions/FontSize.js +42 -0
- package/lib/components/Editor/extensions/FontSize.js.map +1 -0
- package/lib/components/Editor/extensions/PreserveDiv.d.ts +13 -0
- package/lib/components/Editor/extensions/PreserveDiv.d.ts.map +1 -0
- package/lib/components/Editor/extensions/PreserveDiv.js +73 -0
- package/lib/components/Editor/extensions/PreserveDiv.js.map +1 -0
- package/lib/components/Editor/extensions/TableCellSelection.d.ts +4 -0
- package/lib/components/Editor/extensions/TableCellSelection.d.ts.map +1 -0
- package/lib/components/Editor/extensions/TableCellSelection.js +53 -0
- package/lib/components/Editor/extensions/TableCellSelection.js.map +1 -0
- package/lib/components/Editor/extensions/TextIndent.d.ts +22 -0
- package/lib/components/Editor/extensions/TextIndent.d.ts.map +1 -0
- package/lib/components/Editor/extensions/TextIndent.js +137 -0
- package/lib/components/Editor/extensions/TextIndent.js.map +1 -0
- package/lib/components/Editor/hooks/useCloseOnEditorClick.d.ts +5 -0
- package/lib/components/Editor/hooks/useCloseOnEditorClick.d.ts.map +1 -0
- package/lib/components/Editor/hooks/useCloseOnEditorClick.js +18 -0
- package/lib/components/Editor/hooks/useCloseOnEditorClick.js.map +1 -0
- package/lib/components/Editor/hooks/useEscapeKey.d.ts +4 -0
- package/lib/components/Editor/hooks/useEscapeKey.d.ts.map +1 -0
- package/lib/components/Editor/hooks/useEscapeKey.js +24 -0
- package/lib/components/Editor/hooks/useEscapeKey.js.map +1 -0
- package/lib/components/Editor/hooks/useIframeSetup.d.ts +54 -0
- package/lib/components/Editor/hooks/useIframeSetup.d.ts.map +1 -0
- package/lib/components/Editor/hooks/useIframeSetup.js +284 -0
- package/lib/components/Editor/hooks/useIframeSetup.js.map +1 -0
- package/lib/components/Editor/hooks/useImageActions.d.ts +19 -0
- package/lib/components/Editor/hooks/useImageActions.d.ts.map +1 -0
- package/lib/components/Editor/hooks/useImageActions.js +198 -0
- package/lib/components/Editor/hooks/useImageActions.js.map +1 -0
- package/lib/components/Editor/hooks/useTableCellMenu.d.ts +22 -0
- package/lib/components/Editor/hooks/useTableCellMenu.d.ts.map +1 -0
- package/lib/components/Editor/hooks/useTableCellMenu.js +120 -0
- package/lib/components/Editor/hooks/useTableCellMenu.js.map +1 -0
- package/lib/components/Editor/iframeContentStyles.d.ts +10 -0
- package/lib/components/Editor/iframeContentStyles.d.ts.map +1 -0
- package/lib/components/Editor/iframeContentStyles.js +162 -0
- package/lib/components/Editor/iframeContentStyles.js.map +1 -0
- package/lib/components/Editor/index.d.ts +2 -0
- package/lib/components/Editor/index.d.ts.map +1 -1
- package/lib/components/Editor/index.js +1 -0
- package/lib/components/Editor/index.js.map +1 -1
- package/lib/components/Editor/sanitize.d.ts +3 -0
- package/lib/components/Editor/sanitize.d.ts.map +1 -0
- package/lib/components/Editor/sanitize.js +11 -0
- package/lib/components/Editor/sanitize.js.map +1 -0
- package/lib/components/Editor/utils/htmlPlaceholder.d.ts +69 -0
- package/lib/components/Editor/utils/htmlPlaceholder.d.ts.map +1 -0
- package/lib/components/Editor/utils/htmlPlaceholder.js +154 -0
- package/lib/components/Editor/utils/htmlPlaceholder.js.map +1 -0
- package/lib/components/RichTextEditor/DecoratorComponents/Table.d.ts +6 -4
- package/lib/components/RichTextEditor/DecoratorComponents/Table.d.ts.map +1 -1
- package/lib/components/RichTextEditor/DecoratorComponents/Table.js +10 -8
- package/lib/components/RichTextEditor/DecoratorComponents/Table.js.map +1 -1
- package/lib/components/RichTextEditor/RichTextEditor.d.ts.map +1 -1
- package/lib/components/RichTextEditor/RichTextEditor.js +15 -2
- package/lib/components/RichTextEditor/RichTextEditor.js.map +1 -1
- package/lib/components/RichTextEditor/RichTextEditor.styles.d.ts +5 -5
- package/lib/components/RichTextEditor/RichTextEditor.styles.d.ts.map +1 -1
- package/lib/components/RichTextEditor/RichTextEditor.styles.js +3 -5
- package/lib/components/RichTextEditor/RichTextEditor.styles.js.map +1 -1
- package/lib/components/RichTextEditor/RichTextEditor.types.d.ts +5 -0
- package/lib/components/RichTextEditor/RichTextEditor.types.d.ts.map +1 -1
- package/lib/components/RichTextEditor/RichTextEditor.types.js.map +1 -1
- package/lib/components/RichTextEditor/RichTextViewer.d.ts.map +1 -1
- package/lib/components/RichTextEditor/RichTextViewer.js +9 -2
- package/lib/components/RichTextEditor/RichTextViewer.js.map +1 -1
- package/lib/components/RichTextEditor/Toolbar/Toolbar.js +1 -1
- package/lib/components/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
- package/lib/components/RichTextEditor/Toolbar/Toolbar.types.d.ts +4 -4
- package/lib/components/RichTextEditor/Toolbar/Toolbar.types.d.ts.map +1 -1
- package/lib/components/RichTextEditor/Toolbar/Toolbar.types.js.map +1 -1
- package/lib/components/RichTextEditor/Toolbar/ToolbarButton.d.ts.map +1 -1
- package/lib/components/RichTextEditor/Toolbar/ToolbarButton.js +41 -26
- package/lib/components/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
- package/lib/components/RichTextEditor/utils/htmlConverter.d.ts +2 -0
- package/lib/components/RichTextEditor/utils/htmlConverter.d.ts.map +1 -1
- package/lib/components/RichTextEditor/utils/htmlConverter.js +12 -0
- package/lib/components/RichTextEditor/utils/htmlConverter.js.map +1 -1
- package/lib/components/RichTextEditor/utils/interactionRenderer.d.ts.map +1 -1
- package/lib/components/RichTextEditor/utils/interactionRenderer.js +20 -19
- package/lib/components/RichTextEditor/utils/interactionRenderer.js.map +1 -1
- package/lib/components/RichTextEditor/utils/markdownConverter.d.ts.map +1 -1
- package/lib/components/RichTextEditor/utils/markdownConverter.js +131 -30
- package/lib/components/RichTextEditor/utils/markdownConverter.js.map +1 -1
- package/lib/components/RichTextEditor/utils/renderers.d.ts +5 -3
- package/lib/components/RichTextEditor/utils/renderers.d.ts.map +1 -1
- package/lib/components/RichTextEditor/utils/renderers.js +62 -34
- package/lib/components/RichTextEditor/utils/renderers.js.map +1 -1
- package/lib/components/RichTextEditor/utils/slateConverter.d.ts +4 -3
- package/lib/components/RichTextEditor/utils/slateConverter.d.ts.map +1 -1
- package/lib/components/RichTextEditor/utils/slateConverter.js +86 -38
- package/lib/components/RichTextEditor/utils/slateConverter.js.map +1 -1
- package/package.json +30 -8
- package/lib/components/Editor/ImageEditor.d.ts +0 -10
- package/lib/components/Editor/ImageEditor.d.ts.map +0 -1
- package/lib/components/Editor/ImageEditor.js +0 -292
- package/lib/components/Editor/ImageEditor.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/Toolbar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/Toolbar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AAc3D,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAmB,MAAM,yBAAyB,CAAC;AAQrF,OAAO,KAAK,EAAa,QAAQ,EAAE,MAAM,4CAA4C,CAAC;AAEtF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAapD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA+DnD,MAAM,WAAW,YAAa,SAAQ,UAAU,CAAC,OAAO,QAAQ,CAAC;IAC/D,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IAC3C,cAAc,CAAC,EAAE,CACf,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,QAAQ,EACvB,sBAAsB,EAAE,MAAM,EAC9B,SAAS,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,KACvC,IAAI,CAAC;IACV,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE;QAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;QAClB,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;QACjD,eAAe,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;KAChD,KAAK,SAAS,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kBAAkB,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC;CACtD;yLAgHE,YAAY;;;AAiWf,wBAAuD"}
|
|
@@ -9,15 +9,23 @@ import * as indentIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/i
|
|
|
9
9
|
import * as unindentIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/unindent.icon';
|
|
10
10
|
import ToolbarButton from '../../RichTextEditor/Toolbar/ToolbarButton';
|
|
11
11
|
import { getKeyCommand } from '../../RichTextEditor/Toolbar/utils';
|
|
12
|
+
import AIRewriteButton from './AIRewriteButton';
|
|
12
13
|
import ImageButton from './ImageButton';
|
|
13
14
|
import TextSelect from './TextSelect';
|
|
14
15
|
import AnchorButton from './AnchorButton';
|
|
16
|
+
import FontFamilySelect from './FontFamilySelect';
|
|
17
|
+
import FontSizeSelect from './FontSizeSelect';
|
|
18
|
+
import ColorPickerButton from './ColorPickerButton';
|
|
19
|
+
import TableButton from './TableButton';
|
|
20
|
+
import SourceCodeButton from './SourceCodeButton';
|
|
21
|
+
import AlignmentSelect from './AlignmentSelect';
|
|
15
22
|
import { getToolbarTestIds } from './Toolbar.test-ids';
|
|
16
23
|
registerIcon(listIcon, listNumberIcon, indentIcon, unindentIcon);
|
|
17
24
|
const StyledToolbar = styled.div(({ sticky, theme }) => {
|
|
18
25
|
return css `
|
|
19
|
-
background-color: ${theme.
|
|
20
|
-
border-radius:
|
|
26
|
+
background-color: ${theme.components['form-control']['background-color']};
|
|
27
|
+
border-end-start-radius: inherit;
|
|
28
|
+
border-end-end-radius: inherit;
|
|
21
29
|
overflow: auto;
|
|
22
30
|
padding: calc(0.5 * ${theme.base.spacing});
|
|
23
31
|
${sticky &&
|
|
@@ -31,12 +39,44 @@ const StyledToolbar = styled.div(({ sticky, theme }) => {
|
|
|
31
39
|
}
|
|
32
40
|
`;
|
|
33
41
|
});
|
|
42
|
+
const ToolbarSeparator = styled.div(({ theme }) => {
|
|
43
|
+
return css `
|
|
44
|
+
width: calc(0.125 * ${theme.base.spacing});
|
|
45
|
+
height: calc(3 * ${theme.base.spacing});
|
|
46
|
+
background-color: ${theme.base.palette['border-line']};
|
|
47
|
+
margin-block: calc(0.5 * ${theme.base.spacing});
|
|
48
|
+
margin-inline: calc(0.25 * ${theme.base.spacing});
|
|
49
|
+
`;
|
|
50
|
+
});
|
|
51
|
+
ToolbarSeparator.defaultProps = defaultThemeProp;
|
|
34
52
|
StyledToolbar.defaultProps = defaultThemeProp;
|
|
53
|
+
const SubscriptText = styled.span(({ theme }) => {
|
|
54
|
+
return css `
|
|
55
|
+
display: inline-flex;
|
|
56
|
+
align-items: flex-end;
|
|
57
|
+
span {
|
|
58
|
+
font-size: calc(0.65 * ${theme.base['font-size']});
|
|
59
|
+
margin-bottom: calc(-0.25 * ${theme.base.spacing});
|
|
60
|
+
}
|
|
61
|
+
`;
|
|
62
|
+
});
|
|
63
|
+
SubscriptText.defaultProps = defaultThemeProp;
|
|
64
|
+
const SuperscriptText = styled.span(({ theme }) => {
|
|
65
|
+
return css `
|
|
66
|
+
display: inline-flex;
|
|
67
|
+
align-items: flex-start;
|
|
68
|
+
span {
|
|
69
|
+
font-size: calc(0.65 * ${theme.base['font-size']});
|
|
70
|
+
margin-top: calc(-0.25 * ${theme.base.spacing});
|
|
71
|
+
}
|
|
72
|
+
`;
|
|
73
|
+
});
|
|
74
|
+
SuperscriptText.defaultProps = defaultThemeProp;
|
|
35
75
|
const isMobile = navigatorIsAvailable && navigator.userAgent.includes('Mobile');
|
|
36
|
-
//
|
|
37
|
-
function
|
|
38
|
-
|
|
39
|
-
{
|
|
76
|
+
// Individual inline style button definitions - keyed by format for safe lookup
|
|
77
|
+
function getInlineStyleButtons(t, osx, testIds) {
|
|
78
|
+
return {
|
|
79
|
+
bold: {
|
|
40
80
|
'data-testid': testIds.bold,
|
|
41
81
|
style: 'BOLD',
|
|
42
82
|
text: 'B',
|
|
@@ -47,7 +87,7 @@ function renderStyleButtons(editor, t, activeStyles, osx, testIds) {
|
|
|
47
87
|
? `${t('rte_bold')}`
|
|
48
88
|
: getKeyCommand(osx, ({ ctrl, shift }) => `${t('rte_bold')} (${ctrl}B, ${ctrl}${shift}B)`)
|
|
49
89
|
},
|
|
50
|
-
{
|
|
90
|
+
italic: {
|
|
51
91
|
'data-testid': testIds.italic,
|
|
52
92
|
style: 'ITALIC',
|
|
53
93
|
text: 'I',
|
|
@@ -58,7 +98,7 @@ function renderStyleButtons(editor, t, activeStyles, osx, testIds) {
|
|
|
58
98
|
? `${t('rte_italic')}`
|
|
59
99
|
: getKeyCommand(osx, ({ ctrl, shift }) => `${t('rte_italic')} (${ctrl}I, ${ctrl}${shift}I)`)
|
|
60
100
|
},
|
|
61
|
-
{
|
|
101
|
+
strikethrough: {
|
|
62
102
|
'data-testid': testIds.strikeThrough,
|
|
63
103
|
style: 'STRIKE-THROUGH',
|
|
64
104
|
text: 'S',
|
|
@@ -69,21 +109,24 @@ function renderStyleButtons(editor, t, activeStyles, osx, testIds) {
|
|
|
69
109
|
? `${t('rte_strike_through')}`
|
|
70
110
|
: getKeyCommand(osx, ({ ctrl, shift }) => `${t('rte_strike_through')} (${ctrl}${shift}X)`)
|
|
71
111
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
// Render a single inline style button
|
|
115
|
+
function renderInlineStyleButton(editor, button, activeStyles) {
|
|
116
|
+
const { format, style, text, label, tooltip, 'data-testid': dataTestId } = button;
|
|
117
|
+
return (_jsx(ToolbarButton, { "data-testid": dataTestId, onMouseDown: e => {
|
|
118
|
+
e.preventDefault();
|
|
119
|
+
const chain = editor.chain().focus();
|
|
120
|
+
if (format === 'Bold') {
|
|
121
|
+
chain.toggleBold().run();
|
|
122
|
+
}
|
|
123
|
+
else if (format === 'Italic') {
|
|
124
|
+
chain.toggleItalic().run();
|
|
125
|
+
}
|
|
126
|
+
else if (format === 'Strikethrough') {
|
|
127
|
+
chain.toggleStrike().run();
|
|
128
|
+
}
|
|
129
|
+
}, styleType: style, active: activeStyles[format.toLowerCase()], tooltip: tooltip, label: label, children: text }, style));
|
|
87
130
|
}
|
|
88
131
|
// Takes the features array and transforms it into a map for faster lookup
|
|
89
132
|
function createActiveFeaturesMap(features) {
|
|
@@ -91,19 +134,28 @@ function createActiveFeaturesMap(features) {
|
|
|
91
134
|
return { ...acc, [feature]: true };
|
|
92
135
|
}, {});
|
|
93
136
|
}
|
|
94
|
-
const Toolbar = ({ testId, features, sticky, editor, customActions, ...restProps }) => {
|
|
137
|
+
const Toolbar = ({ testId, features, sticky, editor, customActions, imageInsertionMode, onRewriteClick, renderSuggestionEditor, sourceMode, onSourceModeToggle, ...restProps }) => {
|
|
95
138
|
const t = useI18n();
|
|
96
139
|
const { macintosh: osx } = useOS();
|
|
97
140
|
const toolbarRef = useRef(null);
|
|
98
141
|
const testIds = useTestIds(testId, getToolbarTestIds);
|
|
99
|
-
useArrows(toolbarRef, {
|
|
142
|
+
useArrows(toolbarRef, {
|
|
143
|
+
selector: '[data-toolbar-item="true"]',
|
|
144
|
+
dir: 'left-right'
|
|
145
|
+
});
|
|
100
146
|
const [activeFeatures, setActiveFeatures] = useState(() => createActiveFeaturesMap(features));
|
|
101
147
|
const [activeStyles, setActiveStyles] = useState(() => ({
|
|
102
148
|
bold: false,
|
|
103
149
|
italic: false,
|
|
104
150
|
strikethrough: false,
|
|
151
|
+
underline: false,
|
|
152
|
+
subscript: false,
|
|
153
|
+
superscript: false,
|
|
105
154
|
unorderedList: false,
|
|
106
|
-
orderedList: false
|
|
155
|
+
orderedList: false,
|
|
156
|
+
alignLeft: false,
|
|
157
|
+
alignCenter: false,
|
|
158
|
+
alignRight: false
|
|
107
159
|
}));
|
|
108
160
|
const getIndentationToolTip = (type) => getKeyCommand(osx, ({ shift, alt }) => type === 'indent' ? `${t('rte_indent')} (${alt}M)` : `${t('rte_unindent')} (${alt}${shift}M)`);
|
|
109
161
|
const tooltipMobile = (type) => type === 'indent' ? `${t('rte_indent')}` : `${t('rte_unindent')}`;
|
|
@@ -111,48 +163,116 @@ const Toolbar = ({ testId, features, sticky, editor, customActions, ...restProps
|
|
|
111
163
|
setActiveFeatures(createActiveFeaturesMap(features));
|
|
112
164
|
}, [features]);
|
|
113
165
|
const getActiveStyles = useCallback(() => {
|
|
114
|
-
if (editor
|
|
115
|
-
setActiveStyles({
|
|
116
|
-
bold: editor.queryCommandState('Bold'),
|
|
117
|
-
italic: editor.queryCommandState('Italic'),
|
|
118
|
-
strikethrough: editor.queryCommandState('Strikethrough'),
|
|
119
|
-
unorderedList: editor.queryCommandState('InsertUnorderedList'),
|
|
120
|
-
orderedList: editor.queryCommandState('InsertOrderedList')
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
166
|
+
if (!editor) {
|
|
124
167
|
setActiveStyles({
|
|
125
168
|
bold: false,
|
|
126
169
|
italic: false,
|
|
127
170
|
strikethrough: false,
|
|
171
|
+
underline: false,
|
|
172
|
+
subscript: false,
|
|
173
|
+
superscript: false,
|
|
128
174
|
unorderedList: false,
|
|
129
|
-
orderedList: false
|
|
175
|
+
orderedList: false,
|
|
176
|
+
alignLeft: false,
|
|
177
|
+
alignCenter: false,
|
|
178
|
+
alignRight: false
|
|
130
179
|
});
|
|
180
|
+
return;
|
|
131
181
|
}
|
|
182
|
+
// Tiptap API only
|
|
183
|
+
setActiveStyles({
|
|
184
|
+
bold: editor.isActive('bold'),
|
|
185
|
+
italic: editor.isActive('italic'),
|
|
186
|
+
strikethrough: editor.isActive('strike'),
|
|
187
|
+
underline: editor.isActive('underline'),
|
|
188
|
+
subscript: editor.isActive('subscript'),
|
|
189
|
+
superscript: editor.isActive('superscript'),
|
|
190
|
+
unorderedList: editor.isActive('bulletList'),
|
|
191
|
+
orderedList: editor.isActive('orderedList'),
|
|
192
|
+
alignLeft: editor.isActive({ textAlign: 'left' }),
|
|
193
|
+
alignCenter: editor.isActive({ textAlign: 'center' }),
|
|
194
|
+
alignRight: editor.isActive({ textAlign: 'right' })
|
|
195
|
+
});
|
|
132
196
|
}, [editor, setActiveStyles]);
|
|
133
197
|
useEffect(() => {
|
|
134
198
|
getActiveStyles();
|
|
135
|
-
editor.on('
|
|
199
|
+
editor.on('selectionUpdate', getActiveStyles);
|
|
200
|
+
editor.on('transaction', getActiveStyles);
|
|
136
201
|
return () => {
|
|
137
|
-
editor.off('
|
|
202
|
+
editor.off('selectionUpdate', getActiveStyles);
|
|
203
|
+
editor.off('transaction', getActiveStyles);
|
|
138
204
|
};
|
|
139
205
|
}, [editor, getActiveStyles]);
|
|
140
|
-
return (_jsxs(Flex, { "data-testid": testIds.toolbar, ...restProps, as: StyledToolbar, sticky: sticky, container: { justify: 'between' }, ref: toolbarRef, children: [_jsxs(Flex, { container: { alignItems: '
|
|
141
|
-
|
|
206
|
+
return (_jsxs(Flex, { "data-testid": testIds.toolbar, ...restProps, as: StyledToolbar, sticky: sticky, container: { justify: 'between' }, ref: toolbarRef, children: [_jsxs(Flex, { container: { alignItems: 'center', gap: 0 }, children: [activeFeatures.headers && (_jsx(TextSelect, { "data-testid": testIds.textStyles, osx: osx, editor: editor })), (() => {
|
|
207
|
+
const buttons = getInlineStyleButtons(t, osx, testIds);
|
|
208
|
+
// 'inline-styling' enables all three; individual features enable specific ones
|
|
209
|
+
if (activeFeatures['inline-styling']) {
|
|
210
|
+
return Object.values(buttons).map(btn => renderInlineStyleButton(editor, btn, activeStyles));
|
|
211
|
+
}
|
|
212
|
+
return (_jsxs(_Fragment, { children: [activeFeatures.bold && renderInlineStyleButton(editor, buttons.bold, activeStyles), activeFeatures.italic &&
|
|
213
|
+
renderInlineStyleButton(editor, buttons.italic, activeStyles), activeFeatures.strikethrough &&
|
|
214
|
+
renderInlineStyleButton(editor, buttons.strikethrough, activeStyles)] }));
|
|
215
|
+
})(), activeFeatures.underline && (_jsx(ToolbarButton, { "data-testid": testIds.underline, styleType: 'UNDERLINE', onMouseDown: e => {
|
|
216
|
+
e.preventDefault();
|
|
217
|
+
editor.chain().focus().toggleUnderline().run();
|
|
218
|
+
}, active: activeStyles.underline, tooltip: isMobile
|
|
219
|
+
? t('rte_underline')
|
|
220
|
+
: getKeyCommand(osx, ({ ctrl }) => `${t('rte_underline')} (${ctrl}U)`), label: t('rte_underline'), children: "U" })), activeFeatures.subscript && (_jsx(ToolbarButton, { "data-testid": testIds.subscript, styleType: 'SUBSCRIPT', onMouseDown: e => {
|
|
221
|
+
e.preventDefault();
|
|
222
|
+
// Turn off superscript first if it's active, then toggle subscript
|
|
223
|
+
if (editor.isActive('superscript')) {
|
|
224
|
+
editor.chain().focus().unsetSuperscript().toggleSubscript().run();
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
editor.chain().focus().toggleSubscript().run();
|
|
228
|
+
}
|
|
229
|
+
}, active: activeStyles.subscript, tooltip: t('rte_subscript'), label: t('rte_subscript'), children: _jsxs(SubscriptText, { children: ["X", _jsx("span", { children: "2" })] }) })), activeFeatures.superscript && (_jsx(ToolbarButton, { "data-testid": testIds.superscript, styleType: 'SUPERSCRIPT', onMouseDown: e => {
|
|
230
|
+
e.preventDefault();
|
|
231
|
+
// Turn off subscript first if it's active, then toggle superscript
|
|
232
|
+
if (editor.isActive('subscript')) {
|
|
233
|
+
editor.chain().focus().unsetSubscript().toggleSuperscript().run();
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
editor.chain().focus().toggleSuperscript().run();
|
|
237
|
+
}
|
|
238
|
+
}, active: activeStyles.superscript, tooltip: t('rte_superscript'), label: t('rte_superscript'), children: _jsxs(SuperscriptText, { children: ["X", _jsx("span", { children: "2" })] }) })), (activeFeatures['inline-styling'] ||
|
|
239
|
+
activeFeatures.bold ||
|
|
240
|
+
activeFeatures.italic ||
|
|
241
|
+
activeFeatures.strikethrough ||
|
|
242
|
+
activeFeatures.underline ||
|
|
243
|
+
activeFeatures.subscript ||
|
|
244
|
+
activeFeatures.superscript) &&
|
|
245
|
+
(activeFeatures.alignment || activeFeatures.lists || activeFeatures.indentation) && (_jsx(ToolbarSeparator, {})), activeFeatures.alignment && (_jsx(AlignmentSelect, { "data-testid": testIds.alignment, editor: editor })), activeFeatures.lists && (_jsxs(_Fragment, { children: [_jsx(ToolbarButton, { "data-testid": testIds.bulletedList, onMouseDown: e => {
|
|
142
246
|
e.preventDefault();
|
|
143
|
-
editor.
|
|
247
|
+
editor.chain().focus().toggleBulletList().run();
|
|
144
248
|
}, active: activeStyles.unorderedList, tooltip: isMobile
|
|
145
249
|
? `${t('rte_bulleted_list')}`
|
|
146
250
|
: getKeyCommand(osx, ({ ctrl, shift }) => `${t('rte_bulleted_list')} (${ctrl}${shift}L)`), label: t('rte_bulleted_list'), children: _jsx(Icon, { name: 'list' }) }), _jsx(ToolbarButton, { "data-testid": testIds.numberedList, onMouseDown: e => {
|
|
147
251
|
e.preventDefault();
|
|
148
|
-
editor.
|
|
252
|
+
editor.chain().focus().toggleOrderedList().run();
|
|
149
253
|
}, active: activeStyles.orderedList, tooltip: t('rte_numbered_list'), label: t('rte_numbered_list'), children: _jsx(Icon, { name: 'list-number' }) })] })), activeFeatures.indentation && (_jsxs(_Fragment, { children: [_jsx(ToolbarButton, { "data-testid": testIds.indent, onMouseDown: e => {
|
|
150
254
|
e.preventDefault();
|
|
151
|
-
|
|
255
|
+
// Try text indent first, fallback to list indent
|
|
256
|
+
const textIndented = editor.chain().focus().indent().run();
|
|
257
|
+
if (!textIndented) {
|
|
258
|
+
editor.chain().focus().sinkListItem('listItem').run();
|
|
259
|
+
}
|
|
152
260
|
}, label: t('rte_indent'), tooltip: isMobile ? tooltipMobile('indent') : getIndentationToolTip('indent'), children: _jsx(Icon, { name: 'indent' }) }), _jsx(ToolbarButton, { "data-testid": testIds.unindent, onMouseDown: e => {
|
|
153
261
|
e.preventDefault();
|
|
154
|
-
|
|
155
|
-
|
|
262
|
+
// Try text outdent first, fallback to list outdent
|
|
263
|
+
const textOutdented = editor.chain().focus().outdent().run();
|
|
264
|
+
if (!textOutdented) {
|
|
265
|
+
editor.chain().focus().liftListItem('listItem').run();
|
|
266
|
+
}
|
|
267
|
+
}, label: t('rte_unindent'), tooltip: isMobile ? tooltipMobile('unindent') : getIndentationToolTip('unindent'), children: _jsx(Icon, { name: 'unindent' }) })] })), (activeFeatures.alignment || activeFeatures.lists || activeFeatures.indentation) &&
|
|
268
|
+
(activeFeatures['font-size'] ||
|
|
269
|
+
activeFeatures['font-family'] ||
|
|
270
|
+
activeFeatures['text-color'] ||
|
|
271
|
+
activeFeatures['background-color']) && _jsx(ToolbarSeparator, {}), activeFeatures['font-size'] && (_jsx(FontSizeSelect, { "data-testid": testIds.fontSize, editor: editor })), activeFeatures['font-family'] && (_jsx(FontFamilySelect, { "data-testid": testIds.fontFamily, editor: editor })), activeFeatures['text-color'] && (_jsx(ColorPickerButton, { "data-testid": testIds.textColor, editor: editor, type: 'text' })), activeFeatures['background-color'] && (_jsx(ColorPickerButton, { "data-testid": testIds.backgroundColor, editor: editor, type: 'highlight' })), (activeFeatures['font-size'] ||
|
|
272
|
+
activeFeatures['font-family'] ||
|
|
273
|
+
activeFeatures['text-color'] ||
|
|
274
|
+
activeFeatures['background-color']) &&
|
|
275
|
+
activeFeatures['source-code'] && _jsx(ToolbarSeparator, {}), activeFeatures['source-code'] && (_jsx(SourceCodeButton, { "data-testid": testIds.sourceCode, active: sourceMode, onToggle: onSourceModeToggle }))] }), _jsxs(Flex, { container: { alignItems: 'center', gap: 0 }, children: [customActions?.map(({ text, icon, active, onMouseDown,
|
|
156
276
|
// Avoid spreading shortcut to DOM attribute
|
|
157
277
|
shortcut, ...rest }) => {
|
|
158
278
|
return (_createElement(ToolbarButton, { ...rest, onMouseDown: e => {
|
|
@@ -160,7 +280,9 @@ const Toolbar = ({ testId, features, sticky, editor, customActions, ...restProps
|
|
|
160
280
|
onMouseDown(e);
|
|
161
281
|
}, tooltip: text, label: text, key: icon, active: active?.(editor) || false },
|
|
162
282
|
_jsx(Icon, { name: icon })));
|
|
163
|
-
}), activeFeatures.links && (_jsx(AnchorButton, { "data-testid": testIds.link, editor: editor, osx: osx })), activeFeatures.images && _jsx(ImageButton, { "data-testid": testIds.image, editor: editor })
|
|
283
|
+
}), activeFeatures.links && (_jsx(AnchorButton, { "data-testid": testIds.link, editor: editor, osx: osx })), activeFeatures.images && (_jsx(ImageButton, { "data-testid": testIds.image, editor: editor, imageInsertionMode: imageInsertionMode })), activeFeatures.tables && _jsx(TableButton, { "data-testid": testIds.table, editor: editor }), (activeFeatures.links || activeFeatures.images || activeFeatures.tables) &&
|
|
284
|
+
activeFeatures['ai-rewrite'] &&
|
|
285
|
+
onRewriteClick && _jsx(ToolbarSeparator, {}), activeFeatures['ai-rewrite'] && onRewriteClick && (_jsx(AIRewriteButton, { "data-testid": testIds.aiRewrite, editor: editor, onRewriteClick: onRewriteClick, renderSuggestionEditor: renderSuggestionEditor }))] })] }));
|
|
164
286
|
};
|
|
165
287
|
export default withTestIds(Toolbar, getToolbarTestIds);
|
|
166
288
|
//# sourceMappingURL=Toolbar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.js","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/Toolbar.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\nimport type { FC } from 'react';\nimport styled, { css } from 'styled-components';\nimport type { Editor } from 'tinymce';\n\nimport {\n Flex,\n Icon,\n useArrows,\n useI18n,\n defaultThemeProp,\n registerIcon,\n useOS,\n navigatorIsAvailable,\n useTestIds,\n withTestIds\n} from '@pega/cosmos-react-core';\nimport type { TestIdProp, TranslationPack } from '@pega/cosmos-react-core';\nimport type { TranslationFunction } from '@pega/cosmos-react-core/lib/i18n/translate';\nimport * as listIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/list.icon';\nimport * as listNumberIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/list-number.icon';\nimport * as indentIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/indent.icon';\nimport * as unindentIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/unindent.icon';\n\nimport ToolbarButton from '../../RichTextEditor/Toolbar/ToolbarButton';\nimport type { StyleType, Features } from '../../RichTextEditor/Toolbar/Toolbar.types';\nimport { getKeyCommand } from '../../RichTextEditor/Toolbar/utils';\nimport type { CustomAction } from '../Editor.types';\n\nimport ImageButton from './ImageButton';\nimport TextSelect from './TextSelect';\nimport AnchorButton from './AnchorButton';\nimport { getToolbarTestIds } from './Toolbar.test-ids';\nimport type { elements } from './Toolbar.test-ids';\n\nregisterIcon(listIcon, listNumberIcon, indentIcon, unindentIcon);\n\nconst StyledToolbar = styled.div<{ sticky?: boolean }>(({ sticky, theme }) => {\n return css`\n background-color: ${theme.base.palette['primary-background']};\n border-radius: calc(0.25 * ${theme.base['border-radius']});\n overflow: auto;\n padding: calc(0.5 * ${theme.base.spacing});\n ${sticky &&\n css`\n position: sticky;\n bottom: 0;\n `}\n\n &:has(:focus-visible) {\n box-shadow: ${theme.base.shadow['focus-group']};\n }\n `;\n});\n\nStyledToolbar.defaultProps = defaultThemeProp;\n\nexport interface ToolbarProps extends TestIdProp<typeof elements> {\n features: Features[];\n sticky?: boolean;\n editor: Editor;\n customActions?: CustomAction[];\n}\n\ntype StyleButtonType = {\n 'data-testid'?: string;\n style: StyleType;\n text: string;\n icon?: string;\n label?: string;\n format: string;\n element?: string;\n tooltip: string;\n};\n\nconst isMobile = navigatorIsAvailable && navigator.userAgent.includes('Mobile');\n\n// Function that returns the text styling buttons\nfunction renderStyleButtons(\n editor: Editor,\n t: TranslationFunction<TranslationPack>,\n activeStyles: { [key: string]: boolean },\n osx: boolean,\n testIds: Pick<\n Partial<ReturnType<typeof getToolbarTestIds>>,\n 'bold' | 'italic' | 'strikeThrough' | 'textStyles'\n >\n) {\n const inlineStyleButtons: StyleButtonType[] = [\n {\n 'data-testid': testIds.bold,\n style: 'BOLD',\n text: 'B',\n format: 'Bold',\n label: t('rte_bold'),\n element: 'strong',\n tooltip: isMobile\n ? `${t('rte_bold')}`\n : getKeyCommand(osx, ({ ctrl, shift }) => `${t('rte_bold')} (${ctrl}B, ${ctrl}${shift}B)`)\n },\n {\n 'data-testid': testIds.italic,\n style: 'ITALIC',\n text: 'I',\n format: 'Italic',\n label: t('rte_italic'),\n element: 'i',\n tooltip: isMobile\n ? `${t('rte_italic')}`\n : getKeyCommand(osx, ({ ctrl, shift }) => `${t('rte_italic')} (${ctrl}I, ${ctrl}${shift}I)`)\n },\n {\n 'data-testid': testIds.strikeThrough,\n style: 'STRIKE-THROUGH',\n text: 'S',\n format: 'Strikethrough',\n element: 's',\n label: t('rte_strike_through'),\n tooltip: isMobile\n ? `${t('rte_strike_through')}`\n : getKeyCommand(osx, ({ ctrl, shift }) => `${t('rte_strike_through')} (${ctrl}${shift}X)`)\n }\n ];\n\n return (\n <>\n <TextSelect data-testid={testIds.textStyles} osx={osx} editor={editor} />\n {inlineStyleButtons.map(\n ({ format, style, text, label, tooltip, 'data-testid': dataTestId }) => {\n return (\n <ToolbarButton\n data-testid={dataTestId}\n key={style}\n onMouseDown={e => {\n e.preventDefault();\n if (editor.hasFocus()) {\n editor.execCommand(format);\n } else {\n editor.focus();\n setTimeout(() => {\n editor.execCommand(format);\n }, 0);\n }\n }}\n styleType={style}\n active={activeStyles[format.toLowerCase()]}\n tooltip={tooltip}\n label={label}\n >\n {text}\n </ToolbarButton>\n );\n }\n )}\n </>\n );\n}\n\n// Takes the features array and transforms it into a map for faster lookup\nfunction createActiveFeaturesMap(features: Features[]) {\n return features.reduce(\n (acc, feature) => {\n return { ...acc, [feature]: true };\n },\n {} as { [F in Features]: boolean }\n );\n}\n\nconst Toolbar: FC<ToolbarProps> = ({\n testId,\n features,\n sticky,\n editor,\n customActions,\n ...restProps\n}: ToolbarProps) => {\n const t = useI18n();\n const { macintosh: osx } = useOS();\n const toolbarRef = useRef<HTMLElement>(null);\n const testIds = useTestIds(testId, getToolbarTestIds);\n\n useArrows(toolbarRef, { selector: 'button', dir: 'left-right', updateTabIndex: false });\n\n const [activeFeatures, setActiveFeatures] = useState(() => createActiveFeaturesMap(features));\n const [activeStyles, setActiveStyles] = useState(() => ({\n bold: false,\n italic: false,\n strikethrough: false,\n unorderedList: false,\n orderedList: false\n }));\n\n const getIndentationToolTip = (type: 'indent' | 'unindent') =>\n getKeyCommand(osx, ({ shift, alt }) =>\n type === 'indent' ? `${t('rte_indent')} (${alt}M)` : `${t('rte_unindent')} (${alt}${shift}M)`\n );\n const tooltipMobile = (type: 'indent' | 'unindent') =>\n type === 'indent' ? `${t('rte_indent')}` : `${t('rte_unindent')}`;\n\n useEffect(() => {\n setActiveFeatures(createActiveFeaturesMap(features));\n }, [features]);\n\n const getActiveStyles = useCallback(() => {\n if (editor.hasFocus()) {\n setActiveStyles({\n bold: editor.queryCommandState('Bold'),\n italic: editor.queryCommandState('Italic'),\n strikethrough: editor.queryCommandState('Strikethrough'),\n unorderedList: editor.queryCommandState('InsertUnorderedList'),\n orderedList: editor.queryCommandState('InsertOrderedList')\n });\n } else {\n setActiveStyles({\n bold: false,\n italic: false,\n strikethrough: false,\n unorderedList: false,\n orderedList: false\n });\n }\n }, [editor, setActiveStyles]);\n\n useEffect(() => {\n getActiveStyles();\n editor.on('SelectionChange', getActiveStyles);\n return () => {\n editor.off('SelectionChange', getActiveStyles);\n };\n }, [editor, getActiveStyles]);\n\n return (\n <Flex\n data-testid={testIds.toolbar}\n {...restProps}\n as={StyledToolbar}\n sticky={sticky}\n container={{ justify: 'between' }}\n ref={toolbarRef}\n >\n <Flex container={{ alignItems: 'end' }}>\n {activeFeatures['inline-styling'] &&\n renderStyleButtons(editor, t, activeStyles, osx, testIds)}\n {activeFeatures.lists && (\n <>\n <ToolbarButton\n data-testid={testIds.bulletedList}\n onMouseDown={e => {\n e.preventDefault();\n editor.execCommand('InsertUnorderedList');\n }}\n active={activeStyles.unorderedList}\n tooltip={\n isMobile\n ? `${t('rte_bulleted_list')}`\n : getKeyCommand(\n osx,\n ({ ctrl, shift }) => `${t('rte_bulleted_list')} (${ctrl}${shift}L)`\n )\n }\n label={t('rte_bulleted_list')}\n >\n <Icon name='list' />\n </ToolbarButton>\n <ToolbarButton\n data-testid={testIds.numberedList}\n onMouseDown={e => {\n e.preventDefault();\n editor.execCommand('InsertOrderedList');\n }}\n active={activeStyles.orderedList}\n tooltip={t('rte_numbered_list')}\n label={t('rte_numbered_list')}\n >\n <Icon name='list-number' />\n </ToolbarButton>\n </>\n )}\n {activeFeatures.indentation && (\n <>\n <ToolbarButton\n data-testid={testIds.indent}\n onMouseDown={e => {\n e.preventDefault();\n editor.execCommand('Indent');\n }}\n label={t('rte_indent')}\n tooltip={isMobile ? tooltipMobile('indent') : getIndentationToolTip('indent')}\n >\n <Icon name='indent' />\n </ToolbarButton>\n <ToolbarButton\n data-testid={testIds.unindent}\n onMouseDown={e => {\n e.preventDefault();\n editor.execCommand('Outdent');\n }}\n label={t('rte_unindent')}\n tooltip={isMobile ? tooltipMobile('unindent') : getIndentationToolTip('unindent')}\n >\n <Icon name='unindent' />\n </ToolbarButton>\n </>\n )}\n </Flex>\n <Flex container={{ alignItems: 'end' }}>\n {customActions?.map(\n ({\n text,\n icon,\n active,\n onMouseDown,\n // Avoid spreading shortcut to DOM attribute\n shortcut,\n ...rest\n }) => {\n return (\n <ToolbarButton\n {...rest}\n onMouseDown={e => {\n e.preventDefault();\n onMouseDown(e);\n }}\n tooltip={text}\n label={text}\n key={icon}\n active={active?.(editor) || false}\n >\n <Icon name={icon} />\n </ToolbarButton>\n );\n }\n )}\n {activeFeatures.links && (\n <AnchorButton data-testid={testIds.link} editor={editor} osx={osx} />\n )}\n {activeFeatures.images && <ImageButton data-testid={testIds.image} editor={editor} />}\n </Flex>\n </Flex>\n );\n};\n\nexport default withTestIds(Toolbar, getToolbarTestIds);\n"]}
|
|
1
|
+
{"version":3,"file":"Toolbar.js","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/Toolbar.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState, useEffect, useRef, useCallback } from 'react';\nimport type { ReactNode } from 'react';\nimport styled, { css } from 'styled-components';\nimport type { Editor as TiptapEditor } from '@tiptap/core';\n\nimport {\n Flex,\n Icon,\n useArrows,\n useI18n,\n defaultThemeProp,\n registerIcon,\n useOS,\n navigatorIsAvailable,\n useTestIds,\n withTestIds\n} from '@pega/cosmos-react-core';\nimport type { AIAction, TestIdProp, TranslationPack } from '@pega/cosmos-react-core';\nimport type { TranslationFunction } from '@pega/cosmos-react-core/lib/i18n/translate';\nimport * as listIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/list.icon';\nimport * as listNumberIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/list-number.icon';\nimport * as indentIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/indent.icon';\nimport * as unindentIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/unindent.icon';\n\nimport ToolbarButton from '../../RichTextEditor/Toolbar/ToolbarButton';\nimport type { StyleType, Features } from '../../RichTextEditor/Toolbar/Toolbar.types';\nimport { getKeyCommand } from '../../RichTextEditor/Toolbar/utils';\nimport type { CustomAction } from '../Editor.types';\n\nimport AIRewriteButton from './AIRewriteButton';\nimport ImageButton from './ImageButton';\nimport TextSelect from './TextSelect';\nimport AnchorButton from './AnchorButton';\nimport FontFamilySelect from './FontFamilySelect';\nimport FontSizeSelect from './FontSizeSelect';\nimport ColorPickerButton from './ColorPickerButton';\nimport TableButton from './TableButton';\nimport SourceCodeButton from './SourceCodeButton';\nimport AlignmentSelect from './AlignmentSelect';\nimport { getToolbarTestIds } from './Toolbar.test-ids';\nimport type { elements } from './Toolbar.test-ids';\n\nregisterIcon(listIcon, listNumberIcon, indentIcon, unindentIcon);\n\nconst StyledToolbar = styled.div<{ sticky?: boolean }>(({ sticky, theme }) => {\n return css`\n background-color: ${theme.components['form-control']['background-color']};\n border-end-start-radius: inherit;\n border-end-end-radius: inherit;\n overflow: auto;\n padding: calc(0.5 * ${theme.base.spacing});\n ${sticky &&\n css`\n position: sticky;\n bottom: 0;\n `}\n\n &:has(:focus-visible) {\n box-shadow: ${theme.base.shadow['focus-group']};\n }\n `;\n});\n\nconst ToolbarSeparator = styled.div(({ theme }) => {\n return css`\n width: calc(0.125 * ${theme.base.spacing});\n height: calc(3 * ${theme.base.spacing});\n background-color: ${theme.base.palette['border-line']};\n margin-block: calc(0.5 * ${theme.base.spacing});\n margin-inline: calc(0.25 * ${theme.base.spacing});\n `;\n});\n\nToolbarSeparator.defaultProps = defaultThemeProp;\n\nStyledToolbar.defaultProps = defaultThemeProp;\n\nconst SubscriptText = styled.span(({ theme }) => {\n return css`\n display: inline-flex;\n align-items: flex-end;\n span {\n font-size: calc(0.65 * ${theme.base['font-size']});\n margin-bottom: calc(-0.25 * ${theme.base.spacing});\n }\n `;\n});\n\nSubscriptText.defaultProps = defaultThemeProp;\n\nconst SuperscriptText = styled.span(({ theme }) => {\n return css`\n display: inline-flex;\n align-items: flex-start;\n span {\n font-size: calc(0.65 * ${theme.base['font-size']});\n margin-top: calc(-0.25 * ${theme.base.spacing});\n }\n `;\n});\n\nSuperscriptText.defaultProps = defaultThemeProp;\n\nexport interface ToolbarProps extends TestIdProp<typeof elements> {\n features: Features[];\n sticky?: boolean;\n editor: TiptapEditor;\n customActions?: CustomAction[];\n imageInsertionMode: 'file' | 'url' | 'all';\n onRewriteClick?: (\n originalText: string,\n rewriteAction: AIAction,\n additionalInstructions: string,\n onSuccess: (rewrittenText: string) => void\n ) => void;\n renderSuggestionEditor?: (props: {\n defaultValue?: string;\n disabled: boolean;\n readOnly: boolean;\n onGetContent: (getContent: () => string) => void;\n onContentChange: (hasContent: boolean) => void;\n }) => ReactNode;\n sourceMode?: boolean;\n onSourceModeToggle?: (isSourceMode: boolean) => void;\n}\n\ntype StyleButtonType = {\n 'data-testid'?: string;\n style: StyleType;\n text: string;\n icon?: string;\n label?: string;\n format: string;\n element?: string;\n tooltip: string;\n};\n\nconst isMobile = navigatorIsAvailable && navigator.userAgent.includes('Mobile');\n\n// Individual inline style button definitions - keyed by format for safe lookup\nfunction getInlineStyleButtons(\n t: TranslationFunction<TranslationPack>,\n osx: boolean,\n testIds: Pick<Partial<ReturnType<typeof getToolbarTestIds>>, 'bold' | 'italic' | 'strikeThrough'>\n): { bold: StyleButtonType; italic: StyleButtonType; strikethrough: StyleButtonType } {\n return {\n bold: {\n 'data-testid': testIds.bold,\n style: 'BOLD',\n text: 'B',\n format: 'Bold',\n label: t('rte_bold'),\n element: 'strong',\n tooltip: isMobile\n ? `${t('rte_bold')}`\n : getKeyCommand(osx, ({ ctrl, shift }) => `${t('rte_bold')} (${ctrl}B, ${ctrl}${shift}B)`)\n },\n italic: {\n 'data-testid': testIds.italic,\n style: 'ITALIC',\n text: 'I',\n format: 'Italic',\n label: t('rte_italic'),\n element: 'i',\n tooltip: isMobile\n ? `${t('rte_italic')}`\n : getKeyCommand(osx, ({ ctrl, shift }) => `${t('rte_italic')} (${ctrl}I, ${ctrl}${shift}I)`)\n },\n strikethrough: {\n 'data-testid': testIds.strikeThrough,\n style: 'STRIKE-THROUGH',\n text: 'S',\n format: 'Strikethrough',\n element: 's',\n label: t('rte_strike_through'),\n tooltip: isMobile\n ? `${t('rte_strike_through')}`\n : getKeyCommand(osx, ({ ctrl, shift }) => `${t('rte_strike_through')} (${ctrl}${shift}X)`)\n }\n };\n}\n\n// Render a single inline style button\nfunction renderInlineStyleButton(\n editor: TiptapEditor,\n button: StyleButtonType,\n activeStyles: { [key: string]: boolean }\n) {\n const { format, style, text, label, tooltip, 'data-testid': dataTestId } = button;\n return (\n <ToolbarButton\n data-testid={dataTestId}\n key={style}\n onMouseDown={e => {\n e.preventDefault();\n const chain = editor.chain().focus();\n if (format === 'Bold') {\n chain.toggleBold().run();\n } else if (format === 'Italic') {\n chain.toggleItalic().run();\n } else if (format === 'Strikethrough') {\n chain.toggleStrike().run();\n }\n }}\n styleType={style}\n active={activeStyles[format.toLowerCase()]}\n tooltip={tooltip}\n label={label}\n >\n {text}\n </ToolbarButton>\n );\n}\n\n// Takes the features array and transforms it into a map for faster lookup\nfunction createActiveFeaturesMap(features: Features[]) {\n return features.reduce(\n (acc, feature) => {\n return { ...acc, [feature]: true };\n },\n {} as { [F in Features]: boolean }\n );\n}\n\nconst Toolbar = ({\n testId,\n features,\n sticky,\n editor,\n customActions,\n imageInsertionMode,\n onRewriteClick,\n renderSuggestionEditor,\n sourceMode,\n onSourceModeToggle,\n ...restProps\n}: ToolbarProps) => {\n const t = useI18n();\n const { macintosh: osx } = useOS();\n const toolbarRef = useRef<HTMLElement>(null);\n const testIds = useTestIds(testId, getToolbarTestIds);\n\n useArrows(toolbarRef, {\n selector: '[data-toolbar-item=\"true\"]',\n dir: 'left-right'\n });\n\n const [activeFeatures, setActiveFeatures] = useState(() => createActiveFeaturesMap(features));\n const [activeStyles, setActiveStyles] = useState(() => ({\n bold: false,\n italic: false,\n strikethrough: false,\n underline: false,\n subscript: false,\n superscript: false,\n unorderedList: false,\n orderedList: false,\n alignLeft: false,\n alignCenter: false,\n alignRight: false\n }));\n\n const getIndentationToolTip = (type: 'indent' | 'unindent') =>\n getKeyCommand(osx, ({ shift, alt }) =>\n type === 'indent' ? `${t('rte_indent')} (${alt}M)` : `${t('rte_unindent')} (${alt}${shift}M)`\n );\n const tooltipMobile = (type: 'indent' | 'unindent') =>\n type === 'indent' ? `${t('rte_indent')}` : `${t('rte_unindent')}`;\n\n useEffect(() => {\n setActiveFeatures(createActiveFeaturesMap(features));\n }, [features]);\n\n const getActiveStyles = useCallback(() => {\n if (!editor) {\n setActiveStyles({\n bold: false,\n italic: false,\n strikethrough: false,\n underline: false,\n subscript: false,\n superscript: false,\n unorderedList: false,\n orderedList: false,\n alignLeft: false,\n alignCenter: false,\n alignRight: false\n });\n return;\n }\n // Tiptap API only\n setActiveStyles({\n bold: editor.isActive('bold'),\n italic: editor.isActive('italic'),\n strikethrough: editor.isActive('strike'),\n underline: editor.isActive('underline'),\n subscript: editor.isActive('subscript'),\n superscript: editor.isActive('superscript'),\n unorderedList: editor.isActive('bulletList'),\n orderedList: editor.isActive('orderedList'),\n alignLeft: editor.isActive({ textAlign: 'left' }),\n alignCenter: editor.isActive({ textAlign: 'center' }),\n alignRight: editor.isActive({ textAlign: 'right' })\n });\n }, [editor, setActiveStyles]);\n\n useEffect(() => {\n getActiveStyles();\n editor.on('selectionUpdate', getActiveStyles);\n editor.on('transaction', getActiveStyles);\n return () => {\n editor.off('selectionUpdate', getActiveStyles);\n editor.off('transaction', getActiveStyles);\n };\n }, [editor, getActiveStyles]);\n\n return (\n <Flex\n data-testid={testIds.toolbar}\n {...restProps}\n as={StyledToolbar}\n sticky={sticky}\n container={{ justify: 'between' }}\n ref={toolbarRef}\n >\n <Flex container={{ alignItems: 'center', gap: 0 }}>\n {/* Text styling group - TextSelect only when headers feature is enabled */}\n {activeFeatures.headers && (\n <TextSelect data-testid={testIds.textStyles} osx={osx} editor={editor} />\n )}\n {(() => {\n const buttons = getInlineStyleButtons(t, osx, testIds);\n // 'inline-styling' enables all three; individual features enable specific ones\n if (activeFeatures['inline-styling']) {\n return Object.values(buttons).map(btn =>\n renderInlineStyleButton(editor, btn, activeStyles)\n );\n }\n return (\n <>\n {activeFeatures.bold && renderInlineStyleButton(editor, buttons.bold, activeStyles)}\n {activeFeatures.italic &&\n renderInlineStyleButton(editor, buttons.italic, activeStyles)}\n {activeFeatures.strikethrough &&\n renderInlineStyleButton(editor, buttons.strikethrough, activeStyles)}\n </>\n );\n })()}\n {activeFeatures.underline && (\n <ToolbarButton\n data-testid={testIds.underline}\n styleType='UNDERLINE'\n onMouseDown={e => {\n e.preventDefault();\n editor.chain().focus().toggleUnderline().run();\n }}\n active={activeStyles.underline}\n tooltip={\n isMobile\n ? t('rte_underline')\n : getKeyCommand(osx, ({ ctrl }) => `${t('rte_underline')} (${ctrl}U)`)\n }\n label={t('rte_underline')}\n >\n U\n </ToolbarButton>\n )}\n {activeFeatures.subscript && (\n <ToolbarButton\n data-testid={testIds.subscript}\n styleType='SUBSCRIPT'\n onMouseDown={e => {\n e.preventDefault();\n // Turn off superscript first if it's active, then toggle subscript\n if (editor.isActive('superscript')) {\n editor.chain().focus().unsetSuperscript().toggleSubscript().run();\n } else {\n editor.chain().focus().toggleSubscript().run();\n }\n }}\n active={activeStyles.subscript}\n tooltip={t('rte_subscript')}\n label={t('rte_subscript')}\n >\n <SubscriptText>\n X<span>2</span>\n </SubscriptText>\n </ToolbarButton>\n )}\n {activeFeatures.superscript && (\n <ToolbarButton\n data-testid={testIds.superscript}\n styleType='SUPERSCRIPT'\n onMouseDown={e => {\n e.preventDefault();\n // Turn off subscript first if it's active, then toggle superscript\n if (editor.isActive('subscript')) {\n editor.chain().focus().unsetSubscript().toggleSuperscript().run();\n } else {\n editor.chain().focus().toggleSuperscript().run();\n }\n }}\n active={activeStyles.superscript}\n tooltip={t('rte_superscript')}\n label={t('rte_superscript')}\n >\n <SuperscriptText>\n X<span>2</span>\n </SuperscriptText>\n </ToolbarButton>\n )}\n {/* Separator after text styling */}\n {(activeFeatures['inline-styling'] ||\n activeFeatures.bold ||\n activeFeatures.italic ||\n activeFeatures.strikethrough ||\n activeFeatures.underline ||\n activeFeatures.subscript ||\n activeFeatures.superscript) &&\n (activeFeatures.alignment || activeFeatures.lists || activeFeatures.indentation) && (\n <ToolbarSeparator />\n )}\n {/* Layout group: alignment, lists, indentation */}\n {activeFeatures.alignment && (\n <AlignmentSelect data-testid={testIds.alignment} editor={editor} />\n )}\n {activeFeatures.lists && (\n <>\n <ToolbarButton\n data-testid={testIds.bulletedList}\n onMouseDown={e => {\n e.preventDefault();\n editor.chain().focus().toggleBulletList().run();\n }}\n active={activeStyles.unorderedList}\n tooltip={\n isMobile\n ? `${t('rte_bulleted_list')}`\n : getKeyCommand(\n osx,\n ({ ctrl, shift }) => `${t('rte_bulleted_list')} (${ctrl}${shift}L)`\n )\n }\n label={t('rte_bulleted_list')}\n >\n <Icon name='list' />\n </ToolbarButton>\n <ToolbarButton\n data-testid={testIds.numberedList}\n onMouseDown={e => {\n e.preventDefault();\n editor.chain().focus().toggleOrderedList().run();\n }}\n active={activeStyles.orderedList}\n tooltip={t('rte_numbered_list')}\n label={t('rte_numbered_list')}\n >\n <Icon name='list-number' />\n </ToolbarButton>\n </>\n )}\n {activeFeatures.indentation && (\n <>\n <ToolbarButton\n data-testid={testIds.indent}\n onMouseDown={e => {\n e.preventDefault();\n // Try text indent first, fallback to list indent\n const textIndented = editor.chain().focus().indent().run();\n if (!textIndented) {\n editor.chain().focus().sinkListItem('listItem').run();\n }\n }}\n label={t('rte_indent')}\n tooltip={isMobile ? tooltipMobile('indent') : getIndentationToolTip('indent')}\n >\n <Icon name='indent' />\n </ToolbarButton>\n <ToolbarButton\n data-testid={testIds.unindent}\n onMouseDown={e => {\n e.preventDefault();\n // Try text outdent first, fallback to list outdent\n const textOutdented = editor.chain().focus().outdent().run();\n if (!textOutdented) {\n editor.chain().focus().liftListItem('listItem').run();\n }\n }}\n label={t('rte_unindent')}\n tooltip={isMobile ? tooltipMobile('unindent') : getIndentationToolTip('unindent')}\n >\n <Icon name='unindent' />\n </ToolbarButton>\n </>\n )}\n {/* Separator after layout group */}\n {(activeFeatures.alignment || activeFeatures.lists || activeFeatures.indentation) &&\n (activeFeatures['font-size'] ||\n activeFeatures['font-family'] ||\n activeFeatures['text-color'] ||\n activeFeatures['background-color']) && <ToolbarSeparator />}\n {/* Design group: font size, font family, text color, background color */}\n {activeFeatures['font-size'] && (\n <FontSizeSelect data-testid={testIds.fontSize} editor={editor} />\n )}\n {activeFeatures['font-family'] && (\n <FontFamilySelect data-testid={testIds.fontFamily} editor={editor} />\n )}\n {activeFeatures['text-color'] && (\n <ColorPickerButton data-testid={testIds.textColor} editor={editor} type='text' />\n )}\n {activeFeatures['background-color'] && (\n <ColorPickerButton\n data-testid={testIds.backgroundColor}\n editor={editor}\n type='highlight'\n />\n )}\n {/* Separator before source-code */}\n {(activeFeatures['font-size'] ||\n activeFeatures['font-family'] ||\n activeFeatures['text-color'] ||\n activeFeatures['background-color']) &&\n activeFeatures['source-code'] && <ToolbarSeparator />}\n {activeFeatures['source-code'] && (\n <SourceCodeButton\n data-testid={testIds.sourceCode}\n active={sourceMode}\n onToggle={onSourceModeToggle}\n />\n )}\n </Flex>\n <Flex container={{ alignItems: 'center', gap: 0 }}>\n {customActions?.map(\n ({\n text,\n icon,\n active,\n onMouseDown,\n // Avoid spreading shortcut to DOM attribute\n shortcut,\n ...rest\n }) => {\n return (\n <ToolbarButton\n {...rest}\n onMouseDown={e => {\n e.preventDefault();\n onMouseDown(e);\n }}\n tooltip={text}\n label={text}\n key={icon}\n active={active?.(editor) || false}\n >\n <Icon name={icon} />\n </ToolbarButton>\n );\n }\n )}\n {/* Insert group: links, images, source-code, tables */}\n {activeFeatures.links && (\n <AnchorButton data-testid={testIds.link} editor={editor} osx={osx} />\n )}\n {activeFeatures.images && (\n <ImageButton\n data-testid={testIds.image}\n editor={editor}\n imageInsertionMode={imageInsertionMode}\n />\n )}\n {activeFeatures.tables && <TableButton data-testid={testIds.table} editor={editor} />}\n {/* Separator before AI */}\n {(activeFeatures.links || activeFeatures.images || activeFeatures.tables) &&\n activeFeatures['ai-rewrite'] &&\n onRewriteClick && <ToolbarSeparator />}\n {activeFeatures['ai-rewrite'] && onRewriteClick && (\n <AIRewriteButton\n data-testid={testIds.aiRewrite}\n editor={editor}\n onRewriteClick={onRewriteClick}\n renderSuggestionEditor={renderSuggestionEditor}\n />\n )}\n </Flex>\n </Flex>\n );\n};\n\nexport default withTestIds(Toolbar, getToolbarTestIds);\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare const elements: readonly ["toolbar", "text-styles", "bold", "italic", "strike-through", "bulleted-list", "numbered-list", "indent", "unindent", "link", "image"];
|
|
2
|
-
export declare const getToolbarTestIds: (testIdProp?: import("@pega/cosmos-react-core").TestIdProp["testId"]) => import("@pega/cosmos-react-core").TestIdsRecord<readonly ["toolbar", "text-styles", "bold", "italic", "strike-through", "bulleted-list", "numbered-list", "indent", "unindent", "link", "image"]>;
|
|
1
|
+
export declare const elements: readonly ["toolbar", "text-styles", "bold", "italic", "strike-through", "underline", "subscript", "superscript", "font-family", "font-size", "text-color", "background-color", "alignment", "align-left", "align-center", "align-right", "bulleted-list", "numbered-list", "indent", "unindent", "table", "link", "image", "source-code", "ai-rewrite", "overflow", "word-count"];
|
|
2
|
+
export declare const getToolbarTestIds: (testIdProp?: import("@pega/cosmos-react-core").TestIdProp["testId"]) => import("@pega/cosmos-react-core").TestIdsRecord<readonly ["toolbar", "text-styles", "bold", "italic", "strike-through", "underline", "subscript", "superscript", "font-family", "font-size", "text-color", "background-color", "alignment", "align-left", "align-center", "align-right", "bulleted-list", "numbered-list", "indent", "unindent", "table", "link", "image", "source-code", "ai-rewrite", "overflow", "word-count"]>;
|
|
3
3
|
//# sourceMappingURL=Toolbar.test-ids.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.test-ids.d.ts","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/Toolbar.test-ids.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"Toolbar.test-ids.d.ts","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/Toolbar.test-ids.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,mXA4BX,CAAC;AAEX,eAAO,MAAM,iBAAiB,6eAAqC,CAAC"}
|
|
@@ -5,12 +5,28 @@ export const elements = [
|
|
|
5
5
|
'bold',
|
|
6
6
|
'italic',
|
|
7
7
|
'strike-through',
|
|
8
|
+
'underline',
|
|
9
|
+
'subscript',
|
|
10
|
+
'superscript',
|
|
11
|
+
'font-family',
|
|
12
|
+
'font-size',
|
|
13
|
+
'text-color',
|
|
14
|
+
'background-color',
|
|
15
|
+
'alignment',
|
|
16
|
+
'align-left',
|
|
17
|
+
'align-center',
|
|
18
|
+
'align-right',
|
|
8
19
|
'bulleted-list',
|
|
9
20
|
'numbered-list',
|
|
10
21
|
'indent',
|
|
11
22
|
'unindent',
|
|
23
|
+
'table',
|
|
12
24
|
'link',
|
|
13
|
-
'image'
|
|
25
|
+
'image',
|
|
26
|
+
'source-code',
|
|
27
|
+
'ai-rewrite',
|
|
28
|
+
'overflow',
|
|
29
|
+
'word-count'
|
|
14
30
|
];
|
|
15
31
|
export const getToolbarTestIds = createTestIds('toolbar', elements);
|
|
16
32
|
//# sourceMappingURL=Toolbar.test-ids.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.test-ids.js","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/Toolbar.test-ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,SAAS;IACT,aAAa;IACb,MAAM;IACN,QAAQ;IACR,gBAAgB;IAChB,eAAe;IACf,eAAe;IACf,QAAQ;IACR,UAAU;IACV,MAAM;IACN,OAAO;
|
|
1
|
+
{"version":3,"file":"Toolbar.test-ids.js","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/Toolbar.test-ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,SAAS;IACT,aAAa;IACb,MAAM;IACN,QAAQ;IACR,gBAAgB;IAChB,WAAW;IACX,WAAW;IACX,aAAa;IACb,aAAa;IACb,WAAW;IACX,YAAY;IACZ,kBAAkB;IAClB,WAAW;IACX,YAAY;IACZ,cAAc;IACd,aAAa;IACb,eAAe;IACf,eAAe;IACf,QAAQ;IACR,UAAU;IACV,OAAO;IACP,MAAM;IACN,OAAO;IACP,aAAa;IACb,YAAY;IACZ,UAAU;IACV,YAAY;CACJ,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC","sourcesContent":["import { createTestIds } from '@pega/cosmos-react-core';\n\nexport const elements = [\n 'toolbar',\n 'text-styles',\n 'bold',\n 'italic',\n 'strike-through',\n 'underline',\n 'subscript',\n 'superscript',\n 'font-family',\n 'font-size',\n 'text-color',\n 'background-color',\n 'alignment',\n 'align-left',\n 'align-center',\n 'align-right',\n 'bulleted-list',\n 'numbered-list',\n 'indent',\n 'unindent',\n 'table',\n 'link',\n 'image',\n 'source-code',\n 'ai-rewrite',\n 'overflow',\n 'word-count'\n] as const;\n\nexport const getToolbarTestIds = createTestIds('toolbar', elements);\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Editor as TiptapEditor } from '@tiptap/core';
|
|
2
|
+
interface WordCountProps {
|
|
3
|
+
editor: TiptapEditor;
|
|
4
|
+
'data-testid'?: string;
|
|
5
|
+
}
|
|
6
|
+
declare const WordCount: ({ editor, "data-testid": dataTestId }: WordCountProps) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export default WordCount;
|
|
8
|
+
//# sourceMappingURL=WordCount.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WordCount.d.ts","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/WordCount.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AAW3D,UAAU,cAAc;IACtB,MAAM,EAAE,YAAY,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,QAAA,MAAM,SAAS,GAAI,uCAAuC,cAAc,4CA6BvE,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import styled from 'styled-components';
|
|
4
|
+
import { Text, useI18n, defaultThemeProp } from '@pega/cosmos-react-core';
|
|
5
|
+
const StyledText = styled(Text) `
|
|
6
|
+
text-align: right;
|
|
7
|
+
`;
|
|
8
|
+
StyledText.defaultProps = defaultThemeProp;
|
|
9
|
+
const WordCount = ({ editor, 'data-testid': dataTestId }) => {
|
|
10
|
+
const t = useI18n();
|
|
11
|
+
const [wordCount, setWordCount] = useState(0);
|
|
12
|
+
const [charCount, setCharCount] = useState(0);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
const updateCounts = () => {
|
|
15
|
+
const text = editor.getText();
|
|
16
|
+
const trimmedText = text.trim();
|
|
17
|
+
const words = trimmedText ? trimmedText.split(/\s+/).length : 0;
|
|
18
|
+
const chars = text.length;
|
|
19
|
+
setWordCount(words);
|
|
20
|
+
setCharCount(chars);
|
|
21
|
+
};
|
|
22
|
+
updateCounts();
|
|
23
|
+
editor.on('update', updateCounts);
|
|
24
|
+
return () => {
|
|
25
|
+
editor.off('update', updateCounts);
|
|
26
|
+
};
|
|
27
|
+
}, [editor]);
|
|
28
|
+
return (_jsxs(StyledText, { variant: 'secondary', "data-testid": dataTestId, children: [t('rte_word_count', [wordCount], { count: wordCount }), ",", ' ', t('rte_character_count', [charCount], { count: charCount })] }));
|
|
29
|
+
};
|
|
30
|
+
export default WordCount;
|
|
31
|
+
//# sourceMappingURL=WordCount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WordCount.js","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/WordCount.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE1E,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;;CAE9B,CAAC;AAEF,UAAU,CAAC,YAAY,GAAG,gBAAgB,CAAC;AAO3C,MAAM,SAAS,GAAG,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAkB,EAAE,EAAE;IAC1E,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE9C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAChE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;YAC1B,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC;QAEF,YAAY,EAAE,CAAC;QACf,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAElC,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACrC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,CACL,MAAC,UAAU,IAAC,OAAO,EAAC,WAAW,iBAAc,UAAU,aACpD,CAAC,CAAC,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,OAAG,GAAG,EAC5D,CAAC,CAAC,qBAAqB,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,IACjD,CACd,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,SAAS,CAAC","sourcesContent":["import { useState, useEffect } from 'react';\nimport type { Editor as TiptapEditor } from '@tiptap/core';\nimport styled from 'styled-components';\n\nimport { Text, useI18n, defaultThemeProp } from '@pega/cosmos-react-core';\n\nconst StyledText = styled(Text)`\n text-align: right;\n`;\n\nStyledText.defaultProps = defaultThemeProp;\n\ninterface WordCountProps {\n editor: TiptapEditor;\n 'data-testid'?: string;\n}\n\nconst WordCount = ({ editor, 'data-testid': dataTestId }: WordCountProps) => {\n const t = useI18n();\n const [wordCount, setWordCount] = useState(0);\n const [charCount, setCharCount] = useState(0);\n\n useEffect(() => {\n const updateCounts = () => {\n const text = editor.getText();\n const trimmedText = text.trim();\n const words = trimmedText ? trimmedText.split(/\\s+/).length : 0;\n const chars = text.length;\n setWordCount(words);\n setCharCount(chars);\n };\n\n updateCounts();\n editor.on('update', updateCounts);\n\n return () => {\n editor.off('update', updateCounts);\n };\n }, [editor]);\n\n return (\n <StyledText variant='secondary' data-testid={dataTestId}>\n {t('rte_word_count', [wordCount], { count: wordCount })},{' '}\n {t('rte_character_count', [charCount], { count: charCount })}\n </StyledText>\n );\n};\n\nexport default WordCount;\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Extension } from '@tiptap/core';
|
|
2
|
+
import '@tiptap/extension-text-style';
|
|
3
|
+
export interface FontSizeOptions {
|
|
4
|
+
types: string[];
|
|
5
|
+
}
|
|
6
|
+
declare module '@tiptap/core' {
|
|
7
|
+
interface Commands<ReturnType> {
|
|
8
|
+
fontSize: {
|
|
9
|
+
/**
|
|
10
|
+
* Set the font size
|
|
11
|
+
*/
|
|
12
|
+
setFontSize: (size: string) => ReturnType;
|
|
13
|
+
/**
|
|
14
|
+
* Unset the font size
|
|
15
|
+
*/
|
|
16
|
+
unsetFontSize: () => ReturnType;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export declare const FontSize: Extension<FontSizeOptions, any>;
|
|
21
|
+
//# sourceMappingURL=FontSize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FontSize.d.ts","sourceRoot":"","sources":["../../../../src/components/Editor/extensions/FontSize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,8BAA8B,CAAC;AAEtC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,QAAQ,EAAE;YACR;;eAEG;YACH,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,CAAC;YAC1C;;eAEG;YACH,aAAa,EAAE,MAAM,UAAU,CAAC;SACjC,CAAC;KACH;CACF;AAED,eAAO,MAAM,QAAQ,iCA8CnB,CAAC"}
|