@zipify/wysiwyg 1.0.0-dev.9 → 1.0.0-dev.90

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 (232) 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 +30 -0
  11. package/config/{webpack → vite}/settings.js +0 -0
  12. package/dist/wysiwyg.css +404 -373
  13. package/dist/wysiwyg.mjs +26014 -0
  14. package/example/ExampleApp.vue +35 -4
  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 +73 -14
  22. package/lib/__tests__/utils/index.js +0 -1
  23. package/lib/__tests__/utils/withComponentContext.js +1 -1
  24. package/lib/assets/icons/background-color.svg +3 -1
  25. package/lib/assets/icons/font-color.svg +1 -3
  26. package/lib/assets/icons/link.svg +3 -0
  27. package/lib/assets/icons/unlink.svg +3 -0
  28. package/lib/components/base/Button.vue +23 -2
  29. package/lib/components/base/Checkbox.vue +89 -0
  30. package/lib/components/base/FieldLabel.vue +2 -1
  31. package/lib/components/base/Icon.vue +3 -3
  32. package/lib/components/base/Modal.vue +1 -2
  33. package/lib/components/base/NumberField.vue +2 -2
  34. package/lib/components/base/Range.vue +1 -1
  35. package/lib/components/base/ScrollView.vue +1 -3
  36. package/lib/components/base/TextField.vue +108 -0
  37. package/lib/components/base/__tests__/Modal.test.js +7 -2
  38. package/lib/components/base/__tests__/TextField.test.js +57 -0
  39. package/lib/components/base/__tests__/__snapshots__/TextField.test.js.snap +9 -0
  40. package/lib/components/base/colorPicker/ColorPicker.vue +14 -12
  41. package/lib/components/base/colorPicker/composables/__tests__/usePickerApi.test.js +6 -6
  42. package/lib/components/base/colorPicker/composables/usePickerApi.js +15 -8
  43. package/lib/components/base/colorPicker/composables/usePickerHotkeys.js +3 -2
  44. package/lib/components/base/composables/__tests__/useActivatedListener.test.js +1 -1
  45. package/lib/components/base/composables/__tests__/useDeselectionLock.test.js +1 -1
  46. package/lib/components/base/composables/__tests__/useElementRef.test.js +1 -1
  47. package/lib/components/base/composables/__tests__/useModalToggler.test.js +1 -1
  48. package/lib/components/base/composables/__tests__/useNumberValue.test.js +1 -1
  49. package/lib/components/base/composables/__tests__/useScrollView.test.js +1 -1
  50. package/lib/components/base/composables/__tests__/useTempValue.test.js +1 -1
  51. package/lib/components/base/composables/__tests__/useValidator.test.js +44 -0
  52. package/lib/components/base/composables/index.js +1 -0
  53. package/lib/components/base/composables/useActivatedListener.js +1 -1
  54. package/lib/components/base/composables/useDeselectionLock.js +1 -1
  55. package/lib/components/base/composables/useElementRef.js +1 -1
  56. package/lib/components/base/composables/useModalToggler.js +6 -2
  57. package/lib/components/base/composables/useScrollView.js +1 -1
  58. package/lib/components/base/composables/useTempValue.js +1 -1
  59. package/lib/components/base/composables/useValidator.js +23 -0
  60. package/lib/components/base/dropdown/Dropdown.vue +16 -4
  61. package/lib/components/base/dropdown/DropdownActivator.vue +19 -3
  62. package/lib/components/base/dropdown/DropdownGroup.vue +1 -1
  63. package/lib/components/base/dropdown/DropdownMenu.vue +1 -1
  64. package/lib/components/base/dropdown/DropdownOption.vue +1 -1
  65. package/lib/components/base/dropdown/__tests__/DropdownActivator.test.js +1 -1
  66. package/lib/components/base/dropdown/__tests__/DropdownMenu.test.js +1 -1
  67. package/lib/components/base/dropdown/__tests__/DropdownOption.test.js +1 -1
  68. package/lib/components/base/dropdown/composables/__tests__/useActiveOptionManager.test.js +1 -1
  69. package/lib/components/base/dropdown/composables/__tests__/useDropdownEntityTitle.test.js +1 -1
  70. package/lib/components/base/dropdown/composables/useActiveOptionManager.js +1 -1
  71. package/lib/components/base/dropdown/composables/useDropdownEntityTitle.js +1 -1
  72. package/lib/components/base/index.js +3 -1
  73. package/lib/components/toolbar/Toolbar.vue +51 -9
  74. package/lib/components/toolbar/ToolbarDivider.vue +1 -1
  75. package/lib/components/toolbar/ToolbarFull.vue +41 -10
  76. package/lib/components/toolbar/ToolbarRow.vue +1 -0
  77. package/lib/components/toolbar/__tests__/Toolbar.test.js +6 -0
  78. package/lib/components/toolbar/controls/AlignmentControl.vue +1 -1
  79. package/lib/components/toolbar/controls/AlignmentDeviceControl.vue +1 -1
  80. package/lib/components/toolbar/controls/BackgroundColorControl.vue +1 -1
  81. package/lib/components/toolbar/controls/CaseStyleControl.vue +1 -1
  82. package/lib/components/toolbar/controls/FontColorControl.vue +1 -1
  83. package/lib/components/toolbar/controls/FontFamilyControl.vue +1 -1
  84. package/lib/components/toolbar/controls/FontSizeControl.vue +8 -1
  85. package/lib/components/toolbar/controls/FontWeightControl.vue +1 -1
  86. package/lib/components/toolbar/controls/ItalicControl.vue +1 -1
  87. package/lib/components/toolbar/controls/LineHeightControl.vue +1 -1
  88. package/lib/components/toolbar/controls/ListControl.vue +68 -34
  89. package/lib/components/toolbar/controls/RemoveFormatControl.vue +1 -1
  90. package/lib/components/toolbar/controls/StrikeThroughControl.vue +1 -1
  91. package/lib/components/toolbar/controls/StylePresetControl.vue +15 -2
  92. package/lib/components/toolbar/controls/SuperscriptControl.vue +1 -1
  93. package/lib/components/toolbar/controls/UnderlineControl.vue +2 -2
  94. package/lib/components/toolbar/controls/__tests__/AlignmentControl.test.js +1 -1
  95. package/lib/components/toolbar/controls/__tests__/AlignmentDeviceControl.test.js +1 -1
  96. package/lib/components/toolbar/controls/__tests__/BackgroundColorControl.test.js +1 -1
  97. package/lib/components/toolbar/controls/__tests__/CaseStyleControl.test.js +1 -1
  98. package/lib/components/toolbar/controls/__tests__/FontColorControl.test.js +1 -1
  99. package/lib/components/toolbar/controls/__tests__/FontFamilyControl.test.js +1 -1
  100. package/lib/components/toolbar/controls/__tests__/FontSizeControl.test.js +1 -1
  101. package/lib/components/toolbar/controls/__tests__/FontWeightControl.test.js +1 -1
  102. package/lib/components/toolbar/controls/__tests__/ItalicControl.test.js +1 -1
  103. package/lib/components/toolbar/controls/__tests__/LineHeightControl.test.js +1 -1
  104. package/lib/components/toolbar/controls/__tests__/ListControl.test.js +18 -3
  105. package/lib/components/toolbar/controls/__tests__/StrikeThroughControl.test.js +1 -1
  106. package/lib/components/toolbar/controls/__tests__/StylePresetControl.test.js +17 -1
  107. package/lib/components/toolbar/controls/__tests__/UnderlineControl.test.js +5 -1
  108. package/lib/components/toolbar/controls/composables/useRecentFonts.js +1 -1
  109. package/lib/components/toolbar/controls/index.js +1 -0
  110. package/lib/components/toolbar/controls/link/LinkControl.vue +160 -0
  111. package/lib/components/toolbar/controls/link/LinkControlApply.vue +35 -0
  112. package/lib/components/toolbar/controls/link/LinkControlHeader.vue +69 -0
  113. package/lib/components/toolbar/controls/link/__tests__/LinkControl.test.js +79 -0
  114. package/lib/components/toolbar/controls/link/__tests__/LinkControlHeader.test.js +42 -0
  115. package/lib/components/toolbar/controls/link/composables/__tests__/__snapshots__/useLink.test.js.snap +15 -0
  116. package/lib/components/toolbar/controls/link/composables/__tests__/useLink.test.js +172 -0
  117. package/lib/components/toolbar/controls/link/composables/index.js +1 -0
  118. package/lib/components/toolbar/controls/link/composables/useLink.js +82 -0
  119. package/lib/components/toolbar/controls/link/destination/LinkControlDestination.vue +103 -0
  120. package/lib/components/toolbar/controls/link/destination/LinkControlPageBlock.vue +54 -0
  121. package/lib/components/toolbar/controls/link/destination/LinkControlUrl.vue +52 -0
  122. package/lib/components/toolbar/controls/link/destination/__tests__/LinkControlPageBlock.test.js +36 -0
  123. package/lib/components/toolbar/controls/link/destination/__tests__/LinkControlUrl.test.js +46 -0
  124. package/lib/components/toolbar/controls/link/destination/__tests__/__snapshots__/LinkControlPageBlock.test.js.snap +9 -0
  125. package/lib/components/toolbar/controls/link/destination/__tests__/__snapshots__/LinkControlUrl.test.js.snap +17 -0
  126. package/lib/components/toolbar/controls/link/destination/index.js +1 -0
  127. package/lib/components/toolbar/controls/link/index.js +1 -0
  128. package/lib/composables/__tests__/__snapshots__/useEditor.test.js.snap +1 -0
  129. package/lib/composables/__tests__/useEditor.test.js +5 -4
  130. package/lib/composables/useEditor.js +12 -9
  131. package/lib/composables/useToolbar.js +26 -19
  132. package/lib/directives/__tests__/outClick.test.js +6 -0
  133. package/lib/directives/outClick.js +19 -6
  134. package/lib/enums/Alignments.js +10 -1
  135. package/lib/enums/LinkDestinations.js +4 -0
  136. package/lib/enums/LinkTargets.js +4 -0
  137. package/lib/enums/TextSettings.js +3 -1
  138. package/lib/enums/index.js +2 -0
  139. package/lib/extensions/Alignment.js +22 -8
  140. package/lib/extensions/BackgroundColor.js +15 -7
  141. package/lib/extensions/DeviceManager.js +2 -5
  142. package/lib/extensions/FontColor.js +15 -7
  143. package/lib/extensions/FontFamily.js +26 -9
  144. package/lib/extensions/FontSize.js +33 -13
  145. package/lib/extensions/FontStyle.js +24 -14
  146. package/lib/extensions/FontWeight.js +25 -15
  147. package/lib/extensions/LineHeight.js +33 -29
  148. package/lib/extensions/Link.js +90 -0
  149. package/lib/extensions/StylePreset.js +20 -19
  150. package/lib/extensions/Superscript.js +5 -1
  151. package/lib/extensions/TextDecoration.js +46 -13
  152. package/lib/extensions/__tests__/Alignment.test.js +14 -9
  153. package/lib/extensions/__tests__/BackgroundColor.test.js +13 -8
  154. package/lib/extensions/__tests__/CaseStyle.test.js +4 -7
  155. package/lib/extensions/__tests__/FontColor.test.js +13 -8
  156. package/lib/extensions/__tests__/FontFamily.test.js +34 -10
  157. package/lib/extensions/__tests__/FontSize.test.js +16 -10
  158. package/lib/extensions/__tests__/FontStyle.test.js +13 -8
  159. package/lib/extensions/__tests__/FontWeight.test.js +21 -8
  160. package/lib/extensions/__tests__/LineHeight.test.js +25 -14
  161. package/lib/extensions/__tests__/Link.test.js +101 -0
  162. package/lib/extensions/__tests__/StylePreset.test.js +72 -10
  163. package/lib/extensions/__tests__/TextDecoration.test.js +53 -8
  164. package/lib/extensions/__tests__/__snapshots__/Alignment.test.js.snap +26 -2
  165. package/lib/extensions/__tests__/__snapshots__/BackgroundColor.test.js.snap +30 -1
  166. package/lib/extensions/__tests__/__snapshots__/FontColor.test.js.snap +18 -1
  167. package/lib/extensions/__tests__/__snapshots__/FontFamily.test.js.snap +88 -1
  168. package/lib/extensions/__tests__/__snapshots__/FontSize.test.js.snap +33 -2
  169. package/lib/extensions/__tests__/__snapshots__/FontStyle.test.js.snap +25 -4
  170. package/lib/extensions/__tests__/__snapshots__/FontWeight.test.js.snap +47 -1
  171. package/lib/extensions/__tests__/__snapshots__/LineHeight.test.js.snap +26 -2
  172. package/lib/extensions/__tests__/__snapshots__/Link.test.js.snap +225 -0
  173. package/lib/extensions/__tests__/__snapshots__/StylePreset.test.js.snap +6 -2
  174. package/lib/extensions/__tests__/__snapshots__/TextDecoration.test.js.snap +183 -3
  175. package/lib/extensions/core/CopyPasteProcessor.js +10 -0
  176. package/lib/extensions/core/NodeProcessor.js +1 -1
  177. package/lib/extensions/core/TextProcessor.js +11 -24
  178. package/lib/extensions/core/__tests__/NodeProcessor.test.js +4 -7
  179. package/lib/extensions/core/__tests__/SelectionProcessor.test.js +4 -7
  180. package/lib/extensions/core/__tests__/TextProcessor.test.js +139 -14
  181. package/lib/extensions/core/__tests__/__snapshots__/TextProcessor.test.js.snap +26 -0
  182. package/lib/extensions/core/index.js +11 -2
  183. package/lib/extensions/core/plugins/PastePlugin.js +57 -0
  184. package/lib/extensions/core/plugins/ProseMirrorPlugin.js +20 -0
  185. package/lib/extensions/core/plugins/index.js +1 -0
  186. package/lib/extensions/index.js +46 -34
  187. package/lib/extensions/list/List.js +5 -4
  188. package/lib/extensions/list/__tests__/List.test.js +6 -10
  189. package/lib/extensions/list/__tests__/__snapshots__/List.test.js.snap +60 -20
  190. package/lib/index.js +3 -0
  191. package/lib/injectionTokens.js +3 -1
  192. package/lib/services/ContentNormalizer.js +144 -28
  193. package/lib/services/ContextWidnow.js +23 -0
  194. package/lib/{__tests__/utils → services}/NodeFactory.js +5 -1
  195. package/lib/services/__tests__/ContentNormalizer.test.js +124 -8
  196. package/lib/services/__tests__/FavoriteColors.test.js +1 -1
  197. package/lib/services/index.js +2 -0
  198. package/lib/styles/content.css +108 -13
  199. package/lib/styles/helpers/offsets.css +16 -0
  200. package/lib/styles/variables.css +6 -0
  201. package/lib/utils/__tests__/__snapshots__/renderInlineSetting.test.js.snap +4 -4
  202. package/lib/utils/__tests__/convertAlignment.test.js +16 -0
  203. package/lib/utils/__tests__/convertFontSize.test.js +21 -0
  204. package/lib/utils/__tests__/convertLineHeight.test.js +21 -0
  205. package/lib/utils/convertAlignment.js +12 -0
  206. package/lib/utils/convertColor.js +1 -1
  207. package/lib/utils/convertFontSize.js +8 -0
  208. package/lib/utils/convertLineHeight.js +17 -0
  209. package/lib/utils/importIcon.js +7 -6
  210. package/lib/utils/index.js +4 -0
  211. package/lib/utils/isWysiwygContent.js +12 -0
  212. package/lib/utils/renderInlineSetting.js +1 -1
  213. package/package.json +26 -30
  214. package/config/webpack/example.config.js +0 -88
  215. package/config/webpack/lib.config.js +0 -44
  216. package/config/webpack/loaders/index.js +0 -6
  217. package/config/webpack/loaders/js-loader.js +0 -5
  218. package/config/webpack/loaders/style-loader.js +0 -9
  219. package/config/webpack/loaders/svg-loader.js +0 -4
  220. package/config/webpack/loaders/vue-loader.js +0 -4
  221. package/dist/wysiwyg.js +0 -2
  222. package/dist/wysiwyg.js.LICENSE.txt +0 -1
  223. package/lib/extensions/core/inputRules/closeDoubleQuote.js +0 -6
  224. package/lib/extensions/core/inputRules/closeSingleQuote.js +0 -6
  225. package/lib/extensions/core/inputRules/copyright.js +0 -6
  226. package/lib/extensions/core/inputRules/ellipsis.js +0 -6
  227. package/lib/extensions/core/inputRules/emDash.js +0 -6
  228. package/lib/extensions/core/inputRules/index.js +0 -9
  229. package/lib/extensions/core/inputRules/openDoubleQuote.js +0 -6
  230. package/lib/extensions/core/inputRules/openSingleQuote.js +0 -6
  231. package/lib/extensions/core/inputRules/registeredTrademark.js +0 -6
  232. package/lib/extensions/core/inputRules/trademark.js +0 -6
