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

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 (216) 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 +18339 -0
  14. package/example/ExampleApp.vue +21 -2
  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 +51 -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 +3 -3
  127. package/lib/composables/useEditor.js +6 -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/TextDecoration.js +46 -13
  148. package/lib/extensions/__tests__/Alignment.test.js +13 -7
  149. package/lib/extensions/__tests__/BackgroundColor.test.js +12 -6
  150. package/lib/extensions/__tests__/CaseStyle.test.js +3 -5
  151. package/lib/extensions/__tests__/FontColor.test.js +12 -6
  152. package/lib/extensions/__tests__/FontFamily.test.js +33 -8
  153. package/lib/extensions/__tests__/FontSize.test.js +15 -8
  154. package/lib/extensions/__tests__/FontStyle.test.js +12 -6
  155. package/lib/extensions/__tests__/FontWeight.test.js +20 -6
  156. package/lib/extensions/__tests__/LineHeight.test.js +24 -12
  157. package/lib/extensions/__tests__/Link.test.js +102 -0
  158. package/lib/extensions/__tests__/StylePreset.test.js +71 -8
  159. package/lib/extensions/__tests__/TextDecoration.test.js +52 -6
  160. package/lib/extensions/__tests__/__snapshots__/Alignment.test.js.snap +26 -2
  161. package/lib/extensions/__tests__/__snapshots__/BackgroundColor.test.js.snap +30 -1
  162. package/lib/extensions/__tests__/__snapshots__/FontColor.test.js.snap +18 -1
  163. package/lib/extensions/__tests__/__snapshots__/FontFamily.test.js.snap +88 -1
  164. package/lib/extensions/__tests__/__snapshots__/FontSize.test.js.snap +33 -2
  165. package/lib/extensions/__tests__/__snapshots__/FontStyle.test.js.snap +25 -4
  166. package/lib/extensions/__tests__/__snapshots__/FontWeight.test.js.snap +47 -1
  167. package/lib/extensions/__tests__/__snapshots__/LineHeight.test.js.snap +26 -2
  168. package/lib/extensions/__tests__/__snapshots__/Link.test.js.snap +225 -0
  169. package/lib/extensions/__tests__/__snapshots__/StylePreset.test.js.snap +6 -2
  170. package/lib/extensions/__tests__/__snapshots__/TextDecoration.test.js.snap +183 -3
  171. package/lib/extensions/core/CopyPasteProcessor.js +10 -0
  172. package/lib/extensions/core/NodeProcessor.js +1 -1
  173. package/lib/extensions/core/TextProcessor.js +10 -0
  174. package/lib/extensions/core/__tests__/NodeProcessor.test.js +3 -5
  175. package/lib/extensions/core/__tests__/SelectionProcessor.test.js +3 -5
  176. package/lib/extensions/core/__tests__/TextProcessor.test.js +138 -12
  177. package/lib/extensions/core/__tests__/__snapshots__/TextProcessor.test.js.snap +26 -0
  178. package/lib/extensions/core/index.js +11 -2
  179. package/lib/extensions/core/plugins/PastePlugin.js +57 -0
  180. package/lib/extensions/core/plugins/ProseMirrorPlugin.js +20 -0
  181. package/lib/extensions/core/plugins/index.js +1 -0
  182. package/lib/extensions/index.js +46 -34
  183. package/lib/extensions/list/List.js +2 -3
  184. package/lib/extensions/list/__tests__/List.test.js +5 -8
  185. package/lib/extensions/list/__tests__/__snapshots__/List.test.js.snap +60 -20
  186. package/lib/injectionTokens.js +2 -1
  187. package/lib/services/ContentNormalizer.js +122 -29
  188. package/lib/services/ContextWidnow.js +23 -0
  189. package/lib/services/__tests__/ContentNormalizer.test.js +96 -7
  190. package/lib/services/__tests__/FavoriteColors.test.js +1 -1
  191. package/lib/services/index.js +1 -0
  192. package/lib/styles/content.css +102 -13
  193. package/lib/styles/helpers/offsets.css +16 -0
  194. package/lib/styles/variables.css +6 -0
  195. package/lib/utils/__tests__/__snapshots__/renderInlineSetting.test.js.snap +4 -4
  196. package/lib/utils/__tests__/convertAlignment.test.js +16 -0
  197. package/lib/utils/__tests__/convertFontSize.test.js +21 -0
  198. package/lib/utils/__tests__/convertLineHeight.test.js +21 -0
  199. package/lib/utils/convertAlignment.js +12 -0
  200. package/lib/utils/convertColor.js +1 -1
  201. package/lib/utils/convertFontSize.js +8 -0
  202. package/lib/utils/convertLineHeight.js +17 -0
  203. package/lib/utils/importIcon.js +7 -6
  204. package/lib/utils/index.js +3 -0
  205. package/lib/utils/renderInlineSetting.js +1 -1
  206. package/package.json +26 -31
  207. package/config/webpack/example.config.js +0 -88
  208. package/config/webpack/lib.config.js +0 -40
  209. package/config/webpack/loaders/index.js +0 -6
  210. package/config/webpack/loaders/js-loader.js +0 -5
  211. package/config/webpack/loaders/style-loader.js +0 -9
  212. package/config/webpack/loaders/svg-loader.js +0 -4
  213. package/config/webpack/loaders/vue-loader.js +0 -4
  214. package/dist/wysiwyg.js +0 -2
  215. package/dist/wysiwyg.js.LICENSE.txt +0 -1
  216. package/lib/composables/__tests__/useToolbar.test.js +0 -56
