@contentful/field-editor-markdown 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/cjs/MarkdownActions.js +235 -0
  2. package/dist/cjs/MarkdownEditor.js +180 -0
  3. package/dist/cjs/__fixtures__/FakeSdk.js +183 -0
  4. package/dist/cjs/__fixtures__/asset/index.js +37 -0
  5. package/dist/cjs/__fixtures__/content-type/index.js +16 -0
  6. package/dist/cjs/__fixtures__/entry/index.js +33 -0
  7. package/dist/cjs/__fixtures__/fixtures.js +71 -0
  8. package/dist/cjs/__fixtures__/locale/index.js +40 -0
  9. package/dist/cjs/__fixtures__/space/index.js +16 -0
  10. package/dist/cjs/codemirrorImports.js +9 -0
  11. package/dist/cjs/components/HeadingSelector.js +66 -0
  12. package/dist/cjs/components/InsertLinkSelector.js +86 -0
  13. package/dist/cjs/components/MarkdownBottomBar.js +111 -0
  14. package/dist/cjs/components/MarkdownConstraints.js +79 -0
  15. package/dist/cjs/components/MarkdownPreview.js +249 -0
  16. package/dist/cjs/components/MarkdownTabs.js +128 -0
  17. package/dist/cjs/components/MarkdownTextarea/CodeMirrorWrapper.js +383 -0
  18. package/dist/cjs/components/MarkdownTextarea/MarkdownCommands.js +233 -0
  19. package/dist/cjs/components/MarkdownTextarea/MarkdownTextarea.js +190 -0
  20. package/dist/cjs/components/MarkdownTextarea/createMarkdownEditor.js +101 -0
  21. package/dist/cjs/components/MarkdownToolbar.js +367 -0
  22. package/dist/cjs/components/icons.js +193 -0
  23. package/dist/cjs/dialogs/CheatsheetModalDialog.js +239 -0
  24. package/dist/cjs/dialogs/ConfirmInsertAssetModalDialog.js +94 -0
  25. package/dist/cjs/dialogs/EmdebExternalContentDialog.js +202 -0
  26. package/dist/cjs/dialogs/InsertLinkModalDialog.js +149 -0
  27. package/dist/cjs/dialogs/InsertTableModalDialog.js +140 -0
  28. package/dist/cjs/dialogs/SpecialCharacterModalDialog.js +146 -0
  29. package/dist/cjs/dialogs/ZenModeModalDialog.js +257 -0
  30. package/dist/cjs/dialogs/openMarkdownDialog.js +121 -0
  31. package/dist/cjs/dialogs/renderMarkdownDialog.js +108 -0
  32. package/dist/cjs/index.js +29 -0
  33. package/dist/cjs/types.js +20 -0
  34. package/dist/cjs/utils/insertAssetLinks.js +122 -0
  35. package/dist/cjs/utils/insertAssetLinks.spec.js +22 -0
  36. package/dist/cjs/utils/isValidUrl.js +22 -0
  37. package/dist/cjs/utils/linkOrganizer.js +187 -0
  38. package/dist/cjs/utils/linkOrganizer.spec.js +96 -0
  39. package/dist/cjs/utils/replaceMailtoAmp.js +15 -0
  40. package/dist/cjs/utils/replaceMailtoAmp.spec.js +22 -0
  41. package/dist/cjs/utils/specialCharacters.js +228 -0
  42. package/dist/cjs/utils/userAgent.js +28 -0
  43. package/dist/esm/MarkdownActions.js +186 -0
  44. package/dist/esm/MarkdownEditor.js +118 -0
  45. package/dist/esm/__fixtures__/FakeSdk.js +173 -0
  46. package/dist/esm/__fixtures__/asset/index.js +6 -0
  47. package/dist/esm/__fixtures__/content-type/index.js +2 -0
  48. package/dist/esm/__fixtures__/entry/index.js +5 -0
  49. package/dist/esm/__fixtures__/fixtures.js +6 -0
  50. package/dist/esm/__fixtures__/locale/index.js +15 -0
  51. package/dist/esm/__fixtures__/space/index.js +2 -0
  52. package/dist/esm/codemirrorImports.js +5 -0
  53. package/dist/esm/components/HeadingSelector.js +17 -0
  54. package/dist/esm/components/InsertLinkSelector.js +37 -0
  55. package/dist/esm/components/MarkdownBottomBar.js +46 -0
  56. package/dist/esm/components/MarkdownConstraints.js +25 -0
  57. package/dist/esm/components/MarkdownPreview.js +195 -0
  58. package/dist/esm/components/MarkdownTabs.js +74 -0
  59. package/dist/esm/components/MarkdownTextarea/CodeMirrorWrapper.js +329 -0
  60. package/dist/esm/components/MarkdownTextarea/MarkdownCommands.js +218 -0
  61. package/dist/esm/components/MarkdownTextarea/MarkdownTextarea.js +136 -0
  62. package/dist/esm/components/MarkdownTextarea/createMarkdownEditor.js +52 -0
  63. package/dist/esm/components/MarkdownToolbar.js +302 -0
  64. package/dist/esm/components/icons.js +112 -0
  65. package/dist/esm/dialogs/CheatsheetModalDialog.js +177 -0
  66. package/dist/esm/dialogs/ConfirmInsertAssetModalDialog.js +37 -0
  67. package/dist/esm/dialogs/EmdebExternalContentDialog.js +140 -0
  68. package/dist/esm/dialogs/InsertLinkModalDialog.js +92 -0
  69. package/dist/esm/dialogs/InsertTableModalDialog.js +78 -0
  70. package/dist/esm/dialogs/SpecialCharacterModalDialog.js +84 -0
  71. package/dist/esm/dialogs/ZenModeModalDialog.js +195 -0
  72. package/dist/esm/dialogs/openMarkdownDialog.js +72 -0
  73. package/dist/esm/dialogs/renderMarkdownDialog.js +59 -0
  74. package/dist/esm/index.js +5 -0
  75. package/dist/esm/types.js +10 -0
  76. package/dist/esm/utils/insertAssetLinks.js +99 -0
  77. package/dist/esm/utils/insertAssetLinks.spec.js +18 -0
  78. package/dist/esm/utils/isValidUrl.js +4 -0
  79. package/dist/esm/utils/linkOrganizer.js +152 -0
  80. package/dist/esm/utils/linkOrganizer.spec.js +53 -0
  81. package/dist/esm/utils/replaceMailtoAmp.js +5 -0
  82. package/dist/esm/utils/replaceMailtoAmp.spec.js +18 -0
  83. package/dist/esm/utils/specialCharacters.js +218 -0
  84. package/dist/esm/utils/userAgent.js +13 -0
  85. package/dist/{MarkdownActions.d.ts → types/MarkdownActions.d.ts} +38 -38
  86. package/dist/{MarkdownEditor.d.ts → types/MarkdownEditor.d.ts} +22 -22
  87. package/dist/types/__fixtures__/FakeSdk.d.ts +8 -0
  88. package/dist/types/__fixtures__/asset/index.d.ts +6 -0
  89. package/dist/types/__fixtures__/content-type/index.d.ts +2 -0
  90. package/dist/types/__fixtures__/entry/index.d.ts +5 -0
  91. package/dist/types/__fixtures__/fixtures.d.ts +6 -0
  92. package/dist/types/__fixtures__/locale/index.d.ts +42 -0
  93. package/dist/types/__fixtures__/space/index.d.ts +2 -0
  94. package/dist/{codemirrorImports.d.ts → types/codemirrorImports.d.ts} +5 -5
  95. package/dist/{components → types/components}/HeadingSelector.d.ts +7 -7
  96. package/dist/{components → types/components}/InsertLinkSelector.d.ts +9 -9
  97. package/dist/{components → types/components}/MarkdownBottomBar.d.ts +11 -11
  98. package/dist/{components → types/components}/MarkdownConstraints.d.ts +6 -6
  99. package/dist/{components → types/components}/MarkdownPreview.d.ts +14 -14
  100. package/dist/{components → types/components}/MarkdownTabs.d.ts +8 -8
  101. package/dist/{components → types/components}/MarkdownTextarea/CodeMirrorWrapper.d.ts +58 -58
  102. package/dist/{components → types/components}/MarkdownTextarea/MarkdownCommands.d.ts +33 -33
  103. package/dist/{components → types/components}/MarkdownTextarea/MarkdownTextarea.d.ts +17 -17
  104. package/dist/{components → types/components}/MarkdownTextarea/createMarkdownEditor.d.ts +55 -55
  105. package/dist/{components → types/components}/MarkdownToolbar.d.ts +12 -12
  106. package/dist/types/components/icons.d.ts +18 -0
  107. package/dist/{dialogs → types/dialogs}/CheatsheetModalDialog.d.ts +4 -4
  108. package/dist/{dialogs → types/dialogs}/ConfirmInsertAssetModalDialog.d.ts +23 -23
  109. package/dist/{dialogs → types/dialogs}/EmdebExternalContentDialog.d.ts +9 -9
  110. package/dist/{dialogs → types/dialogs}/InsertLinkModalDialog.d.ts +17 -17
  111. package/dist/{dialogs → types/dialogs}/InsertTableModalDialog.d.ts +13 -13
  112. package/dist/{dialogs → types/dialogs}/SpecialCharacterModalDialog.d.ts +9 -9
  113. package/dist/{dialogs → types/dialogs}/ZenModeModalDialog.d.ts +24 -24
  114. package/dist/{dialogs → types/dialogs}/openMarkdownDialog.d.ts +5 -5
  115. package/dist/{dialogs → types/dialogs}/renderMarkdownDialog.d.ts +8 -8
  116. package/dist/{index.d.ts → types/index.d.ts} +5 -5
  117. package/dist/{types.d.ts → types/types.d.ts} +75 -75
  118. package/dist/{utils → types/utils}/insertAssetLinks.d.ts +29 -29
  119. package/dist/types/utils/insertAssetLinks.spec.d.ts +1 -0
  120. package/dist/{utils → types/utils}/isValidUrl.d.ts +2 -2
  121. package/dist/{utils → types/utils}/linkOrganizer.d.ts +6 -6
  122. package/dist/types/utils/linkOrganizer.spec.d.ts +1 -0
  123. package/dist/{utils → types/utils}/replaceMailtoAmp.d.ts +1 -1
  124. package/dist/types/utils/replaceMailtoAmp.spec.d.ts +1 -0
  125. package/dist/{utils → types/utils}/specialCharacters.d.ts +4 -4
  126. package/dist/{utils → types/utils}/userAgent.d.ts +1 -1
  127. package/package.json +25 -11
  128. package/CHANGELOG.md +0 -314
  129. package/dist/components/icons.d.ts +0 -18
  130. package/dist/field-editor-markdown.cjs.development.js +0 -3609
  131. package/dist/field-editor-markdown.cjs.development.js.map +0 -1
  132. package/dist/field-editor-markdown.cjs.production.min.js +0 -216
  133. package/dist/field-editor-markdown.cjs.production.min.js.map +0 -1
  134. package/dist/field-editor-markdown.esm.js +0 -3599
  135. package/dist/field-editor-markdown.esm.js.map +0 -1
  136. package/dist/index.js +0 -8
