@zipify/wysiwyg 1.0.0-dev.1

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 (255) hide show
  1. package/.editorconfig +18 -0
  2. package/.eslintrc.js +253 -0
  3. package/.github/actions/deploy-example/action.yaml +61 -0
  4. package/.github/actions/lint-css/action.yaml +15 -0
  5. package/.github/actions/lint-js/action.yaml +22 -0
  6. package/.github/actions/setup/action.yaml +19 -0
  7. package/.github/actions/unit-tests/action.yaml +13 -0
  8. package/.github/actions/unit-tests/jest.config.js +8 -0
  9. package/.github/dependabot.yaml +17 -0
  10. package/.github/pull_request_template.md +17 -0
  11. package/.github/workflows/frontend-ci.yaml +120 -0
  12. package/.husky/pre-commit +4 -0
  13. package/.lintstagedrc +12 -0
  14. package/.release-it.json +6 -0
  15. package/.stylelintrc +110 -0
  16. package/README.md +61 -0
  17. package/babel.config.js +15 -0
  18. package/ci/example/deploy.sh +25 -0
  19. package/config/jest/TestEnvironment.js +27 -0
  20. package/config/jest/matchers/index.js +6 -0
  21. package/config/jest/matchers/toElementHasStyle.js +27 -0
  22. package/config/jest/matchers/toVueContainComponent.js +20 -0
  23. package/config/jest/matchers/toVueContainElement.js +34 -0
  24. package/config/jest/matchers/toVueContainLazyComponent.js +19 -0
  25. package/config/jest/matchers/toVueEmpty.js +16 -0
  26. package/config/jest/matchers/toVuexActionHasBeenDispatched.js +19 -0
  27. package/config/jest/setupMatchers.js +4 -0
  28. package/config/jest/setupTests.js +32 -0
  29. package/config/jest/typing.d.ts +14 -0
  30. package/config/svgo.js +22 -0
  31. package/config/webpack/example.config.js +86 -0
  32. package/config/webpack/loaders/index.js +6 -0
  33. package/config/webpack/loaders/js-loader.js +5 -0
  34. package/config/webpack/loaders/style-loader.js +7 -0
  35. package/config/webpack/loaders/svg-loader.js +4 -0
  36. package/config/webpack/loaders/vue-loader.js +4 -0
  37. package/config/webpack/settings.js +9 -0
  38. package/example/ExampleApp.vue +136 -0
  39. package/example/example.html +17 -0
  40. package/example/example.js +19 -0
  41. package/example/fonts.js +474 -0
  42. package/example/presets.js +245 -0
  43. package/example/tooltip/Tooltip.js +241 -0
  44. package/example/tooltip/TooltipManager.js +132 -0
  45. package/example/tooltip/index.js +3 -0
  46. package/example/tooltip/modifiers/TooltipCloseOnScrollModifier.js +73 -0
  47. package/example/tooltip/modifiers/index.js +1 -0
  48. package/example/tooltip/tooltip.css +95 -0
  49. package/jest.config.js +17 -0
  50. package/lib/Wysiwyg.vue +156 -0
  51. package/lib/__mocks__/svgMock.js +1 -0
  52. package/lib/__tests__/utils/NodeFactory.js +67 -0
  53. package/lib/__tests__/utils/index.js +4 -0
  54. package/lib/__tests__/utils/setReadonlyProperty.js +9 -0
  55. package/lib/__tests__/utils/waitAsyncOperation.js +6 -0
  56. package/lib/__tests__/utils/withComponentContext.js +14 -0
  57. package/lib/assets/icons.svg +69 -0
  58. package/lib/components/base/Button.vue +117 -0
  59. package/lib/components/base/ButtonToggle.vue +40 -0
  60. package/lib/components/base/FieldLabel.vue +28 -0
  61. package/lib/components/base/Icon.vue +67 -0
  62. package/lib/components/base/Modal.vue +116 -0
  63. package/lib/components/base/NumberField.vue +242 -0
  64. package/lib/components/base/Range.vue +196 -0
  65. package/lib/components/base/ScrollView.vue +60 -0
  66. package/lib/components/base/__tests__/Button.test.js +50 -0
  67. package/lib/components/base/__tests__/Icon.test.js +56 -0
  68. package/lib/components/base/__tests__/Modal.test.js +69 -0
  69. package/lib/components/base/__tests__/Range.test.js +39 -0
  70. package/lib/components/base/colorPicker/ColorPicker.vue +93 -0
  71. package/lib/components/base/colorPicker/composables/__tests__/usePickerApi.test.js +81 -0
  72. package/lib/components/base/colorPicker/composables/index.js +2 -0
  73. package/lib/components/base/colorPicker/composables/usePickerApi.js +35 -0
  74. package/lib/components/base/colorPicker/composables/usePickerHotkeys.js +25 -0
  75. package/lib/components/base/colorPicker/index.js +1 -0
  76. package/lib/components/base/composables/__tests__/useActivatedListener.test.js +89 -0
  77. package/lib/components/base/composables/__tests__/useDeselectionLock.test.js +80 -0
  78. package/lib/components/base/composables/__tests__/useElementRef.test.js +29 -0
  79. package/lib/components/base/composables/__tests__/useModalToggler.test.js +55 -0
  80. package/lib/components/base/composables/__tests__/useNumberValue.test.js +153 -0
  81. package/lib/components/base/composables/__tests__/useScrollView.test.js +43 -0
  82. package/lib/components/base/composables/__tests__/useTempValue.test.js +38 -0
  83. package/lib/components/base/composables/index.js +7 -0
  84. package/lib/components/base/composables/useActivatedListener.js +23 -0
  85. package/lib/components/base/composables/useDeselectionLock.js +35 -0
  86. package/lib/components/base/composables/useElementRef.js +5 -0
  87. package/lib/components/base/composables/useModalToggler.js +58 -0
  88. package/lib/components/base/composables/useNumberValue.js +53 -0
  89. package/lib/components/base/composables/useScrollView.js +22 -0
  90. package/lib/components/base/composables/useTempValue.js +11 -0
  91. package/lib/components/base/dropdown/Dropdown.vue +88 -0
  92. package/lib/components/base/dropdown/DropdownActivator.vue +81 -0
  93. package/lib/components/base/dropdown/DropdownDivider.vue +21 -0
  94. package/lib/components/base/dropdown/DropdownGroup.vue +55 -0
  95. package/lib/components/base/dropdown/DropdownMenu.vue +62 -0
  96. package/lib/components/base/dropdown/DropdownOption.vue +91 -0
  97. package/lib/components/base/dropdown/__tests__/DropdownActivator.test.js +54 -0
  98. package/lib/components/base/dropdown/__tests__/DropdownMenu.test.js +67 -0
  99. package/lib/components/base/dropdown/__tests__/DropdownOption.test.js +81 -0
  100. package/lib/components/base/dropdown/composables/__tests__/useActiveOptionManager.test.js +41 -0
  101. package/lib/components/base/dropdown/composables/__tests__/useDropdownEntityTitle.test.js +24 -0
  102. package/lib/components/base/dropdown/composables/index.js +2 -0
  103. package/lib/components/base/dropdown/composables/useActiveOptionManager.js +25 -0
  104. package/lib/components/base/dropdown/composables/useDropdownEntityTitle.js +5 -0
  105. package/lib/components/base/dropdown/index.js +2 -0
  106. package/lib/components/base/dropdown/injectionTokens.js +5 -0
  107. package/lib/components/base/index.js +11 -0
  108. package/lib/components/index.js +1 -0
  109. package/lib/components/toolbar/Toolbar.vue +56 -0
  110. package/lib/components/toolbar/ToolbarDevice.vue +35 -0
  111. package/lib/components/toolbar/ToolbarDivider.vue +50 -0
  112. package/lib/components/toolbar/ToolbarFull.vue +94 -0
  113. package/lib/components/toolbar/ToolbarGroup.vue +18 -0
  114. package/lib/components/toolbar/ToolbarRow.vue +19 -0
  115. package/lib/components/toolbar/__tests__/Toolbar.test.js +33 -0
  116. package/lib/components/toolbar/__tests__/ToolbarDivider.test.js +26 -0
  117. package/lib/components/toolbar/controls/AlignmentControl.vue +72 -0
  118. package/lib/components/toolbar/controls/AlignmentDeviceControl.vue +67 -0
  119. package/lib/components/toolbar/controls/BackgroundColorControl.vue +48 -0
  120. package/lib/components/toolbar/controls/CaseStyleControl.vue +54 -0
  121. package/lib/components/toolbar/controls/FontColorControl.vue +48 -0
  122. package/lib/components/toolbar/controls/FontFamilyControl.vue +96 -0
  123. package/lib/components/toolbar/controls/FontSizeControl.vue +45 -0
  124. package/lib/components/toolbar/controls/FontWeightControl.vue +43 -0
  125. package/lib/components/toolbar/controls/ItalicControl.vue +47 -0
  126. package/lib/components/toolbar/controls/LineHeightControl.vue +102 -0
  127. package/lib/components/toolbar/controls/ListControl.vue +86 -0
  128. package/lib/components/toolbar/controls/RemoveFormatControl.vue +37 -0
  129. package/lib/components/toolbar/controls/StrikeThroughControl.vue +44 -0
  130. package/lib/components/toolbar/controls/StylePresetControl.vue +95 -0
  131. package/lib/components/toolbar/controls/SuperscriptControl.vue +44 -0
  132. package/lib/components/toolbar/controls/UnderlineControl.vue +44 -0
  133. package/lib/components/toolbar/controls/__tests__/AlignmentControl.test.js +51 -0
  134. package/lib/components/toolbar/controls/__tests__/AlignmentDeviceControl.test.js +77 -0
  135. package/lib/components/toolbar/controls/__tests__/BackgroundColorControl.test.js +59 -0
  136. package/lib/components/toolbar/controls/__tests__/CaseStyleControl.test.js +43 -0
  137. package/lib/components/toolbar/controls/__tests__/FontColorControl.test.js +59 -0
  138. package/lib/components/toolbar/controls/__tests__/FontFamilyControl.test.js +57 -0
  139. package/lib/components/toolbar/controls/__tests__/FontSizeControl.test.js +47 -0
  140. package/lib/components/toolbar/controls/__tests__/FontWeightControl.test.js +45 -0
  141. package/lib/components/toolbar/controls/__tests__/ItalicControl.test.js +63 -0
  142. package/lib/components/toolbar/controls/__tests__/LineHeightControl.test.js +120 -0
  143. package/lib/components/toolbar/controls/__tests__/ListControl.test.js +82 -0
  144. package/lib/components/toolbar/controls/__tests__/RemoveFormatControl.test.js +34 -0
  145. package/lib/components/toolbar/controls/__tests__/StrikeThroughControl.test.js +44 -0
  146. package/lib/components/toolbar/controls/__tests__/StylePresetControl.test.js +129 -0
  147. package/lib/components/toolbar/controls/__tests__/SuperscriptControl.test.js +44 -0
  148. package/lib/components/toolbar/controls/__tests__/UnderlineControl.test.js +44 -0
  149. package/lib/components/toolbar/controls/composables/__tests__/useRecentFonts.test.js +69 -0
  150. package/lib/components/toolbar/controls/composables/index.js +1 -0
  151. package/lib/components/toolbar/controls/composables/useRecentFonts.js +18 -0
  152. package/lib/components/toolbar/controls/index.js +16 -0
  153. package/lib/components/toolbar/index.js +1 -0
  154. package/lib/composables/__tests__/__snapshots__/useEditor.test.js.snap +24 -0
  155. package/lib/composables/__tests__/useEditor.test.js +67 -0
  156. package/lib/composables/__tests__/useToolbar.test.js +56 -0
  157. package/lib/composables/index.js +2 -0
  158. package/lib/composables/useEditor.js +21 -0
  159. package/lib/composables/useToolbar.js +44 -0
  160. package/lib/directives/__tests__/outClick.test.js +86 -0
  161. package/lib/directives/__tests__/tooltip.test.js +39 -0
  162. package/lib/directives/index.js +2 -0
  163. package/lib/directives/outClick.js +37 -0
  164. package/lib/directives/tooltip.js +7 -0
  165. package/lib/enums/Alignments.js +6 -0
  166. package/lib/enums/CaseStyles.js +5 -0
  167. package/lib/enums/Devices.js +15 -0
  168. package/lib/enums/ListTypes.js +23 -0
  169. package/lib/enums/NodeTypes.js +12 -0
  170. package/lib/enums/TextSettings.js +30 -0
  171. package/lib/enums/index.js +6 -0
  172. package/lib/extensions/Alignment.js +67 -0
  173. package/lib/extensions/BackgroundColor.js +28 -0
  174. package/lib/extensions/CaseStyle.js +36 -0
  175. package/lib/extensions/DeviceManager.js +16 -0
  176. package/lib/extensions/FontColor.js +36 -0
  177. package/lib/extensions/FontFamily.js +62 -0
  178. package/lib/extensions/FontSize.js +74 -0
  179. package/lib/extensions/FontStyle.js +62 -0
  180. package/lib/extensions/FontWeight.js +56 -0
  181. package/lib/extensions/LineHeight.js +60 -0
  182. package/lib/extensions/StylePreset.js +168 -0
  183. package/lib/extensions/Superscript.js +5 -0
  184. package/lib/extensions/TextDecoration.js +97 -0
  185. package/lib/extensions/__tests__/Alignment.test.js +107 -0
  186. package/lib/extensions/__tests__/BackgroundColor.test.js +75 -0
  187. package/lib/extensions/__tests__/CaseStyle.test.js +58 -0
  188. package/lib/extensions/__tests__/FontColor.test.js +85 -0
  189. package/lib/extensions/__tests__/FontFamily.test.js +171 -0
  190. package/lib/extensions/__tests__/FontSize.test.js +183 -0
  191. package/lib/extensions/__tests__/FontStyle.test.js +136 -0
  192. package/lib/extensions/__tests__/FontWeight.test.js +151 -0
  193. package/lib/extensions/__tests__/LineHeight.test.js +106 -0
  194. package/lib/extensions/__tests__/StylePreset.test.js +400 -0
  195. package/lib/extensions/__tests__/TextDecoration.test.js +258 -0
  196. package/lib/extensions/__tests__/__snapshots__/Alignment.test.js.snap +29 -0
  197. package/lib/extensions/__tests__/__snapshots__/BackgroundColor.test.js.snap +28 -0
  198. package/lib/extensions/__tests__/__snapshots__/CaseStyle.test.js.snap +69 -0
  199. package/lib/extensions/__tests__/__snapshots__/FontColor.test.js.snap +28 -0
  200. package/lib/extensions/__tests__/__snapshots__/FontFamily.test.js.snap +158 -0
  201. package/lib/extensions/__tests__/__snapshots__/FontSize.test.js.snap +140 -0
  202. package/lib/extensions/__tests__/__snapshots__/FontStyle.test.js.snap +87 -0
  203. package/lib/extensions/__tests__/__snapshots__/FontWeight.test.js.snap +140 -0
  204. package/lib/extensions/__tests__/__snapshots__/LineHeight.test.js.snap +29 -0
  205. package/lib/extensions/__tests__/__snapshots__/StylePreset.test.js.snap +310 -0
  206. package/lib/extensions/__tests__/__snapshots__/TextDecoration.test.js.snap +206 -0
  207. package/lib/extensions/core/NodeProcessor.js +32 -0
  208. package/lib/extensions/core/SelectionProcessor.js +37 -0
  209. package/lib/extensions/core/TextProcessor.js +57 -0
  210. package/lib/extensions/core/__tests__/NodeProcessor.test.js +120 -0
  211. package/lib/extensions/core/__tests__/SelectionProcessor.test.js +78 -0
  212. package/lib/extensions/core/__tests__/TextProcessor.test.js +61 -0
  213. package/lib/extensions/core/__tests__/__snapshots__/NodeProcessor.test.js.snap +93 -0
  214. package/lib/extensions/core/__tests__/__snapshots__/TextProcessor.test.js.snap +43 -0
  215. package/lib/extensions/core/index.js +17 -0
  216. package/lib/extensions/core/inputRules/closeDoubleQuote.js +6 -0
  217. package/lib/extensions/core/inputRules/closeSingleQuote.js +6 -0
  218. package/lib/extensions/core/inputRules/copyright.js +6 -0
  219. package/lib/extensions/core/inputRules/ellipsis.js +6 -0
  220. package/lib/extensions/core/inputRules/emDash.js +6 -0
  221. package/lib/extensions/core/inputRules/index.js +9 -0
  222. package/lib/extensions/core/inputRules/openDoubleQuote.js +6 -0
  223. package/lib/extensions/core/inputRules/openSingleQuote.js +6 -0
  224. package/lib/extensions/core/inputRules/registeredTrademark.js +6 -0
  225. package/lib/extensions/core/inputRules/trademark.js +6 -0
  226. package/lib/extensions/index.js +49 -0
  227. package/lib/extensions/list/List.js +81 -0
  228. package/lib/extensions/list/ListItem.js +12 -0
  229. package/lib/extensions/list/__tests__/List.test.js +130 -0
  230. package/lib/extensions/list/__tests__/__snapshots__/List.test.js.snap +212 -0
  231. package/lib/extensions/list/index.js +1 -0
  232. package/lib/index.js +1 -0
  233. package/lib/injectionTokens.js +7 -0
  234. package/lib/models/Font.js +37 -0
  235. package/lib/models/__tests__/Font.test.js +58 -0
  236. package/lib/models/index.js +1 -0
  237. package/lib/services/FavoriteColors.js +6 -0
  238. package/lib/services/JsonSerializer.js +15 -0
  239. package/lib/services/Storage.js +49 -0
  240. package/lib/services/index.js +3 -0
  241. package/lib/styles/content.css +39 -0
  242. package/lib/styles/helpers/common.css +3 -0
  243. package/lib/styles/helpers/offsets.css +3 -0
  244. package/lib/styles/helpers/text.css +6 -0
  245. package/lib/styles/main.css +5 -0
  246. package/lib/styles/variables.css +57 -0
  247. package/lib/utils/__tests__/__snapshots__/renderInlineSetting.test.js.snap +40 -0
  248. package/lib/utils/__tests__/capitalize.test.js +11 -0
  249. package/lib/utils/__tests__/renderInlineSetting.test.js +39 -0
  250. package/lib/utils/capitalize.js +3 -0
  251. package/lib/utils/createCommand.js +3 -0
  252. package/lib/utils/createKeyboardShortcut.js +6 -0
  253. package/lib/utils/index.js +4 -0
  254. package/lib/utils/renderInlineSetting.js +17 -0
  255. package/package.json +75 -0