@@ -29,6 +29,8 @@
29
29
  :make-preset-variable="$options.makePresetVariable"
30
30
  :favorite-colors="favoriteColors"
31
31
  :device="device"
32
+ :page-blocks="pageBlocks"
33
+ :active="isActive"
32
34
  @updateFavoriteColors="updateFavoriteColors"
33
35
  />
34
36
  <pre class="zw-content-structure" v-html="structurePreview" />
@@ -36,10 +38,11 @@
36
38
  </template>
37
39
 
38
40
  <script>
39
- import { computed, onMounted, ref } from '@vue/composition-api';
41
+ import { computed, onMounted, ref } from 'vue';
40
42
  import { Wysiwyg } from '../lib';
41
43
  import { FONTS } from './fonts';
42
44
  import { PRESETS, renderPresetVariable } from './presets';
45
+ import { PAGE_BLOCKS } from './pageBlocks';
43
46
 
44
47
  function getInitialContent() {
45
48
  const data = sessionStorage.getItem('wswg-data');
@@ -64,8 +67,10 @@ export default {
64
67
  const wswgRef = ref(null);
65
68
  const content = ref(getInitialContent());
66
69
  const presets = ref(PRESETS);
70
+ const pageBlocks = ref(PAGE_BLOCKS);
67
71
  const device = ref('desktop');
68
72
  const updatedAt = new Date(ZW_UPDATED_AT).toLocaleString('ua-UA');
73
+ const isActive = ref(false);
69
74
 
70
75
  const structurePreview = computed(() => {
71
76
  const json = JSON.stringify(content.value, null, ' ');
@@ -94,6 +99,10 @@ export default {
94
99
  }
95
100
  }
96
101
 
102
+ document.addEventListener('click', (event) => {
103
+ isActive.value = wswgRef.value.$el.contains(event.target);
104
+ });
105
+
97
106
  return {
98
107
  wswgRef,
99
108
  content,
@@ -104,13 +113,18 @@ export default {
104
113
  loadContent,
105
114
  device,
106
115
  updatedAt,
107
- presets
116
+ presets,
117
+ isActive,
118
+ pageBlocks
108
119
  };
109
120
  }
110
121
  };
111
122
  </script>
112
123
 
113
124
  <style>
125
+ @import url("@zipify/colorpicker/dist/colorpicker.css");
126
+ @import url("simplebar/dist/simplebar.css");
127
+
114
128
  body {
115
129
  padding: 50px 20px;
116
130
  max-width: 1200px;
@@ -141,4 +155,9 @@ body {
141
155
  .zpa-text__list--square { list-style-type: square }
142
156
  .zpa-text__list--latin { list-style-type: upper-roman }
143
157
  .zpa-text__list--roman { list-style-type: upper-latin }
158
+
159
+ p, h1, h2, h3, h4 {
160
+ margin-top: 0.3em;
161
+ margin-bottom: 0.3em;
162
+ }
144
163
  </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';
@@ -72,6 +68,11 @@ export default {
72
68
  required: true
73
69
  },
74
70
 
71
+ active: {
72
+ type: Boolean,
73
+ required: true
74
+ },
75
+
75
76
  device: {
76
77
  type: String,
77
78
  required: false,
@@ -94,32 +95,53 @@ export default {
94
95
  type: String,
95
96
  required: false,
96
97
  default: 'zw-list--'
98
+ },
99
+
100
+ pageBlocks: {
101
+ type: Array,
102
+ required: true
103
+ },
104
+
105
+ // Requires Window type but it different in iframe and outside
106
+ // eslint-disable-next-line vue/require-prop-types
107
+ window: {
108
+ required: false,
109
+ default: () => window
97
110
  }
98
111
  },
99
112
 
113
+ emits: [
114
+ 'input',
115
+ 'update-favorite-colors'
116
+ ],
117
+
100
118
  setup(props, { emit }) {
101
- const fonts = props.fonts.map((font) => new Font(font));
119
+ ContextWindow.use(props.window);
102
120
 
121
+ const fonts = props.fonts.map((font) => new Font(font));
103
122
  const toolbarRef = ref(null);
104
123
  const wysiwygRef = ref(null);
124
+ const wrapperRef = computed(() => wysiwygRef.value?.$el || document.body);
105
125
 
106
126
  const toolbar = useToolbar({
107
127
  wrapperRef: wysiwygRef,
108
- popperRef: toolbarRef,
109
- offsets: toRef(props, 'toolbarOffsets').value
128
+ isActiveRef: toRef(props, 'active'),
129
+ offsets: props.toolbarOffsets
110
130
  });
131
+ const updateToolbar = () => toolbar.update();
111
132
 
112
133
  function onChange(content) {
113
134
  emit('input', content);
114
- toolbar.update();
135
+ updateToolbar();
115
136
  }
116
137
 
138
+ const pageBlocks = toRef(props, 'pageBlocks');
139
+
117
140
  const editor = useEditor({
118
141
  content: toRef(props, 'value'),
119
142
  onChange: (content) => onChange(content),
120
- onFocus: () => toolbar.show(),
121
143
 
122
- extensions: getExtensions({
144
+ extensions: buildExtensions({
123
145
  fonts,
124
146
  minFontSize: MIN_FONT_SIZE,
125
147
  maxFontSize: MAX_FONT_SIZE,
@@ -128,23 +150,19 @@ export default {
128
150
  makePresetVariable: props.makePresetVariable,
129
151
  basePresetClass: props.basePresetClass,
130
152
  baseListClass: props.baseListClass,
131
- deviceRef: toRef(props, 'device')
153
+ deviceRef: toRef(props, 'device'),
154
+ pageBlocksRef: pageBlocks,
155
+ wrapperRef
132
156
  })
133
157
  });
134
158
 
135
- function hideToolbar() {
136
- if (editor.isFocused) return;
137
-
138
- toolbar.hide();
139
- }
140
-
141
159
  const fontSizes = new Array(MAX_FONT_SIZE - MIN_FONT_SIZE + 1)
142
160
  .fill(0)
143
161
  .map((_, index) => String(index + MIN_FONT_SIZE));
144
162
 
145
163
  const favoriteColors = new FavoriteColors({
146
164
  listRef: toRef(props, 'favoriteColors'),
147
- triggerUpdate: (colors) => emit('updateFavoriteColors', colors)
165
+ triggerUpdate: (colors) => emit('update-favorite-colors', colors)
148
166
  });
149
167
 
150
168
  provide(InjectionTokens.EDITOR, editor);
@@ -152,8 +170,15 @@ export default {
152
170
  provide(InjectionTokens.FONT_SIZES, fontSizes);
153
171
  provide(InjectionTokens.LOCAL_STORAGE, new Storage(localStorage));
154
172
  provide(InjectionTokens.FAVORITE_COLORS, favoriteColors);
155
-
156
- return { editor, toolbarRef, wysiwygRef, toolbar, hideToolbar };
173
+ provide(InjectionTokens.PAGE_BLOCKS, pageBlocks);
174
+
175
+ return {
176
+ editor,
177
+ toolbarRef,
178
+ wysiwygRef,
179
+ toolbar,
180
+ updateToolbar
181
+ };
157
182
  }
158
183
  };
159
184
  </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
  }