@zipify/wysiwyg 1.0.0-dev.6 → 1.0.0-dev.62

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 (217) hide show
  1. package/.editorconfig +1 -1
  2. package/.eslintrc.js +2 -2
  3. package/.github/dependabot.yaml +1 -0
  4. package/.lintstagedrc +2 -2
  5. package/.release-it.json +3 -1
  6. package/.stylelintrc +0 -4
  7. package/README.md +2 -2
  8. package/config/jest/setupTests.js +0 -3
  9. package/config/vite/example.config.js +25 -0
  10. package/config/vite/lib.config.js +28 -0
  11. package/config/{webpack → vite}/settings.js +0 -0
  12. package/dist/wysiwyg.css +1 -837
  13. package/dist/wysiwyg.mjs +18353 -0
  14. package/example/ExampleApp.vue +41 -3
  15. package/example/example.js +0 -3
  16. package/example/{example.html → index.html} +1 -0
  17. package/example/pageBlocks.js +31 -0
  18. package/example/presets.js +2 -2
  19. package/example/tooltip/Tooltip.js +1 -1
  20. package/jest.config.js +3 -1
  21. package/lib/Wysiwyg.vue +65 -26
  22. package/lib/__tests__/utils/NodeFactory.js +13 -0
  23. package/lib/__tests__/utils/withComponentContext.js +1 -1
  24. package/lib/assets/icons/link.svg +3 -0
  25. package/lib/assets/icons/unlink.svg +3 -0
  26. package/lib/components/base/Button.vue +22 -2
  27. package/lib/components/base/Checkbox.vue +89 -0
  28. package/lib/components/base/FieldLabel.vue +2 -1
  29. package/lib/components/base/Icon.vue +3 -3
  30. package/lib/components/base/Modal.vue +1 -2
  31. package/lib/components/base/NumberField.vue +2 -2
  32. package/lib/components/base/Range.vue +1 -1
  33. package/lib/components/base/ScrollView.vue +1 -3
  34. package/lib/components/base/TextField.vue +106 -0
  35. package/lib/components/base/__tests__/Modal.test.js +7 -2
  36. package/lib/components/base/__tests__/TextField.test.js +57 -0
  37. package/lib/components/base/__tests__/__snapshots__/TextField.test.js.snap +9 -0
  38. package/lib/components/base/colorPicker/ColorPicker.vue +2 -2
  39. package/lib/components/base/colorPicker/composables/__tests__/usePickerApi.test.js +1 -1
  40. package/lib/components/base/colorPicker/composables/usePickerApi.js +3 -3
  41. package/lib/components/base/colorPicker/composables/usePickerHotkeys.js +3 -2
  42. package/lib/components/base/composables/__tests__/useActivatedListener.test.js +1 -1
  43. package/lib/components/base/composables/__tests__/useDeselectionLock.test.js +1 -1
  44. package/lib/components/base/composables/__tests__/useElementRef.test.js +1 -1
  45. package/lib/components/base/composables/__tests__/useModalToggler.test.js +1 -1
  46. package/lib/components/base/composables/__tests__/useNumberValue.test.js +1 -1
  47. package/lib/components/base/composables/__tests__/useScrollView.test.js +1 -1
  48. package/lib/components/base/composables/__tests__/useTempValue.test.js +1 -1
  49. package/lib/components/base/composables/__tests__/useValidator.test.js +44 -0
  50. package/lib/components/base/composables/index.js +1 -0
  51. package/lib/components/base/composables/useActivatedListener.js +1 -1
  52. package/lib/components/base/composables/useDeselectionLock.js +1 -1
  53. package/lib/components/base/composables/useElementRef.js +1 -1
  54. package/lib/components/base/composables/useModalToggler.js +1 -1
  55. package/lib/components/base/composables/useScrollView.js +1 -1
  56. package/lib/components/base/composables/useTempValue.js +1 -1
  57. package/lib/components/base/composables/useValidator.js +23 -0
  58. package/lib/components/base/dropdown/Dropdown.vue +16 -4
  59. package/lib/components/base/dropdown/DropdownActivator.vue +19 -3
  60. package/lib/components/base/dropdown/DropdownGroup.vue +1 -1
  61. package/lib/components/base/dropdown/DropdownMenu.vue +1 -1
  62. package/lib/components/base/dropdown/DropdownOption.vue +1 -1
  63. package/lib/components/base/dropdown/__tests__/DropdownActivator.test.js +1 -1
  64. package/lib/components/base/dropdown/__tests__/DropdownMenu.test.js +1 -1
  65. package/lib/components/base/dropdown/__tests__/DropdownOption.test.js +1 -1
  66. package/lib/components/base/dropdown/composables/__tests__/useActiveOptionManager.test.js +1 -1
  67. package/lib/components/base/dropdown/composables/__tests__/useDropdownEntityTitle.test.js +1 -1
  68. package/lib/components/base/dropdown/composables/useActiveOptionManager.js +1 -1
  69. package/lib/components/base/dropdown/composables/useDropdownEntityTitle.js +1 -1
  70. package/lib/components/base/index.js +3 -1
  71. package/lib/components/toolbar/Toolbar.vue +49 -9
  72. package/lib/components/toolbar/ToolbarDivider.vue +1 -1
  73. package/lib/components/toolbar/ToolbarFull.vue +10 -2
  74. package/lib/components/toolbar/ToolbarRow.vue +1 -0
  75. package/lib/components/toolbar/__tests__/Toolbar.test.js +6 -0
  76. package/lib/components/toolbar/controls/AlignmentControl.vue +1 -1
  77. package/lib/components/toolbar/controls/AlignmentDeviceControl.vue +1 -1
  78. package/lib/components/toolbar/controls/BackgroundColorControl.vue +1 -1
  79. package/lib/components/toolbar/controls/CaseStyleControl.vue +1 -1
  80. package/lib/components/toolbar/controls/FontColorControl.vue +1 -1
  81. package/lib/components/toolbar/controls/FontFamilyControl.vue +1 -1
  82. package/lib/components/toolbar/controls/FontSizeControl.vue +8 -1
  83. package/lib/components/toolbar/controls/FontWeightControl.vue +1 -1
  84. package/lib/components/toolbar/controls/ItalicControl.vue +1 -1
  85. package/lib/components/toolbar/controls/LineHeightControl.vue +1 -1
  86. package/lib/components/toolbar/controls/ListControl.vue +68 -34
  87. package/lib/components/toolbar/controls/RemoveFormatControl.vue +1 -1
  88. package/lib/components/toolbar/controls/StrikeThroughControl.vue +1 -1
  89. package/lib/components/toolbar/controls/StylePresetControl.vue +15 -2
  90. package/lib/components/toolbar/controls/SuperscriptControl.vue +1 -1
  91. package/lib/components/toolbar/controls/UnderlineControl.vue +2 -2
  92. package/lib/components/toolbar/controls/__tests__/AlignmentControl.test.js +1 -1
  93. package/lib/components/toolbar/controls/__tests__/AlignmentDeviceControl.test.js +1 -1
  94. package/lib/components/toolbar/controls/__tests__/BackgroundColorControl.test.js +1 -1
  95. package/lib/components/toolbar/controls/__tests__/CaseStyleControl.test.js +1 -1
  96. package/lib/components/toolbar/controls/__tests__/FontColorControl.test.js +1 -1
  97. package/lib/components/toolbar/controls/__tests__/FontFamilyControl.test.js +1 -1
  98. package/lib/components/toolbar/controls/__tests__/FontSizeControl.test.js +1 -1
  99. package/lib/components/toolbar/controls/__tests__/FontWeightControl.test.js +1 -1
  100. package/lib/components/toolbar/controls/__tests__/ItalicControl.test.js +1 -1
  101. package/lib/components/toolbar/controls/__tests__/LineHeightControl.test.js +1 -1
  102. package/lib/components/toolbar/controls/__tests__/ListControl.test.js +18 -3
  103. package/lib/components/toolbar/controls/__tests__/StrikeThroughControl.test.js +1 -1
  104. package/lib/components/toolbar/controls/__tests__/StylePresetControl.test.js +17 -1
  105. package/lib/components/toolbar/controls/__tests__/UnderlineControl.test.js +5 -1
  106. package/lib/components/toolbar/controls/composables/useRecentFonts.js +1 -1
  107. package/lib/components/toolbar/controls/index.js +1 -0
  108. package/lib/components/toolbar/controls/link/LinkControl.vue +155 -0
  109. package/lib/components/toolbar/controls/link/LinkControlApply.vue +35 -0
  110. package/lib/components/toolbar/controls/link/LinkControlHeader.vue +67 -0
  111. package/lib/components/toolbar/controls/link/__tests__/LinkControl.test.js +79 -0
  112. package/lib/components/toolbar/controls/link/__tests__/LinkControlHeader.test.js +42 -0
  113. package/lib/components/toolbar/controls/link/composables/__tests__/__snapshots__/useLink.test.js.snap +8 -0
  114. package/lib/components/toolbar/controls/link/composables/__tests__/useLink.test.js +114 -0
  115. package/lib/components/toolbar/controls/link/composables/index.js +1 -0
  116. package/lib/components/toolbar/controls/link/composables/useLink.js +61 -0
  117. package/lib/components/toolbar/controls/link/destination/LinkControlDestination.vue +103 -0
  118. package/lib/components/toolbar/controls/link/destination/LinkControlPageBlock.vue +54 -0
  119. package/lib/components/toolbar/controls/link/destination/LinkControlUrl.vue +52 -0
  120. package/lib/components/toolbar/controls/link/destination/__tests__/LinkControlPageBlock.test.js +36 -0
  121. package/lib/components/toolbar/controls/link/destination/__tests__/LinkControlUrl.test.js +46 -0
  122. package/lib/components/toolbar/controls/link/destination/__tests__/__snapshots__/LinkControlPageBlock.test.js.snap +9 -0
  123. package/lib/components/toolbar/controls/link/destination/__tests__/__snapshots__/LinkControlUrl.test.js.snap +17 -0
  124. package/lib/components/toolbar/controls/link/destination/index.js +1 -0
  125. package/lib/components/toolbar/controls/link/index.js +1 -0
  126. package/lib/composables/__tests__/useEditor.test.js +4 -3
  127. package/lib/composables/useEditor.js +8 -8
  128. package/lib/composables/useToolbar.js +23 -28
  129. package/lib/directives/__tests__/outClick.test.js +6 -0
  130. package/lib/directives/outClick.js +19 -6
  131. package/lib/enums/Alignments.js +10 -1
  132. package/lib/enums/LinkDestinations.js +4 -0
  133. package/lib/enums/LinkTargets.js +4 -0
  134. package/lib/enums/TextSettings.js +3 -1
  135. package/lib/enums/index.js +2 -0
  136. package/lib/extensions/Alignment.js +22 -8
  137. package/lib/extensions/BackgroundColor.js +15 -7
  138. package/lib/extensions/DeviceManager.js +2 -5
  139. package/lib/extensions/FontColor.js +15 -7
  140. package/lib/extensions/FontFamily.js +26 -9
  141. package/lib/extensions/FontSize.js +32 -13
  142. package/lib/extensions/FontStyle.js +24 -14
  143. package/lib/extensions/FontWeight.js +25 -15
  144. package/lib/extensions/LineHeight.js +32 -29
  145. package/lib/extensions/Link.js +90 -0
  146. package/lib/extensions/StylePreset.js +20 -19
  147. package/lib/extensions/Superscript.js +5 -1
  148. package/lib/extensions/TextDecoration.js +46 -13
  149. package/lib/extensions/__tests__/Alignment.test.js +13 -7
  150. package/lib/extensions/__tests__/BackgroundColor.test.js +12 -6
  151. package/lib/extensions/__tests__/CaseStyle.test.js +3 -5
  152. package/lib/extensions/__tests__/FontColor.test.js +12 -6
  153. package/lib/extensions/__tests__/FontFamily.test.js +33 -8
  154. package/lib/extensions/__tests__/FontSize.test.js +15 -8
  155. package/lib/extensions/__tests__/FontStyle.test.js +12 -6
  156. package/lib/extensions/__tests__/FontWeight.test.js +20 -6
  157. package/lib/extensions/__tests__/LineHeight.test.js +24 -12
  158. package/lib/extensions/__tests__/Link.test.js +102 -0
  159. package/lib/extensions/__tests__/StylePreset.test.js +71 -8
  160. package/lib/extensions/__tests__/TextDecoration.test.js +52 -6
  161. package/lib/extensions/__tests__/__snapshots__/Alignment.test.js.snap +26 -2
  162. package/lib/extensions/__tests__/__snapshots__/BackgroundColor.test.js.snap +30 -1
  163. package/lib/extensions/__tests__/__snapshots__/FontColor.test.js.snap +18 -1
  164. package/lib/extensions/__tests__/__snapshots__/FontFamily.test.js.snap +88 -1
  165. package/lib/extensions/__tests__/__snapshots__/FontSize.test.js.snap +33 -2
  166. package/lib/extensions/__tests__/__snapshots__/FontStyle.test.js.snap +25 -4
  167. package/lib/extensions/__tests__/__snapshots__/FontWeight.test.js.snap +47 -1
  168. package/lib/extensions/__tests__/__snapshots__/LineHeight.test.js.snap +26 -2
  169. package/lib/extensions/__tests__/__snapshots__/Link.test.js.snap +225 -0
  170. package/lib/extensions/__tests__/__snapshots__/StylePreset.test.js.snap +6 -2
  171. package/lib/extensions/__tests__/__snapshots__/TextDecoration.test.js.snap +183 -3
  172. package/lib/extensions/core/CopyPasteProcessor.js +10 -0
  173. package/lib/extensions/core/NodeProcessor.js +1 -1
  174. package/lib/extensions/core/TextProcessor.js +10 -0
  175. package/lib/extensions/core/__tests__/NodeProcessor.test.js +3 -5
  176. package/lib/extensions/core/__tests__/SelectionProcessor.test.js +3 -5
  177. package/lib/extensions/core/__tests__/TextProcessor.test.js +138 -12
  178. package/lib/extensions/core/__tests__/__snapshots__/TextProcessor.test.js.snap +26 -0
  179. package/lib/extensions/core/index.js +11 -2
  180. package/lib/extensions/core/plugins/PastePlugin.js +57 -0
  181. package/lib/extensions/core/plugins/ProseMirrorPlugin.js +20 -0
  182. package/lib/extensions/core/plugins/index.js +1 -0
  183. package/lib/extensions/index.js +46 -34
  184. package/lib/extensions/list/List.js +2 -3
  185. package/lib/extensions/list/__tests__/List.test.js +5 -8
  186. package/lib/extensions/list/__tests__/__snapshots__/List.test.js.snap +60 -20
  187. package/lib/injectionTokens.js +2 -1
  188. package/lib/services/ContentNormalizer.js +122 -29
  189. package/lib/services/ContextWidnow.js +23 -0
  190. package/lib/services/__tests__/ContentNormalizer.test.js +96 -7
  191. package/lib/services/__tests__/FavoriteColors.test.js +1 -1
  192. package/lib/services/index.js +1 -0
  193. package/lib/styles/content.css +110 -13
  194. package/lib/styles/helpers/offsets.css +16 -0
  195. package/lib/styles/variables.css +6 -0
  196. package/lib/utils/__tests__/__snapshots__/renderInlineSetting.test.js.snap +4 -4
  197. package/lib/utils/__tests__/convertAlignment.test.js +16 -0
  198. package/lib/utils/__tests__/convertFontSize.test.js +21 -0
  199. package/lib/utils/__tests__/convertLineHeight.test.js +21 -0
  200. package/lib/utils/convertAlignment.js +12 -0
  201. package/lib/utils/convertColor.js +1 -1
  202. package/lib/utils/convertFontSize.js +8 -0
  203. package/lib/utils/convertLineHeight.js +17 -0
  204. package/lib/utils/importIcon.js +7 -6
  205. package/lib/utils/index.js +3 -0
  206. package/lib/utils/renderInlineSetting.js +1 -1
  207. package/package.json +26 -31
  208. package/config/webpack/example.config.js +0 -88
  209. package/config/webpack/lib.config.js +0 -40
  210. package/config/webpack/loaders/index.js +0 -6
  211. package/config/webpack/loaders/js-loader.js +0 -5
  212. package/config/webpack/loaders/style-loader.js +0 -9
  213. package/config/webpack/loaders/svg-loader.js +0 -4
  214. package/config/webpack/loaders/vue-loader.js +0 -4
  215. package/dist/wysiwyg.js +0 -2
  216. package/dist/wysiwyg.js.LICENSE.txt +0 -1
  217. package/lib/composables/__tests__/useToolbar.test.js +0 -56
