pxx-vue-quill 1.0.21 → 1.0.22

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.
@@ -7,13 +7,13 @@
7
7
  *
8
8
  * Copyright (c) 2025 Pxx-Team
9
9
  * Released under the MIT license
10
- * Date: 2025-08-26T02:18:21.558Z
10
+ * Date: 2025-08-26T09:46:02.957Z
11
11
  */
12
12
  import Quill from 'quill';
13
13
  export { default as Quill } from 'quill';
14
14
  import Delta from 'quill-delta';
15
15
  export { default as Delta } from 'quill-delta';
16
- import { defineComponent, h, onMounted, onBeforeUnmount, ref, computed, watch, nextTick } from 'vue';
16
+ import { defineComponent, ref, h, onMounted, onBeforeUnmount, computed, watch, nextTick } from 'vue';
17
17
  import BlotFormatter from 'quill-blot-formatter';
18
18
 
19
19
  const toolbarOptions = {
@@ -44,6 +44,129 @@ const toolbarOptions = {
44
44
  ]
45
45
  };
46
46
 
47
+ const MoreToolbar = defineComponent({
48
+ name: 'MoreToolbar',
49
+ emits: ['toolClick'],
50
+ setup(props, { emit }) {
51
+ const showMoreTools = ref(false);
52
+ const moreButtonClick = () => {
53
+ showMoreTools.value = !showMoreTools.value;
54
+ };
55
+ return () => h('div', {
56
+ id: 'toolbar'
57
+ }, [
58
+ h('div', {
59
+ class: {
60
+ 'short-tools': true,
61
+ 'collapse': showMoreTools.value
62
+ }
63
+ }, [
64
+ // 第一组:基础格式工具
65
+ h('span', { class: 'ql-formats' }, [
66
+ // 粗体按钮
67
+ h('button', {
68
+ class: 'ql-bold',
69
+ type: 'button',
70
+ }, ''),
71
+ // 斜体按钮
72
+ h('button', {
73
+ class: 'ql-italic',
74
+ type: 'button'
75
+ }, ''),
76
+ // 下划线按钮
77
+ h('button', {
78
+ class: 'ql-underline',
79
+ type: 'button'
80
+ }, '')
81
+ ]),
82
+ // 第二组:颜色选择器
83
+ h('span', { class: 'ql-formats' }, [
84
+ h('select', {
85
+ class: 'ql-color ql-picker ql-color-picker ql-expanded',
86
+ type: 'button'
87
+ }, [
88
+ h('span', { class: 'ql-picker-label' }, ''),
89
+ h('div', { class: 'ql-picker-options' })
90
+ ]),
91
+ ]),
92
+ // 第三组:链接工具
93
+ h('span', { class: 'ql-formats' }, [
94
+ h('button', {
95
+ class: 'ql-link',
96
+ type: 'button'
97
+ }, '')
98
+ ]),
99
+ // 第四组:更多按钮
100
+ h('span', { class: 'ql-formats' }, [
101
+ h('button', {
102
+ class: 'ql-more mr-0',
103
+ type: 'button',
104
+ onClick: moreButtonClick
105
+ }, '')
106
+ ])
107
+ ]),
108
+ h('div', {
109
+ class: {
110
+ "more-tools": true,
111
+ "collapse": showMoreTools.value
112
+ }, style: { display: showMoreTools.value ? 'block' : 'none' }
113
+ }, [
114
+ h('div', { class: "more-tools-item" }, [
115
+ h('span', { class: 'ql-formats' }, [
116
+ h('button', {
117
+ class: 'ql-list',
118
+ value: 'ordered',
119
+ type: 'button'
120
+ }, ''),
121
+ h('button', {
122
+ class: 'ql-list',
123
+ value: 'bullet',
124
+ type: 'button'
125
+ }, '')
126
+ ]),
127
+ // 第二组:图片工具
128
+ h('span', { class: 'ql-formats' }, [
129
+ h('button', {
130
+ class: 'ql-image',
131
+ type: 'button'
132
+ }, '')
133
+ ]),
134
+ // 第三组:撤销和重做
135
+ h('span', { class: 'ql-formats' }, [
136
+ h('button', {
137
+ class: 'ql-undo',
138
+ type: 'button',
139
+ onClick: () => emit('toolClick', 'undo')
140
+ }, ''),
141
+ h('button', {
142
+ class: 'ql-redo',
143
+ type: 'button',
144
+ onClick: () => emit('toolClick', 'redo')
145
+ }, '')
146
+ ]),
147
+ // 第四组:数学工具
148
+ h('span', { class: 'ql-formats' }, [
149
+ h('button', {
150
+ class: 'ql-math mr-0',
151
+ type: 'button',
152
+ onClick: () => emit('toolClick', 'math')
153
+ }, '')
154
+ ])
155
+ ]),
156
+ h('div', {}, [
157
+ h('span', { class: 'ql-formats' }, [
158
+ h('button', {
159
+ class: 'ql-ocr',
160
+ type: 'button',
161
+ onClick: () => emit('toolClick', 'ocr')
162
+ }, '')
163
+ ])
164
+ ])
165
+ ])
166
+ ]);
167
+ }
168
+ });
169
+
47
170
  // 加粗