@@ -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,24 +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"
38
+ :page-blocks="pageBlocks"
32
39
  :active="isActive"
33
- @updateFavoriteColors="updateFavoriteColors"
40
+ :readonly="isReadonly"
41
+ @update-favorite-colors="updateFavoriteColors"
34
42
  />
35
43
  <pre class="zw-content-structure" v-html="structurePreview" />
36
44
  </div>
37
45
  </template>
38
46
 
39
47
  <script>
40
- import { computed, onMounted, ref } from '@vue/composition-api';
48
+ import { computed, onMounted, ref } from 'vue';
41
49
  import { Wysiwyg } from '../lib';
42
50
  import { FONTS } from './fonts';
43
51
  import { PRESETS, renderPresetVariable } from './presets';
52
+ import { PAGE_BLOCKS } from './pageBlocks';
44
53
 
45
54
  function getInitialContent() {
46
55
  const data = sessionStorage.getItem('wswg-data');
@@ -65,9 +74,11 @@ export default {
65
74
  const wswgRef = ref(null);
66
75
  const content = ref(getInitialContent());
67
76
  const presets = ref(PRESETS);
77
+ const pageBlocks = ref(PAGE_BLOCKS);
68
78
  const device = ref('desktop');
69
79
  const updatedAt = new Date(ZW_UPDATED_AT).toLocaleString('ua-UA');
70
80
  const isActive = ref(false);
81
+ const isReadonly = ref(false);
71
82
 
72
83
  const structurePreview = computed(() => {
73
84
  const json = JSON.stringify(content.value, null, ' ');
@@ -96,7 +107,7 @@ export default {
96
107
  }
97
108
  }
98
109
 
99
- document.body.addEventListener('click', (event) => {
110
+ document.addEventListener('click', (event) => {
100
111
  isActive.value = wswgRef.value.$el.contains(event.target);
101
112
  });
102
113
 
@@ -111,13 +122,18 @@ export default {
111
122
  device,
112
123
  updatedAt,
113
124
  presets,
114
- isActive
125
+ isActive,
126
+ pageBlocks,
127
+ isReadonly
115
128
  };
116
129
  }
117
130
  };
118
131
  </script>
119
132
 
120
133
  <style>
134
+ @import url("@zipify/colorpicker/dist/colorpicker.css");
135
+ @import url("simplebar/dist/simplebar.css");
136
+
121
137
  body {
122
138
  padding: 50px 20px;
123
139
  max-width: 1200px;
@@ -134,6 +150,16 @@ body {
134
150
  margin-right: 20px;
135
151
  }
136
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
+
137
163
  .zw-content-structure {
138
164
  background-color: #F1F1F1;
139
165
  padding: 8px;
@@ -148,4 +174,9 @@ body {
148
174
  .zpa-text__list--square { list-style-type: square }
149
175
  .zpa-text__list--latin { list-style-type: upper-roman }
150
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
+ }
151
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,23 +1,23 @@
1
1
  <template>
2
2
  <div class="zw-wysiwyg" ref="wysiwygRef">
3
3
  <Toolbar
4
- v-show="active"
5
- :editor="editor"
4
+ :toolbar="toolbar"
6
5
  :device="device"
7
6
  ref="toolbarRef"
8
7
  />
8
+
9
9
  <EditorContent :editor="editor" />
10
10
  </div>
11
11
  </template>
12
12
 
13
13
  <script>
14
14
  import { EditorContent } from '@tiptap/vue-2';
15
- import { provide, toRef, ref } from '@vue/composition-api';
15
+ import { provide, toRef, ref, computed } from 'vue';
16
16
  import { Toolbar } from './components';
17
17
  import { useToolbar, useEditor } from './composables';
18
- import { getExtensions } from './extensions';
18
+ import { buildExtensions } from './extensions';
19
19
  import { InjectionTokens } from './injectionTokens';
20
- import { FavoriteColors, Storage } from './services';
20
+ import { ContextWindow, FavoriteColors, Storage } from './services';
21
21
  import { Devices } from './enums';
22
22
  import { outClick } from './directives';
23
23
  import { Font } from './models';
@@ -53,6 +53,11 @@ export default {
53
53
  required: true
54
54
  },
55
55
 
56
+ linkPresetId: {
57
+ type: [Number, String],
58
+ required: true
59
+ },
60
+
56
61
  basePresetClass: {
57
62
  type: String,
58
63
  required: true
@@ -91,45 +96,91 @@ export default {
91
96
  default: () => [0, 8]
92
97
  },
93
98
 
99
+ toolbarPlacement: {
100
+ type: String,
101
+ required: false,
102
+ default: 'top-start'
103
+ },
104
+
94
105
  baseListClass: {
95
106
  type: String,
96
107
  required: false,
97
108
  default: 'zw-list--'
109
+ },
110
+
111
+ pageBlocks: {
112
+ type: Array,
113
+ required: true
114
+ },
115
+
116
+ readonly: {
117
+ type: Boolean,
118
+ required: false,
119
+ default: false
120
+ },
121
+
122
+ // Temporary until migrations static accordion to sidebar
123
+ popupMode: {
124
+ type: Boolean,
125
+ required: false,
126
+ default: false
127
+ },
128
+
129
+ // Requires Window type but it different in iframe and outside
130
+ // eslint-disable-next-line vue/require-prop-types
131
+ window: {
132
+ required: false,
133
+ default: () => window
98
134
  }
99
135
  },
100
136
 
137
+ emits: [
138
+ 'input',
139
+ 'update-favorite-colors'
140
+ ],
141
+
101
142
  setup(props, { emit }) {
102
- const fonts = props.fonts.map((font) => new Font(font));
143
+ ContextWindow.use(props.window);
103
144
 
145
+ const fonts = props.fonts.map((font) => new Font(font));
104
146
  const toolbarRef = ref(null);
105
147
  const wysiwygRef = ref(null);
148
+ const wrapperRef = computed(() => wysiwygRef.value?.$el || document.body);
149
+ const isToolbarActiveRef = computed(() => props.active && !props.readonly);
106
150
 
107
151
  const toolbar = useToolbar({
108
152
  wrapperRef: wysiwygRef,
109
- popperRef: toolbarRef,
110
- isActiveRef: toRef(props, 'active'),
153
+ placementRef: toRef(props, 'toolbarPlacement'),
154
+ isActiveRef: isToolbarActiveRef,
111
155
  offsets: props.toolbarOffsets
112
156
  });
157
+ const updateToolbar = () => toolbar.update();
113
158
 
114
159
  function onChange(content) {
115
160
  emit('input', content);
116
- toolbar.update();
161
+ updateToolbar();
117
162
  }
118
163
 
164
+ const pageBlocks = toRef(props, 'pageBlocks');
165
+
119
166
  const editor = useEditor({
120
167
  content: toRef(props, 'value'),
121
168
  onChange: (content) => onChange(content),
169
+ isReadonlyRef: toRef(props, 'readonly'),
122
170
 
123
- extensions: getExtensions({
171
+ extensions: buildExtensions({
124
172
  fonts,
125
173
  minFontSize: MIN_FONT_SIZE,
126
174
  maxFontSize: MAX_FONT_SIZE,
127
175
  presetsRef: toRef(props, 'presets'),
128
176
  defaultPresetId: props.defaultPresetId,
177
+ linkPresetId: props.linkPresetId,
129
178
  makePresetVariable: props.makePresetVariable,
130
179
  basePresetClass: props.basePresetClass,
131
180
  baseListClass: props.baseListClass,
132
- deviceRef: toRef(props, 'device')
181
+ deviceRef: toRef(props, 'device'),
182
+ pageBlocksRef: pageBlocks,
183
+ wrapperRef
133
184
  })
134
185
  });
135
186
 
@@ -139,7 +190,7 @@ export default {
139
190
 
140
191
  const favoriteColors = new FavoriteColors({
141
192
  listRef: toRef(props, 'favoriteColors'),
142
- triggerUpdate: (colors) => emit('updateFavoriteColors', colors)
193
+ triggerUpdate: (colors) => emit('update-favorite-colors', colors)
143
194
  });
144
195
 
145
196
  provide(InjectionTokens.EDITOR, editor);
@@ -147,8 +198,16 @@ export default {
147
198
  provide(InjectionTokens.FONT_SIZES, fontSizes);
148
199
  provide(InjectionTokens.LOCAL_STORAGE, new Storage(localStorage));
149
200
  provide(InjectionTokens.FAVORITE_COLORS, favoriteColors);
150
-
151
- return { editor, toolbarRef, wysiwygRef, toolbar };
201
+ provide(InjectionTokens.PAGE_BLOCKS, pageBlocks);
202
+ provide(InjectionTokens.POPUP_MODE, props.popupMode);
203
+
204
+ return {
205
+ editor,
206
+ toolbarRef,
207
+ wysiwygRef,
208
+ toolbar,
209
+ updateToolbar
210
+ };
152
211
  }
153
212
  };
154
213
  </script>
@@ -1,4 +1,3 @@
1
1
  export { waitAsyncOperation } from './waitAsyncOperation';
2
- export { NodeFactory } from './NodeFactory';
3
2
  export { withComponentContext } from './withComponentContext';
4
3
  export { setReadonlyProperty } from './setReadonlyProperty';
@@ -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({
@@ -1,3 +1,5 @@
1
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="M22 20.62a2.42 2.42 0 0 1-4.84 0c0-1.25 2.42-4.54 2.42-4.54S22 19.37 22 20.62ZM9.92 15.425l1.452-3.951c.071-.182.145-.394.219-.636.074-.242.149-.503.226-.783a17.223 17.223 0 0 0 .454 1.402l1.452 3.968H9.919Zm5.411 4.199c.226-.795.658-1.684 1.184-2.562L12.955 8h-2.269L6 19.93h1.725a.736.736 0 0 0 .474-.157.792.792 0 0 0 .26-.347l.891-2.434h4.941l.891 2.434c.031.079.097.134.148.198Z" clip-rule="evenodd"/>
2
+ <path fill="#fff" stroke="#B3B3B3" d="M4.5 4.5h19v19h-19z"/>
3
+ <path fill="#3B3B3B" d="M26 20.7a2.51 2.51 0 0 1-5 0c0-1.31 2.5-4.7 2.5-4.7s2.5 3.39 2.5 4.7Z"/>
4
+ <path fill="#3B3B3B" fill-rule="evenodd" d="M19.64 19.93h-1.715a.75.75 0 0 1-.475-.145.82.82 0 0 1-.268-.359l-.89-2.433h-4.943l-.89 2.433a.78.78 0 0 1-.26.347.73.73 0 0 1-.475.157H8L12.686 8h2.269l4.686 11.93Zm-7.721-4.505h3.803l-1.452-3.968a18.048 18.048 0 0 1-.219-.623c-.08-.24-.158-.5-.235-.78-.077.28-.152.542-.227.784a8.742 8.742 0 0 1-.218.635l-1.452 3.952Z" clip-rule="evenodd"/>
3
5
  </svg>
@@ -1,5 +1,3 @@
1
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="#fff" stroke="#B3B3B3" d="M4.5 4.5h19v19h-19z"/>
3
- <path fill="#3B3B3B" d="M26 20.7a2.51 2.51 0 0 1-5 0c0-1.31 2.5-4.7 2.5-4.7s2.5 3.39 2.5 4.7Z"/>
4
- <path fill="#3B3B3B" fill-rule="evenodd" d="M19.64 19.93h-1.715a.75.75 0 0 1-.475-.145.82.82 0 0 1-.268-.359l-.89-2.433h-4.943l-.89 2.433a.78.78 0 0 1-.26.347.73.73 0 0 1-.475.157H8L12.686 8h2.269l4.686 11.93Zm-7.721-4.505h3.803l-1.452-3.968a18.048 18.048 0 0 1-.219-.623c-.08-.24-.158-.5-.235-.78-.077.28-.152.542-.227.784a8.742 8.742 0 0 1-.218.635l-1.452 3.952Z" clip-rule="evenodd"/>
2
+ <path fill="var(--zw-icon-foreground)" fill-rule="evenodd" d="M22 20.62a2.42 2.42 0 0 1-4.84 0c0-1.25 2.42-4.54 2.42-4.54S22 19.37 22 20.62ZM9.92 15.425l1.452-3.951c.071-.182.145-.394.219-.636.074-.242.149-.503.226-.783a17.223 17.223 0 0 0 .454 1.402l1.452 3.968H9.919Zm5.411 4.199c.226-.795.658-1.684 1.184-2.562L12.955 8h-2.269L6 19.93h1.725a.736.736 0 0 0 .474-.157.792.792 0 0 0 .26-.347l.891-2.434h4.941l.891 2.434c.031.079.097.134.148.198Z" clip-rule="evenodd"/>
5
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 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
 
@@ -66,6 +66,7 @@ export default {
66
66
  background-color: transparent;
67
67
  border: 0;
68
68
  padding: 0;
69
+ margin: 0;
69
70
  white-space: nowrap;
70
71
  appearance: none;
71
72
  user-select: none;
@@ -104,6 +105,26 @@ export default {
104
105
  will-change: background-color, color, opacity;
105
106
  }
106
107
 
108
+ .zw-button--primary {
109
+ background-color: rgb(var(--zw-color-green));
110
+ color: rgb(var(--zw-color-white));
111
+ padding: var(--zw-offset-xxs) var(--zw-offset-sm);
112
+ line-height: var(--zw-line-height-md);
113
+ }
114
+
115
+ .zw-button--primary,
116
+ .zw-button--secondary {
117
+ color: rgb(var(--zw-color-white));
118
+ padding: var(--zw-offset-xxs) var(--zw-offset-sm);
119
+ font-weight: 600;
120
+ font-size: var(--zw-font-size-xs);
121
+ }
122
+
123
+ .zw-button--primary:not(:disabled):hover,
124
+ .zw-button--secondary:not(:disabled):hover {
125
+ opacity: 0.9;
126
+ }
127
+
107
128
  .zw-button--toolbar:not(.zw-button--icon) {
108
129
  padding: var(--zw-offset-xxs) var(--zw-offset-xs);
109
130
  }
@@ -0,0 +1,89 @@
1
+ <template>
2
+ <label class="zw-checkbox">
3
+ <input class="zw-checkbox__field" type="checkbox" :checked="value" @click="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(props, { emit }) {
27
+ const onCheckedChanged = () => emit('input', !props.value);
28
+
29
+ return { onCheckedChanged };
30
+ }
31
+ };
32
+ </script>
33
+
34
+ <style scoped>
35
+ .zw-checkbox {
36
+ display: inline-flex;
37
+ align-items: center;
38
+ position: relative;
39
+ cursor: pointer;
40
+ padding: var(--zw-offset-xxs) var(--zw-offset-xxs) var(--zw-offset-xxs) 0;
41
+ }
42
+
43
+ .zw-checkbox__field + .zw-checkbox__indicator {
44
+ color: var(--zw-color-n200);
45
+ box-shadow: inset 0 0 0 2px currentColor;
46
+ }
47
+
48
+ .zw-checkbox:hover .zw-checkbox__indicator,
49
+ .zw-checkbox:focus .zw-checkbox__indicator,
50
+ .zw-checkbox:focus-within .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
  }