@@ -16,6 +16,11 @@
16
16
  Load Content
17
17
  </button>
18
18
 
19
+ <label class="zw-readonly-switcher">
20
+ <input type="checkbox" v-model="isReadonly">
21
+ readonly
22
+ </label>
23
+
19
24
  <span>Deployed at {{ updatedAt }}</span>
20
25
 
21
26
  <Wysiwyg
@@ -23,23 +28,28 @@
23
28
  base-list-class="zpa-text__list--"
24
29
  base-preset-class="zp ts-"
25
30
  default-preset-id="regular-1"
31
+ link-preset-id="link"
26
32
  ref="wswgRef"
27
33
  :fonts="fonts"
28
34
  :presets="presets"
29
35
  :make-preset-variable="$options.makePresetVariable"
30
36
  :favorite-colors="favoriteColors"
31
37
  :device="device"
32
- @updateFavoriteColors="updateFavoriteColors"
38
+ :page-blocks="pageBlocks"
39
+ :active="isActive"
40
+ :readonly="isReadonly"
41
+ @update-favorite-colors="updateFavoriteColors"
33
42
  />
34
43
  <pre class="zw-content-structure" v-html="structurePreview" />
35
44
  </div>
36
45
  </template>
37
46
 
38
47
  <script>
39
- import { computed, onMounted, ref } from '@vue/composition-api';
48
+ import { computed, onMounted, ref } from 'vue';
40
49
  import { Wysiwyg } from '../lib';