48
171
  const boldSVG = `<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="18" height="18" viewBox="0 0 18 18"><g><g style="opacity:0;"><rect x="0" y="0" width="18" height="18" rx="0" fill="#FFFFFF" fill-opacity="1"/></g><g><path d="M6.794999938146972,7.7800002288818355L9.045000038146974,7.7800002288818355Q9.855000038146972,7.7800002288818355,10.230000038146972,7.442500128881836Q10.605000038146972,7.105000028881836,10.605000038146972,6.505000128881836Q10.605000038146972,6.114999728881836,10.440000038146973,5.860000628881836Q10.275000138146972,5.6050005288818365,9.929999838146973,5.470000228881836Q9.585000038146973,5.335000028881836,9.045000038146974,5.335000028881836L7.139999938146973,5.335000028881836L7.139999938146973,3.385000228881836L9.045000038146974,3.385000228881836Q10.034999838146973,3.385000228881836,10.852499938146973,3.797500608881836Q11.670000038146974,4.2100000388818355,12.142499938146972,4.922500628881836Q12.614999738146974,5.635000228881836,12.614999738146974,6.505000128881836Q12.614999738146974,7.375000028881836,12.142499938146972,8.042500028881836Q11.670000038146974,8.710000028881836,10.860000138146972,9.070000128881837Q10.050000238146973,9.430000328881835,9.045000038146974,9.430000328881835L6.794999938146972,9.430000328881835L6.794999938146972,7.7800002288818355ZM7.139999938146973,12.550000228881835L9.329999938146972,12.550000228881835Q9.900000138146972,12.550000228881835,10.327499838146974,12.354999528881836Q10.755000138146972,12.159999828881835,10.987500238146973,11.807499928881835Q11.219999838146972,11.454999928881836,11.219999838146972,11.020000428881836Q11.219999838146972,10.600000428881836,10.987500238146973,10.232500028881836Q10.755000138146972,9.864999728881836,10.327499838146974,9.647500028881836Q9.900000138146972,9.430000328881835,9.329999938146972,9.430000328881835L6.975000038146972,9.430000328881835L6.975000038146972,7.7800002288818355L9.329999938146972,7.7800002288818355Q10.349999938146972,7.7800002288818355,11.250000038146972,8.200000328881835Q12.149999638146973,8.620000328881837,12.690000538146972,9.362500228881835Q13.229999538146973,10.104999528881836,13.229999538146973,11.034999828881837Q13.229999538146973,11.949999828881836,12.690000538146972,12.752500528881836Q12.149999638146973,13.555000228881836,11.250000038146972,14.027500228881836Q10.349999938146972,14.500000228881836,9.329999938146972,14.500000228881836L7.139999938146973,14.500000228881836L7.139999938146973,12.550000228881835ZM7.064999938146973,14.500000228881836Q6.284999968146972,14.500000228881836,5.872500058146973,14.095000228881837Q5.460000038146973,13.689999228881836,5.460000038146973,12.895000428881836L5.460000038146973,4.989999728881836Q5.460000038146973,4.195000648881836,5.872500058146973,3.789999958881836Q6.284999968146972,3.385000228881836,7.064999938146973,3.385000228881836L7.469999838146973,3.385000228881836L7.469999838146973,14.500000228881836L7.064999938146973,14.500000228881836Z" fill="#555555" fill-opacity="1"/></g></g></svg>`;
49
172
  // 斜体
