@zipify/wysiwyg 1.0.0-dev.1 → 1.0.0-dev.10
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.
- package/.env.example +1 -0
- package/.eslintignore +1 -0
- package/.release-it.json +9 -0
- package/.stylelintignore +1 -0
- package/README.md +131 -11
- package/config/jest/setupTests.js +7 -1
- package/config/webpack/example.config.js +2 -0
- package/config/webpack/lib.config.js +48 -0
- package/config/webpack/loaders/style-loader.js +3 -1
- package/config/webpack/loaders/svg-loader.js +1 -1
- package/dist/wysiwyg.css +837 -0
- package/dist/wysiwyg.js +38655 -0
- package/example/ExampleApp.vue +47 -32
- package/example/example.js +26 -0
- package/example/presets.js +2 -0
- package/lib/Wysiwyg.vue +17 -17
- package/lib/assets/icons/alignment-center.svg +3 -0
- package/lib/assets/icons/alignment-justify.svg +3 -0
- package/lib/assets/icons/alignment-left.svg +3 -0
- package/lib/assets/icons/alignment-right.svg +3 -0
- package/lib/assets/icons/arrow.svg +3 -0
- package/lib/assets/icons/background-color.svg +3 -0
- package/lib/assets/icons/case-style.svg +3 -0
- package/lib/assets/icons/font-color.svg +5 -0
- package/lib/assets/icons/italic.svg +3 -0
- package/lib/assets/icons/line-height.svg +3 -0
- package/lib/assets/icons/list-circle.svg +3 -0
- package/lib/assets/icons/list-decimal.svg +3 -0
- package/lib/assets/icons/list-disc.svg +3 -0
- package/lib/assets/icons/list-latin.svg +3 -0
- package/lib/assets/icons/list-roman.svg +3 -0
- package/lib/assets/icons/list-square.svg +3 -0
- package/lib/assets/icons/remove-format.svg +3 -0
- package/lib/assets/icons/reset-styles.svg +3 -0
- package/lib/assets/icons/strike-through.svg +3 -0
- package/lib/assets/icons/superscript.svg +3 -0
- package/lib/assets/icons/underline.svg +3 -0
- package/lib/components/base/Icon.vue +17 -9
- package/lib/components/base/__tests__/Icon.test.js +6 -13
- package/lib/components/toolbar/Toolbar.vue +1 -1
- package/lib/composables/__tests__/useEditor.test.js +12 -3
- package/lib/composables/useEditor.js +13 -7
- package/lib/composables/useToolbar.js +7 -18
- package/lib/extensions/Alignment.js +6 -0
- package/lib/extensions/BackgroundColor.js +8 -1
- package/lib/extensions/FontColor.js +8 -1
- package/lib/extensions/FontFamily.js +7 -0
- package/lib/extensions/FontSize.js +12 -0
- package/lib/extensions/FontStyle.js +11 -0
- package/lib/extensions/FontWeight.js +25 -1
- package/lib/extensions/LineHeight.js +17 -0
- package/lib/extensions/StylePreset.js +30 -3
- package/lib/extensions/TextDecoration.js +11 -0
- package/lib/extensions/__tests__/Alignment.test.js +22 -1
- package/lib/extensions/__tests__/BackgroundColor.test.js +30 -1
- package/lib/extensions/__tests__/CaseStyle.test.js +4 -1
- package/lib/extensions/__tests__/FontColor.test.js +30 -1
- package/lib/extensions/__tests__/FontFamily.test.js +30 -1
- package/lib/extensions/__tests__/FontSize.test.js +30 -1
- package/lib/extensions/__tests__/FontStyle.test.js +38 -1
- package/lib/extensions/__tests__/FontWeight.test.js +58 -1
- package/lib/extensions/__tests__/LineHeight.test.js +41 -1
- package/lib/extensions/__tests__/StylePreset.test.js +76 -1
- package/lib/extensions/__tests__/TextDecoration.test.js +63 -1
- package/lib/extensions/__tests__/__snapshots__/Alignment.test.js.snap +44 -0
- package/lib/extensions/__tests__/__snapshots__/BackgroundColor.test.js.snap +91 -0
- package/lib/extensions/__tests__/__snapshots__/FontColor.test.js.snap +91 -0
- package/lib/extensions/__tests__/__snapshots__/FontFamily.test.js.snap +91 -0
- package/lib/extensions/__tests__/__snapshots__/FontSize.test.js.snap +99 -0
- package/lib/extensions/__tests__/__snapshots__/FontStyle.test.js.snap +120 -0
- package/lib/extensions/__tests__/__snapshots__/FontWeight.test.js.snap +149 -0
- package/lib/extensions/__tests__/__snapshots__/LineHeight.test.js.snap +92 -0
- package/lib/extensions/__tests__/__snapshots__/StylePreset.test.js.snap +167 -2
- package/lib/extensions/__tests__/__snapshots__/TextDecoration.test.js.snap +207 -0
- package/lib/extensions/core/__tests__/NodeProcessor.test.js +4 -1
- package/lib/extensions/core/__tests__/SelectionProcessor.test.js +9 -4
- package/lib/extensions/core/__tests__/TextProcessor.test.js +4 -1
- package/lib/extensions/index.js +1 -0
- package/lib/extensions/list/List.js +34 -0
- package/lib/extensions/list/__tests__/List.test.js +115 -3
- package/lib/extensions/list/__tests__/__snapshots__/List.test.js.snap +457 -6
- package/lib/services/ContentNormalizer.js +113 -0
- package/lib/services/Storage.js +1 -13
- package/lib/services/__tests__/ContentNormalizer.test.js +41 -0
- package/lib/services/__tests__/FavoriteColors.test.js +20 -0
- package/lib/services/__tests__/JsonSerializer.test.js +23 -0
- package/lib/services/__tests__/Storage.test.js +79 -0
- package/lib/services/index.js +1 -0
- package/lib/utils/__tests__/convertColor.test.js +19 -0
- package/lib/utils/__tests__/createKeyboardShortcut.test.js +25 -0
- package/lib/utils/__tests__/renderInlineSetting.test.js +26 -0
- package/lib/utils/convertColor.js +7 -0
- package/lib/utils/importIcon.js +12 -0
- package/lib/utils/index.js +2 -0
- package/lib/utils/renderInlineSetting.js +1 -1
- package/package.json +10 -6
- package/lib/assets/icons.svg +0 -69
- package/lib/composables/__tests__/useToolbar.test.js +0 -56
package/.env.example
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
GITHUB_RELEASE_TOKEN=github_personal_access_token
|
package/.eslintignore
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
dist/**
|
package/.release-it.json
CHANGED
package/.stylelintignore
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
dist/**
|
package/README.md
CHANGED
|
@@ -10,20 +10,19 @@ npm install @zipify/wysiwyg @vue/composition-api
|
|
|
10
10
|
# if yarn
|
|
11
11
|
yarn add @zipify/wysiwyg @vue/composition-api
|
|
12
12
|
```
|
|
13
|
-
2.
|
|
14
|
-
```js
|
|
15
|
-
import Vue from 'vue';
|
|
16
|
-
import VueCompositionAPI from '@vue/composition-api';
|
|
13
|
+
2. Use editor
|
|
17
14
|
|
|
18
|
-
|
|
19
|
-
```
|
|
20
|
-
3. Use editor
|
|
21
|
-
|
|
22
|
-
For more details see [example app](/example)
|
|
15
|
+
For more details see [available options](#Options) and [example app](/example)
|
|
23
16
|
```vue
|
|
24
17
|
|
|
25
18
|
<template>
|
|
26
|
-
<Wysiwyg
|
|
19
|
+
<Wysiwyg
|
|
20
|
+
v-model="content"
|
|
21
|
+
:fonts="fonts"
|
|
22
|
+
:presets="presets"
|
|
23
|
+
:make-preset-variable="$options.makePresetVariable"
|
|
24
|
+
default-preset-id="regular-1"
|
|
25
|
+
/>
|
|
27
26
|
</template>
|
|
28
27
|
|
|
29
28
|
<script>
|
|
@@ -32,16 +31,137 @@ import { Wysiwyg } from '@zipify/wysiwyg';
|
|
|
32
31
|
export default {
|
|
33
32
|
components: { Wysiwyg },
|
|
34
33
|
|
|
34
|
+
makePresetVariable: ({ preset, device, property }) => {
|
|
35
|
+
return `--${preset.id}-${device}-${property}`;
|
|
36
|
+
},
|
|
37
|
+
|
|
35
38
|
data: () => ({
|
|
36
39
|
content: {
|
|
37
40
|
type: 'doc',
|
|
38
41
|
content: [...]
|
|
39
|
-
}
|
|
42
|
+
},
|
|
43
|
+
presets: [...],
|
|
44
|
+
fonts: [...]
|
|
40
45
|
})
|
|
41
46
|
}
|
|
42
47
|
</script>
|
|
43
48
|
```
|
|
44
49
|
|
|
50
|
+
## Options
|
|
51
|
+
|
|
52
|
+
### Props
|
|
53
|
+
|
|
54
|
+
| Name | Required? | Default Value | Note |
|
|
55
|
+
|:--------------------:|:---------:|:-------------:|----------------------------------------------------------------|
|
|
56
|
+
| value | true | - | |
|
|
57
|
+
| presets | true | - | Array of [Style-Presets](#Style-Preset) |
|
|
58
|
+
| default-preset-id | true | - | Id of any preset |
|
|
59
|
+
| base-preset-class | true | - | Base class of preset |
|
|
60
|
+
| make-preset-variable | true | - | [Generates](#Generate-Preset-Variable) name of preset variable |
|
|
61
|
+
| fonts | true | - | Array of [fonts](#Font) |
|
|
62
|
+
| device | false | `'desktop'` | Active device type. can be 'mobile', 'tablet' or 'desktop' |
|
|
63
|
+
| favorite-colors | false | [] | List of favorite colors in color picker |
|
|
64
|
+
| toolbar-offsets | false | `[0, 8]` | Offset between toolbar and content |
|
|
65
|
+
| base-list-class | false | `'zw-list--'` | Base list class |
|
|
66
|
+
|
|
67
|
+
### Style Preset
|
|
68
|
+
Represents available font family. Required interface
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
interface StylePreset {
|
|
72
|
+
id: string | number;
|
|
73
|
+
name: string;
|
|
74
|
+
hidden: boolean;
|
|
75
|
+
node?: PresetNode;
|
|
76
|
+
fallbackClass?: string;
|
|
77
|
+
common: CommonSettings;
|
|
78
|
+
desktop: DeviceSettings;
|
|
79
|
+
tablet: DeviceSettings;
|
|
80
|
+
mobile: DeviceSettings;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
interface PresetNode {
|
|
84
|
+
type: 'heading';
|
|
85
|
+
level: 1 | 2 | 3 | 4;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
interface CommonSettings {
|
|
89
|
+
font_family: string;
|
|
90
|
+
font_weight: string;
|
|
91
|
+
color: string;
|
|
92
|
+
font_style: 'italic' | 'normal';
|
|
93
|
+
text_decoration: 'none' | 'underline';
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
interface DeviceSettings {
|
|
97
|
+
alignment: 'left' | 'center' | 'right' | 'justify';
|
|
98
|
+
line_height: string;
|
|
99
|
+
font_size: string;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const example: StylePreset = {
|
|
103
|
+
id: 'h1',
|
|
104
|
+
name: 'H1',
|
|
105
|
+
node: {
|
|
106
|
+
type: 'heading',
|
|
107
|
+
level: 1
|
|
108
|
+
},
|
|
109
|
+
desktop: {
|
|
110
|
+
alignment: 'left',
|
|
111
|
+
line_height: '1.2',
|
|
112
|
+
font_size: '40px'
|
|
113
|
+
},
|
|
114
|
+
common: {
|
|
115
|
+
font_family: 'Lato',
|
|
116
|
+
font_weight: '700',
|
|
117
|
+
color: '#262626',
|
|
118
|
+
font_style: 'normal',
|
|
119
|
+
text_decoration: 'none'
|
|
120
|
+
},
|
|
121
|
+
tablet: {
|
|
122
|
+
alignment: 'left',
|
|
123
|
+
line_height: '1.2',
|
|
124
|
+
font_size: '40px'
|
|
125
|
+
},
|
|
126
|
+
mobile: {
|
|
127
|
+
alignment: 'left',
|
|
128
|
+
line_height: '1.2',
|
|
129
|
+
font_size: '28px'
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Generate Preset Variable
|
|
135
|
+
Variable name generator uses follow iterface
|
|
136
|
+
```typescript
|
|
137
|
+
const Device = 'common' | 'mobile' | 'tablet' | 'desktop'
|
|
138
|
+
|
|
139
|
+
interface VariableGeneratorOptions {
|
|
140
|
+
preset: StylePreset;
|
|
141
|
+
device: Device;
|
|
142
|
+
property: string;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
type GeneratePresetVariable = (options: VariableGeneratorOptions) => string;
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Font
|
|
149
|
+
Represents available font family. Required interface
|
|
150
|
+
```typescript
|
|
151
|
+
interface Font {
|
|
152
|
+
name: string;
|
|
153
|
+
category: string;
|
|
154
|
+
styles: string[];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const exmaple: Font = {
|
|
158
|
+
name: 'Roboto',
|
|
159
|
+
styles: ['300', '300i', '400', '400i', '700', '700i'],
|
|
160
|
+
category: 'Regular'
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
|
|
45
165
|
## Contribute
|
|
46
166
|
1. Clone repository
|
|
47
167
|
```shell
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
|
|
1
3
|
import Vue from 'vue';
|
|
2
4
|
import CompositionAPI from '@vue/composition-api';
|
|
3
5
|
|
|
4
|
-
// eslint-disable-next-line no-console
|
|
5
6
|
console.warn = jest.fn();
|
|
7
|
+
console.error = jest.fn();
|
|
6
8
|
|
|
7
9
|
Vue.use(CompositionAPI);
|
|
8
10
|
|
|
@@ -30,3 +32,7 @@ Range.prototype.getClientRects = () => ({
|
|
|
30
32
|
length: 0,
|
|
31
33
|
[Symbol.iterator]: jest.fn()
|
|
32
34
|
});
|
|
35
|
+
|
|
36
|
+
jest.mock('../../lib/utils/importIcon', () => ({
|
|
37
|
+
importIcon: () => ''
|
|
38
|
+
}));
|
|
@@ -2,6 +2,7 @@ const path = require('path');
|
|
|
2
2
|
const { DefinePlugin } = require('webpack');
|
|
3
3
|
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
|
4
4
|
const { VueLoaderPlugin } = require('vue-loader');
|
|
5
|
+
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
|
5
6
|
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
|
|
6
7
|
const { resolvePath, isDevelopment } = require('./settings');
|
|
7
8
|
const loaders = require('./loaders');
|
|
@@ -74,6 +75,7 @@ module.exports = {
|
|
|
74
75
|
|
|
75
76
|
plugins: [
|
|
76
77
|
new VueLoaderPlugin(),
|
|
78
|
+
new MiniCssExtractPlugin(),
|
|
77
79
|
new HtmlWebpackPlugin({
|
|
78
80
|
title: 'ZipifyWysiwyg',
|
|
79
81
|
template: resolvePath('./example/example.html')
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
const { VueLoaderPlugin } = require('vue-loader');
|
|
2
|
+
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
|
3
|
+
const { resolvePath } = require('./settings');
|
|
4
|
+
const loaders = require('./loaders');
|
|
5
|
+
|
|
6
|
+
module.exports = {
|
|
7
|
+
mode: 'production',
|
|
8
|
+
entry: resolvePath('./lib/index.js'),
|
|
9
|
+
|
|
10
|
+
output: {
|
|
11
|
+
clean: true,
|
|
12
|
+
path: resolvePath('./dist'),
|
|
13
|
+
filename: 'wysiwyg.js',
|
|
14
|
+
library: { type: 'module' },
|
|
15
|
+
module: true
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
resolve: {
|
|
19
|
+
extensions: ['*', '.js', '.vue', '.json']
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
module: {
|
|
23
|
+
rules: [
|
|
24
|
+
loaders.style,
|
|
25
|
+
loaders.js,
|
|
26
|
+
loaders.svg,
|
|
27
|
+
loaders.vue
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
externals: {
|
|
32
|
+
'@vue/composition-api': { module: '@vue/composition-api' },
|
|
33
|
+
'zipify-colorpicker': { module: 'zipify-colorpicker' }
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
experiments: {
|
|
37
|
+
outputModule: true
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
optimization: {
|
|
41
|
+
minimize: false
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
plugins: [
|
|
45
|
+
new VueLoaderPlugin(),
|
|
46
|
+
new MiniCssExtractPlugin({ filename: 'wysiwyg.css' })
|
|
47
|
+
]
|
|
48
|
+
};
|