@ebl-vue/editor-render 2.31.25

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 (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/dist/index.d.ts +19 -0
  4. package/dist/index.mjs +129 -0
  5. package/dist/index.mjs.map +1 -0
  6. package/dist/style.css +1 -0
  7. package/dist/styles/alert.css +151 -0
  8. package/dist/styles/block-alignment.css +9 -0
  9. package/dist/styles/code.css +214 -0
  10. package/dist/styles/color.css +27 -0
  11. package/dist/styles/delimiter.css +14 -0
  12. package/dist/styles/header.css +20 -0
  13. package/dist/styles/image.css +156 -0
  14. package/dist/styles/indent.css +86 -0
  15. package/dist/styles/index.css +68 -0
  16. package/dist/styles/inline-code.css +11 -0
  17. package/dist/styles/list.css +202 -0
  18. package/dist/styles/marker.css +4 -0
  19. package/dist/styles/outline.css +52 -0
  20. package/dist/styles/paragraph.css +23 -0
  21. package/dist/styles/quote.css +26 -0
  22. package/dist/styles/table.css +388 -0
  23. package/dist/styles/underline.css +3 -0
  24. package/package.json +54 -0
  25. package/src/EditorRender.vue +43 -0
  26. package/src/components/List.vue +40 -0
  27. package/src/components/alert.vue +21 -0
  28. package/src/components/code.vue +114 -0
  29. package/src/components/delimiter.vue +19 -0
  30. package/src/components/h1.vue +19 -0
  31. package/src/components/h2.vue +19 -0
  32. package/src/components/h3.vue +19 -0
  33. package/src/components/h4.vue +19 -0
  34. package/src/components/h5.vue +19 -0
  35. package/src/components/h6.vue +19 -0
  36. package/src/components/image.vue +31 -0
  37. package/src/components/index.ts +54 -0
  38. package/src/components/paragraph.vue +19 -0
  39. package/src/components/quote.vue +21 -0
  40. package/src/components/table.vue +46 -0
  41. package/src/constants/index.ts +1 -0
  42. package/src/i18n/zh-cn.ts +158 -0
  43. package/src/icons/index.ts +93 -0
  44. package/src/index.ts +12 -0
  45. package/src/installer.ts +21 -0
  46. package/src/styles/alert.css +151 -0
  47. package/src/styles/block-alignment.css +9 -0
  48. package/src/styles/code.css +214 -0
  49. package/src/styles/color.css +27 -0
  50. package/src/styles/delimiter.css +14 -0
  51. package/src/styles/header.css +20 -0
  52. package/src/styles/image.css +156 -0
  53. package/src/styles/indent.css +86 -0
  54. package/src/styles/index.css +68 -0
  55. package/src/styles/inline-code.css +11 -0
  56. package/src/styles/list.css +202 -0
  57. package/src/styles/marker.css +4 -0
  58. package/src/styles/outline.css +52 -0
  59. package/src/styles/paragraph.css +23 -0
  60. package/src/styles/quote.css +26 -0
  61. package/src/styles/table.css +388 -0
  62. package/src/styles/underline.css +3 -0
  63. package/src/types.ts +5 -0
  64. package/src/utils/index.ts +15 -0
  65. package/src/utils/install.ts +19 -0
  66. package/tsconfig.json +37 -0
  67. package/types/index.d.ts +19 -0
  68. package/vite.config.ts +80 -0
@@ -0,0 +1,388 @@
1
+ .tc-wrap {
2
+ --color-background: #f9f9fb;
3
+ --color-text-secondary: #7b7e89;
4
+ --color-border: #e8e8eb;
5
+ --cell-size: 34px;
6
+ --toolbox-icon-size: 18px;
7
+ --toolbox-padding: 6px;
8
+ --toolbox-aiming-field-size: calc(var(--toolbox-icon-size) + var(--toolbox-padding)*2);
9
+ --col-width: 100px 100px 100px;
10
+ position: relative;
11
+ height: 100%;
12
+ /* width: 100%; */
13
+ margin-top: var(--toolbox-icon-size);
14
+ box-sizing: border-box;
15
+ display: inline-grid;
16
+
17
+ z-index: 0
18
+ }
19
+
20
+ .tc-wrap--readonly {
21
+
22
+ }
23
+
24
+ .tc-wrap svg {
25
+ vertical-align: top
26
+ }
27
+
28
+ @media print {
29
+ .tc-wrap {
30
+ border-left-color: var(--color-border);
31
+ border-left-style: solid;
32
+ border-left-width: 1px;
33
+
34
+ }
35
+ }
36
+
37
+ @media print {
38
+ .tc-wrap .tc-row:after {
39
+ display: none
40
+ }
41
+ }
42
+
43
+ .tc-table {
44
+ position: relative;
45
+ width: 100%;
46
+ height: 100%;
47
+ display: grid;
48
+ font-size: 14px;
49
+ border-top: 1px solid var(--color-border);
50
+ border-left: 1px solid var(--color-border);
51
+ line-height: 1.4;
52
+ overflow-x: auto;
53
+ }
54
+
55
+ .tc-table:after {
56
+ width: calc(var(--cell-size));
57
+ height: 100%;
58
+ left: calc(var(--cell-size)*-1);
59
+ top: 0
60
+ }
61
+
62
+ .tc-table:after,
63
+ .tc-table:before {
64
+ position: absolute;
65
+ content: ""
66
+ }
67
+
68
+ .tc-table:before {
69
+ width: 100%;
70
+ height: var(--toolbox-aiming-field-size);
71
+ top: calc(var(--toolbox-aiming-field-size)*-1);
72
+ left: 0
73
+ }
74
+
75
+ .tc-table--heading .tc-row:first-child {
76
+ font-weight: 600;
77
+ border-bottom: 2px solid var(--color-border);
78
+ position: sticky;
79
+ top: 0;
80
+ z-index: 2;
81
+ background: var(--color-background)
82
+ }
83
+
84
+ .tc-table--heading .tc-row:first-child [contenteditable]:empty:before {
85
+ content: attr(heading);
86
+ color: var(--color-text-secondary)
87
+ }
88
+
89
+ .tc-table--heading .tc-row:first-child:after {
90
+ bottom: -2px;
91
+ border-bottom: 2px solid var(--color-border)
92
+ }
93
+
94
+ .tc-add-column,
95
+ .tc-add-row {
96
+ display: flex;
97
+ color: var(--color-text-secondary)
98
+ }
99
+
100
+ @media print {
101
+ .tc-add {
102
+ display: none
103
+ }
104
+ }
105
+
106
+ .tc-add-column {
107
+ display: grid;
108
+ border-top: 1px solid var(--color-border);
109
+
110
+ grid-auto-rows: var(--cell-size);
111
+ place-items: center
112
+ }
113
+
114
+ .tc-add-column svg {
115
+ padding: 5px;
116
+ position: sticky;
117
+ top: 0;
118
+ background-color: var(--color-background)
119
+ }
120
+
121
+ .tc-add-column--disabled {
122
+ visibility: hidden
123
+ }
124
+
125
+ @media print {
126
+ .tc-add-column {
127
+ display: none
128
+ }
129
+ }
130
+
131
+ .tc-add-row {
132
+ height: var(--cell-size);
133
+ align-items: center;
134
+ padding-left: 4px;
135
+ position: relative
136
+ }
137
+
138
+ .tc-add-row--disabled {
139
+ display: none
140
+ }
141
+
142
+ .tc-add-row:before {
143
+ content: "";
144
+ position: absolute;
145
+ right: calc(var(--cell-size)*-1);
146
+ width: var(--cell-size);
147
+ height: 100%
148
+ }
149
+
150
+ @media print {
151
+ .tc-add-row {
152
+ display: none
153
+ }
154
+ }
155
+
156
+ .tc-add-column,
157
+ .tc-add-row {
158
+ transition: 0s;
159
+ cursor: pointer;
160
+ will-change: background-color
161
+ }
162
+
163
+ .tc-add-column:hover,
164
+ .tc-add-row:hover {
165
+ transition: background-color .1s ease;
166
+ background-color: var(--color-background)
167
+ }
168
+
169
+ .tc-add-row {
170
+ margin-top: 1px
171
+ }
172
+
173
+ .tc-add-row:hover:before {
174
+ transition: .1s;
175
+ background-color: var(--color-background)
176
+ }
177
+
178
+ .tc-row {
179
+ display: grid;
180
+ /* grid-template-columns: repeat(auto-fit, minmax(50px, 1fr)); */
181
+ /* grid-template-columns: 100px 100px 100px; */
182
+ grid-template-columns:var(--col-width);
183
+ position: relative;
184
+ border-bottom: 1px solid var(--color-border)
185
+ }
186
+
187
+ /* .tc-row:after {
188
+ content: "";
189
+ pointer-events: none;
190
+ position: absolute;
191
+ width: var(--cell-size);
192
+ height: 100%;
193
+ bottom: -1px;
194
+ right: calc(var(--cell-size)*-1);
195
+ border-bottom: 1px solid var(--color-border)
196
+ } */
197
+
198
+ .tc-row--selected {
199
+ background: var(--color-background)
200
+ }
201
+
202
+ .tc-row--selected:after {
203
+ background: var(--color-background)
204
+ }
205
+
206
+ .tc-cell {
207
+ border-right: 1px solid var(--color-border);
208
+ padding: 6px 12px;
209
+ overflow: hidden;
210
+ outline: none;
211
+ line-break: normal
212
+ }
213
+
214
+ .tc-cell--selected {
215
+ background: var(--color-background)
216
+ }
217
+
218
+ .tc-wrap--readonly .tc-row:after {
219
+ display: none
220
+ }
221
+
222
+ .tc-toolbox {
223
+ --toolbox-padding: 6px;
224
+ --popover-margin: 30px;
225
+ --toggler-click-zone-size: 30px;
226
+ --toggler-dots-color: #7b7e89;
227
+ --toggler-dots-color-hovered: #1d202b;
228
+ position: absolute;
229
+ cursor: pointer;
230
+ z-index: 1;
231
+ opacity: 0;
232
+ transition: opacity .1s;
233
+ will-change: left, opacity
234
+ }
235
+
236
+ .tc-toolbox--column {
237
+ top: calc(var(--toggler-click-zone-size)*-1);
238
+ transform: translate(calc(var(--toggler-click-zone-size)*-1/2));
239
+ will-change: left, opacity
240
+ }
241
+
242
+ .tc-toolbox--row {
243
+ left: calc(var(--popover-margin)*-1);
244
+ transform: translateY(calc(var(--toggler-click-zone-size)*-1/2));
245
+ margin-top: -1px;
246
+ will-change: top, opacity
247
+ }
248
+
249
+ .tc-toolbox--showed {
250
+ opacity: 1
251
+ }
252
+
253
+ .tc-toolbox .tc-popover {
254
+ position: absolute;
255
+ top: 0;
256
+ left: var(--popover-margin)
257
+ }
258
+
259
+ .tc-toolbox__toggler {
260
+ display: flex;
261
+ align-items: center;
262
+ justify-content: center;
263
+ width: var(--toggler-click-zone-size);
264
+ height: var(--toggler-click-zone-size);
265
+ color: var(--toggler-dots-color);
266
+ opacity: 0;
267
+ transition: opacity .15s ease;
268
+ will-change: opacity
269
+ }
270
+
271
+ .tc-toolbox__toggler:hover {
272
+ color: var(--toggler-dots-color-hovered)
273
+ }
274
+
275
+ .tc-toolbox__toggler svg {
276
+ fill: currentColor
277
+ }
278
+
279
+ .tc-wrap:hover .tc-toolbox__toggler {
280
+ opacity: 1
281
+ }
282
+
283
+ .tc-settings .cdx-settings-button {
284
+ width: 50%;
285
+ margin: 0
286
+ }
287
+
288
+ .tc-popover {
289
+ --color-border: #eaeaea;
290
+ --color-background: #fff;
291
+ --color-background-hover: rgba(232, 232, 235, .49);
292
+ --color-background-confirm: #e24a4a;
293
+ --color-background-confirm-hover: #d54040;
294
+ --color-text-confirm: #fff;
295
+ background: var(--color-background);
296
+ border: 1px solid var(--color-border);
297
+ box-shadow: 0 3px 15px -3px #0d142121;
298
+ border-radius: 6px;
299
+ padding: 6px;
300
+ display: none;
301
+ will-change: opacity, transform
302
+ }
303
+
304
+ .tc-popover--opened {
305
+ display: flex;
306
+ animation: menuShowing .1s cubic-bezier(.215, .61, .355, 1) forwards
307
+ }
308
+
309
+ .tc-popover__item {
310
+ display: flex;
311
+ align-items: center;
312
+ padding: 2px 14px 2px 2px;
313
+ border-radius: 5px;
314
+ cursor: pointer;
315
+ white-space: nowrap;
316
+ -webkit-user-select: none;
317
+ -moz-user-select: none;
318
+ user-select: none
319
+ }
320
+
321
+ .tc-popover__item:hover {
322
+ background: var(--color-background-hover)
323
+ }
324
+
325
+ .tc-popover__item:not(:last-of-type) {
326
+ margin-bottom: 2px
327
+ }
328
+
329
+ .tc-popover__item-icon {
330
+ display: inline-flex;
331
+ width: 26px;
332
+ height: 26px;
333
+ align-items: center;
334
+ justify-content: center;
335
+ background: var(--color-background);
336
+ border-radius: 5px;
337
+ border: 1px solid var(--color-border);
338
+ margin-right: 8px
339
+ }
340
+
341
+ .tc-popover__item-label {
342
+ line-height: 22px;
343
+ font-size: 14px;
344
+ font-weight: 500
345
+ }
346
+
347
+ .tc-popover__item--confirm {
348
+ background: var(--color-background-confirm);
349
+ color: var(--color-text-confirm)
350
+ }
351
+
352
+ .tc-popover__item--confirm:hover {
353
+ background-color: var(--color-background-confirm-hover)
354
+ }
355
+
356
+ .tc-popover__item--confirm .tc-popover__item-icon {
357
+ background: var(--color-background-confirm);
358
+ border-color: #0000001a
359
+ }
360
+
361
+ .tc-popover__item--confirm .tc-popover__item-icon svg {
362
+ transition: transform .2s ease-in;
363
+ transform: rotate(90deg) scale(1.2)
364
+ }
365
+
366
+ .tc-popover__item--hidden {
367
+ display: none
368
+ }
369
+
370
+ @keyframes menuShowing {
371
+ 0% {
372
+ opacity: 0;
373
+ transform: translateY(-8px) scale(.9)
374
+ }
375
+
376
+ 70% {
377
+ opacity: 1;
378
+ transform: translateY(2px)
379
+ }
380
+
381
+ to {
382
+ transform: translateY(0)
383
+ }
384
+ }
385
+
386
+ .cell-resizable {
387
+ cursor: col-resize;
388
+ }
@@ -0,0 +1,3 @@
1
+ .cdx-underline {
2
+ text-decoration: underline;
3
+ }
package/src/types.ts ADDED
@@ -0,0 +1,5 @@
1
+ export interface IBlock{
2
+ id: string;
3
+ type: string;
4
+ data: any;
5
+ }
@@ -0,0 +1,15 @@
1
+
2
+
3
+ export default {
4
+ copy: (o: any) => {
5
+ return JSON.parse(JSON.stringify(o));
6
+ },
7
+ createUniqueString: () => {
8
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
9
+ const r = Math.random() * 16 | 0;
10
+ const v = c === 'x' ? r : (r & 0x3 | 0x8);
11
+ console.log(v)
12
+ return v.toString(16);
13
+ });
14
+ }
15
+ }
@@ -0,0 +1,19 @@
1
+ import type { SFCWithInstall } from 'types'
2
+ import type {App} from 'vue'
3
+ export const withInstall = <T, E extends Record<string, any>>(
4
+ main: T,
5
+ extra?: E
6
+ ) => {
7
+ ;(main as SFCWithInstall<T>).install = (app:App): void => {
8
+ for (const comp of [main, ...Object.values(extra ?? {})]) {
9
+ app.component(comp.name, comp)
10
+ }
11
+ }
12
+
13
+ if (extra) {
14
+ for (const [key, comp] of Object.entries(extra)) {
15
+ ;(main as any)[key] = comp
16
+ }
17
+ }
18
+ return main as SFCWithInstall<T> & E
19
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "compilerOptions": {
3
+ "outDir": "dist",
4
+ "target": "es2018",
5
+ "module": "esnext",
6
+ "moduleResolution": "node",
7
+ "strict": true,
8
+ "sourceMap": false,
9
+ "allowJs": true,
10
+ "noUnusedLocals": true,
11
+ "resolveJsonModule": true,
12
+ "esModuleInterop": true,
13
+ "removeComments": false,
14
+ "jsx": "preserve",
15
+ "baseUrl": "./",
16
+ "declaration":true,
17
+ "declarationDir": "./types",
18
+ "skipLibCheck":true,
19
+ "rootDir": ".",
20
+ "lib": [
21
+ "ES2017",
22
+ "ES2018",
23
+ "ES2019",
24
+ "DOM"
25
+ ],
26
+ "paths": {
27
+ "@/*": ["./src/*"],
28
+ "@/types": [ "./types/" ],
29
+ "@/types/*": [ "./types/*" ],
30
+ }
31
+ },
32
+ "include": [
33
+ "./src/index.ts",
34
+ "./src/**/*",
35
+ "./types/index.d.ts"
36
+ ]
37
+ }
@@ -0,0 +1,19 @@
1
+
2
+ import type { Plugin } from 'vue'
3
+ export type SFCWithInstall<T> = T & Plugin
4
+
5
+ import type { INSTALLED_KEY } from '@/constants'
6
+
7
+
8
+ declare module 'vue' {
9
+ export interface App {
10
+ [INSTALLED_KEY]?: boolean
11
+ }
12
+ export interface GlobalComponents {
13
+ EblEditorRender: typeof import('@ebl-vue/editor-render')['EblEditorRender'],
14
+
15
+ }
16
+ };
17
+
18
+
19
+ export {}
package/vite.config.ts ADDED
@@ -0,0 +1,80 @@
1
+ import vue from '@vitejs/plugin-vue'
2
+ import vueJsx from '@vitejs/plugin-vue-jsx'
3
+ import { defineConfig, UserConfig, ConfigEnv } from 'vite'
4
+ import path from 'path';
5
+ import dts from "vite-plugin-dts";
6
+ import terser from '@rollup/plugin-terser'
7
+ import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js';
8
+ import { viteStaticCopy } from 'vite-plugin-static-copy'
9
+
10
+ export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
11
+
12
+ return {
13
+ plugins: [
14
+ //cssInjectedByJsPlugin(),
15
+ vue(),
16
+ vueJsx(),
17
+ dts({
18
+ rollupTypes: true,
19
+ tsconfigPath: "./tsconfig.json",
20
+ insertTypesEntry: true,
21
+ pathsToAliases:true
22
+ }),
23
+ viteStaticCopy({
24
+ targets: [
25
+ {
26
+ src: 'src/styles/*',
27
+ dest: 'styles/',
28
+ },
29
+ ],
30
+ }),
31
+
32
+ ],
33
+ resolve: {
34
+ alias: {
35
+ "@": path.resolve(__dirname, "src"),
36
+
37
+ },
38
+ },
39
+ build: {
40
+
41
+ target: 'es2018',
42
+ emptyOutDir: true,
43
+ sourcemap:true,
44
+ lib: {
45
+ entry: path.resolve(__dirname,"src","index.ts"),
46
+ name: '@ebl-vue/editor-render',
47
+ formats:['es'],
48
+ fileName: format => `index.mjs`,
49
+ cssFileName: 'style',
50
+ },
51
+ rollupOptions: {
52
+ plugins: [
53
+ terser({
54
+ compress: {
55
+ drop_console:true,
56
+ drop_debugger: true
57
+ },
58
+ format: {
59
+ comments:false
60
+ }
61
+ }),
62
+
63
+ ],
64
+ external: [
65
+ 'vue',
66
+ 'shiki',
67
+ ],
68
+ output: [
69
+ {
70
+ exports: 'named',
71
+ globals: {
72
+ vue: 'Vue'
73
+ }
74
+ }
75
+ ],
76
+ },
77
+
78
+ }
79
+ }
80
+ });