@@ -62,112 +185,28 @@ const redoSVG = `<svg t="1756107908999" class="icon" viewBox="0 0 1024 1024" ver
62
185
  const ocrSVG = `<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="18" height="18" viewBox="0 0 18 18"><g><g style="opacity:0;"><rect x="0" y="0" width="18" height="18" rx="0" fill="#FFFFFF" fill-opacity="1"/></g><g><path d="M3.0000245140625,2.6000244140625L5.5000243140625,2.6000244140625C5.8313951140625,2.6000244140625,6.1000242140625,2.3313953240625,6.1000242140625,2.0000244340625C6.1000242140625,1.6686535440624999,5.8313951140625,1.4000244140625,5.5000243140625,1.4000244140625L3.0000245140625,1.4000244140625Q2.3372827740625,1.4000244140625,1.8686535940625,1.8686535940625Q1.4000244140625,2.3372827740625,1.4000244140625,3.0000245140625L1.4000244140625,5.5000243140625C1.4000244140625,5.8313951140625,1.6686535440624999,6.1000242140625,2.0000244340625,6.1000242140625C2.3313953240625,6.1000242140625,2.6000244140625,5.8313951140625,2.6000244140625,5.5000243140625L2.6000244140625,3.0000245140625Q2.6000244140625,2.6000244140625,3.0000245140625,2.6000244140625ZM12.5000244140625,1.4000244140625L15.0000244140625,1.4000244140625Q15.6627664140625,1.4000244140625,16.1313954140625,1.8686538940625Q16.6000244140625,2.3372834940625,16.6000244140625,3.0000245140625L16.6000244140625,5.5000243140625C16.6000244140625,5.6591539140625,16.5368104140625,5.8117661140625,16.424288414062502,5.9242883140625C16.3117674140625,6.0368099140625,16.1591544140625,6.1000242140625,16.0000244140625,6.1000242140625C15.6686534140625,6.1000242140625,15.4000244140625,5.8313951140625,15.4000244140625,5.5000243140625L15.4000234140625,3.0000245140625Q15.4000234140625,2.6000244140625,15.0000244140625,2.6000244140625L12.5000244140625,2.6000244140625C12.1686534140625,2.6000244140625,11.9000244140625,2.3313953240625,11.9000244140625,2.0000244340625C11.9000244140625,1.6686535440624999,12.1686534140625,1.4000244140625,12.5000244140625,1.4000244140625ZM8.6239776140625,6.4719930140625C8.5439777140625,6.1512432140625,8.3999777140625,5.7421179140625,8.2479777140625,5.4212432140625L9.4959774140625,5.052368214062501C9.6959782140625,5.4293680140625,9.9199772140625,5.9346180140625,9.9999771140625,6.2714929140625L9.3519778140625,6.4719930140625L12.7119784140625,6.4719930140625L12.7119784140625,7.6079931140625L11.5039774140625,7.6079931140625C11.1279774140625,8.6968679140625,10.6159782140625,9.6014929140625,9.9599781140625,10.3461180140625C10.7599773140625,10.9224930140625,11.7279774140625,11.3468685140625,12.8879774140625,11.6029934140625C12.6239774140625,11.8592434140625,12.2799774140625,12.3716184140625,12.1039784140625,12.6918684140625C10.8719778140625,12.3716184140625,9.8719778140625,11.8752434140625,9.0479779140625,11.2107429140625C8.175977714062501,11.8992434140625,7.1199779140625,12.4036184140625,5.8559775140625,12.7558684140625C5.7279777140625,12.4757434140625,5.3759775140625,11.9312434140625,5.1519775140625,11.6591184140625C6.3759775140625,11.3868685140625,7.3839779140625,10.9706182140625,8.1839781140625,10.3781185140625C7.5199776140625,9.6094932140625,7.0079775140625,8.6888685140625,6.5919776140625,7.6079931140625L5.3279776140625,7.6079931140625L5.3279776140625,6.4719930140625L8.6239776140625,6.4719930140625ZM7.7999778140625,7.6079931140625C8.1119776140625,8.344617814062499,8.5359778140625,9.0011186140625,9.0719776140625,9.5694933140625C9.5439777140625,9.0251179140625,9.9199772140625,8.3766184140625,10.1919784140625,7.6079931140625L7.7999778140625,7.6079931140625ZM2.6000244140625,12.5000244140625L2.6000244140625,15.0000244140625Q2.6000244140625,15.4000234140625,3.0000245140625,15.4000234140625L5.5000243140625,15.4000234140625C5.8313951140625,15.4000244140625,6.1000242140625,15.6686534140625,6.1000242140625,16.0000244140625C6.1000242140625,16.3313964140625,5.8313951140625,16.6000254140625,5.5000243140625,16.6000254140625L5.4989548140625,16.6000244140625L3.0000245140625,16.6000244140625Q2.3372834940625,16.6000244140625,1.8686538940625,16.1313954140625Q1.4000244140625,15.6627664140625,1.4000244140625,15.0000244140625L1.4000244140625,12.5000244140625C1.4000244140625,12.1686534140625,1.6686535440624999,11.9000244140625,2.0000244340625,11.9000244140625C2.3313953240625,11.9000244140625,2.6000244140625,12.1686534140625,2.6000244140625,12.5000244140625ZM16.6000244140625,12.5010944140625L16.6000244140625,15.0000244140625Q16.6000244140625,15.6627654140625,16.1313954140625,16.1313954140625Q15.6627654140625,16.6000244140625,15.0000244140625,16.6000244140625L12.5000244140625,16.6000244140625C12.3408944140625,16.6000244140625,12.1882824140625,16.5368104140625,12.0757594140625,16.424288414062502C11.9632384140625,16.3117664140625,11.9000244140625,16.1591544140625,11.9000244140625,16.0000244140625C11.9000244140625,15.6686534140625,12.1686534140625,15.4000244140625,12.5000244140625,15.4000244140625L15.0000244140625,15.4000234140625Q15.4000234140625,15.4000234140625,15.4000234140625,15.0000244140625L15.4000234140625,12.5000244140625C15.4000244140625,12.1686534140625,15.6686534140625,11.9000244140625,16.0000244140625,11.9000244140625C16.3313964140625,11.9000244140625,16.6000254140625,12.1686534140625,16.6000254140625,12.5000244140625L16.6000244140625,12.5010944140625Z" fill-rule="evenodd" fill="#555555" fill-opacity="1"/></g></g></svg>`;
63
186
  // 数学公式
64
187
  const mathSVG = `<svg t="1756107836493" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10608" width="18" height="18"><path d="M877.454222 856.177778q4.835556-4.835556 7.395556-11.093334 2.616889-6.257778 2.616889-13.084444 0-3.413333-0.625778-6.656-0.682667-3.299556-1.991111-6.428444-1.251556-3.072-3.128889-5.859556-1.877333-2.844444-4.266667-5.176889-2.332444-2.389333-5.12-4.266667-2.844444-1.877333-5.916444-3.128888-3.128889-1.308444-6.428445-1.934223-3.299556-0.682667-6.656-0.682666-6.826667 0-13.084444 2.616889-6.257778 2.56-11.036445 7.395555l-54.044444 53.987556H253.155556l325.688888-325.745778q2.389333-2.389333 4.266667-5.12 1.877333-2.844444 3.128889-5.916445 1.308444-3.128889 1.934222-6.428444 0.682667-3.299556 0.682667-6.656 0-3.413333-0.682667-6.656-0.625778-3.299556-1.934222-6.428444-1.251556-3.072-3.128889-5.859556-1.877333-2.844444-4.266667-5.176889L253.155556 162.133333h522.126222l53.930666 53.987556q4.835556 4.835556 11.093334 7.395555 6.257778 2.616889 13.084444 2.616889 3.413333 0 6.656-0.682666 3.299556-0.625778 6.428445-1.934223 3.072-1.251556 5.859555-3.128888 2.844444-1.877333 5.176889-4.266667 2.389333-2.389333 4.266667-5.12 1.877333-2.844444 3.128889-5.916445 1.308444-3.128889 1.934222-6.428444 0.682667-3.299556 0.682667-6.656 0-6.826667-2.616889-13.084444-2.56-6.257778-7.395556-11.036445l-64-64q-4.778667-4.835556-11.036444-7.395555-6.257778-2.616889-13.084445-2.616889H170.666667q-6.826667 0-13.084445 2.616889-6.257778 2.56-11.036444 7.395555-2.389333 2.389333-4.266667 5.12-1.877333 2.844444-3.128889 5.916445-1.308444 3.128889-1.934222 6.428444-0.682667 3.299556-0.682667 6.656 0 3.413333 0.682667 6.656 0.625778 3.299556 1.934222 6.428444 1.251556 3.072 3.128889 5.859556 1.877333 2.844444 4.266667 5.176889L506.311111 512l-359.822222 359.879111q-4.835556 4.778667-7.395556 11.036445-2.616889 6.257778-2.616889 13.084444 0 3.413333 0.682667 6.656 0.625778 3.299556 1.934222 6.428444 1.251556 3.072 3.128889 5.859556 1.877333 2.844444 4.266667 5.176889 2.389333 2.389333 5.12 4.266667 2.844444 1.877333 5.916444 3.128888 3.128889 1.308444 6.428445 1.991112 3.299556 0.625778 6.656 0.625777h618.666666q6.826667 0 13.084445-2.616889 6.257778-2.56 11.036444-7.395555l64-63.943111z" p-id="10609" fill="#555555"></path></svg>`;