@@ -0,0 +1,171 @@
1
+ import { Editor, Extension } from '@tiptap/vue-2';
2
+ import { ref } from '@vue/composition-api';
3
+ import { NodeFactory } from '../../__tests__/utils';
4
+ import { createCommand } from '../../utils';
5
+ import { CORE_EXTENSIONS } from '../core';
6
+ import { Font } from '../../models';
7
+ import { FontFamily } from '../FontFamily';
8
+ import { FontWeight } from '../FontWeight';
9
+ import { FontStyle } from '../FontStyle';
10
+
11
+ const MockStylePreset = Extension.create({
12
+ name: 'style_preset',
13
+
14
+ addCommands() {
15
+ return {
16
+ getPreset: createCommand(() => ref({
17
+ common: {
18
+ font_family: 'Lato',
19
+ font_weight: '400'
20
+ }
21
+ }))
22
+ };
23
+ }
24
+ });
25
+
26
+ function createEditor({ content }) {
27
+ return new Editor({
28
+ content,
29
+ extensions: CORE_EXTENSIONS.concat(
30
+ MockStylePreset,
31
+ FontFamily.configure({
32
+ fonts: [
33
+ new Font({ name: 'Lato', styles: ['400', '700', '700i'] }),
34
+ new Font({ name: 'Bungee', styles: ['400'] })
35
+ ]
36
+ }),
37
+ FontWeight,
38
+ FontStyle
39
+ )
40
+ });
41
+ }
42
+
43
+ const createContent = (text) => NodeFactory.doc([
44
+ NodeFactory.paragraph([text])
45
+ ]);
46
+
47
+ describe('get font family', () => {
48
+ test('should get from selection', () => {
49
+ const editor = createEditor({
50
+ content: createContent(NodeFactory.text('hello world', [
51
+ NodeFactory.mark('font_family', { value: 'Bungee' })
52
+ ]))
53
+ });
54
+
55
+ editor.commands.selectAll();
56
+
57
+ expect(editor.commands.getFontFamily().value).toEqual('Bungee');
58
+ });
59
+
60
+ test('should get default font family', () => {
61
+ const editor = createEditor({
62
+ content: createContent(NodeFactory.text('hello world'))
63
+ });
64
+
65
+ expect(editor.commands.getDefaultFontFamily().value).toEqual('Lato');
66
+ });
67
+
68
+ test('should get from preset', () => {
69
+ const editor = createEditor({
70
+ content: createContent(NodeFactory.text('hello world'))
71
+ });
72
+
73
+ editor.commands.selectAll();
74
+
75
+ expect(editor.commands.getFontFamily().value).toEqual('Lato');
76
+ });
77
+
78
+ test('should find font model by name', () => {
79
+ const editor = createEditor({
80
+ content: createContent(NodeFactory.text('hello world'))
81
+ });
82
+
83
+ expect(editor.commands.findFontByName('Bungee')).toEqual({ name: 'Bungee', styles: ['400'] });
84
+ });
85
+
86
+ test('should get font model from selection', () => {
87
+ const editor = createEditor({
88
+ content: createContent(NodeFactory.text('hello world'))
89
+ });
90
+
91
+ editor.commands.selectAll();
92
+
93
+ expect(editor.commands.getFont().value).toEqual(
94
+ expect.objectContaining({ name: 'Lato' })
95
+ );
96
+ });
97
+ });
98
+
99
+ describe('apply font family', () => {
100
+ test('should change font family', () => {
101
+ const editor = createEditor({
102
+ content: createContent(NodeFactory.text('hello world'))
103
+ });
104
+
105
+ editor.chain().selectAll().applyFontFamily('Bungee').run();
106
+
107
+ expect(editor.getJSON()).toMatchSnapshot();
108
+ });
109
+
110
+ test('should not change current font weight if available', () => {
111
+ const editor = createEditor({
112
+ content: createContent(NodeFactory.text('hello world', [
113
+ NodeFactory.mark('font_weight', { value: '700' })
114
+ ]))
115
+ });
116
+
117
+ editor.chain().selectAll().applyFontFamily('Lato').run();
118
+
119
+ expect(editor.getJSON()).toMatchSnapshot();
120
+ });
121
+
122
+ test('should apply closest font weight if current is unavailable', () => {
123
+ const editor = createEditor({
124
+ content: createContent(NodeFactory.text('hello world', [
125
+ NodeFactory.mark('font_weight', { value: '700' })
126
+ ]))
127
+ });
128
+
129
+ editor.chain().selectAll().applyFontFamily('Bungee').run();
130
+
131
+ expect(editor.getJSON()).toMatchSnapshot();
132
+ });
133
+
134
+ test('should not change italic if available', () => {
135
+ const editor = createEditor({
136
+ content: createContent(NodeFactory.text('hello world', [
137
+ NodeFactory.mark('font_weight', { value: '700' }),
138
+ NodeFactory.mark('font_style', { italic: true })
139
+ ]))
140
+ });
141
+
142
+ editor.chain().selectAll().applyFontFamily('Lato').run();
143
+
144
+ expect(editor.getJSON()).toMatchSnapshot();
145
+ });
146
+
147
+ test('should remove italic if unavailable', () => {
148
+ const editor = createEditor({
149
+ content: createContent(NodeFactory.text('hello world', [
150
+ NodeFactory.mark('font_weight', { value: '700' }),
151
+ NodeFactory.mark('font_style', { italic: true })
152
+ ]))
153
+ });
154
+
155
+ editor.chain().selectAll().applyFontFamily('Bungee').run();
156
+
157
+ expect(editor.getJSON()).toMatchSnapshot();
158
+ });
159
+ });
160
+
161
+ describe('rendering', () => {
162
+ test('should render html', () => {
163
+ const editor = createEditor({
164
+ content: createContent(NodeFactory.text('hello world', [
165
+ NodeFactory.mark('font_family', { value: 'Bungee' })
166
+ ]))
167
+ });
168
+
169
+ expect(editor.getHTML()).toMatchSnapshot();
170
+ });
171
+ });
@@ -0,0 +1,183 @@
1
+ import { Editor, Extension } from '@tiptap/vue-2';
2
+ import { ref } from '@vue/composition-api';
3
+ import { NodeFactory } from '../../__tests__/utils';
4
+ import { createCommand } from '../../utils';
5
+ import { CORE_EXTENSIONS } from '../core';
6
+ import { FontSize } from '../FontSize';
7
+ import { DeviceManager } from '../DeviceManager';
8
+
9
+ const MockStylePreset = Extension.create({
10
+ name: 'style_preset',
11
+
12
+ addCommands() {
13
+ return {
14
+ getPreset: createCommand(() => ref({
15
+ mobile: { font_size: '14' },
16
+ tablet: { font_size: '14' },
17
+ desktop: { font_size: '14' }
18
+ }))
19
+ };
20
+ }
21
+ });
22
+
23
+ function createEditor({ content }) {
24
+ return new Editor({
25
+ content,
26
+ extensions: CORE_EXTENSIONS.concat(
27
+ MockStylePreset,
28
+ DeviceManager.configure({
29
+ deviceRef: ref('desktop')
30
+ }),
31
+ FontSize.configure({
32
+ minSize: 5,
33
+ maxSize: 20
34
+ })
35
+ )
36
+ });
37
+ }
38
+
39
+ const createContent = (text) => NodeFactory.doc([
40
+ NodeFactory.paragraph([text])
41
+ ]);
42
+
43
+ describe('get font size', () => {
44
+ test('should get from selection', () => {
45
+ const editor = createEditor({
46
+ content: createContent(NodeFactory.text('hello world'[
47
+ NodeFactory.mark('font_size', {
48
+ mobile: null,
49
+ tablet: null,
50
+ desktop: '14'
51
+ })
52
+ ]))
53
+ });
54
+
55
+ editor.commands.selectAll();
56
+
57
+ expect(editor.commands.getFontSize().value).toEqual('14');
58
+ });
59
+
60
+ test('should default value', () => {
61
+ const editor = createEditor({
62
+ content: createContent(NodeFactory.text('hello world'))
63
+ });
64
+
65
+ expect(editor.commands.getDefaultFontSize().value).toEqual('14');
66
+ });
67
+
68
+ test('should get from preset', () => {
69
+ const editor = createEditor({
70
+ content: createContent(NodeFactory.text('hello world'))
71
+ });
72
+
73
+ editor.commands.selectAll();
74
+
75
+ expect(editor.commands.getFontSize().value).toEqual('14');
76
+ });
77
+ });
78
+
79
+ describe('apply font size', () => {
80
+ test('should change font size', () => {
81
+ const editor = createEditor({
82
+ content: createContent(NodeFactory.text('hello world'))
83
+ });
84
+
85
+ editor.chain().selectAll().applyFontSize('16').run();
86
+
87
+ expect(editor.getJSON()).toMatchSnapshot();
88
+ });
89
+
90
+ test('should increase font size', () => {
91
+ const editor = createEditor({
92
+ content: createContent(NodeFactory.text('hello world', [
93
+ NodeFactory.mark('font_size', {
94
+ mobile: null,
95
+ tablet: null,
96
+ desktop: '14'
97
+ })
98
+ ]))
99
+ });
100
+
101
+ editor.chain().selectAll().increaseFontSize().run();
102
+
103
+ expect(editor.getJSON()).toMatchSnapshot();
104
+ });
105
+
106
+ test('should not increase font size if reached limit', () => {
107
+ const editor = createEditor({
108
+ content: createContent(NodeFactory.text('hello world', [
109
+ NodeFactory.mark('font_size', {
110
+ mobile: null,
111
+ tablet: null,
112
+ desktop: '20'
113
+ })
114
+ ]))
115
+ });
116
+
117
+ editor.chain().selectAll().increaseFontSize().run();
118
+
119
+ expect(editor.getJSON()).toMatchSnapshot();
120
+ });
121
+
122
+ test('should decrease font size', () => {
123
+ const editor = createEditor({
124
+ content: createContent(NodeFactory.text('hello world', [
125
+ NodeFactory.mark('font_size', {
126
+ mobile: null,
127
+ tablet: null,
128
+ desktop: '14'
129
+ })
130
+ ]))
131
+ });
132
+
133
+ editor.chain().selectAll().decreaseFontSize().run();
134
+
135
+ expect(editor.getJSON()).toMatchSnapshot();
136
+ });
137
+
138
+ test('should not decrease font size if reached limit', () => {
139
+ const editor = createEditor({
140
+ content: createContent(NodeFactory.text('hello world', [
141
+ NodeFactory.mark('font_size', {
142
+ mobile: null,
143
+ tablet: null,
144
+ desktop: '5'
145
+ })
146
+ ]))
147
+ });
148
+
149
+ editor.chain().selectAll().decreaseFontSize().run();
150
+
151
+ expect(editor.getJSON()).toMatchSnapshot();
152
+ });
153
+ });
154
+
155
+ describe('rendering', () => {
156
+ test('should render only desktop', () => {
157
+ const editor = createEditor({
158
+ content: createContent(NodeFactory.text('hello world', [
159
+ NodeFactory.mark('font_size', {
160
+ mobile: null,
161
+ tablet: null,
162
+ desktop: '14'
163
+ })
164
+ ]))
165
+ });
166
+
167
+ expect(editor.getHTML()).toMatchSnapshot();
168
+ });
169
+
170
+ test('should render all devices', () => {
171
+ const editor = createEditor({
172
+ content: createContent(NodeFactory.text('hello world', [
173
+ NodeFactory.mark('font_size', {
174
+ mobile: '12',
175
+ tablet: '14',
176
+ desktop: '16'
177
+ })
178
+ ]))
179
+ });
180
+
181
+ expect(editor.getHTML()).toMatchSnapshot();
182
+ });
183
+ });
@@ -0,0 +1,136 @@
1
+ import { Editor, Extension } from '@tiptap/vue-2';
2
+ import { ref } from '@vue/composition-api';
3
+ import { NodeFactory } from '../../__tests__/utils';
4
+ import { createCommand } from '../../utils';
5
+ import { CORE_EXTENSIONS } from '../core';
6
+ import { FontStyle } from '../FontStyle';
7
+ import { FontFamily } from '../FontFamily';
8
+ import { Font } from '../../models';
9
+ import { FontWeight } from '../FontWeight';
10
+
11
+ const MockStylePreset = Extension.create({
12
+ name: 'style_preset',
13
+
14
+ addCommands() {
15
+ return {
16
+ getPreset: createCommand(() => ref({
17
+ common: {
18
+ font_style: 'normal',
19
+ font_family: 'Lato',
20
+ font_weight: '400'
21
+ }
22
+ }))
23
+ };
24
+ }
25
+ });
26
+
27
+ function createEditor({ content }) {
28
+ return new Editor({
29
+ content,
30
+ extensions: CORE_EXTENSIONS.concat(
31
+ MockStylePreset,
32
+ FontStyle,
33
+ FontWeight,
34
+ FontFamily.configure({
35
+ fonts: [
36
+ new Font({ name: 'Lato', styles: ['400', '400i'] }),
37
+ new Font({ name: 'Bungee', styles: ['400'] })
38
+ ]
39
+ })
40
+ )
41
+ });
42
+ }
43
+
44
+ const createContent = (text) => NodeFactory.doc([
45
+ NodeFactory.paragraph([text])
46
+ ]);
47
+
48
+ describe('get font style', () => {
49
+ test('should get italic from selection', () => {
50
+ const editor = createEditor({
51
+ content: createContent(NodeFactory.text('hello world', [
52
+ NodeFactory.mark('font_style', { italic: true })
53
+ ]))
54
+ });
55
+
56
+ editor.commands.selectAll();
57
+
58
+ expect(editor.commands.isItalic().value).toBe(true);
59
+ });
60
+
61
+ test('should get default font style', () => {
62
+ const editor = createEditor({
63
+ content: createContent(NodeFactory.text('hello world'))
64
+ });
65
+
66
+ expect(editor.commands.getDefaultFontStyle().value).toEqual({ italic: false });
67
+ });
68
+
69
+ test('should italic get from preset', () => {
70
+ const editor = createEditor({
71
+ content: createContent(NodeFactory.text('hello world'))
72
+ });
73
+
74
+ editor.commands.selectAll();
75
+
76
+ expect(editor.commands.isItalic().value).toBe(false);
77
+ });
78
+ });
79
+
80
+ describe('apply font style', () => {
81
+ test('should make italic', () => {
82
+ const editor = createEditor({
83
+ content: createContent(NodeFactory.text('hello world'))
84
+ });
85
+
86
+ editor.chain().selectAll().applyItalic().run();
87
+
88
+ expect(editor.getJSON()).toMatchSnapshot();
89
+ });
90
+
91
+ test('should remove italic', () => {
92
+ const editor = createEditor({
93
+ content: createContent(NodeFactory.text('hello world', [
94
+ NodeFactory.mark('font_style', { italic: true })
95
+ ]))
96
+ });
97
+
98
+ editor.chain().selectAll().removeItalic().run();
99
+
100
+ expect(editor.getJSON()).toMatchSnapshot();
101
+ });
102
+
103
+ test('should toggle italic to removed', () => {
104
+ const editor = createEditor({
105
+ content: createContent(NodeFactory.text('hello world', [
106
+ NodeFactory.mark('font_style', { italic: true })
107
+ ]))
108
+ });
109
+
110
+ editor.chain().selectAll().toggleItalic().run();
111
+
112
+ expect(editor.getJSON()).toMatchSnapshot();
113
+ });
114
+
115
+ test('should toggle italic to used', () => {
116
+ const editor = createEditor({
117
+ content: createContent(NodeFactory.text('hello world'))
118
+ });
119
+
120
+ editor.chain().selectAll().toggleItalic().run();
121
+
122
+ expect(editor.getJSON()).toMatchSnapshot();
123
+ });
124
+ });
125
+
126
+ describe('rendering', () => {
127
+ test('should render html', () => {
128
+ const editor = createEditor({
129
+ content: createContent(NodeFactory.text('hello world', [
130
+ NodeFactory.mark('font_style', { italic: true })
131
+ ]))
132
+ });
133
+
134
+ expect(editor.getHTML()).toMatchSnapshot();
135
+ });
136
+ });
@@ -0,0 +1,151 @@
1
+ import { Editor, Extension } from '@tiptap/vue-2';
2
+ import { ref } from '@vue/composition-api';
3
+ import { NodeFactory } from '../../__tests__/utils';
4
+ import { createCommand } from '../../utils';
5
+ import { CORE_EXTENSIONS } from '../core';
6
+ import { Font } from '../../models';
7
+ import { FontWeight } from '../FontWeight';
8
+ import { FontFamily } from '../FontFamily';
9
+ import { FontStyle } from '../FontStyle';
10
+
11
+ const MockStylePreset = Extension.create({
12
+ name: 'style_preset',
13
+
14
+ addCommands() {
15
+ return {
16
+ getPreset: createCommand(() => ref({
17
+ common: {
18
+ font_weight: '400',
19
+ font_family: 'Lato'
20
+ }
21
+ }))
22
+ };
23
+ }
24
+ });
25
+
26
+ function createEditor({ content }) {
27
+ return new Editor({
28
+ content,
29
+ extensions: CORE_EXTENSIONS.concat(
30
+ MockStylePreset,
31
+ FontFamily.configure({
32
+ fonts: [
33
+ new Font({ name: 'Lato', styles: ['400', '700'] }),
34
+ new Font({ name: 'Bungee', styles: ['300', '800'] })
35
+ ]
36
+ }),
37
+ FontWeight,
38
+ FontStyle
39
+ )
40
+ });
41
+ }
42
+
43
+ const createContent = (text) => NodeFactory.doc([
44
+ NodeFactory.paragraph([text])
45
+ ]);
46
+
47
+ describe('get font weight', () => {
48
+ test('should get from selection', () => {
49
+ const editor = createEditor({
50
+ content: createContent(NodeFactory.text('hello world', [
51
+ NodeFactory.mark('font_weight', { value: '700' })
52
+ ]))
53
+ });
54
+
55
+ editor.commands.selectAll();
56
+
57
+ expect(editor.commands.getFontWeight().value).toEqual('700');
58
+ });
59
+
60
+ test('should default value', () => {
61
+ const editor = createEditor({
62
+ content: createContent(NodeFactory.text('hello world'))
63
+ });
64
+
65
+ expect(editor.commands.getDefaultFontWeight().value).toEqual('400');
66
+ });
67
+
68
+ test('should get from preset', () => {
69
+ const editor = createEditor({
70
+ content: createContent(NodeFactory.text('hello world'))
71
+ });
72
+
73
+ editor.commands.selectAll();
74
+
75
+ expect(editor.commands.getFontWeight().value).toEqual('400');
76
+ });
77
+ });
78
+
79
+ describe('apply font weight', () => {
80
+ test('should change font weight', () => {
81
+ const editor = createEditor({
82
+ content: createContent(NodeFactory.text('hello world'))
83
+ });
84
+
85
+ editor.chain().selectAll().applyFontWeight('700').run();
86
+
87
+ expect(editor.getJSON()).toMatchSnapshot();
88
+ });
89
+
90
+ test('should toggle weight to bold', () => {
91
+ const editor = createEditor({
92
+ content: createContent(NodeFactory.text('hello world', [
93
+ NodeFactory.mark('font_weight', { value: '400' })
94
+ ]))
95
+ });
96
+
97
+ editor.chain().selectAll().toggleBold().run();
98
+
99
+ expect(editor.getJSON()).toMatchSnapshot();
100
+ });
101
+
102
+ test('should toggle weight to closest bold', () => {
103
+ const editor = createEditor({
104
+ content: createContent(NodeFactory.text('hello world', [
105
+ NodeFactory.mark('font_family', { value: 'Bungee' }),
106
+ NodeFactory.mark('font_weight', { value: '400' })
107
+ ]))
108
+ });
109
+
110
+ editor.chain().selectAll().toggleBold().run();
111
+
112
+ expect(editor.getJSON()).toMatchSnapshot();
113
+ });
114
+
115
+ test('should toggle weight to medium', () => {
116
+ const editor = createEditor({
117
+ content: createContent(NodeFactory.text('hello world', [
118
+ NodeFactory.mark('font_weight', { value: '700' })
119
+ ]))
120
+ });
121
+
122
+ editor.chain().selectAll().toggleBold().run();
123
+
124
+ expect(editor.getJSON()).toMatchSnapshot();
125
+ });
126
+
127
+ test('should toggle weight to closest medium', () => {
128
+ const editor = createEditor({
129
+ content: createContent(NodeFactory.text('hello world', [
130
+ NodeFactory.mark('font_family', { value: 'Bungee' }),
131
+ NodeFactory.mark('font_weight', { value: '800' })
132
+ ]))
133
+ });
134
+
135
+ editor.chain().selectAll().toggleBold().run();
136
+
137
+ expect(editor.getJSON()).toMatchSnapshot();
138
+ });
139
+ });
140
+
141
+ describe('rendering', () => {
142
+ test('should render html', () => {
143
+ const editor = createEditor({
144
+ content: createContent(NodeFactory.text('hello world', [
145
+ NodeFactory.mark('font_weight', { value: '700' })
146
+ ]))
147
+ });
148
+
149
+ expect(editor.getHTML()).toMatchSnapshot();
150
+ });
151
+ });