@@ -0,0 +1,302 @@
1
+ import * as React from 'react';
2
+ import { Flex, IconButton, Tooltip } from '@contentful/f36-components';
3
+ import { CodeIcon, FormatBoldIcon, FormatItalicIcon, HeadingIcon, HorizontalRuleIcon, LinkIcon, ListBulletedIcon, ListNumberedIcon, MoreHorizontalIcon, QuoteIcon } from '@contentful/f36-icons';
4
+ import tokens from '@contentful/f36-tokens';
5
+ import { css, cx } from 'emotion';
6
+ import { HeadingSelector } from './HeadingSelector';
7
+ import * as Icons from './icons';
8
+ import { InsertLinkSelector } from './InsertLinkSelector';
9
+ const styles = {
10
+ root: css({
11
+ position: 'relative',
12
+ zIndex: Number(tokens.zIndexWorkbenchHeader),
13
+ border: `1px solid ${tokens.gray400}`,
14
+ backgroundColor: tokens.gray100,
15
+ padding: tokens.spacingXs,
16
+ borderTopLeftRadius: tokens.borderRadiusSmall,
17
+ overflow: 'hidden'
18
+ }),
19
+ button: css({
20
+ height: '30px',
21
+ width: '36px',
22
+ marginLeft: tokens.spacing2Xs,
23
+ marginRight: tokens.spacing2Xs
24
+ }),
25
+ icon: css({
26
+ fill: tokens.gray700,
27
+ verticalAlign: 'middle'
28
+ }),
29
+ zenButton: css({
30
+ marginLeft: tokens.spacingXs
31
+ }),
32
+ zenButtonPressed: css({
33
+ backgroundColor: tokens.gray400
34
+ }),
35
+ tooltip: css({
36
+ zIndex: Number(tokens.zIndexTooltip)
37
+ })
38
+ };
39
+ const ToolbarButton = React.forwardRef((props, ref)=>{
40
+ const { tooltip , onClick , children , className , variant ='transparent' , tooltipPlace ='top' , isDisabled =false , ...otherProps } = props;
41
+ return React.createElement(Tooltip, {
42
+ className: styles.tooltip,
43
+ placement: tooltipPlace,
44
+ content: tooltip
45
+ }, React.createElement(IconButton, {
46
+ ...otherProps,
47
+ ref: ref,
48
+ className: cx(styles.button, className),
49
+ isDisabled: isDisabled,
50
+ onClick: onClick,
51
+ variant: variant,
52
+ size: "small",
53
+ icon: children,
54
+ "aria-label": tooltip
55
+ }));
56
+ });
57
+ ToolbarButton.displayName = 'ToolbarButton';
58
+ function MainButtons(props) {
59
+ const tooltipPlace = props.mode === 'zen' ? 'bottom' : 'top';
60
+ return React.createElement(React.Fragment, null, React.createElement(HeadingSelector, {
61
+ onSelect: (heading)=>{
62
+ if (heading && props.actions.headings[heading]) {
63
+ props.actions.headings[heading]();
64
+ }
65
+ }
66
+ }, React.createElement(ToolbarButton, {
67
+ isDisabled: props.disabled,
68
+ testId: "markdown-action-button-heading",
69
+ tooltip: "Headings",
70
+ tooltipPlace: tooltipPlace
71
+ }, React.createElement(HeadingIcon, {
72
+ "aria-label": "Headings",
73
+ className: styles.icon
74
+ }))), React.createElement(ToolbarButton, {
75
+ isDisabled: props.disabled,
76
+ testId: "markdown-action-button-bold",
77
+ tooltip: "Bold",
78
+ tooltipPlace: tooltipPlace,
79
+ onClick: props.actions.simple.bold
80
+ }, React.createElement(FormatBoldIcon, {
81
+ "aria-label": "Bold",
82
+ className: styles.icon
83
+ })), React.createElement(ToolbarButton, {
84
+ isDisabled: props.disabled,
85
+ testId: "markdown-action-button-italic",
86
+ tooltip: "Italic",
87
+ tooltipPlace: tooltipPlace,
88
+ onClick: props.actions.simple.italic
89
+ }, React.createElement(FormatItalicIcon, {
90
+ "aria-label": "Italic",
91
+ className: styles.icon
92
+ })), React.createElement(ToolbarButton, {
93
+ isDisabled: props.disabled,
94
+ testId: "markdown-action-button-quote",
95
+ tooltip: "Quote",
96
+ tooltipPlace: tooltipPlace,
97
+ onClick: props.actions.simple.quote
98
+ }, React.createElement(QuoteIcon, {
99
+ "aria-label": "Quote",
100
+ className: styles.icon
101
+ })), React.createElement(ToolbarButton, {
102
+ isDisabled: props.disabled,
103
+ testId: "markdown-action-button-ul",
104
+ tooltip: "Unordered list",
105
+ tooltipPlace: tooltipPlace,
106
+ onClick: props.actions.simple.ul
107
+ }, React.createElement(ListBulletedIcon, {
108
+ "aria-label": "Unordered list",
109
+ className: styles.icon
110
+ })), React.createElement(ToolbarButton, {
111
+ isDisabled: props.disabled,
112
+ testId: "markdown-action-button-ol",
113
+ tooltip: "Ordered list",
114
+ tooltipPlace: tooltipPlace,
115
+ onClick: props.actions.simple.ol
116
+ }, React.createElement(ListNumberedIcon, {
117
+ "aria-label": "Ordered list",
118
+ className: styles.icon
119
+ })), React.createElement(ToolbarButton, {
120
+ isDisabled: props.disabled,
121
+ testId: "markdown-action-button-link",
122
+ tooltip: "Link",
123
+ tooltipPlace: tooltipPlace,
124
+ onClick: props.actions.insertLink
125
+ }, React.createElement(LinkIcon, {
126
+ "aria-label": "Link",
127
+ className: styles.icon
128
+ })));
129
+ }
130
+ function AdditionalButtons(props) {
131
+ const tooltipPlace = props.mode === 'zen' ? 'bottom' : 'top';
132
+ return React.createElement(React.Fragment, null, React.createElement(ToolbarButton, {
133
+ isDisabled: props.disabled,
134
+ testId: "markdown-action-button-strike",
135
+ tooltip: "Strike out",
136
+ tooltipPlace: tooltipPlace,
137
+ onClick: props.actions.simple.strike
138
+ }, React.createElement(Icons.Strikethrough, {
139
+ label: "Strike out",
140
+ className: styles.icon
141
+ })), React.createElement(ToolbarButton, {
142
+ isDisabled: props.disabled,
143
+ testId: "markdown-action-button-code",
144
+ tooltip: "Code block",
145
+ tooltipPlace: tooltipPlace,
146
+ onClick: props.actions.simple.code
147
+ }, React.createElement(CodeIcon, {
148
+ "aria-label": "Code block",
149
+ className: styles.icon
150
+ })), React.createElement(ToolbarButton, {
151
+ isDisabled: props.disabled,
152
+ testId: "markdown-action-button-hr",
153
+ tooltip: "Horizontal rule",
154
+ tooltipPlace: tooltipPlace,
155
+ onClick: props.actions.simple.hr
156
+ }, React.createElement(HorizontalRuleIcon, {
157
+ "aria-label": "Horizontal rule",
158
+ className: styles.icon
159
+ })), React.createElement(ToolbarButton, {
160
+ isDisabled: props.disabled,
161
+ testId: "markdown-action-button-indent",
162
+ tooltip: "Increase indentation",
163
+ tooltipPlace: tooltipPlace,
164
+ onClick: props.actions.simple.indent
165
+ }, React.createElement(Icons.Indent, {
166
+ label: "Increase indentation",
167
+ className: styles.icon
168
+ })), React.createElement(ToolbarButton, {
169
+ isDisabled: props.disabled,
170
+ testId: "markdown-action-button-dedent",
171
+ tooltip: "Decrease indentation",
172
+ tooltipPlace: tooltipPlace,
173
+ onClick: props.actions.simple.dedent
174
+ }, React.createElement(Icons.Dedent, {
175
+ label: "Decrease indentation",
176
+ className: styles.icon
177
+ })), React.createElement(ToolbarButton, {
178
+ isDisabled: props.disabled,
179
+ testId: "markdown-action-button-embed",
180
+ tooltip: "Embed external content",
181
+ tooltipPlace: tooltipPlace,
182
+ onClick: props.actions.embedExternalContent
183
+ }, React.createElement(Icons.Cubes, {
184
+ label: "Embed external content",
185
+ className: styles.icon
186
+ })), React.createElement(ToolbarButton, {
187
+ isDisabled: props.disabled,
188
+ testId: "markdown-action-button-table",
189
+ tooltip: "Insert table",
190
+ tooltipPlace: tooltipPlace,
191
+ onClick: props.actions.insertTable
192
+ }, React.createElement(Icons.Table, {
193
+ label: "Insert table",
194
+ className: styles.icon
195
+ })), React.createElement(ToolbarButton, {
196
+ isDisabled: props.disabled,
197
+ testId: "markdown-action-button-special",
198
+ tooltip: "Insert special character",
199
+ tooltipPlace: tooltipPlace,
200
+ onClick: props.actions.insertSpecialCharacter
201
+ }, React.createElement(Icons.SpecialChar, {
202
+ label: "Insert special character",
203
+ className: styles.icon
204
+ })), React.createElement(ToolbarButton, {
205
+ isDisabled: props.disabled,
206
+ testId: "markdown-action-button-organizeLinks",
207
+ tooltip: "Organize links",
208
+ tooltipPlace: tooltipPlace,
209
+ onClick: props.actions.organizeLinks
210
+ }, React.createElement(Icons.OrgLinks, {
211
+ label: "Organize links",
212
+ className: styles.icon
213
+ })), React.createElement(ToolbarButton, {
214
+ isDisabled: props.disabled,
215
+ testId: "markdown-action-button-undo",
216
+ tooltip: "Undo",
217
+ tooltipPlace: tooltipPlace,
218
+ onClick: props.actions.history.undo
219
+ }, React.createElement(Icons.Undo, {
220
+ label: "Undo",
221
+ className: styles.icon
222
+ })), React.createElement(ToolbarButton, {
223
+ isDisabled: props.disabled,
224
+ testId: "markdown-action-button-redo",
225
+ tooltip: "Redo",
226
+ tooltipPlace: tooltipPlace,
227
+ onClick: props.actions.history.redo
228
+ }, React.createElement(Icons.Redo, {
229
+ label: "Redo",
230
+ className: styles.icon
231
+ })));
232
+ }
233
+ export function DefaultMarkdownToolbar(props) {
234
+ const [showAdditional, setShowAdditional] = React.useState(false);
235
+ return React.createElement("div", {
236
+ className: styles.root
237
+ }, React.createElement(Flex, {
238
+ justifyContent: "space-between",
239
+ flexWrap: "wrap"
240
+ }, React.createElement(Flex, {
241
+ flexWrap: "wrap"
242
+ }, React.createElement(MainButtons, props), React.createElement(ToolbarButton, {
243
+ isDisabled: props.disabled,
244
+ testId: "markdown-action-button-toggle-additional",
245
+ tooltip: showAdditional ? 'Hide additional actions' : 'More actions',
246
+ onClick: ()=>{
247
+ setShowAdditional(!showAdditional);
248
+ }
249
+ }, React.createElement(MoreHorizontalIcon, {
250
+ className: styles.icon
251
+ }))), React.createElement(Flex, null, React.createElement(InsertLinkSelector, {
252
+ disabled: props.disabled,
253
+ onSelectExisting: props.actions.linkExistingMedia,
254
+ onAddNew: props.actions.addNewMedia,
255
+ canAddNew: props.canUploadAssets
256
+ }), React.createElement(ToolbarButton, {
257
+ isDisabled: props.disabled,
258
+ testId: "markdown-action-button-zen",
259
+ variant: "secondary",
260
+ onClick: props.actions.openZenMode,
261
+ className: styles.zenButton,
262
+ tooltip: "Expand"
263
+ }, React.createElement(Icons.Zen, {
264
+ label: "Expand",
265
+ className: styles.icon
266
+ })))), showAdditional && React.createElement(Flex, {
267
+ justifyContent: "space-between",
268
+ marginTop: "spacingXs"
269
+ }, React.createElement(Flex, null, React.createElement(AdditionalButtons, props))));
270
+ }
271
+ export function ZenMarkdownToolbar(props) {
272
+ return React.createElement("div", {
273
+ className: styles.root
274
+ }, React.createElement(Flex, {
275
+ justifyContent: "space-between"
276
+ }, React.createElement(Flex, null, React.createElement(MainButtons, props), React.createElement(AdditionalButtons, props)), React.createElement(Flex, null, React.createElement(InsertLinkSelector, {
277
+ disabled: props.disabled,
278
+ onSelectExisting: props.actions.linkExistingMedia,
279
+ onAddNew: props.actions.addNewMedia,
280
+ canAddNew: props.canUploadAssets
281
+ }), React.createElement(IconButton, {
282
+ testId: "markdown-action-button-zen-close",
283
+ variant: "secondary",
284
+ size: "small",
285
+ className: cx(styles.zenButton, styles.zenButtonPressed),
286
+ onClick: ()=>{
287
+ props.actions.closeZenMode();
288
+ },
289
+ icon: React.createElement(Icons.Zen, {
290
+ label: "Collapse",
291
+ className: styles.icon
292
+ }),
293
+ "aria-label": "Collapse"
294
+ }))));
295
+ }
296
+ export const MarkdownToolbar = React.memo((props)=>{
297
+ if (props.mode === 'zen') {
298
+ return React.createElement(ZenMarkdownToolbar, props);
299
+ }
300
+ return React.createElement(DefaultMarkdownToolbar, props);
301
+ });
302
+ MarkdownToolbar.displayName = 'MarkdownToolbar';
@@ -0,0 +1,112 @@
1
+ import * as React from 'react';
2
+ import { css } from 'emotion';
3
+ const srOnly = css({
4
+ position: 'absolute',
5
+ width: '1px',
6
+ height: '1px',
7
+ padding: '0',
8
+ margin: '-1px',
9
+ overflow: 'hidden',
10
+ clip: 'rect(0, 0, 0, 0)',
11
+ border: '0'
12
+ });
13
+ export const Zen = ({ label , ...rest })=>React.createElement("svg", {
14
+ width: 14,
15
+ height: 14,
16
+ viewBox: "0 0 1792 1792",
17
+ ...rest
18
+ }, React.createElement("path", {
19
+ d: "M1411 541l-355 355 355 355 144-144q29-31 70-14 39 17 39 59v448q0 26-19 45t-45 19h-448q-42 0-59-40-17-39 14-69l144-144-355-355-355 355 144 144q31 30 14 69-17 40-59 40H192q-26 0-45-19t-19-45v-448q0-42 40-59 39-17 69 14l144 144 355-355-355-355-144 144q-19 19-45 19-12 0-24-5-40-17-40-59V192q0-26 19-45t45-19h448q42 0 59 40 17 39-14 69L541 381l355 355 355-355-144-144q-31-30-14-69 17-40 59-40h448q26 0 45 19t19 45v448q0 42-39 59-13 5-25 5-26 0-45-19z"
20
+ }), React.createElement("span", {
21
+ className: srOnly
22
+ }, label));
23
+ export const Strikethrough = ({ label , ...rest })=>React.createElement("svg", {
24
+ width: 14,
25
+ height: 14,
26
+ viewBox: "0 0 1792 1792",
27
+ ...rest
28
+ }, React.createElement("path", {
29
+ d: "M1760 896q14 0 23 9t9 23v64q0 14-9 23t-23 9H32q-14 0-23-9t-9-23v-64q0-14 9-23t23-9h1728zM483 832q-28-35-51-80-48-98-48-188 0-181 134-309 133-127 393-127 50 0 167 19 66 12 177 48 10 38 21 118 14 123 14 183 0 18-5 45l-12 3-84-6-14-2q-50-149-103-205-88-91-210-91-114 0-182 59-67 58-67 146 0 73 66 140t279 129q69 20 173 66 58 28 95 52H483zm507 256h411q7 39 7 92 0 111-41 212-23 56-71 104-37 35-109 81-80 48-153 66-80 21-203 21-114 0-195-23l-140-40q-57-16-72-28-8-8-8-22v-13q0-108-2-156-1-30 0-68l2-37v-44l102-2q15 34 30 71t22.5 56 12.5 27q35 57 80 94 43 36 105 57 59 22 132 22 64 0 139-27 77-26 122-86 47-61 47-129 0-84-81-157-34-29-137-71z"
30
+ }), React.createElement("span", {
31
+ className: srOnly
32
+ }, label));
33
+ export const Indent = ({ label , ...rest })=>React.createElement("svg", {
34
+ width: 14,
35
+ height: 14,
36
+ viewBox: "0 0 1792 1792",
37
+ ...rest
38
+ }, React.createElement("path", {
39
+ d: "M352 832q0 14-9 23L55 1143q-9 9-23 9-13 0-22.5-9.5T0 1120V544q0-13 9.5-22.5T32 512q14 0 23 9l288 288q9 9 9 23zm1440 480v192q0 13-9.5 22.5t-22.5 9.5H32q-13 0-22.5-9.5T0 1504v-192q0-13 9.5-22.5T32 1280h1728q13 0 22.5 9.5t9.5 22.5zm0-384v192q0 13-9.5 22.5t-22.5 9.5H672q-13 0-22.5-9.5T640 1120V928q0-13 9.5-22.5T672 896h1088q13 0 22.5 9.5t9.5 22.5zm0-384v192q0 13-9.5 22.5T1760 768H672q-13 0-22.5-9.5T640 736V544q0-13 9.5-22.5T672 512h1088q13 0 22.5 9.5t9.5 22.5zm0-384v192q0 13-9.5 22.5T1760 384H32q-13 0-22.5-9.5T0 352V160q0-13 9.5-22.5T32 128h1728q13 0 22.5 9.5t9.5 22.5z"
40
+ }), React.createElement("span", {
41
+ className: srOnly
42
+ }, label));
43
+ export const Dedent = ({ label , ...rest })=>React.createElement("svg", {
44
+ width: 14,
45
+ height: 14,
46
+ viewBox: "0 0 1792 1792",
47
+ ...rest
48
+ }, React.createElement("path", {
49
+ d: "M384 544v576q0 13-9.5 22.5T352 1152q-14 0-23-9L41 855q-9-9-9-23t9-23l288-288q9-9 23-9 13 0 22.5 9.5T384 544zm1408 768v192q0 13-9.5 22.5t-22.5 9.5H32q-13 0-22.5-9.5T0 1504v-192q0-13 9.5-22.5T32 1280h1728q13 0 22.5 9.5t9.5 22.5zm0-384v192q0 13-9.5 22.5t-22.5 9.5H672q-13 0-22.5-9.5T640 1120V928q0-13 9.5-22.5T672 896h1088q13 0 22.5 9.5t9.5 22.5zm0-384v192q0 13-9.5 22.5T1760 768H672q-13 0-22.5-9.5T640 736V544q0-13 9.5-22.5T672 512h1088q13 0 22.5 9.5t9.5 22.5zm0-384v192q0 13-9.5 22.5T1760 384H32q-13 0-22.5-9.5T0 352V160q0-13 9.5-22.5T32 128h1728q13 0 22.5 9.5t9.5 22.5z"
50
+ }), React.createElement("span", {
51
+ className: srOnly
52
+ }, label));
53
+ export const Cubes = ({ label , ...rest })=>React.createElement("svg", {
54
+ width: 18,
55
+ height: 14,
56
+ viewBox: "0 0 2304 1792",
57
+ ...rest
58
+ }, React.createElement("path", {
59
+ d: "M640 1632l384-192v-314l-384 164v342zm-64-454l404-173-404-173-404 173zm1088 454l384-192v-314l-384 164v342zm-64-454l404-173-404-173-404 173zm-448-293l384-165V454l-384 164v267zm-64-379l441-189-441-189-441 189zm1088 518v416q0 36-19 67t-52 47l-448 224q-25 14-57 14t-57-14l-448-224q-4-2-7-4-2 2-7 4l-448 224q-25 14-57 14t-57-14L71 1554q-33-16-52-47t-19-67v-416q0-38 21.5-70T78 906l434-186V320q0-38 21.5-70t56.5-48l448-192q23-10 50-10t50 10l448 192q35 16 56.5 48t21.5 70v400l434 186q36 16 57 48t21 70z"
60
+ }), React.createElement("span", {
61
+ className: srOnly
62
+ }, label));
63
+ export const Table = ({ label , ...rest })=>React.createElement("svg", {
64
+ width: 14,
65
+ height: 14,
66
+ viewBox: "0 0 1792 1792",
67
+ ...rest
68
+ }, React.createElement("path", {
69
+ d: "M576 1376v-192q0-14-9-23t-23-9H224q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm0-384V800q0-14-9-23t-23-9H224q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384v-192q0-14-9-23t-23-9H736q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zM576 608V416q0-14-9-23t-23-9H224q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384V800q0-14-9-23t-23-9H736q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384v-192q0-14-9-23t-23-9h-320q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm-512-768V416q0-14-9-23t-23-9H736q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm512 384V800q0-14-9-23t-23-9h-320q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm0-384V416q0-14-9-23t-23-9h-320q-14 0-23 9t-9 23v192q0 14 9 23t23 9h320q14 0 23-9t9-23zm128-320v1088q0 66-47 113t-113 47H224q-66 0-113-47t-47-113V288q0-66 47-113t113-47h1344q66 0 113 47t47 113z"
70
+ }), React.createElement("span", {
71
+ className: srOnly
72
+ }, label));
73
+ export const SpecialChar = ({ label , ...rest })=>React.createElement("svg", {
74
+ width: 14,
75
+ height: 14,
76
+ viewBox: "0 0 1792 1792",
77
+ ...rest
78
+ }, React.createElement("path", {
79
+ d: "M1360 1307l35 159q3 12-3 22.5t-17 14.5l-5 1q-4 2-10.5 3.5t-16 4.5-21.5 5.5-25.5 5-30 5-33.5 4.5-36.5 3-38.5 1q-234 0-409-130.5T511 1054h-95q-13 0-22.5-9.5T384 1022V909q0-13 9.5-22.5T416 877h66q-2-57 1-105h-67q-14 0-23-9t-9-23V626q0-14 9-23t23-9h98q67-210 243.5-338T1158 128q102 0 194 23 11 3 20 15 6 11 3 24l-43 159q-3 13-14 19.5t-24 2.5l-4-1q-4-1-11.5-2.5L1261 364l-22.5-3.5-26-3-29-2.5-29.5-1q-126 0-226 64T778 594h468q16 0 25 12 10 12 7 26l-24 114q-5 26-32 26H734q-3 37 0 105h459q15 0 25 12 9 12 6 27l-24 112q-2 11-11 18.5t-20 7.5H782q48 117 149.5 185.5T1160 1308q18 0 36-1.5t33.5-3.5 29.5-4.5 24.5-5 18.5-4.5l12-3 5-2q13-5 26 2 12 7 15 21z"
80
+ }), React.createElement("span", {
81
+ className: srOnly
82
+ }, label));
83
+ export const OrgLinks = ({ label , ...rest })=>React.createElement("svg", {
84
+ width: 14,
85
+ height: 14,
86
+ viewBox: "0 0 1792 1792",
87
+ ...rest
88
+ }, React.createElement("path", {
89
+ d: "M1792 1248v320q0 40-28 68t-68 28h-320q-40 0-68-28t-28-68v-320q0-40 28-68t68-28h96V960H960v192h96q40 0 68 28t28 68v320q0 40-28 68t-68 28H736q-40 0-68-28t-28-68v-320q0-40 28-68t68-28h96V960H320v192h96q40 0 68 28t28 68v320q0 40-28 68t-68 28H96q-40 0-68-28t-28-68v-320q0-40 28-68t68-28h96V960q0-52 38-90t90-38h512V640h-96q-40 0-68-28t-28-68V224q0-40 28-68t68-28h320q40 0 68 28t28 68v320q0 40-28 68t-68 28h-96v192h512q52 0 90 38t38 90v192h96q40 0 68 28t28 68z"
90
+ }), React.createElement("span", {
91
+ className: srOnly
92
+ }, label));
93
+ export const Undo = ({ label , ...rest })=>React.createElement("svg", {
94
+ width: 14,
95
+ height: 14,
96
+ viewBox: "0 0 1792 1792",
97
+ ...rest
98
+ }, React.createElement("path", {
99
+ d: "M1664 896q0 156-61 298t-164 245-245 164-298 61q-172 0-327-72.5T305 1387q-7-10-6.5-22.5t8.5-20.5l137-138q10-9 25-9 16 2 23 12 73 95 179 147t225 52q104 0 198.5-40.5T1258 1258t109.5-163.5T1408 896t-40.5-198.5T1258 534t-163.5-109.5T896 384q-98 0-188 35.5T548 521l137 138q31 30 14 69-17 40-59 40H192q-26 0-45-19t-19-45V256q0-42 40-59 39-17 69 14l130 129q107-101 244.5-156.5T896 128q156 0 298 61t245 164 164 245 61 298z"
100
+ }), React.createElement("span", {
101
+ className: srOnly
102
+ }, label));
103
+ export const Redo = ({ label , ...rest })=>React.createElement("svg", {
104
+ width: 14,
105
+ height: 14,
106
+ viewBox: "0 0 1792 1792",
107
+ ...rest
108
+ }, React.createElement("path", {
109
+ d: "M1664 256v448q0 26-19 45t-45 19h-448q-42 0-59-40-17-39 14-69l138-138q-148-137-349-137-104 0-198.5 40.5T534 534 424.5 697.5 384 896t40.5 198.5T534 1258t163.5 109.5T896 1408q119 0 225-52t179-147q7-10 23-12 15 0 25 9l137 138q9 8 9.5 20.5t-7.5 22.5q-109 132-264 204.5T896 1664q-156 0-298-61t-245-164-164-245-61-298 61-298 164-245 245-164 298-61q147 0 284.5 55.5T1425 340l130-129q29-31 70-14 39 17 39 59z"
110
+ }), React.createElement("span", {
111
+ className: srOnly
112
+ }, label));
@@ -0,0 +1,177 @@
1
+ import * as React from 'react';
2
+ import { Heading, ModalContent, TextLink } from '@contentful/f36-components';
3
+ import tokens from '@contentful/f36-tokens';
4
+ import { css, cx } from 'emotion';
5
+ import { MarkdownDialogType } from '../types';
6
+ const styles = {
7
+ flexColumnContainer: css({
8
+ display: 'flex',
9
+ flexWrap: 'nowrap'
10
+ }),
11
+ flexColumn: css({
12
+ flexGrow: 1
13
+ }),
14
+ verticalDivider: css({
15
+ borderRight: `1px solid ${tokens.gray500}`,
16
+ paddingRight: tokens.spacing3Xl,
17
+ marginRight: tokens.spacing2Xl
18
+ }),
19
+ preview: css({
20
+ display: 'inline-block',
21
+ paddingRight: tokens.spacingL,
22
+ width: '50%'
23
+ }),
24
+ unOrderedListPreview: css({
25
+ listStyleType: 'disc',
26
+ marginLeft: tokens.spacingS
27
+ }),
28
+ orderedListPreview: css({
29
+ listStyleType: 'decimal',
30
+ marginLeft: tokens.spacingS
31
+ }),
32
+ markup: css({
33
+ display: 'inline-block',
34
+ color: tokens.gray600,
35
+ paddingLeft: tokens.spacingL,
36
+ width: '50%'
37
+ }),
38
+ h1: css({
39
+ fontSize: tokens.fontSize2Xl
40
+ }),
41
+ h2: css({
42
+ fontSize: tokens.fontSizeXl
43
+ }),
44
+ h3: css({
45
+ fontSize: tokens.fontSizeL
46
+ }),
47
+ helpItem: css({
48
+ marginBottom: tokens.spacingS,
49
+ display: 'flex',
50
+ alignItems: 'flex-end',
51
+ height: tokens.spacingXl
52
+ }),
53
+ helpLink: css({
54
+ margin: 'auto'
55
+ }),
56
+ flexRowContainer: css({
57
+ display: 'flex',
58
+ width: '100%',
59
+ justifyContent: 'center',
60
+ marginTop: tokens.spacingXl
61
+ })
62
+ };
63
+ export const CheatsheetModalDialog = ()=>{
64
+ return React.createElement(ModalContent, {
65
+ testId: "markdown-cheatsheet-dialog-content"
66
+ }, React.createElement("div", {
67
+ className: styles.flexColumnContainer
68
+ }, React.createElement("div", {
69
+ className: cx(styles.flexColumn, styles.verticalDivider)
70
+ }, React.createElement("div", {
71
+ className: styles.helpItem
72
+ }, React.createElement(Heading, {
73
+ marginBottom: "none",
74
+ as: "h1",
75
+ className: cx(styles.preview, styles.h1)
76
+ }, "H1"), React.createElement("div", {
77
+ className: styles.markup
78
+ }, "# heading")), React.createElement("div", {
79
+ className: styles.helpItem
80
+ }, React.createElement(Heading, {
81
+ marginBottom: "none",
82
+ as: "h2",
83
+ className: cx(styles.preview, styles.h2)
84
+ }, "H2"), React.createElement("div", {
85
+ className: styles.markup
86
+ }, "## heading")), React.createElement("div", {
87
+ className: styles.helpItem
88
+ }, React.createElement(Heading, {
89
+ marginBottom: "none",
90
+ as: "h3",
91
+ className: cx(styles.preview, styles.h3)
92
+ }, "H3"), React.createElement("div", {
93
+ className: styles.markup
94
+ }, "### heading")), React.createElement("div", {
95
+ className: styles.helpItem
96
+ }, React.createElement("strong", {
97
+ className: styles.preview
98
+ }, "bold"), React.createElement("div", {
99
+ className: styles.markup
100
+ }, "__text__")), React.createElement("div", {
101
+ className: styles.helpItem
102
+ }, React.createElement("em", {
103
+ className: styles.preview
104
+ }, "italic"), React.createElement("div", {
105
+ className: styles.markup
106
+ }, "*text*")), React.createElement("div", {
107
+ className: styles.helpItem
108
+ }, React.createElement("div", {
109
+ className: styles.preview
110
+ }, "strikethrough"), React.createElement("div", {
111
+ className: styles.markup
112
+ }, "~~text~~")), React.createElement("div", {
113
+ className: styles.helpItem
114
+ }, React.createElement(TextLink, {
115
+ as: "button",
116
+ className: styles.preview
117
+ }, "Link"), React.createElement("div", {
118
+ className: styles.markup
119
+ }, "[text](url)"))), React.createElement("div", {
120
+ className: styles.flexColumn
121
+ }, React.createElement("div", {
122
+ className: styles.helpItem
123
+ }, React.createElement("div", {
124
+ className: styles.preview
125
+ }, "Image"), React.createElement("div", {
126
+ className: styles.markup
127
+ }, "![alt-text](url)")), React.createElement("div", {
128
+ className: styles.helpItem
129
+ }, React.createElement("div", {
130
+ className: styles.preview
131
+ }, "Unordered list"), React.createElement("div", {
132
+ className: styles.markup
133
+ }, "* list item")), React.createElement("div", {
134
+ className: styles.helpItem
135
+ }, React.createElement("div", {
136
+ className: styles.preview
137
+ }, React.createElement("div", null, "Ordered list")), React.createElement("div", {
138
+ className: styles.markup
139
+ }, "1. list item")), React.createElement("div", {
140
+ className: styles.helpItem
141
+ }, React.createElement("div", {
142
+ className: styles.preview
143
+ }, React.createElement("div", null, "Blockquote")), React.createElement("div", {
144
+ className: styles.markup
145
+ }, "> quote")), React.createElement("div", {
146
+ className: styles.helpItem
147
+ }, React.createElement("div", {
148
+ className: styles.preview
149
+ }, "code span"), React.createElement("div", {
150
+ className: styles.markup
151
+ }, "`code here`")), React.createElement("div", {
152
+ className: styles.helpItem
153
+ }, React.createElement("div", {
154
+ className: styles.preview
155
+ }, "code block"), React.createElement("div", {
156
+ className: styles.markup
157
+ }, "```code here```")))), React.createElement("div", {
158
+ className: styles.flexRowContainer
159
+ }, React.createElement(TextLink, {
160
+ className: styles.helpLink,
161
+ href: "https://help.github.com/en/github/writing-on-github/basic-writing-and-formatting-syntax",
162
+ target: "_blank",
163
+ rel: "noopener noreferrer"
164
+ }, "View the full GitHub-flavored Markdown syntax help (opens in a new window)")));
165
+ };
166
+ export const openCheatsheetModal = (dialogs)=>{
167
+ return dialogs.openCurrent({
168
+ title: 'Markdown formatting help',
169
+ width: 'large',
170
+ minHeight: '415px',
171
+ shouldCloseOnEscapePress: true,
172
+ shouldCloseOnOverlayClick: true,
173
+ parameters: {
174
+ type: MarkdownDialogType.cheatsheet
175
+ }
176
+ });
177
+ };
@@ -0,0 +1,37 @@
1
+ import * as React from 'react';
2
+ import { Button, EntityList, ModalContent, ModalControls, Paragraph } from '@contentful/f36-components';
3
+ import { MarkdownDialogType } from '../types';
4
+ export const ConfirmInsertAssetModalDialog = ({ onClose , assets , locale })=>{
5
+ const localesNumber = assets.length;
6
+ return React.createElement(React.Fragment, null, React.createElement(ModalContent, {
7
+ testId: "confirm-insert-asset"
8
+ }, React.createElement(Paragraph, null, localesNumber === 1 ? `Link asset with missing file for locale ${locale}` : `Link assets with missing files for locale ${locale}`), React.createElement(Paragraph, null, localesNumber === 1 ? 'Do you want to link to the file in its fallback locale?' : 'Do you want to link to the files in their fallback locales?'), React.createElement(EntityList, null, assets.map(({ title , description , thumbnailUrl , thumbnailAltText })=>React.createElement(EntityList.Item, {
9
+ key: thumbnailUrl,
10
+ title: title,
11
+ thumbnailUrl: `${thumbnailUrl}?w=46&h=46&fit=thumb`,
12
+ thumbnailAltText: thumbnailAltText,
13
+ description: description
14
+ })))), React.createElement(ModalControls, null, React.createElement(Button, {
15
+ onClick: ()=>onClose(false),
16
+ variant: "secondary",
17
+ size: "small"
18
+ }, "Cancel"), React.createElement(Button, {
19
+ testId: "confirm-insert-asset",
20
+ onClick: ()=>onClose(true),
21
+ variant: "positive",
22
+ size: "small"
23
+ }, "Confirm")));
24
+ };
25
+ export const openConfirmInsertAsset = (dialogs, options)=>{
26
+ return dialogs.openCurrent({
27
+ title: 'Confirm using fallback assets',
28
+ width: 'medium',
29
+ minHeight: '270px',
30
+ shouldCloseOnEscapePress: true,
31
+ shouldCloseOnOverlayClick: true,
32
+ parameters: {
33
+ type: MarkdownDialogType.confirmInsertAsset,
34
+ ...options
35
+ }
36
+ });
37
+ };