65
- // 无序列表
66
- const listBulletSVG = `<svg viewbox="0 0 18 18"><line class="ql-stroke" x1="6" x2="15" y1="4" y2="4"/><line class="ql-stroke" x1="6" x2="15" y1="9" y2="9"/><line class="ql-stroke" x1="6" x2="15" y1="14" y2="14"/><line class="ql-stroke" x1="3" x2="3" y1="4" y2="4"/><line class="ql-stroke" x1="3" x2="3" y1="9" y2="9"/><line class="ql-stroke" x1="3" x2="3" y1="14" y2="14"/></svg>`;
67
- // 有序列表
68
- const listOrderedSVG = `<svg viewbox="0 0 18 18"><line class="ql-stroke" x1="7" x2="15" y1="4" y2="4"/><line class="ql-stroke" x1="7" x2="15" y1="9" y2="9"/><line class="ql-stroke" x1="7" x2="15" y1="14" y2="14"/><line class="ql-stroke ql-thin" x1="2.5" x2="4.5" y1="5.5" y2="5.5"/><path class="ql-fill" d="M3.5,6A0.5,0.5,0,0,1,3,5.5V3.085l-0.276.138A0.5,0.5,0,0,1,2.053,3c-0.124-.247-0.023-0.324.224-0.447l1-.5A0.5,0.5,0,0,1,4,2.5v3A0.5,0.5,0,0,1,3.5,6Z"/><path class="ql-stroke ql-thin" d="M4.5,10.5h-2c0-.234,1.85-1.076,1.85-2.234A0.959,0.959,0,0,0,2.5,8.156"/><path class="ql-stroke ql-thin" d="M2.5,14.846a0.959,0.959,0,0,0,1.85-.109A0.7,0.7,0,0,0,3.75,14a0.688,0.688,0,0,0,.6-0.736,0.959,0.959,0,0,0-1.85-.109"/></svg>`;
69
188
  // 图片