41
50
  import { FONTS } from './fonts';
42
51
  import { PRESETS, renderPresetVariable } from './presets';
52
+ import { PAGE_BLOCKS } from './pageBlocks';
43
53
 
44
54
  function getInitialContent() {
45
55
  const data = sessionStorage.getItem('wswg-data');
@@ -64,8 +74,11 @@ export default {
64
74
  const wswgRef = ref(null);
65
75
  const content = ref(getInitialContent());
66
76
  const presets = ref(PRESETS);
77
+ const pageBlocks = ref(PAGE_BLOCKS);
67
78
  const device = ref('desktop');
68
79
  const updatedAt = new Date(ZW_UPDATED_AT).toLocaleString('ua-UA');
80
+ const isActive = ref(false);
81
+ const isReadonly = ref(false);
69
82
 
70
83
  const structurePreview = computed(() => {
71
84
  const json = JSON.stringify(content.value, null, ' ');
@@ -94,6 +107,10 @@ export default {
94
107
  }
95
108
  }
96
109
 
110
+ document.addEventListener('click', (event) => {
111
+ isActive.value = wswgRef.value.$el.contains(event.target);
112
+ });
113
+
97
114
  return {
98
115
  wswgRef,
99
116
  content,
@@ -104,13 +121,19 @@ export default {
104
121
  loadContent,
105
122
  device,
106
123
  updatedAt,
107
- presets
124
+ presets,
125
+ isActive,
126
+ pageBlocks,
127
+ isReadonly
108
128
  };
109
129
  }
110
130
  };
111
131
  </script>
112
132
 
113
133
  <style>
134
+ @import url("@zipify/colorpicker/dist/colorpicker.css");
135
+ @import url("simplebar/dist/simplebar.css");
136
+
114
137
  body {
115
138
  padding: 50px 20px;
116
139
  max-width: 1200px;
@@ -127,6 +150,16 @@ body {
127
150
  margin-right: 20px;
128
151
  }
129
152
 
153
+ .zw-readonly-switcher {
154
+ margin-right: 20px;
155
+ display: inline-flex;
156
+ align-items: center;
157
+ }
158
+
159
+ .zw-readonly-switcher input {
160
+ margin-right: 5px;
161
+ }
162
+
130
163
  .zw-content-structure {
131
164
  background-color: #F1F1F1;
132
165
  padding: 8px;
@@ -141,4 +174,9 @@ body {
141
174
  .zpa-text__list--square { list-style-type: square }
142
175
  .zpa-text__list--latin { list-style-type: upper-roman }
143
176
  .zpa-text__list--roman { list-style-type: upper-latin }
177
+
178
+ p, h1, h2, h3, h4 {
179
+ margin-top: 0.3em;
180
+ margin-bottom: 0.3em;
181
+ }
144
182
  </style>
@@ -1,5 +1,4 @@
1
1
  import Vue from 'vue';
2
- import CompositionAPI from '@vue/composition-api';
3
2
  import ExampleApp from './ExampleApp';
4
3
  import { loadFonts } from './fonts';
5
4
  import { renderPresets } from './presets';
@@ -10,8 +9,6 @@ import { tooltipManager } from './tooltip';
10
9
  loadFonts();
11
10
  renderPresets();
12
11
 
13
- Vue.use(CompositionAPI);
14
-
15
12
  if (!sessionStorage.getItem('wswg-data')) {
16
13
  sessionStorage.setItem('wswg-data', JSON.stringify({
17
14
  type: 'doc',
@@ -13,5 +13,6 @@
13
13
  </head>
14
14
  <body>
15
15
  <div data-app></div>
16
+ <script type="module" src="./example.js"></script>
16
17
  </body>
17
18
  </html>
@@ -0,0 +1,31 @@
1
+ export const PAGE_BLOCKS = [
2
+ {
3
+ id: 123,
4
+ title: 'Dynamic Buy Box'
5
+ },
6
+
7
+ {
8
+ id: 123456,
9
+ title: 'Text + Navigation'
10
+ },
11
+
12
+ {
13
+ id: 11123,
14
+ title: 'Dynamic Bundle Offer'
15
+ },
16
+
17
+ {
18
+ id: 4444444,
19
+ title: 'Dynamic Buy Box[2]'
20
+ },
21
+
22
+ {
23
+ id: 555555,
24
+ title: 'Image'
25
+ },
26
+
27
+ {
28
+ id: 666666,
29
+ title: 'Footer'
30
+ }
31
+ ];
@@ -14,7 +14,7 @@ export const PRESETS = [
14
14
  'common': {
15
15
  'font_family': 'Lato',
16
16
  'font_weight': '700',
17
- 'color': '#262626',
17
+ 'color': '',
18
18
  'font_style': 'normal',
19
19
  'text_decoration': 'none'
20
20
  },
@@ -131,7 +131,7 @@ export const PRESETS = [
131
131
  'common': {
132
132
  'font_family': 'inherit',
133
133
  'font_weight': 'inherit',
134
- 'color': '',
134
+ 'color': 'rgb(0, 0, 238)',
135
135
  'font_style': 'normal',
136
136
  'text_decoration': 'underline'
137
137
  },
@@ -25,7 +25,7 @@ export class Tooltip {
25
25
  static get popperStyles() {
26
26
  return {
27
27
  willChange: 'transform',
28
- zIndex: 10001
28
+ zIndex: 999999
29
29
  };
30
30
  }
31
31
 
package/jest.config.js CHANGED
@@ -3,8 +3,10 @@ module.exports = {
3
3
  moduleFileExtensions: ['js', 'json', 'vue', 'scss'],
4
4
  transform: {
5
5
  '^.+\\.js$': 'babel-jest',
6
- '^.+\\.vue$': '@vue/vue2-jest'
6
+ '^.+\\.vue$': '@vue/vue2-jest',
7
+ 'node_modules/@zipify/.+': 'babel-jest'
7
8
  },
9
+ transformIgnorePatterns: ['node_modules/(?!@zipify)/'],
8
10
  moduleNameMapper: {
9
11
  '^.+\\.svg$': '<rootDir>/lib/__mocks__/svgMock.js'
10
12
  },
package/lib/Wysiwyg.vue CHANGED
@@ -1,27 +1,23 @@
1
1
  <template>
2
- <div
3
- class="zw-wysiwyg"
4
- ref="wysiwygRef"
5
- v-out-click="{ onOutClick: hideToolbar, isDisabled: !toolbar.isShow.value }"
6
- >
2
+ <div class="zw-wysiwyg" ref="wysiwygRef">
7
3
  <Toolbar
8
- v-show="toolbar.isShow.value"
9
- :editor="editor"
4
+ :toolbar="toolbar"
10
5
  :device="device"
11
6
  ref="toolbarRef"
12
7
  />
8
+
13
9
  <EditorContent :editor="editor" />
14
10
  </div>
15
11
  </template>
16
12
 
17
13
  <script>
18
14
  import { EditorContent } from '@tiptap/vue-2';
19
- import { provide, toRef, ref } from '@vue/composition-api';
15
+ import { provide, toRef, ref, computed } from 'vue';
20
16
  import { Toolbar } from './components';
21
17
  import { useToolbar, useEditor } from './composables';
22
- import { getExtensions } from './extensions';
18
+ import { buildExtensions } from './extensions';
23
19
  import { InjectionTokens } from './injectionTokens';
24
- import { FavoriteColors, Storage } from './services';
20
+ import { ContextWindow, FavoriteColors, Storage } from './services';
25
21
  import { Devices } from './enums';
26
22
  import { outClick } from './directives';
27
23
  import { Font } from './models';
@@ -57,6 +53,11 @@ export default {
57
53
  required: true
58
54
  },
59
55
 
56
+ linkPresetId: {
57
+ type: [Number, String],
58
+ required: true
59
+ },
60
+
60
61
  basePresetClass: {
61
62
  type: String,
62
63
  required: true
@@ -72,6 +73,11 @@ export default {
72
73
  required: true
73
74
  },
74
75
 
76
+ active: {
77
+ type: Boolean,
78
+ required: true
79
+ },
80
+
75
81
  device: {
76
82
  type: String,
77
83
  required: false,
@@ -94,57 +100,83 @@ export default {
94
100
  type: String,
95
101
  required: false,
96
102
  default: 'zw-list--'
103
+ },
104
+
105
+ pageBlocks: {
106
+ type: Array,
107
+ required: true
108
+ },
109
+
110
+ readonly: {
111
+ type: Boolean,
112
+ required: false,
113
+ default: false
114
+ },
115
+
116
+ // Requires Window type but it different in iframe and outside
117
+ // eslint-disable-next-line vue/require-prop-types
118
+ window: {
119
+ required: false,
120
+ default: () => window
97
121
  }
98
122
  },
99
123
 
124
+ emits: [
125
+ 'input',
126
+ 'update-favorite-colors'
127
+ ],
128
+
100
129
  setup(props, { emit }) {
101
- const fonts = props.fonts.map((font) => new Font(font));
130
+ ContextWindow.use(props.window);
102
131
 
132
+ const fonts = props.fonts.map((font) => new Font(font));
103
133
  const toolbarRef = ref(null);
104
134
  const wysiwygRef = ref(null);
135
+ const wrapperRef = computed(() => wysiwygRef.value?.$el || document.body);
136
+ const isToolbarActiveRef = computed(() => props.active && !props.readonly);
105
137
 
106
138
  const toolbar = useToolbar({
107
139
  wrapperRef: wysiwygRef,
108
- popperRef: toolbarRef,
109
- offsets: toRef(props, 'toolbarOffsets').value
140
+ isActiveRef: isToolbarActiveRef,
141
+ offsets: props.toolbarOffsets
110
142
  });
143
+ const updateToolbar = () => toolbar.update();
111
144
 
112
145
  function onChange(content) {
113
146
  emit('input', content);
114
- toolbar.update();
147
+ updateToolbar();
115
148
  }
116
149
 
150
+ const pageBlocks = toRef(props, 'pageBlocks');
151
+
117
152
  const editor = useEditor({
118
153
  content: toRef(props, 'value'),
119
154
  onChange: (content) => onChange(content),
120
- onFocus: () => toolbar.show(),
155
+ isReadonlyRef: toRef(props, 'readonly'),
121
156
 
122
- extensions: getExtensions({
157
+ extensions: buildExtensions({
123
158
  fonts,
124
159
  minFontSize: MIN_FONT_SIZE,
125
160
  maxFontSize: MAX_FONT_SIZE,
126
161
  presetsRef: toRef(props, 'presets'),
127
162
  defaultPresetId: props.defaultPresetId,
163
+ linkPresetId: props.linkPresetId,
128
164
  makePresetVariable: props.makePresetVariable,
129
165
  basePresetClass: props.basePresetClass,
130
166
  baseListClass: props.baseListClass,
131
- deviceRef: toRef(props, 'device')
167
+ deviceRef: toRef(props, 'device'),
168
+ pageBlocksRef: pageBlocks,
169
+ wrapperRef
132
170
  })
133
171
  });
134
172
 
135
- function hideToolbar() {
136
- if (editor.isFocused) return;
137
-
138
- toolbar.hide();
139
- }
140
-
141
173
  const fontSizes = new Array(MAX_FONT_SIZE - MIN_FONT_SIZE + 1)
142
174
  .fill(0)
143
175
  .map((_, index) => String(index + MIN_FONT_SIZE));
144
176
 
145
177
  const favoriteColors = new FavoriteColors({
146
178
  listRef: toRef(props, 'favoriteColors'),
147
- triggerUpdate: (colors) => emit('updateFavoriteColors', colors)
179
+ triggerUpdate: (colors) => emit('update-favorite-colors', colors)
148
180
  });
149
181
 
150
182
  provide(InjectionTokens.EDITOR, editor);
@@ -152,8 +184,15 @@ export default {
152
184
  provide(InjectionTokens.FONT_SIZES, fontSizes);
153
185
  provide(InjectionTokens.LOCAL_STORAGE, new Storage(localStorage));
154
186
  provide(InjectionTokens.FAVORITE_COLORS, favoriteColors);
155
-
156
- return { editor, toolbarRef, wysiwygRef, toolbar, hideToolbar };
187
+ provide(InjectionTokens.PAGE_BLOCKS, pageBlocks);
188
+
189
+ return {
190
+ editor,
191
+ toolbarRef,
192
+ wysiwygRef,
193
+ toolbar,
194
+ updateToolbar
195
+ };
157
196
  }
158
197
  };
159
198
  </script>
@@ -64,4 +64,17 @@ export class NodeFactory {
64
64
  static mark(type, attrs) {
65
65
  return { type, attrs };
66
66
  }
67
+
68
+ static link(attrs) {
69
+ return {
70
+ type: 'text',
71
+ marks: [
72
+ {
73
+ type: 'link',
74
+ attrs: { ...attrs }
75
+ }
76
+ ],
77
+ text: attrs.text
78
+ };
79
+ }
67
80
  }
@@ -1,5 +1,5 @@
1
1
  import { shallowMount } from '@vue/test-utils';
2
- import { h } from '@vue/composition-api';
2
+ import { h } from 'vue';
3
3
 
4
4
  export function withComponentContext(exec, params = {}) {
5
5
  const wrapper = shallowMount({
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" style="width:var(--zw-icon-width);height:var(--zw-icon-height)" viewBox="0 0 28 28">
2
+ <path fill="var(--zw-icon-foreground)" fill-rule="evenodd" d="M12 17.5h-2a3.5 3.5 0 1 1 0-7h2V9h-2a5 5 0 0 0 0 10h2v-1.5Zm6-4.5h-8v2h8v-2Zm-2-4h2a5 5 0 0 1 0 10h-2v-1.5h2a3.5 3.5 0 1 0 0-7h-2V9Z" clip-rule="evenodd"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" style="width:var(--zw-icon-width);height:var(--zw-icon-height)" viewBox="0 0 20 20">
2
+ <path fill="var(--zw-icon-foreground)" fill-rule="evenodd" d="M18.96 10a5 5 0 0 0-5-5h-2v1.5h2a3.49 3.49 0 0 1 1.58 6.61L13.43 11h.53V9h-2.53l-7-7-1.47 1.47L17.49 18l1.47-1.47-2.34-2.34A4.93 4.93 0 0 0 18.96 10Zm-13 1h1.59L5.96 9.41V11ZM3.81 7.26A3.47 3.47 0 0 0 2.46 10a3.5 3.5 0 0 0 3.5 3.5h2V15h-2a5 5 0 0 1-3.21-8.8l1.06 1.06Z" clip-rule="evenodd"/>
3
+ </svg>
@@ -11,7 +11,7 @@
11
11
  </template>
12
12
 
13
13
  <script>
14
- import { computed } from '@vue/composition-api';
14
+ import { computed } from 'vue';
15
15
 
16
16
  export default {
17
17
  name: 'Button',
@@ -20,7 +20,7 @@ export default {
20
20
  skin: {
21
21
  type: String,
22
22
  required: false,
23
- validator: (skin) => ['toolbar', 'none'].includes(skin),
23
+ validator: (skin) => ['toolbar', 'primary', 'secondary', 'none'].includes(skin),
24
24
  default: 'none'
25
25
  },
26
26
 
@@ -104,6 +104,26 @@ export default {
104
104
  will-change: background-color, color, opacity;
105
105
  }
106
106
 
107
+ .zw-button--primary {
108
+ background-color: rgb(var(--zw-color-green));
109
+ color: rgb(var(--zw-color-white));
110
+ padding: var(--zw-offset-xxs) var(--zw-offset-sm);
111
+ line-height: var(--zw-line-height-md);
112
+ }
113
+
114
+ .zw-button--primary,
115
+ .zw-button--secondary {
116
+ color: rgb(var(--zw-color-white));
117
+ padding: var(--zw-offset-xxs) var(--zw-offset-sm);
118
+ font-weight: 600;
119
+ font-size: var(--zw-font-size-xs);
120
+ }
121
+
122
+ .zw-button--primary:not(:disabled):hover,
123
+ .zw-button--secondary:not(:disabled):hover {
124
+ opacity: 0.9;
125
+ }
126
+
107
127
  .zw-button--toolbar:not(.zw-button--icon) {
108
128
  padding: var(--zw-offset-xxs) var(--zw-offset-xs);
109
129
  }
@@ -0,0 +1,89 @@
1
+ <template>
2
+ <label class="zw-checkbox">
3
+ <input class="zw-checkbox__field" type="checkbox" :checked="value" @change="onCheckedChanged">
4
+ <span class="zw-checkbox__indicator zw-margin-right--xs" />
5
+ <span class="zw-checkbox__label">{{ label }}</span>
6
+ </label>
7
+ </template>
8
+
9
+ <script>
10
+ export default {
11
+ name: 'Checkbox',
12
+
13
+ props: {
14
+ value: {
15
+ type: Boolean,
16
+ required: true
17
+ },
18
+
19
+ label: {
20
+ type: String,
21
+ required: false,
22
+ default: null
23
+ }
24
+ },
25
+
26
+ setup(_, { emit }) {
27
+ const onCheckedChanged = (event) => {
28
+ emit('input', event.target.checked);
29
+ };
30
+
31
+ return { onCheckedChanged };
32
+ }
33
+ };
34
+ </script>
35
+
36
+ <style scoped>
37
+ .zw-checkbox {
38
+ display: inline-flex;
39
+ align-items: center;
40
+ position: relative;
41
+ cursor: pointer;
42
+ padding: var(--zw-offset-xxs) var(--zw-offset-xxs) var(--zw-offset-xxs) 0;
43
+ }
44
+
45
+ .zw-checkbox__field + .zw-checkbox__indicator {
46
+ color: var(--zw-color-n200);
47
+ box-shadow: inset 0 0 0 2px currentColor;
48
+ }
49
+
50
+ .zw-checkbox:hover .zw-checkbox__indicator {
51
+ box-shadow: inset 0 0 0 2px rgb(var(--zw-color-green));
52
+ }
53
+
54
+ .zw-checkbox__field:checked + .zw-checkbox__indicator {
55
+ color: rgb(var(--zw-color-green))
56
+ }
57
+
58
+ .zw-checkbox .zw-checkbox__field:checked + .zw-checkbox__indicator {
59
+ background-color: rgb(var(--zw-color-green));
60
+ }
61
+
62
+ .zw-checkbox .zw-checkbox__indicator::after {
63
+ content: "";
64
+ display: block;
65
+ height: 16px;
66
+ transform: scale(0.6);
67
+ transition: transform 0.2s ease-out;
68
+ width: 16px;
69
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNiAyNiIgd2lkdGg9IjUxMiIgaGVpZ2h0PSI1MTIiPgogIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0uMyAxNGMtLjItLjItLjMtLjUtLjMtLjdzLjEtLjUuMy0uN2wxLjQtMS40Yy40LS40IDEtLjQgMS40IDBsLjEuMSA1LjUgNS45Yy4yLjIuNS4yLjcgMEwyMi44IDMuM2guMWMuNC0uNCAxLS40IDEuNCAwbDEuNCAxLjRjLjQuNC40IDEgMCAxLjRsLTE2IDE2LjZjLS4yLjItLjQuMy0uNy4zLS4zIDAtLjUtLjEtLjctLjNMLjUgMTQuMy4zIDE0eiIvPgo8L3N2Zz4K");
70
+ background-repeat: no-repeat;
71
+ background-size: 16px;
72
+ background-position: center center;
73
+ }
74
+
75
+ .zw-checkbox__field:not(:checked) + .zw-checkbox__indicator::after {
76
+ transform: scale(0);
77
+ }
78
+
79
+ .zw-checkbox__field {
80
+ position: absolute;
81
+ opacity: 0;
82
+ height: 0;
83
+ width: 0;
84
+ }
85
+
86
+ .zw-checkbox__label {
87
+ font-size: var(--zw-font-size-xs);
88
+ }
89
+ </style>
@@ -11,7 +11,8 @@ export default {
11
11
  props: {
12
12
  fieldId: {
13
13
  type: String,
14
- required: true
14
+ required: false,
15
+ default: null
15
16
  }
16
17
  }
17
18
  };
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <span
2
+ <div
3
3
  class="zw-icon"
4
4
  :class="iconClasses"
5
5
  :style="iconStyles"
@@ -8,7 +8,7 @@
8
8
  </template>
9
9
 
10
10
  <script>
11
- import { computed } from '@vue/composition-api';
11
+ import { computed } from 'vue';
12
12
  import { importIcon } from '../../utils';
13
13
 
14
14
  export default {
@@ -66,7 +66,7 @@ export default {
66
66
 
67
67
  <style scoped>
68
68
  .zw-icon {
69
- display: inline-block;
69
+ display: flex;
70
70
  }
71
71
 
72
72
  .zw-icon--auto-color {
@@ -13,7 +13,7 @@
13
13
  </template>
14
14
 
15
15
  <script>
16
- import { computed, ref } from '@vue/composition-api';
16
+ import { computed, ref } from 'vue';
17
17
  import { outClick } from '../../directives';
18
18
  import { useDeselectionLock, useModalToggler } from './composables';
19
19
 
@@ -76,7 +76,6 @@ export default {
76
76
  <style scoped>
77
77
  .zw-modal {
78
78
  border-radius: 2px;
79
- overflow: hidden;
80
79
  box-shadow: 0 0 4px rgba(var(--zw-color-black), 0.3);
81
80
  background-color: rgb(var(--zw-color-n15));
82
81
  max-height: var(--zw-modal-max-height);
@@ -36,7 +36,7 @@
36
36
  </template>
37
37
 
38
38
  <script>
39
- import { computed, toRef } from '@vue/composition-api';
39
+ import { computed, toRef } from 'vue';
40
40
  import Button from './Button';
41
41
  import { useNumberValue } from './composables';
42
42
 
@@ -126,7 +126,7 @@ export default {
126
126
  };
127
127
  </script>
128
128
 
129
- <style lang="scss" scoped>
129
+ <style scoped>
130
130
  .zw-number-field {
131
131
  --border-color: rgb(var(--zw-color-n60));
132
132
  --text-color: rgb(var(--zw-color-n85));
@@ -13,7 +13,7 @@
13
13
  </template>
14
14
 
15
15
  <script>
16
- import { computed, toRef } from '@vue/composition-api';
16
+ import { computed, toRef } from 'vue';
17
17
  import { useTempValue } from './composables';
18
18
 
19
19
  export default {
@@ -6,7 +6,7 @@
6
6
 
7
7
  <script>
8
8
  import SimpleBar from 'simplebar';
9
- import { onMounted, provide, ref } from '@vue/composition-api';
9
+ import { onMounted, provide, ref } from 'vue';
10
10
  import { SCROLL_VIEW } from './composables';
11
11
 
12
12
  export default {
@@ -31,8 +31,6 @@ export default {
31
31
  </script>
32
32
 
33
33
  <style scoped>
34
- @import url("~simplebar/dist/simplebar.css");
35
-
36
34
  .zw-scroll-view::v-deep .simplebar-placeholder {
37
35
  display: none;
38
36
  }