70
189
  const imageSVG = `<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="18" height="18" viewBox="0 0 18 18"><g><g style="opacity:0;"><rect x="0" y="0" width="18" height="18" rx="0" fill="#FFFFFF" fill-opacity="1"/></g><g><path d="M1.87471507,3.83578219Q1.5,4.18540478,1.5,4.6875L1.5,14.312503Q1.50000006,14.814598,1.874716,15.16422Q2.23459671,15.5,2.73684216,15.5L15.263157,15.5Q15.765403,15.5,16.125284,15.164218Q16.499999000000003,14.814597,16.499999000000003,14.312501L16.499999000000003,4.6875Q16.499999000000003,4.18540342,16.125284999999998,3.83578214Q15.765404,3.5,15.263157,3.5L2.73684216,3.5Q2.23459646,3.5,1.87471507,3.83578219ZM2.5,14.312503L2.5,4.6875Q2.5,4.5,2.73684216,4.5L15.263157,4.5Q15.5,4.5,15.5,4.6875L15.5,14.312501Q15.5,14.5,15.263157,14.5L2.73684216,14.5Q2.5,14.5,2.5,14.312503Z" fill-rule="evenodd" fill="#555555" fill-opacity="1" style="mix-blend-mode:passthrough"/></g><g><ellipse cx="5.4375" cy="7.4375" rx="0.4375" ry="0.4375" fill-opacity="0" stroke-opacity="1" stroke="#555555" fill="none" stroke-width="1" stroke-linecap="ROUND" stroke-linejoin="round" style="mix-blend-mode:passthrough"/></g><g><path d="M5.9053998,9.924615948146972L1.7143693,12.841608238146973Q1.61364189,12.911715538146973,1.55682093,13.020492338146973Q1.5,13.129269138146974,1.5,13.251992238146972L1.50000003,14.418008338146972Q1.50000003,14.876594038146973,1.84130602,15.195924738146973Q2.16843581,15.501991738146973,2.62437022,15.501991738146973L15.375628,15.501991738146973Q15.831564,15.501991738146973,16.158693,15.195924738146973Q16.5,14.876594038146973,16.5,14.418007838146973L16.5,13.251992238146972Q16.500000999999997,13.186988838146974,16.48338,13.124146438146973Q16.466759,13.061303638146972,16.434621,13.004799838146972Q16.402485,12.948296338146973,16.356969,12.901887938146972Q16.311453,12.855479738146972,16.255583,12.822251838146972L9.8796926,9.030259398146972Q9.842938400000001,9.008400078146973,9.8030057,8.993099628146974Q9.763073,8.977799118146972,9.721121799999999,8.969501908146972Q9.6791716,8.961204618146972,9.6364217,8.960151608146973Q9.5936708,8.959098578146973,9.551362000000001,8.965320438146973Q9.5090542,8.971542238146972,9.4684162,8.984858218146973Q9.427778199999999,8.998174158146973,9.3899918,9.018197478146973Q9.352206200000001,9.038220708146973,9.3183689,9.064369648146972Q9.284532500000001,9.090518598146973,9.2556267,9.122033748146972L7.6887164,10.830422738146973L6.4904227,9.934544588146972Q6.4273362,9.887379288146972,6.3528042,9.861893948146973Q6.2782726,9.836408678146972,6.1995153,9.835072038146972Q6.1207581,9.833735408146973,6.045404,9.856676968146973Q5.9700503000000005,9.879618528146972,5.9053998,9.924615948146972ZM2.5,13.513173138146973L2.50000006,14.418008338146972Q2.50000006,14.501992238146972,2.62437022,14.501992238146972L15.375628,14.501992238146972Q15.5,14.501992238146972,15.5,14.418007838146973L15.5,13.536368338146973L9.7178593,10.097503488146973L8.1200023,11.839632738146973Q8.0888524,11.873595438146973,8.052019600000001,11.901292338146973Q8.0151863,11.928988938146972,7.9739118,11.949486538146973Q7.9326363,11.969984038146972,7.88831,11.982591638146973Q7.8439837,11.995199238146974,7.7980995,11.999492138146973Q7.7522154,12.003785338146972,7.7063198,11.999619238146973Q7.6604242,11.995453338146973,7.6160631,11.982968338146973Q7.571702,11.970483338146973,7.5303702,11.950099938146973Q7.4890385,11.929716538146973,7.4521289,11.902122038146972L6.1805682,10.951467238146973L2.5,13.513173138146973Z" fill-rule="evenodd" fill="#555555" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></g></svg>`;
71
190
 
72
- const MoreTools = defineComponent({
73
- name: 'MoreTools',
74
- props: {
75
- // 传入toolbar的自定义style
76
- toolbarStyle: {
77
- type: Object,
78
- required: false,
79
- default: () => ({})
80
- },
81
- needCollapse: {
82
- type: Boolean,
83
- default: false
84
- },
85
- onToolClick: {
86
- type: Function,
87
- required: true
88
- }
89
- },
90
- setup(props) {
91
- // 渲染工具按钮
92
- const renderToolButton = (tool) => {
93
- if (typeof tool === 'string') {
94
- // 根据工具名称获取对应的SVG图标
95
- let iconSVG = '';
96
- switch (tool) {
97
- case 'image':
98
- iconSVG = imageSVG;
99
- break;
100
- case 'undo':
101
- iconSVG = undoSVG;
102
- break;
103
- case 'redo':
104
- iconSVG = redoSVG;
105
- break;
106
- case 'ocr':
107
- iconSVG = ocrSVG;
108
- break;
109
- case 'math':
110
- iconSVG = mathSVG;
111
- break;
112
- default:
113
- iconSVG = '';
114
- }
115
- return h('button', {
116
- class: `ql-${tool}`,
117
- type: 'button',
118
- onClick: () => props.onToolClick(tool)
119
- }, [
120
- iconSVG ? h('span', { innerHTML: iconSVG }) : null
121
- ]);
122
- }
123
- else if (typeof tool === 'object' && tool !== null) {
124
- const toolName = Object.keys(tool)[0];
125
- const toolValue = Object.values(tool)[0];
126
- let iconSVG = '';
127
- if (toolName === 'list') {
128
- iconSVG = toolValue === 'ordered' ? listOrderedSVG : listBulletSVG;
129
- }
130
- return h('button', {
131
- class: `ql-${toolName}`,
132
- 'data-value': toolValue,
133
- type: 'button',
134
- onClick: () => props.onToolClick(`${toolName}-${toolValue}`)
135
- }, [
136
- iconSVG ? h('span', { innerHTML: iconSVG }) : null
137
- ]);
138
- }
139
- return null;
140
- };
141
- // 渲染工具组
142
- const renderToolGroup = (tools) => {
143
- return h('span', {
144
- class: 'ql-formats'
145
- }, tools.map(tool => renderToolButton(tool)));
146
- };
147
- return () => h('div', {
148
- class: 'ql-toolbar ql-snow more-tools',
149
- style: props.toolbarStyle
150
- }, [
151
- h('div', {
152
- class: 'more-tools-item'
153
- }, [
154
- // 渲染所有工具组
155
- ...toolbarOptions.extend.map(toolGroup => renderToolGroup(toolGroup)),
156
- ]),
157
- h('div', {}, [
158
- renderToolGroup(['ocr'])
159
- ])
160
- ]);
161
- }
162
- });
163
-
164
191
  const QuillEditor = defineComponent({
165
192
  name: 'QuillEditor',
166
193
  inheritAttrs: false,
167
194
  props: {
195
+ /**
196
+ * 编辑器内容
197
+ * 支持多种格式:字符串(HTML)、Delta对象、或undefined/null
198
+ * 当传入内容时,编辑器会显示对应的内容
199
+ */
168
200
  content: {
169
201
  type: [String, Object],
170
202
  },
203
+ /**
204
+ * 内容类型
205
+ * - 'delta': 使用Quill的Delta格式(默认)
206
+ * - 'html': 使用HTML字符串格式
207
+ * - 'text': 使用纯文本格式
208
+ * 影响内容的输入输出格式
209
+ */
171
210
  contentType: {
172
211
  type: String,
173
212
  default: 'delta',
@@ -175,28 +214,41 @@ const QuillEditor = defineComponent({
175
214
  return ['delta', 'html', 'text'].includes(value);
176
215
  },
177
216
  },
217
+ /**
218
+ * 是否启用编辑器
219
+ * true: 编辑器可编辑(默认)
220
+ * false: 编辑器禁用,不可编辑
221
+ */
178
222
  enable: {
179
223
  type: Boolean,
180
224
  default: true,
181
225
  },
226
+ /**
227
+ * 是否只读模式
228
+ * true: 编辑器只读,不可编辑
229
+ * false: 编辑器可编辑(默认)
230
+ * 与enable的区别:readOnly只是禁止编辑,enable是禁用整个编辑器
231
+ */
182
232
  readOnly: {
183
233
  type: Boolean,
184
234
  default: false,
185
235
  },
236
+ /**
237
+ * 占位符文本
238
+ * 当编辑器内容为空时显示的提示文字
239
+ * 默认显示"请输入内容"
240
+ */
186
241
  placeholder: {
187
242
  type: String,
188
243
  required: false,
189
244
  default: "请输入内容"
190
245
  },
191
- minHeight: {
192
- type: Number,
193
- required: false,
194
- default: 20,
195
- },
196
- needBorder: {
197
- type: Boolean,
198
- default: false,
199
- },
246
+ /**
247
+ * 工具栏模式
248
+ * - 'fixed-top': 工具栏固定在顶部,不随内容滚动
249
+ * - 'embedded': 工具栏嵌入在编辑器中,随内容滚动(默认)
250
+ * 影响工具栏的定位和滚动行为
251
+ */
200
252
  toolbarMode: {
201
253
  type: String,
202
254
  default: "embedded",
@@ -204,22 +256,45 @@ const QuillEditor = defineComponent({
204
256
  return ['fixed-top', 'embedded'].includes(value);
205
257
  },
206
258
  },
259
+ /**
260
+ * 是否需要折叠工具栏
261
+ * true: 显示折叠工具栏,点击"更多"展开(默认)
262
+ * false: 显示完整工具栏,不折叠
263
+ * 影响工具栏的显示方式
264
+ */
207
265
  needCollapse: {
208
266
  type: Boolean,
209
- default: true,
267
+ default: false,
210
268
  },
211
- // 传入toolbar的自定义style
269
+ /**
270
+ * 工具栏自定义样式
271
+ * 传入CSS样式对象,会应用到工具栏容器上
272
+ * 例如:{ 'background-color': '#f0f0f0', 'border-radius': '8px' }
273
+ * 支持所有CSS属性
274
+ */
212
275
  toolbarStyle: {
213
276
  type: Object,
214
277
  required: false,
215
278
  default: () => ({})
216
279
  },
217
- // 编辑器输入内容的自定义style
280
+ /**
281
+ * 编辑器内容区域自定义样式
282
+ * 传入CSS样式对象,会应用到编辑器内容区域(.ql-editor)上
283
+ * 例如:{ 'font-size': '16px', 'line-height': '1.6' }
284
+ * 支持所有CSS属性
285
+ */
218
286
  editorStyle: {
219
287
  type: Object,
220
288
  required: false,
221
289
  default: () => ({})
222
290
  },
291
+ /**
292
+ * 编辑器主题
293
+ * - 'snow': 雪花主题,经典工具栏样式(默认)
294
+ * - 'bubble': 气泡主题,浮动工具栏样式
295
+ * - '': 无主题,不应用任何样式
296
+ * 影响编辑器的整体外观和交互方式
297
+ */
223
298
  theme: {
224
299
  type: String,
225
300
  default: 'snow',
@@ -227,6 +302,15 @@ const QuillEditor = defineComponent({
227
302
  return ['snow', 'bubble', ''].includes(value);
228
303
  },
229
304
  },
305
+ /**
306
+ * 工具栏配置
307
+ * 支持多种格式:
308
+ * - 字符串: 使用预定义的工具栏配置(如'full', 'short')
309
+ * - 数组: 自定义工具栏按钮数组
310
+ * - 对象: 自定义工具栏配置对象
311
+ * - 布尔值: true显示默认工具栏,false隐藏工具栏
312
+ * - 以'#'开头: 使用CSS选择器指定的DOM元素作为工具栏
313
+ */
230
314
  toolbar: {
231
315
  type: [String, Array, Object, Boolean],
232
316
  required: false,
@@ -241,6 +325,12 @@ const QuillEditor = defineComponent({
241
325
  return true;
242
326
  },
243
327
  },
328
+ /**
329
+ * Quill模块配置
330
+ * 支持单个模块或模块数组
331
+ * 每个模块包含:name(模块名)、module(模块对象)、options(模块选项)
332
+ * 默认包含blotFormatter模块,用于图片拖拽调整
333
+ */
244
334
  modules: {
245
335
  type: Object,
246
336
  required: false,
@@ -251,10 +341,21 @@ const QuillEditor = defineComponent({
251
341
  };
252
342
  },
253
343
  },
344
+ /**
345
+ * 编辑器选项配置
346
+ * 传入QuillOptionsStatic对象,用于配置编辑器的各种选项
347
+ * 这些选项会与默认选项合并,优先级高于默认选项
348
+ */
254
349
  options: {
255
350
  type: Object,
256
351
  required: false,
257
352
  },
353
+ /**
354
+ * 全局选项配置
355
+ * 传入QuillOptionsStatic对象,用于配置编辑器的全局选项
356
+ * 这些选项会与默认选项合并,优先级最低
357
+ * 通常用于设置全局默认值
358
+ */
258
359
  globalOptions: {
259
360
  type: Object,
260
361
  required: false,
@@ -270,6 +371,7 @@ const QuillEditor = defineComponent({
270
371
  'ready',
271
372
  'ocr',
272
373
  'math',
374
+ 'image',
273
375
  ],
274
376
  setup: (props, ctx) => {
275
377
  onMounted(() => {
@@ -285,7 +387,6 @@ const QuillEditor = defineComponent({
285
387
  const editorWrapClass = computed(() => {
286
388
  return {
287
389
  'quill-editor-container': true,
288
- 'need-border': props.needBorder,
289
390
  'more-toolbar': showMoreToolbar.value,
290
391
  'fixed-top': props.toolbarMode === 'fixed-top',
291
392
  'embedded': props.toolbarMode === 'embedded',
@@ -337,6 +438,7 @@ const QuillEditor = defineComponent({
337
438
  toolbar.style.display = 'none';
338
439
  }
339
440
  const icons = Quill.import('ui/icons');
441
+ // 因为设计稿的图标样式和quill的图标样式不一致,所以需要手动替换
340
442
  icons['bold'] = boldSVG;
341
443
  icons['italic'] = italicSVG;
342
444
  icons['underline'] = underlineSVG;
@@ -387,37 +489,42 @@ const QuillEditor = defineComponent({
387
489
  if (props.placeholder)
388
490
  clientOptions.placeholder = props.placeholder;
389
491
  if (props.toolbar && props.toolbar !== '') {
390
- clientOptions.modules = {
391
- toolbar: {
392
- // 需要展开的话显示完整的工具栏
393
- container: props.needCollapse ? [
394
- ...toolbarOptions.full,
395
- ] : [
396
- ...toolbarOptions.short,
397
- ],
398
- handlers: {
399
- redo: function () {
400
- var _a;
401
- (_a = quill === null || quill === void 0 ? void 0 : quill.getModule('history')) === null || _a === void 0 ? void 0 : _a.redo();
402
- },
403
- undo: function () {
404
- var _a;
405
- (_a = quill === null || quill === void 0 ? void 0 : quill.getModule('history')) === null || _a === void 0 ? void 0 : _a.undo();
406
- },
407
- ocr: function () {
408
- // 按钮点击逻辑
409
- ctx.emit('ocr');
410
- },
411
- math: function () {
412
- // 按钮点击逻辑
413
- ctx.emit('math');
492
+ if (props.needCollapse) {
493
+ clientOptions.modules = {
494
+ toolbar: "#toolbar",
495
+ };
496
+ }
497
+ else {
498
+ clientOptions.modules = {
499
+ toolbar: {
500
+ // 需要展开的话显示完整的工具栏
501
+ container: [
502
+ ...toolbarOptions.full,
503
+ ],
504
+ handlers: {
505
+ redo: function () {
506
+ var _a;
507
+ (_a = quill === null || quill === void 0 ? void 0 : quill.getModule('history')) === null || _a === void 0 ? void 0 : _a.redo();
508
+ },
509
+ undo: function () {
510
+ var _a;
511
+ (_a = quill === null || quill === void 0 ? void 0 : quill.getModule('history')) === null || _a === void 0 ? void 0 : _a.undo();
512
+ },
513
+ ocr: function () {
514
+ // 按钮点击逻辑
515
+ ctx.emit('ocr');
516
+ },
517
+ math: function () {
518
+ // 按钮点击逻辑
519
+ ctx.emit('math');
520
+ },
521
+ more: function () {
522
+ showMoreToolbar.value = !showMoreToolbar.value;
523
+ }
414
524
  },
415
- more: function () {
416
- showMoreToolbar.value = !showMoreToolbar.value;
417
- }
418
525
  },
419
- },
420
- };
526
+ };
527
+ }
421
528
  }
422
529
  if (props.modules) {
423
530
  const modules = (() => {
@@ -461,7 +568,6 @@ const QuillEditor = defineComponent({
461
568
  };
462
569
  const handleTextChange = (delta, oldContents, source) => {
463
570
  internalModel = maybeClone(getContents());
464
- // Update v-model:content when text changes
465
571
  if (!internalModelEquals(props.content)) {
466
572
  ctx.emit('update:content', internalModel);
467
573
  }
@@ -578,6 +684,23 @@ const QuillEditor = defineComponent({
578
684
  initialize();
579
685
  });
580
686
  };
687
+ const moreToolbarToolClick = (tool) => {
688
+ var _a, _b;
689
+ if (!quill)
690
+ return;
691
+ if (tool === 'undo') {
692
+ (_a = quill.getModule('history')) === null || _a === void 0 ? void 0 : _a.undo();
693
+ }
694
+ else if (tool === 'redo') {
695
+ (_b = quill.getModule('history')) === null || _b === void 0 ? void 0 : _b.redo();
696
+ }
697
+ else if (tool === 'ocr') {
698
+ ctx.emit('ocr');
699
+ }
700
+ else if (tool === 'math') {
701
+ ctx.emit('math');
702
+ }
703
+ };
581
704
  watch(() => props.content, (newContent) => {
582
705
  if (!quill || !newContent || internalModelEquals(newContent))
583
706
  return;
@@ -607,30 +730,19 @@ const QuillEditor = defineComponent({
607
730
  reinit,
608
731
  editorWrapClass,
609
732
  showMoreToolbar,
733
+ moreToolbarToolClick
610
734
  };
611
735
  },
612
736
  render() {
613
737
  return [
614
738
  h('div', { class: this.editorWrapClass }, [
615
739
  // this.$slots.toolbar?.(), // 工具栏内容固定
616
- // 当 needCollapse 为 false 时,显示 MoreTools 组件
617
- this.showMoreToolbar && h(MoreTools, {
740
+ // 当 needCollapse 为 false 时,显示 MoreToolbar 组件
741
+ this.$props.needCollapse && h(MoreToolbar, {
618
742
  needCollapse: this.needCollapse,
619
743
  toolbarStyle: this.$props.toolbarStyle,
620
744
  onToolClick: (tool) => {
621
- var _a, _b, _c, _d;
622
- if (tool === 'undo') {
623
- (_b = (_a = this.getQuill()) === null || _a === void 0 ? void 0 : _a.getModule('history')) === null || _b === void 0 ? void 0 : _b.undo();
624
- }
625
- else if (tool === 'redo') {
626
- (_d = (_c = this.getQuill()) === null || _c === void 0 ? void 0 : _c.getModule('history')) === null || _d === void 0 ? void 0 : _d.redo();
627
- }
628
- else if (tool === 'ocr') {
629
- this.$emit('ocr');
630
- }
631
- else if (tool === 'math') {
632
- this.$emit('math');
633
- }
745
+ this.moreToolbarToolClick(tool);
634
746
  }
635
747
  }),
636
748
  h('div', {