From c034d4cdaf348594c443b4acd5f4c3b166e4d420 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期四, 17 七月 2025 16:30:31 +0800
Subject: [PATCH] Merge branch 'dev' into dev_fix_sub

---
 pages/tabbar/user/utils/tool.vue                                      |    8 
 uni_modules/sv-editor/components/sv-editor/sv-editor-colorpicker.vue  |  178 +
 uni_modules/sp-editor/components/sp-editor/sp-editor.vue              |  853 ++++++
 uni_modules/sp-editor/components/sp-editor/color-picker.vue           |  825 +++++
 uni_modules/sv-editor/components/common/utils.js                      |  412 ++
 uni_modules/sv-editor/components/sv-editor/sv-editor-render.vue       |  150 +
 pages/mine/activity/reportActivity.vue                                |   21 
 pages/goods-manager/goodsList/goodsList.vue                           |    7 
 api/activity.js                                                       |   26 
 uni_modules/sp-editor/utils/index.js                                  |  132 
 pages/news/news.vue                                                   |    5 
 uni_modules/sv-editor/components/sv-editor/sv-choose-file.vue         |  122 
 uni_modules/sp-editor/changelog.md                                    |  131 
 uni_modules/sv-editor/components/icons/iconfont.ttf                   |    0 
 uni_modules/sv-editor/components/sv-editor/sv-editor-popup-more.vue   |  445 +++
 uni_modules/sv-editor/package.json                                    |   87 
 uni_modules/sv-editor/components/plugins/sv-editor-wxplugin.js        |   10 
 uni_modules/sp-editor/icons/custom-icon.css                           |   24 
 uni_modules/sv-editor/readme.md                                       |  333 ++
 uni_modules/sv-editor/components/common/file-handler.js               |  261 +
 uni_modules/sp-editor/components/sp-editor/link-edit.vue              |  152 +
 uni_modules/sv-editor/components/common/store.js                      |  101 
 uni_modules/sv-editor/components/plugins/sv-editor-plugin.vue         |   52 
 uni_modules/sp-editor/static/image-resize.min.js                      |    1 
 uni_modules/sp-editor/readme.md                                       |   19 
 pages/mine/activity/addActivity.vue                                   |  739 +++++
 uni_modules/sp-editor/static/quill.min.js                             |    8 
 uni_modules/sv-editor/components/sv-editor/sv-editor.vue              |  445 +++
 api/goods.js                                                          |    2 
 components/uview-components/uview-ui/components/u-upload/u-upload.vue |   27 
 uni_modules/sp-editor/package.json                                    |   83 
 uni_modules/sv-editor/components/common/tool-list.js                  |  208 +
 uni_modules/sv-editor/components/icons/iconfont.css                   |  233 +
 uni_modules/sp-editor/icons/editor-icon.css                           |  238 +
 uni_modules/sv-editor/components/sv-editor/sv-editor-toolbar.vue      |  647 ++++
 uni_modules/sv-editor/components/backup/sv-editor-plugin.vue          |  656 ++++
 pages/mine/activity/applayActivityList.vue                            |  370 ++
 uni_modules/sv-editor/components/common/config.js                     |   15 
 uni_modules/sp-editor/components/sp-editor/fab-tool.vue               |  140 
 uni_modules/sv-editor/changelog.md                                    |   35 
 uni_modules/sv-editor/components/common/parse.js                      |  179 +
 uni_modules/sv-editor/components/backup/sv-editor-wxplugin.js         |   94 
 42 files changed, 8,443 insertions(+), 31 deletions(-)

diff --git a/api/activity.js b/api/activity.js
index 1557181..2d8628b 100644
--- a/api/activity.js
+++ b/api/activity.js
@@ -33,6 +33,29 @@
 }
 
 /**
+ * 鏂板娲诲姩
+ * 
+ * @param params
+ */
+ export function addActivityByBuyer(param) {
+  return http.request({
+    url: "/lmk/my-activity/add",
+    method: Method.POST,
+    needToken: true,
+	data:param
+  });
+}
+export function applyActivityPage(param){
+	return http.request({
+	  url: "/lmk/my-activity/applyActivityPage",
+	  method: Method.GET,
+	  needToken: true,
+	  params:param
+	});
+}
+
+
+/**
  * 鑾峰緱娲诲姩璇︽儏
  * @param  params
  */
@@ -71,6 +94,3 @@
 	params:param
   });
 }
-
-
-
diff --git a/api/goods.js b/api/goods.js
index 16a6fd8..e769eb5 100644
--- a/api/goods.js
+++ b/api/goods.js
@@ -239,7 +239,7 @@
  */
 export function getStoreGoods(params) {
   return http.request({
-    url: api.store + '/goods/goods/list',
+    url: '/goods/goods/store/list',
     method: Method.GET,
     needToken: true,
     params
diff --git a/components/uview-components/uview-ui/components/u-upload/u-upload.vue b/components/uview-components/uview-ui/components/u-upload/u-upload.vue
index 490ddf9..abb90f9 100644
--- a/components/uview-components/uview-ui/components/u-upload/u-upload.vue
+++ b/components/uview-components/uview-ui/components/u-upload/u-upload.vue
@@ -100,7 +100,7 @@
 		// 鍚庣鍦板潃
 		action: {
 			type: String,
-			default: ''
+			default: 'http://127.0.0.1:8890/common/lmk/file/upload'
 		},
 		// 鏈�澶т笂浼犳暟閲�
 		maxCount: {
@@ -394,12 +394,13 @@
 			this.lists[index].error = false;
 			this.uploading = true;
 			// 鍒涘缓涓婁紶瀵硅薄
+
 			const task = uni.uploadFile({
 				url: this.action,
 				filePath: this.lists[index].url,
-				name: this.name,
-				formData: this.formData,
-				header: this.header,
+				name: 'file',
+				// file: this.formData,
+				// header: this.header,
 				success: res => {
 					// 鍒ゆ柇鏄惁json瀛楃涓诧紝灏嗗叾杞负json鏍煎紡
 					let data = this.toJson && this.$u.test.jsonString(res.data) ? JSON.parse(res.data) : res.data;
@@ -407,10 +408,11 @@
 						this.uploadError(index, data);
 					} else {
 						// 涓婁紶鎴愬姛
+						const fileType = this.getFileType(this.lists[index].url);
 						this.lists[index].response = data;
 						this.lists[index].progress = 100;
 						this.lists[index].error = false;
-						this.$emit('on-success', data, index, this.lists);
+						this.$emit('success', data, index, this.lists,fileType);
 					}
 				},
 				fail: e => {
@@ -430,6 +432,21 @@
 				}
 			});
 		},
+		getFileType(filePath) {
+			const extension = filePath.split('.').pop().toLowerCase();
+		 // 鍥剧墖绫诲瀷
+		     const imageTypes = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp'];
+		     // 瑙嗛绫诲瀷 
+		     const videoTypes = ['mp4', 'mov', 'avi', 'wmv', 'flv', 'm3u8'];
+		     
+		     if (imageTypes.includes(extension)) {
+		       return 'image';
+		     } else if (videoTypes.includes(extension)) {
+		       return 'video';
+		     } else {
+		       return 'text'; // 鍏朵粬鎵�鏈夌被鍨嬪綊涓簍ext
+		     }
+		},
 		// 涓婁紶澶辫触
 		uploadError(index, err) {
 			this.lists[index].progress = 0;
diff --git a/pages/goods-manager/goodsList/goodsList.vue b/pages/goods-manager/goodsList/goodsList.vue
index 761771f..fe00306 100644
--- a/pages/goods-manager/goodsList/goodsList.vue
+++ b/pages/goods-manager/goodsList/goodsList.vue
@@ -28,8 +28,7 @@
 								<text>.00</text>
 							</view>
 							<view class="uni-flex-row">
-								<view class="uni-note">{{ item.commentNum || 0 }}鏉¤瘎璁� 鏈堥攢閲� {{
-									item.buyCount || 0 }}
+								<view class="uni-note">{{ item.commentNum || 0 }}鏉¤瘎璁�
 								</view>
 								<view class="uni-note ellipsis">
 									<text :class="item.marketEnable == 'DOWN' ? 'market-down' : 'market-up'">{{
@@ -141,8 +140,8 @@
 			});
 		},
 		toggle(item) {
-			this.$refs.popup.open('bottom')
-			this.selectGoods = item;
+			// this.$refs.popup.open('bottom')
+			// this.selectGoods = item;
 		},
 
 		getGoodsList() {
diff --git a/pages/mine/activity/addActivity.vue b/pages/mine/activity/addActivity.vue
new file mode 100644
index 0000000..09f6911
--- /dev/null
+++ b/pages/mine/activity/addActivity.vue
@@ -0,0 +1,739 @@
+<template>
+	<view class="add-user-container">
+		<!-- 琛ㄥ崟鍖哄煙 -->
+		<view class="form-card">
+			<u-form :model="form" ref="uForm" label-width="150rpx" :rules="rules" style="width: 100%;">
+
+				<!-- 娲诲姩鍚嶇О -->
+				<u-form-item label="娲诲姩鍚嶇О" prop="activityName" borderBottom required>
+					<u-input v-model="form.activityName" placeholder="璇疯緭鍏ユ椿鍔ㄥ悕绉�" border="none" />
+				</u-form-item>
+
+				<!-- 娲诲姩绫诲瀷 -->
+				<u-form-item label="娲诲姩绫诲瀷" prop="activityType" borderBottom required>
+					<u-radio-group v-model="form.activityType" placement="column">
+						<u-radio :customStyle="{marginBottom: '8px'}" v-for="(item, index) in activityTypes"
+							:key="index" :label="item.value" :name="item.value" @change="activityTypeRadioChange">
+							<span>{{item.label}}</span>
+						</u-radio>
+					</u-radio-group>
+				</u-form-item>
+
+				<!-- 鎶ュ悕鏃堕棿鑼冨洿 -->
+				<u-form-item label="鎶ュ悕寮�濮嬫椂闂�" prop="reportStartTime" borderBottom required label-width="200rpx">
+					<uni-datetime-picker type="datetime" v-model="form.reportStartTime"
+						@change="handleReportStartTimeChange" />
+				</u-form-item>
+
+				<u-form-item label="鎶ュ悕缁撴潫鏃堕棿" prop="reportEndTime" borderBottom required label-width="200rpx">
+					<uni-datetime-picker type="datetime" v-model="form.reportEndTime" :start="form.reportStartTime"
+						@change="handleReportEndTimeChange" />
+				</u-form-item>
+
+				<!-- 娲诲姩鏃堕棿鑼冨洿 -->
+				<u-form-item label="娲诲姩寮�濮嬫椂闂�" prop="startTime" borderBottom required label-width="200rpx">
+					<uni-datetime-picker type="datetime" v-model="form.startTime" :start="form.reportEndTime"
+						@change="handleStartTimeChange" />
+				</u-form-item>
+
+				<u-form-item label="娲诲姩缁撴潫鏃堕棿" prop="endTime" borderBottom required label-width="200rpx">
+					<uni-datetime-picker type="datetime" v-model="form.endTime" :start="form.startTime"
+						@change="handleEndTimeChange" />
+				</u-form-item>
+
+				<!-- 灏侀潰绫诲瀷 -->
+				<u-form-item label="灏侀潰绫诲瀷" prop="coverType" borderBottom required>
+					<u-radio-group v-model="coverType" placement="column">
+						<u-radio :customStyle="{marginBottom: '8px'}" v-for="(item, index) in coverTypes" :key="index"
+							:label="item.value" :name="item.value" @change="coverTypeRadioChange">
+							<span>{{item.label}}</span>
+						</u-radio>
+					</u-radio-group>
+
+				</u-form-item>
+
+
+				<!-- 娲诲姩灏侀潰 -->
+				<u-form-item label="娲诲姩灏侀潰" prop="cover" borderBottom required>
+					<u-input v-if="coverType === 'text'" v-model="form.cover" placeholder="璇疯緭鍏ュ皝闈㈡枃瀛�" border="none" />
+					<u-upload v-else :fileList="coverList" @delete="deleteCover" name="cover" :maxCount="1"
+						uploadText="涓婁紶灏侀潰" :action="uploadUrl" @success="handleSuccess"></u-upload>
+				</u-form-item>
+
+				<!-- 浜烘暟闄愬埗 -->
+				<u-form-item label="浜烘暟闄愬埗" prop="limitUserNum" borderBottom required>
+					<u-number-box v-model="form.limitUserNum" :min="0" :max="1000" integer></u-number-box>
+					<text style="margin-left: 20rpx;color: #999">0琛ㄧず涓嶉檺鍒�</text>
+				</u-form-item>
+
+				<!-- 娲诲姩鍦扮偣 -->
+				<u-form-item label="娲诲姩鍦扮偣" prop="activityLocation" borderBottom v-if="form.activityType === 'offline'"
+					required>
+					<u-input v-model="form.activityLocation" placeholder="璇疯緭鍏ユ椿鍔ㄥ湴鐐�" border="none" />
+				</u-form-item>
+
+				<!-- 娲诲姩鍐呭 -->
+				<u-form-item label="娲诲姩鍐呭" prop="activityContent" borderBottom required>
+
+				</u-form-item>
+				<sp-editor style="max-width: 70%;" :toolbar-config="{
+					           excludeKeys: ['direction', 'date', 'lineHeight', 'letterSpacing', 'listCheck'],
+					           iconSize: '15px'
+					         }" @init="initEditor" @input="inputOver" @overMax="overMax" @upinImage="upinImage"
+					@upinVideo="upinVideo"></sp-editor>
+			</u-form>
+
+			<!-- 鎻愪氦鎸夐挳 -->
+			<view class="submit-btn">
+				<u-button type="primary" shape="circle" @click="submitForm" :loading="loading">鎻愪氦</u-button>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		convertImgStylesToAttributes,
+		handleHtmlWithVideo
+	} from '@/uni_modules/sp-editor/utils'
+	import '@/components/uview-components/uview-ui';
+	import {
+		addActivityByBuyer
+	} from '@/api/activity.js'
+
+	export default {
+		data() {
+			return {
+				uploadUrl: 'http://127.0.0.1:8890/common/lmk/file/upload',
+				coverType: 'file',
+
+
+				isImage: false, // 鏄惁鏄浘鐗�
+
+				editorIns: null,
+
+				loading: false,
+				coverList: [],
+				activityTypes: [{
+						label: '绾夸笂',
+						value: 'online'
+					},
+					{
+						label: '绾夸笅',
+						value: 'offline'
+					}
+				],
+				coverTypes: [{
+						label: '鏂囦欢',
+						value: 'file'
+					},
+					{
+						label: '鏂囧瓧',
+						value: 'text'
+					}
+				],
+				form: {
+					activityName: '',
+					activityType: 'online', // 榛樿绾夸笂
+					reportStartTime: '',
+					reportEndTime: '', // 榛樿鏄庡ぉ
+					startTime: '', // 榛樿鍚庡ぉ
+					endTime: '', // 榛樿澶у悗澶�
+					cover: '',
+					coverType: 'file',
+					limitUserNum: 0,
+					activityLocation: '',
+					activityContent: ''
+				},
+				rules: {
+					activityName: [{
+							required: true,
+							message: '璇疯緭鍏ユ椿鍔ㄥ悕绉�',
+							trigger: 'blur'
+						},
+						{
+							min: 2,
+							max: 50,
+							message: '闀垮害鍦�2鍒�50涓瓧绗�',
+							trigger: 'blur'
+						}
+					],
+					activityType: [{
+						required: true,
+						message: '璇烽�夋嫨娲诲姩绫诲瀷',
+						trigger: 'change'
+					}],
+					coverType: [{
+						required: true,
+						message: '璇烽�夋嫨灏侀潰绫诲瀷',
+						trigger: 'change'
+					}],
+					cover: [{
+						required: true,
+						message: '璇蜂笂浼犳椿鍔ㄥ皝闈�',
+						trigger: 'change'
+					}],
+					reportStartTime: [{
+						required: true,
+						message: '璇烽�夋嫨鎶ュ悕寮�濮嬫椂闂�',
+						trigger: 'blur'
+					}],
+					reportEndTime: [{
+							required: true,
+							message: '璇烽�夋嫨鎶ュ悕缁撴潫鏃堕棿',
+							trigger: 'change'
+						},
+						{
+							validator: this.validateReportTime,
+							trigger: 'change'
+						}
+					],
+					startTime: [{
+							required: true,
+							message: '璇烽�夋嫨娲诲姩寮�濮嬫椂闂�',
+							trigger: 'change'
+						},
+						{
+							validator: this.validateStartTime,
+							trigger: 'change'
+						}
+					],
+					endTime: [{
+							required: true,
+							message: '璇烽�夋嫨娲诲姩缁撴潫鏃堕棿',
+							trigger: 'change'
+						},
+						{
+							validator: this.validateEndTime,
+							trigger: 'change'
+						}
+					],
+					limitUserNum: [{
+							required: true,
+							message: '璇疯緭鍏ヤ汉鏁�',
+							trigger: 'change',
+							validator: this.numValidate,
+						},
+
+					],
+					activityContent: [{
+							required: true,
+							message: '璇疯緭鍏ユ椿鍔ㄥ唴瀹�',
+							trigger: 'blur'
+						},
+						{
+							min: 10,
+							message: '鑷冲皯杈撳叆10涓瓧绗�',
+							trigger: 'blur'
+						}
+					]
+				},
+			}
+		},
+		onReady() {
+			// 寰俊灏忕▼搴忛渶瑕佺敤姝ゅ啓娉�
+		},
+		onLoad() {
+			setTimeout(() => {
+				this.$refs.uForm.setRules(this.rules)
+			}, 500)
+		},
+		methods: {
+			/**
+			 * 鐩存帴杩愯绀轰緥宸ョ▼鎻掑叆鍥剧墖鏃犳硶姝e父鏄剧ず鐨勭湅杩欓噷
+			 * 鍥犱负鎻掍欢榛樿閲囩敤浜戠瀛樺偍鍥剧墖鐨勬柟寮�
+			 * 浠�$emit('upinImage', tempFiles, this.editorCtx)鐨勬柟寮忓洖璋�
+			 * @param {Object} tempFiles
+			 * @param {Object} editorCtx
+			 */
+			async upinImage(tempFiles, editorCtx) {
+				/**
+				 * 鏈湴涓存椂鎻掑叆鍥剧墖棰勮
+				 * 娉ㄦ剰锛氳繖閲屼粎鏄ず渚嬫湰鍦板浘鐗囬瑙堬紝鍥犱负闇�瑕佸皢鍥剧墖鍏堜笂浼犲埌浜戠锛屽啀灏嗗浘鐗囨彃鍏ュ埌缂栬緫鍣ㄤ腑
+				 * 姝e紡寮�鍙戞椂锛岃繕璇峰皢姝ゅ娉ㄩ噴锛屽苟瑙e紑涓嬮潰 浣跨敤 uniCloud.uploadFile 涓婁紶鍥剧墖鐨勭ず渚嬫柟娉� 鐨勬敞閲�
+				 * @tutorial https://uniapp.dcloud.net.cn/api/media/editor-context.html#editorcontext-insertimage
+				 */
+				let data = await this.upload(tempFiles);
+				console.log(data)
+				// #ifdef MP-WEIXIN
+				// 娉ㄦ剰寰俊灏忕▼搴忕殑鍥剧墖璺緞鏄湪tempFilePath瀛楁涓�
+				editorCtx.insertImage({
+					src: data.data.url, //瀵屾枃鏈唴瀹�
+					width: '80%', // 榛樿涓嶅缓璁摵婊″搴�100%锛岄鐣欎竴鐐圭┖闅欎互渚跨敤鎴风紪杈�
+					alt: data.data.url +'|'+data.data.fileKey,
+					success: function() {}
+				})
+				// #endif
+
+				// #ifndef MP-WEIXIN
+				editorCtx.insertImage({
+					src: data.data.url, //瀵屾枃鏈唴瀹�
+					width: '80%', // 榛樿涓嶅缓璁摵婊″搴�100%锛岄鐣欎竴鐐圭┖闅欎互渚跨敤鎴风紪杈�
+					success: function() {}
+				})
+				// #endif
+			},
+			async upinVideo(tempFiles, editorCtx) {
+				let data = await this.uploadVideo(tempFiles);
+				await editorCtx.insertImage({
+					src: 'https://img.zcool.cn/community/01055859b8e37fa8012075341db67f.gif', //瀵屾枃鏈唴瀹�
+					width: '80%', // 榛樿涓嶅缓璁摵婊″搴�100%锛岄鐣欎竴鐐圭┖闅欎互渚跨敤鎴风紪杈�
+					alt: data.data.url +'|'+data.data.fileKey,
+				})
+
+			},
+			async upload(tempFiles) {
+				uni.showLoading({
+					title: '鍔犺浇涓婁紶涓�...',
+					mask: true
+				});
+
+				try {
+					const res = await new Promise((resolve, reject) => {
+						uni.uploadFile({
+							url: 'http://127.0.0.1:8890/common/lmk/file/upload',
+							filePath: tempFiles[0].tempFilePath,
+							name: 'file',
+							success: (uploadRes) => {
+								if (uploadRes.statusCode === 200) {
+									try {
+										const parsedData = JSON.parse(uploadRes.data);
+										resolve(parsedData);
+									} catch (e) {
+										reject(new Error('瑙f瀽鍝嶅簲鏁版嵁澶辫触'));
+									}
+								} else {
+									reject(new Error(`涓婁紶澶辫触: ${uploadRes.statusCode}`));
+								}
+							},
+							fail: (err) => {
+								const errMsg = typeof err === 'object' ? JSON.stringify(err) :
+									String(err);
+								reject(new Error(`涓婁紶澶辫触: ${errMsg}`));
+							}
+						});
+					});
+
+					uni.hideLoading();
+					return res;
+				} catch (error) {
+					uni.hideLoading();
+					uni.showToast({
+						title: error.message,
+						icon: 'none'
+					});
+					throw error; // 鍙互閫夋嫨缁х画鎶涘嚭閿欒鎴栬繑鍥瀗ull
+				}
+			},
+
+
+			async uploadVideo(tempFiles) {
+				uni.showLoading({
+					title: '鍔犺浇涓婁紶涓�...',
+					mask: true
+				});
+
+				try {
+					const res = await new Promise((resolve, reject) => {
+						uni.uploadFile({
+							url: 'http://127.0.0.1:8890/common/lmk/file/upload',
+							filePath: tempFiles,
+							name: 'file',
+							success: (uploadRes) => {
+								if (uploadRes.statusCode === 200) {
+									try {
+										const parsedData = JSON.parse(uploadRes.data);
+										resolve(parsedData);
+									} catch (e) {
+										reject(new Error('瑙f瀽鍝嶅簲鏁版嵁澶辫触'));
+									}
+								} else {
+									reject(new Error(`涓婁紶澶辫触: ${uploadRes.statusCode}`));
+								}
+							},
+							fail: (err) => {
+								const errMsg = typeof err === 'object' ? JSON.stringify(err) :
+									String(err);
+								reject(new Error(`涓婁紶澶辫触: ${errMsg}`));
+							}
+						});
+					});
+
+					uni.hideLoading();
+					return res;
+				} catch (error) {
+					uni.hideLoading();
+					uni.showToast({
+						title: error.message,
+						icon: 'none'
+					});
+					throw error; // 鍙互閫夋嫨缁х画鎶涘嚭閿欒鎴栬繑鍥瀗ull
+				}
+			},
+			/**
+			 * 鑾峰彇杈撳叆鍐呭
+			 * @param {Object} e {html,text} 鍐呭鐨刪tml鏂囨湰锛屽拰text鏂囨湰
+			 */
+			inputOver(e) {
+				// 鍙互鍦ㄦ澶勮幏鍙栧埌缂栬緫鍣ㄥ凡缂栬緫鐨勫唴瀹�
+				console.log('==== inputOver :', e)
+				this.form.activityContent = e.html;
+			},
+			/**
+			 * 瓒呭嚭鏈�澶у唴瀹归檺鍒�
+			 * @param {Object} e {html,text} 鍐呭鐨刪tml鏂囨湰锛屽拰text鏂囨湰
+			 */
+			overMax(e) {
+				// 鑻ヨ缃簡鏈�澶у瓧鏁伴檺鍒讹紝鍙湪姝ゅ瑙﹀彂瓒呭嚭闄愬埗鐨勫洖璋�
+				console.log('==== overMax :', e)
+			},
+			/**
+			 * 缂栬緫鍣ㄥ氨缁�
+			 * @param {Object} editor 缂栬緫鍣ㄥ疄渚嬶紝浣犲彲浠ヨ嚜瀹氫箟璋冪敤editor瀹炰緥鐨勬柟娉�
+			 * @tutorial editor缁勪欢 https://uniapp.dcloud.net.cn/component/editor.html#editor-%E7%BB%84%E4%BB%B6
+			 * @tutorial 鐩稿叧api https://uniapp.dcloud.net.cn/api/media/editor-context.html
+			 */
+			initEditor(editor) {
+				this.editorIns = editor // 淇濆瓨缂栬緫鍣ㄥ疄渚�
+				// 淇濆瓨缂栬緫鍣ㄥ疄渚嬪悗锛屽彲浠ュ湪姝ゅ鑾峰彇鍚庣鏁版嵁锛屽苟璧嬪�肩粰缂栬緫鍣ㄥ垵濮嬪寲鍐呭
+				this.preRender()
+			},
+			preRender() {
+				setTimeout(() => {
+					// 寮傛鑾峰彇鍚庣鏁版嵁鍚庯紝鍒濆鍖栫紪杈戝櫒鍐呭
+					this.editorIns.setContents({
+						html: ``
+					})
+				}, 1000)
+			},
+			// 鏃堕棿閫夋嫨鍙樺寲澶勭悊
+			handleReportStartTimeChange(val) {
+				this.form = {
+					...this.form,
+					reportStartTime: val
+				}; // 瑙f瀯璧嬪�艰Е鍙戝搷搴斿紡
+				// 濡傛灉鎶ュ悕缁撴潫鏃堕棿鏃╀簬寮�濮嬫椂闂达紝鍒欓噸缃�
+				if (new Date(this.form.reportEndTime) < new Date(val)) {
+					this.form.reportEndTime = '';
+				}
+			},
+			handleReportEndTimeChange(val) {
+				this.form.reportEndTime = val;
+				// 濡傛灉娲诲姩寮�濮嬫椂闂存棭浜庢姤鍚嶇粨鏉熸椂闂达紝鍒欓噸缃�
+				if (new Date(this.form.startTime) < new Date(val)) {
+					this.form.startTime = '';
+				}
+			},
+			handleStartTimeChange(val) {
+				this.form.startTime = val;
+				// 濡傛灉娲诲姩缁撴潫鏃堕棿鏃╀簬寮�濮嬫椂闂达紝鍒欓噸缃�
+				if (new Date(this.form.endTime) < new Date(val)) {
+					this.form.endTime = '';
+				}
+			},
+			handleEndTimeChange(val) {
+				this.form.endTime = val;
+			},
+			activityTypeRadioChange(n) {
+				console.log('radioChange', n);
+				this.form.activityType = n;
+			},
+			coverTypeRadioChange(n) {
+				console.log('radioChange', n);
+				this.coverType = n;
+
+			},
+			// 鍥剧墖涓婁紶澶勭悊
+			// 鏂板鍥剧墖
+			afterRead(event) {
+				const {
+					file
+				} = event;
+				console.log('鏂囦欢绫诲瀷:', file.type);
+			},
+			// 鍒犻櫎灏侀潰
+			deleteCover() {
+				this.coverList = []
+				this.form.cover = ''
+			},
+			handleSuccess(data, index, lists, fileType) {
+				//琛ㄥ崟璧嬪��
+				this.form.coverType = fileType;
+				this.form.cover = data.data.fileKey;
+			},
+			// 楠岃瘉鎶ュ悕鏃堕棿
+			validateReportTime(rule, value, callback) {
+				if (!value) {
+					callback(new Error('璇烽�夋嫨鎶ュ悕缁撴潫鏃堕棿'))
+				} else if (new Date(value) <= new Date(this.form.reportStartTime)) {
+					callback(new Error('鎶ュ悕缁撴潫鏃堕棿蹇呴』鏅氫簬寮�濮嬫椂闂�'))
+				} else {
+					callback()
+				}
+			},
+
+			// 楠岃瘉娲诲姩寮�濮嬫椂闂�
+			validateStartTime(rule, value, callback) {
+				if (!value) {
+					callback(new Error('璇烽�夋嫨娲诲姩寮�濮嬫椂闂�'))
+				} else if (new Date(value) <= new Date(this.form.reportEndTime)) {
+					callback(new Error('娲诲姩寮�濮嬫椂闂村繀椤绘櫄浜庢姤鍚嶇粨鏉熸椂闂�'))
+				} else {
+					callback()
+				}
+			},
+			numValidate(rule, value, callback) {
+				console.log(value)
+				if (value <= 0 || value > 1000) {
+					callback(new Error('浜烘暟鑼冨洿1-1000'));
+				} else {
+					callback();
+				}
+			},
+			// 楠岃瘉娲诲姩缁撴潫鏃堕棿
+			validateEndTime(rule, value, callback) {
+				if (!value) {
+					callback(new Error('璇烽�夋嫨娲诲姩缁撴潫鏃堕棿'))
+				} else if (new Date(value) <= new Date(this.form.startTime)) {
+					callback(new Error('娲诲姩缁撴潫鏃堕棿蹇呴』鏅氫簬寮�濮嬫椂闂�'))
+				} else {
+					callback()
+				}
+			},
+// "<p><img src="https://img.zcool.cn/community/01055859b8e37fa8012075341db67f.gif" alt="https://lmk-1356772813.cos.ap-chengdu.myqcloud.com/video/2025071011124230197.mp4|video/2025071011124230197.mp4" width="80%"><img src="https://lmk-1356772813.cos.ap-chengdu.myqcloud.com/image/2025071011130152914.jpg" alt="https://lmk-1356772813.cos.ap-chengdu.myqcloud.com/image/2025071011130152914.jpg|image/2025071011130152914.jpg" width="80%"></p><p><br></p><p><br></p>"
+			buildTag(html) {
+			  return html.replace(/<img([^>]*)>/gi, (imgTag) => {
+			    const srcMatch = imgTag.match(/src="([^"]*)"/i);
+			    const altMatch = imgTag.match(/alt="([^"]*)"/i);
+			    const widthMatch = imgTag.match(/width="([^"]*)"/i);
+			
+			    if (!srcMatch && !altMatch) return imgTag;
+			
+			    // 鍒嗗壊 alt 鍐呭锛堟牸寮忥細宸﹁竟|鍙宠竟锛�
+			    let newSrc = srcMatch ? srcMatch[1] : '';
+			    let newAlt = altMatch ? altMatch[1] : '';
+			    
+			    if (altMatch && altMatch[1].includes('|')) {
+			      const [leftPart, rightPart] = altMatch[1].split('|');
+			      newSrc = leftPart.trim();  // | 宸︿晶浣滀负 src
+			      newAlt = rightPart.trim(); // | 鍙充晶浣滀负 alt
+			    }
+			
+			    const width = widthMatch ? widthMatch[1] : "80%";
+			
+			    // 妫�娴嬫槸鍚︿负瑙嗛锛堝熀浜庢柊鐨� src锛�
+			    const isVideo = /\.(mp4|webm|ogg|mov)$/i.test(newSrc);
+			
+			    if (isVideo) {
+			      const extension = newSrc.split('.').pop().toLowerCase();
+			      return `<video width="${width}" alt="${newAlt}" src="${newSrc}" height="auto" controls="controls"></video>`;
+			    }
+			
+			    // 闈炶棰戯細鏇存柊 src 鍜� alt
+			    return `<img src="${newSrc}" alt="${newAlt}" width="${width}">`;
+			  });
+			},
+			escapeStringHTML(str) {
+			    if (!str) return str;
+			    str = str.replace(/&lt;/g, '<');
+			    str = str.replace(/&gt;/g, '>');
+			    return str;
+			  },
+			// 鎻愪氦琛ㄥ崟
+			async submitForm() {
+				// let html = '"<p><img src="https://img.zcool.cn/community/01055859b8e37fa8012075341db67f.gif" alt="video/2025070811142279476.mp4" width="80%"><img src="https://lmk-1356772813.cos.ap-chengdu.myqcloud.com/image/2025070811142783043.jpg" alt="image/2025070811142783043.jpg" width="80%">娴嬭瘯娲诲姩鍐呭</p><p><br></p><p><br></p>"'
+				// const temphtml2  = this.buildTag(html)
+				const temphtml2 = this.buildTag(this.form.activityContent)
+				this.form.activityContent = temphtml2;
+				this.$refs.uForm.validate(valid => {
+					if (valid) {
+						console.log("閫氳繃")
+						if (this.coverType === 'text') {
+							this.form.coverType = 'text';
+						}
+						
+						this.loading = true
+						// 璋冪敤API
+						addActivityByBuyer(this.form).then(res => {
+							console.log(res)
+							if (res.statusCode === 200) {
+								this.loading = false
+								uni.showToast({
+									title: res.data.msg, // 鎻愮ず鏂囧瓧
+									icon: 'none', // 鍥炬爣绫诲瀷锛坰uccess/loading/none锛�
+									mask: true // 鏄惁鏄剧ず閫忔槑钂欏眰锛堥槻姝㈣Е鎽哥┛閫忥級
+								});
+								setTimeout(() => {
+									uni.$emit('refreshParentPage');
+									uni.navigateBack();
+								}, 1500);
+
+							}
+						})
+
+
+					}
+				})
+
+			}
+
+
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.add-user-container {
+		width: 100%;
+		padding: 20rpx;
+		background-color: #f5f7fa;
+		min-height: 100vh;
+	}
+
+	.form-card {
+		background-color: #fff;
+		border-radius: 24rpx;
+		padding: 40rpx;
+		box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.08);
+		margin-bottom: 40rpx;
+
+		/* 琛ㄥ崟鏍囬鏍峰紡 */
+		.form-title {
+			font-size: 36rpx;
+			font-weight: 600;
+			color: #333;
+			margin-bottom: 40rpx;
+			text-align: center;
+			position: relative;
+
+			&:after {
+				content: '';
+				display: block;
+				width: 80rpx;
+				height: 6rpx;
+				background: linear-gradient(to right, #2979ff, #00bcd4);
+				margin: 20rpx auto 0;
+				border-radius: 3rpx;
+			}
+		}
+	}
+
+	/* 琛ㄥ崟椤规牱寮� */
+	.u-form-item {
+		padding: 28rpx 0;
+		margin-bottom: 10rpx;
+
+		/* 鏍囩鏍峰紡 */
+		::v-deep .u-form-item__body__left__content__label {
+			font-size: 30rpx;
+			color: #606266;
+			font-weight: 500;
+		}
+
+		/* 杈撳叆妗嗘牱寮� */
+		.u-input {
+			background-color: #f8f9fa;
+			border-radius: 12rpx;
+			padding: 20rpx 24rpx !important;
+
+			&__content__field-wrapper__field {
+				color: #333;
+				font-size: 28rpx;
+			}
+		}
+
+		/* 鍗曢�夌粍鏍峰紡 */
+		.u-radio-group {
+			margin-top: 10rpx;
+		}
+
+		.u-radio {
+			margin-bottom: 16rpx;
+
+			&__label {
+				font-size: 28rpx;
+				color: #606266;
+			}
+		}
+
+		/* 鏁板瓧杈撳叆妗嗘牱寮� */
+		.u-number-box {
+			margin-right: 20rpx;
+		}
+	}
+
+	/* 鏃堕棿閫夋嫨鍣ㄦ牱寮� */
+	.uni-datetime-picker {
+		width: 100%;
+
+		::v-deep .uniui-calendar {
+			color: #2979ff;
+		}
+
+		::v-deep .uni-datetime-picker-btn-cancel {
+			color: #999;
+		}
+
+		::v-deep .uni-datetime-picker-btn-confirm {
+			color: #2979ff;
+		}
+	}
+
+	/* 涓婁紶缁勪欢鏍峰紡 */
+	.u-upload {
+		::v-deep .u-upload__wrap {
+			padding: 0;
+		}
+
+		::v-deep .u-upload__button {
+			background-color: #f8f9fa;
+			border-radius: 12rpx;
+			color: #2979ff;
+			font-size: 28rpx;
+			height: 160rpx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			border: 1rpx dashed #dcdfe6;
+
+			&:active {
+				background-color: #f1f5f9;
+			}
+		}
+
+		::v-deep .u-upload__preview {
+			border-radius: 12rpx;
+			overflow: hidden;
+		}
+	}
+
+	/* 鎻愪氦鎸夐挳鏍峰紡 */
+	.submit-btn {
+		margin-top: 80rpx;
+		padding: 0 80rpx;
+
+		.u-button {
+			height: 90rpx;
+			font-size: 32rpx;
+			font-weight: 500;
+			letter-spacing: 2rpx;
+			background: linear-gradient(to right, #2979ff, #00bcd4);
+			box-shadow: 0 8rpx 24rpx rgba(41, 121, 255, 0.3);
+			transition: all 0.3s;
+
+			&:active {
+				transform: translateY(2rpx);
+				box-shadow: 0 4rpx 12rpx rgba(41, 121, 255, 0.3);
+			}
+		}
+	}
+
+	/* 搴曢儴璇存槑鏂囧瓧 */
+	.form-tips {
+		font-size: 24rpx;
+		color: #999;
+		text-align: center;
+		margin-top: 40rpx;
+		line-height: 1.6;
+	}
+</style>
\ No newline at end of file
diff --git a/pages/mine/activity/applayActivityList.vue b/pages/mine/activity/applayActivityList.vue
new file mode 100644
index 0000000..ad493fc
--- /dev/null
+++ b/pages/mine/activity/applayActivityList.vue
@@ -0,0 +1,370 @@
+<template>
+	<view class="container">
+		<view style="height:50rpx"></view>
+		<view class="add-button-container">
+			<button class="add-button" @click="handleAdd">
+				<u-icon name="plus" color="#fff" size="20"></u-icon>
+				<text>鏂板娲诲姩</text>
+			</button>
+		</view>
+		<u-empty v-if="mockData.length === 0 && !loading" mode="data"
+			icon="http://cdn.uviewui.com/uview/empty/data.png">
+		</u-empty>
+		<scroll-view scroll-y :lower-threshold="100" class="scroll-view-container">
+			<view v-for="(item, idx) in mockData" :key="idx" class="activity-item card" @click="handleItemClick(item)">
+				<view class="cover-container">
+					<block v-if="item.coverType === 'image' || item.coverType === 'video'">
+						<image :src="item.url" mode="aspectFill" class="activity-cover" />
+					</block>
+					<block v-if="item.coverType === 'text'">
+						<view class="activity-cover text-cover">{{ item.cover }}</view>
+					</block>
+				</view>
+
+				<!-- 娲诲姩淇℃伅 -->
+				<view class="activity-info">
+					<view class="info-header">
+						<view class="activity-title">{{ item.activityName }}</view>
+					</view>
+
+					<view class="activity-meta">
+						<view class="meta-item">
+							<u-icon name="calendar" size="16" color="#999"></u-icon>
+							<text class="activity-time">{{ item.startTime }} - {{ item.endTime }}</text>
+						</view>
+						<view class="meta-item">
+							<u-icon name="map" size="16" color="#999"></u-icon>
+							<text class="activity-location">{{ item.activityLocation || '寰呭畾' }}</text>
+						</view>
+					</view>
+				</view>
+			</view>
+			<!-- 鏀硅繘鐨勫姞杞芥洿澶氭彁绀� -->
+			<view class="load-more">
+				<u-loadmore :status="loading ? 'loading' : noMore ? 'nomore' : 'loadmore'" :load-text="{
+			            loadmore: '涓婃媺鍔犺浇鏇村',
+			            loading: '姝e湪鍔犺浇',
+			            nomore: '娌℃湁鏇村浜�'
+			          }" />
+			</view>
+			<view style="height:150rpx">
+
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	import TopBar from "@/components/TopBar.vue";
+	import '@/components/uview-components/uview-ui';
+	import {
+		addActivityByBuyer,
+		applyActivityPage
+	} from '@/api/activity.js'
+	export default {
+
+		data() {
+			return {
+				scrollViewTop: uni.upx2px(50 + 80 + 40), // 50rpx绌虹櫧 + 80rpx鎸夐挳 + 40rpx杈硅窛
+				scrollViewBottom: uni.upx2px(120), // 搴曢儴棰勭暀
+				query: {
+					pageNumber: 1,
+					pageSize: 5,
+
+				},
+				loading: false,
+				total: 0,
+				mockData: [],
+				noMore: false,
+			}
+		},
+		//涓嬫媺鍒锋柊
+		onPullDownRefresh() {
+			//鍒濆鍖栭〉闈㈠弬鏁�
+			this.mockData = [];
+			this.query.pageNumber = 1;
+			//璋冪敤鑾峰彇鏁版嵁鏂规硶
+			this.getPage()
+			setTimeout(() => {
+				//缁撴潫涓嬫媺鍒锋柊
+				uni.stopPullDownRefresh();
+			}, 1000);
+		},
+		onReachBottom() {
+			this.loadMore()
+		},
+		mounted() {
+
+		},
+		onLoad() {
+			this.getPage();
+			uni.$on('refreshParentPage', this.getPage);
+		},
+		onUnload() {
+			uni.$off('refreshParentPage', this.getPage);
+		},
+		methods: {
+			loadMore() {
+				// 鏄剧ず鍔犺浇鐘舵��
+				this.loading = true;
+
+				// 寤惰繜鎵ц璁︰I鏈夊弽搴旀椂闂�
+				setTimeout(() => {
+					this.query.pageNumber += 1;
+					this.getPage();
+				}, 300);
+			},
+			handleAdd() {
+				uni.navigateTo({
+					url: `/pages/mine/activity/addActivity` // 鍙傛暟閫氳繃 URL 浼犻��
+				});
+			},
+			handleItemClick(item) {
+				console.log(item)
+			},
+			async getPage() {
+				try {
+					const res = await applyActivityPage(this.query);
+					this.loading = false;
+					if (res.statusCode === 200) {
+						const newData = res.data.data;
+						// 鏇存柊鎬绘暟鎹噺
+						this.total = res.data.total || 0;
+						// 杩藉姞鎴栨浛鎹㈡暟鎹�
+						this.mockData = this.query.pageNumber === 1 ?
+							newData : [...this.mockData, ...newData];
+						// 鍒ゆ柇鏄惁杩樻湁鏇村鏁版嵁
+						this.noMore = newData.length < this.query.pageSize ||
+							this.mockData.length >= this.total;
+					}
+
+				} catch (error) {
+					console.error('鍔犺浇澶辫触:', error);
+					// 澶辫触鏃跺洖閫�椤电爜
+					if (this.query.pageNumber > 1) {
+						this.query.pageNumber -= 1;
+					}
+				} finally {
+					this.loading = false;
+					uni.hideLoading();
+					uni.stopPullDownRefresh();
+				}
+
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	/* 婊戝姩妗嗘牱寮忔暣浣撴牱寮忎紭鍖�*/
+	.scroll-view-container {
+		flex: 1;
+		overflow: hidden;
+		padding: 0 20rpx;
+		box-sizing: border-box;
+		/* 纭繚鍙互婊氬姩 */
+		-webkit-overflow-scrolling: touch;
+	}
+
+	.load-more {
+		padding: 20rpx 0;
+		text-align: center;
+		color: #999;
+		font-size: 26rpx;
+		background-color: #f8f9fa;
+	}
+
+	.container {
+		min-height: 100vh;
+		display: flex;
+		flex-direction: column;
+	}
+
+
+
+
+
+
+	/* 鏂板鎸夐挳鏍峰紡 */
+	.add-button-container {
+		padding: 20rpx 30rpx;
+		background-color: #f7f8fa;
+	}
+
+	.add-button {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		background-color: #2979ff;
+		color: #fff;
+		border-radius: 50rpx;
+		height: 80rpx;
+		line-height: 80rpx;
+		font-size: 30rpx;
+		box-shadow: 0 4rpx 12rpx rgba(41, 121, 255, 0.3);
+
+		.u-icon {
+			margin-right: 10rpx;
+		}
+
+		&::after {
+			border: none;
+		}
+
+		&:active {
+			background-color: #1a6eff;
+			transform: scale(0.98);
+		}
+	}
+
+	.container {
+		padding: 0;
+		background-color: #f7f8fa;
+		height: auto;
+	}
+
+
+	/* 娲诲姩鍒楄〃鏍峰紡 */
+	.activity-list {
+		padding: 20rpx 24rpx;
+	}
+
+	.card {
+		background: #fff;
+		border-radius: 16rpx;
+		margin-bottom: 24rpx;
+		overflow: hidden;
+		box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.04);
+		transition: transform 0.2s ease, box-shadow 0.2s ease;
+
+		&:active {
+			transform: scale(0.98);
+			box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.08);
+		}
+	}
+
+	.activity-item {
+		display: flex;
+		padding: 24rpx;
+	}
+
+	.cover-container {
+		position: relative;
+		width: 200rpx;
+		height: 200rpx;
+		border-radius: 12rpx;
+		overflow: hidden;
+		margin-right: 24rpx;
+		flex-shrink: 0;
+	}
+
+	.activity-cover {
+		width: 100%;
+		height: 100%;
+		border-radius: 12rpx;
+	}
+
+	.text-cover {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%);
+		color: #fff;
+		font-size: 28rpx;
+		padding: 16rpx;
+		line-height: 1.4;
+	}
+
+	.activity-info {
+		flex: 1;
+		display: flex;
+		flex-direction: column;
+	}
+
+	.info-header {
+		display: flex;
+		justify-content: space-between;
+		align-items: flex-start;
+		margin-bottom: 16rpx;
+	}
+
+	.activity-title {
+		flex: 1;
+		font-size: 32rpx;
+		color: #333;
+		font-weight: 500;
+		margin-right: 16rpx;
+		display: -webkit-box;
+		-webkit-box-orient: vertical;
+		-webkit-line-clamp: 2;
+		overflow: hidden;
+		line-height: 1.4;
+	}
+
+	.activity-meta {
+		font-size: 24rpx;
+		color: #999;
+		margin-bottom: 16rpx;
+	}
+
+	.meta-item {
+		display: flex;
+		align-items: center;
+		margin-bottom: 12rpx;
+
+		.u-icon {
+			margin-right: 8rpx;
+		}
+	}
+
+	.activity-status {
+		font-size: 24rpx;
+		padding: 6rpx 16rpx;
+		border-radius: 20rpx;
+		flex-shrink: 0;
+
+		&.signed {
+			color: #2979ff;
+			background-color: rgba(41, 121, 255, 0.1);
+		}
+
+		&.ended {
+			color: #909399;
+			background-color: rgba(144, 147, 153, 0.1);
+		}
+
+		&.canceled {
+			color: #fa3534;
+			background-color: rgba(250, 53, 52, 0.1);
+		}
+	}
+
+	/* 鎿嶄綔鎸夐挳 */
+	.action-container {
+		display: flex;
+		justify-content: flex-end;
+		margin-top: auto;
+		padding-top: 16rpx;
+	}
+
+	.cancel-btn {
+		background: #fef0f0;
+		color: #fa3534;
+		border: none;
+		border-radius: 40rpx;
+		padding: 0 32rpx;
+		height: 64rpx;
+		line-height: 64rpx;
+		font-size: 26rpx;
+		transition: all 0.3s ease;
+
+		&::after {
+			border: none;
+		}
+
+		&.cancel-btn-hover {
+			background: #fde2e2;
+			transform: scale(0.98);
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/pages/mine/activity/reportActivity.vue b/pages/mine/activity/reportActivity.vue
index 35a3f4e..78ff7c2 100644
--- a/pages/mine/activity/reportActivity.vue
+++ b/pages/mine/activity/reportActivity.vue
@@ -2,9 +2,9 @@
 	<view class="wrapper">
 		<top-bar selectedTitleIndex="activity" textColor="black" @changeTab="topBarChange" class="topBar"></top-bar>
 
-		<view style="height: 100rpx;margin-top: 50px"></view>
+		<view style="height: 50rpx;margin-top: 50px"></view>
 		<!-- 鍐呭鍖哄煙 -->
-		<scroll-view scroll-y class="content" style="height: 40vh;" @scrolltolower="loadMore" :lower-threshold="100">
+		<scroll-view scroll-y class="scroll-view-container" style="height: 40vh;" @scrolltolower="loadMore" :lower-threshold="100">
 			<view class="waterfall">
 				<view class="column" v-for="(column, index) in columns" :key="index">
 					<!-- 閬嶅巻姣忓垪鍐呭 -->
@@ -165,7 +165,7 @@
 					[]
 				];
 				this.colHeight = [0, 0];
-
+				
 				this.mockData.forEach(item => {
 					const minIndex = this.colHeight.indexOf(Math.min(...this.colHeight));
 					this.columns[minIndex].push(item); //鑾峰緱楂樺害鏇村皬鐨� 鏀惧叆鍏冪礌
@@ -223,15 +223,6 @@
 		font-size: 26rpx;
 		background-color: #f8f9fa;
 	}
-
-	.btn-container {
-		display: flex;
-		justify-content: center;
-		align-items: center;
-		margin-top: 8px;
-		/* 涓庝笂鏂规爣棰樹繚鎸侀棿璺� */
-	}
-
 	/* 鍏ㄥ眬鏍峰紡浼樺寲 */
 	.wrapper {
 		height: 100vh;
@@ -240,13 +231,9 @@
 		background-color: #f8f9fa;
 	}
 
-	/* 瀵艰埅鏍忎紭鍖� */
-	.u-navbar {
-		box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
-	}
 
 	/* 鍐呭鍖哄煙浼樺寲 */
-	.content {
+	.scroll-view-container {
 		flex: 1;
 		overflow: hidden;
 		padding: 0 20rpx;
diff --git a/pages/news/news.vue b/pages/news/news.vue
index 1a11a47..d7d1bf7 100644
--- a/pages/news/news.vue
+++ b/pages/news/news.vue
@@ -1,8 +1,13 @@
 <template>
 	<view class="wrapper">
 		<view style="height: 100rpx"></view>
+		<u-empty v-if="mockData.length === 0 && !loading"
+		         mode="data" 
+		         icon="http://cdn.uviewui.com/uview/empty/data.png">
+		</u-empty>
 		<!-- 鍐呭鍖哄煙 -->
 		<scroll-view scroll-y class="content" style="height: 40vh;" @scrolltolower="loadMore" :lower-threshold="100">
+			
 			<view class="waterfall">
 			
 					<view class="item" v-for="(item, idx) in mockData" :key="item.id" @click="handleItemClick(item)">
diff --git a/pages/tabbar/user/utils/tool.vue b/pages/tabbar/user/utils/tool.vue
index d2e4e9d..b1c458b 100644
--- a/pages/tabbar/user/utils/tool.vue
+++ b/pages/tabbar/user/utils/tool.vue
@@ -51,6 +51,12 @@
 						<image src="/static/mine/shensu.png" mode=""></image>
 						<view>鎴戠殑娲诲姩</view>
 					</view> -->
+					</view>
+
+					<view class="interact-item" @click="navigateTo('/pages/mine/activity/applayActivityList')">
+						<image src="/static/mine/shensu.png" mode=""></image>
+						<view>鐢宠娲诲姩</view>
+					</view>
 
 <!-- 					<view class="interact-item" @click="navigateTo('/pages/mine/myCollect/myCollect')">
 						<image src="/static/mine/shensu.png" mode=""></image>
@@ -61,7 +67,7 @@
 						<image src="/static/mine/shensu.png" mode=""></image>
 						<view>鐢ㄦ埛鏉冮檺</view>
 					</view>
-					<view class="interact-item" v-if="isStoreManger" @click="navigateTo('/pages/news/news')">
+					<view class="interact-item"  @click="navigateTo('/pages/news/news')">
 						<image src="/static/mine/shensu.png" mode=""></image>
 						<view>鏂伴椈</view>
 					</view>
diff --git a/uni_modules/sp-editor/changelog.md b/uni_modules/sp-editor/changelog.md
new file mode 100644
index 0000000..b2ab113
--- /dev/null
+++ b/uni_modules/sp-editor/changelog.md
@@ -0,0 +1,131 @@
+## 1.5.0锛�2024-11-01锛�
+1. 鏇存柊寮圭獥涓娇鐢ㄧ殑绀轰緥
+## 1.4.9锛�2024-08-30锛�
+1. 淇鍦╝pp绔拰灏忕▼搴忕鎻掑叆瓒呴摼鎺ュ彲鑳戒細鍥炴樉鍑洪儴鍒嗙壒娈婃爣璇嗙殑bug
+## 1.4.8锛�2024-08-16锛�
+1. 鏈夌兢鍙嬪弽棣堬紝閫氳繃wangEditor娣诲姞鐨勫惈鏈夊浘鐗囩殑瀵屾枃鏈殑瀹介珮鏄湪style鍐呰仈鏍峰紡涓殑锛屼絾鏄痷ni-editor涓嶈兘瑙f瀽img鏍囩鐨勫唴鑱斿楂橈紝鍥犳鎴戝皝瑁呬竴涓伐鍏锋柟娉昪onvertImgStylesToAttributes锛屽鐞嗕竴涓嬪瘜鏂囨湰瀛楃涓插嵆鍙紝璇﹁绀轰緥涓�
+## 1.4.7锛�2024-08-12锛�
+1. 鏂板鏍囬銆佸瓧浣撱�佸瓧浣撳ぇ灏忋�佸瓧闂磋窛娈靛墠鍚庤窛绛夊伐鍏峰瓙绾ф偓娴伐鍏锋爮
+2. 瀵逛簬瀛椾綋鏍峰紡锛氬彲鍦ㄧ粍浠剁殑data涓殑fabTools.fontFamily涓嚜琛屽紩鍏ユ坊鍔犱綘鏈湴鐨勮嚜瀹氫箟瀛椾綋锛坅pp涓浜庨儴鍒哻ss鑷甫鐨勫瓧浣撲緥濡傚井杞泤榛戠瓑涓嶆敮鎸侊紝鍥犱负app涓笉鑷甫杩欎簺瀛椾綋锛屼綘鍙兘闇�瑕佽嚜琛屽紩鍏ュ瓧浣撴枃浠讹級
+## 1.4.6锛�2024-08-08锛�
+1. 淇瀛椾綋宸ュ叿鏍忔棤娉曢殣钘忕殑bug
+## 1.4.5锛�2024-07-21锛�
+1. 瑙e喅video鍥炬爣鍐茬獊闂
+## 1.4.4锛�2024-07-20锛�
+1. 鏂板瑙嗛鎻掑叆鍔熻兘
+2. 鏇存柊绀轰緥涓�锛堝叧浜庤棰戞彃鍏ュ弬鑰冭瑙佺ず渚嬩竴锛�
+## 1.4.3锛�2024-07-16锛�
+1. 鏇存柊绀轰緥宸ョ▼
+## 1.4.2锛�2024-07-16锛�
+1. 鏇存柊绀轰緥宸ョ▼
+## 1.4.1锛�2024-06-14锛�
+1. 鏇存柊绀轰緥宸ョ▼
+## 1.4.0锛�2024-05-31锛�
+1. 鏇存柊绀轰緥宸ョ▼
+## 1.3.9锛�2024-05-31锛�
+1. 淇璋冭壊鏉挎棤娉曟甯搁�夎壊鐨勯棶棰�
+## 1.3.8锛�2024-05-13锛�
+1. 鏇存柊绀轰緥涓夛紙寰俊灏忕▼搴忎笂浣跨敤setContents閫犳垚鑱氱劍婊氬姩鐨勫鐞嗭級
+## 1.3.7锛�2024-05-10锛�
+1. 淇娣诲姞瓒呴摼鎺ュ悗锛屼笉瑙﹀彂input鏇存柊褰撳墠鏈�鏂板唴瀹圭殑bug
+## 1.3.6锛�2024-05-09锛�
+1. 鏂囨。杩佺Щ
+## 1.3.5锛�2024-05-09锛�
+1. 鎵�鏈変簨浠舵惡甯︾紪杈戝櫒id鍙傛暟锛屼互渚垮惊鐜椂鑳藉尯鍒嗗鐞�
+2. 鏇存柊绀轰緥宸ョ▼
+## 1.3.4锛�2024-05-08锛�
+1. 鏇存柊绀轰緥宸ョ▼
+2. 鏂板editorId鍙傛暟
+## 1.3.3锛�2024-03-22锛�
+1. 淇寰俊灏忕▼搴忛暱鎸夋棤娉曠矘璐寸殑闂
+## 1.3.2锛�2024-03-14锛�
+1. 鏇存柊浜唗oolbar鏍峰紡涓庨厤缃紝瑙佹枃妗�
+2. 鏇存柊绀轰緥宸ョ▼锛屽獟浣撴煡璇㈠搷搴斿紡鍐欐硶
+3. 浼樺寲浜嗗彧璇绘ā寮忔晥鏋滐紝寮�鍚彧璇绘ā寮忓悗锛屾枃绔犲唴瀹圭殑瓒呴摼鎺ュ彲姝e父鐐瑰嚮骞惰烦杞�
+## 1.3.1锛�2024-03-14锛�
+1. 浼樺寲浜嗗彧璇诲姛鑳斤紝寮�鍚彧璇诲悗鑷姩闅愯棌宸ュ叿鏍�
+2. 鏇存柊绀轰緥宸ョ▼
+## 1.3.0锛�2024-03-07锛�
+1. 鏂板addLink鐨別mit浜嬩欢
+## 1.2.9锛�2024-02-23锛�
+1. 鏇存柊鏂囨。
+## 1.2.8锛�2024-02-23锛�
+1. 鏂板浜嗘坊鍔犺秴閾炬帴鐨勫伐鍏凤紝toolbar涓璴ink瀛楁锛岄粯璁ゅ紑鍚�
+2. 浼樺寲浜嗛儴鍒嗛�昏緫
+3. 鏇存柊鏂囨。銆佹洿鏂扮ず渚嬪伐绋�
+## 1.2.7锛�2024-02-23锛�
+1. 鏇存柊鏂囨。锛屾洿鏂扮ず渚嬪伐绋�
+2. 娣诲姞toolbar涓浘鏍囧瓧浣撳ぇ灏忓彲閰嶇疆椤�
+## 1.2.6锛�2024-02-22锛�
+1. 娣诲姞瀵煎嚭宸ュ叿鎸夐挳锛屽彲灏嗗綋鍓嶅凡缂栬緫鐨刪tml瀵煎嚭鑷抽〉闈㈣В鏋�
+2. 瓒呴摼鎺ュ伐鍏锋寜閽鍦ㄥ皾璇曞紑鍙戜腑(璨屼技鐩墠瀹樻柟涓嶆敮鎸�)
+## 1.2.5锛�2024-02-19锛�
+1. 鏇存柊绀轰緥宸ョ▼(鍚搁《鍐欐硶)
+2. 瀹屽杽璋冭壊鏉垮姛鑳�
+## 1.2.4锛�2024-02-18锛�
+1. 淇宸ュ叿鏍忛鑹叉寜閽簳鑹插姩鎬佸垏鎹㈤棶棰�
+## 1.2.3锛�2024-02-18锛�
+1. 鏇存柊绀轰緥宸ョ▼
+## 1.2.2锛�2024-02-18锛�
+1. 鍒犻櫎log璋冭瘯鎵撳嵃
+## 1.2.1锛�2024-02-18锛�
+1. 淇浜嗛鑹插浘鏍囦笉浼氬姩鎬佸垏鎹㈢殑闂
+## 1.2.0锛�2024-02-18锛�
+1. 淇閫夋嫨棰滆壊鏃朵細灏嗘墍閫夋枃瀛楀垹闄ょ殑bug
+## 1.1.9锛�2024-02-04锛�
+1. 鏇存柊绀轰緥宸ョ▼
+## 1.1.8锛�2024-02-04锛�
+1. 鏂囨。淇敼
+## 1.1.7锛�2024-02-04锛�
+1. 鏂板toolbar閰嶇疆椤癸紝鍙嚜鐢遍厤缃伐鍏锋爮宸ュ叿鍒楄〃
+2. 绉婚櫎缁勪欢鍐呭師templates灞炴�э紝榛樿鍒濆鍖栫紪杈戝櫒鍐呭璇风湅鏂囨。浣跨敤鏂瑰紡绀轰緥
+3. 鏇存柊鏂囨。
+## 1.1.6锛�2024-01-31锛�
+1. 鏇村ソ鐨勫吋瀹箆ue2浜嗭紝淇鍦╲ue2涓嬮珮搴﹀彲鑳借秴鍑虹殑闂
+2. 绀轰緥宸ョ▼鍏煎vue2
+## 1.1.5锛�2024-01-30锛�
+1. 淇宸ュ叿鏍忓瓧浣撴寜閽棤鏁堢殑闂
+## 1.1.4锛�2024-01-30锛�
+1. 瑙e喅榛樿鍒濆鍖栧唴瀹规椂鍓嶇紑绌烘牸鎴栫缉杩涙棤鏁堢殑闂
+2. 瑙e喅鐐瑰嚮宸ュ叿鏍忛珮浜姸鎬佸悗杈撳叆鍐呭鏃朵究澶卞幓楂樹寒鐨刡ug
+3. 鏇存柊绀轰緥宸ョ▼
+## 1.1.3锛�2024-01-23锛�
+1. 閲嶅啓楂樺害鍔ㄦ�佽绠楅�昏緫锛岀幇鍦ㄥ涓嶅悓灞忓箷灏哄鐨勯�傚簲鎬ф洿寮轰簡
+## 1.1.2锛�2024-01-17锛�
+1. 淇鍒嗗壊绾夸細鐢熸垚澶氭潯鐨勯棶棰�
+## 1.1.1锛�2024-01-15锛�
+1. 鏇存柊鏂囨。
+## 1.1.0锛�2024-01-15锛�
+1. insertText鏂规硶鍦ㄦ彃鍏ュ唴瀹圭殑鏃跺�欎細绉诲姩鍏夋爣鑱氱劍锛屽鑷寸劍鐐瑰洖婊氬埌瑙嗗彛澶�
+2. 鏇存柊绀轰緥宸ョ▼
+## 1.0.9锛�2024-01-04锛�
+1. 鏇存柊鏂囨。
+## 1.0.8锛�2024-01-04锛�
+1. 淇h5绔畼鏂筩dn璇锋眰澶辫触鐨勯棶棰橈紝璇﹁闂瓟璐达細https://ask.dcloud.net.cn/article/40900
+## 1.0.7锛�2024-01-03锛�
+1.  绉婚櫎v-bind="$attrs"锛岃鍐欐硶鍦ㄥ井淇″皬绋嬪簭涓嶆敮鎸�
+## 1.0.6锛�2023-12-29锛�
+1. 鏇存柊鏂囨。
+## 1.0.5锛�2023-12-29锛�
+1. 鏇存柊浜唅nit鏂规硶锛屽彲浠ヤ娇鐢ㄨ繑鍥炵殑editor瀹炰緥灏芥儏鑷畾涔�
+2. 缁勪欢鍦�<editor>涓婃坊鍔爒-bind="$attrs"灞炴�х┛閫忥紝鍙互浣跨敤鍘焑ditor鍙傛暟锛屽畼鏂规枃妗o細https://uniapp.dcloud.net.cn/component/editor.html
+## 1.0.4锛�2023-12-29锛�
+1. 浼樺寲浜嗗垏鎹㈡枃瀛楀拰鑳屾櫙棰滆壊鏄紝鍙兘浼氬鑷村垏鎹㈠悗涓嶇敓鏁堢殑闂
+2. 淇鍦ㄩ儴鍒嗚澶囦笂鐨勫井淇″皬绋嬪簭涓彲鑳戒細瀛樺湪棰滆壊鐗堟棤娉曟甯告粦鍔ㄧ殑闂
+3. 鏇村弸濂界殑浜や簰浣撻獙锛氭坊鍔犲浘鏍囨偓鍋滃瓧鏍锋弿杩般�佹坊鍔犳牸寮忓寲鏂囨湰寮圭獥纭
+4. 鏈夋彃鍏ヨ棰戠殑闇�姹傦紝鏆傛椂鍙兘鏃犳硶瀹炵幇锛屽畼鏂圭粰浜堢殑鍥炲鏄細鐩墠鍚勭鐨別idtor缁勪欢閮戒笉鑳界洿鎺ユ彃鍏ヨ棰戯紝缂栬緫鏃跺彲浠ラ噰鐢ㄨ棰戝皝闈㈠崰浣嶏紝骞跺湪鍥剧墖涓繚瀛樿棰戜俊鎭紝鍦ㄩ瑙堟椂鍐嶈繕鍘熶负瑙嗛銆�
+## 1.0.3锛�2023-10-13锛�
+	1. 鏇存柊readme鏂囨。
+	2. 鏇存柊璋冩暣缁勪欢绀轰緥椤圭洰锛屾坊鍔犳彃浠朵唬鐮佷腑閮ㄥ垎娉ㄩ噴
+## 1.0.2锛�2023-10-13锛�
+	1. 鏇存柊uni_modules瑙勮寖锛屽彲涓�閿鍏ョ粍浠�
+	2. 鏇存柊缁勪欢绀轰緥椤圭洰锛堝寘鎷娇鐢╱niCloud.uploadFile澶氶�変笂浼犲浘鐗囩ず渚嬫柟娉曪級
+## 1.0.1锛�2023-10-12锛�
+	1. 淇灏忕▼搴忎腑鑷姩鑱氱劍婊氬姩鍒板瘜鏂囨湰缁勪欢鍖哄煙鐨刡ug
+	2. 鐣ュ井璋冩暣浜嗗瘜鏂囨湰涓婃柟toolbar宸ュ叿鏍忎腑鎸夐挳鐨勫ぇ灏忓昂瀵�
+## 1.0.0锛�2023-9-19锛�
+	1. 鏂板瀛椾綋涓庤儗鏅鑹叉澘
+	2. 鍙嚜瀹氫箟棰勮鍐呭妯℃澘
+	3. 瑙e喅瀹樻柟鏍蜂緥鍦ㄥ皬绋嬪簭鍜宎pp閮ㄥ垎鎶ラ敊涓嶅吋瀹圭殑闂
+	4. 鍙厤鍚堜簯瀛樺偍涓婁紶瀵屾枃鏈腑鎻掑叆鐨勫浘鐗� 鏈川涓婃槸鍩轰簬瀹樻柟鍐呯疆瀵屾枃鏈琫ditor缁勪欢鏀圭増灏佽锛屾墍浠ュ畼鏂规湁鐨勫姛鑳介兘鏈夛紝瀹樻柟鑳藉吋瀹圭殑涔熼兘鍏煎
+
diff --git a/uni_modules/sp-editor/components/sp-editor/color-picker.vue b/uni_modules/sp-editor/components/sp-editor/color-picker.vue
new file mode 100644
index 0000000..6f3e77d
--- /dev/null
+++ b/uni_modules/sp-editor/components/sp-editor/color-picker.vue
@@ -0,0 +1,825 @@
+<template>
+  <view v-if="show" class="t-wrapper" @touchmove.stop.prevent="moveHandle">
+    <view class="t-mask" :class="{ active: active }" @click.stop="close"></view>
+    <view class="t-box" :class="{ active: active }">
+      <view class="t-header">
+        <view class="t-header-button" @click="close">鍙栨秷</view>
+        <view class="t-header-button" @click="confirm">纭</view>
+      </view>
+      <view class="t-color__box" :style="{ background: 'rgb(' + bgcolor.r + ',' + bgcolor.g + ',' + bgcolor.b + ')' }">
+        <view
+          class="t-background boxs"
+          @touchstart="touchstart($event, 0)"
+          @touchmove="touchmove($event, 0)"
+          @touchend="touchend($event, 0)"
+        >
+          <view class="t-color-mask"></view>
+          <view class="t-pointer" :style="{ top: site[0].top - 8 + 'px', left: site[0].left - 8 + 'px' }"></view>
+        </view>
+      </view>
+      <view class="t-control__box">
+        <view class="t-control__color">
+          <view
+            class="t-control__color-content"
+            :style="{ background: 'rgba(' + rgba.r + ',' + rgba.g + ',' + rgba.b + ',' + rgba.a + ')' }"
+          ></view>
+        </view>
+        <view class="t-control-box__item">
+          <view
+            class="t-controller boxs"
+            @touchstart="touchstart($event, 1)"
+            @touchmove="touchmove($event, 1)"
+            @touchend="touchend($event, 1)"
+          >
+            <view class="t-hue">
+              <view class="t-circle" :style="{ left: site[1].left - 12 + 'px' }"></view>
+            </view>
+          </view>
+          <view
+            class="t-controller boxs"
+            @touchstart="touchstart($event, 2)"
+            @touchmove="touchmove($event, 2)"
+            @touchend="touchend($event, 2)"
+          >
+            <view class="t-transparency">
+              <view class="t-circle" :style="{ left: site[2].left - 12 + 'px' }"></view>
+            </view>
+          </view>
+        </view>
+      </view>
+      <view class="t-result__box">
+        <view v-if="mode" class="t-result__item">
+          <view class="t-result__box-input">{{ hex }}</view>
+          <view class="t-result__box-text">HEX</view>
+        </view>
+        <template v-else>
+          <view class="t-result__item">
+            <view class="t-result__box-input">{{ rgba.r }}</view>
+            <view class="t-result__box-text">R</view>
+          </view>
+          <view class="t-result__item">
+            <view class="t-result__box-input">{{ rgba.g }}</view>
+            <view class="t-result__box-text">G</view>
+          </view>
+          <view class="t-result__item">
+            <view class="t-result__box-input">{{ rgba.b }}</view>
+            <view class="t-result__box-text">B</view>
+          </view>
+          <view class="t-result__item">
+            <view class="t-result__box-input">{{ rgba.a }}</view>
+            <view class="t-result__box-text">A</view>
+          </view>
+        </template>
+
+        <view class="t-result__item t-select" @click="select">
+          <view class="t-result__box-input">
+            <view>鍒囨崲</view>
+            <view>妯″紡</view>
+          </view>
+        </view>
+      </view>
+      <view class="t-alternative">
+        <view class="t-alternative__item" v-for="(item, index) in colorList" :key="index">
+          <view
+            class="t-alternative__item-content"
+            :style="{ background: 'rgba(' + item.r + ',' + item.g + ',' + item.b + ',' + item.a + ')' }"
+            @click="selectColor(item)"
+          ></view>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  props: {
+    color: {
+      type: Object,
+      default: () => {
+        return {
+          r: 0,
+          g: 0,
+          b: 0,
+          a: 0
+        }
+      }
+    },
+    spareColor: {
+      type: Array,
+      default() {
+        return []
+      }
+    }
+  },
+  data() {
+    return {
+      show: false,
+      active: false,
+      // rgba 棰滆壊
+      rgba: {
+        r: 0,
+        g: 0,
+        b: 0,
+        a: 1
+      },
+      // hsb 棰滆壊
+      hsb: {
+        h: 0,
+        s: 0,
+        b: 0
+      },
+      site: [
+        {
+          top: 0,
+          left: 0
+        },
+        {
+          left: 0
+        },
+        {
+          left: 0
+        }
+      ],
+      index: 0,
+      bgcolor: {
+        r: 255,
+        g: 0,
+        b: 0,
+        a: 1
+      },
+      hex: '#000000',
+      mode: true,
+      colorList: [
+        {
+          r: 244,
+          g: 67,
+          b: 54,
+          a: 1
+        },
+        {
+          r: 233,
+          g: 30,
+          b: 99,
+          a: 1
+        },
+        {
+          r: 156,
+          g: 39,
+          b: 176,
+          a: 1
+        },
+        {
+          r: 103,
+          g: 58,
+          b: 183,
+          a: 1
+        },
+        {
+          r: 63,
+          g: 81,
+          b: 181,
+          a: 1
+        },
+        {
+          r: 33,
+          g: 150,
+          b: 243,
+          a: 1
+        },
+        {
+          r: 3,
+          g: 169,
+          b: 244,
+          a: 1
+        },
+        {
+          r: 0,
+          g: 188,
+          b: 212,
+          a: 1
+        },
+        {
+          r: 0,
+          g: 150,
+          b: 136,
+          a: 1
+        },
+        {
+          r: 76,
+          g: 175,
+          b: 80,
+          a: 1
+        },
+        {
+          r: 139,
+          g: 195,
+          b: 74,
+          a: 1
+        },
+        {
+          r: 205,
+          g: 220,
+          b: 57,
+          a: 1
+        },
+        {
+          r: 255,
+          g: 235,
+          b: 59,
+          a: 1
+        },
+        {
+          r: 255,
+          g: 193,
+          b: 7,
+          a: 1
+        },
+        {
+          r: 255,
+          g: 152,
+          b: 0,
+          a: 1
+        },
+        {
+          r: 255,
+          g: 87,
+          b: 34,
+          a: 1
+        },
+        {
+          r: 121,
+          g: 85,
+          b: 72,
+          a: 1
+        },
+        {
+          r: 158,
+          g: 158,
+          b: 158,
+          a: 1
+        },
+        {
+          r: 0,
+          g: 0,
+          b: 0,
+          a: 0.5
+        },
+        {
+          r: 0,
+          g: 0,
+          b: 0,
+          a: 0
+        }
+      ]
+    }
+  },
+  created() {
+    this.ready()
+  },
+  methods: {
+    ready() {
+      this.rgba = this.color
+      if (this.spareColor.length !== 0) {
+        this.colorList = this.spareColor
+      }
+    },
+    /**
+     * 鍒濆鍖�
+     */
+    init() {
+      // hsb 棰滆壊
+      this.hsb = this.rgbToHex(this.rgba)
+      // this.setColor();
+      this.setValue(this.rgba)
+    },
+    moveHandle() {},
+    open() {
+      this.show = true
+      this.$nextTick(() => {
+        this.init()
+        setTimeout(() => {
+          this.active = true
+          setTimeout(() => {
+            this.getSelectorQuery()
+          }, 350)
+        }, 50)
+      })
+    },
+    close() {
+      this.active = false
+      this.$nextTick(() => {
+        setTimeout(() => {
+          this.show = false
+        }, 500)
+      })
+    },
+    confirm() {
+      this.close()
+      this.$emit('confirm', {
+        rgba: this.rgba,
+        hex: this.hex
+      })
+    },
+    // 閫夋嫨妯″紡
+    select() {
+      this.mode = !this.mode
+    },
+    // 甯哥敤棰滆壊閫夋嫨
+    selectColor(item) {
+      this.setColorBySelect(item)
+    },
+    touchstart(e, index) {
+      const { pageX, pageY, clientX, clientY } = e.touches[0]
+      // 閮ㄥ垎鏈哄瀷鍙兘娌℃湁pageX鎴朿lientX锛屽洜姝ゆ澶勯渶瑕佸仛鍏煎
+      this.moveX = clientX || pageX
+      this.moveY = clientY || pageY
+      this.setPosition(this.moveX, this.moveY, index)
+    },
+    touchmove(e, index) {
+      const { pageX, pageY, clientX, clientY } = e.touches[0]
+      this.moveX = clientX || pageX
+      this.moveY = clientY || pageY
+      this.setPosition(this.moveX, this.moveY, index)
+    },
+    touchend(e, index) {},
+    /**
+     * 璁剧疆浣嶇疆
+     */
+    setPosition(x, y, index) {
+      this.index = index
+      const { top, left, width, height } = this.position[index]
+      // 璁剧疆鏈�澶ф渶灏忓��
+
+      this.site[index].left = Math.max(0, Math.min(parseInt(x - left), width))
+      if (index === 0) {
+        this.site[index].top = Math.max(0, Math.min(parseInt(y - top), height))
+        // 璁剧疆棰滆壊
+        this.hsb.s = parseInt((100 * this.site[index].left) / width)
+        this.hsb.b = parseInt(100 - (100 * this.site[index].top) / height)
+        this.setColor()
+        this.setValue(this.rgba)
+      } else {
+        this.setControl(index, this.site[index].left)
+      }
+    },
+    /**
+     * 璁剧疆 rgb 棰滆壊
+     */
+    setColor() {
+      const rgb = this.HSBToRGB(this.hsb)
+      this.rgba.r = rgb.r
+      this.rgba.g = rgb.g
+      this.rgba.b = rgb.b
+    },
+    /**
+     * 璁剧疆浜岃繘鍒堕鑹�
+     * @param {Object} rgb
+     */
+    setValue(rgb) {
+      this.hex = '#' + this.rgbToHex(rgb)
+    },
+    setControl(index, x) {
+      const { top, left, width, height } = this.position[index]
+
+      if (index === 1) {
+        this.hsb.h = parseInt((360 * x) / width)
+        this.bgcolor = this.HSBToRGB({
+          h: this.hsb.h,
+          s: 100,
+          b: 100
+        })
+        this.setColor()
+      } else {
+        this.rgba.a = (x / width).toFixed(1)
+      }
+      this.setValue(this.rgba)
+    },
+    /**
+     * rgb 杞� 浜岃繘鍒� hex
+     * @param {Object} rgb
+     */
+    rgbToHex(rgb) {
+      let hex = [rgb.r.toString(16), rgb.g.toString(16), rgb.b.toString(16)]
+      hex.map(function (str, i) {
+        if (str.length == 1) {
+          hex[i] = '0' + str
+        }
+      })
+      return hex.join('')
+    },
+    setColorBySelect(getrgb) {
+      const { r, g, b, a } = getrgb
+      let rgb = {}
+      rgb = {
+        r: r ? parseInt(r) : 0,
+        g: g ? parseInt(g) : 0,
+        b: b ? parseInt(b) : 0,
+        a: a ? a : 0
+      }
+      this.rgba = rgb
+      this.hsb = this.rgbToHsb(rgb)
+      this.changeViewByHsb()
+    },
+    changeViewByHsb() {
+      const [a, b, c] = this.position
+      this.site[0].left = parseInt((this.hsb.s * a.width) / 100)
+      this.site[0].top = parseInt(((100 - this.hsb.b) * a.height) / 100)
+      this.setColor(this.hsb.h)
+      this.setValue(this.rgba)
+      this.bgcolor = this.HSBToRGB({
+        h: this.hsb.h,
+        s: 100,
+        b: 100
+      })
+
+      this.site[1].left = (this.hsb.h / 360) * b.width
+      this.site[2].left = this.rgba.a * c.width
+    },
+    /**
+     * hsb 杞� rgb
+     * @param {Object} 棰滆壊妯″紡  H(hues)琛ㄧず鑹茬浉锛孲(saturation)琛ㄧず楗卞拰搴︼紝B锛坆rightness锛夎〃绀轰寒搴�
+     */
+    HSBToRGB(hsb) {
+      let rgb = {}
+      let h = Math.round(hsb.h)
+      let s = Math.round((hsb.s * 255) / 100)
+      let v = Math.round((hsb.b * 255) / 100)
+      if (s == 0) {
+        rgb.r = rgb.g = rgb.b = v
+      } else {
+        let t1 = v
+        let t2 = ((255 - s) * v) / 255
+        let t3 = ((t1 - t2) * (h % 60)) / 60
+        if (h == 360) h = 0
+        if (h < 60) {
+          rgb.r = t1
+          rgb.b = t2
+          rgb.g = t2 + t3
+        } else if (h < 120) {
+          rgb.g = t1
+          rgb.b = t2
+          rgb.r = t1 - t3
+        } else if (h < 180) {
+          rgb.g = t1
+          rgb.r = t2
+          rgb.b = t2 + t3
+        } else if (h < 240) {
+          rgb.b = t1
+          rgb.r = t2
+          rgb.g = t1 - t3
+        } else if (h < 300) {
+          rgb.b = t1
+          rgb.g = t2
+          rgb.r = t2 + t3
+        } else if (h < 360) {
+          rgb.r = t1
+          rgb.g = t2
+          rgb.b = t1 - t3
+        } else {
+          rgb.r = 0
+          rgb.g = 0
+          rgb.b = 0
+        }
+      }
+      return {
+        r: Math.round(rgb.r),
+        g: Math.round(rgb.g),
+        b: Math.round(rgb.b)
+      }
+    },
+    rgbToHsb(rgb) {
+      let hsb = {
+        h: 0,
+        s: 0,
+        b: 0
+      }
+      let min = Math.min(rgb.r, rgb.g, rgb.b)
+      let max = Math.max(rgb.r, rgb.g, rgb.b)
+      let delta = max - min
+      hsb.b = max
+      hsb.s = max != 0 ? (255 * delta) / max : 0
+      if (hsb.s != 0) {
+        if (rgb.r == max) hsb.h = (rgb.g - rgb.b) / delta
+        else if (rgb.g == max) hsb.h = 2 + (rgb.b - rgb.r) / delta
+        else hsb.h = 4 + (rgb.r - rgb.g) / delta
+      } else hsb.h = -1
+      hsb.h *= 60
+      if (hsb.h < 0) hsb.h = 0
+      hsb.s *= 100 / 255
+      hsb.b *= 100 / 255
+      return hsb
+    },
+    getSelectorQuery() {
+      const views = uni.createSelectorQuery().in(this)
+      views
+        .selectAll('.boxs')
+        .boundingClientRect((data) => {
+          if (!data || data.length === 0) {
+            setTimeout(() => this.getSelectorQuery(), 20)
+            return
+          }
+          this.position = data
+          // this.site[0].top = data[0].height;
+          // this.site[0].left = 0;
+          // this.site[1].left = data[1].width;
+          // this.site[2].left = data[2].width;
+          this.setColorBySelect(this.rgba)
+        })
+        .exec()
+    },
+    hex2Rgb(hexColor, alpha = 1) {
+      const color = hexColor.slice(1)
+      const r = parseInt(color.slice(0, 2), 16)
+      const g = parseInt(color.slice(2, 4), 16)
+      const b = parseInt(color.slice(4, 6), 16)
+      return {
+        r: r,
+        g: g,
+        b: b,
+        a: alpha
+      }
+    }
+  },
+  watch: {
+    spareColor(newVal) {
+      this.colorList = newVal
+    },
+    color(newVal) {
+      this.ready()
+    }
+  }
+}
+</script>
+
+<style>
+.t-wrapper {
+  position: fixed;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  box-sizing: border-box;
+  z-index: 9999;
+}
+
+.t-box {
+  width: 100%;
+  position: absolute;
+  bottom: 0;
+  padding: 30upx 0;
+  padding-top: 0;
+  background: #fff;
+  transition: all 0.3s;
+  transform: translateY(100%);
+}
+
+.t-box.active {
+  transform: translateY(0%);
+}
+
+.t-header {
+  display: flex;
+  justify-content: space-between;
+  width: 100%;
+  height: 100upx;
+  border-bottom: 1px #eee solid;
+  box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);
+  background: #fff;
+}
+
+.t-header-button {
+  display: flex;
+  align-items: center;
+  width: 150upx;
+  height: 100upx;
+  font-size: 30upx;
+  color: #666;
+  padding-left: 20upx;
+}
+
+.t-header-button:last-child {
+  justify-content: flex-end;
+  padding-right: 20upx;
+}
+
+.t-mask {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: rgba(0, 0, 0, 0.6);
+  z-index: -1;
+  transition: all 0.3s;
+  opacity: 0;
+}
+
+.t-mask.active {
+  opacity: 1;
+}
+
+.t-color__box {
+  position: relative;
+  height: 400upx;
+  background: rgb(255, 0, 0);
+  overflow: hidden;
+  box-sizing: border-box;
+  margin: 0 20upx;
+  margin-top: 20upx;
+  box-sizing: border-box;
+}
+
+.t-background {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: linear-gradient(to right, #fff, rgba(255, 255, 255, 0));
+}
+
+.t-color-mask {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  width: 100%;
+  height: 400upx;
+  background: linear-gradient(to top, #000, rgba(0, 0, 0, 0));
+}
+
+.t-pointer {
+  position: absolute;
+  bottom: -8px;
+  left: -8px;
+  z-index: 2;
+  width: 15px;
+  height: 15px;
+  border: 1px #fff solid;
+  border-radius: 50%;
+}
+
+.t-show-color {
+  width: 100upx;
+  height: 50upx;
+}
+
+.t-control__box {
+  margin-top: 50upx;
+  width: 100%;
+  display: flex;
+  padding-left: 20upx;
+  box-sizing: border-box;
+}
+
+.t-control__color {
+  flex-shrink: 0;
+  width: 100upx;
+  height: 100upx;
+  border-radius: 50%;
+  background-color: #fff;
+  background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee),
+    linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee);
+  background-size: 36upx 36upx;
+  background-position: 0 0, 18upx 18upx;
+  border: 1px #eee solid;
+  overflow: hidden;
+}
+
+.t-control__color-content {
+  width: 100%;
+  height: 100%;
+}
+
+.t-control-box__item {
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  width: 100%;
+  padding: 0 30upx;
+}
+
+.t-controller {
+  position: relative;
+  width: 100%;
+  height: 16px;
+  background-color: #fff;
+  background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee),
+    linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee);
+  background-size: 32upx 32upx;
+  background-position: 0 0, 16upx 16upx;
+}
+
+.t-hue {
+  width: 100%;
+  height: 100%;
+  background: linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);
+}
+
+.t-transparency {
+  width: 100%;
+  height: 100%;
+  background: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgb(0, 0, 0));
+}
+
+.t-circle {
+  position: absolute;
+  /* right: -10px; */
+  top: -2px;
+  width: 20px;
+  height: 20px;
+  box-sizing: border-box;
+  border-radius: 50%;
+  background: #fff;
+  box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1);
+}
+
+.t-result__box {
+  margin-top: 20upx;
+  padding: 10upx;
+  width: 100%;
+  display: flex;
+  box-sizing: border-box;
+}
+
+.t-result__item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  padding: 10upx;
+  width: 100%;
+  box-sizing: border-box;
+}
+
+.t-result__box-input {
+  padding: 10upx 0;
+  width: 100%;
+  font-size: 28upx;
+  box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.1);
+  color: #999;
+  text-align: center;
+  background: #fff;
+}
+
+.t-result__box-text {
+  margin-top: 10upx;
+  font-size: 28upx;
+  line-height: 2;
+}
+
+.t-select {
+  flex-shrink: 0;
+  width: 150upx;
+  padding: 0 30upx;
+}
+
+.t-select .t-result__box-input {
+  border-radius: 10upx;
+  border: none;
+  color: #999;
+  box-shadow: 1px 1px 2px 1px rgba(0, 0, 0, 0.1);
+  background: #fff;
+}
+
+.t-select .t-result__box-input:active {
+  box-shadow: 0px 0px 1px 0px rgba(0, 0, 0, 0.1);
+}
+
+.t-alternative {
+  display: flex;
+  flex-wrap: wrap;
+  /* justify-content: space-between; */
+  width: 100%;
+  padding-right: 10upx;
+  box-sizing: border-box;
+}
+
+.t-alternative__item {
+  margin-left: 12upx;
+  margin-top: 10upx;
+  width: 50upx;
+  height: 50upx;
+  border-radius: 10upx;
+  background-color: #fff;
+  background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee),
+    linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee);
+  background-size: 36upx 36upx;
+  background-position: 0 0, 18upx 18upx;
+  border: 1px #eee solid;
+  overflow: hidden;
+}
+
+.t-alternative__item-content {
+  width: 50upx;
+  height: 50upx;
+  background: rgba(255, 0, 0, 0.5);
+}
+
+.t-alternative__item:active {
+  transition: all 0.3s;
+  transform: scale(1.1);
+}
+</style>
diff --git a/uni_modules/sp-editor/components/sp-editor/fab-tool.vue b/uni_modules/sp-editor/components/sp-editor/fab-tool.vue
new file mode 100644
index 0000000..e969c40
--- /dev/null
+++ b/uni_modules/sp-editor/components/sp-editor/fab-tool.vue
@@ -0,0 +1,140 @@
+<template>
+  <view class="fab-tool">
+    <view id="toolfab">
+      <slot></slot>
+    </view>
+    <view class="fab-tool-content" :style="placementStyle" id="placementfab">
+      <slot name="content" v-if="visible"></slot>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    placement: {
+      type: String,
+      default: 'auto' // 'auto' | 'top-start' | 'top-center' | 'top-end' | 'bottom-start' | 'bottom-center' | 'bottom-end'
+    }
+  },
+  data() {
+    return {
+      placementHeight: '0',
+      placementType: ''
+    }
+  },
+  watch: {
+    visible(newVal) {
+      if (newVal) {
+        const { screenWidth } = uni.getSystemInfoSync()
+
+        this.$nextTick(() => {
+          let placementWidth = 0
+          uni
+            .createSelectorQuery()
+            .in(this)
+            .select('#placementfab')
+            .boundingClientRect((res) => {
+              this.placementHeight = -res.height + 'px'
+              placementWidth = res.width
+            })
+            .exec()
+          // 寮�鍚嚜鍔ㄦā寮忓悗
+          if (this.placement == 'auto') {
+            uni
+              .createSelectorQuery()
+              .in(this)
+              .select('#toolfab')
+              .boundingClientRect((res) => {
+                let leftRemain = res.left
+                let rightRemain = screenWidth - leftRemain
+                if (rightRemain > placementWidth) {
+                  this.placementType = 'bottom-start'
+                } else if (leftRemain > placementWidth) {
+                  this.placementType = 'bottom-end'
+                } else {
+                  this.placementType = 'bottom-center'
+                }
+              })
+              .exec()
+          }
+        })
+      }
+    }
+  },
+  mounted() {
+    this.placementType = this.placement
+  },
+  computed: {
+    placementStyle() {
+      let position = {}
+      switch (this.placementType) {
+        case 'top-start':
+          position = {
+            top: this.placementHeight,
+            left: 0
+          }
+          break
+        case 'top-center':
+          position = {
+            top: this.placementHeight,
+            left: '50%',
+            transform: 'translateX(-50%)'
+          }
+          break
+        case 'top-end':
+          position = {
+            top: this.placementHeight,
+            right: 0
+          }
+          break
+        case 'bottom-start':
+          position = {
+            bottom: this.placementHeight,
+            left: 0
+          }
+          break
+        case 'bottom-center':
+          position = {
+            bottom: this.placementHeight,
+            left: '50%',
+            transform: 'translateX(-50%)'
+          }
+          break
+        case 'bottom-end':
+          position = {
+            bottom: this.placementHeight,
+            right: 0
+          }
+          break
+        default:
+          break
+      }
+      return position
+    }
+  },
+  methods: {
+    //
+  }
+}
+</script>
+
+<style lang="scss">
+.fab-tool {
+  position: relative;
+
+  .fab-tool-content {
+    position: absolute;
+    z-index: 999;
+
+    background-color: #ffffff;
+    box-shadow: -2px -2px 4px rgba(0, 0, 0, 0.05), 2px 2px 4px rgba(0, 0, 0, 0.05);
+    border-radius: 12rpx;
+    box-sizing: border-box;
+  }
+}
+</style>
diff --git a/uni_modules/sp-editor/components/sp-editor/link-edit.vue b/uni_modules/sp-editor/components/sp-editor/link-edit.vue
new file mode 100644
index 0000000..1fd45cd
--- /dev/null
+++ b/uni_modules/sp-editor/components/sp-editor/link-edit.vue
@@ -0,0 +1,152 @@
+<template>
+  <view class="link-edit-container" v-if="showPopup">
+    <view class="link-edit">
+      <view class="title">娣诲姞閾炬帴</view>
+      <view class="edit">
+        <view class="description">
+          閾炬帴鎻忚堪锛�
+          <input v-model="descVal" type="text" class="input" placeholder="璇疯緭鍏ラ摼鎺ユ弿杩�" />
+        </view>
+        <view class="address">
+          閾炬帴鍦板潃锛�
+          <input v-model="addrVal" type="text" class="input" placeholder="璇疯緭鍏ラ摼鎺ュ湴鍧�" />
+        </view>
+      </view>
+      <view class="control">
+        <view class="cancel" @click="close">鍙栨秷</view>
+        <view class="confirm" @click="onConfirm">纭</view>
+      </view>
+    </view>
+    <view class="mask"></view>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      showPopup: false,
+      descVal: '',
+      addrVal: ''
+    }
+  },
+  methods: {
+    open() {
+      this.showPopup = true
+      this.$emit('open')
+    },
+    close() {
+      this.showPopup = false
+      this.descVal = ''
+      this.addrVal = ''
+      this.$emit('close')
+    },
+    onConfirm() {
+      if (!this.descVal) {
+        uni.showToast({
+          title: '璇疯緭鍏ラ摼鎺ユ弿杩�',
+          icon: 'none'
+        })
+        return
+      }
+      if (!this.addrVal) {
+        uni.showToast({
+          title: '璇疯緭鍏ラ摼鎺ュ湴鍧�',
+          icon: 'none'
+        })
+        return
+      }
+      this.$emit('confirm', {
+        text: this.descVal,
+        href: this.addrVal
+      })
+      this.close()
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+.link-edit-container {
+  .link-edit {
+    width: 80%;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    background-color: #ffffff;
+    box-shadow: -2px -2px 4px rgba(0, 0, 0, 0.05), 2px 2px 4px rgba(0, 0, 0, 0.05);
+    border-radius: 12rpx;
+    box-sizing: border-box;
+    z-index: 999;
+    font-size: 14px;
+
+    .title {
+      height: 80rpx;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+    }
+
+    .edit {
+      padding: 24rpx;
+      border-top: 1px solid #eeeeee;
+      border-bottom: 1px solid #eeeeee;
+      box-sizing: border-box;
+
+      .input {
+        flex: 1;
+        padding: 4px;
+        font-size: 14px;
+        border: 1px solid #eeeeee;
+        border-radius: 8rpx;
+
+        .uni-input-placeholder {
+          color: #dddddd;
+        }
+      }
+
+      .description {
+        display: flex;
+        align-items: center;
+      }
+      .address {
+        display: flex;
+        align-items: center;
+        margin-top: 24rpx;
+      }
+    }
+
+    .control {
+      height: 80rpx;
+      display: flex;
+      cursor: pointer;
+
+      .cancel {
+        flex: 1;
+        color: #dd524d;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+      }
+      .confirm {
+        border-left: 1px solid #eeeeee;
+        flex: 1;
+        color: #007aff;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+      }
+    }
+  }
+  .mask {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background-color: rgba(0, 0, 0, 0.05);
+    z-index: 998;
+  }
+}
+</style>
diff --git a/uni_modules/sp-editor/components/sp-editor/sp-editor.vue b/uni_modules/sp-editor/components/sp-editor/sp-editor.vue
new file mode 100644
index 0000000..13ac265
--- /dev/null
+++ b/uni_modules/sp-editor/components/sp-editor/sp-editor.vue
@@ -0,0 +1,853 @@
+<template>
+	<view class="sp-editor" :style="{ '--icon-size': iconSize, '--icon-columns': iconColumns }">
+		<view class="sp-editor-toolbar" v-if="!readOnly" @tap="format">
+			<!-- 鏍囬鏍� -->
+			<fab-tool v-if="toolbarList.includes('header')" :visible="curFab == 'header'">
+				<view
+					:class="formats.header ? 'ql-active' : ''"
+					class="iconfont icon-header"
+					title="鏍囬"
+					data-name="header"
+					@click.stop="fabTap('header')"
+				></view>
+				<template #content>
+					<view class="fab-tools" @click.stop="fabTapSub($event, 'header')">
+						<view v-for="item in fabTools.header" :key="item.value">
+							<view
+								v-if="toolbarList.includes(item.name)"
+								class="fab-sub"
+								:class="[formats.header === item.value ? 'ql-active' : '', item.icon ? 'iconfont' : '', item.icon]"
+								:title="item.title"
+								data-name="header"
+								:data-value="item.value"
+							></view>
+						</view>
+					</view>
+				</template>
+			</fab-tool>
+			<view
+				v-if="toolbarList.includes('bold')"
+				:class="formats.bold ? 'ql-active' : ''"
+				class="iconfont icon-zitijiacu"
+				title="鍔犵矖"
+				data-name="bold"
+			></view>
+			<view
+				v-if="toolbarList.includes('italic')"
+				:class="formats.italic ? 'ql-active' : ''"
+				class="iconfont icon-zitixieti"
+				title="鏂滀綋"
+				data-name="italic"
+			></view>
+			<view
+				v-if="toolbarList.includes('underline')"
+				:class="formats.underline ? 'ql-active' : ''"
+				class="iconfont icon-zitixiahuaxian"
+				title="涓嬪垝绾�"
+				data-name="underline"
+			></view>
+			<view
+				v-if="toolbarList.includes('strike')"
+				:class="formats.strike ? 'ql-active' : ''"
+				class="iconfont icon-zitishanchuxian"
+				title="鍒犻櫎绾�"
+				data-name="strike"
+			></view>
+			<!-- 瀵归綈鏂瑰紡 -->
+			<fab-tool v-if="toolbarList.includes('align')" :visible="curFab == 'align'">
+				<view
+					:class="formats.align ? 'ql-active' : ''"
+					class="iconfont icon-zuoyouduiqi"
+					title="瀵归綈鏂瑰紡"
+					data-name="align"
+					@click.stop="fabTap('align')"
+				></view>
+				<template #content>
+					<view class="fab-tools" @click.stop="fabTapSub($event, 'align')">
+						<view v-for="item in fabTools.align" :key="item.value">
+							<view
+								v-if="toolbarList.includes(item.name)"
+								class="fab-sub"
+								:class="[formats.align === item.value ? 'ql-active' : '', item.icon ? 'iconfont' : '', item.icon]"
+								:title="item.title"
+								data-name="align"
+								:data-value="item.value"
+							></view>
+						</view>
+					</view>
+				</template>
+			</fab-tool>
+			<!-- 琛岄棿璺� -->
+			<fab-tool v-if="toolbarList.includes('lineHeight')" :visible="curFab == 'lineHeight'">
+				<view
+					:class="formats.lineHeight ? 'ql-active' : ''"
+					class="iconfont icon-line-height"
+					title="琛岄棿璺�"
+					data-name="lineHeight"
+					@click.stop="fabTap('lineHeight')"
+				></view>
+				<template #content>
+					<view class="fab-tools" @click.stop="fabTapSub($event, 'lineHeight')">
+						<view v-for="item in fabTools.lineHeight" :key="item.value">
+							<view
+								class="fab-sub"
+								:class="[formats.lineHeight === item.value ? 'ql-active' : '', item.icon ? 'iconfont' : '', item.icon]"
+								:title="item.title"
+								data-name="lineHeight"
+								:data-value="item.value"
+							>
+								{{ item.name }}
+							</view>
+						</view>
+					</view>
+				</template>
+			</fab-tool>
+			<!-- 瀛楅棿璺� -->
+			<fab-tool v-if="toolbarList.includes('letterSpacing')" :visible="curFab == 'letterSpacing'">
+				<view
+					:class="formats.letterSpacing ? 'ql-active' : ''"
+					class="iconfont icon-Character-Spacing"
+					title="瀛楅棿璺�"
+					data-name="letterSpacing"
+					@click.stop="fabTap('letterSpacing')"
+				></view>
+				<template #content>
+					<view class="fab-tools" @click.stop="fabTapSub($event, 'letterSpacing')">
+						<view v-for="item in fabTools.space" :key="item.value">
+							<view
+								class="fab-sub"
+								:class="[
+									formats.letterSpacing === item.value ? 'ql-active' : '',
+									item.icon ? 'iconfont' : '',
+									item.icon
+								]"
+								:title="item.title"
+								data-name="letterSpacing"
+								:data-value="item.value"
+							>
+								{{ item.name }}
+							</view>
+						</view>
+					</view>
+				</template>
+			</fab-tool>
+			<!-- 娈靛墠璺� -->
+			<fab-tool v-if="toolbarList.includes('marginTop')" :visible="curFab == 'marginTop'">
+				<view
+					:class="formats.marginTop ? 'ql-active' : ''"
+					class="iconfont icon-722bianjiqi_duanqianju"
+					title="娈靛墠璺�"
+					data-name="marginTop"
+					@click.stop="fabTap('marginTop')"
+				></view>
+				<template #content>
+					<view class="fab-tools" @click.stop="fabTapSub($event, 'marginTop')">
+						<view v-for="item in fabTools.space" :key="item.value">
+							<view
+								class="fab-sub"
+								:class="[formats.marginTop === item.value ? 'ql-active' : '', item.icon ? 'iconfont' : '', item.icon]"
+								:title="item.title"
+								data-name="marginTop"
+								:data-value="item.value"
+							>
+								{{ item.name }}
+							</view>
+						</view>
+					</view>
+				</template>
+			</fab-tool>
+			<!-- 娈靛悗璺� -->
+			<fab-tool v-if="toolbarList.includes('marginBottom')" :visible="curFab == 'marginBottom'">
+				<view
+					:class="formats.marginBottom ? 'ql-active' : ''"
+					class="iconfont icon-723bianjiqi_duanhouju"
+					title="娈靛悗璺�"
+					data-name="marginBottom"
+					@click.stop="fabTap('marginBottom')"
+				></view>
+				<template #content>
+					<view class="fab-tools" @click.stop="fabTapSub($event, 'marginBottom')">
+						<view v-for="item in fabTools.space" :key="item.value">
+							<view
+								class="fab-sub"
+								:class="[
+									formats.marginBottom === item.value ? 'ql-active' : '',
+									item.icon ? 'iconfont' : '',
+									item.icon
+								]"
+								:title="item.title"
+								data-name="marginBottom"
+								:data-value="item.value"
+							>
+								{{ item.name }}
+							</view>
+						</view>
+					</view>
+				</template>
+			</fab-tool>
+			<!-- 瀛椾綋鏍� -->
+			<fab-tool v-if="toolbarList.includes('fontFamily')" :visible="curFab == 'fontFamily'">
+				<view
+					:class="formats.fontFamily ? 'ql-active' : ''"
+					class="iconfont icon-font"
+					title="瀛椾綋"
+					data-name="fontFamily"
+					@click.stop="fabTap('fontFamily')"
+				></view>
+				<template #content>
+					<view class="fab-tools" @click.stop="fabTapSub($event, 'fontFamily')">
+						<view v-for="item in fabTools.fontFamily" :key="item.value">
+							<view
+								class="fab-sub"
+								:class="[formats.fontFamily === item.value ? 'ql-active' : '', item.icon ? 'iconfont' : '', item.icon]"
+								:title="item.title"
+								data-name="fontFamily"
+								:data-value="item.value"
+							>
+								{{ item.name }}
+							</view>
+						</view>
+					</view>
+				</template>
+			</fab-tool>
+			<!-- 瀛椾綋澶у皬鏍� -->
+			<fab-tool v-if="toolbarList.includes('fontSize')" :visible="curFab == 'fontSize'">
+				<view
+					:class="formats.fontSize ? 'ql-active' : ''"
+					class="iconfont icon-fontsize"
+					title="瀛楀彿"
+					data-name="fontSize"
+					@click.stop="fabTap('fontSize')"
+				></view>
+				<template #content>
+					<view class="fab-tools" @click.stop="fabTapSub($event, 'fontSize')">
+						<view v-for="item in fabTools.fontSize" :key="item.value">
+							<view
+								class="fab-sub"
+								:class="[formats.fontSize === item.value ? 'ql-active' : '', item.icon ? 'iconfont' : '', item.icon]"
+								:title="item.title"
+								data-name="fontSize"
+								:data-value="item.value"
+							>
+								{{ item.name }}
+							</view>
+						</view>
+					</view>
+				</template>
+			</fab-tool>
+			<view
+				v-if="toolbarList.includes('color')"
+				:style="{ color: formats.color ? textColor : 'initial' }"
+				class="iconfont icon-text_color"
+				title="鏂囧瓧棰滆壊"
+				data-name="color"
+				:data-value="textColor"
+			></view>
+			<view
+				v-if="toolbarList.includes('backgroundColor')"
+				:style="{ color: formats.backgroundColor ? backgroundColor : 'initial' }"
+				class="iconfont icon-fontbgcolor"
+				title="鑳屾櫙棰滆壊"
+				data-name="backgroundColor"
+				:data-value="backgroundColor"
+			></view>
+			<view v-if="toolbarList.includes('date')" class="iconfont icon-date" title="鏃ユ湡" @tap="insertDate"></view>
+			<view
+				v-if="toolbarList.includes('listCheck')"
+				class="iconfont icon--checklist"
+				title="寰呭姙"
+				data-name="list"
+				data-value="check"
+			></view>
+			<view
+				v-if="toolbarList.includes('listOrdered')"
+				:class="formats.list === 'ordered' ? 'ql-active' : ''"
+				class="iconfont icon-youxupailie"
+				title="鏈夊簭鍒楄〃"
+				data-name="list"
+				data-value="ordered"
+			></view>
+			<view
+				v-if="toolbarList.includes('listBullet')"
+				:class="formats.list === 'bullet' ? 'ql-active' : ''"
+				class="iconfont icon-wuxupailie"
+				title="鏃犲簭鍒楄〃"
+				data-name="list"
+				data-value="bullet"
+			></view>
+			<view
+				v-if="toolbarList.includes('divider')"
+				class="iconfont icon-fengexian"
+				title="鍒嗗壊绾�"
+				@click="insertDivider"
+			></view>
+			<view
+				v-if="toolbarList.includes('indentDec')"
+				class="iconfont icon-outdent"
+				title="鍑忓皯缂╄繘"
+				data-name="indent"
+				data-value="-1"
+			></view>
+			<view
+				v-if="toolbarList.includes('indentInc')"
+				class="iconfont icon-indent"
+				title="澧炲姞缂╄繘"
+				data-name="indent"
+				data-value="+1"
+			></view>
+			<view
+				v-if="toolbarList.includes('scriptSub')"
+				:class="formats.script === 'sub' ? 'ql-active' : ''"
+				class="iconfont icon-zitixiabiao"
+				title="涓嬫爣"
+				data-name="script"
+				data-value="sub"
+			></view>
+			<view
+				v-if="toolbarList.includes('scriptSuper')"
+				:class="formats.script === 'super' ? 'ql-active' : ''"
+				class="iconfont icon-zitishangbiao"
+				title="涓婃爣"
+				data-name="script"
+				data-value="super"
+			></view>
+			<view
+				v-if="toolbarList.includes('direction')"
+				:class="formats.direction === 'rtl' ? 'ql-active' : ''"
+				class="iconfont icon-direction-rtl"
+				title="鏂囨湰鏂瑰悜"
+				data-name="direction"
+				data-value="rtl"
+			></view>
+			<view
+				v-if="toolbarList.includes('image')"
+				class="iconfont icon-charutupian"
+				title="鍥剧墖"
+				@tap="insertImage"
+			></view>
+			<view v-if="toolbarList.includes('video')" class="iconfont icon-video" title="瑙嗛" @tap="insertVideo"></view>
+			<view
+				v-if="toolbarList.includes('link')"
+				class="iconfont icon-charulianjie"
+				title="瓒呴摼鎺�"
+				@tap="insertLink"
+			></view>
+			<view v-if="toolbarList.includes('undo')" class="iconfont icon-undo" title="鎾ら攢" @tap="undo"></view>
+			<view v-if="toolbarList.includes('redo')" class="iconfont icon-redo" title="閲嶅仛" @tap="redo"></view>
+			<view
+				v-if="toolbarList.includes('removeFormat')"
+				class="iconfont icon-clearedformat"
+				title="娓呴櫎鏍煎紡"
+				@tap="removeFormat"
+			></view>
+			<view v-if="toolbarList.includes('clear')" class="iconfont icon-shanchu" title="娓呯┖" @tap="clear"></view>
+			<view v-if="toolbarList.includes('export')" class="iconfont icon-baocun" title="瀵煎嚭" @tap="exportHtml"></view>
+		</view>
+
+		<!-- 鑷畾涔夊姛鑳界粍浠� -->
+		<!-- 璋冭壊鏉� -->
+		<color-picker
+			v-if="toolbarList.includes('color') || toolbarList.includes('backgroundColor')"
+			ref="colorPickerRef"
+			:color="defaultColor"
+			@confirm="confirmColor"
+		></color-picker>
+		<!-- 娣诲姞閾炬帴鐨勬搷浣滃脊绐� -->
+		<link-edit v-if="toolbarList.includes('link') && !readOnly" ref="linkEditRef" @confirm="confirmLink"></link-edit>
+		<view class="sp-editor-wrapper" @longpress="eLongpress">
+			<editor
+				:id="editorId"
+				class="ql-editor editor-container"
+				:class="{ 'ql-image-overlay-none': readOnly }"
+				show-img-size
+				show-img-toolbar
+				show-img-resize
+				:placeholder="placeholder"
+				:read-only="readOnly"
+				@statuschange="onStatusChange"
+				@ready="onEditorReady"
+				@input="onEditorInput"
+			></editor>
+		</view>
+	</view>
+</template>
+
+<script>
+import ColorPicker from './color-picker.vue'
+import LinkEdit from './link-edit.vue'
+import FabTool from './fab-tool.vue'
+import { addLink, linkFlag } from '../../utils'
+
+export default {
+	components: {
+		ColorPicker,
+		LinkEdit,
+		FabTool
+	},
+	props: {
+		// 缂栬緫鍣╥d鍙紶鍏ワ紝浠ヤ究寰幆缁勪欢浣跨敤锛岄槻姝d閲嶅
+		editorId: {
+			type: String,
+			default: 'editor'
+		},
+		placeholder: {
+			type: String,
+			default: '鍐欑偣浠�涔堝惂 ~'
+		},
+		// 鏄惁鍙
+		readOnly: {
+			type: Boolean,
+			default: false
+		},
+		// 鏈�澶у瓧鏁伴檺鍒讹紝-1涓嶉檺
+		maxlength: {
+			type: Number,
+			default: -1
+		},
+		// 宸ュ叿鏍忛厤缃�
+		toolbarConfig: {
+			type: Object,
+			default: () => {
+				return {
+					keys: [], // 瑕佹樉绀虹殑宸ュ叿锛屼紭鍏堢骇鏈�澶�
+					excludeKeys: [], // 闄よ繖浜涙寚瀹氱殑宸ュ叿澶栵紝鍏朵粬閮芥樉绀�
+					iconSize: '18px', // 宸ュ叿鏍忓瓧浣撳ぇ灏�
+					iconColumns: 10 // 宸ュ叿鏍忓垪鏁�
+				}
+			}
+		}
+	},
+	watch: {
+		toolbarConfig: {
+			deep: true,
+			immediate: true,
+			handler(newToolbar) {
+				/**
+				 * 鑻ュ伐鍏锋爮閰嶇疆涓璳eys瀛樺湪锛屽垯浠eys涓哄噯
+				 * 鍚﹀垯浠xcludeKeys鍚憈oolbarAllList涓帓鏌�
+				 * 鑻eys涓巈xcludeKeys鐨嗕负绌猴紝鍒欎互toolbarAllList涓哄噯
+				 */
+				if (newToolbar.keys?.length > 0) {
+					this.toolbarList = newToolbar.keys
+				} else {
+					this.toolbarList =
+						newToolbar.excludeKeys?.length > 0
+							? this.toolbarAllList.filter((item) => !newToolbar.excludeKeys.includes(item))
+							: this.toolbarAllList
+				}
+				this.iconSize = newToolbar.iconSize || '18px'
+				this.iconColumns = newToolbar.iconColumns || 10
+			}
+		}
+	},
+	data() {
+		return {
+			formats: {},
+			curFab: '', // 褰撳墠鎮诞宸ュ叿鏍�
+			fabXY: {},
+			textColor: '',
+			backgroundColor: '',
+			curColor: '',
+			defaultColor: { r: 0, g: 0, b: 0, a: 1 }, // 璋冭壊鏉块粯璁ら鑹�
+			iconSize: '20px', // 宸ュ叿鏍忓浘鏍囧瓧浣撳ぇ灏�
+			iconColumns: 10, // 宸ュ叿鏍忓垪鏁�
+			toolbarList: [],
+			toolbarAllList: [
+				'header', // 鏍囬
+				'H1', // 涓�绾ф爣棰�
+				'H2', // 浜岀骇鏍囬
+				'H3', // 涓夌骇鏍囬
+				'H4', // 鍥涚骇鏍囬
+				'H5', // 浜旂骇鏍囬
+				'H6', // 鍏骇鏍囬
+				'bold', // 鍔犵矖
+				'italic', // 鏂滀綋
+				'underline', // 涓嬪垝绾�
+				'strike', // 鍒犻櫎绾�
+				'align', // 瀵归綈鏂瑰紡
+				'alignLeft', // 宸﹀榻�
+				'alignCenter', // 灞呬腑瀵归綈
+				'alignRight', // 鍙冲榻�
+				'alignJustify', // 涓ょ瀵归綈
+				'lineHeight', // 琛岄棿璺�
+				'letterSpacing', // 瀛楅棿璺�
+				'marginTop', // 娈靛墠璺�
+				'marginBottom', // 娈靛悗璺�
+				'fontFamily', // 瀛椾綋
+				'fontSize', // 瀛楀彿
+				'color', // 鏂囧瓧棰滆壊
+				'backgroundColor', // 鑳屾櫙棰滆壊
+				'date', // 鏃ユ湡
+				'listCheck', // 寰呭姙
+				'listOrdered', // 鏈夊簭鍒楄〃
+				'listBullet', // 鏃犲簭鍒楄〃
+				'indentInc', // 澧炲姞缂╄繘
+				'indentDec', // 鍑忓皯缂╄繘
+				'divider', // 鍒嗗壊绾�
+				'scriptSub', // 涓嬫爣
+				'scriptSuper', // 涓婃爣
+				'direction', // 鏂囨湰鏂瑰悜
+				'image', // 鍥剧墖
+				'video', // 瑙嗛
+				'link', // 瓒呴摼鎺�
+				'undo', // 鎾ら攢
+				'redo', // 閲嶅仛
+				'removeFormat', // 娓呴櫎鏍煎紡
+				'clear', // 娓呯┖
+				'export' // 瀵煎嚭
+			],
+			fabTools: {
+				header: [
+					{ title: '涓�绾ф爣棰�', name: 'H1', value: 1, icon: 'icon-format-header-1' },
+					{ title: '浜岀骇鏍囬', name: 'H2', value: 2, icon: 'icon-format-header-2' },
+					{ title: '涓夌骇鏍囬', name: 'H3', value: 3, icon: 'icon-format-header-3' },
+					{ title: '鍥涚骇鏍囬', name: 'H4', value: 4, icon: 'icon-format-header-4' },
+					{ title: '浜旂骇鏍囬', name: 'H5', value: 5, icon: 'icon-format-header-5' },
+					{ title: '鍏骇鏍囬', name: 'H6', value: 6, icon: 'icon-format-header-6' }
+				],
+				fontFamily: [
+					{ title: '瀹嬩綋', name: '瀹�', value: '瀹嬩綋', icon: '' },
+					{ title: '榛戜綋', name: '榛�', value: '榛戜綋', icon: '' },
+					{ title: '妤蜂綋', name: '妤�', value: '妤蜂綋', icon: '' },
+					{ title: '浠垮畫', name: '浠�', value: '浠垮畫', icon: '' },
+					{ title: '鍗庢枃闅朵功', name: '闅�', value: 'STLiti', icon: '' },
+					{ title: '鍗庢枃琛屾シ', name: '琛�', value: 'STXingkai', icon: '' },
+					{ title: '骞煎渾', name: '鍦�', value: 'YouYuan', icon: '' }
+				],
+				fontSize: [
+					{ title: '12', name: '12', value: '12px', icon: '' },
+					{ title: '14', name: '14', value: '14px', icon: '' },
+					{ title: '16', name: '16', value: '16px', icon: '' },
+					{ title: '18', name: '18', value: '18px', icon: '' },
+					{ title: '20', name: '20', value: '20px', icon: '' },
+					{ title: '22', name: '22', value: '22px', icon: '' },
+					{ title: '24', name: '24', value: '24px', icon: '' }
+				],
+				align: [
+					{ title: '宸﹀榻�', name: 'alignLeft', value: 'left', icon: 'icon-zuoduiqi' },
+					{ title: '灞呬腑瀵归綈', name: 'alignCenter', value: 'center', icon: 'icon-juzhongduiqi' },
+					{ title: '鍙冲榻�', name: 'alignRight', value: 'right', icon: 'icon-youduiqi' },
+					{ title: '涓ょ瀵归綈', name: 'alignJustify', value: 'justify', icon: 'icon-zuoyouduiqi' }
+				],
+				lineHeight: [
+					{ title: '1鍊�', name: '1', value: '1', icon: '' },
+					{ title: '1.5鍊�', name: '1.5', value: '1.5', icon: '' },
+					{ title: '2鍊�', name: '2', value: '2', icon: '' },
+					{ title: '2.5鍊�', name: '2.5', value: '2.5', icon: '' },
+					{ title: '3鍊�', name: '3', value: '3', icon: '' }
+				],
+				// 瀛楅棿璺�/娈靛墠璺�/娈靛悗璺�
+				space: [
+					{ title: '0.5鍊�', name: '0.5', value: '0.5em', icon: '' },
+					{ title: '1鍊�', name: '1', value: '1em', icon: '' },
+					{ title: '1.5鍊�', name: '1.5', value: '1.5em', icon: '' },
+					{ title: '2鍊�', name: '2', value: '2em', icon: '' },
+					{ title: '2.5鍊�', name: '2.5', value: '2.5em', icon: '' },
+					{ title: '3鍊�', name: '3', value: '3em', icon: '' }
+				]
+			}
+		}
+	},
+	methods: {
+		onEditorReady() {
+			uni
+				.createSelectorQuery()
+				.in(this)
+				.select('#' + this.editorId)
+				.context((res) => {
+					this.editorCtx = res.context
+					this.$emit('init', this.editorCtx, this.editorId)
+				})
+				.exec()
+		},
+		undo() {
+			this.editorCtx.undo()
+		},
+		redo() {
+			this.editorCtx.redo()
+		},
+		format(e) {
+			let { name, value } = e.target.dataset
+			if (!name) return
+			switch (name) {
+				case 'color':
+				case 'backgroundColor':
+					this.curColor = name
+					this.showPicker()
+					break
+				default:
+					this.editorCtx.format(name, value)
+					break
+			}
+		},
+		// 鎮诞宸ュ叿鐐瑰嚮
+		fabTap(fabType) {
+			if (this.curFab != fabType) {
+				this.curFab = fabType
+			} else {
+				this.curFab = ''
+			}
+		},
+		// 鎮诞宸ュ叿瀛愰泦鐐瑰嚮
+		fabTapSub(e, fabType) {
+			this.format(e)
+			this.fabTap(fabType)
+		},
+		showPicker() {
+			switch (this.curColor) {
+				case 'color':
+					this.defaultColor = this.textColor
+						? this.$refs.colorPickerRef.hex2Rgb(this.textColor)
+						: { r: 0, g: 0, b: 0, a: 1 }
+					break
+				case 'backgroundColor':
+					this.defaultColor = this.backgroundColor
+						? this.$refs.colorPickerRef.hex2Rgb(this.backgroundColor)
+						: { r: 0, g: 0, b: 0, a: 0 }
+					break
+			}
+			this.$refs.colorPickerRef.open()
+		},
+		confirmColor(e) {
+			switch (this.curColor) {
+				case 'color':
+					this.textColor = e.hex
+					this.editorCtx.format('color', this.textColor)
+					break
+				case 'backgroundColor':
+					this.backgroundColor = e.hex
+					this.editorCtx.format('backgroundColor', this.backgroundColor)
+					break
+			}
+		},
+		onStatusChange(e) {
+			if (e.detail.color) {
+				this.textColor = e.detail.color
+			}
+			if (e.detail.backgroundColor) {
+				this.backgroundColor = e.detail.backgroundColor
+			}
+			this.formats = e.detail
+		},
+		insertDivider() {
+			this.editorCtx.insertDivider()
+		},
+		clear() {
+			uni.showModal({
+				title: '娓呯┖缂栬緫鍣�',
+				content: '纭畾娓呯┖缂栬緫鍣ㄥ悧锛�',
+				success: ({ confirm }) => {
+					if (confirm) {
+						this.editorCtx.clear()
+					}
+				}
+			})
+		},
+		removeFormat() {
+			uni.showModal({
+				title: '鏂囨湰鏍煎紡鍖�',
+				content: '纭畾瑕佹竻闄ゆ墍閫夋嫨閮ㄥ垎鏂囨湰鍧楁牸寮忓悧锛�',
+				showCancel: true,
+				success: ({ confirm }) => {
+					if (confirm) {
+						this.editorCtx.removeFormat()
+					}
+				}
+			})
+		},
+		insertDate() {
+			const date = new Date()
+			const formatDate = `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`
+			this.editorCtx.insertText({ text: formatDate })
+		},
+		insertLink() {
+			this.$refs.linkEditRef.open()
+		},
+		/**
+		 * 纭娣诲姞閾炬帴
+		 * @param {Object} e { text: '閾炬帴鎻忚堪', href: '閾炬帴鍦板潃' }
+		 */
+		confirmLink(e) {
+			this.$refs.linkEditRef.close()
+			addLink(this.editorCtx, e, () => {
+				// 淇娣诲姞瓒呴摼鎺ュ悗锛屼笉瑙﹀彂input鏇存柊褰撳墠鏈�鏂板唴瀹圭殑bug锛岃繖閲屽仛涓�涓嬫墜鍔ㄦ洿鏂�
+				this.editorCtx.getContents({
+					success: (res) => {
+						this.$emit('input', { html: res.html, text: res.text }, this.editorId)
+					}
+				})
+			})
+			this.$emit('addLink', e, this.editorId)
+		},
+		insertImage() {
+			// #ifdef APP-PLUS || H5
+			uni.chooseImage({
+				// count: 1, // 榛樿9
+				success: (res) => {
+					const { tempFiles } = res
+					// 灏嗘枃浠跺拰缂栬緫鍣ㄧず渚嬫姏鍑猴紝鐢卞紑鍙戣�呰嚜琛屼笂浼犲拰鎻掑叆鍥剧墖
+					this.$emit('upinImage', tempFiles, this.editorCtx, this.editorId)
+				},
+				fail() {
+					uni.showToast({
+						title: '鏈巿鏉冭闂浉鍐屾潈闄愶紝璇锋巿鏉冨悗浣跨敤',
+						icon: 'none'
+					})
+				}
+			})
+			// #endif
+
+			// #ifdef MP-WEIXIN
+			// 寰俊灏忕▼搴忎粠鍩虹搴� 2.21.0 寮�濮嬶紝 wx.chooseImage 鍋滄缁存姢锛岃浣跨敤 uni.chooseMedia 浠f浛銆�
+			uni.chooseMedia({
+				// count: 1, // 榛樿9
+				mediaType: ['image'],
+				success: (res) => {
+					// 鍚屼笂chooseImage澶勭悊
+					const { tempFiles } = res
+					this.$emit('upinImage', tempFiles, this.editorCtx, this.editorId)
+				},
+				fail() {
+					uni.showToast({
+						title: '鏈巿鏉冭闂浉鍐屾潈闄愶紝璇锋巿鏉冨悗浣跨敤',
+						icon: 'none'
+					})
+				}
+			})
+			// #endif
+		},
+		insertVideo() {
+			uni.chooseVideo({
+				sourceType: ['camera', 'album'],
+				success: (res) => {
+					const { tempFilePath } = res
+					// 灏嗘枃浠跺拰缂栬緫鍣ㄧず渚嬫姏鍑猴紝鐢卞紑鍙戣�呰嚜琛屼笂浼犲拰鎻掑叆鍥剧墖
+					this.$emit('upinVideo', tempFilePath, this.editorCtx, this.editorId)
+				},
+				fail() {
+					uni.showToast({
+						title: '鏈巿鏉冭闂獟浣撴潈闄愶紝璇锋巿鏉冨悗浣跨敤',
+						icon: 'none'
+					})
+				}
+			})
+		},
+		onEditorInput(e) {
+			// 娉ㄦ剰涓嶈浣跨敤getContents鑾峰彇html鍜宼ext锛屼細瀵艰嚧閲嶅瑙﹀彂onStatusChange浠庤�屽け鍘籺oolbar宸ュ叿鐨勯珮浜姸鎬�
+			// 澶嶅埗绮樿创鐨勬椂鍊檇etail浼氫负绌猴紝姝ゆ椂搴斿綋鐩存帴return
+			if (Object.keys(e.detail).length <= 0) return
+			const { html, text } = e.detail
+			// 璇嗗埆鍒版爣璇嗙珛鍗硆eturn
+			if (text.indexOf(linkFlag) !== -1) return
+
+			const maxlength = parseInt(this.maxlength)
+			const textStr = text.replace(/[ \t\r\n]/g, '')
+			if (textStr.length > maxlength && maxlength != -1) {
+				uni.showModal({
+					content: `瓒呰繃${maxlength}瀛楁暟鍟`,
+					confirmText: '纭畾',
+					showCancel: false,
+					success: () => {
+						this.$emit('overMax', { html, text }, this.editorId)
+					}
+				})
+			} else {
+				this.$emit('input', { html, text }, this.editorId)
+			}
+		},
+		// 瀵煎嚭
+		exportHtml() {
+			this.editorCtx.getContents({
+				success: (res) => {
+					this.$emit('exportHtml', res.html, this.editorId)
+				}
+			})
+		},
+		eLongpress() {
+			/**
+			 * 寰俊灏忕▼搴忓畼鏂筫ditor鐨勯暱鎸変簨浠舵湁bug锛岄渶瑕侀噸鍐欒鐩栵紝涓嶉渶鍋氫换浣曢�昏緫锛屽彲瑙佷笅闈㈠皬绋嬪簭绀惧尯闂閾炬帴
+			 * @tutorial https://developers.weixin.qq.com/community/develop/doc/000c04b3e1c1006f660065e4f61000
+			 */
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+@import '@/uni_modules/sp-editor/icons/editor-icon.css';
+@import '@/uni_modules/sp-editor/icons/custom-icon.css';
+
+.sp-editor {
+	height: 100%;
+	display: flex;
+	flex-direction: column;
+	position: relative;
+}
+
+.sp-editor-toolbar {
+	box-sizing: border-box;
+	padding: calc(var(--icon-size) / 4) 0;
+	border-bottom: 1px solid #e4e4e4;
+	font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;
+	display: grid;
+	grid-template-columns: repeat(var(--icon-columns), 1fr);
+}
+
+.iconfont {
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 100%;
+	height: calc(var(--icon-size) * 1.8);
+	cursor: pointer;
+	font-size: var(--icon-size);
+}
+
+.sp-editor-wrapper {
+	flex: 1;
+	overflow: hidden;
+	position: relative;
+}
+
+.editor-container {
+	padding: 8rpx 16rpx;
+	box-sizing: border-box;
+	width: 100%;
+	height: 100%;
+	font-size: 16px;
+	line-height: 1.5;
+}
+
+.ql-image-overlay-none {
+	::v-deep .ql-image-overlay {
+		pointer-events: none;
+		opacity: 0;
+	}
+}
+
+::v-deep .ql-editor.ql-blank::before {
+	font-style: normal;
+	color: #cccccc;
+}
+
+::v-deep .ql-container {
+	min-height: unset;
+}
+
+.ql-active {
+	color: #66ccff;
+}
+
+.fab-tools {
+	flex-wrap: wrap;
+	display: flex;
+	padding: 0 10rpx;
+	box-sizing: border-box;
+	.fab-sub {
+		
+		width: auto;
+		height: auto;
+		margin: 10rpx;
+	}
+}
+</style>
diff --git a/uni_modules/sp-editor/icons/custom-icon.css b/uni_modules/sp-editor/icons/custom-icon.css
new file mode 100644
index 0000000..ae1531a
--- /dev/null
+++ b/uni_modules/sp-editor/icons/custom-icon.css
@@ -0,0 +1,24 @@
+@font-face {
+    font-family: 'iconfont';
+    src: url('data:font/ttf;charset=utf-8;base64,AAEAAAANAIAAAwBQRkZUTahWRN8AAAeEAAAAHEdERUYAKQALAAAHZAAAAB5PUy8yPElI7QAAAVgAAABgY21hcOY96ckAAAHMAAABSmdhc3D//wADAAAHXAAAAAhnbHlmPxK+mgAAAyQAAAF4aGVhZCjWXYcAAADcAAAANmhoZWEHngOFAAABFAAAACRobXR4DIgAQAAAAbgAAAASbG9jYQCkALwAAAMYAAAADG1heHABGQB9AAABOAAAACBuYW1lXoIBAgAABJwAAAKCcG9zdENa1TcAAAcgAAAAOQABAAAAAQAA20yLC18PPPUACwQAAAAAAOLbjMwAAAAA4tuMzABA/78DwAMzAAAACAACAAAAAAAAAAEAAAOA/4AAXAQAAAAAAAPAAAEAAAAAAAAAAAAAAAAAAAAEAAEAAAAFAHEACgAAAAAAAgAAAAoACgAAAP8AAAAAAAAABAQAAZAABQAAAokCzAAAAI8CiQLMAAAB6wAyAQgAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZADA5hTmHgOA/4AAAAPcAIAAAAABAAAAAAAAAAAAAAAgAAEEAAAAAAAAAAQAAAAEAABAAIgAAAAAAAMAAAADAAAAHAABAAAAAABEAAMAAQAAABwABAAoAAAABgAEAAEAAuYU5h7//wAA5hTmHv//Ge8Z5gABAAAAAAAAAAABBgAAAQAAAAAAAAABAgAAAAIAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApAC8AAoAQABAA8ACwAARABQAGAAoADQAQABMAFgAZABwAAABHgEUBg8BBiIuAT0BND4BMh8BFTcBESERBSEiJjURNDYzITIWFREUBgE0NjIWFREUBiImNRMyFhQGKwEiJjQ2MxcyFhQGKwEiJjQ2MwE0NjIWFREUBiImNRMiJjQ2OwEyFhQGIwciJjQ2OwEyFhQGIwJwCAgICKAHEQ8JCQ8RBxBCAV79AAMA/QAbJSUbAwAbJSX9JRMaExMaEyANExMNgA0TEw2ADRMTDYANExMNAqATGhMTGhMgDRMTDYANExMNgA0TEw2ADRMTDQGcBQ8QDwVgBAgPCcAJDwgEVU4n/wACAP4AQCUbAgAbJSUb/gAbJQJgDRMTDf3gDRMTDQGAExoTExoTwBMaExMaEwFgDRMTDf3gDRMTDQFAExoTExoTwBMaExMaEwABAIj/vwNpAzMACwAAEzMRIREzESMRIREjiJABwZCQ/j+QAzP+jwFx/IwBiP54AAAAABIA3gABAAAAAAAAABMAKAABAAAAAAABAAgATgABAAAAAAACAAcAZwABAAAAAAADAAgAgQABAAAAAAAEAAgAnAABAAAAAAAFAAsAvQABAAAAAAAGAAgA2wABAAAAAAAKACsBPAABAAAAAAALABMBkAADAAEECQAAACYAAAADAAEECQABABAAPAADAAEECQACAA4AVwADAAEECQADABAAbwADAAEECQAEABAAigADAAEECQAFABYApQADAAEECQAGABAAyQADAAEECQAKAFYA5AADAAEECQALACYBaABDAHIAZQBhAHQAZQBkACAAYgB5ACAAaQBjAG8AbgBmAG8AbgB0AABDcmVhdGVkIGJ5IGljb25mb250AABpAGMAbwBuAGYAbwBuAHQAAGljb25mb250AABSAGUAZwB1AGwAYQByAABSZWd1bGFyAABpAGMAbwBuAGYAbwBuAHQAAGljb25mb250AABpAGMAbwBuAGYAbwBuAHQAAGljb25mb250AABWAGUAcgBzAGkAbwBuACAAMQAuADAAAFZlcnNpb24gMS4wAABpAGMAbwBuAGYAbwBuAHQAAGljb25mb250AABHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAABHZW5lcmF0ZWQgYnkgc3ZnMnR0ZiBmcm9tIEZvbnRlbGxvIHByb2plY3QuAABoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAABodHRwOi8vZm9udGVsbG8uY29tAAAAAAIAAAAAAAAACgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAABQAAAAEAAgECAQMFdmlkZW8GaGVhZGVyAAAAAAAAAf//AAIAAQAAAAwAAAAWAAAAAgABAAMABAABAAQAAAACAAAAAAAAAAEAAAAA4p8rRgAAAADi24zMAAAAAOLbjMw=') format('truetype');
+    font-weight: normal;
+    font-style: normal;
+    font-display: swap;
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-header:before {
+  content: "\e61e";
+}
+
+.icon-video:before {
+  content: "\e614";
+}
+
diff --git a/uni_modules/sp-editor/icons/editor-icon.css b/uni_modules/sp-editor/icons/editor-icon.css
new file mode 100644
index 0000000..e8f0345
--- /dev/null
+++ b/uni_modules/sp-editor/icons/editor-icon.css
@@ -0,0 +1,238 @@
+@font-face {
+    font-family: 'iconfont';
+    src: url('data:font/truetype;charset=utf-8;base64,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AAsAJgFuAAoAQwByAGUAYQB0AGUAZAAgAGIAeQAgAGkAYwBvAG4AZgBvAG4AdAAKAAAKQ3JlYXRlZCBieSBpY29uZm9udAoAAGkAYwBvAG4AZgBvAG4AdAAAaWNvbmZvbnQAAFIAZQBnAHUAbABhAHIAAFJlZ3VsYXIAAGkAYwBvAG4AZgBvAG4AdAAAaWNvbmZvbnQAAGkAYwBvAG4AZgBvAG4AdAAAaWNvbmZvbnQAAFYAZQByAHMAaQBvAG4AIAAxAC4AMAAAVmVyc2lvbiAxLjAAAGkAYwBvAG4AZgBvAG4AdAAAaWNvbmZvbnQAAEcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAAcwB2AGcAMgB0AHQAZgAgAGYAcgBvAG0AIABGAG8AbgB0AGUAbABsAG8AIABwAHIAbwBqAGUAYwB0AC4AAEdlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC4AAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAGh0dHA6Ly9mb250ZWxsby5jb20AAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAAAAEAAgECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkEcmVkbwlzZWxlY3RhbGwHcHJldmlldwR1bmRvBGRhdGUHY2xlYXJ1cBU3MjNiaWFuamlxaV9kdWFuaG91anUWNzIyYmlhbmppcWlfZHVhbnFpYW5qdQotY2hlY2tsaXN0DWRpcmVjdGlvbi1sdHINZGlyZWN0aW9uLXJ0bAtmb250Ymdjb2xvcg1jbGVhcmVkZm9ybWF0BGZvbnQHb3V0ZGVudAhmb250c2l6ZQp0ZXh0X2NvbG9yD2Zvcm1hdC1oZWFkZXItMg9mb3JtYXQtaGVhZGVyLTMLbGluZS1oZWlnaHQPZm9ybWF0LWhlYWRlci0xD2Zvcm1hdC1oZWFkZXItNA9mb3JtYXQtaGVhZGVyLTUPZm9ybWF0LWhlYWRlci02EUNoYXJhY3Rlci1TcGFjaW5nBmluZGVudAZiYW9jdW4IcXVhbnBpbmcFZnV6aGkHc2hhbmNodQxiaWFuamlzZWt1YWkJZmVuZ2V4aWFuB2RpYW56YW4MY2hhcnVsaWFuamllC2NoYXJ1dHVwaWFuCnd1eHVwYWlsaWUManV6aG9uZ2R1aXFpB3lpbnlvbmcLeW91eHVwYWlsaWUIeW91ZHVpcWkJeml0aWRhaW1hCHhpYW9saWFuCXppdGlqaWFjdQ96aXRpc2hhbmNodXhpYW4Neml0aXNoYW5nYmlhbwp6aXRpYmlhb3RpDnppdGl4aWFodWF4aWFuCXppdGl4aWV0aQl6aXRpeWFuc2UIenVvZHVpcWkJeml0aXl1bGFuC3ppdGl4aWFiaWFvC3p1b3lvdWR1aXFpB2R1aWdvdXgGZ3VhbmJpDnNoZW5neWluX3NoaXRpAAAAAAAB//8AAgABAAAADAAAABYAAAACAAEAAwA6AAEABAAAAAIAAAAAAAAAAQAAAADVpCcIAAAAANhk6GIAAAAA2GToYg==') format('truetype');
+    font-weight: normal;
+    font-style: normal;
+    font-display: swap;
+}
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-redo:before {
+  content: "\e627";
+}
+
+.icon-undo:before {
+  content: "\e633";
+}
+
+.icon-indent:before {
+  content: "\eb28";
+}
+
+.icon-outdent:before {
+  content: "\e6e8";
+}
+
+.icon-fontsize:before {
+  content: "\e6fd";
+}
+
+.icon-format-header-1:before {
+  content: "\e860";
+}
+
+.icon-format-header-4:before {
+  content: "\e863";
+}
+
+.icon-format-header-5:before {
+  content: "\e864";
+}
+
+.icon-format-header-6:before {
+  content: "\e865";
+}
+
+.icon-clearup:before {
+  content: "\e64d";
+}
+
+.icon-preview:before {
+  content: "\e631";
+}
+
+.icon-date:before {
+  content: "\e63e";
+}
+
+.icon-fontbgcolor:before {
+  content: "\e678";
+}
+
+.icon-clearedformat:before {
+  content: "\e67e";
+}
+
+.icon-font:before {
+  content: "\e684";
+}
+
+.icon-723bianjiqi_duanhouju:before {
+  content: "\e65f";
+}
+
+.icon-722bianjiqi_duanqianju:before {
+  content: "\e660";
+}
+
+.icon-text_color:before {
+  content: "\e72c";
+}
+
+.icon-format-header-2:before {
+  content: "\e75c";
+}
+
+.icon-format-header-3:before {
+  content: "\e75d";
+}
+
+.icon--checklist:before {
+  content: "\e664";
+}
+
+.icon-baocun:before {
+  content: "\ec09";
+}
+
+.icon-line-height:before {
+  content: "\e7f8";
+}
+
+.icon-quanping:before {
+  content: "\ec13";
+}
+
+.icon-direction-rtl:before {
+  content: "\e66e";
+}
+
+.icon-direction-ltr:before {
+  content: "\e66d";
+}
+
+.icon-selectall:before {
+  content: "\e62b";
+}
+
+.icon-fuzhi:before {
+  content: "\ec7a";
+}
+
+.icon-shanchu:before {
+  content: "\ec7b";
+}
+
+.icon-bianjisekuai:before {
+  content: "\ec7c";
+}
+
+.icon-fengexian:before {
+  content: "\ec7f";
+}
+
+.icon-dianzan:before {
+  content: "\ec80";
+}
+
+.icon-charulianjie:before {
+  content: "\ec81";
+}
+
+.icon-charutupian:before {
+  content: "\ec82";
+}
+
+.icon-wuxupailie:before {
+  content: "\ec83";
+}
+
+.icon-juzhongduiqi:before {
+  content: "\ec84";
+}
+
+.icon-yinyong:before {
+  content: "\ec85";
+}
+
+.icon-youxupailie:before {
+  content: "\ec86";
+}
+
+.icon-youduiqi:before {
+  content: "\ec87";
+}
+
+.icon-zitidaima:before {
+  content: "\ec88";
+}
+
+.icon-xiaolian:before {
+  content: "\ec89";
+}
+
+.icon-zitijiacu:before {
+  content: "\ec8a";
+}
+
+.icon-zitishanchuxian:before {
+  content: "\ec8b";
+}
+
+.icon-zitishangbiao:before {
+  content: "\ec8c";
+}
+
+.icon-zitibiaoti:before {
+  content: "\ec8d";
+}
+
+.icon-zitixiahuaxian:before {
+  content: "\ec8e";
+}
+
+.icon-zitixieti:before {
+  content: "\ec8f";
+}
+
+.icon-zitiyanse:before {
+  content: "\ec90";
+}
+
+.icon-zuoduiqi:before {
+  content: "\ec91";
+}
+
+.icon-zitiyulan:before {
+  content: "\ec92";
+}
+
+.icon-zitixiabiao:before {
+  content: "\ec93";
+}
+
+.icon-zuoyouduiqi:before {
+  content: "\ec94";
+}
+
+.icon-duigoux:before {
+  content: "\ec9e";
+}
+
+.icon-guanbi:before {
+  content: "\eca0";
+}
+
+.icon-shengyin_shiti:before {
+  content: "\eca5";
+}
+
+.icon-Character-Spacing:before {
+  content: "\e964";
+}
diff --git a/uni_modules/sp-editor/package.json b/uni_modules/sp-editor/package.json
new file mode 100644
index 0000000..c47fdc9
--- /dev/null
+++ b/uni_modules/sp-editor/package.json
@@ -0,0 +1,83 @@
+{
+	"id": "sp-editor",
+	"displayName": "瀹樻柟瀵屾枃鏈紪杈戝櫒editor缁勪欢鏀硅壇鎵╁睍浼樺寲鐗�",
+	"version": "1.5.0",
+	"description": "鍩轰簬瀹樻柟鐨勫瘜鏂囨湰缂栬緫鍣╡ditor缁勪欢锛岃繘琛屾敼鑹墿灞曚紭鍖栫増锛屾坊鍔犱簡璋冭壊鏉匡紝娣诲姞瓒呴摼鎺ョ瓑鍔熻兘锛屽彲鑷畾涔夋墿灞曞伐鍏凤紝蹇潵璇曡瘯鍚",
+	"keywords": [
+        "瀵屾枃鏈�",
+        "editor",
+        "缂栬緫鍣�"
+    ],
+	"repository": "",
+    "engines": {
+	},
+	"dcloudext": {
+		"type": "component-vue",
+		"sale": {
+			"regular": {
+				"price": "0.00"
+			},
+			"sourcecode": {
+				"price": "0.00"
+			}
+		},
+		"contact": {
+			"qq": ""
+		},
+		"declaration": {
+			"ads": "鏃�",
+			"data": "鎻掍欢涓嶉噰闆嗕换浣曟暟鎹�",
+			"permissions": "鏃�"
+		},
+		"npmurl": ""
+	},
+	"uni_modules": {
+		"dependencies": [],
+		"encrypt": [],
+		"platforms": {
+			"cloud": {
+				"tcb": "y",
+                "aliyun": "y",
+                "alipay": "n"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"App": {
+					"app-vue": "y",
+					"app-nvue": "y"
+				},
+				"H5-mobile": {
+					"Safari": "y",
+					"Android Browser": "y",
+					"寰俊娴忚鍣�(Android)": "y",
+					"QQ娴忚鍣�(Android)": "y"
+				},
+				"H5-pc": {
+					"Chrome": "y",
+					"IE": "y",
+					"Edge": "y",
+					"Firefox": "y",
+					"Safari": "y"
+				},
+				"灏忕▼搴�": {
+					"寰俊": "y",
+					"闃块噷": "u",
+					"鐧惧害": "u",
+					"瀛楄妭璺冲姩": "u",
+					"QQ": "u",
+					"閽夐拤": "u",
+					"蹇墜": "u",
+					"椋炰功": "u",
+					"浜笢": "u"
+				},
+				"蹇簲鐢�": {
+					"鍗庝负": "u",
+					"鑱旂洘": "u"
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/uni_modules/sp-editor/readme.md b/uni_modules/sp-editor/readme.md
new file mode 100644
index 0000000..48dbd46
--- /dev/null
+++ b/uni_modules/sp-editor/readme.md
@@ -0,0 +1,19 @@
+# sp-editor
+
+### 瑙嗛鎻掑叆鍔熻兘
+
+`浜�2024-7-20鏃1.4.4鐗堟湰鏇存柊瑙嗛鎻掑叆鍔熻兘锛堝睘瀹炴槸楦金煏婁簡澶箙浜嗭級`
+
+- 瀹炵幇鏂规锛氬厛浠ュ浘鐗囧崰浣嶏紝鍦ㄥ鍑烘椂锛屽皢鎼哄甫瑙嗛閾炬帴鐨勫浘鐗囪浆鎹㈡垚瑙嗛鏍囩銆�
+- 鏇村璇峰弬鑰冪ず渚嬩竴
+- 濡傛灉璇ユ彃浠舵湁甯姪鍒版偍锛岃繕鏈涜兘鐐硅禐濂借瘎涓�涓嬶紝璋㈣阿锛侌煂�
+
+### 鏂囨。杩佺Щ
+
+> 闃叉鏂囨。澶辨晥锛屾彁渚涗笅鍒椾簲涓湴鍧�锛屽唴瀹逛竴鑷�
+
+- [鍦板潃涓�](https://sonvee.github.io/sv-app-docs/docs-github/src/plugins/sp-editor/sp-editor.html)
+- [鍦板潃浜宂(https://sv-app-docs.pages.dev/src/plugins/sp-editor/sp-editor.html)
+- [鍦板潃涓塢(https://sv-app-docs.4everland.app/src/plugins/sp-editor/sp-editor.html)
+- [鍦板潃鍥沒(https://sv-app-docs.vercel.app/src/plugins/sp-editor/sp-editor.html) (闇�瑕佹瀛�)
+- [鍦板潃浜擼(https://static-mp-74bfcbac-6ba6-4f39-8513-8831390ff75a.next.bspapp.com/docs-uni/src/plugins/sp-editor/sp-editor.html) (鏈塈P闄愬埗)
diff --git a/uni_modules/sp-editor/static/image-resize.min.js b/uni_modules/sp-editor/static/image-resize.min.js
new file mode 100644
index 0000000..7c788a5
--- /dev/null
+++ b/uni_modules/sp-editor/static/image-resize.min.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ImageResize=e():t.ImageResize=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=39)}([function(t,e){function n(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}t.exports=n},function(t,e,n){var o=n(22),r="object"==typeof self&&self&&self.Object===Object&&self,i=o||r||Function("return this")();t.exports=i},function(t,e){function n(t){return null!=t&&"object"==typeof t}t.exports=n},function(t,e,n){function o(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var o=t[e];this.set(o[0],o[1])}}var r=n(76),i=n(77),u=n(78),c=n(79),a=n(80);o.prototype.clear=r,o.prototype.delete=i,o.prototype.get=u,o.prototype.has=c,o.prototype.set=a,t.exports=o},function(t,e,n){function o(t,e){for(var n=t.length;n--;)if(r(t[n][0],e))return n;return-1}var r=n(8);t.exports=o},function(t,e,n){function o(t){return null==t?void 0===t?a:c:s&&s in Object(t)?i(t):u(t)}var r=n(16),i=n(65),u=n(88),c="[object Null]",a="[object Undefined]",s=r?r.toStringTag:void 0;t.exports=o},function(t,e,n){function o(t,e){var n=t.__data__;return r(e)?n["string"==typeof e?"string":"hash"]:n.map}var r=n(74);t.exports=o},function(t,e,n){var o=n(11),r=o(Object,"create");t.exports=r},function(t,e){function n(t,e){return t===e||t!==t&&e!==e}t.exports=n},function(t,e,n){"use strict";function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}n.d(e,"a",function(){return r});var r=function t(e){o(this,t),this.onCreate=function(){},this.onDestroy=function(){},this.onUpdate=function(){},this.overlay=e.overlay,this.img=e.img,this.options=e.options,this.requestUpdate=e.onUpdate}},function(t,e,n){function o(t,e,n){"__proto__"==e&&r?r(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0}):t[e]=n}var r=n(21);t.exports=o},function(t,e,n){function o(t,e){var n=i(t,e);return r(n)?n:void 0}var r=n(49),i=n(66);t.exports=o},function(t,e,n){function o(t){return null!=t&&i(t.length)&&!r(t)}var r=n(13),i=n(31);t.exports=o},function(t,e,n){function o(t){if(!i(t))return!1;var e=r(t);return e==c||e==a||e==u||e==s}var r=n(5),i=n(0),u="[object AsyncFunction]",c="[object Function]",a="[object GeneratorFunction]",s="[object Proxy]";t.exports=o},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e,n){var o=n(11),r=n(1),i=o(r,"Map");t.exports=i},function(t,e,n){var o=n(1),r=o.Symbol;t.exports=r},function(t,e){function n(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}t.exports=n},function(t,e,n){function o(t,e,n){(void 0===n||i(t[e],n))&&(void 0!==n||e in t)||r(t,e,n)}var r=n(10),i=n(8);t.exports=o},function(t,e,n){function o(t,e,n,p,l){t!==e&&u(e,function(u,s){if(l||(l=new r),a(u))c(t,e,s,n,o,p,l);else{var d=p?p(f(t,s),u,s+"",t,e,l):void 0;void 0===d&&(d=u),i(t,s,d)}},s)}var r=n(42),i=n(18),u=n(47),c=n(52),a=n(0),s=n(33),f=n(26);t.exports=o},function(t,e,n){function o(t,e){return u(i(t,e,r),t+"")}var r=n(27),i=n(90),u=n(91);t.exports=o},function(t,e,n){var o=n(11),r=function(){try{var t=o(Object,"defineProperty");return t({},"",{}),t}catch(t){}}();t.exports=r},function(t,e,n){(function(e){var n="object"==typeof e&&e&&e.Object===Object&&e;t.exports=n}).call(e,n(105))},function(t,e,n){var o=n(89),r=o(Object.getPrototypeOf,Object);t.exports=r},function(t,e){function n(t,e){var n=typeof t;return!!(e=null==e?o:e)&&("number"==n||"symbol"!=n&&r.test(t))&&t>-1&&t%1==0&&t<e}var o=9007199254740991,r=/^(?:0|[1-9]\d*)$/;t.exports=n},function(t,e){function n(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||o)}var o=Object.prototype;t.exports=n},function(t,e){function n(t,e){if(("constructor"!==e||"function"!=typeof t[e])&&"__proto__"!=e)return t[e]}t.exports=n},function(t,e){function n(t){return t}t.exports=n},function(t,e,n){var o=n(48),r=n(2),i=Object.prototype,u=i.hasOwnProperty,c=i.propertyIsEnumerable,a=o(function(){return arguments}())?o:function(t){return r(t)&&u.call(t,"callee")&&!c.call(t,"callee")};t.exports=a},function(t,e){var n=Array.isArray;t.exports=n},function(t,e,n){(function(t){var o=n(1),r=n(103),i="object"==typeof e&&e&&!e.nodeType&&e,u=i&&"object"==typeof t&&t&&!t.nodeType&&t,c=u&&u.exports===i,a=c?o.Buffer:void 0,s=a?a.isBuffer:void 0,f=s||r;t.exports=f}).call(e,n(14)(t))},function(t,e){function n(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=o}var o=9007199254740991;t.exports=n},function(t,e,n){var o=n(50),r=n(55),i=n(87),u=i&&i.isTypedArray,c=u?r(u):o;t.exports=c},function(t,e,n){function o(t){return u(t)?r(t,!0):i(t)}var r=n(44),i=n(51),u=n(12);t.exports=o},function(t,e,n){"use strict";e.a={modules:["DisplaySize","Toolbar","Resize"]}},function(t,e,n){"use strict";function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}n.d(e,"a",function(){return c});var u=n(9),c=function(t){function e(){var t,n,i,u;o(this,e);for(var c=arguments.length,a=Array(c),s=0;s<c;s++)a[s]=arguments[s];return n=i=r(this,(t=e.__proto__||Object.getPrototypeOf(e)).call.apply(t,[this].concat(a))),i.onCreate=function(){i.display=document.createElement("div"),i.display.classList.add("ql-image-size"),i.overlay.appendChild(i.display)},i.onDestroy=function(){},i.onUpdate=function(){if(i.display&&i.img){var t=i.getCurrentSize();i.display.innerHTML=t.join(" &times; "),Object.assign(i.display.style,{right:"4px",top:"4px",left:"auto"})}},i.getCurrentSize=function(){return[i.img.width,Math.round(i.img.width/i.img.naturalWidth*i.img.naturalHeight)]},u=n,r(i,u)}return i(e,t),e}(u.a)},function(t,e,n){"use strict";function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}n.d(e,"a",function(){return f});var u=n(9),c=navigator.maxTouchPoints,a=!1;try{var s=Object.defineProperty({},"passive",{get:function(){a={passive:!1}}});window.addEventListener("test",null,s)}catch(t){}var f=function(t){function e(){var t,n,i,u;o(this,e);for(var s=arguments.length,f=Array(s),p=0;p<s;p++)f[p]=arguments[p];return n=i=r(this,(t=e.__proto__||Object.getPrototypeOf(e)).call.apply(t,[this].concat(f))),i.onCreate=function(){i.boxes=[],i.addBox("nwse-resize"),i.addBox("nesw-resize"),i.addBox("nwse-resize"),i.addBox("nesw-resize"),i.positionBoxes()},i.onDestroy=function(){i.setCursor("")},i.positionBoxes=function(){[{left:"-6px",top:"-6px"},{right:"-6px",top:"-6px"},{right:"-6px",bottom:"-6px"},{left:"-6px",bottom:"-6px"}].forEach(function(t,e){Object.assign(i.boxes[e].style,t)})},i.addBox=function(t){var e=document.createElement("div");e.classList.add("ql-image-handle"),e.style.cursor=t,e.addEventListener(c?"touchstart":"mousedown",i.handleMousedown,!1),i.overlay.appendChild(e),i.boxes.push(e)},i.handleMousedown=function(t){i.dragBox=t.target;var e=c?t.changedTouches[0]:t;i.dragStartX=e.clientX,i.preDragWidth=i.img.width||i.img.naturalWidth,i.setCursor(i.dragBox.style.cursor),document.addEventListener(c?"touchmove":"mousemove",i.handleDrag,a),document.addEventListener(c?"touchend":"mouseup",i.handleMouseup,!1)},i.handleMouseup=function(){i.setCursor(""),document.removeEventListener(c?"touchmove":"mousemove",i.handleDrag),document.removeEventListener(c?"touchend":"mouseup",i.handleMouseup)},i.handleDrag=function(t){if(i.img){var e=c?t.changedTouches[0]:t,n=e.clientX-i.dragStartX;i.dragBox===i.boxes[0]||i.dragBox===i.boxes[3]?i.img.width=Math.round(i.preDragWidth-n):i.img.width=Math.round(i.preDragWidth+n),i.requestUpdate(),t.preventDefault()}},i.setCursor=function(t){[document.body,i.img].forEach(function(e){e.style.cursor=t})},u=n,r(i,u)}return i(e,t),e}(u.a)},function(t,e,n){"use strict";function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}n.d(e,"a",function(){return c});var u=n(9),c=function(t){function e(){var t,n,i,u;o(this,e);for(var c=arguments.length,a=Array(c),s=0;s<c;s++)a[s]=arguments[s];return n=i=r(this,(t=e.__proto__||Object.getPrototypeOf(e)).call.apply(t,[this].concat(a))),i.onCreate=function(){i.toolbar=document.createElement("div"),i.toolbar.classList.add("ql-image-toolbar"),i.overlay.appendChild(i.toolbar),i._addToolbarButtons()},i.onDestroy=function(){},i.onUpdate=function(){},i._addToolbarButtons=function(){var t=document.createElement("span");t.classList.add("triangle-up"),i.toolbar.appendChild(t);var e=document.createElement("span");e.innerText="鍒犻櫎",e.addEventListener("click",function(){var t=new CustomEvent("keyup");t.keyCode=46,document.dispatchEvent(t)}),i.toolbar.appendChild(e)},u=n,r(i,u)}return i(e,t),e}(u.a)},function(t,e,n){var o=n(17),r=n(20),i=n(64),u=n(102),c=r(function(t){return t.push(void 0,i),o(u,void 0,t)});t.exports=c},function(t,e,n){"use strict";function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=n(38),i=n.n(r),u=n(34),c=n(35),a=n(37),s=n(36),f={DisplaySize:c.a,Toolbar:a.a,Resize:s.a},p=function t(e){var n=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};o(this,t),this.initializeModules=function(){n.removeModules(),n.modules=n.moduleClasses.map(function(t){return new(f[t]||t)(n)}),n.modules.forEach(function(t){t.onCreate()}),n.onUpdate()},this.onUpdate=function(){n.repositionElements(),n.modules.forEach(function(t){t.onUpdate()})},this.removeModules=function(){n.modules.forEach(function(t){t.onDestroy()}),n.modules=[]},this.handleClick=function(t){if(t.target&&t.target.tagName&&"IMG"===t.target.tagName.toUpperCase()){if(n.img===t.target)return;n.img&&n.hide(),n.show(t.target)}else n.img&&n.hide()},this.show=function(t){n.img=t,n.showOverlay(),n.initializeModules()},this.showOverlay=function(){n.overlay&&n.hideOverlay(),n.quill.setSelection(null),n.setUserSelect("none"),document.addEventListener("keyup",n.checkImage,!0),n.quill.root.addEventListener("input",n.checkImage,!0),n.overlay=document.createElement("div"),n.overlay.classList.add("ql-image-overlay"),n.quill.root.parentNode.appendChild(n.overlay),n.repositionElements()},this.hideOverlay=function(){n.overlay&&(n.quill.root.parentNode.removeChild(n.overlay),n.overlay=void 0,document.removeEventListener("keyup",n.checkImage),n.quill.root.removeEventListener("input",n.checkImage),n.setUserSelect(""))},this.repositionElements=function(){if(n.overlay&&n.img){var t=n.quill.root.parentNode,e=n.img.getBoundingClientRect(),o=t.getBoundingClientRect();Object.assign(n.overlay.style,{left:e.left-o.left-1+t.scrollLeft+"px",top:e.top-o.top+t.scrollTop+"px",width:e.width+"px",height:e.height+"px"})}},this.hide=function(){n.hideOverlay(),n.removeModules(),n.img=void 0},this.setUserSelect=function(t){["userSelect","mozUserSelect","webkitUserSelect","msUserSelect"].forEach(function(e){n.quill.root.style[e]=t,document.documentElement.style[e]=t})},this.checkImage=function(t){n.img&&(46!=t.keyCode&&8!=t.keyCode||window.Quill.find(n.img).deleteAt(0),n.hide())},this.quill=e;var c=!1;r.modules&&(c=r.modules.slice()),this.options=i()({},r,u.a),!1!==c&&(this.options.modules=c),document.execCommand("enableObjectResizing",!1,"false"),this.quill.root.addEventListener("click",this.handleClick,!1),this.quill.root.parentNode.style.position=this.quill.root.parentNode.style.position||"relative",this.moduleClasses=this.options.modules,this.modules=[]};e.default=p,window.Quill&&window.Quill.register("modules/imageResize",p)},function(t,e,n){function o(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var o=t[e];this.set(o[0],o[1])}}var r=n(67),i=n(68),u=n(69),c=n(70),a=n(71);o.prototype.clear=r,o.prototype.delete=i,o.prototype.get=u,o.prototype.has=c,o.prototype.set=a,t.exports=o},function(t,e,n){function o(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var o=t[e];this.set(o[0],o[1])}}var r=n(81),i=n(82),u=n(83),c=n(84),a=n(85);o.prototype.clear=r,o.prototype.delete=i,o.prototype.get=u,o.prototype.has=c,o.prototype.set=a,t.exports=o},function(t,e,n){function o(t){var e=this.__data__=new r(t);this.size=e.size}var r=n(3),i=n(93),u=n(94),c=n(95),a=n(96),s=n(97);o.prototype.clear=i,o.prototype.delete=u,o.prototype.get=c,o.prototype.has=a,o.prototype.set=s,t.exports=o},function(t,e,n){var o=n(1),r=o.Uint8Array;t.exports=r},function(t,e,n){function o(t,e){var n=u(t),o=!n&&i(t),f=!n&&!o&&c(t),l=!n&&!o&&!f&&s(t),d=n||o||f||l,h=d?r(t.length,String):[],v=h.length;for(var y in t)!e&&!p.call(t,y)||d&&("length"==y||f&&("offset"==y||"parent"==y)||l&&("buffer"==y||"byteLength"==y||"byteOffset"==y)||a(y,v))||h.push(y);return h}var r=n(54),i=n(28),u=n(29),c=n(30),a=n(24),s=n(32),f=Object.prototype,p=f.hasOwnProperty;t.exports=o},function(t,e,n){function o(t,e,n){var o=t[e];c.call(t,e)&&i(o,n)&&(void 0!==n||e in t)||r(t,e,n)}var r=n(10),i=n(8),u=Object.prototype,c=u.hasOwnProperty;t.exports=o},function(t,e,n){var o=n(0),r=Object.create,i=function(){function t(){}return function(e){if(!o(e))return{};if(r)return r(e);t.prototype=e;var n=new t;return t.prototype=void 0,n}}();t.exports=i},function(t,e,n){var o=n(63),r=o();t.exports=r},function(t,e,n){function o(t){return i(t)&&r(t)==u}var r=n(5),i=n(2),u="[object Arguments]";t.exports=o},function(t,e,n){function o(t){return!(!u(t)||i(t))&&(r(t)?h:s).test(c(t))}var r=n(13),i=n(75),u=n(0),c=n(98),a=/[\\^$.*+?()[\]{}|]/g,s=/^\[object .+?Constructor\]$/,f=Function.prototype,p=Object.prototype,l=f.toString,d=p.hasOwnProperty,h=RegExp("^"+l.call(d).replace(a,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=o},function(t,e,n){function o(t){return u(t)&&i(t.length)&&!!c[r(t)]}var r=n(5),i=n(31),u=n(2),c={};c["[object Float32Array]"]=c["[object Float64Array]"]=c["[object Int8Array]"]=c["[object Int16Array]"]=c["[object Int32Array]"]=c["[object Uint8Array]"]=c["[object Uint8ClampedArray]"]=c["[object Uint16Array]"]=c["[object Uint32Array]"]=!0,c["[object Arguments]"]=c["[object Array]"]=c["[object ArrayBuffer]"]=c["[object Boolean]"]=c["[object DataView]"]=c["[object Date]"]=c["[object Error]"]=c["[object Function]"]=c["[object Map]"]=c["[object Number]"]=c["[object Object]"]=c["[object RegExp]"]=c["[object Set]"]=c["[object String]"]=c["[object WeakMap]"]=!1,t.exports=o},function(t,e,n){function o(t){if(!r(t))return u(t);var e=i(t),n=[];for(var o in t)("constructor"!=o||!e&&a.call(t,o))&&n.push(o);return n}var r=n(0),i=n(25),u=n(86),c=Object.prototype,a=c.hasOwnProperty;t.exports=o},function(t,e,n){function o(t,e,n,o,g,_,m){var j=b(t,n),w=b(e,n),O=m.get(w);if(O)return void r(t,n,O);var E=_?_(j,w,n+"",t,e,m):void 0,z=void 0===E;if(z){var C=f(w),P=!C&&l(w),S=!C&&!P&&y(w);E=w,C||P||S?f(j)?E=j:p(j)?E=c(j):P?(z=!1,E=i(w,!0)):S?(z=!1,E=u(w,!0)):E=[]:v(w)||s(w)?(E=j,s(j)?E=x(j):h(j)&&!d(j)||(E=a(w))):z=!1}z&&(m.set(w,E),g(E,w,o,_,m),m.delete(w)),r(t,n,E)}var r=n(18),i=n(57),u=n(58),c=n(59),a=n(72),s=n(28),f=n(29),p=n(100),l=n(30),d=n(13),h=n(0),v=n(101),y=n(32),b=n(26),x=n(104);t.exports=o},function(t,e,n){var o=n(99),r=n(21),i=n(27),u=r?function(t,e){return r(t,"toString",{configurable:!0,enumerable:!1,value:o(e),writable:!0})}:i;t.exports=u},function(t,e){function n(t,e){for(var n=-1,o=Array(t);++n<t;)o[n]=e(n);return o}t.exports=n},function(t,e){function n(t){return function(e){return t(e)}}t.exports=n},function(t,e,n){function o(t){var e=new t.constructor(t.byteLength);return new r(e).set(new r(t)),e}var r=n(43);t.exports=o},function(t,e,n){(function(t){function o(t,e){if(e)return t.slice();var n=t.length,o=s?s(n):new t.constructor(n);return t.copy(o),o}var r=n(1),i="object"==typeof e&&e&&!e.nodeType&&e,u=i&&"object"==typeof t&&t&&!t.nodeType&&t,c=u&&u.exports===i,a=c?r.Buffer:void 0,s=a?a.allocUnsafe:void 0;t.exports=o}).call(e,n(14)(t))},function(t,e,n){function o(t,e){var n=e?r(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}var r=n(56);t.exports=o},function(t,e){function n(t,e){var n=-1,o=t.length;for(e||(e=Array(o));++n<o;)e[n]=t[n];return e}t.exports=n},function(t,e,n){function o(t,e,n,o){var u=!n;n||(n={});for(var c=-1,a=e.length;++c<a;){var s=e[c],f=o?o(n[s],t[s],s,n,t):void 0;void 0===f&&(f=t[s]),u?i(n,s,f):r(n,s,f)}return n}var r=n(45),i=n(10);t.exports=o},function(t,e,n){var o=n(1),r=o["__core-js_shared__"];t.exports=r},function(t,e,n){function o(t){return r(function(e,n){var o=-1,r=n.length,u=r>1?n[r-1]:void 0,c=r>2?n[2]:void 0;for(u=t.length>3&&"function"==typeof u?(r--,u):void 0,c&&i(n[0],n[1],c)&&(u=r<3?void 0:u,r=1),e=Object(e);++o<r;){var a=n[o];a&&t(e,a,o,u)}return e})}var r=n(20),i=n(73);t.exports=o},function(t,e){function n(t){return function(e,n,o){for(var r=-1,i=Object(e),u=o(e),c=u.length;c--;){var a=u[t?c:++r];if(!1===n(i[a],a,i))break}return e}}t.exports=n},function(t,e,n){function o(t,e,n,u,c,a){return i(t)&&i(e)&&(a.set(e,t),r(t,e,void 0,o,a),a.delete(e)),t}var r=n(19),i=n(0);t.exports=o},function(t,e,n){function o(t){var e=u.call(t,a),n=t[a];try{t[a]=void 0;var o=!0}catch(t){}var r=c.call(t);return o&&(e?t[a]=n:delete t[a]),r}var r=n(16),i=Object.prototype,u=i.hasOwnProperty,c=i.toString,a=r?r.toStringTag:void 0;t.exports=o},function(t,e){function n(t,e){return null==t?void 0:t[e]}t.exports=n},function(t,e,n){function o(){this.__data__=r?r(null):{},this.size=0}var r=n(7);t.exports=o},function(t,e){function n(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}t.exports=n},function(t,e,n){function o(t){var e=this.__data__;if(r){var n=e[t];return n===i?void 0:n}return c.call(e,t)?e[t]:void 0}var r=n(7),i="__lodash_hash_undefined__",u=Object.prototype,c=u.hasOwnProperty;t.exports=o},function(t,e,n){function o(t){var e=this.__data__;return r?void 0!==e[t]:u.call(e,t)}var r=n(7),i=Object.prototype,u=i.hasOwnProperty;t.exports=o},function(t,e,n){function o(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=r&&void 0===e?i:e,this}var r=n(7),i="__lodash_hash_undefined__";t.exports=o},function(t,e,n){function o(t){return"function"!=typeof t.constructor||u(t)?{}:r(i(t))}var r=n(46),i=n(23),u=n(25);t.exports=o},function(t,e,n){function o(t,e,n){if(!c(n))return!1;var o=typeof e;return!!("number"==o?i(n)&&u(e,n.length):"string"==o&&e in n)&&r(n[e],t)}var r=n(8),i=n(12),u=n(24),c=n(0);t.exports=o},function(t,e){function n(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}t.exports=n},function(t,e,n){function o(t){return!!i&&i in t}var r=n(61),i=function(){var t=/[^.]+$/.exec(r&&r.keys&&r.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();t.exports=o},function(t,e){function n(){this.__data__=[],this.size=0}t.exports=n},function(t,e,n){function o(t){var e=this.__data__,n=r(e,t);return!(n<0)&&(n==e.length-1?e.pop():u.call(e,n,1),--this.size,!0)}var r=n(4),i=Array.prototype,u=i.splice;t.exports=o},function(t,e,n){function o(t){var e=this.__data__,n=r(e,t);return n<0?void 0:e[n][1]}var r=n(4);t.exports=o},function(t,e,n){function o(t){return r(this.__data__,t)>-1}var r=n(4);t.exports=o},function(t,e,n){function o(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}var r=n(4);t.exports=o},function(t,e,n){function o(){this.size=0,this.__data__={hash:new r,map:new(u||i),string:new r}}var r=n(40),i=n(3),u=n(15);t.exports=o},function(t,e,n){function o(t){var e=r(this,t).delete(t);return this.size-=e?1:0,e}var r=n(6);t.exports=o},function(t,e,n){function o(t){return r(this,t).get(t)}var r=n(6);t.exports=o},function(t,e,n){function o(t){return r(this,t).has(t)}var r=n(6);t.exports=o},function(t,e,n){function o(t,e){var n=r(this,t),o=n.size;return n.set(t,e),this.size+=n.size==o?0:1,this}var r=n(6);t.exports=o},function(t,e){function n(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e}t.exports=n},function(t,e,n){(function(t){var o=n(22),r="object"==typeof e&&e&&!e.nodeType&&e,i=r&&"object"==typeof t&&t&&!t.nodeType&&t,u=i&&i.exports===r,c=u&&o.process,a=function(){try{var t=i&&i.require&&i.require("util").types;return t||c&&c.binding&&c.binding("util")}catch(t){}}();t.exports=a}).call(e,n(14)(t))},function(t,e){function n(t){return r.call(t)}var o=Object.prototype,r=o.toString;t.exports=n},function(t,e){function n(t,e){return function(n){return t(e(n))}}t.exports=n},function(t,e,n){function o(t,e,n){return e=i(void 0===e?t.length-1:e,0),function(){for(var o=arguments,u=-1,c=i(o.length-e,0),a=Array(c);++u<c;)a[u]=o[e+u];u=-1;for(var s=Array(e+1);++u<e;)s[u]=o[u];return s[e]=n(a),r(t,this,s)}}var r=n(17),i=Math.max;t.exports=o},function(t,e,n){var o=n(53),r=n(92),i=r(o);t.exports=i},function(t,e){function n(t){var e=0,n=0;return function(){var u=i(),c=r-(u-n);if(n=u,c>0){if(++e>=o)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var o=800,r=16,i=Date.now;t.exports=n},function(t,e,n){function o(){this.__data__=new r,this.size=0}var r=n(3);t.exports=o},function(t,e){function n(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}t.exports=n},function(t,e){function n(t){return this.__data__.get(t)}t.exports=n},function(t,e){function n(t){return this.__data__.has(t)}t.exports=n},function(t,e,n){function o(t,e){var n=this.__data__;if(n instanceof r){var o=n.__data__;if(!i||o.length<c-1)return o.push([t,e]),this.size=++n.size,this;n=this.__data__=new u(o)}return n.set(t,e),this.size=n.size,this}var r=n(3),i=n(15),u=n(41),c=200;t.exports=o},function(t,e){function n(t){if(null!=t){try{return r.call(t)}catch(t){}try{return t+""}catch(t){}}return""}var o=Function.prototype,r=o.toString;t.exports=n},function(t,e){function n(t){return function(){return t}}t.exports=n},function(t,e,n){function o(t){return i(t)&&r(t)}var r=n(12),i=n(2);t.exports=o},function(t,e,n){function o(t){if(!u(t)||r(t)!=c)return!1;var e=i(t);if(null===e)return!0;var n=p.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&f.call(n)==l}var r=n(5),i=n(23),u=n(2),c="[object Object]",a=Function.prototype,s=Object.prototype,f=a.toString,p=s.hasOwnProperty,l=f.call(Object);t.exports=o},function(t,e,n){var o=n(19),r=n(62),i=r(function(t,e,n,r){o(t,e,n,r)});t.exports=i},function(t,e){function n(){return!1}t.exports=n},function(t,e,n){function o(t){return r(t,i(t))}var r=n(60),i=n(33);t.exports=o},function(t,e){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(n=window)}t.exports=n}])});
\ No newline at end of file
diff --git a/uni_modules/sp-editor/static/quill.min.js b/uni_modules/sp-editor/static/quill.min.js
new file mode 100644
index 0000000..d9f46b8
--- /dev/null
+++ b/uni_modules/sp-editor/static/quill.min.js
@@ -0,0 +1,8 @@
+/*!
+ * Quill Editor v1.3.7
+ * https://quilljs.com/
+ * Copyright (c) 2014, Jason Chen
+ * Copyright (c) 2013, salesforce.com
+ */
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Quill=e():t.Quill=e()}("undefined"!=typeof self?self:this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var n={};return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=45)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(17),o=n(18),i=n(19),l=n(48),a=n(49),s=n(50),u=n(51),c=n(52),f=n(11),h=n(29),p=n(30),d=n(28),y=n(1),v={Scope:y.Scope,create:y.create,find:y.find,query:y.query,register:y.register,Container:r.default,Format:o.default,Leaf:i.default,Embed:u.default,Scroll:l.default,Block:s.default,Inline:a.default,Text:c.default,Attributor:{Attribute:f.default,Class:h.default,Style:p.default,Store:d.default}};e.default=v},function(t,e,n){"use strict";function r(t,e){var n=i(t);if(null==n)throw new s("Unable to create "+t+" blot");var r=n;return new r(t instanceof Node||t.nodeType===Node.TEXT_NODE?t:r.create(e),e)}function o(t,n){return void 0===n&&(n=!1),null==t?null:null!=t[e.DATA_KEY]?t[e.DATA_KEY].blot:n?o(t.parentNode,n):null}function i(t,e){void 0===e&&(e=p.ANY);var n;if("string"==typeof t)n=h[t]||u[t];else if(t instanceof Text||t.nodeType===Node.TEXT_NODE)n=h.text;else if("number"==typeof t)t&p.LEVEL&p.BLOCK?n=h.block:t&p.LEVEL&p.INLINE&&(n=h.inline);else if(t instanceof HTMLElement){var r=(t.getAttribute("class")||"").split(/\s+/);for(var o in r)if(n=c[r[o]])break;n=n||f[t.tagName]}return null==n?null:e&p.LEVEL&n.scope&&e&p.TYPE&n.scope?n:null}function l(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];if(t.length>1)return t.map(function(t){return l(t)});var n=t[0];if("string"!=typeof n.blotName&&"string"!=typeof n.attrName)throw new s("Invalid definition");if("abstract"===n.blotName)throw new s("Cannot register abstract class");if(h[n.blotName||n.attrName]=n,"string"==typeof n.keyName)u[n.keyName]=n;else if(null!=n.className&&(c[n.className]=n),null!=n.tagName){Array.isArray(n.tagName)?n.tagName=n.tagName.map(function(t){return t.toUpperCase()}):n.tagName=n.tagName.toUpperCase();var r=Array.isArray(n.tagName)?n.tagName:[n.tagName];r.forEach(function(t){null!=f[t]&&null!=n.className||(f[t]=n)})}return n}var a=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var s=function(t){function e(e){var n=this;return e="[Parchment] "+e,n=t.call(this,e)||this,n.message=e,n.name=n.constructor.name,n}return a(e,t),e}(Error);e.ParchmentError=s;var u={},c={},f={},h={};e.DATA_KEY="__blot";var p;!function(t){t[t.TYPE=3]="TYPE",t[t.LEVEL=12]="LEVEL",t[t.ATTRIBUTE=13]="ATTRIBUTE",t[t.BLOT=14]="BLOT",t[t.INLINE=7]="INLINE",t[t.BLOCK=11]="BLOCK",t[t.BLOCK_BLOT=10]="BLOCK_BLOT",t[t.INLINE_BLOT=6]="INLINE_BLOT",t[t.BLOCK_ATTRIBUTE=9]="BLOCK_ATTRIBUTE",t[t.INLINE_ATTRIBUTE=5]="INLINE_ATTRIBUTE",t[t.ANY=15]="ANY"}(p=e.Scope||(e.Scope={})),e.create=r,e.find=o,e.query=i,e.register=l},function(t,e){"use strict";var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString,o=Object.defineProperty,i=Object.getOwnPropertyDescriptor,l=function(t){return"function"==typeof Array.isArray?Array.isArray(t):"[object Array]"===r.call(t)},a=function(t){if(!t||"[object Object]"!==r.call(t))return!1;var e=n.call(t,"constructor"),o=t.constructor&&t.constructor.prototype&&n.call(t.constructor.prototype,"isPrototypeOf");if(t.constructor&&!e&&!o)return!1;var i;for(i in t);return void 0===i||n.call(t,i)},s=function(t,e){o&&"__proto__"===e.name?o(t,e.name,{enumerable:!0,configurable:!0,value:e.newValue,writable:!0}):t[e.name]=e.newValue},u=function(t,e){if("__proto__"===e){if(!n.call(t,e))return;if(i)return i(t,e).value}return t[e]};t.exports=function t(){var e,n,r,o,i,c,f=arguments[0],h=1,p=arguments.length,d=!1;for("boolean"==typeof f&&(d=f,f=arguments[1]||{},h=2),(null==f||"object"!=typeof f&&"function"!=typeof f)&&(f={});h<p;++h)if(null!=(e=arguments[h]))for(n in e)r=u(f,n),o=u(e,n),f!==o&&(d&&o&&(a(o)||(i=l(o)))?(i?(i=!1,c=r&&l(r)?r:[]):c=r&&a(r)?r:{},s(f,{name:n,newValue:t(d,c,o)})):void 0!==o&&s(f,{name:n,newValue:o}));return f}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return null==t?e:("function"==typeof t.formats&&(e=(0,f.default)(e,t.formats())),null==t.parent||"scroll"==t.parent.blotName||t.parent.statics.scope!==t.statics.scope?e:a(t.parent,e))}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BlockEmbed=e.bubbleFormats=void 0;var s=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),u=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},c=n(2),f=r(c),h=n(4),p=r(h),d=n(0),y=r(d),v=n(14),b=r(v),g=n(5),m=r(g),_=n(8),O=r(_),w=function(t){function e(){return o(this,e),i(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return l(e,t),s(e,[{key:"attach",value:function(){u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"attach",this).call(this),this.attributes=new y.default.Attributor.Store(this.domNode)}},{key:"delta",value:function(){return(new p.default).insert(this.value(),(0,f.default)(this.formats(),this.attributes.values()))}},{key:"format",value:function(t,e){var n=y.default.query(t,y.default.Scope.BLOCK_ATTRIBUTE);null!=n&&this.attributes.attribute(n,e)}},{key:"formatAt",value:function(t,e,n,r){this.format(n,r)}},{key:"insertAt",value:function(t,n,r){if("string"==typeof n&&n.endsWith("\n")){var o=y.default.create(x.blotName);this.parent.insertBefore(o,0===t?this:this.next),o.insertAt(0,n.slice(0,-1))}else u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertAt",this).call(this,t,n,r)}}]),e}(y.default.Embed);w.scope=y.default.Scope.BLOCK_BLOT;var x=function(t){function e(t){o(this,e);var n=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return n.cache={},n}return l(e,t),s(e,[{key:"delta",value:function(){return null==this.cache.delta&&(this.cache.delta=this.descendants(y.default.Leaf).reduce(function(t,e){return 0===e.length()?t:t.insert(e.value(),a(e))},new p.default).insert("\n",a(this))),this.cache.delta}},{key:"deleteAt",value:function(t,n){u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"deleteAt",this).call(this,t,n),this.cache={}}},{key:"formatAt",value:function(t,n,r,o){n<=0||(y.default.query(r,y.default.Scope.BLOCK)?t+n===this.length()&&this.format(r,o):u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"formatAt",this).call(this,t,Math.min(n,this.length()-t-1),r,o),this.cache={})}},{key:"insertAt",value:function(t,n,r){if(null!=r)return u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertAt",this).call(this,t,n,r);if(0!==n.length){var o=n.split("\n"),i=o.shift();i.length>0&&(t<this.length()-1||null==this.children.tail?u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertAt",this).call(this,Math.min(t,this.length()-1),i):this.children.tail.insertAt(this.children.tail.length(),i),this.cache={});var l=this;o.reduce(function(t,e){return l=l.split(t,!0),l.insertAt(0,e),e.length},t+i.length)}}},{key:"insertBefore",value:function(t,n){var r=this.children.head;u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertBefore",this).call(this,t,n),r instanceof b.default&&r.remove(),this.cache={}}},{key:"length",value:function(){return null==this.cache.length&&(this.cache.length=u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"length",this).call(this)+1),this.cache.length}},{key:"moveChildren",value:function(t,n){u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"moveChildren",this).call(this,t,n),this.cache={}}},{key:"optimize",value:function(t){u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t),this.cache={}}},{key:"path",value:function(t){return u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"path",this).call(this,t,!0)}},{key:"removeChild",value:function(t){u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"removeChild",this).call(this,t),this.cache={}}},{key:"split",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(n&&(0===t||t>=this.length()-1)){var r=this.clone();return 0===t?(this.parent.insertBefore(r,this),this):(this.parent.insertBefore(r,this.next),r)}var o=u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"split",this).call(this,t,n);return this.cache={},o}}]),e}(y.default.Block);x.blotName="block",x.tagName="P",x.defaultChild="break",x.allowedChildren=[m.default,y.default.Embed,O.default],e.bubbleFormats=a,e.BlockEmbed=w,e.default=x},function(t,e,n){var r=n(54),o=n(12),i=n(2),l=n(20),a=String.fromCharCode(0),s=function(t){Array.isArray(t)?this.ops=t:null!=t&&Array.isArray(t.ops)?this.ops=t.ops:this.ops=[]};s.prototype.insert=function(t,e){var n={};return 0===t.length?this:(n.insert=t,null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n))},s.prototype.delete=function(t){return t<=0?this:this.push({delete:t})},s.prototype.retain=function(t,e){if(t<=0)return this;var n={retain:t};return null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n)},s.prototype.push=function(t){var e=this.ops.length,n=this.ops[e-1];if(t=i(!0,{},t),"object"==typeof n){if("number"==typeof t.delete&&"number"==typeof n.delete)return this.ops[e-1]={delete:n.delete+t.delete},this;if("number"==typeof n.delete&&null!=t.insert&&(e-=1,"object"!=typeof(n=this.ops[e-1])))return this.ops.unshift(t),this;if(o(t.attributes,n.attributes)){if("string"==typeof t.insert&&"string"==typeof n.insert)return this.ops[e-1]={insert:n.insert+t.insert},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this;if("number"==typeof t.retain&&"number"==typeof n.retain)return this.ops[e-1]={retain:n.retain+t.retain},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this}}return e===this.ops.length?this.ops.push(t):this.ops.splice(e,0,t),this},s.prototype.chop=function(){var t=this.ops[this.ops.length-1];return t&&t.retain&&!t.attributes&&this.ops.pop(),this},s.prototype.filter=function(t){return this.ops.filter(t)},s.prototype.forEach=function(t){this.ops.forEach(t)},s.prototype.map=function(t){return this.ops.map(t)},s.prototype.partition=function(t){var e=[],n=[];return this.forEach(function(r){(t(r)?e:n).push(r)}),[e,n]},s.prototype.reduce=function(t,e){return this.ops.reduce(t,e)},s.prototype.changeLength=function(){return this.reduce(function(t,e){return e.insert?t+l.length(e):e.delete?t-e.delete:t},0)},s.prototype.length=function(){return this.reduce(function(t,e){return t+l.length(e)},0)},s.prototype.slice=function(t,e){t=t||0,"number"!=typeof e&&(e=1/0);for(var n=[],r=l.iterator(this.ops),o=0;o<e&&r.hasNext();){var i;o<t?i=r.next(t-o):(i=r.next(e-o),n.push(i)),o+=l.length(i)}return new s(n)},s.prototype.compose=function(t){var e=l.iterator(this.ops),n=l.iterator(t.ops),r=[],i=n.peek();if(null!=i&&"number"==typeof i.retain&&null==i.attributes){for(var a=i.retain;"insert"===e.peekType()&&e.peekLength()<=a;)a-=e.peekLength(),r.push(e.next());i.retain-a>0&&n.next(i.retain-a)}for(var u=new s(r);e.hasNext()||n.hasNext();)if("insert"===n.peekType())u.push(n.next());else if("delete"===e.peekType())u.push(e.next());else{var c=Math.min(e.peekLength(),n.peekLength()),f=e.next(c),h=n.next(c);if("number"==typeof h.retain){var p={};"number"==typeof f.retain?p.retain=c:p.insert=f.insert;var d=l.attributes.compose(f.attributes,h.attributes,"number"==typeof f.retain);if(d&&(p.attributes=d),u.push(p),!n.hasNext()&&o(u.ops[u.ops.length-1],p)){var y=new s(e.rest());return u.concat(y).chop()}}else"number"==typeof h.delete&&"number"==typeof f.retain&&u.push(h)}return u.chop()},s.prototype.concat=function(t){var e=new s(this.ops.slice());return t.ops.length>0&&(e.push(t.ops[0]),e.ops=e.ops.concat(t.ops.slice(1))),e},s.prototype.diff=function(t,e){if(this.ops===t.ops)return new s;var n=[this,t].map(function(e){return e.map(function(n){if(null!=n.insert)return"string"==typeof n.insert?n.insert:a;var r=e===t?"on":"with";throw new Error("diff() called "+r+" non-document")}).join("")}),i=new s,u=r(n[0],n[1],e),c=l.iterator(this.ops),f=l.iterator(t.ops);return u.forEach(function(t){for(var e=t[1].length;e>0;){var n=0;switch(t[0]){case r.INSERT:n=Math.min(f.peekLength(),e),i.push(f.next(n));break;case r.DELETE:n=Math.min(e,c.peekLength()),c.next(n),i.delete(n);break;case r.EQUAL:n=Math.min(c.peekLength(),f.peekLength(),e);var a=c.next(n),s=f.next(n);o(a.insert,s.insert)?i.retain(n,l.attributes.diff(a.attributes,s.attributes)):i.push(s).delete(n)}e-=n}}),i.chop()},s.prototype.eachLine=function(t,e){e=e||"\n";for(var n=l.iterator(this.ops),r=new s,o=0;n.hasNext();){if("insert"!==n.peekType())return;var i=n.peek(),a=l.length(i)-n.peekLength(),u="string"==typeof i.insert?i.insert.indexOf(e,a)-a:-1;if(u<0)r.push(n.next());else if(u>0)r.push(n.next(u));else{if(!1===t(r,n.next(1).attributes||{},o))return;o+=1,r=new s}}r.length()>0&&t(r,{},o)},s.prototype.transform=function(t,e){if(e=!!e,"number"==typeof t)return this.transformPosition(t,e);for(var n=l.iterator(this.ops),r=l.iterator(t.ops),o=new s;n.hasNext()||r.hasNext();)if("insert"!==n.peekType()||!e&&"insert"===r.peekType())if("insert"===r.peekType())o.push(r.next());else{var i=Math.min(n.peekLength(),r.peekLength()),a=n.next(i),u=r.next(i);if(a.delete)continue;u.delete?o.push(u):o.retain(i,l.attributes.transform(a.attributes,u.attributes,e))}else o.retain(l.length(n.next()));return o.chop()},s.prototype.transformPosition=function(t,e){e=!!e;for(var n=l.iterator(this.ops),r=0;n.hasNext()&&r<=t;){var o=n.peekLength(),i=n.peekType();n.next(),"delete"!==i?("insert"===i&&(r<t||!e)&&(t+=o),r+=o):t-=Math.min(o,t-r)}return t},t.exports=s},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),s=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},u=n(8),c=r(u),f=n(0),h=r(f),p=function(t){function e(){return o(this,e),i(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return l(e,t),a(e,[{key:"formatAt",value:function(t,n,r,o){if(e.compare(this.statics.blotName,r)<0&&h.default.query(r,h.default.Scope.BLOT)){var i=this.isolate(t,n);o&&i.wrap(r,o)}else s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"formatAt",this).call(this,t,n,r,o)}},{key:"optimize",value:function(t){if(s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t),this.parent instanceof e&&e.compare(this.statics.blotName,this.parent.statics.blotName)>0){var n=this.parent.isolate(this.offset(),this.length());this.moveChildren(n),n.wrap(this)}}}],[{key:"compare",value:function(t,n){var r=e.order.indexOf(t),o=e.order.indexOf(n);return r>=0||o>=0?r-o:t===n?0:t<n?-1:1}}]),e}(h.default.Inline);p.allowedChildren=[p,h.default.Embed,c.default],p.order=["cursor","inline","underline","strike","italic","bold","script","link","code"],e.default=p},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){if(e=(0,N.default)(!0,{container:t,modules:{clipboard:!0,keyboard:!0,history:!0}},e),e.theme&&e.theme!==S.DEFAULTS.theme){if(e.theme=S.import("themes/"+e.theme),null==e.theme)throw new Error("Invalid theme "+e.theme+". Did you register it?")}else e.theme=T.default;var n=(0,N.default)(!0,{},e.theme.DEFAULTS);[n,e].forEach(function(t){t.modules=t.modules||{},Object.keys(t.modules).forEach(function(e){!0===t.modules[e]&&(t.modules[e]={})})});var r=Object.keys(n.modules).concat(Object.keys(e.modules)),o=r.reduce(function(t,e){var n=S.import("modules/"+e);return null==n?P.error("Cannot load "+e+" module. Are you sure you registered it?"):t[e]=n.DEFAULTS||{},t},{});return null!=e.modules&&e.modules.toolbar&&e.modules.toolbar.constructor!==Object&&(e.modules.toolbar={container:e.modules.toolbar}),e=(0,N.default)(!0,{},S.DEFAULTS,{modules:o},n,e),["bounds","container","scrollingContainer"].forEach(function(t){"string"==typeof e[t]&&(e[t]=document.querySelector(e[t]))}),e.modules=Object.keys(e.modules).reduce(function(t,n){return e.modules[n]&&(t[n]=e.modules[n]),t},{}),e}function a(t,e,n,r){if(this.options.strict&&!this.isEnabled()&&e===g.default.sources.USER)return new d.default;var o=null==n?null:this.getSelection(),i=this.editor.delta,l=t();if(null!=o&&(!0===n&&(n=o.index),null==r?o=u(o,l,e):0!==r&&(o=u(o,n,r,e)),this.setSelection(o,g.default.sources.SILENT)),l.length()>0){var a,s=[g.default.events.TEXT_CHANGE,l,i,e];if((a=this.emitter).emit.apply(a,[g.default.events.EDITOR_CHANGE].concat(s)),e!==g.default.sources.SILENT){var c;(c=this.emitter).emit.apply(c,s)}}return l}function s(t,e,n,r,o){var i={};return"number"==typeof t.index&&"number"==typeof t.length?"number"!=typeof e?(o=r,r=n,n=e,e=t.length,t=t.index):(e=t.length,t=t.index):"number"!=typeof e&&(o=r,r=n,n=e,e=0),"object"===(void 0===n?"undefined":c(n))?(i=n,o=r):"string"==typeof n&&(null!=r?i[n]=r:o=n),o=o||g.default.sources.API,[t,e,i,o]}function u(t,e,n,r){if(null==t)return null;var o=void 0,i=void 0;if(e instanceof d.default){var l=[t.index,t.index+t.length].map(function(t){return e.transformPosition(t,r!==g.default.sources.USER)}),a=f(l,2);o=a[0],i=a[1]}else{var s=[t.index,t.index+t.length].map(function(t){return t<e||t===e&&r===g.default.sources.USER?t:n>=0?t+n:Math.max(e,t+n)}),u=f(s,2);o=u[0],i=u[1]}return new x.Range(o,i-o)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.overload=e.expandConfig=void 0;var c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),h=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}();n(53);var p=n(4),d=r(p),y=n(57),v=r(y),b=n(9),g=r(b),m=n(7),_=r(m),O=n(0),w=r(O),x=n(22),k=r(x),E=n(2),N=r(E),j=n(10),A=r(j),q=n(32),T=r(q),P=(0,A.default)("quill"),S=function(){function t(e){var n=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(i(this,t),this.options=l(e,r),this.container=this.options.container,null==this.container)return P.error("Invalid Quill container",e);this.options.debug&&t.debug(this.options.debug);var o=this.container.innerHTML.trim();this.container.classList.add("ql-container"),this.container.innerHTML="",this.container.__quill=this,this.root=this.addContainer("ql-editor"),this.root.classList.add("ql-blank"),this.root.setAttribute("data-gramm",!1),this.scrollingContainer=this.options.scrollingContainer||this.root,this.emitter=new g.default,this.scroll=w.default.create(this.root,{emitter:this.emitter,whitelist:this.options.formats}),this.editor=new v.default(this.scroll),this.selection=new k.default(this.scroll,this.emitter),this.theme=new this.options.theme(this,this.options),this.keyboard=this.theme.addModule("keyboard"),this.clipboard=this.theme.addModule("clipboard"),this.history=this.theme.addModule("history"),this.theme.init(),this.emitter.on(g.default.events.EDITOR_CHANGE,function(t){t===g.default.events.TEXT_CHANGE&&n.root.classList.toggle("ql-blank",n.editor.isBlank())}),this.emitter.on(g.default.events.SCROLL_UPDATE,function(t,e){var r=n.selection.lastRange,o=r&&0===r.length?r.index:void 0;a.call(n,function(){return n.editor.update(null,e,o)},t)});var s=this.clipboard.convert("<div class='ql-editor' style=\"white-space: normal;\">"+o+"<p><br></p></div>");this.setContents(s),this.history.clear(),this.options.placeholder&&this.root.setAttribute("data-placeholder",this.options.placeholder),this.options.readOnly&&this.disable()}return h(t,null,[{key:"debug",value:function(t){!0===t&&(t="log"),A.default.level(t)}},{key:"find",value:function(t){return t.__quill||w.default.find(t)}},{key:"import",value:function(t){return null==this.imports[t]&&P.error("Cannot import "+t+". Are you sure it was registered?"),this.imports[t]}},{key:"register",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if("string"!=typeof t){var o=t.attrName||t.blotName;"string"==typeof o?this.register("formats/"+o,t,e):Object.keys(t).forEach(function(r){n.register(r,t[r],e)})}else null==this.imports[t]||r||P.warn("Overwriting "+t+" with",e),this.imports[t]=e,(t.startsWith("blots/")||t.startsWith("formats/"))&&"abstract"!==e.blotName?w.default.register(e):t.startsWith("modules")&&"function"==typeof e.register&&e.register()}}]),h(t,[{key:"addContainer",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if("string"==typeof t){var n=t;t=document.createElement("div"),t.classList.add(n)}return this.container.insertBefore(t,e),t}},{key:"blur",value:function(){this.selection.setRange(null)}},{key:"deleteText",value:function(t,e,n){var r=this,o=s(t,e,n),i=f(o,4);return t=i[0],e=i[1],n=i[3],a.call(this,function(){return r.editor.deleteText(t,e)},n,t,-1*e)}},{key:"disable",value:function(){this.enable(!1)}},{key:"enable",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.scroll.enable(t),this.container.classList.toggle("ql-disabled",!t)}},{key:"focus",value:function(){var t=this.scrollingContainer.scrollTop;this.selection.focus(),this.scrollingContainer.scrollTop=t,this.scrollIntoView()}},{key:"format",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:g.default.sources.API;return a.call(this,function(){var r=n.getSelection(!0),i=new d.default;if(null==r)return i;if(w.default.query(t,w.default.Scope.BLOCK))i=n.editor.formatLine(r.index,r.length,o({},t,e));else{if(0===r.length)return n.selection.format(t,e),i;i=n.editor.formatText(r.index,r.length,o({},t,e))}return n.setSelection(r,g.default.sources.SILENT),i},r)}},{key:"formatLine",value:function(t,e,n,r,o){var i=this,l=void 0,u=s(t,e,n,r,o),c=f(u,4);return t=c[0],e=c[1],l=c[2],o=c[3],a.call(this,function(){return i.editor.formatLine(t,e,l)},o,t,0)}},{key:"formatText",value:function(t,e,n,r,o){var i=this,l=void 0,u=s(t,e,n,r,o),c=f(u,4);return t=c[0],e=c[1],l=c[2],o=c[3],a.call(this,function(){return i.editor.formatText(t,e,l)},o,t,0)}},{key:"getBounds",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=void 0;n="number"==typeof t?this.selection.getBounds(t,e):this.selection.getBounds(t.index,t.length);var r=this.container.getBoundingClientRect();return{bottom:n.bottom-r.top,height:n.height,left:n.left-r.left,right:n.right-r.left,top:n.top-r.top,width:n.width}}},{key:"getContents",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getLength()-t,n=s(t,e),r=f(n,2);return t=r[0],e=r[1],this.editor.getContents(t,e)}},{key:"getFormat",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.getSelection(!0),e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return"number"==typeof t?this.editor.getFormat(t,e):this.editor.getFormat(t.index,t.length)}},{key:"getIndex",value:function(t){return t.offset(this.scroll)}},{key:"getLength",value:function(){return this.scroll.length()}},{key:"getLeaf",value:function(t){return this.scroll.leaf(t)}},{key:"getLine",value:function(t){return this.scroll.line(t)}},{key:"getLines",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;return"number"!=typeof t?this.scroll.lines(t.index,t.length):this.scroll.lines(t,e)}},{key:"getModule",value:function(t){return this.theme.modules[t]}},{key:"getSelection",value:function(){return arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.focus(),this.update(),this.selection.getRange()[0]}},{key:"getText",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getLength()-t,n=s(t,e),r=f(n,2);return t=r[0],e=r[1],this.editor.getText(t,e)}},{key:"hasFocus",value:function(){return this.selection.hasFocus()}},{key:"insertEmbed",value:function(e,n,r){var o=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:t.sources.API;return a.call(this,function(){return o.editor.insertEmbed(e,n,r)},i,e)}},{key:"insertText",value:function(t,e,n,r,o){var i=this,l=void 0,u=s(t,0,n,r,o),c=f(u,4);return t=c[0],l=c[2],o=c[3],a.call(this,function(){return i.editor.insertText(t,e,l)},o,t,e.length)}},{key:"isEnabled",value:function(){return!this.container.classList.contains("ql-disabled")}},{key:"off",value:function(){return this.emitter.off.apply(this.emitter,arguments)}},{key:"on",value:function(){return this.emitter.on.apply(this.emitter,arguments)}},{key:"once",value:function(){return this.emitter.once.apply(this.emitter,arguments)}},{key:"pasteHTML",value:function(t,e,n){this.clipboard.dangerouslyPasteHTML(t,e,n)}},{key:"removeFormat",value:function(t,e,n){var r=this,o=s(t,e,n),i=f(o,4);return t=i[0],e=i[1],n=i[3],a.call(this,function(){return r.editor.removeFormat(t,e)},n,t)}},{key:"scrollIntoView",value:function(){this.selection.scrollIntoView(this.scrollingContainer)}},{key:"setContents",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g.default.sources.API;return a.call(this,function(){t=new d.default(t);var n=e.getLength(),r=e.editor.deleteText(0,n),o=e.editor.applyDelta(t),i=o.ops[o.ops.length-1];return null!=i&&"string"==typeof i.insert&&"\n"===i.insert[i.insert.length-1]&&(e.editor.deleteText(e.getLength()-1,1),o.delete(1)),r.compose(o)},n)}},{key:"setSelection",value:function(e,n,r){if(null==e)this.selection.setRange(null,n||t.sources.API);else{var o=s(e,n,r),i=f(o,4);e=i[0],n=i[1],r=i[3],this.selection.setRange(new x.Range(e,n),r),r!==g.default.sources.SILENT&&this.selection.scrollIntoView(this.scrollingContainer)}}},{key:"setText",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g.default.sources.API,n=(new d.default).insert(t);return this.setContents(n,e)}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:g.default.sources.USER,e=this.scroll.update(t);return this.selection.update(t),e}},{key:"updateContents",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g.default.sources.API;return a.call(this,function(){return t=new d.default(t),e.editor.applyDelta(t,n)},n,!0)}}]),t}();S.DEFAULTS={bounds:null,formats:null,modules:{},placeholder:"",readOnly:!1,scrollingContainer:null,strict:!0,theme:"default"},S.events=g.default.events,S.sources=g.default.sources,S.version="1.3.7",S.imports={delta:d.default,parchment:w.default,"core/module":_.default,"core/theme":T.default},e.expandConfig=l,e.overload=s,e.default=S},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};r(this,t),this.quill=e,this.options=n};o.DEFAULTS={},e.default=o},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=n(0),a=function(t){return t&&t.__esModule?t:{default:t}}(l),s=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),e}(a.default.Text);e.default=s},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),s=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},u=n(58),c=r(u),f=n(10),h=r(f),p=(0,h.default)("quill:events");["selectionchange","mousedown","mouseup","click"].forEach(function(t){document.addEventListener(t,function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];[].slice.call(document.querySelectorAll(".ql-container")).forEach(function(t){if(t.__quill&&t.__quill.emitter){var n;(n=t.__quill.emitter).handleDOM.apply(n,e)}})})});var d=function(t){function e(){o(this,e);var t=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return t.listeners={},t.on("error",p.error),t}return l(e,t),a(e,[{key:"emit",value:function(){p.log.apply(p,arguments),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"emit",this).apply(this,arguments)}},{key:"handleDOM",value:function(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;r<e;r++)n[r-1]=arguments[r];(this.listeners[t.type]||[]).forEach(function(e){var r=e.node,o=e.handler;(t.target===r||r.contains(t.target))&&o.apply(void 0,[t].concat(n))})}},{key:"listenDOM",value:function(t,e,n){this.listeners[t]||(this.listeners[t]=[]),this.listeners[t].push({node:e,handler:n})}}]),e}(c.default);d.events={EDITOR_CHANGE:"editor-change",SCROLL_BEFORE_UPDATE:"scroll-before-update",SCROLL_OPTIMIZE:"scroll-optimize",SCROLL_UPDATE:"scroll-update",SELECTION_CHANGE:"selection-change",TEXT_CHANGE:"text-change"},d.sources={API:"api",SILENT:"silent",USER:"user"},e.default=d},function(t,e,n){"use strict";function r(t){if(i.indexOf(t)<=i.indexOf(l)){for(var e,n=arguments.length,r=Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];(e=console)[t].apply(e,r)}}function o(t){return i.reduce(function(e,n){return e[n]=r.bind(console,n,t),e},{})}Object.defineProperty(e,"__esModule",{value:!0});var i=["error","warn","log","info"],l="warn";r.level=o.level=function(t){l=t},e.default=o},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(1),o=function(){function t(t,e,n){void 0===n&&(n={}),this.attrName=t,this.keyName=e;var o=r.Scope.TYPE&r.Scope.ATTRIBUTE;null!=n.scope?this.scope=n.scope&r.Scope.LEVEL|o:this.scope=r.Scope.ATTRIBUTE,null!=n.whitelist&&(this.whitelist=n.whitelist)}return t.keys=function(t){return[].map.call(t.attributes,function(t){return t.name})},t.prototype.add=function(t,e){return!!this.canAdd(t,e)&&(t.setAttribute(this.keyName,e),!0)},t.prototype.canAdd=function(t,e){return null!=r.query(t,r.Scope.BLOT&(this.scope|r.Scope.TYPE))&&(null==this.whitelist||("string"==typeof e?this.whitelist.indexOf(e.replace(/["']/g,""))>-1:this.whitelist.indexOf(e)>-1))},t.prototype.remove=function(t){t.removeAttribute(this.keyName)},t.prototype.value=function(t){var e=t.getAttribute(this.keyName);return this.canAdd(t,e)&&e?e:""},t}();e.default=o},function(t,e,n){function r(t){return null===t||void 0===t}function o(t){return!(!t||"object"!=typeof t||"number"!=typeof t.length)&&("function"==typeof t.copy&&"function"==typeof t.slice&&!(t.length>0&&"number"!=typeof t[0]))}function i(t,e,n){var i,c;if(r(t)||r(e))return!1;if(t.prototype!==e.prototype)return!1;if(s(t))return!!s(e)&&(t=l.call(t),e=l.call(e),u(t,e,n));if(o(t)){if(!o(e))return!1;if(t.length!==e.length)return!1;for(i=0;i<t.length;i++)if(t[i]!==e[i])return!1;return!0}try{var f=a(t),h=a(e)}catch(t){return!1}if(f.length!=h.length)return!1;for(f.sort(),h.sort(),i=f.length-1;i>=0;i--)if(f[i]!=h[i])return!1;for(i=f.length-1;i>=0;i--)if(c=f[i],!u(t[c],e[c],n))return!1;return typeof t==typeof e}var l=Array.prototype.slice,a=n(55),s=n(56),u=t.exports=function(t,e,n){return n||(n={}),t===e||(t instanceof Date&&e instanceof Date?t.getTime()===e.getTime():!t||!e||"object"!=typeof t&&"object"!=typeof e?n.strict?t===e:t==e:i(t,e,n))}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.Code=void 0;var a=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),u=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},c=n(4),f=r(c),h=n(0),p=r(h),d=n(3),y=r(d),v=n(5),b=r(v),g=n(8),m=r(g),_=function(t){function e(){return o(this,e),i(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return l(e,t),e}(b.default);_.blotName="code",_.tagName="CODE";var O=function(t){function e(){return o(this,e),i(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return l(e,t),s(e,[{key:"delta",value:function(){var t=this,e=this.domNode.textContent;return e.endsWith("\n")&&(e=e.slice(0,-1)),e.split("\n").reduce(function(e,n){return e.insert(n).insert("\n",t.formats())},new f.default)}},{key:"format",value:function(t,n){if(t!==this.statics.blotName||!n){var r=this.descendant(m.default,this.length()-1),o=a(r,1),i=o[0];null!=i&&i.deleteAt(i.length()-1,1),u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"format",this).call(this,t,n)}}},{key:"formatAt",value:function(t,n,r,o){if(0!==n&&null!=p.default.query(r,p.default.Scope.BLOCK)&&(r!==this.statics.blotName||o!==this.statics.formats(this.domNode))){var i=this.newlineIndex(t);if(!(i<0||i>=t+n)){var l=this.newlineIndex(t,!0)+1,a=i-l+1,s=this.isolate(l,a),u=s.next;s.format(r,o),u instanceof e&&u.formatAt(0,t-l+n-a,r,o)}}}},{key:"insertAt",value:function(t,e,n){if(null==n){var r=this.descendant(m.default,t),o=a(r,2),i=o[0],l=o[1];i.insertAt(l,e)}}},{key:"length",value:function(){var t=this.domNode.textContent.length;return this.domNode.textContent.endsWith("\n")?t:t+1}},{key:"newlineIndex",value:function(t){if(arguments.length>1&&void 0!==arguments[1]&&arguments[1])return this.domNode.textContent.slice(0,t).lastIndexOf("\n");var e=this.domNode.textContent.slice(t).indexOf("\n");return e>-1?t+e:-1}},{key:"optimize",value:function(t){this.domNode.textContent.endsWith("\n")||this.appendChild(p.default.create("text","\n")),u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t);var n=this.next;null!=n&&n.prev===this&&n.statics.blotName===this.statics.blotName&&this.statics.formats(this.domNode)===n.statics.formats(n.domNode)&&(n.optimize(t),n.moveChildren(this),n.remove())}},{key:"replace",value:function(t){u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"replace",this).call(this,t),[].slice.call(this.domNode.querySelectorAll("*")).forEach(function(t){var e=p.default.find(t);null==e?t.parentNode.removeChild(t):e instanceof p.default.Embed?e.remove():e.unwrap()})}}],[{key:"create",value:function(t){var n=u(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return n.setAttribute("spellcheck",!1),n}},{key:"formats",value:function(){return!0}}]),e}(y.default);O.blotName="code-block",O.tagName="PRE",O.TAB="  ",e.Code=_,e.default=O},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),a=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},s=n(0),u=function(t){return t&&t.__esModule?t:{default:t}}(s),c=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),l(e,[{key:"insertInto",value:function(t,n){0===t.children.length?a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertInto",this).call(this,t,n):this.remove()}},{key:"length",value:function(){return 0}},{key:"value",value:function(){return""}}],[{key:"value",value:function(){}}]),e}(u.default.Embed);c.blotName="break",c.tagName="BR",e.default=c},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function l(t,e){var n=document.createElement("a");n.href=t;var r=n.href.slice(0,n.href.indexOf(":"));return e.indexOf(r)>-1}Object.defineProperty(e,"__esModule",{value:!0}),e.sanitize=e.default=void 0;var a=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),s=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},u=n(5),c=function(t){return t&&t.__esModule?t:{default:t}}(u),f=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),a(e,[{key:"format",value:function(t,n){if(t!==this.statics.blotName||!n)return s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"format",this).call(this,t,n);n=this.constructor.sanitize(n),this.domNode.setAttribute("href",n)}}],[{key:"create",value:function(t){var n=s(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return t=this.sanitize(t),n.setAttribute("href",t),n.setAttribute("rel","noopener noreferrer"),n.setAttribute("target","_blank"),n}},{key:"formats",value:function(t){return t.getAttribute("href")}},{key:"sanitize",value:function(t){return l(t,this.PROTOCOL_WHITELIST)?t:this.SANITIZED_URL}}]),e}(c.default);f.blotName="link",f.tagName="A",f.SANITIZED_URL="about:blank",f.PROTOCOL_WHITELIST=["http","https","mailto","tel"],e.default=f,e.sanitize=l},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){t.setAttribute(e,!("true"===t.getAttribute(e)))}Object.defineProperty(e,"__esModule",{value:!0});var l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),s=n(25),u=r(s),c=n(106),f=r(c),h=0,p=function(){function t(e){var n=this;o(this,t),this.select=e,this.container=document.createElement("span"),this.buildPicker(),this.select.style.display="none",this.select.parentNode.insertBefore(this.container,this.select),this.label.addEventListener("mousedown",function(){n.togglePicker()}),this.label.addEventListener("keydown",function(t){switch(t.keyCode){case u.default.keys.ENTER:n.togglePicker();break;case u.default.keys.ESCAPE:n.escape(),t.preventDefault()}}),this.select.addEventListener("change",this.update.bind(this))}return a(t,[{key:"togglePicker",value:function(){this.container.classList.toggle("ql-expanded"),i(this.label,"aria-expanded"),i(this.options,"aria-hidden")}},{key:"buildItem",value:function(t){var e=this,n=document.createElement("span");return n.tabIndex="0",n.setAttribute("role","button"),n.classList.add("ql-picker-item"),t.hasAttribute("value")&&n.setAttribute("data-value",t.getAttribute("value")),t.textContent&&n.setAttribute("data-label",t.textContent),n.addEventListener("click",function(){e.selectItem(n,!0)}),n.addEventListener("keydown",function(t){switch(t.keyCode){case u.default.keys.ENTER:e.selectItem(n,!0),t.preventDefault();break;case u.default.keys.ESCAPE:e.escape(),t.preventDefault()}}),n}},{key:"buildLabel",value:function(){var t=document.createElement("span");return t.classList.add("ql-picker-label"),t.innerHTML=f.default,t.tabIndex="0",t.setAttribute("role","button"),t.setAttribute("aria-expanded","false"),this.container.appendChild(t),t}},{key:"buildOptions",value:function(){var t=this,e=document.createElement("span");e.classList.add("ql-picker-options"),e.setAttribute("aria-hidden","true"),e.tabIndex="-1",e.id="ql-picker-options-"+h,h+=1,this.label.setAttribute("aria-controls",e.id),this.options=e,[].slice.call(this.select.options).forEach(function(n){var r=t.buildItem(n);e.appendChild(r),!0===n.selected&&t.selectItem(r)}),this.container.appendChild(e)}},{key:"buildPicker",value:function(){var t=this;[].slice.call(this.select.attributes).forEach(function(e){t.container.setAttribute(e.name,e.value)}),this.container.classList.add("ql-picker"),this.label=this.buildLabel(),this.buildOptions()}},{key:"escape",value:function(){var t=this;this.close(),setTimeout(function(){return t.label.focus()},1)}},{key:"close",value:function(){this.container.classList.remove("ql-expanded"),this.label.setAttribute("aria-expanded","false"),this.options.setAttribute("aria-hidden","true")}},{key:"selectItem",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.container.querySelector(".ql-selected");if(t!==n&&(null!=n&&n.classList.remove("ql-selected"),null!=t&&(t.classList.add("ql-selected"),this.select.selectedIndex=[].indexOf.call(t.parentNode.children,t),t.hasAttribute("data-value")?this.label.setAttribute("data-value",t.getAttribute("data-value")):this.label.removeAttribute("data-value"),t.hasAttribute("data-label")?this.label.setAttribute("data-label",t.getAttribute("data-label")):this.label.removeAttribute("data-label"),e))){if("function"==typeof Event)this.select.dispatchEvent(new Event("change"));else if("object"===("undefined"==typeof Event?"undefined":l(Event))){var r=document.createEvent("Event");r.initEvent("change",!0,!0),this.select.dispatchEvent(r)}this.close()}}},{key:"update",value:function(){var t=void 0;if(this.select.selectedIndex>-1){var e=this.container.querySelector(".ql-picker-options").children[this.select.selectedIndex];t=this.select.options[this.select.selectedIndex],this.selectItem(e)}else this.selectItem(null);var n=null!=t&&t!==this.select.querySelector("option[selected]");this.label.classList.toggle("ql-active",n)}}]),t}();e.default=p},function(t,e,n){"use strict";function r(t){var e=a.find(t);if(null==e)try{e=a.create(t)}catch(n){e=a.create(a.Scope.INLINE),[].slice.call(t.childNodes).forEach(function(t){e.domNode.appendChild(t)}),t.parentNode&&t.parentNode.replaceChild(e.domNode,t),e.attach()}return e}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(47),l=n(27),a=n(1),s=function(t){function e(e){var n=t.call(this,e)||this;return n.build(),n}return o(e,t),e.prototype.appendChild=function(t){this.insertBefore(t)},e.prototype.attach=function(){t.prototype.attach.call(this),this.children.forEach(function(t){t.attach()})},e.prototype.build=function(){var t=this;this.children=new i.default,[].slice.call(this.domNode.childNodes).reverse().forEach(function(e){try{var n=r(e);t.insertBefore(n,t.children.head||void 0)}catch(t){if(t instanceof a.ParchmentError)return;throw t}})},e.prototype.deleteAt=function(t,e){if(0===t&&e===this.length())return this.remove();this.children.forEachAt(t,e,function(t,e,n){t.deleteAt(e,n)})},e.prototype.descendant=function(t,n){var r=this.children.find(n),o=r[0],i=r[1];return null==t.blotName&&t(o)||null!=t.blotName&&o instanceof t?[o,i]:o instanceof e?o.descendant(t,i):[null,-1]},e.prototype.descendants=function(t,n,r){void 0===n&&(n=0),void 0===r&&(r=Number.MAX_VALUE);var o=[],i=r;return this.children.forEachAt(n,r,function(n,r,l){(null==t.blotName&&t(n)||null!=t.blotName&&n instanceof t)&&o.push(n),n instanceof e&&(o=o.concat(n.descendants(t,r,i))),i-=l}),o},e.prototype.detach=function(){this.children.forEach(function(t){t.detach()}),t.prototype.detach.call(this)},e.prototype.formatAt=function(t,e,n,r){this.children.forEachAt(t,e,function(t,e,o){t.formatAt(e,o,n,r)})},e.prototype.insertAt=function(t,e,n){var r=this.children.find(t),o=r[0],i=r[1];if(o)o.insertAt(i,e,n);else{var l=null==n?a.create("text",e):a.create(e,n);this.appendChild(l)}},e.prototype.insertBefore=function(t,e){if(null!=this.statics.allowedChildren&&!this.statics.allowedChildren.some(function(e){return t instanceof e}))throw new a.ParchmentError("Cannot insert "+t.statics.blotName+" into "+this.statics.blotName);t.insertInto(this,e)},e.prototype.length=function(){return this.children.reduce(function(t,e){return t+e.length()},0)},e.prototype.moveChildren=function(t,e){this.children.forEach(function(n){t.insertBefore(n,e)})},e.prototype.optimize=function(e){if(t.prototype.optimize.call(this,e),0===this.children.length)if(null!=this.statics.defaultChild){var n=a.create(this.statics.defaultChild);this.appendChild(n),n.optimize(e)}else this.remove()},e.prototype.path=function(t,n){void 0===n&&(n=!1);var r=this.children.find(t,n),o=r[0],i=r[1],l=[[this,t]];return o instanceof e?l.concat(o.path(i,n)):(null!=o&&l.push([o,i]),l)},e.prototype.removeChild=function(t){this.children.remove(t)},e.prototype.replace=function(n){n instanceof e&&n.moveChildren(this),t.prototype.replace.call(this,n)},e.prototype.split=function(t,e){if(void 0===e&&(e=!1),!e){if(0===t)return this;if(t===this.length())return this.next}var n=this.clone();return this.parent.insertBefore(n,this.next),this.children.forEachAt(t,this.length(),function(t,r,o){t=t.split(r,e),n.appendChild(t)}),n},e.prototype.unwrap=function(){this.moveChildren(this.parent,this.next),this.remove()},e.prototype.update=function(t,e){var n=this,o=[],i=[];t.forEach(function(t){t.target===n.domNode&&"childList"===t.type&&(o.push.apply(o,t.addedNodes),i.push.apply(i,t.removedNodes))}),i.forEach(function(t){if(!(null!=t.parentNode&&"IFRAME"!==t.tagName&&document.body.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)){var e=a.find(t);null!=e&&(null!=e.domNode.parentNode&&e.domNode.parentNode!==n.domNode||e.detach())}}),o.filter(function(t){return t.parentNode==n.domNode}).sort(function(t,e){return t===e?0:t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING?1:-1}).forEach(function(t){var e=null;null!=t.nextSibling&&(e=a.find(t.nextSibling));var o=r(t);o.next==e&&null!=o.next||(null!=o.parent&&o.parent.removeChild(n),n.insertBefore(o,e||void 0))})},e}(l.default);e.default=s},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(11),i=n(28),l=n(17),a=n(1),s=function(t){function e(e){var n=t.call(this,e)||this;return n.attributes=new i.default(n.domNode),n}return r(e,t),e.formats=function(t){return"string"==typeof this.tagName||(Array.isArray(this.tagName)?t.tagName.toLowerCase():void 0)},e.prototype.format=function(t,e){var n=a.query(t);n instanceof o.default?this.attributes.attribute(n,e):e&&(null==n||t===this.statics.blotName&&this.formats()[t]===e||this.replaceWith(t,e))},e.prototype.formats=function(){var t=this.attributes.values(),e=this.statics.formats(this.domNode);return null!=e&&(t[this.statics.blotName]=e),t},e.prototype.replaceWith=function(e,n){var r=t.prototype.replaceWith.call(this,e,n);return this.attributes.copy(r),r},e.prototype.update=function(e,n){var r=this;t.prototype.update.call(this,e,n),e.some(function(t){return t.target===r.domNode&&"attributes"===t.type})&&this.attributes.build()},e.prototype.wrap=function(n,r){var o=t.prototype.wrap.call(this,n,r);return o instanceof e&&o.statics.scope===this.statics.scope&&this.attributes.move(o),o},e}(l.default);e.default=s},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(27),i=n(1),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.value=function(t){return!0},e.prototype.index=function(t,e){return this.domNode===t||this.domNode.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY?Math.min(e,1):-1},e.prototype.position=function(t,e){var n=[].indexOf.call(this.parent.domNode.childNodes,this.domNode);return t>0&&(n+=1),[this.parent.domNode,n]},e.prototype.value=function(){var t;return t={},t[this.statics.blotName]=this.statics.value(this.domNode)||!0,t},e.scope=i.Scope.INLINE_BLOT,e}(o.default);e.default=l},function(t,e,n){function r(t){this.ops=t,this.index=0,this.offset=0}var o=n(12),i=n(2),l={attributes:{compose:function(t,e,n){"object"!=typeof t&&(t={}),"object"!=typeof e&&(e={});var r=i(!0,{},e);n||(r=Object.keys(r).reduce(function(t,e){return null!=r[e]&&(t[e]=r[e]),t},{}));for(var o in t)void 0!==t[o]&&void 0===e[o]&&(r[o]=t[o]);return Object.keys(r).length>0?r:void 0},diff:function(t,e){"object"!=typeof t&&(t={}),"object"!=typeof e&&(e={});var n=Object.keys(t).concat(Object.keys(e)).reduce(function(n,r){return o(t[r],e[r])||(n[r]=void 0===e[r]?null:e[r]),n},{});return Object.keys(n).length>0?n:void 0},transform:function(t,e,n){if("object"!=typeof t)return e;if("object"==typeof e){if(!n)return e;var r=Object.keys(e).reduce(function(n,r){return void 0===t[r]&&(n[r]=e[r]),n},{});return Object.keys(r).length>0?r:void 0}}},iterator:function(t){return new r(t)},length:function(t){return"number"==typeof t.delete?t.delete:"number"==typeof t.retain?t.retain:"string"==typeof t.insert?t.insert.length:1}};r.prototype.hasNext=function(){return this.peekLength()<1/0},r.prototype.next=function(t){t||(t=1/0);var e=this.ops[this.index];if(e){var n=this.offset,r=l.length(e);if(t>=r-n?(t=r-n,this.index+=1,this.offset=0):this.offset+=t,"number"==typeof e.delete)return{delete:t};var o={};return e.attributes&&(o.attributes=e.attributes),"number"==typeof e.retain?o.retain=t:"string"==typeof e.insert?o.insert=e.insert.substr(n,t):o.insert=e.insert,o}return{retain:1/0}},r.prototype.peek=function(){return this.ops[this.index]},r.prototype.peekLength=function(){return this.ops[this.index]?l.length(this.ops[this.index])-this.offset:1/0},r.prototype.peekType=function(){return this.ops[this.index]?"number"==typeof this.ops[this.index].delete?"delete":"number"==typeof this.ops[this.index].retain?"retain":"insert":"retain"},r.prototype.rest=function(){if(this.hasNext()){if(0===this.offset)return this.ops.slice(this.index);var t=this.offset,e=this.index,n=this.next(),r=this.ops.slice(this.index);return this.offset=t,this.index=e,[n].concat(r)}return[]},t.exports=l},function(t,e){var n=function(){"use strict";function t(t,e){return null!=e&&t instanceof e}function e(n,r,o,i,c){function f(n,o){if(null===n)return null;if(0===o)return n;var y,v;if("object"!=typeof n)return n;if(t(n,a))y=new a;else if(t(n,s))y=new s;else if(t(n,u))y=new u(function(t,e){n.then(function(e){t(f(e,o-1))},function(t){e(f(t,o-1))})});else if(e.__isArray(n))y=[];else if(e.__isRegExp(n))y=new RegExp(n.source,l(n)),n.lastIndex&&(y.lastIndex=n.lastIndex);else if(e.__isDate(n))y=new Date(n.getTime());else{if(d&&Buffer.isBuffer(n))return y=Buffer.allocUnsafe?Buffer.allocUnsafe(n.length):new Buffer(n.length),n.copy(y),y;t(n,Error)?y=Object.create(n):void 0===i?(v=Object.getPrototypeOf(n),y=Object.create(v)):(y=Object.create(i),v=i)}if(r){var b=h.indexOf(n);if(-1!=b)return p[b];h.push(n),p.push(y)}t(n,a)&&n.forEach(function(t,e){var n=f(e,o-1),r=f(t,o-1);y.set(n,r)}),t(n,s)&&n.forEach(function(t){var e=f(t,o-1);y.add(e)});for(var g in n){var m;v&&(m=Object.getOwnPropertyDescriptor(v,g)),m&&null==m.set||(y[g]=f(n[g],o-1))}if(Object.getOwnPropertySymbols)for(var _=Object.getOwnPropertySymbols(n),g=0;g<_.length;g++){var O=_[g],w=Object.getOwnPropertyDescriptor(n,O);(!w||w.enumerable||c)&&(y[O]=f(n[O],o-1),w.enumerable||Object.defineProperty(y,O,{enumerable:!1}))}if(c)for(var x=Object.getOwnPropertyNames(n),g=0;g<x.length;g++){var k=x[g],w=Object.getOwnPropertyDescriptor(n,k);w&&w.enumerable||(y[k]=f(n[k],o-1),Object.defineProperty(y,k,{enumerable:!1}))}return y}"object"==typeof r&&(o=r.depth,i=r.prototype,c=r.includeNonEnumerable,r=r.circular);var h=[],p=[],d="undefined"!=typeof Buffer;return void 0===r&&(r=!0),void 0===o&&(o=1/0),f(n,o)}function n(t){return Object.prototype.toString.call(t)}function r(t){return"object"==typeof t&&"[object Date]"===n(t)}function o(t){return"object"==typeof t&&"[object Array]"===n(t)}function i(t){return"object"==typeof t&&"[object RegExp]"===n(t)}function l(t){var e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),e}var a;try{a=Map}catch(t){a=function(){}}var s;try{s=Set}catch(t){s=function(){}}var u;try{u=Promise}catch(t){u=function(){}}return e.clonePrototype=function(t){if(null===t)return null;var e=function(){};return e.prototype=t,new e},e.__objToStr=n,e.__isDate=r,e.__isArray=o,e.__isRegExp=i,e.__getRegExpFlags=l,e}();"object"==typeof t&&t.exports&&(t.exports=n)},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e<t.length;e++)n[e]=t[e];return n}return Array.from(t)}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){try{e.parentNode}catch(t){return!1}return e instanceof Text&&(e=e.parentNode),t.contains(e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.Range=void 0;var a=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),u=n(0),c=r(u),f=n(21),h=r(f),p=n(12),d=r(p),y=n(9),v=r(y),b=n(10),g=r(b),m=(0,g.default)("quill:selection"),_=function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;i(this,t),this.index=e,this.length=n},O=function(){function t(e,n){var r=this;i(this,t),this.emitter=n,this.scroll=e,this.composing=!1,this.mouseDown=!1,this.root=this.scroll.domNode,this.cursor=c.default.create("cursor",this),this.lastRange=this.savedRange=new _(0,0),this.handleComposition(),this.handleDragging(),this.emitter.listenDOM("selectionchange",document,function(){r.mouseDown||setTimeout(r.update.bind(r,v.default.sources.USER),1)}),this.emitter.on(v.default.events.EDITOR_CHANGE,function(t,e){t===v.default.events.TEXT_CHANGE&&e.length()>0&&r.update(v.default.sources.SILENT)}),this.emitter.on(v.default.events.SCROLL_BEFORE_UPDATE,function(){if(r.hasFocus()){var t=r.getNativeRange();null!=t&&t.start.node!==r.cursor.textNode&&r.emitter.once(v.default.events.SCROLL_UPDATE,function(){try{r.setNativeRange(t.start.node,t.start.offset,t.end.node,t.end.offset)}catch(t){}})}}),this.emitter.on(v.default.events.SCROLL_OPTIMIZE,function(t,e){if(e.range){var n=e.range,o=n.startNode,i=n.startOffset,l=n.endNode,a=n.endOffset;r.setNativeRange(o,i,l,a)}}),this.update(v.default.sources.SILENT)}return s(t,[{key:"handleComposition",value:function(){var t=this;this.root.addEventListener("compositionstart",function(){t.composing=!0}),this.root.addEventListener("compositionend",function(){if(t.composing=!1,t.cursor.parent){var e=t.cursor.restore();if(!e)return;setTimeout(function(){t.setNativeRange(e.startNode,e.startOffset,e.endNode,e.endOffset)},1)}})}},{key:"handleDragging",value:function(){var t=this;this.emitter.listenDOM("mousedown",document.body,function(){t.mouseDown=!0}),this.emitter.listenDOM("mouseup",document.body,function(){t.mouseDown=!1,t.update(v.default.sources.USER)})}},{key:"focus",value:function(){this.hasFocus()||(this.root.focus(),this.setRange(this.savedRange))}},{key:"format",value:function(t,e){if(null==this.scroll.whitelist||this.scroll.whitelist[t]){this.scroll.update();var n=this.getNativeRange();if(null!=n&&n.native.collapsed&&!c.default.query(t,c.default.Scope.BLOCK)){if(n.start.node!==this.cursor.textNode){var r=c.default.find(n.start.node,!1);if(null==r)return;if(r instanceof c.default.Leaf){var o=r.split(n.start.offset);r.parent.insertBefore(this.cursor,o)}else r.insertBefore(this.cursor,n.start.node);this.cursor.attach()}this.cursor.format(t,e),this.scroll.optimize(),this.setNativeRange(this.cursor.textNode,this.cursor.textNode.data.length),this.update()}}}},{key:"getBounds",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=this.scroll.length();t=Math.min(t,n-1),e=Math.min(t+e,n-1)-t;var r=void 0,o=this.scroll.leaf(t),i=a(o,2),l=i[0],s=i[1];if(null==l)return null;var u=l.position(s,!0),c=a(u,2);r=c[0],s=c[1];var f=document.createRange();if(e>0){f.setStart(r,s);var h=this.scroll.leaf(t+e),p=a(h,2);if(l=p[0],s=p[1],null==l)return null;var d=l.position(s,!0),y=a(d,2);return r=y[0],s=y[1],f.setEnd(r,s),f.getBoundingClientRect()}var v="left",b=void 0;return r instanceof Text?(s<r.data.length?(f.setStart(r,s),f.setEnd(r,s+1)):(f.setStart(r,s-1),f.setEnd(r,s),v="right"),b=f.getBoundingClientRect()):(b=l.domNode.getBoundingClientRect(),s>0&&(v="right")),{bottom:b.top+b.height,height:b.height,left:b[v],right:b[v],top:b.top,width:0}}},{key:"getNativeRange",value:function(){var t=document.getSelection();if(null==t||t.rangeCount<=0)return null;var e=t.getRangeAt(0);if(null==e)return null;var n=this.normalizeNative(e);return m.info("getNativeRange",n),n}},{key:"getRange",value:function(){var t=this.getNativeRange();return null==t?[null,null]:[this.normalizedToRange(t),t]}},{key:"hasFocus",value:function(){return document.activeElement===this.root}},{key:"normalizedToRange",value:function(t){var e=this,n=[[t.start.node,t.start.offset]];t.native.collapsed||n.push([t.end.node,t.end.offset]);var r=n.map(function(t){var n=a(t,2),r=n[0],o=n[1],i=c.default.find(r,!0),l=i.offset(e.scroll);return 0===o?l:i instanceof c.default.Container?l+i.length():l+i.index(r,o)}),i=Math.min(Math.max.apply(Math,o(r)),this.scroll.length()-1),l=Math.min.apply(Math,[i].concat(o(r)));return new _(l,i-l)}},{key:"normalizeNative",value:function(t){if(!l(this.root,t.startContainer)||!t.collapsed&&!l(this.root,t.endContainer))return null;var e={start:{node:t.startContainer,offset:t.startOffset},end:{node:t.endContainer,offset:t.endOffset},native:t};return[e.start,e.end].forEach(function(t){for(var e=t.node,n=t.offset;!(e instanceof Text)&&e.childNodes.length>0;)if(e.childNodes.length>n)e=e.childNodes[n],n=0;else{if(e.childNodes.length!==n)break;e=e.lastChild,n=e instanceof Text?e.data.length:e.childNodes.length+1}t.node=e,t.offset=n}),e}},{key:"rangeToNative",value:function(t){var e=this,n=t.collapsed?[t.index]:[t.index,t.index+t.length],r=[],o=this.scroll.length();return n.forEach(function(t,n){t=Math.min(o-1,t);var i=void 0,l=e.scroll.leaf(t),s=a(l,2),u=s[0],c=s[1],f=u.position(c,0!==n),h=a(f,2);i=h[0],c=h[1],r.push(i,c)}),r.length<2&&(r=r.concat(r)),r}},{key:"scrollIntoView",value:function(t){var e=this.lastRange;if(null!=e){var n=this.getBounds(e.index,e.length);if(null!=n){var r=this.scroll.length()-1,o=this.scroll.line(Math.min(e.index,r)),i=a(o,1),l=i[0],s=l;if(e.length>0){var u=this.scroll.line(Math.min(e.index+e.length,r));s=a(u,1)[0]}if(null!=l&&null!=s){var c=t.getBoundingClientRect();n.top<c.top?t.scrollTop-=c.top-n.top:n.bottom>c.bottom&&(t.scrollTop+=n.bottom-c.bottom)}}}}},{key:"setNativeRange",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:e,o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(m.info("setNativeRange",t,e,n,r),null==t||null!=this.root.parentNode&&null!=t.parentNode&&null!=n.parentNode){var i=document.getSelection();if(null!=i)if(null!=t){this.hasFocus()||this.root.focus();var l=(this.getNativeRange()||{}).native;if(null==l||o||t!==l.startContainer||e!==l.startOffset||n!==l.endContainer||r!==l.endOffset){"BR"==t.tagName&&(e=[].indexOf.call(t.parentNode.childNodes,t),t=t.parentNode),"BR"==n.tagName&&(r=[].indexOf.call(n.parentNode.childNodes,n),n=n.parentNode);var a=document.createRange();a.setStart(t,e),a.setEnd(n,r),i.removeAllRanges(),i.addRange(a)}}else i.removeAllRanges(),this.root.blur(),document.body.focus()}}},{key:"setRange",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:v.default.sources.API;if("string"==typeof e&&(n=e,e=!1),m.info("setRange",t),null!=t){var r=this.rangeToNative(t);this.setNativeRange.apply(this,o(r).concat([e]))}else this.setNativeRange(null);this.update(n)}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:v.default.sources.USER,e=this.lastRange,n=this.getRange(),r=a(n,2),o=r[0],i=r[1];if(this.lastRange=o,null!=this.lastRange&&(this.savedRange=this.lastRange),!(0,d.default)(e,this.lastRange)){var l;!this.composing&&null!=i&&i.native.collapsed&&i.start.node!==this.cursor.textNode&&this.cursor.restore();var s=[v.default.events.SELECTION_CHANGE,(0,h.default)(this.lastRange),(0,h.default)(e),t];if((l=this.emitter).emit.apply(l,[v.default.events.EDITOR_CHANGE].concat(s)),t!==v.default.sources.SILENT){var u;(u=this.emitter).emit.apply(u,s)}}}}]),t}();e.Range=_,e.default=O},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=n(0),s=r(a),u=n(3),c=r(u),f=function(t){function e(){return o(this,e),i(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return l(e,t),e}(s.default.Container);f.allowedChildren=[c.default,u.BlockEmbed,f],e.default=f},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.ColorStyle=e.ColorClass=e.ColorAttributor=void 0;var l=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),a=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},s=n(0),u=function(t){return t&&t.__esModule?t:{default:t}}(s),c=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),l(e,[{key:"value",value:function(t){var n=a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"value",this).call(this,t);return n.startsWith("rgb(")?(n=n.replace(/^[^\d]+/,"").replace(/[^\d]+$/,""),"#"+n.split(",").map(function(t){return("00"+parseInt(t).toString(16)).slice(-2)}).join("")):n}}]),e}(u.default.Attributor.Style),f=new u.default.Attributor.Class("color","ql-color",{scope:u.default.Scope.INLINE}),h=new c("color","color",{scope:u.default.Scope.INLINE});e.ColorAttributor=c,e.ColorClass=f,e.ColorStyle=h},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e){var n,r=t===D.keys.LEFT?"prefix":"suffix";return n={key:t,shiftKey:e,altKey:null},o(n,r,/^$/),o(n,"handler",function(n){var r=n.index;t===D.keys.RIGHT&&(r+=n.length+1);var o=this.quill.getLeaf(r);return!(b(o,1)[0]instanceof T.default.Embed)||(t===D.keys.LEFT?e?this.quill.setSelection(n.index-1,n.length+1,S.default.sources.USER):this.quill.setSelection(n.index-1,S.default.sources.USER):e?this.quill.setSelection(n.index,n.length+1,S.default.sources.USER):this.quill.setSelection(n.index+n.length+1,S.default.sources.USER),!1)}),n}function u(t,e){if(!(0===t.index||this.quill.getLength()<=1)){var n=this.quill.getLine(t.index),r=b(n,1),o=r[0],i={};if(0===e.offset){var l=this.quill.getLine(t.index-1),a=b(l,1),s=a[0];if(null!=s&&s.length()>1){var u=o.formats(),c=this.quill.getFormat(t.index-1,1);i=A.default.attributes.diff(u,c)||{}}}var f=/[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(e.prefix)?2:1;this.quill.deleteText(t.index-f,f,S.default.sources.USER),Object.keys(i).length>0&&this.quill.formatLine(t.index-f,f,i,S.default.sources.USER),this.quill.focus()}}function c(t,e){var n=/^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(e.suffix)?2:1;if(!(t.index>=this.quill.getLength()-n)){var r={},o=0,i=this.quill.getLine(t.index),l=b(i,1),a=l[0];if(e.offset>=a.length()-1){var s=this.quill.getLine(t.index+1),u=b(s,1),c=u[0];if(c){var f=a.formats(),h=this.quill.getFormat(t.index,1);r=A.default.attributes.diff(f,h)||{},o=c.length()}}this.quill.deleteText(t.index,n,S.default.sources.USER),Object.keys(r).length>0&&this.quill.formatLine(t.index+o-1,n,r,S.default.sources.USER)}}function f(t){var e=this.quill.getLines(t),n={};if(e.length>1){var r=e[0].formats(),o=e[e.length-1].formats();n=A.default.attributes.diff(o,r)||{}}this.quill.deleteText(t,S.default.sources.USER),Object.keys(n).length>0&&this.quill.formatLine(t.index,1,n,S.default.sources.USER),this.quill.setSelection(t.index,S.default.sources.SILENT),this.quill.focus()}function h(t,e){var n=this;t.length>0&&this.quill.scroll.deleteAt(t.index,t.length);var r=Object.keys(e.format).reduce(function(t,n){return T.default.query(n,T.default.Scope.BLOCK)&&!Array.isArray(e.format[n])&&(t[n]=e.format[n]),t},{});this.quill.insertText(t.index,"\n",r,S.default.sources.USER),this.quill.setSelection(t.index+1,S.default.sources.SILENT),this.quill.focus(),Object.keys(e.format).forEach(function(t){null==r[t]&&(Array.isArray(e.format[t])||"link"!==t&&n.quill.format(t,e.format[t],S.default.sources.USER))})}function p(t){return{key:D.keys.TAB,shiftKey:!t,format:{"code-block":!0},handler:function(e){var n=T.default.query("code-block"),r=e.index,o=e.length,i=this.quill.scroll.descendant(n,r),l=b(i,2),a=l[0],s=l[1];if(null!=a){var u=this.quill.getIndex(a),c=a.newlineIndex(s,!0)+1,f=a.newlineIndex(u+s+o),h=a.domNode.textContent.slice(c,f).split("\n");s=0,h.forEach(function(e,i){t?(a.insertAt(c+s,n.TAB),s+=n.TAB.length,0===i?r+=n.TAB.length:o+=n.TAB.length):e.startsWith(n.TAB)&&(a.deleteAt(c+s,n.TAB.length),s-=n.TAB.length,0===i?r-=n.TAB.length:o-=n.TAB.length),s+=e.length+1}),this.quill.update(S.default.sources.USER),this.quill.setSelection(r,o,S.default.sources.SILENT)}}}}function d(t){return{key:t[0].toUpperCase(),shortKey:!0,handler:function(e,n){this.quill.format(t,!n.format[t],S.default.sources.USER)}}}function y(t){if("string"==typeof t||"number"==typeof t)return y({key:t});if("object"===(void 0===t?"undefined":v(t))&&(t=(0,_.default)(t,!1)),"string"==typeof t.key)if(null!=D.keys[t.key.toUpperCase()])t.key=D.keys[t.key.toUpperCase()];else{if(1!==t.key.length)return null;t.key=t.key.toUpperCase().charCodeAt(0)}return t.shortKey&&(t[B]=t.shortKey,delete t.shortKey),t}Object.defineProperty(e,"__esModule",{value:!0}),e.SHORTKEY=e.default=void 0;var v="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},b=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),g=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),m=n(21),_=r(m),O=n(12),w=r(O),x=n(2),k=r(x),E=n(4),N=r(E),j=n(20),A=r(j),q=n(0),T=r(q),P=n(6),S=r(P),C=n(10),L=r(C),M=n(7),R=r(M),I=(0,L.default)("quill:keyboard"),B=/Mac/i.test(navigator.platform)?"metaKey":"ctrlKey",D=function(t){function e(t,n){i(this,e);var r=l(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));return r.bindings={},Object.keys(r.options.bindings).forEach(function(e){("list autofill"!==e||null==t.scroll.whitelist||t.scroll.whitelist.list)&&r.options.bindings[e]&&r.addBinding(r.options.bindings[e])}),r.addBinding({key:e.keys.ENTER,shiftKey:null},h),r.addBinding({key:e.keys.ENTER,metaKey:null,ctrlKey:null,altKey:null},function(){}),/Firefox/i.test(navigator.userAgent)?(r.addBinding({key:e.keys.BACKSPACE},{collapsed:!0},u),r.addBinding({key:e.keys.DELETE},{collapsed:!0},c)):(r.addBinding({key:e.keys.BACKSPACE},{collapsed:!0,prefix:/^.?$/},u),r.addBinding({key:e.keys.DELETE},{collapsed:!0,suffix:/^.?$/},c)),r.addBinding({key:e.keys.BACKSPACE},{collapsed:!1},f),r.addBinding({key:e.keys.DELETE},{collapsed:!1},f),r.addBinding({key:e.keys.BACKSPACE,altKey:null,ctrlKey:null,metaKey:null,shiftKey:null},{collapsed:!0,offset:0},u),r.listen(),r}return a(e,t),g(e,null,[{key:"match",value:function(t,e){return e=y(e),!["altKey","ctrlKey","metaKey","shiftKey"].some(function(n){return!!e[n]!==t[n]&&null!==e[n]})&&e.key===(t.which||t.keyCode)}}]),g(e,[{key:"addBinding",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=y(t);if(null==r||null==r.key)return I.warn("Attempted to add invalid keyboard binding",r);"function"==typeof e&&(e={handler:e}),"function"==typeof n&&(n={handler:n}),r=(0,k.default)(r,e,n),this.bindings[r.key]=this.bindings[r.key]||[],this.bindings[r.key].push(r)}},{key:"listen",value:function(){var t=this;this.quill.root.addEventListener("keydown",function(n){if(!n.defaultPrevented){var r=n.which||n.keyCode,o=(t.bindings[r]||[]).filter(function(t){return e.match(n,t)});if(0!==o.length){var i=t.quill.getSelection();if(null!=i&&t.quill.hasFocus()){var l=t.quill.getLine(i.index),a=b(l,2),s=a[0],u=a[1],c=t.quill.getLeaf(i.index),f=b(c,2),h=f[0],p=f[1],d=0===i.length?[h,p]:t.quill.getLeaf(i.index+i.length),y=b(d,2),g=y[0],m=y[1],_=h instanceof T.default.Text?h.value().slice(0,p):"",O=g instanceof T.default.Text?g.value().slice(m):"",x={collapsed:0===i.length,empty:0===i.length&&s.length()<=1,format:t.quill.getFormat(i),offset:u,prefix:_,suffix:O};o.some(function(e){if(null!=e.collapsed&&e.collapsed!==x.collapsed)return!1;if(null!=e.empty&&e.empty!==x.empty)return!1;if(null!=e.offset&&e.offset!==x.offset)return!1;if(Array.isArray(e.format)){if(e.format.every(function(t){return null==x.format[t]}))return!1}else if("object"===v(e.format)&&!Object.keys(e.format).every(function(t){return!0===e.format[t]?null!=x.format[t]:!1===e.format[t]?null==x.format[t]:(0,w.default)(e.format[t],x.format[t])}))return!1;return!(null!=e.prefix&&!e.prefix.test(x.prefix))&&(!(null!=e.suffix&&!e.suffix.test(x.suffix))&&!0!==e.handler.call(t,i,x))})&&n.preventDefault()}}}})}}]),e}(R.default);D.keys={BACKSPACE:8,TAB:9,ENTER:13,ESCAPE:27,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46},D.DEFAULTS={bindings:{bold:d("bold"),italic:d("italic"),underline:d("underline"),indent:{key:D.keys.TAB,format:["blockquote","indent","list"],handler:function(t,e){if(e.collapsed&&0!==e.offset)return!0;this.quill.format("indent","+1",S.default.sources.USER)}},outdent:{key:D.keys.TAB,shiftKey:!0,format:["blockquote","indent","list"],handler:function(t,e){if(e.collapsed&&0!==e.offset)return!0;this.quill.format("indent","-1",S.default.sources.USER)}},"outdent backspace":{key:D.keys.BACKSPACE,collapsed:!0,shiftKey:null,metaKey:null,ctrlKey:null,altKey:null,format:["indent","list"],offset:0,handler:function(t,e){null!=e.format.indent?this.quill.format("indent","-1",S.default.sources.USER):null!=e.format.list&&this.quill.format("list",!1,S.default.sources.USER)}},"indent code-block":p(!0),"outdent code-block":p(!1),"remove tab":{key:D.keys.TAB,shiftKey:!0,collapsed:!0,prefix:/\t$/,handler:function(t){this.quill.deleteText(t.index-1,1,S.default.sources.USER)}},tab:{key:D.keys.TAB,handler:function(t){this.quill.history.cutoff();var e=(new N.default).retain(t.index).delete(t.length).insert("\t");this.quill.updateContents(e,S.default.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index+1,S.default.sources.SILENT)}},"list empty enter":{key:D.keys.ENTER,collapsed:!0,format:["list"],empty:!0,handler:function(t,e){this.quill.format("list",!1,S.default.sources.USER),e.format.indent&&this.quill.format("indent",!1,S.default.sources.USER)}},"checklist enter":{key:D.keys.ENTER,collapsed:!0,format:{list:"checked"},handler:function(t){var e=this.quill.getLine(t.index),n=b(e,2),r=n[0],o=n[1],i=(0,k.default)({},r.formats(),{list:"checked"}),l=(new N.default).retain(t.index).insert("\n",i).retain(r.length()-o-1).retain(1,{list:"unchecked"});this.quill.updateContents(l,S.default.sources.USER),this.quill.setSelection(t.index+1,S.default.sources.SILENT),this.quill.scrollIntoView()}},"header enter":{key:D.keys.ENTER,collapsed:!0,format:["header"],suffix:/^$/,handler:function(t,e){var n=this.quill.getLine(t.index),r=b(n,2),o=r[0],i=r[1],l=(new N.default).retain(t.index).insert("\n",e.format).retain(o.length()-i-1).retain(1,{header:null});this.quill.updateContents(l,S.default.sources.USER),this.quill.setSelection(t.index+1,S.default.sources.SILENT),this.quill.scrollIntoView()}},"list autofill":{key:" ",collapsed:!0,format:{list:!1},prefix:/^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/,handler:function(t,e){var n=e.prefix.length,r=this.quill.getLine(t.index),o=b(r,2),i=o[0],l=o[1];if(l>n)return!0;var a=void 0;switch(e.prefix.trim()){case"[]":case"[ ]":a="unchecked";break;case"[x]":a="checked";break;case"-":case"*":a="bullet";break;default:a="ordered"}this.quill.insertText(t.index," ",S.default.sources.USER),this.quill.history.cutoff();var s=(new N.default).retain(t.index-l).delete(n+1).retain(i.length()-2-l).retain(1,{list:a});this.quill.updateContents(s,S.default.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index-n,S.default.sources.SILENT)}},"code exit":{key:D.keys.ENTER,collapsed:!0,format:["code-block"],prefix:/\n\n$/,suffix:/^\s+$/,handler:function(t){var e=this.quill.getLine(t.index),n=b(e,2),r=n[0],o=n[1],i=(new N.default).retain(t.index+r.length()-o-2).retain(1,{"code-block":null}).delete(1);this.quill.updateContents(i,S.default.sources.USER)}},"embed left":s(D.keys.LEFT,!1),"embed left shift":s(D.keys.LEFT,!0),"embed right":s(D.keys.RIGHT,!1),"embed right shift":s(D.keys.RIGHT,!0)}},e.default=D,e.SHORTKEY=B},function(t,e,n){"use strict";t.exports={align:{"":n(75),center:n(76),right:n(77),justify:n(78)},background:n(79),blockquote:n(80),bold:n(81),clean:n(82),code:n(40),"code-block":n(40),color:n(83),direction:{"":n(84),rtl:n(85)},float:{center:n(86),full:n(87),left:n(88),right:n(89)},formula:n(90),header:{1:n(91),2:n(92)},italic:n(93),image:n(94),indent:{"+1":n(95),"-1":n(96)},link:n(97),list:{ordered:n(98),bullet:n(99),check:n(100)},script:{sub:n(101),super:n(102)},strike:n(103),underline:n(104),video:n(105)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(1),o=function(){function t(t){this.domNode=t,this.domNode[r.DATA_KEY]={blot:this}}return Object.defineProperty(t.prototype,"statics",{get:function(){return this.constructor},enumerable:!0,configurable:!0}),t.create=function(t){if(null==this.tagName)throw new r.ParchmentError("Blot definition missing tagName");var e;return Array.isArray(this.tagName)?("string"==typeof t&&(t=t.toUpperCase(),parseInt(t).toString()===t&&(t=parseInt(t))),e="number"==typeof t?document.createElement(this.tagName[t-1]):this.tagName.indexOf(t)>-1?document.createElement(t):document.createElement(this.tagName[0])):e=document.createElement(this.tagName),this.className&&e.classList.add(this.className),e},t.prototype.attach=function(){null!=this.parent&&(this.scroll=this.parent.scroll)},t.prototype.clone=function(){var t=this.domNode.cloneNode(!1);return r.create(t)},t.prototype.detach=function(){null!=this.parent&&this.parent.removeChild(this),delete this.domNode[r.DATA_KEY]},t.prototype.deleteAt=function(t,e){this.isolate(t,e).remove()},t.prototype.formatAt=function(t,e,n,o){var i=this.isolate(t,e);if(null!=r.query(n,r.Scope.BLOT)&&o)i.wrap(n,o);else if(null!=r.query(n,r.Scope.ATTRIBUTE)){var l=r.create(this.statics.scope);i.wrap(l),l.format(n,o)}},t.prototype.insertAt=function(t,e,n){var o=null==n?r.create("text",e):r.create(e,n),i=this.split(t);this.parent.insertBefore(o,i)},t.prototype.insertInto=function(t,e){void 0===e&&(e=null),null!=this.parent&&this.parent.children.remove(this);var n=null;t.children.insertBefore(this,e),null!=e&&(n=e.domNode),this.domNode.parentNode==t.domNode&&this.domNode.nextSibling==n||t.domNode.insertBefore(this.domNode,n),this.parent=t,this.attach()},t.prototype.isolate=function(t,e){var n=this.split(t);return n.split(e),n},t.prototype.length=function(){return 1},t.prototype.offset=function(t){return void 0===t&&(t=this.parent),null==this.parent||this==t?0:this.parent.children.offset(this)+this.parent.offset(t)},t.prototype.optimize=function(t){null!=this.domNode[r.DATA_KEY]&&delete this.domNode[r.DATA_KEY].mutations},t.prototype.remove=function(){null!=this.domNode.parentNode&&this.domNode.parentNode.removeChild(this.domNode),this.detach()},t.prototype.replace=function(t){null!=t.parent&&(t.parent.insertBefore(this,t.next),t.remove())},t.prototype.replaceWith=function(t,e){var n="string"==typeof t?r.create(t,e):t;return n.replace(this),n},t.prototype.split=function(t,e){return 0===t?this:this.next},t.prototype.update=function(t,e){},t.prototype.wrap=function(t,e){var n="string"==typeof t?r.create(t,e):t;return null!=this.parent&&this.parent.insertBefore(n,this.next),n.appendChild(this),n},t.blotName="abstract",t}();e.default=o},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(11),o=n(29),i=n(30),l=n(1),a=function(){function t(t){this.attributes={},this.domNode=t,this.build()}return t.prototype.attribute=function(t,e){e?t.add(this.domNode,e)&&(null!=t.value(this.domNode)?this.attributes[t.attrName]=t:delete this.attributes[t.attrName]):(t.remove(this.domNode),delete this.attributes[t.attrName])},t.prototype.build=function(){var t=this;this.attributes={};var e=r.default.keys(this.domNode),n=o.default.keys(this.domNode),a=i.default.keys(this.domNode);e.concat(n).concat(a).forEach(function(e){var n=l.query(e,l.Scope.ATTRIBUTE);n instanceof r.default&&(t.attributes[n.attrName]=n)})},t.prototype.copy=function(t){var e=this;Object.keys(this.attributes).forEach(function(n){var r=e.attributes[n].value(e.domNode);t.format(n,r)})},t.prototype.move=function(t){var e=this;this.copy(t),Object.keys(this.attributes).forEach(function(t){e.attributes[t].remove(e.domNode)}),this.attributes={}},t.prototype.values=function(){var t=this;return Object.keys(this.attributes).reduce(function(e,n){return e[n]=t.attributes[n].value(t.domNode),e},{})},t}();e.default=a},function(t,e,n){"use strict";function r(t,e){return(t.getAttribute("class")||"").split(/\s+/).filter(function(t){return 0===t.indexOf(e+"-")})}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(11),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.keys=function(t){return(t.getAttribute("class")||"").split(/\s+/).map(function(t){return t.split("-").slice(0,-1).join("-")})},e.prototype.add=function(t,e){return!!this.canAdd(t,e)&&(this.remove(t),t.classList.add(this.keyName+"-"+e),!0)},e.prototype.remove=function(t){r(t,this.keyName).forEach(function(e){t.classList.remove(e)}),0===t.classList.length&&t.removeAttribute("class")},e.prototype.value=function(t){var e=r(t,this.keyName)[0]||"",n=e.slice(this.keyName.length+1);return this.canAdd(t,n)?n:""},e}(i.default);e.default=l},function(t,e,n){"use strict";function r(t){var e=t.split("-"),n=e.slice(1).map(function(t){return t[0].toUpperCase()+t.slice(1)}).join("");return e[0]+n}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(11),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.keys=function(t){return(t.getAttribute("style")||"").split(";").map(function(t){return t.split(":")[0].trim()})},e.prototype.add=function(t,e){return!!this.canAdd(t,e)&&(t.style[r(this.keyName)]=e,!0)},e.prototype.remove=function(t){t.style[r(this.keyName)]="",t.getAttribute("style")||t.removeAttribute("style")},e.prototype.value=function(t){var e=t.style[r(this.keyName)];return this.canAdd(t,e)?e:""},e}(i.default);e.default=l},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},u=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),c=n(0),f=r(c),h=n(8),p=r(h),d=function(t){function e(t,n){o(this,e);var r=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return r.selection=n,r.textNode=document.createTextNode(e.CONTENTS),r.domNode.appendChild(r.textNode),r._length=0,r}return l(e,t),u(e,null,[{key:"value",value:function(){}}]),u(e,[{key:"detach",value:function(){null!=this.parent&&this.parent.removeChild(this)}},{key:"format",value:function(t,n){if(0!==this._length)return s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"format",this).call(this,t,n);for(var r=this,o=0;null!=r&&r.statics.scope!==f.default.Scope.BLOCK_BLOT;)o+=r.offset(r.parent),r=r.parent;null!=r&&(this._length=e.CONTENTS.length,r.optimize(),r.formatAt(o,e.CONTENTS.length,t,n),this._length=0)}},{key:"index",value:function(t,n){return t===this.textNode?0:s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"index",this).call(this,t,n)}},{key:"length",value:function(){return this._length}},{key:"position",value:function(){return[this.textNode,this.textNode.data.length]}},{key:"remove",value:function(){s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"remove",this).call(this),this.parent=null}},{key:"restore",value:function(){if(!this.selection.composing&&null!=this.parent){var t=this.textNode,n=this.selection.getNativeRange(),r=void 0,o=void 0,i=void 0;if(null!=n&&n.start.node===t&&n.end.node===t){var l=[t,n.start.offset,n.end.offset];r=l[0],o=l[1],i=l[2]}for(;null!=this.domNode.lastChild&&this.domNode.lastChild!==this.textNode;)this.domNode.parentNode.insertBefore(this.domNode.lastChild,this.domNode);if(this.textNode.data!==e.CONTENTS){var s=this.textNode.data.split(e.CONTENTS).join("");this.next instanceof p.default?(r=this.next.domNode,this.next.insertAt(0,s),this.textNode.data=e.CONTENTS):(this.textNode.data=s,this.parent.insertBefore(f.default.create(this.textNode),this),this.textNode=document.createTextNode(e.CONTENTS),this.domNode.appendChild(this.textNode))}if(this.remove(),null!=o){var u=[o,i].map(function(t){return Math.max(0,Math.min(r.data.length,t-1))}),c=a(u,2);return o=c[0],i=c[1],{startNode:r,startOffset:o,endNode:r,endOffset:i}}}}},{key:"update",value:function(t,e){var n=this;if(t.some(function(t){return"characterData"===t.type&&t.target===n.textNode})){var r=this.restore();r&&(e.range=r)}}},{key:"value",value:function(){return""}}]),e}(f.default.Embed);d.blotName="cursor",d.className="ql-cursor",d.tagName="span",d.CONTENTS="\ufeff",e.default=d},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=function(){function t(e,n){r(this,t),this.quill=e,this.options=n,this.modules={}}return o(t,[{key:"init",value:function(){var t=this;Object.keys(this.options.modules).forEach(function(e){null==t.modules[e]&&t.addModule(e)})}},{key:"addModule",value:function(t){var e=this.quill.constructor.import("modules/"+t);return this.modules[t]=new e(this.quill,this.options.modules[t]||{}),this.modules[t]}}]),t}();i.DEFAULTS={modules:{}},i.themes={default:i},e.default=i},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),s=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},u=n(0),c=r(u),f=n(8),h=r(f),p="\ufeff",d=function(t){function e(t){o(this,e);var n=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return n.contentNode=document.createElement("span"),n.contentNode.setAttribute("contenteditable",!1),[].slice.call(n.domNode.childNodes).forEach(function(t){n.contentNode.appendChild(t)}),n.leftGuard=document.createTextNode(p),n.rightGuard=document.createTextNode(p),n.domNode.appendChild(n.leftGuard),n.domNode.appendChild(n.contentNode),n.domNode.appendChild(n.rightGuard),n}return l(e,t),a(e,[{key:"index",value:function(t,n){return t===this.leftGuard?0:t===this.rightGuard?1:s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"index",this).call(this,t,n)}},{key:"restore",value:function(t){var e=void 0,n=void 0,r=t.data.split(p).join("");if(t===this.leftGuard)if(this.prev instanceof h.default){var o=this.prev.length();this.prev.insertAt(o,r),e={startNode:this.prev.domNode,startOffset:o+r.length}}else n=document.createTextNode(r),this.parent.insertBefore(c.default.create(n),this),e={startNode:n,startOffset:r.length};else t===this.rightGuard&&(this.next instanceof h.default?(this.next.insertAt(0,r),e={startNode:this.next.domNode,startOffset:r.length}):(n=document.createTextNode(r),this.parent.insertBefore(c.default.create(n),this.next),e={startNode:n,startOffset:r.length}));return t.data=p,e}},{key:"update",value:function(t,e){var n=this;t.forEach(function(t){if("characterData"===t.type&&(t.target===n.leftGuard||t.target===n.rightGuard)){var r=n.restore(t.target);r&&(e.range=r)}})}}]),e}(c.default.Embed);e.default=d},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AlignStyle=e.AlignClass=e.AlignAttribute=void 0;var r=n(0),o=function(t){return t&&t.__esModule?t:{default:t}}(r),i={scope:o.default.Scope.BLOCK,whitelist:["right","center","justify"]},l=new o.default.Attributor.Attribute("align","align",i),a=new o.default.Attributor.Class("align","ql-align",i),s=new o.default.Attributor.Style("align","text-align",i);e.AlignAttribute=l,e.AlignClass=a,e.AlignStyle=s},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BackgroundStyle=e.BackgroundClass=void 0;var r=n(0),o=function(t){return t&&t.__esModule?t:{default:t}}(r),i=n(24),l=new o.default.Attributor.Class("background","ql-bg",{scope:o.default.Scope.INLINE}),a=new i.ColorAttributor("background","background-color",{scope:o.default.Scope.INLINE});e.BackgroundClass=l,e.BackgroundStyle=a},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DirectionStyle=e.DirectionClass=e.DirectionAttribute=void 0;var r=n(0),o=function(t){return t&&t.__esModule?t:{default:t}}(r),i={scope:o.default.Scope.BLOCK,whitelist:["rtl"]},l=new o.default.Attributor.Attribute("direction","dir",i),a=new o.default.Attributor.Class("direction","ql-direction",i),s=new o.default.Attributor.Style("direction","direction",i);e.DirectionAttribute=l,e.DirectionClass=a,e.DirectionStyle=s},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.FontClass=e.FontStyle=void 0;var l=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),a=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},s=n(0),u=function(t){return t&&t.__esModule?t:{default:t}}(s),c={scope:u.default.Scope.INLINE,whitelist:["serif","monospace"]},f=new u.default.Attributor.Class("font","ql-font",c),h=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),l(e,[{key:"value",value:function(t){return a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"value",this).call(this,t).replace(/["']/g,"")}}]),e}(u.default.Attributor.Style),p=new h("font","font-family",c);e.FontStyle=p,e.FontClass=f},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.SizeStyle=e.SizeClass=void 0;var r=n(0),o=function(t){return t&&t.__esModule?t:{default:t}}(r),i=new o.default.Attributor.Class("size","ql-size",{scope:o.default.Scope.INLINE,whitelist:["small","large","huge"]}),l=new o.default.Attributor.Style("size","font-size",{scope:o.default.Scope.INLINE,whitelist:["10px","18px","32px"]});e.SizeClass=i,e.SizeStyle=l},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),a=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},s=n(5),u=function(t){return t&&t.__esModule?t:{default:t}}(s),c=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),l(e,[{key:"optimize",value:function(t){a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t),this.domNode.tagName!==this.statics.tagName[0]&&this.replaceWith(this.statics.blotName)}}],[{key:"create",value:function(){return a(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this)}},{key:"formats",value:function(){return!0}}]),e}(u.default);c.blotName="bold",c.tagName=["STRONG","B"],e.default=c},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <polyline class="ql-even ql-stroke" points="5 7 3 9 5 11"></polyline> <polyline class="ql-even ql-stroke" points="13 7 15 9 13 11"></polyline> <line class=ql-stroke x1=10 x2=8 y1=5 y2=13></line> </svg>'},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),a=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},s=n(16),u=function(t){return t&&t.__esModule?t:{default:t}}(s),c=function(t){function e(t,n){r(this,e);var i=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return i.label.innerHTML=n,i.container.classList.add("ql-color-picker"),[].slice.call(i.container.querySelectorAll(".ql-picker-item"),0,7).forEach(function(t){t.classList.add("ql-primary")}),i}return i(e,t),l(e,[{key:"buildItem",value:function(t){var n=a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"buildItem",this).call(this,t);return n.style.backgroundColor=t.getAttribute("value")||"",n}},{key:"selectItem",value:function(t,n){a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"selectItem",this).call(this,t,n);var r=this.label.querySelector(".ql-color-label"),o=t?t.getAttribute("data-value")||"":"";r&&("line"===r.tagName?r.style.stroke=o:r.style.fill=o)}}]),e}(u.default);e.default=c},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),a=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},s=n(16),u=function(t){return t&&t.__esModule?t:{default:t}}(s),c=function(t){function e(t,n){r(this,e);var i=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return i.container.classList.add("ql-icon-picker"),[].forEach.call(i.container.querySelectorAll(".ql-picker-item"),function(t){t.innerHTML=n[t.getAttribute("data-value")||""]}),i.defaultItem=i.container.querySelector(".ql-selected"),i.selectItem(i.defaultItem),i}return i(e,t),l(e,[{key:"selectItem",value:function(t,n){a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"selectItem",this).call(this,t,n),t=t||this.defaultItem,this.label.innerHTML=t.innerHTML}}]),e}(u.default);e.default=c},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=function(){function t(e,n){var o=this;r(this,t),this.quill=e,this.boundsContainer=n||document.body,this.root=e.addContainer("ql-tooltip"),this.root.innerHTML=this.constructor.TEMPLATE,this.quill.root===this.quill.scrollingContainer&&this.quill.root.addEventListener("scroll",function(){o.root.style.marginTop=-1*o.quill.root.scrollTop+"px"}),this.hide()}return o(t,[{key:"hide",value:function(){this.root.classList.add("ql-hidden")}},{key:"position",value:function(t){var e=t.left+t.width/2-this.root.offsetWidth/2,n=t.bottom+this.quill.root.scrollTop;this.root.style.left=e+"px",this.root.style.top=n+"px",this.root.classList.remove("ql-flip");var r=this.boundsContainer.getBoundingClientRect(),o=this.root.getBoundingClientRect(),i=0;if(o.right>r.right&&(i=r.right-o.right,this.root.style.left=e+i+"px"),o.left<r.left&&(i=r.left-o.left,this.root.style.left=e+i+"px"),o.bottom>r.bottom){var l=o.bottom-o.top,a=t.bottom-t.top+l;this.root.style.top=n-a+"px",this.root.classList.add("ql-flip")}return i}},{key:"show",value:function(){this.root.classList.remove("ql-editing"),this.root.classList.remove("ql-hidden")}}]),t}();e.default=i},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t){var e=t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/)||t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/);return e?(e[1]||"https")+"://www.youtube.com/embed/"+e[2]+"?showinfo=0":(e=t.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/))?(e[1]||"https")+"://player.vimeo.com/video/"+e[2]+"/":t}function s(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];e.forEach(function(e){var r=document.createElement("option");e===n?r.setAttribute("selected","selected"):r.setAttribute("value",e),t.appendChild(r)})}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BaseTooltip=void 0;var u=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),c=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},f=n(2),h=r(f),p=n(4),d=r(p),y=n(9),v=r(y),b=n(25),g=r(b),m=n(32),_=r(m),O=n(41),w=r(O),x=n(42),k=r(x),E=n(16),N=r(E),j=n(43),A=r(j),q=[!1,"center","right","justify"],T=["#000000","#e60000","#ff9900","#ffff00","#008a00","#0066cc","#9933ff","#ffffff","#facccc","#ffebcc","#ffffcc","#cce8cc","#cce0f5","#ebd6ff","#bbbbbb","#f06666","#ffc266","#ffff66","#66b966","#66a3e0","#c285ff","#888888","#a10000","#b26b00","#b2b200","#006100","#0047b2","#6b24b2","#444444","#5c0000","#663d00","#666600","#003700","#002966","#3d1466"],P=[!1,"serif","monospace"],S=["1","2","3",!1],C=["small",!1,"large","huge"],L=function(t){function e(t,n){o(this,e);var r=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n)),l=function e(n){if(!document.body.contains(t.root))return document.body.removeEventListener("click",e);null==r.tooltip||r.tooltip.root.contains(n.target)||document.activeElement===r.tooltip.textbox||r.quill.hasFocus()||r.tooltip.hide(),null!=r.pickers&&r.pickers.forEach(function(t){t.container.contains(n.target)||t.close()})};return t.emitter.listenDOM("click",document.body,l),r}return l(e,t),u(e,[{key:"addModule",value:function(t){var n=c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"addModule",this).call(this,t);return"toolbar"===t&&this.extendToolbar(n),n}},{key:"buildButtons",value:function(t,e){t.forEach(function(t){(t.getAttribute("class")||"").split(/\s+/).forEach(function(n){if(n.startsWith("ql-")&&(n=n.slice("ql-".length),null!=e[n]))if("direction"===n)t.innerHTML=e[n][""]+e[n].rtl;else if("string"==typeof e[n])t.innerHTML=e[n];else{var r=t.value||"";null!=r&&e[n][r]&&(t.innerHTML=e[n][r])}})})}},{key:"buildPickers",value:function(t,e){var n=this;this.pickers=t.map(function(t){if(t.classList.contains("ql-align"))return null==t.querySelector("option")&&s(t,q),new k.default(t,e.align);if(t.classList.contains("ql-background")||t.classList.contains("ql-color")){var n=t.classList.contains("ql-background")?"background":"color";return null==t.querySelector("option")&&s(t,T,"background"===n?"#ffffff":"#000000"),new w.default(t,e[n])}return null==t.querySelector("option")&&(t.classList.contains("ql-font")?s(t,P):t.classList.contains("ql-header")?s(t,S):t.classList.contains("ql-size")&&s(t,C)),new N.default(t)});var r=function(){n.pickers.forEach(function(t){t.update()})};this.quill.on(v.default.events.EDITOR_CHANGE,r)}}]),e}(_.default);L.DEFAULTS=(0,h.default)(!0,{},_.default.DEFAULTS,{modules:{toolbar:{handlers:{formula:function(){this.quill.theme.tooltip.edit("formula")},image:function(){var t=this,e=this.container.querySelector("input.ql-image[type=file]");null==e&&(e=document.createElement("input"),e.setAttribute("type","file"),e.setAttribute("accept","image/png, image/gif, image/jpeg, image/bmp, image/x-icon"),e.classList.add("ql-image"),e.addEventListener("change",function(){if(null!=e.files&&null!=e.files[0]){var n=new FileReader;n.onload=function(n){var r=t.quill.getSelection(!0);t.quill.updateContents((new d.default).retain(r.index).delete(r.length).insert({image:n.target.result}),v.default.sources.USER),t.quill.setSelection(r.index+1,v.default.sources.SILENT),e.value=""},n.readAsDataURL(e.files[0])}}),this.container.appendChild(e)),e.click()},video:function(){this.quill.theme.tooltip.edit("video")}}}}});var M=function(t){function e(t,n){o(this,e);var r=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));return r.textbox=r.root.querySelector('input[type="text"]'),r.listen(),r}return l(e,t),u(e,[{key:"listen",value:function(){var t=this;this.textbox.addEventListener("keydown",function(e){g.default.match(e,"enter")?(t.save(),e.preventDefault()):g.default.match(e,"escape")&&(t.cancel(),e.preventDefault())})}},{key:"cancel",value:function(){this.hide()}},{key:"edit",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"link",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.root.classList.remove("ql-hidden"),this.root.classList.add("ql-editing"),null!=e?this.textbox.value=e:t!==this.root.getAttribute("data-mode")&&(this.textbox.value=""),this.position(this.quill.getBounds(this.quill.selection.savedRange)),this.textbox.select(),this.textbox.setAttribute("placeholder",this.textbox.getAttribute("data-"+t)||""),this.root.setAttribute("data-mode",t)}},{key:"restoreFocus",value:function(){var t=this.quill.scrollingContainer.scrollTop;this.quill.focus(),this.quill.scrollingContainer.scrollTop=t}},{key:"save",value:function(){var t=this.textbox.value;switch(this.root.getAttribute("data-mode")){case"link":var e=this.quill.root.scrollTop;this.linkRange?(this.quill.formatText(this.linkRange,"link",t,v.default.sources.USER),delete this.linkRange):(this.restoreFocus(),this.quill.format("link",t,v.default.sources.USER)),this.quill.root.scrollTop=e;break;case"video":t=a(t);case"formula":if(!t)break;var n=this.quill.getSelection(!0);if(null!=n){var r=n.index+n.length;this.quill.insertEmbed(r,this.root.getAttribute("data-mode"),t,v.default.sources.USER),"formula"===this.root.getAttribute("data-mode")&&this.quill.insertText(r+1," ",v.default.sources.USER),this.quill.setSelection(r+2,v.default.sources.USER)}}this.textbox.value="",this.hide()}}]),e}(A.default);e.BaseTooltip=M,e.default=L},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(46),i=r(o),l=n(34),a=n(36),s=n(62),u=n(63),c=r(u),f=n(64),h=r(f),p=n(65),d=r(p),y=n(35),v=n(24),b=n(37),g=n(38),m=n(39),_=r(m),O=n(66),w=r(O),x=n(15),k=r(x),E=n(67),N=r(E),j=n(68),A=r(j),q=n(69),T=r(q),P=n(70),S=r(P),C=n(71),L=r(C),M=n(13),R=r(M),I=n(72),B=r(I),D=n(73),U=r(D),F=n(74),H=r(F),K=n(26),z=r(K),V=n(16),Z=r(V),W=n(41),G=r(W),Y=n(42),X=r(Y),$=n(43),Q=r($),J=n(107),tt=r(J),et=n(108),nt=r(et);i.default.register({"attributors/attribute/direction":a.DirectionAttribute,"attributors/class/align":l.AlignClass,"attributors/class/background":y.BackgroundClass,"attributors/class/color":v.ColorClass,"attributors/class/direction":a.DirectionClass,"attributors/class/font":b.FontClass,"attributors/class/size":g.SizeClass,"attributors/style/align":l.AlignStyle,"attributors/style/background":y.BackgroundStyle,"attributors/style/color":v.ColorStyle,"attributors/style/direction":a.DirectionStyle,"attributors/style/font":b.FontStyle,"attributors/style/size":g.SizeStyle},!0),i.default.register({"formats/align":l.AlignClass,"formats/direction":a.DirectionClass,"formats/indent":s.IndentClass,"formats/background":y.BackgroundStyle,"formats/color":v.ColorStyle,"formats/font":b.FontClass,"formats/size":g.SizeClass,"formats/blockquote":c.default,"formats/code-block":R.default,"formats/header":h.default,"formats/list":d.default,"formats/bold":_.default,"formats/code":M.Code,"formats/italic":w.default,"formats/link":k.default,"formats/script":N.default,"formats/strike":A.default,"formats/underline":T.default,"formats/image":S.default,"formats/video":L.default,"formats/list/item":p.ListItem,"modules/formula":B.default,"modules/syntax":U.default,"modules/toolbar":H.default,"themes/bubble":tt.default,"themes/snow":nt.default,"ui/icons":z.default,"ui/picker":Z.default,"ui/icon-picker":X.default,"ui/color-picker":G.default,"ui/tooltip":Q.default},!0),e.default=i.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),i=r(o),l=n(6),a=r(l),s=n(3),u=r(s),c=n(14),f=r(c),h=n(23),p=r(h),d=n(31),y=r(d),v=n(33),b=r(v),g=n(5),m=r(g),_=n(59),O=r(_),w=n(8),x=r(w),k=n(60),E=r(k),N=n(61),j=r(N),A=n(25),q=r(A);a.default.register({"blots/block":u.default,"blots/block/embed":s.BlockEmbed,"blots/break":f.default,"blots/container":p.default,"blots/cursor":y.default,"blots/embed":b.default,"blots/inline":m.default,"blots/scroll":O.default,"blots/text":x.default,"modules/clipboard":E.default,"modules/history":j.default,"modules/keyboard":q.default}),i.default.register(u.default,f.default,y.default,m.default,O.default,x.default),e.default=a.default},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(){this.head=this.tail=null,this.length=0}return t.prototype.append=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];this.insertBefore(t[0],null),t.length>1&&this.append.apply(this,t.slice(1))},t.prototype.contains=function(t){for(var e,n=this.iterator();e=n();)if(e===t)return!0;return!1},t.prototype.insertBefore=function(t,e){t&&(t.next=e,null!=e?(t.prev=e.prev,null!=e.prev&&(e.prev.next=t),e.prev=t,e===this.head&&(this.head=t)):null!=this.tail?(this.tail.next=t,t.prev=this.tail,this.tail=t):(t.prev=null,this.head=this.tail=t),this.length+=1)},t.prototype.offset=function(t){for(var e=0,n=this.head;null!=n;){if(n===t)return e;e+=n.length(),n=n.next}return-1},t.prototype.remove=function(t){this.contains(t)&&(null!=t.prev&&(t.prev.next=t.next),null!=t.next&&(t.next.prev=t.prev),t===this.head&&(this.head=t.next),t===this.tail&&(this.tail=t.prev),this.length-=1)},t.prototype.iterator=function(t){return void 0===t&&(t=this.head),function(){var e=t;return null!=t&&(t=t.next),e}},t.prototype.find=function(t,e){void 0===e&&(e=!1);for(var n,r=this.iterator();n=r();){var o=n.length();if(t<o||e&&t===o&&(null==n.next||0!==n.next.length()))return[n,t];t-=o}return[null,0]},t.prototype.forEach=function(t){for(var e,n=this.iterator();e=n();)t(e)},t.prototype.forEachAt=function(t,e,n){if(!(e<=0))for(var r,o=this.find(t),i=o[0],l=o[1],a=t-l,s=this.iterator(i);(r=s())&&a<t+e;){var u=r.length();t>a?n(r,t-a,Math.min(e,a+u-t)):n(r,0,Math.min(u,t+e-a)),a+=u}},t.prototype.map=function(t){return this.reduce(function(e,n){return e.push(t(n)),e},[])},t.prototype.reduce=function(t,e){for(var n,r=this.iterator();n=r();)e=t(e,n);return e},t}();e.default=r},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(17),i=n(1),l={attributes:!0,characterData:!0,characterDataOldValue:!0,childList:!0,subtree:!0},a=function(t){function e(e){var n=t.call(this,e)||this;return n.scroll=n,n.observer=new MutationObserver(function(t){n.update(t)}),n.observer.observe(n.domNode,l),n.attach(),n}return r(e,t),e.prototype.detach=function(){t.prototype.detach.call(this),this.observer.disconnect()},e.prototype.deleteAt=function(e,n){this.update(),0===e&&n===this.length()?this.children.forEach(function(t){t.remove()}):t.prototype.deleteAt.call(this,e,n)},e.prototype.formatAt=function(e,n,r,o){this.update(),t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.insertAt=function(e,n,r){this.update(),t.prototype.insertAt.call(this,e,n,r)},e.prototype.optimize=function(e,n){var r=this;void 0===e&&(e=[]),void 0===n&&(n={}),t.prototype.optimize.call(this,n);for(var l=[].slice.call(this.observer.takeRecords());l.length>0;)e.push(l.pop());for(var a=function(t,e){void 0===e&&(e=!0),null!=t&&t!==r&&null!=t.domNode.parentNode&&(null==t.domNode[i.DATA_KEY].mutations&&(t.domNode[i.DATA_KEY].mutations=[]),e&&a(t.parent))},s=function(t){null!=t.domNode[i.DATA_KEY]&&null!=t.domNode[i.DATA_KEY].mutations&&(t instanceof o.default&&t.children.forEach(s),t.optimize(n))},u=e,c=0;u.length>0;c+=1){if(c>=100)throw new Error("[Parchment] Maximum optimize iterations reached");for(u.forEach(function(t){var e=i.find(t.target,!0);null!=e&&(e.domNode===t.target&&("childList"===t.type?(a(i.find(t.previousSibling,!1)),[].forEach.call(t.addedNodes,function(t){var e=i.find(t,!1);a(e,!1),e instanceof o.default&&e.children.forEach(function(t){a(t,!1)})})):"attributes"===t.type&&a(e.prev)),a(e))}),this.children.forEach(s),u=[].slice.call(this.observer.takeRecords()),l=u.slice();l.length>0;)e.push(l.pop())}},e.prototype.update=function(e,n){var r=this;void 0===n&&(n={}),e=e||this.observer.takeRecords(),e.map(function(t){var e=i.find(t.target,!0);return null==e?null:null==e.domNode[i.DATA_KEY].mutations?(e.domNode[i.DATA_KEY].mutations=[t],e):(e.domNode[i.DATA_KEY].mutations.push(t),null)}).forEach(function(t){null!=t&&t!==r&&null!=t.domNode[i.DATA_KEY]&&t.update(t.domNode[i.DATA_KEY].mutations||[],n)}),null!=this.domNode[i.DATA_KEY].mutations&&t.prototype.update.call(this,this.domNode[i.DATA_KEY].mutations,n),this.optimize(e,n)},e.blotName="scroll",e.defaultChild="block",e.scope=i.Scope.BLOCK_BLOT,e.tagName="DIV",e}(o.default);e.default=a},function(t,e,n){"use strict";function r(t,e){if(Object.keys(t).length!==Object.keys(e).length)return!1;for(var n in t)if(t[n]!==e[n])return!1;return!0}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(18),l=n(1),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.formats=function(n){if(n.tagName!==e.tagName)return t.formats.call(this,n)},e.prototype.format=function(n,r){var o=this;n!==this.statics.blotName||r?t.prototype.format.call(this,n,r):(this.children.forEach(function(t){t instanceof i.default||(t=t.wrap(e.blotName,!0)),o.attributes.copy(t)}),this.unwrap())},e.prototype.formatAt=function(e,n,r,o){if(null!=this.formats()[r]||l.query(r,l.Scope.ATTRIBUTE)){this.isolate(e,n).format(r,o)}else t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.optimize=function(n){t.prototype.optimize.call(this,n);var o=this.formats();if(0===Object.keys(o).length)return this.unwrap();var i=this.next;i instanceof e&&i.prev===this&&r(o,i.formats())&&(i.moveChildren(this),i.remove())},e.blotName="inline",e.scope=l.Scope.INLINE_BLOT,e.tagName="SPAN",e}(i.default);e.default=a},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(18),i=n(1),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.formats=function(n){var r=i.query(e.blotName).tagName;if(n.tagName!==r)return t.formats.call(this,n)},e.prototype.format=function(n,r){null!=i.query(n,i.Scope.BLOCK)&&(n!==this.statics.blotName||r?t.prototype.format.call(this,n,r):this.replaceWith(e.blotName))},e.prototype.formatAt=function(e,n,r,o){null!=i.query(r,i.Scope.BLOCK)?this.format(r,o):t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.insertAt=function(e,n,r){if(null==r||null!=i.query(n,i.Scope.INLINE))t.prototype.insertAt.call(this,e,n,r);else{var o=this.split(e),l=i.create(n,r);o.parent.insertBefore(l,o)}},e.prototype.update=function(e,n){navigator.userAgent.match(/Trident/)?this.build():t.prototype.update.call(this,e,n)},e.blotName="block",e.scope=i.Scope.BLOCK_BLOT,e.tagName="P",e}(o.default);e.default=l},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(19),i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.formats=function(t){},e.prototype.format=function(e,n){t.prototype.formatAt.call(this,0,this.length(),e,n)},e.prototype.formatAt=function(e,n,r,o){0===e&&n===this.length()?this.format(r,o):t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.formats=function(){return this.statics.formats(this.domNode)},e}(o.default);e.default=i},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(19),i=n(1),l=function(t){function e(e){var n=t.call(this,e)||this;return n.text=n.statics.value(n.domNode),n}return r(e,t),e.create=function(t){return document.createTextNode(t)},e.value=function(t){var e=t.data;return e.normalize&&(e=e.normalize()),e},e.prototype.deleteAt=function(t,e){this.domNode.data=this.text=this.text.slice(0,t)+this.text.slice(t+e)},e.prototype.index=function(t,e){return this.domNode===t?e:-1},e.prototype.insertAt=function(e,n,r){null==r?(this.text=this.text.slice(0,e)+n+this.text.slice(e),this.domNode.data=this.text):t.prototype.insertAt.call(this,e,n,r)},e.prototype.length=function(){return this.text.length},e.prototype.optimize=function(n){t.prototype.optimize.call(this,n),this.text=this.statics.value(this.domNode),0===this.text.length?this.remove():this.next instanceof e&&this.next.prev===this&&(this.insertAt(this.length(),this.next.value()),this.next.remove())},e.prototype.position=function(t,e){return void 0===e&&(e=!1),[this.domNode,t]},e.prototype.split=function(t,e){if(void 0===e&&(e=!1),!e){if(0===t)return this;if(t===this.length())return this.next}var n=i.create(this.domNode.splitText(t));return this.parent.insertBefore(n,this.next),this.text=this.statics.value(this.domNode),n},e.prototype.update=function(t,e){var n=this;t.some(function(t){return"characterData"===t.type&&t.target===n.domNode})&&(this.text=this.statics.value(this.domNode))},e.prototype.value=function(){return this.text},e.blotName="text",e.scope=i.Scope.INLINE_BLOT,e}(o.default);e.default=l},function(t,e,n){"use strict";var r=document.createElement("div");if(r.classList.toggle("test-class",!1),r.classList.contains("test-class")){var o=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(t,e){return arguments.length>1&&!this.contains(t)==!e?e:o.call(this,t)}}String.prototype.startsWith||(String.prototype.startsWith=function(t,e){return e=e||0,this.substr(e,t.length)===t}),String.prototype.endsWith||(String.prototype.endsWith=function(t,e){var n=this.toString();("number"!=typeof e||!isFinite(e)||Math.floor(e)!==e||e>n.length)&&(e=n.length),e-=t.length;var r=n.indexOf(t,e);return-1!==r&&r===e}),Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(t){if(null===this)throw new TypeError("Array.prototype.find called on null or undefined");if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var e,n=Object(this),r=n.length>>>0,o=arguments[1],i=0;i<r;i++)if(e=n[i],t.call(o,e,i,n))return e}}),document.addEventListener("DOMContentLoaded",function(){document.execCommand("enableObjectResizing",!1,!1),document.execCommand("autoUrlDetect",!1,!1)})},function(t,e){function n(t,e,n){if(t==e)return t?[[v,t]]:[];(n<0||t.length<n)&&(n=null);var o=l(t,e),i=t.substring(0,o);t=t.substring(o),e=e.substring(o),o=a(t,e);var s=t.substring(t.length-o);t=t.substring(0,t.length-o),e=e.substring(0,e.length-o);var c=r(t,e);return i&&c.unshift([v,i]),s&&c.push([v,s]),u(c),null!=n&&(c=f(c,n)),c=h(c)}function r(t,e){var r;if(!t)return[[y,e]];if(!e)return[[d,t]];var i=t.length>e.length?t:e,l=t.length>e.length?e:t,a=i.indexOf(l);if(-1!=a)return r=[[y,i.substring(0,a)],[v,l],[y,i.substring(a+l.length)]],t.length>e.length&&(r[0][0]=r[2][0]=d),r;if(1==l.length)return[[d,t],[y,e]];var u=s(t,e);if(u){var c=u[0],f=u[1],h=u[2],p=u[3],b=u[4],g=n(c,h),m=n(f,p);return g.concat([[v,b]],m)}return o(t,e)}function o(t,e){for(var n=t.length,r=e.length,o=Math.ceil((n+r)/2),l=o,a=2*o,s=new Array(a),u=new Array(a),c=0;c<a;c++)s[c]=-1,u[c]=-1;s[l+1]=0,u[l+1]=0;for(var f=n-r,h=f%2!=0,p=0,v=0,b=0,g=0,m=0;m<o;m++){for(var _=-m+p;_<=m-v;_+=2){var O,w=l+_;O=_==-m||_!=m&&s[w-1]<s[w+1]?s[w+1]:s[w-1]+1;for(var x=O-_;O<n&&x<r&&t.charAt(O)==e.charAt(x);)O++,x++;if(s[w]=O,O>n)v+=2;else if(x>r)p+=2;else if(h){var k=l+f-_;if(k>=0&&k<a&&-1!=u[k]){var E=n-u[k];if(O>=E)return i(t,e,O,x)}}}for(var N=-m+b;N<=m-g;N+=2){var E,k=l+N;E=N==-m||N!=m&&u[k-1]<u[k+1]?u[k+1]:u[k-1]+1;for(var j=E-N;E<n&&j<r&&t.charAt(n-E-1)==e.charAt(r-j-1);)E++,j++;if(u[k]=E,E>n)g+=2;else if(j>r)b+=2;else if(!h){var w=l+f-N;if(w>=0&&w<a&&-1!=s[w]){var O=s[w],x=l+O-w;if(E=n-E,O>=E)return i(t,e,O,x)}}}}return[[d,t],[y,e]]}function i(t,e,r,o){var i=t.substring(0,r),l=e.substring(0,o),a=t.substring(r),s=e.substring(o),u=n(i,l),c=n(a,s);return u.concat(c)}function l(t,e){if(!t||!e||t.charAt(0)!=e.charAt(0))return 0;for(var n=0,r=Math.min(t.length,e.length),o=r,i=0;n<o;)t.substring(i,o)==e.substring(i,o)?(n=o,i=n):r=o,o=Math.floor((r-n)/2+n);return o}function a(t,e){if(!t||!e||t.charAt(t.length-1)!=e.charAt(e.length-1))return 0;for(var n=0,r=Math.min(t.length,e.length),o=r,i=0;n<o;)t.substring(t.length-o,t.length-i)==e.substring(e.length-o,e.length-i)?(n=o,i=n):r=o,o=Math.floor((r-n)/2+n);return o}function s(t,e){function n(t,e,n){for(var r,o,i,s,u=t.substring(n,n+Math.floor(t.length/4)),c=-1,f="";-1!=(c=e.indexOf(u,c+1));){var h=l(t.substring(n),e.substring(c)),p=a(t.substring(0,n),e.substring(0,c));f.length<p+h&&(f=e.substring(c-p,c)+e.substring(c,c+h),r=t.substring(0,n-p),o=t.substring(n+h),i=e.substring(0,c-p),s=e.substring(c+h))}return 2*f.length>=t.length?[r,o,i,s,f]:null}var r=t.length>e.length?t:e,o=t.length>e.length?e:t;if(r.length<4||2*o.length<r.length)return null;var i,s=n(r,o,Math.ceil(r.length/4)),u=n(r,o,Math.ceil(r.length/2));if(!s&&!u)return null;i=u?s&&s[4].length>u[4].length?s:u:s;var c,f,h,p;return t.length>e.length?(c=i[0],f=i[1],h=i[2],p=i[3]):(h=i[0],p=i[1],c=i[2],f=i[3]),[c,f,h,p,i[4]]}function u(t){t.push([v,""]);for(var e,n=0,r=0,o=0,i="",s="";n<t.length;)switch(t[n][0]){case y:o++,s+=t[n][1],n++;break;case d:r++,i+=t[n][1],n++;break;case v:r+o>1?(0!==r&&0!==o&&(e=l(s,i),0!==e&&(n-r-o>0&&t[n-r-o-1][0]==v?t[n-r-o-1][1]+=s.substring(0,e):(t.splice(0,0,[v,s.substring(0,e)]),n++),s=s.substring(e),i=i.substring(e)),0!==(e=a(s,i))&&(t[n][1]=s.substring(s.length-e)+t[n][1],s=s.substring(0,s.length-e),i=i.substring(0,i.length-e))),0===r?t.splice(n-o,r+o,[y,s]):0===o?t.splice(n-r,r+o,[d,i]):t.splice(n-r-o,r+o,[d,i],[y,s]),n=n-r-o+(r?1:0)+(o?1:0)+1):0!==n&&t[n-1][0]==v?(t[n-1][1]+=t[n][1],t.splice(n,1)):n++,o=0,r=0,i="",s=""}""===t[t.length-1][1]&&t.pop();var c=!1;for(n=1;n<t.length-1;)t[n-1][0]==v&&t[n+1][0]==v&&(t[n][1].substring(t[n][1].length-t[n-1][1].length)==t[n-1][1]?(t[n][1]=t[n-1][1]+t[n][1].substring(0,t[n][1].length-t[n-1][1].length),t[n+1][1]=t[n-1][1]+t[n+1][1],t.splice(n-1,1),c=!0):t[n][1].substring(0,t[n+1][1].length)==t[n+1][1]&&(t[n-1][1]+=t[n+1][1],t[n][1]=t[n][1].substring(t[n+1][1].length)+t[n+1][1],t.splice(n+1,1),c=!0)),n++;c&&u(t)}function c(t,e){if(0===e)return[v,t];for(var n=0,r=0;r<t.length;r++){var o=t[r];if(o[0]===d||o[0]===v){var i=n+o[1].length;if(e===i)return[r+1,t];if(e<i){t=t.slice();var l=e-n,a=[o[0],o[1].slice(0,l)],s=[o[0],o[1].slice(l)];return t.splice(r,1,a,s),[r+1,t]}n=i}}throw new Error("cursor_pos is out of bounds!")}function f(t,e){var n=c(t,e),r=n[1],o=n[0],i=r[o],l=r[o+1];if(null==i)return t;if(i[0]!==v)return t;if(null!=l&&i[1]+l[1]===l[1]+i[1])return r.splice(o,2,l,i),p(r,o,2);if(null!=l&&0===l[1].indexOf(i[1])){r.splice(o,2,[l[0],i[1]],[0,i[1]]);var a=l[1].slice(i[1].length);return a.length>0&&r.splice(o+2,0,[l[0],a]),p(r,o,3)}return t}function h(t){for(var e=!1,n=function(t){return t.charCodeAt(0)>=56320&&t.charCodeAt(0)<=57343},r=2;r<t.length;r+=1)t[r-2][0]===v&&function(t){return t.charCodeAt(t.length-1)>=55296&&t.charCodeAt(t.length-1)<=56319}(t[r-2][1])&&t[r-1][0]===d&&n(t[r-1][1])&&t[r][0]===y&&n(t[r][1])&&(e=!0,t[r-1][1]=t[r-2][1].slice(-1)+t[r-1][1],t[r][1]=t[r-2][1].slice(-1)+t[r][1],t[r-2][1]=t[r-2][1].slice(0,-1));if(!e)return t;for(var o=[],r=0;r<t.length;r+=1)t[r][1].length>0&&o.push(t[r]);return o}function p(t,e,n){for(var r=e+n-1;r>=0&&r>=e-1;r--)if(r+1<t.length){var o=t[r],i=t[r+1];o[0]===i[1]&&t.splice(r,2,[o[0],o[1]+i[1]])}return t}var d=-1,y=1,v=0,b=n;b.INSERT=y,b.DELETE=d,b.EQUAL=v,t.exports=b},function(t,e){function n(t){var e=[];for(var n in t)e.push(n);return e}e=t.exports="function"==typeof Object.keys?Object.keys:n,e.shim=n},function(t,e){function n(t){return"[object Arguments]"==Object.prototype.toString.call(t)}function r(t){return t&&"object"==typeof t&&"number"==typeof t.length&&Object.prototype.hasOwnProperty.call(t,"callee")&&!Object.prototype.propertyIsEnumerable.call(t,"callee")||!1}var o="[object Arguments]"==function(){return Object.prototype.toString.call(arguments)}();e=t.exports=o?n:r,e.supported=n,e.unsupported=r},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){return Object.keys(e).reduce(function(n,r){return null==t[r]?n:(e[r]===t[r]?n[r]=e[r]:Array.isArray(e[r])?e[r].indexOf(t[r])<0&&(n[r]=e[r].concat([t[r]])):n[r]=[e[r],t[r]],n)},{})}function a(t){return t.reduce(function(t,e){if(1===e.insert){var n=(0,N.default)(e.attributes);return delete n.image,t.insert({image:e.attributes.image},n)}if(null==e.attributes||!0!==e.attributes.list&&!0!==e.attributes.bullet||(e=(0,N.default)(e),e.attributes.list?e.attributes.list="ordered":(e.attributes.list="bullet",delete e.attributes.bullet)),"string"==typeof e.insert){var r=e.insert.replace(/\r\n/g,"\n").replace(/\r/g,"\n");return t.insert(r,e.attributes)}return t.push(e)},new h.default)}Object.defineProperty(e,"__esModule",{value:!0});var s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),c=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),f=n(4),h=r(f),p=n(20),d=r(p),y=n(0),v=r(y),b=n(13),g=r(b),m=n(31),_=r(m),O=n(3),w=r(O),x=n(14),k=r(x),E=n(21),N=r(E),j=n(12),A=r(j),q=n(2),T=r(q),P=/^[ -~]*$/,S=function(){function t(e){i(this,t),this.scroll=e,this.delta=this.getDelta()}return c(t,[{key:"applyDelta",value:function(t){var e=this,n=!1;this.scroll.update();var r=this.scroll.length();return this.scroll.batchStart(),t=a(t),t.reduce(function(t,o){var i=o.retain||o.delete||o.insert.length||1,l=o.attributes||{};if(null!=o.insert){if("string"==typeof o.insert){var a=o.insert;a.endsWith("\n")&&n&&(n=!1,a=a.slice(0,-1)),t>=r&&!a.endsWith("\n")&&(n=!0),e.scroll.insertAt(t,a);var c=e.scroll.line(t),f=u(c,2),h=f[0],p=f[1],y=(0,T.default)({},(0,O.bubbleFormats)(h));if(h instanceof w.default){var b=h.descendant(v.default.Leaf,p),g=u(b,1),m=g[0];y=(0,T.default)(y,(0,O.bubbleFormats)(m))}l=d.default.attributes.diff(y,l)||{}}else if("object"===s(o.insert)){var _=Object.keys(o.insert)[0];if(null==_)return t;e.scroll.insertAt(t,_,o.insert[_])}r+=i}return Object.keys(l).forEach(function(n){e.scroll.formatAt(t,i,n,l[n])}),t+i},0),t.reduce(function(t,n){return"number"==typeof n.delete?(e.scroll.deleteAt(t,n.delete),t):t+(n.retain||n.insert.length||1)},0),this.scroll.batchEnd(),this.update(t)}},{key:"deleteText",value:function(t,e){return this.scroll.deleteAt(t,e),this.update((new h.default).retain(t).delete(e))}},{key:"formatLine",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.scroll.update(),Object.keys(r).forEach(function(o){if(null==n.scroll.whitelist||n.scroll.whitelist[o]){var i=n.scroll.lines(t,Math.max(e,1)),l=e;i.forEach(function(e){var i=e.length();if(e instanceof g.default){var a=t-e.offset(n.scroll),s=e.newlineIndex(a+l)-a+1;e.formatAt(a,s,o,r[o])}else e.format(o,r[o]);l-=i})}}),this.scroll.optimize(),this.update((new h.default).retain(t).retain(e,(0,N.default)(r)))}},{key:"formatText",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return Object.keys(r).forEach(function(o){n.scroll.formatAt(t,e,o,r[o])}),this.update((new h.default).retain(t).retain(e,(0,N.default)(r)))}},{key:"getContents",value:function(t,e){return this.delta.slice(t,t+e)}},{key:"getDelta",value:function(){return this.scroll.lines().reduce(function(t,e){return t.concat(e.delta())},new h.default)}},{key:"getFormat",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=[],r=[];0===e?this.scroll.path(t).forEach(function(t){var e=u(t,1),o=e[0];o instanceof w.default?n.push(o):o instanceof v.default.Leaf&&r.push(o)}):(n=this.scroll.lines(t,e),r=this.scroll.descendants(v.default.Leaf,t,e));var o=[n,r].map(function(t){if(0===t.length)return{};for(var e=(0,O.bubbleFormats)(t.shift());Object.keys(e).length>0;){var n=t.shift();if(null==n)return e;e=l((0,O.bubbleFormats)(n),e)}return e});return T.default.apply(T.default,o)}},{key:"getText",value:function(t,e){return this.getContents(t,e).filter(function(t){return"string"==typeof t.insert}).map(function(t){return t.insert}).join("")}},{key:"insertEmbed",value:function(t,e,n){return this.scroll.insertAt(t,e,n),this.update((new h.default).retain(t).insert(o({},e,n)))}},{key:"insertText",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return e=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),this.scroll.insertAt(t,e),Object.keys(r).forEach(function(o){n.scroll.formatAt(t,e.length,o,r[o])}),this.update((new h.default).retain(t).insert(e,(0,N.default)(r)))}},{key:"isBlank",value:function(){if(0==this.scroll.children.length)return!0;if(this.scroll.children.length>1)return!1;var t=this.scroll.children.head;return t.statics.blotName===w.default.blotName&&(!(t.children.length>1)&&t.children.head instanceof k.default)}},{key:"removeFormat",value:function(t,e){var n=this.getText(t,e),r=this.scroll.line(t+e),o=u(r,2),i=o[0],l=o[1],a=0,s=new h.default;null!=i&&(a=i instanceof g.default?i.newlineIndex(l)-l+1:i.length()-l,s=i.delta().slice(l,l+a-1).insert("\n"));var c=this.getContents(t,e+a),f=c.diff((new h.default).insert(n).concat(s)),p=(new h.default).retain(t).concat(f);return this.applyDelta(p)}},{key:"update",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,r=this.delta;if(1===e.length&&"characterData"===e[0].type&&e[0].target.data.match(P)&&v.default.find(e[0].target)){var o=v.default.find(e[0].target),i=(0,O.bubbleFormats)(o),l=o.offset(this.scroll),a=e[0].oldValue.replace(_.default.CONTENTS,""),s=(new h.default).insert(a),u=(new h.default).insert(o.value());t=(new h.default).retain(l).concat(s.diff(u,n)).reduce(function(t,e){return e.insert?t.insert(e.insert,i):t.push(e)},new h.default),this.delta=r.compose(t)}else this.delta=this.getDelta(),t&&(0,A.default)(r.compose(t),this.delta)||(t=r.diff(this.delta,n));return t}}]),t}();e.default=S},function(t,e){"use strict";function n(){}function r(t,e,n){this.fn=t,this.context=e,this.once=n||!1}function o(){this._events=new n,this._eventsCount=0}var i=Object.prototype.hasOwnProperty,l="~";Object.create&&(n.prototype=Object.create(null),(new n).__proto__||(l=!1)),o.prototype.eventNames=function(){var t,e,n=[];if(0===this._eventsCount)return n;for(e in t=this._events)i.call(t,e)&&n.push(l?e.slice(1):e);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(t)):n},o.prototype.listeners=function(t,e){var n=l?l+t:t,r=this._events[n];if(e)return!!r;if(!r)return[];if(r.fn)return[r.fn];for(var o=0,i=r.length,a=new Array(i);o<i;o++)a[o]=r[o].fn;return a},o.prototype.emit=function(t,e,n,r,o,i){var a=l?l+t:t;if(!this._events[a])return!1;var s,u,c=this._events[a],f=arguments.length;if(c.fn){switch(c.once&&this.removeListener(t,c.fn,void 0,!0),f){case 1:return c.fn.call(c.context),!0;case 2:return c.fn.call(c.context,e),!0;case 3:return c.fn.call(c.context,e,n),!0;case 4:return c.fn.call(c.context,e,n,r),!0;case 5:return c.fn.call(c.context,e,n,r,o),!0;case 6:return c.fn.call(c.context,e,n,r,o,i),!0}for(u=1,s=new Array(f-1);u<f;u++)s[u-1]=arguments[u];c.fn.apply(c.context,s)}else{var h,p=c.length;for(u=0;u<p;u++)switch(c[u].once&&this.removeListener(t,c[u].fn,void 0,!0),f){case 1:c[u].fn.call(c[u].context);break;case 2:c[u].fn.call(c[u].context,e);break;case 3:c[u].fn.call(c[u].context,e,n);break;case 4:c[u].fn.call(c[u].context,e,n,r);break;default:if(!s)for(h=1,s=new Array(f-1);h<f;h++)s[h-1]=arguments[h];c[u].fn.apply(c[u].context,s)}}return!0},o.prototype.on=function(t,e,n){var o=new r(e,n||this),i=l?l+t:t;return this._events[i]?this._events[i].fn?this._events[i]=[this._events[i],o]:this._events[i].push(o):(this._events[i]=o,this._eventsCount++),this},o.prototype.once=function(t,e,n){var o=new r(e,n||this,!0),i=l?l+t:t;return this._events[i]?this._events[i].fn?this._events[i]=[this._events[i],o]:this._events[i].push(o):(this._events[i]=o,this._eventsCount++),this},o.prototype.removeListener=function(t,e,r,o){var i=l?l+t:t;if(!this._events[i])return this;if(!e)return 0==--this._eventsCount?this._events=new n:delete this._events[i],this;var a=this._events[i];if(a.fn)a.fn!==e||o&&!a.once||r&&a.context!==r||(0==--this._eventsCount?this._events=new n:delete this._events[i]);else{for(var s=0,u=[],c=a.length;s<c;s++)(a[s].fn!==e||o&&!a[s].once||r&&a[s].context!==r)&&u.push(a[s]);u.length?this._events[i]=1===u.length?u[0]:u:0==--this._eventsCount?this._events=new n:delete this._events[i]}return this},o.prototype.removeAllListeners=function(t){var e;return t?(e=l?l+t:t,this._events[e]&&(0==--this._eventsCount?this._events=new n:delete this._events[e])):(this._events=new n,this._eventsCount=0),this},o.prototype.off=o.prototype.removeListener,o.prototype.addListener=o.prototype.on,o.prototype.setMaxListeners=function(){return this},o.prefixed=l,o.EventEmitter=o,void 0!==t&&(t.exports=o)},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t){return t instanceof v.default||t instanceof y.BlockEmbed}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),u=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),c=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},f=n(0),h=r(f),p=n(9),d=r(p),y=n(3),v=r(y),b=n(14),g=r(b),m=n(13),_=r(m),O=n(23),w=r(O),x=function(t){function e(t,n){o(this,e);var r=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return r.emitter=n.emitter,Array.isArray(n.whitelist)&&(r.whitelist=n.whitelist.reduce(function(t,e){return t[e]=!0,t},{})),r.domNode.addEventListener("DOMNodeInserted",function(){}),r.optimize(),r.enable(),r}return l(e,t),u(e,[{key:"batchStart",value:function(){this.batch=!0}},{key:"batchEnd",value:function(){this.batch=!1,this.optimize()}},{key:"deleteAt",value:function(t,n){var r=this.line(t),o=s(r,2),i=o[0],l=o[1],a=this.line(t+n),u=s(a,1),f=u[0];if(c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"deleteAt",this).call(this,t,n),null!=f&&i!==f&&l>0){if(i instanceof y.BlockEmbed||f instanceof y.BlockEmbed)return void this.optimize();if(i instanceof _.default){var h=i.newlineIndex(i.length(),!0);if(h>-1&&(i=i.split(h+1))===f)return void this.optimize()}else if(f instanceof _.default){var p=f.newlineIndex(0);p>-1&&f.split(p+1)}var d=f.children.head instanceof g.default?null:f.children.head;i.moveChildren(f,d),i.remove()}this.optimize()}},{key:"enable",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.domNode.setAttribute("contenteditable",t)}},{key:"formatAt",value:function(t,n,r,o){(null==this.whitelist||this.whitelist[r])&&(c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"formatAt",this).call(this,t,n,r,o),this.optimize())}},{key:"insertAt",value:function(t,n,r){if(null==r||null==this.whitelist||this.whitelist[n]){if(t>=this.length())if(null==r||null==h.default.query(n,h.default.Scope.BLOCK)){var o=h.default.create(this.statics.defaultChild);this.appendChild(o),null==r&&n.endsWith("\n")&&(n=n.slice(0,-1)),o.insertAt(0,n,r)}else{var i=h.default.create(n,r);this.appendChild(i)}else c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertAt",this).call(this,t,n,r);this.optimize()}}},{key:"insertBefore",value:function(t,n){if(t.statics.scope===h.default.Scope.INLINE_BLOT){var r=h.default.create(this.statics.defaultChild);r.appendChild(t),t=r}c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertBefore",this).call(this,t,n)}},{key:"leaf",value:function(t){return this.path(t).pop()||[null,-1]}},{key:"line",value:function(t){return t===this.length()?this.line(t-1):this.descendant(a,t)}},{key:"lines",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;return function t(e,n,r){var o=[],i=r;return e.children.forEachAt(n,r,function(e,n,r){a(e)?o.push(e):e instanceof h.default.Container&&(o=o.concat(t(e,n,i))),i-=r}),o}(this,t,e)}},{key:"optimize",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};!0!==this.batch&&(c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t,n),t.length>0&&this.emitter.emit(d.default.events.SCROLL_OPTIMIZE,t,n))}},{key:"path",value:function(t){return c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"path",this).call(this,t).slice(1)}},{key:"update",value:function(t){if(!0!==this.batch){var n=d.default.sources.USER;"string"==typeof t&&(n=t),Array.isArray(t)||(t=this.observer.takeRecords()),t.length>0&&this.emitter.emit(d.default.events.SCROLL_BEFORE_UPDATE,n,t),c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"update",this).call(this,t.concat([])),t.length>0&&this.emitter.emit(d.default.events.SCROLL_UPDATE,n,t)}}}]),e}(h.default.Scroll);x.blotName="scroll",x.className="ql-editor",x.tagName="DIV",x.defaultChild="block",x.allowedChildren=[v.default,y.BlockEmbed,w.default],e.default=x},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e,n){return"object"===(void 0===e?"undefined":x(e))?Object.keys(e).reduce(function(t,n){return s(t,n,e[n])},t):t.reduce(function(t,r){return r.attributes&&r.attributes[e]?t.push(r):t.insert(r.insert,(0,j.default)({},o({},e,n),r.attributes))},new q.default)}function u(t){if(t.nodeType!==Node.ELEMENT_NODE)return{};return t["__ql-computed-style"]||(t["__ql-computed-style"]=window.getComputedStyle(t))}function c(t,e){for(var n="",r=t.ops.length-1;r>=0&&n.length<e.length;--r){var o=t.ops[r];if("string"!=typeof o.insert)break;n=o.insert+n}return n.slice(-1*e.length)===e}function f(t){return 0!==t.childNodes.length&&["block","list-item"].indexOf(u(t).display)>-1}function h(t,e,n){return t.nodeType===t.TEXT_NODE?n.reduce(function(e,n){return n(t,e)},new q.default):t.nodeType===t.ELEMENT_NODE?[].reduce.call(t.childNodes||[],function(r,o){var i=h(o,e,n);return o.nodeType===t.ELEMENT_NODE&&(i=e.reduce(function(t,e){return e(o,t)},i),i=(o[W]||[]).reduce(function(t,e){return e(o,t)},i)),r.concat(i)},new q.default):new q.default}function p(t,e,n){return s(n,t,!0)}function d(t,e){var n=P.default.Attributor.Attribute.keys(t),r=P.default.Attributor.Class.keys(t),o=P.default.Attributor.Style.keys(t),i={};return n.concat(r).concat(o).forEach(function(e){var n=P.default.query(e,P.default.Scope.ATTRIBUTE);null!=n&&(i[n.attrName]=n.value(t),i[n.attrName])||(n=Y[e],null==n||n.attrName!==e&&n.keyName!==e||(i[n.attrName]=n.value(t)||void 0),null==(n=X[e])||n.attrName!==e&&n.keyName!==e||(n=X[e],i[n.attrName]=n.value(t)||void 0))}),Object.keys(i).length>0&&(e=s(e,i)),e}function y(t,e){var n=P.default.query(t);if(null==n)return e;if(n.prototype instanceof P.default.Embed){var r={},o=n.value(t);null!=o&&(r[n.blotName]=o,e=(new q.default).insert(r,n.formats(t)))}else"function"==typeof n.formats&&(e=s(e,n.blotName,n.formats(t)));return e}function v(t,e){return c(e,"\n")||e.insert("\n"),e}function b(){return new q.default}function g(t,e){var n=P.default.query(t);if(null==n||"list-item"!==n.blotName||!c(e,"\n"))return e;for(var r=-1,o=t.parentNode;!o.classList.contains("ql-clipboard");)"list"===(P.default.query(o)||{}).blotName&&(r+=1),o=o.parentNode;return r<=0?e:e.compose((new q.default).retain(e.length()-1).retain(1,{indent:r}))}function m(t,e){return c(e,"\n")||(f(t)||e.length()>0&&t.nextSibling&&f(t.nextSibling))&&e.insert("\n"),e}function _(t,e){if(f(t)&&null!=t.nextElementSibling&&!c(e,"\n\n")){var n=t.offsetHeight+parseFloat(u(t).marginTop)+parseFloat(u(t).marginBottom);t.nextElementSibling.offsetTop>t.offsetTop+1.5*n&&e.insert("\n")}return e}function O(t,e){var n={},r=t.style||{};return r.fontStyle&&"italic"===u(t).fontStyle&&(n.italic=!0),r.fontWeight&&(u(t).fontWeight.startsWith("bold")||parseInt(u(t).fontWeight)>=700)&&(n.bold=!0),Object.keys(n).length>0&&(e=s(e,n)),parseFloat(r.textIndent||0)>0&&(e=(new q.default).insert("\t").concat(e)),e}function w(t,e){var n=t.data;if("O:P"===t.parentNode.tagName)return e.insert(n.trim());if(0===n.trim().length&&t.parentNode.classList.contains("ql-clipboard"))return e;if(!u(t.parentNode).whiteSpace.startsWith("pre")){var r=function(t,e){return e=e.replace(/[^\u00a0]/g,""),e.length<1&&t?" ":e};n=n.replace(/\r\n/g," ").replace(/\n/g," "),n=n.replace(/\s\s+/g,r.bind(r,!0)),(null==t.previousSibling&&f(t.parentNode)||null!=t.previousSibling&&f(t.previousSibling))&&(n=n.replace(/^\s+/,r.bind(r,!1))),(null==t.nextSibling&&f(t.parentNode)||null!=t.nextSibling&&f(t.nextSibling))&&(n=n.replace(/\s+$/,r.bind(r,!1)))}return e.insert(n)}Object.defineProperty(e,"__esModule",{value:!0}),e.matchText=e.matchSpacing=e.matchNewline=e.matchBlot=e.matchAttributor=e.default=void 0;var x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},k=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),E=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),N=n(2),j=r(N),A=n(4),q=r(A),T=n(0),P=r(T),S=n(6),C=r(S),L=n(10),M=r(L),R=n(7),I=r(R),B=n(34),D=n(35),U=n(13),F=r(U),H=n(24),K=n(36),z=n(37),V=n(38),Z=(0,M.default)("quill:clipboard"),W="__ql-matcher",G=[[Node.TEXT_NODE,w],[Node.TEXT_NODE,m],["br",v],[Node.ELEMENT_NODE,m],[Node.ELEMENT_NODE,y],[Node.ELEMENT_NODE,_],[Node.ELEMENT_NODE,d],[Node.ELEMENT_NODE,O],["li",g],["b",p.bind(p,"bold")],["i",p.bind(p,"italic")],["style",b]],Y=[B.AlignAttribute,K.DirectionAttribute].reduce(function(t,e){return t[e.keyName]=e,t},{}),X=[B.AlignStyle,D.BackgroundStyle,H.ColorStyle,K.DirectionStyle,z.FontStyle,V.SizeStyle].reduce(function(t,e){return t[e.keyName]=e,t},{}),$=function(t){function e(t,n){i(this,e);var r=l(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));return r.quill.root.addEventListener("paste",r.onPaste.bind(r)),r.container=r.quill.addContainer("ql-clipboard"),r.container.setAttribute("contenteditable",!0),r.container.setAttribute("tabindex",-1),r.matchers=[],G.concat(r.options.matchers).forEach(function(t){var e=k(t,2),o=e[0],i=e[1];(n.matchVisual||i!==_)&&r.addMatcher(o,i)}),r}return a(e,t),E(e,[{key:"addMatcher",value:function(t,e){this.matchers.push([t,e])}},{key:"convert",value:function(t){if("string"==typeof t)return this.container.innerHTML=t.replace(/\>\r?\n +\</g,"><"),this.convert();var e=this.quill.getFormat(this.quill.selection.savedRange.index);if(e[F.default.blotName]){var n=this.container.innerText;return this.container.innerHTML="",(new q.default).insert(n,o({},F.default.blotName,e[F.default.blotName]))}var r=this.prepareMatching(),i=k(r,2),l=i[0],a=i[1],s=h(this.container,l,a);return c(s,"\n")&&null==s.ops[s.ops.length-1].attributes&&(s=s.compose((new q.default).retain(s.length()-1).delete(1))),Z.log("convert",this.container.innerHTML,s),this.container.innerHTML="",s}},{key:"dangerouslyPasteHTML",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:C.default.sources.API;if("string"==typeof t)this.quill.setContents(this.convert(t),e),this.quill.setSelection(0,C.default.sources.SILENT);else{var r=this.convert(e);this.quill.updateContents((new q.default).retain(t).concat(r),n),this.quill.setSelection(t+r.length(),C.default.sources.SILENT)}}},{key:"onPaste",value:function(t){var e=this;if(!t.defaultPrevented&&this.quill.isEnabled()){var n=this.quill.getSelection(),r=(new q.default).retain(n.index),o=this.quill.scrollingContainer.scrollTop;this.container.focus(),this.quill.selection.update(C.default.sources.SILENT),setTimeout(function(){r=r.concat(e.convert()).delete(n.length),e.quill.updateContents(r,C.default.sources.USER),e.quill.setSelection(r.length()-n.length,C.default.sources.SILENT),e.quill.scrollingContainer.scrollTop=o,e.quill.focus()},1)}}},{key:"prepareMatching",value:function(){var t=this,e=[],n=[];return this.matchers.forEach(function(r){var o=k(r,2),i=o[0],l=o[1];switch(i){case Node.TEXT_NODE:n.push(l);break;case Node.ELEMENT_NODE:e.push(l);break;default:[].forEach.call(t.container.querySelectorAll(i),function(t){t[W]=t[W]||[],t[W].push(l)})}}),[e,n]}}]),e}(I.default);$.DEFAULTS={matchers:[],matchVisual:!0},e.default=$,e.matchAttributor=d,e.matchBlot=y,e.matchNewline=m,e.matchSpacing=_,e.matchText=w},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t){var e=t.ops[t.ops.length-1];return null!=e&&(null!=e.insert?"string"==typeof e.insert&&e.insert.endsWith("\n"):null!=e.attributes&&Object.keys(e.attributes).some(function(t){return null!=f.default.query(t,f.default.Scope.BLOCK)}))}function s(t){var e=t.reduce(function(t,e){return t+=e.delete||0},0),n=t.length()-e;return a(t)&&(n-=1),n}Object.defineProperty(e,"__esModule",{value:!0}),e.getLastChangeIndex=e.default=void 0;var u=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),c=n(0),f=r(c),h=n(6),p=r(h),d=n(7),y=r(d),v=function(t){function e(t,n){o(this,e);var r=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));return r.lastRecorded=0,r.ignoreChange=!1,r.clear(),r.quill.on(p.default.events.EDITOR_CHANGE,function(t,e,n,o){t!==p.default.events.TEXT_CHANGE||r.ignoreChange||(r.options.userOnly&&o!==p.default.sources.USER?r.transform(e):r.record(e,n))}),r.quill.keyboard.addBinding({key:"Z",shortKey:!0},r.undo.bind(r)),r.quill.keyboard.addBinding({key:"Z",shortKey:!0,shiftKey:!0},r.redo.bind(r)),/Win/i.test(navigator.platform)&&r.quill.keyboard.addBinding({key:"Y",shortKey:!0},r.redo.bind(r)),r}return l(e,t),u(e,[{key:"change",value:function(t,e){if(0!==this.stack[t].length){var n=this.stack[t].pop();this.stack[e].push(n),this.lastRecorded=0,this.ignoreChange=!0,this.quill.updateContents(n[t],p.default.sources.USER),this.ignoreChange=!1;var r=s(n[t]);this.quill.setSelection(r)}}},{key:"clear",value:function(){this.stack={undo:[],redo:[]}}},{key:"cutoff",value:function(){this.lastRecorded=0}},{key:"record",value:function(t,e){if(0!==t.ops.length){this.stack.redo=[];var n=this.quill.getContents().diff(e),r=Date.now();if(this.lastRecorded+this.options.delay>r&&this.stack.undo.length>0){var o=this.stack.undo.pop();n=n.compose(o.undo),t=o.redo.compose(t)}else this.lastRecorded=r;this.stack.undo.push({redo:t,undo:n}),this.stack.undo.length>this.options.maxStack&&this.stack.undo.shift()}}},{key:"redo",value:function(){this.change("redo","undo")}},{key:"transform",value:function(t){this.stack.undo.forEach(function(e){e.undo=t.transform(e.undo,!0),e.redo=t.transform(e.redo,!0)}),this.stack.redo.forEach(function(e){e.undo=t.transform(e.undo,!0),e.redo=t.transform(e.redo,!0)})}},{key:"undo",value:function(){this.change("undo","redo")}}]),e}(y.default);v.DEFAULTS={delay:1e3,maxStack:100,userOnly:!1},e.default=v,e.getLastChangeIndex=s},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.IndentClass=void 0;var l=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),a=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},s=n(0),u=function(t){return t&&t.__esModule?t:{default:t}}(s),c=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),l(e,[{key:"add",value:function(t,n){if("+1"===n||"-1"===n){var r=this.value(t)||0;n="+1"===n?r+1:r-1}return 0===n?(this.remove(t),!0):a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"add",this).call(this,t,n)}},{key:"canAdd",value:function(t,n){return a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"canAdd",this).call(this,t,n)||a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"canAdd",this).call(this,t,parseInt(n))}},{key:"value",value:function(t){return parseInt(a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"value",this).call(this,t))||void 0}}]),e}(u.default.Attributor.Class),f=new c("indent","ql-indent",{scope:u.default.Scope.BLOCK,whitelist:[1,2,3,4,5,6,7,8]});e.IndentClass=f},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=n(3),a=function(t){return t&&t.__esModule?t:{default:t}}(l),s=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),e}(a.default);s.blotName="blockquote",s.tagName="blockquote",e.default=s},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),a=n(3),s=function(t){return t&&t.__esModule?t:{default:t}}(a),u=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),l(e,null,[{key:"formats",value:function(t){return this.tagName.indexOf(t.tagName)+1}}]),e}(s.default);u.blotName="header",u.tagName=["H1","H2","H3","H4","H5","H6"],e.default=u},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.ListItem=void 0;var s=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),u=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},c=n(0),f=r(c),h=n(3),p=r(h),d=n(23),y=r(d),v=function(t){function e(){return i(this,e),l(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return a(e,t),s(e,[{key:"format",value:function(t,n){t!==b.blotName||n?u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"format",this).call(this,t,n):this.replaceWith(f.default.create(this.statics.scope))}},{key:"remove",value:function(){null==this.prev&&null==this.next?this.parent.remove():u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"remove",this).call(this)}},{key:"replaceWith",value:function(t,n){return this.parent.isolate(this.offset(this.parent),this.length()),t===this.parent.statics.blotName?(this.parent.replaceWith(t,n),this):(this.parent.unwrap(),u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"replaceWith",this).call(this,t,n))}}],[{key:"formats",value:function(t){return t.tagName===this.tagName?void 0:u(e.__proto__||Object.getPrototypeOf(e),"formats",this).call(this,t)}}]),e}(p.default);v.blotName="list-item",v.tagName="LI";var b=function(t){function e(t){i(this,e);var n=l(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t)),r=function(e){if(e.target.parentNode===t){var r=n.statics.formats(t),o=f.default.find(e.target);"checked"===r?o.format("list","unchecked"):"unchecked"===r&&o.format("list","checked")}};return t.addEventListener("touchstart",r),t.addEventListener("mousedown",r),n}return a(e,t),s(e,null,[{key:"create",value:function(t){var n="ordered"===t?"OL":"UL",r=u(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,n);return"checked"!==t&&"unchecked"!==t||r.setAttribute("data-checked","checked"===t),r}},{key:"formats",value:function(t){return"OL"===t.tagName?"ordered":"UL"===t.tagName?t.hasAttribute("data-checked")?"true"===t.getAttribute("data-checked")?"checked":"unchecked":"bullet":void 0}}]),s(e,[{key:"format",value:function(t,e){this.children.length>0&&this.children.tail.format(t,e)}},{key:"formats",value:function(){return o({},this.statics.blotName,this.statics.formats(this.domNode))}},{key:"insertBefore",value:function(t,n){if(t instanceof v)u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertBefore",this).call(this,t,n);else{var r=null==n?this.length():n.offset(this),o=this.split(r);o.parent.insertBefore(t,o)}}},{key:"optimize",value:function(t){u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t);var n=this.next;null!=n&&n.prev===this&&n.statics.blotName===this.statics.blotName&&n.domNode.tagName===this.domNode.tagName&&n.domNode.getAttribute("data-checked")===this.domNode.getAttribute("data-checked")&&(n.moveChildren(this),n.remove())}},{key:"replace",value:function(t){if(t.statics.blotName!==this.statics.blotName){var n=f.default.create(this.statics.defaultChild);t.moveChildren(n),this.appendChild(n)}u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"replace",this).call(this,t)}}]),e}(y.default);b.blotName="list",b.scope=f.default.Scope.BLOCK_BLOT,b.tagName=["OL","UL"],b.defaultChild="list-item",b.allowedChildren=[v],e.ListItem=v,e.default=b},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=n(39),a=function(t){return t&&t.__esModule?t:{default:t}}(l),s=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),e}(a.default);s.blotName="italic",s.tagName=["EM","I"],e.default=s},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),a=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},s=n(5),u=function(t){return t&&t.__esModule?t:{default:t}}(s),c=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),l(e,null,[{key:"create",value:function(t){return"super"===t?document.createElement("sup"):"sub"===t?document.createElement("sub"):a(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t)}},{key:"formats",value:function(t){return"SUB"===t.tagName?"sub":"SUP"===t.tagName?"super":void 0}}]),e}(u.default);c.blotName="script",c.tagName=["SUB","SUP"],e.default=c},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=n(5),a=function(t){return t&&t.__esModule?t:{default:t}}(l),s=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),e}(a.default);s.blotName="strike",s.tagName="S",e.default=s},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=n(5),a=function(t){return t&&t.__esModule?t:{default:t}}(l),s=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),e}(a.default);s.blotName="underline",s.tagName="U",e.default=s},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),a=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},s=n(0),u=function(t){return t&&t.__esModule?t:{default:t}}(s),c=n(15),f=["alt","height","width"],h=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),l(e,[{key:"format",value:function(t,n){f.indexOf(t)>-1?n?this.domNode.setAttribute(t,n):this.domNode.removeAttribute(t):a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"format",this).call(this,t,n)}}],[{key:"create",value:function(t){var n=a(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return"string"==typeof t&&n.setAttribute("src",this.sanitize(t)),n}},{key:"formats",value:function(t){return f.reduce(function(e,n){return t.hasAttribute(n)&&(e[n]=t.getAttribute(n)),e},{})}},{key:"match",value:function(t){return/\.(jpe?g|gif|png)$/.test(t)||/^data:image\/.+;base64/.test(t)}},{key:"sanitize",value:function(t){return(0,c.sanitize)(t,["http","https","data"])?t:"//:0"}},{key:"value",value:function(t){return t.getAttribute("src")}}]),e}(u.default.Embed);h.blotName="image",h.tagName="IMG",e.default=h},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),a=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},s=n(3),u=n(15),c=function(t){return t&&t.__esModule?t:{default:t}}(u),f=["height","width"],h=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),l(e,[{key:"format",value:function(t,n){f.indexOf(t)>-1?n?this.domNode.setAttribute(t,n):this.domNode.removeAttribute(t):a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"format",this).call(this,t,n)}}],[{key:"create",value:function(t){var n=a(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return n.setAttribute("frameborder","0"),n.setAttribute("allowfullscreen",!0),n.setAttribute("src",this.sanitize(t)),n}},{key:"formats",value:function(t){return f.reduce(function(e,n){return t.hasAttribute(n)&&(e[n]=t.getAttribute(n)),e},{})}},{key:"sanitize",value:function(t){return c.default.sanitize(t)}},{key:"value",value:function(t){return t.getAttribute("src")}}]),e}(s.BlockEmbed);h.blotName="video",h.className="ql-video",h.tagName="IFRAME",e.default=h},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.FormulaBlot=void 0;var a=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),s=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},u=n(33),c=r(u),f=n(6),h=r(f),p=n(7),d=r(p),y=function(t){function e(){return o(this,e),i(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return l(e,t),a(e,null,[{key:"create",value:function(t){var n=s(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return"string"==typeof t&&(window.katex.render(t,n,{throwOnError:!1,errorColor:"#f00"}),n.setAttribute("data-value",t)),n}},{key:"value",value:function(t){return t.getAttribute("data-value")}}]),e}(c.default);y.blotName="formula",y.className="ql-formula",y.tagName="SPAN";var v=function(t){function e(){o(this,e);var t=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));if(null==window.katex)throw new Error("Formula module requires KaTeX.");return t}return l(e,t),a(e,null,[{key:"register",value:function(){h.default.register(y,!0)}}]),e}(d.default);e.FormulaBlot=y,e.default=v},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.CodeToken=e.CodeBlock=void 0;var a=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),s=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},u=n(0),c=r(u),f=n(6),h=r(f),p=n(7),d=r(p),y=n(13),v=r(y),b=function(t){function e(){return o(this,e),i(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return l(e,t),a(e,[{key:"replaceWith",value:function(t){this.domNode.textContent=this.domNode.textContent,this.attach(),s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"replaceWith",this).call(this,t)}},{key:"highlight",value:function(t){var e=this.domNode.textContent;this.cachedText!==e&&((e.trim().length>0||null==this.cachedText)&&(this.domNode.innerHTML=t(e),this.domNode.normalize(),this.attach()),this.cachedText=e)}}]),e}(v.default);b.className="ql-syntax";var g=new c.default.Attributor.Class("token","hljs",{scope:c.default.Scope.INLINE}),m=function(t){function e(t,n){o(this,e);var r=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));if("function"!=typeof r.options.highlight)throw new Error("Syntax module requires highlight.js. Please include the library on the page before Quill.");var l=null;return r.quill.on(h.default.events.SCROLL_OPTIMIZE,function(){clearTimeout(l),l=setTimeout(function(){r.highlight(),l=null},r.options.interval)}),r.highlight(),r}return l(e,t),a(e,null,[{key:"register",value:function(){h.default.register(g,!0),h.default.register(b,!0)}}]),a(e,[{key:"highlight",value:function(){var t=this;if(!this.quill.selection.composing){this.quill.update(h.default.sources.USER);var e=this.quill.getSelection();this.quill.scroll.descendants(b).forEach(function(e){e.highlight(t.options.highlight)}),this.quill.update(h.default.sources.SILENT),null!=e&&this.quill.setSelection(e,h.default.sources.SILENT)}}}]),e}(d.default);m.DEFAULTS={highlight:function(){return null==window.hljs?null:function(t){return window.hljs.highlightAuto(t).value}}(),interval:1e3},e.CodeBlock=b,e.CodeToken=g,e.default=m},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e,n){var r=document.createElement("button");r.setAttribute("type","button"),r.classList.add("ql-"+e),null!=n&&(r.value=n),t.appendChild(r)}function u(t,e){Array.isArray(e[0])||(e=[e]),e.forEach(function(e){var n=document.createElement("span");n.classList.add("ql-formats"),e.forEach(function(t){if("string"==typeof t)s(n,t);else{var e=Object.keys(t)[0],r=t[e];Array.isArray(r)?c(n,e,r):s(n,e,r)}}),t.appendChild(n)})}function c(t,e,n){var r=document.createElement("select");r.classList.add("ql-"+e),n.forEach(function(t){var e=document.createElement("option");!1!==t?e.setAttribute("value",t):e.setAttribute("selected","selected"),r.appendChild(e)}),t.appendChild(r)}Object.defineProperty(e,"__esModule",{value:!0}),e.addControls=e.default=void 0;var f=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),h=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),p=n(4),d=r(p),y=n(0),v=r(y),b=n(6),g=r(b),m=n(10),_=r(m),O=n(7),w=r(O),x=(0,_.default)("quill:toolbar"),k=function(t){function e(t,n){i(this,e);var r=l(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));if(Array.isArray(r.options.container)){var o=document.createElement("div");u(o,r.options.container),t.container.parentNode.insertBefore(o,t.container),r.container=o}else"string"==typeof r.options.container?r.container=document.querySelector(r.options.container):r.container=r.options.container;if(!(r.container instanceof HTMLElement)){var a;return a=x.error("Container required for toolbar",r.options),l(r,a)}return r.container.classList.add("ql-toolbar"),r.controls=[],r.handlers={},Object.keys(r.options.handlers).forEach(function(t){r.addHandler(t,r.options.handlers[t])}),[].forEach.call(r.container.querySelectorAll("button, select"),function(t){r.attach(t)}),r.quill.on(g.default.events.EDITOR_CHANGE,function(t,e){t===g.default.events.SELECTION_CHANGE&&r.update(e)}),r.quill.on(g.default.events.SCROLL_OPTIMIZE,function(){var t=r.quill.selection.getRange(),e=f(t,1),n=e[0];r.update(n)}),r}return a(e,t),h(e,[{key:"addHandler",value:function(t,e){this.handlers[t]=e}},{key:"attach",value:function(t){var e=this,n=[].find.call(t.classList,function(t){return 0===t.indexOf("ql-")});if(n){if(n=n.slice("ql-".length),"BUTTON"===t.tagName&&t.setAttribute("type","button"),null==this.handlers[n]){if(null!=this.quill.scroll.whitelist&&null==this.quill.scroll.whitelist[n])return void x.warn("ignoring attaching to disabled format",n,t);if(null==v.default.query(n))return void x.warn("ignoring attaching to nonexistent format",n,t)}var r="SELECT"===t.tagName?"change":"click";t.addEventListener(r,function(r){var i=void 0;if("SELECT"===t.tagName){if(t.selectedIndex<0)return;var l=t.options[t.selectedIndex];i=!l.hasAttribute("selected")&&(l.value||!1)}else i=!t.classList.contains("ql-active")&&(t.value||!t.hasAttribute("value")),r.preventDefault();e.quill.focus();var a=e.quill.selection.getRange(),s=f(a,1),u=s[0];if(null!=e.handlers[n])e.handlers[n].call(e,i);else if(v.default.query(n).prototype instanceof v.default.Embed){if(!(i=prompt("Enter "+n)))return;e.quill.updateContents((new d.default).retain(u.index).delete(u.length).insert(o({},n,i)),g.default.sources.USER)}else e.quill.format(n,i,g.default.sources.USER);e.update(u)}),this.controls.push([n,t])}}},{key:"update",value:function(t){var e=null==t?{}:this.quill.getFormat(t);this.controls.forEach(function(n){var r=f(n,2),o=r[0],i=r[1];if("SELECT"===i.tagName){var l=void 0;if(null==t)l=null;else if(null==e[o])l=i.querySelector("option[selected]");else if(!Array.isArray(e[o])){var a=e[o];"string"==typeof a&&(a=a.replace(/\"/g,'\\"')),l=i.querySelector('option[value="'+a+'"]')}null==l?(i.value="",i.selectedIndex=-1):l.selected=!0}else if(null==t)i.classList.remove("ql-active");else if(i.hasAttribute("value")){var s=e[o]===i.getAttribute("value")||null!=e[o]&&e[o].toString()===i.getAttribute("value")||null==e[o]&&!i.getAttribute("value");i.classList.toggle("ql-active",s)}else i.classList.toggle("ql-active",null!=e[o])})}}]),e}(w.default);k.DEFAULTS={},k.DEFAULTS={container:null,handlers:{clean:function(){var t=this,e=this.quill.getSelection();if(null!=e)if(0==e.length){var n=this.quill.getFormat();Object.keys(n).forEach(function(e){null!=v.default.query(e,v.default.Scope.INLINE)&&t.quill.format(e,!1)})}else this.quill.removeFormat(e,g.default.sources.USER)},direction:function(t){var e=this.quill.getFormat().align;"rtl"===t&&null==e?this.quill.format("align","right",g.default.sources.USER):t||"right"!==e||this.quill.format("align",!1,g.default.sources.USER),this.quill.format("direction",t,g.default.sources.USER)},indent:function(t){var e=this.quill.getSelection(),n=this.quill.getFormat(e),r=parseInt(n.indent||0);if("+1"===t||"-1"===t){var o="+1"===t?1:-1;"rtl"===n.direction&&(o*=-1),this.quill.format("indent",r+o,g.default.sources.USER)}},link:function(t){!0===t&&(t=prompt("Enter link URL:")),this.quill.format("link",t,g.default.sources.USER)},list:function(t){var e=this.quill.getSelection(),n=this.quill.getFormat(e);"check"===t?"checked"===n.list||"unchecked"===n.list?this.quill.format("list",!1,g.default.sources.USER):this.quill.format("list","unchecked",g.default.sources.USER):this.quill.format("list",t,g.default.sources.USER)}}},e.default=k,e.addControls=u},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <line class=ql-stroke x1=3 x2=15 y1=9 y2=9></line> <line class=ql-stroke x1=3 x2=13 y1=14 y2=14></line> <line class=ql-stroke x1=3 x2=9 y1=4 y2=4></line> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <line class=ql-stroke x1=15 x2=3 y1=9 y2=9></line> <line class=ql-stroke x1=14 x2=4 y1=14 y2=14></line> <line class=ql-stroke x1=12 x2=6 y1=4 y2=4></line> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <line class=ql-stroke x1=15 x2=3 y1=9 y2=9></line> <line class=ql-stroke x1=15 x2=5 y1=14 y2=14></line> <line class=ql-stroke x1=15 x2=9 y1=4 y2=4></line> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <line class=ql-stroke x1=15 x2=3 y1=9 y2=9></line> <line class=ql-stroke x1=15 x2=3 y1=14 y2=14></line> <line class=ql-stroke x1=15 x2=3 y1=4 y2=4></line> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <g class="ql-fill ql-color-label"> <polygon points="6 6.868 6 6 5 6 5 7 5.942 7 6 6.868"></polygon> <rect height=1 width=1 x=4 y=4></rect> <polygon points="6.817 5 6 5 6 6 6.38 6 6.817 5"></polygon> <rect height=1 width=1 x=2 y=6></rect> <rect height=1 width=1 x=3 y=5></rect> <rect height=1 width=1 x=4 y=7></rect> <polygon points="4 11.439 4 11 3 11 3 12 3.755 12 4 11.439"></polygon> <rect height=1 width=1 x=2 y=12></rect> <rect height=1 width=1 x=2 y=9></rect> <rect height=1 width=1 x=2 y=15></rect> <polygon points="4.63 10 4 10 4 11 4.192 11 4.63 10"></polygon> <rect height=1 width=1 x=3 y=8></rect> <path d=M10.832,4.2L11,4.582V4H10.708A1.948,1.948,0,0,1,10.832,4.2Z></path> <path d=M7,4.582L7.168,4.2A1.929,1.929,0,0,1,7.292,4H7V4.582Z></path> <path d=M8,13H7.683l-0.351.8a1.933,1.933,0,0,1-.124.2H8V13Z></path> <rect height=1 width=1 x=12 y=2></rect> <rect height=1 width=1 x=11 y=3></rect> <path d=M9,3H8V3.282A1.985,1.985,0,0,1,9,3Z></path> <rect height=1 width=1 x=2 y=3></rect> <rect height=1 width=1 x=6 y=2></rect> <rect height=1 width=1 x=3 y=2></rect> <rect height=1 width=1 x=5 y=3></rect> <rect height=1 width=1 x=9 y=2></rect> <rect height=1 width=1 x=15 y=14></rect> <polygon points="13.447 10.174 13.469 10.225 13.472 10.232 13.808 11 14 11 14 10 13.37 10 13.447 10.174"></polygon> <rect height=1 width=1 x=13 y=7></rect> <rect height=1 width=1 x=15 y=5></rect> <rect height=1 width=1 x=14 y=6></rect> <rect height=1 width=1 x=15 y=8></rect> <rect height=1 width=1 x=14 y=9></rect> <path d=M3.775,14H3v1H4V14.314A1.97,1.97,0,0,1,3.775,14Z></path> <rect height=1 width=1 x=14 y=3></rect> <polygon points="12 6.868 12 6 11.62 6 12 6.868"></polygon> <rect height=1 width=1 x=15 y=2></rect> <rect height=1 width=1 x=12 y=5></rect> <rect height=1 width=1 x=13 y=4></rect> <polygon points="12.933 9 13 9 13 8 12.495 8 12.933 9"></polygon> <rect height=1 width=1 x=9 y=14></rect> <rect height=1 width=1 x=8 y=15></rect> <path d=M6,14.926V15H7V14.316A1.993,1.993,0,0,1,6,14.926Z></path> <rect height=1 width=1 x=5 y=15></rect> <path d=M10.668,13.8L10.317,13H10v1h0.792A1.947,1.947,0,0,1,10.668,13.8Z></path> <rect height=1 width=1 x=11 y=15></rect> <path d=M14.332,12.2a1.99,1.99,0,0,1,.166.8H15V12H14.245Z></path> <rect height=1 width=1 x=14 y=15></rect> <rect height=1 width=1 x=15 y=11></rect> </g> <polyline class=ql-stroke points="5.5 13 9 5 12.5 13"></polyline> <line class=ql-stroke x1=11.63 x2=6.38 y1=11 y2=11></line> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <rect class="ql-fill ql-stroke" height=3 width=3 x=4 y=5></rect> <rect class="ql-fill ql-stroke" height=3 width=3 x=11 y=5></rect> <path class="ql-even ql-fill ql-stroke" d=M7,8c0,4.031-3,5-3,5></path> <path class="ql-even ql-fill ql-stroke" d=M14,8c0,4.031-3,5-3,5></path> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <path class=ql-stroke d=M5,4H9.5A2.5,2.5,0,0,1,12,6.5v0A2.5,2.5,0,0,1,9.5,9H5A0,0,0,0,1,5,9V4A0,0,0,0,1,5,4Z></path> <path class=ql-stroke d=M5,9h5.5A2.5,2.5,0,0,1,13,11.5v0A2.5,2.5,0,0,1,10.5,14H5a0,0,0,0,1,0,0V9A0,0,0,0,1,5,9Z></path> </svg>'},function(t,e){t.exports='<svg class="" viewbox="0 0 18 18"> <line class=ql-stroke x1=5 x2=13 y1=3 y2=3></line> <line class=ql-stroke x1=6 x2=9.35 y1=12 y2=3></line> <line class=ql-stroke x1=11 x2=15 y1=11 y2=15></line> <line class=ql-stroke x1=15 x2=11 y1=11 y2=15></line> <rect class=ql-fill height=1 rx=0.5 ry=0.5 width=7 x=2 y=14></rect> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <line class="ql-color-label ql-stroke ql-transparent" x1=3 x2=15 y1=15 y2=15></line> <polyline class=ql-stroke points="5.5 11 9 3 12.5 11"></polyline> <line class=ql-stroke x1=11.63 x2=6.38 y1=9 y2=9></line> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <polygon class="ql-stroke ql-fill" points="3 11 5 9 3 7 3 11"></polygon> <line class="ql-stroke ql-fill" x1=15 x2=11 y1=4 y2=4></line> <path class=ql-fill d=M11,3a3,3,0,0,0,0,6h1V3H11Z></path> <rect class=ql-fill height=11 width=1 x=11 y=4></rect> <rect class=ql-fill height=11 width=1 x=13 y=4></rect> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <polygon class="ql-stroke ql-fill" points="15 12 13 10 15 8 15 12"></polygon> <line class="ql-stroke ql-fill" x1=9 x2=5 y1=4 y2=4></line> <path class=ql-fill d=M5,3A3,3,0,0,0,5,9H6V3H5Z></path> <rect class=ql-fill height=11 width=1 x=5 y=4></rect> <rect class=ql-fill height=11 width=1 x=7 y=4></rect> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <path class=ql-fill d=M14,16H4a1,1,0,0,1,0-2H14A1,1,0,0,1,14,16Z /> <path class=ql-fill d=M14,4H4A1,1,0,0,1,4,2H14A1,1,0,0,1,14,4Z /> <rect class=ql-fill x=3 y=6 width=12 height=6 rx=1 ry=1 /> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <path class=ql-fill d=M13,16H5a1,1,0,0,1,0-2h8A1,1,0,0,1,13,16Z /> <path class=ql-fill d=M13,4H5A1,1,0,0,1,5,2h8A1,1,0,0,1,13,4Z /> <rect class=ql-fill x=2 y=6 width=14 height=6 rx=1 ry=1 /> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <path class=ql-fill d=M15,8H13a1,1,0,0,1,0-2h2A1,1,0,0,1,15,8Z /> <path class=ql-fill d=M15,12H13a1,1,0,0,1,0-2h2A1,1,0,0,1,15,12Z /> <path class=ql-fill d=M15,16H5a1,1,0,0,1,0-2H15A1,1,0,0,1,15,16Z /> <path class=ql-fill d=M15,4H5A1,1,0,0,1,5,2H15A1,1,0,0,1,15,4Z /> <rect class=ql-fill x=2 y=6 width=8 height=6 rx=1 ry=1 /> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <path class=ql-fill d=M5,8H3A1,1,0,0,1,3,6H5A1,1,0,0,1,5,8Z /> <path class=ql-fill d=M5,12H3a1,1,0,0,1,0-2H5A1,1,0,0,1,5,12Z /> <path class=ql-fill d=M13,16H3a1,1,0,0,1,0-2H13A1,1,0,0,1,13,16Z /> <path class=ql-fill d=M13,4H3A1,1,0,0,1,3,2H13A1,1,0,0,1,13,4Z /> <rect class=ql-fill x=8 y=6 width=8 height=6 rx=1 ry=1 transform="translate(24 18) rotate(-180)"/> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <path class=ql-fill d=M11.759,2.482a2.561,2.561,0,0,0-3.53.607A7.656,7.656,0,0,0,6.8,6.2C6.109,9.188,5.275,14.677,4.15,14.927a1.545,1.545,0,0,0-1.3-.933A0.922,0.922,0,0,0,2,15.036S1.954,16,4.119,16s3.091-2.691,3.7-5.553c0.177-.826.36-1.726,0.554-2.6L8.775,6.2c0.381-1.421.807-2.521,1.306-2.676a1.014,1.014,0,0,0,1.02.56A0.966,0.966,0,0,0,11.759,2.482Z></path> <rect class=ql-fill height=1.6 rx=0.8 ry=0.8 width=5 x=5.15 y=6.2></rect> <path class=ql-fill d=M13.663,12.027a1.662,1.662,0,0,1,.266-0.276q0.193,0.069.456,0.138a2.1,2.1,0,0,0,.535.069,1.075,1.075,0,0,0,.767-0.3,1.044,1.044,0,0,0,.314-0.8,0.84,0.84,0,0,0-.238-0.619,0.8,0.8,0,0,0-.594-0.239,1.154,1.154,0,0,0-.781.3,4.607,4.607,0,0,0-.781,1q-0.091.15-.218,0.346l-0.246.38c-0.068-.288-0.137-0.582-0.212-0.885-0.459-1.847-2.494-.984-2.941-0.8-0.482.2-.353,0.647-0.094,0.529a0.869,0.869,0,0,1,1.281.585c0.217,0.751.377,1.436,0.527,2.038a5.688,5.688,0,0,1-.362.467,2.69,2.69,0,0,1-.264.271q-0.221-.08-0.471-0.147a2.029,2.029,0,0,0-.522-0.066,1.079,1.079,0,0,0-.768.3A1.058,1.058,0,0,0,9,15.131a0.82,0.82,0,0,0,.832.852,1.134,1.134,0,0,0,.787-0.3,5.11,5.11,0,0,0,.776-0.993q0.141-.219.215-0.34c0.046-.076.122-0.194,0.223-0.346a2.786,2.786,0,0,0,.918,1.726,2.582,2.582,0,0,0,2.376-.185c0.317-.181.212-0.565,0-0.494A0.807,0.807,0,0,1,14.176,15a5.159,5.159,0,0,1-.913-2.446l0,0Q13.487,12.24,13.663,12.027Z></path> </svg>'},function(t,e){t.exports='<svg viewBox="0 0 18 18"> <path class=ql-fill d=M10,4V14a1,1,0,0,1-2,0V10H3v4a1,1,0,0,1-2,0V4A1,1,0,0,1,3,4V8H8V4a1,1,0,0,1,2,0Zm6.06787,9.209H14.98975V7.59863a.54085.54085,0,0,0-.605-.60547h-.62744a1.01119,1.01119,0,0,0-.748.29688L11.645,8.56641a.5435.5435,0,0,0-.022.8584l.28613.30762a.53861.53861,0,0,0,.84717.0332l.09912-.08789a1.2137,1.2137,0,0,0,.2417-.35254h.02246s-.01123.30859-.01123.60547V13.209H12.041a.54085.54085,0,0,0-.605.60547v.43945a.54085.54085,0,0,0,.605.60547h4.02686a.54085.54085,0,0,0,.605-.60547v-.43945A.54085.54085,0,0,0,16.06787,13.209Z /> </svg>'},function(t,e){t.exports='<svg viewBox="0 0 18 18"> <path class=ql-fill d=M16.73975,13.81445v.43945a.54085.54085,0,0,1-.605.60547H11.855a.58392.58392,0,0,1-.64893-.60547V14.0127c0-2.90527,3.39941-3.42187,3.39941-4.55469a.77675.77675,0,0,0-.84717-.78125,1.17684,1.17684,0,0,0-.83594.38477c-.2749.26367-.561.374-.85791.13184l-.4292-.34082c-.30811-.24219-.38525-.51758-.1543-.81445a2.97155,2.97155,0,0,1,2.45361-1.17676,2.45393,2.45393,0,0,1,2.68408,2.40918c0,2.45312-3.1792,2.92676-3.27832,3.93848h2.79443A.54085.54085,0,0,1,16.73975,13.81445ZM9,3A.99974.99974,0,0,0,8,4V8H3V4A1,1,0,0,0,1,4V14a1,1,0,0,0,2,0V10H8v4a1,1,0,0,0,2,0V4A.99974.99974,0,0,0,9,3Z /> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <line class=ql-stroke x1=7 x2=13 y1=4 y2=4></line> <line class=ql-stroke x1=5 x2=11 y1=14 y2=14></line> <line class=ql-stroke x1=8 x2=10 y1=14 y2=4></line> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <rect class=ql-stroke height=10 width=12 x=3 y=4></rect> <circle class=ql-fill cx=6 cy=7 r=1></circle> <polyline class="ql-even ql-fill" points="5 12 5 11 7 9 8 10 11 7 13 9 13 12 5 12"></polyline> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <line class=ql-stroke x1=3 x2=15 y1=14 y2=14></line> <line class=ql-stroke x1=3 x2=15 y1=4 y2=4></line> <line class=ql-stroke x1=9 x2=15 y1=9 y2=9></line> <polyline class="ql-fill ql-stroke" points="3 7 3 11 5 9 3 7"></polyline> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <line class=ql-stroke x1=3 x2=15 y1=14 y2=14></line> <line class=ql-stroke x1=3 x2=15 y1=4 y2=4></line> <line class=ql-stroke x1=9 x2=15 y1=9 y2=9></line> <polyline class=ql-stroke points="5 7 5 11 3 9 5 7"></polyline> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <line class=ql-stroke x1=7 x2=11 y1=7 y2=11></line> <path class="ql-even ql-stroke" d=M8.9,4.577a3.476,3.476,0,0,1,.36,4.679A3.476,3.476,0,0,1,4.577,8.9C3.185,7.5,2.035,6.4,4.217,4.217S7.5,3.185,8.9,4.577Z></path> <path class="ql-even ql-stroke" d=M13.423,9.1a3.476,3.476,0,0,0-4.679-.36,3.476,3.476,0,0,0,.36,4.679c1.392,1.392,2.5,2.542,4.679.36S14.815,10.5,13.423,9.1Z></path> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <line class=ql-stroke x1=7 x2=15 y1=4 y2=4></line> <line class=ql-stroke x1=7 x2=15 y1=9 y2=9></line> <line class=ql-stroke x1=7 x2=15 y1=14 y2=14></line> <line class="ql-stroke ql-thin" x1=2.5 x2=4.5 y1=5.5 y2=5.5></line> <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> <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> <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></path> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <line class=ql-stroke x1=6 x2=15 y1=4 y2=4></line> <line class=ql-stroke x1=6 x2=15 y1=9 y2=9></line> <line class=ql-stroke x1=6 x2=15 y1=14 y2=14></line> <line class=ql-stroke x1=3 x2=3 y1=4 y2=4></line> <line class=ql-stroke x1=3 x2=3 y1=9 y2=9></line> <line class=ql-stroke x1=3 x2=3 y1=14 y2=14></line> </svg>'},function(t,e){t.exports='<svg class="" viewbox="0 0 18 18"> <line class=ql-stroke x1=9 x2=15 y1=4 y2=4></line> <polyline class=ql-stroke points="3 4 4 5 6 3"></polyline> <line class=ql-stroke x1=9 x2=15 y1=14 y2=14></line> <polyline class=ql-stroke points="3 14 4 15 6 13"></polyline> <line class=ql-stroke x1=9 x2=15 y1=9 y2=9></line> <polyline class=ql-stroke points="3 9 4 10 6 8"></polyline> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <path class=ql-fill d=M15.5,15H13.861a3.858,3.858,0,0,0,1.914-2.975,1.8,1.8,0,0,0-1.6-1.751A1.921,1.921,0,0,0,12.021,11.7a0.50013,0.50013,0,1,0,.957.291h0a0.914,0.914,0,0,1,1.053-.725,0.81,0.81,0,0,1,.744.762c0,1.076-1.16971,1.86982-1.93971,2.43082A1.45639,1.45639,0,0,0,12,15.5a0.5,0.5,0,0,0,.5.5h3A0.5,0.5,0,0,0,15.5,15Z /> <path class=ql-fill d=M9.65,5.241a1,1,0,0,0-1.409.108L6,7.964,3.759,5.349A1,1,0,0,0,2.192,6.59178Q2.21541,6.6213,2.241,6.649L4.684,9.5,2.241,12.35A1,1,0,0,0,3.71,13.70722q0.02557-.02768.049-0.05722L6,11.036,8.241,13.65a1,1,0,1,0,1.567-1.24277Q9.78459,12.3777,9.759,12.35L7.316,9.5,9.759,6.651A1,1,0,0,0,9.65,5.241Z /> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <path class=ql-fill d=M15.5,7H13.861a4.015,4.015,0,0,0,1.914-2.975,1.8,1.8,0,0,0-1.6-1.751A1.922,1.922,0,0,0,12.021,3.7a0.5,0.5,0,1,0,.957.291,0.917,0.917,0,0,1,1.053-.725,0.81,0.81,0,0,1,.744.762c0,1.077-1.164,1.925-1.934,2.486A1.423,1.423,0,0,0,12,7.5a0.5,0.5,0,0,0,.5.5h3A0.5,0.5,0,0,0,15.5,7Z /> <path class=ql-fill d=M9.651,5.241a1,1,0,0,0-1.41.108L6,7.964,3.759,5.349a1,1,0,1,0-1.519,1.3L4.683,9.5,2.241,12.35a1,1,0,1,0,1.519,1.3L6,11.036,8.241,13.65a1,1,0,0,0,1.519-1.3L7.317,9.5,9.759,6.651A1,1,0,0,0,9.651,5.241Z /> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <line class="ql-stroke ql-thin" x1=15.5 x2=2.5 y1=8.5 y2=9.5></line> <path class=ql-fill d=M9.007,8C6.542,7.791,6,7.519,6,6.5,6,5.792,7.283,5,9,5c1.571,0,2.765.679,2.969,1.309a1,1,0,0,0,1.9-.617C13.356,4.106,11.354,3,9,3,6.2,3,4,4.538,4,6.5a3.2,3.2,0,0,0,.5,1.843Z></path> <path class=ql-fill d=M8.984,10C11.457,10.208,12,10.479,12,11.5c0,0.708-1.283,1.5-3,1.5-1.571,0-2.765-.679-2.969-1.309a1,1,0,1,0-1.9.617C4.644,13.894,6.646,15,9,15c2.8,0,5-1.538,5-3.5a3.2,3.2,0,0,0-.5-1.843Z></path> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <path class=ql-stroke d=M5,3V9a4.012,4.012,0,0,0,4,4H9a4.012,4.012,0,0,0,4-4V3></path> <rect class=ql-fill height=1 rx=0.5 ry=0.5 width=12 x=3 y=15></rect> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <rect class=ql-stroke height=12 width=12 x=3 y=3></rect> <rect class=ql-fill height=12 width=1 x=5 y=3></rect> <rect class=ql-fill height=12 width=1 x=12 y=3></rect> <rect class=ql-fill height=2 width=8 x=5 y=8></rect> <rect class=ql-fill height=1 width=3 x=3 y=5></rect> <rect class=ql-fill height=1 width=3 x=3 y=7></rect> <rect class=ql-fill height=1 width=3 x=3 y=10></rect> <rect class=ql-fill height=1 width=3 x=3 y=12></rect> <rect class=ql-fill height=1 width=3 x=12 y=5></rect> <rect class=ql-fill height=1 width=3 x=12 y=7></rect> <rect class=ql-fill height=1 width=3 x=12 y=10></rect> <rect class=ql-fill height=1 width=3 x=12 y=12></rect> </svg>'},function(t,e){t.exports='<svg viewbox="0 0 18 18"> <polygon class=ql-stroke points="7 11 9 13 11 11 7 11"></polygon> <polygon class=ql-stroke points="7 7 9 5 11 7 7 7"></polygon> </svg>'},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BubbleTooltip=void 0;var a=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},s=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),u=n(2),c=r(u),f=n(9),h=r(f),p=n(44),d=r(p),y=n(22),v=n(26),b=r(v),g=[["bold","italic","link"],[{header:1},{header:2},"blockquote"]],m=function(t){function e(t,n){o(this,e),null!=n.modules.toolbar&&null==n.modules.toolbar.container&&(n.modules.toolbar.container=g);var r=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));return r.quill.container.classList.add("ql-bubble"),r}return l(e,t),s(e,[{key:"extendToolbar",value:function(t){this.tooltip=new _(this.quill,this.options.bounds),this.tooltip.root.appendChild(t.container),this.buildButtons([].slice.call(t.container.querySelectorAll("button")),b.default),this.buildPickers([].slice.call(t.container.querySelectorAll("select")),b.default)}}]),e}(d.default);m.DEFAULTS=(0,c.default)(!0,{},d.default.DEFAULTS,{modules:{toolbar:{handlers:{link:function(t){t?this.quill.theme.tooltip.edit():this.quill.format("link",!1)}}}}});var _=function(t){function e(t,n){o(this,e);var r=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));return r.quill.on(h.default.events.EDITOR_CHANGE,function(t,e,n,o){if(t===h.default.events.SELECTION_CHANGE)if(null!=e&&e.length>0&&o===h.default.sources.USER){r.show(),r.root.style.left="0px",r.root.style.width="",r.root.style.width=r.root.offsetWidth+"px";var i=r.quill.getLines(e.index,e.length);if(1===i.length)r.position(r.quill.getBounds(e));else{var l=i[i.length-1],a=r.quill.getIndex(l),s=Math.min(l.length()-1,e.index+e.length-a),u=r.quill.getBounds(new y.Range(a,s));r.position(u)}}else document.activeElement!==r.textbox&&r.quill.hasFocus()&&r.hide()}),r}return l(e,t),s(e,[{key:"listen",value:function(){var t=this;a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"listen",this).call(this),this.root.querySelector(".ql-close").addEventListener("click",function(){t.root.classList.remove("ql-editing")}),this.quill.on(h.default.events.SCROLL_OPTIMIZE,function(){setTimeout(function(){if(!t.root.classList.contains("ql-hidden")){var e=t.quill.getSelection();null!=e&&t.position(t.quill.getBounds(e))}},1)})}},{key:"cancel",value:function(){this.show()}},{key:"position",value:function(t){var n=a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"position",this).call(this,t),r=this.root.querySelector(".ql-tooltip-arrow");if(r.style.marginLeft="",0===n)return n;r.style.marginLeft=-1*n-r.offsetWidth/2+"px"}}]),e}(p.BaseTooltip);_.TEMPLATE=['<span class="ql-tooltip-arrow"></span>','<div class="ql-tooltip-editor">','<input type="text" data-formula="e=mc^2" data-link="https://quilljs.com" data-video="Embed URL">','<a class="ql-close"></a>',"</div>"].join(""),e.BubbleTooltip=_,e.default=m},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},u=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),c=n(2),f=r(c),h=n(9),p=r(h),d=n(44),y=r(d),v=n(15),b=r(v),g=n(22),m=n(26),_=r(m),O=[[{header:["1","2","3",!1]}],["bold","italic","underline","link"],[{list:"ordered"},{list:"bullet"}],["clean"]],w=function(t){function e(t,n){o(this,e),null!=n.modules.toolbar&&null==n.modules.toolbar.container&&(n.modules.toolbar.container=O);var r=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));return r.quill.container.classList.add("ql-snow"),r}return l(e,t),u(e,[{key:"extendToolbar",value:function(t){t.container.classList.add("ql-snow"),this.buildButtons([].slice.call(t.container.querySelectorAll("button")),_.default),this.buildPickers([].slice.call(t.container.querySelectorAll("select")),_.default),this.tooltip=new x(this.quill,this.options.bounds),t.container.querySelector(".ql-link")&&this.quill.keyboard.addBinding({key:"K",shortKey:!0},function(e,n){t.handlers.link.call(t,!n.format.link)})}}]),e}(y.default);w.DEFAULTS=(0,f.default)(!0,{},y.default.DEFAULTS,{modules:{toolbar:{handlers:{link:function(t){if(t){var e=this.quill.getSelection();if(null==e||0==e.length)return;var n=this.quill.getText(e);/^\S+@\S+\.\S+$/.test(n)&&0!==n.indexOf("mailto:")&&(n="mailto:"+n);this.quill.theme.tooltip.edit("link",n)}else this.quill.format("link",!1)}}}}});var x=function(t){function e(t,n){o(this,e);var r=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));return r.preview=r.root.querySelector("a.ql-preview"),r}return l(e,t),u(e,[{key:"listen",value:function(){var t=this;s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"listen",this).call(this),this.root.querySelector("a.ql-action").addEventListener("click",function(e){t.root.classList.contains("ql-editing")?t.save():t.edit("link",t.preview.textContent),e.preventDefault()}),this.root.querySelector("a.ql-remove").addEventListener("click",function(e){if(null!=t.linkRange){var n=t.linkRange;t.restoreFocus(),t.quill.formatText(n,"link",!1,p.default.sources.USER),delete t.linkRange}e.preventDefault(),t.hide()}),this.quill.on(p.default.events.SELECTION_CHANGE,function(e,n,r){if(null!=e){if(0===e.length&&r===p.default.sources.USER){var o=t.quill.scroll.descendant(b.default,e.index),i=a(o,2),l=i[0],s=i[1];if(null!=l){t.linkRange=new g.Range(e.index-s,l.length());var u=b.default.formats(l.domNode);return t.preview.textContent=u,t.preview.setAttribute("href",u),t.show(),void t.position(t.quill.getBounds(t.linkRange))}}else delete t.linkRange;t.hide()}})}},{key:"show",value:function(){s(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"show",this).call(this),this.root.removeAttribute("data-mode")}}]),e}(d.BaseTooltip);x.TEMPLATE=['<a class="ql-preview" rel="noopener noreferrer" target="_blank" href="about:blank"></a>','<input type="text" data-formula="e=mc^2" data-link="https://quilljs.com" data-video="Embed URL">','<a class="ql-action"></a>','<a class="ql-remove"></a>'].join(""),e.default=w}]).default});
+//# sourceMappingURL=quill.min.js.map
\ No newline at end of file
diff --git a/uni_modules/sp-editor/utils/index.js b/uni_modules/sp-editor/utils/index.js
new file mode 100644
index 0000000..733b600
--- /dev/null
+++ b/uni_modules/sp-editor/utils/index.js
@@ -0,0 +1,132 @@
+// 鏍囪瘑蹇呴』鐙竴鏃犱簩 - 鏍囪瘑鏄负浜嗕娇鐢╥nsertText鎻掑叆鏍囪瘑鏂囨湰鍚庯紝鏌ユ壘鍒版爣璇嗘墍鍦╠elta浣嶇疆鐨勭储寮�
+export const linkFlag = '#-*=*-*=*-*=*@-link瓒呴摼鎺ユ爣璇唋ink-@*=*-*=*-*=*-#'
+
+export function addLink(editorCtx, attr, callback) {
+	// 鍏堟彃鍏ヤ竴娈垫枃鏈唴瀹�
+	editorCtx.insertText({
+		text: linkFlag
+	})
+	// 鑾峰彇鍏ㄦ枃delta鍐呭
+	editorCtx.getContents({
+		success(res) {
+			let options = res.delta.ops
+			const findex = options.findIndex(item => {
+				return item.insert && typeof item.insert !== 'object' && item.insert?.indexOf(linkFlag) !== -1
+			})
+			// 鏍规嵁鏍囪瘑鏌ユ壘鍒版彃鍏ョ殑浣嶇疆
+			if (findex > -1) {
+				const findOption = options[findex]
+				const findAttributes = findOption.attributes
+				// 灏嗚findOption鍒嗘垚涓夐儴鍒嗭細鍓嶅唴瀹� 瑕佹彃鍏ョ殑link 鍚庡唴瀹�
+				const [prefix, suffix] = findOption.insert.split(linkFlag);
+				const handleOps = []
+				// 鍓嶅唴瀹�
+				if (prefix) {
+					const prefixOps = findAttributes ? {
+						insert: prefix,
+						attributes: findAttributes
+					} : {
+						insert: prefix
+					}
+					handleOps.push(prefixOps)
+				}
+				// 鎻掑叆鐨刲ink
+				const linkOps = {
+					insert: attr.text,
+					attributes: {
+						link: attr.href,
+						textDecoration: attr.textDecoration || 'none', // 涓嬪垝绾�
+						color: attr.color || '#007aff'
+					}
+				}
+				handleOps.push(linkOps)
+				// 鍚庡唴瀹�
+				if (suffix) {
+					const suffixOps = findAttributes ? {
+						insert: suffix,
+						attributes: findAttributes
+					} : {
+						insert: suffix
+					}
+					handleOps.push(suffixOps)
+				}
+				// 鍒犻櫎鍘無ptions[findex]骞跺湪findex浣嶇疆鎻掑叆涓婅堪涓変釜ops
+				options.splice(findex, 1);
+				options.splice(findex, 0, ...handleOps);
+				// 鏈�鍚庨噸鏂板垵濮嬪寲鍐呭锛屾敞鎰忚鏂规硶浼氬鑷村厜鏍囬噸缃埌鏈�寮�濮嬩綅缃�
+				editorCtx.setContents({
+					delta: {
+						ops: options
+					}
+				})
+				// 鎵�浠ユ渶鍚庡缓璁娇瀵屾枃鏈厜鏍囧け鐒︼紝璁╃敤鎴锋墜鍔ㄨ仛鐒﹀厜鏍�
+				editorCtx.blur()
+
+				// 鍚庣画鍥炶皟鎿嶄綔
+				if (callback) callback()
+			}
+		}
+	})
+
+}
+
+/**
+ * 灏嗗惈鏈夌壒娈婂浘鐗囧舰寮忚棰戠殑瀵屾枃鏈浆鎹㈡垚姝e父瑙嗛鐨勫瘜鏂囨湰
+ * @param {String} html 瑕佽繘琛屽鐞嗙殑瀵屾枃鏈瓧绗︿覆
+ * @returns {String} 杩斿洖澶勭悊缁撴灉
+ */
+export function handleHtmlWithVideo(html) {
+	// 姝e垯琛ㄨ揪寮忕敤浜庡尮閰峣mg鏍囩涓甫鏈塧lt灞炴�т笖alt灞炴�у�间负瑙嗛閾炬帴鐨勬ā寮�
+	const regex = /<img\s+src="[^"]*"\s+alt="([^"]*)"[^>]*>/g
+	// 浣跨敤replace鏂规硶鍜屼竴涓嚱鏁板洖璋冩潵鏇挎崲鍖归厤鍒扮殑鍐呭
+	return html.replace(regex, (match, videoUrl) => {
+		// 鏇挎崲涓簐ideo鏍囩锛屽苟娣诲姞controls灞炴�т互渚跨敤鎴峰彲浠ユ帶鍒舵挱鏀�
+		return `<video width="80%" controls><source src="${videoUrl}" type="video/mp4"></video>`
+	})
+}
+
+/**
+ * 灏唅mg鏍囩涓唴鑱攕tyle灞炴�т腑鐨勫楂樻牱寮忔彁鍙栧嚭鏍囩width涓巋eight灞炴��
+ * @param {Object} html 瑕佸鐞嗙殑瀵屾枃鏈瓧绗︿覆
+ * @returns {Object} 杩斿洖澶勭悊缁撴灉
+ */
+export function convertImgStylesToAttributes(html) {
+	return html.replace(/<img\s+([^>]+)\s*>/g, function(match, attributes) {
+		// 鍒嗗壊灞炴��
+		const attrs = attributes.split(/\s+/);
+
+		// 鎵惧埌style灞炴�х殑浣嶇疆
+		const styleIndex = attrs.findIndex(attr => attr.startsWith('style='));
+		if (styleIndex === -1) return match; // 濡傛灉娌℃湁鎵惧埌style灞炴�э紝鍒欒繑鍥炲師鏍�
+
+		// 鎻愬彇style灞炴�у��
+		const styleAttr = attrs.splice(styleIndex, 1)[0];
+		const style = styleAttr.match(/"([^"]*)"/)[1];
+
+		// 瑙f瀽 style 灞炴��
+		const styleObj = {};
+		style.split(';').forEach(function(part) {
+			if (part) {
+				const [name, value] = part.split(':');
+				styleObj[name.trim()] = value.trim();
+			}
+		});
+
+		// 鍒涘缓鏂扮殑 img 鏍囩
+		let newTag = '<img';
+		if (styleObj.width) {
+			newTag += ` width="${styleObj.width}"`;
+		}
+		if (styleObj.height) {
+			newTag += ` height="${styleObj.height}"`;
+		}
+
+		// 娣诲姞鍘熸湁鐨勫睘鎬э紝鍖呮嫭淇敼杩囩殑style灞炴��
+		newTag += ` ${styleAttr} ${attrs.join(' ')}`;
+
+		// 鍏抽棴 img 鏍囩
+		newTag += '>';
+
+		return newTag;
+	});
+}
\ No newline at end of file
diff --git a/uni_modules/sv-editor/changelog.md b/uni_modules/sv-editor/changelog.md
new file mode 100644
index 0000000..2915df3
--- /dev/null
+++ b/uni_modules/sv-editor/changelog.md
@@ -0,0 +1,35 @@
+## 1.1.2锛�2025-04-14锛�
+1. 鏇存柊瑙嗛灏侀潰鍥剧墖鍦板潃锛屼箣鍓嶇殑宸插け鏁�
+2. 鏇存柊鏂囨。
+## 1.1.1锛�2025-03-19锛�
+1. 鏇存柊vue2鐜涓嬬姸鎬侀攢姣佸紓甯哥殑闂
+## 1.1.0锛�2025-03-07锛�
+1. 鏇存柊鐘舵�侀攢姣侀�昏緫
+## 1.0.9锛�2025-01-18锛�
+1. 淇璋冭壊鏉垮湪寰俊灏忕▼搴弙ue2鐜涓嬬殑闂
+## 1.0.8锛�2025-01-18锛�
+1. 淇浜嗗井淇″皬绋嬪簭鍦╲ue2鐜涓嬬殑鎶ラ敊
+## 1.0.7锛�2025-01-18锛�
+1. 淇浜嗗井淇″皬绋嬪簭鍦╲ue2鐜涓嬪嚭鐜扮殑鎶ラ敊
+## 1.0.6锛�2024-12-17锛�
+1. 浼樺寲浜唅os绔吋瀹规�ч棶棰�
+2. 鏇存柊绀轰緥宸ョ▼鍜屾枃妗�
+## 1.0.5锛�2024-12-17锛�
+1. 鏇存柊鏂囨。
+## 1.0.4锛�2024-12-17锛�
+1. 鏂板鎵╁睍鍔熻兘
+2. 鏇存柊鏂囨。
+3. 鏇存柊绀轰緥宸ョ▼
+## 1.0.3锛�2024-12-11锛�
+1. 浼樺寲浜嗗缂栬緫鍣ㄥ疄渚嬫ā寮忥紝鐜板湪鍗曢〉闈㈠彲浠ュ瓨鍦ㄥ涓紪杈戝櫒浜�
+2. 鏇存柊浜嗘枃妗d笌绀轰緥宸ョ▼锛屽瀹炰緥鍙互鍙傝�冪ず渚嬩簩
+## 1.0.2锛�2024-12-10锛�
+1. 娣诲姞璋冭壊鏉垮姛鑳�
+2. 棰勮鏇村鏍峰紡鏍煎紡
+3. 鏇存柊绀轰緥宸ョ▼鍜屾枃妗�
+## 1.0.1锛�2024-12-06锛�
+1. v1姝e紡鐗堝彂甯�
+2. 鏇存柊鏂囨。
+3. 涓婁紶绀轰緥宸ョ▼
+## 1.0.0锛�2024-11-29锛�
+1. 鍩轰簬uni-editor鐨勪豢鐭ヤ箮瀵屾枃鏈垵绋�
diff --git a/uni_modules/sv-editor/components/backup/sv-editor-plugin.vue b/uni_modules/sv-editor/components/backup/sv-editor-plugin.vue
new file mode 100644
index 0000000..fedd101
--- /dev/null
+++ b/uni_modules/sv-editor/components/backup/sv-editor-plugin.vue
@@ -0,0 +1,656 @@
+<template>
+  <text
+    :eid="eid"
+    :change:eid="quillEditor.watchEID"
+    :sid="sid"
+    :change:sid="quillEditor.watchStartID"
+    :video="videoUrl"
+    :change:pastemode="quillEditor.watchPasteMode"
+    :pastemode="pastemode"
+    :change:video="quillEditor.watchVideoUrl"
+    :cover="coverUrl"
+    :change:cover="quillEditor.watchCoverUrl"
+    :coverios="coverUrlIOS"
+    :change:coverios="quillEditor.watchCoverUrlIOS"
+  ></text>
+</template>
+
+<script>
+/**
+ * 瀵屾枃鏈琾lugin鐗规畩鎵╁睍
+ * @author sonve
+ * @version 1.0.0
+ * @date 2024-12-14
+ */
+
+export default {
+  props: {
+    sid: {
+      type: String,
+      default: ''
+    },
+    eid: {
+      type: String,
+      default: ''
+    }
+  },
+  data() {
+    return {
+      videoUrl: '', // 瑙嗛鍦板潃
+      coverUrl: '', // 灏侀潰鍦板潃
+      coverUrlIOS: '', // ios绔皝闈㈠湴鍧�
+      pastemode: 'text' // 绮樿创妯″紡 text | origin
+    }
+  },
+  mounted() {},
+  methods: {
+    changePasteMode(e) {
+      this.pastemode = e
+    },
+    editorPaste(e) {
+      this.$emit('epaste', e)
+    },
+    createVideoThumbnail(url) {
+      this.videoUrl = url
+    },
+    getVideoThumbnail(e) {
+      // e: { video, cover }
+      uni.$emit(`E_EDITOR_GET_VIDEO_THUMBNAIL_${e.video}`, e)
+    },
+    createCoverThumbnail(url) {
+      // #ifdef H5
+      this.coverUrl = url
+      // #endif
+      // #ifdef APP
+      const isIOS = uni.getSystemInfoSync().platform == 'ios'
+      if (isIOS) {
+        this.coverUrlIOS = url // iOS鐢ㄤ笉浜哋ffscreenCanvas
+      } else {
+        this.coverUrl = url
+      }
+      // #endif
+    },
+    getCoverThumbnail(e) {
+      // e: { image, cover }
+      uni.$emit(`E_EDITOR_GET_COVER_THUMBNAIL_${e.image}`, e)
+    }
+  }
+}
+</script>
+
+<script module="quillEditor" lang="renderjs">
+import config from '../common/config.js'
+
+export default {
+  data() {
+		return {
+			editorID: '',
+			idStack: [], // sid鏍�
+      matcherMode: '' // 绮樿创妯″紡 text | origin
+		}
+  },
+  methods: {
+    /**
+     * 娉ㄦ剰锛歸atch棰戠箒瑙﹀彂鏃堕渶瑕佸紓姝ヤ慨鏀癸紝鍚﹀垯鍙兘浼氬鑷寸洃鍚笉鍒�
+     */
+		watchPasteMode(newValue, oldValue, ownerInstance, instance) {
+			if (newValue) {
+				this.matcherMode = newValue
+			}
+		},
+		watchStartID(newValue, oldValue, ownerInstance, instance) {
+			if (newValue) {
+				this.addMatcher(newValue)
+			}
+		},
+		watchEID(newValue, oldValue, ownerInstance, instance) {
+			if (newValue) {
+				this.editorID = newValue
+			}
+		},
+		watchVideoUrl(newValue, oldValue, ownerInstance, instance) {
+		  if (newValue) {
+		    this.generateVideoThumbnail(newValue).then((res) => {
+					this.$ownerInstance.callMethod('getVideoThumbnail', {
+            video: newValue,
+            cover: res
+          })
+				})
+		  }
+		},
+		watchCoverUrl(newValue, oldValue, ownerInstance, instance) {
+		  if (newValue) {
+		    this.generateCoverThumbnail(newValue).then((res) => {
+					this.$ownerInstance.callMethod('getCoverThumbnail', {
+            image: newValue,
+            cover: res
+          })
+				})
+		  }
+		},
+    /**
+     * Only Apple Can Do !!!
+     */
+		watchCoverUrlIOS(newValue, oldValue, ownerInstance, instance) {
+		  if (newValue) {
+		    this.generateCoverThumbnailIOS(newValue).then((res) => {
+					this.$ownerInstance.callMethod('getCoverThumbnail', {
+            image: newValue,
+            cover: res
+          })
+				})
+		  }
+		},
+		/**
+		 * 淇濈暀鏍煎紡绮樿创鍐呭
+		 * @description 姝ゆ柟寮忓敖鍙兘淇濈暀鍘熸牸寮忥紝鏄撲簬鍐嶇紪杈戯紝浣嗘槸閮ㄥ垎鏍煎紡浼氫涪澶�
+		 * @param {String} sid 褰撳墠缂栬緫鍣╥d
+		 */
+		addMatcher(sid) {
+			if(this.idStack.includes(sid)) return // 绂佹閲嶅娣诲姞Matcher
+			this.idStack.push(sid)
+
+			const el = document.querySelector(`#${sid}`);
+			const quill = Quill.find(el);
+
+			const getStyleAttributes = (node, style) => {
+				let attributes = {}
+
+				// node灞炴��
+				const width = node.getAttribute('width');
+				const height = node.getAttribute('height');
+				if (width) attributes.width = width
+				if (height) attributes.height = height
+				const dataCustom = node.getAttribute('data-custom');
+				if (dataCustom) attributes['data-custom'] = dataCustom;
+
+				// style鏍峰紡
+				if (style.textAlign) attributes.align = style.textAlign;
+				if (style.fontWeight === 'bold' || style.fontWeight === '700') attributes.bold = true;
+				if (style.fontStyle === 'italic') attributes.italic = true;
+				if (style.textDecoration.includes('underline')) attributes.underline = true;
+				if (style.textDecoration.includes('line-through')) attributes.strike = true;
+				if (style.verticalAlign === 'super') attributes.script = 'super'
+				if (style.verticalAlign === 'sub') attributes.script = 'sub'
+				if (style.fontFamily) attributes.font = style.fontFamily;
+				if (style.fontSize) attributes.size = parseFloat(style.fontSize);
+				if (style.color) attributes.color = style.color;
+				if (style.backgroundColor) attributes.background = style.backgroundColor;
+
+				return attributes
+			}
+
+			const processNode = (node) => {
+				let ops = [];
+
+				if (node.nodeType === Node.ELEMENT_NODE) {
+					const computedStyle = document.defaultView.getComputedStyle(node);
+
+					// 澶勭悊 <img> 鏍囩
+					if (node.tagName === 'IMG') {
+						const imgSrc = node.getAttribute('src');
+						if (imgSrc) {
+							ops.push({ insert: '\n' }); // 鎻掑叆鎹㈣绗︼紝纭繚鍥剧墖鍓嶆湁涓�涓┖琛�
+							ops.push({
+									insert: { image: imgSrc },
+									attributes: getStyleAttributes(node, computedStyle)
+							});
+							ops.push({ insert: '\n' }); // 鎻掑叆鎹㈣绗︼紝纭繚鍥剧墖鍚庢湁涓�涓┖琛�
+
+							return ops; // 涓嶅弬涓庨�掑綊
+						}
+					}
+
+					// 澶勭悊 <p> 鍜� <div> 鏍囩
+					else if (node.tagName === 'P' || node.tagName === 'DIV') {
+					  ops.push({ insert: '\n' }); // 鎻掑叆鎹㈣绗�
+					}
+
+					// 澶勭悊 <ol> 鏍囩 鏈夊簭
+					else if (node.tagName === 'OL') {
+					  // ops.push({ insert: '\n', attributes: { list: 'ordered' } });
+					}
+
+					// 澶勭悊 <ul> 鏍囩 鏃犲簭
+					else if (node.tagName === 'UL') {
+					  // ops.push({ insert: '\n', attributes: { list: 'bullet' } });
+					}
+
+					// 澶勭悊 <li> 鏍囩
+					else if (node.tagName === 'LI') {
+						ops.push({ insert: '\n' });
+					}
+
+
+					// 澶勭悊 <hr> 鏍囩
+					else if (node.tagName === 'HR') {
+						ops.push({ insert: '\n' }); // 鎻掑叆鎹㈣绗�
+						ops.push({ insert: { divider: true } });
+
+						return ops; // 涓嶅弬涓庨�掑綊
+          }
+
+					// 澶勭悊 <a> 鏍囩
+					else if (node.tagName === 'A') {
+						const href = node.getAttribute('href');
+						const textContent = node.textContent.trim();
+
+						if (href && textContent) {
+							ops.push({
+								insert: ' ' + textContent + ' ',
+								attributes: {
+									link: href,
+									textDecoration: computedStyle.textDecoration,
+										...getStyleAttributes(node, computedStyle)
+									}
+								});
+
+							return ops; // 涓嶅弬涓庨�掑綊
+						}
+					}
+
+					// 澶勭悊 <h1> 鍒� <h6> 鏍囬
+					else if (['H1', 'H2', 'H3', 'H4', 'H5', 'H6'].includes(node.tagName)) {
+						// 澶勭悊 <h1> 鍒� <h6> 鏍囬锛岀敓鎴� header 鎿嶄綔
+						const headerLevel = parseInt(node.tagName.charAt(1), 10);
+						const textContent = node.textContent.trim();
+
+						if (textContent) {
+							ops.push({
+								insert: textContent + '\n', // 蹇呴』瑕佸姞涓婃崲琛�
+								attributes: {
+									header: headerLevel,
+									...getStyleAttributes(node, computedStyle)
+								}
+							});
+
+							return ops; // 涓嶅弬涓庨�掑綊
+						}
+					}
+
+					// 閫掑綊澶勭悊瀛愯妭鐐�
+					for (let child of node.childNodes) {
+							ops = ops.concat(processNode(child));
+					}
+
+				} else if (node.nodeType === Node.TEXT_NODE) {
+					const textContent = node.nodeValue.trim();
+					if (textContent) {
+						// 浠庣埗鍏冪礌鑾峰彇鏍峰紡
+						const parentNode = node.parentNode;
+						if (parentNode) {
+							const computedStyle = document.defaultView.getComputedStyle(parentNode);
+							ops.push({
+								insert: textContent,
+								attributes: getStyleAttributes(parentNode, computedStyle)
+							});
+						} else {
+							// 濡傛灉娌℃湁鐖跺厓绱狅紝鐩存帴鎻掑叆鏂囨湰
+							ops.push({ insert: textContent });
+						}
+					}
+				}
+
+				return ops;
+			}
+
+			quill.clipboard.addMatcher(Node.ELEMENT_NODE, (node, delta) => {
+                if (this.matcherMode == 'origin') {
+                    let newOps = processNode(node);
+                    if (newOps.length > 0) {
+                        return { ops: newOps };
+                    }
+                }
+				return delta;
+			})
+
+			const cleanClipboardHTML = (html, text) => {
+				if(!html) return text
+				// 浣跨敤姝e垯琛ㄨ揪寮忓尮閰� <!--StartFragment--> 鍜� <!--EndFragment--> 涔嬮棿鐨勫唴瀹�
+				const fragmentRegex = /<!--StartFragment-->([\s\S]*?)<!--EndFragment-->/;
+				const match = html.match(fragmentRegex);
+				if (match && match[1]) {
+						// 杩斿洖鍖归厤鍒扮殑鍐呭
+						return match[1].trim();
+				}
+				// 濡傛灉娌℃湁鍖归厤鍒扮墖娈靛唴瀹癸紝杩斿洖鍘熷 HTML
+				return html;
+			}
+
+			el.addEventListener('paste', (e) => {
+				let clipboardText = e.clipboardData.getData('text/plain'); // 鑾峰彇鍓垏鏉夸腑鐨勭函鏂囨湰鍐呭
+				let clipboardHtml = e.clipboardData.getData('text/html'); // 鑾峰彇鍓垏鏉夸腑鐨� HTML 鍐呭锛堝鏋滃瓨鍦級
+				clipboardHtml = cleanClipboardHTML(clipboardHtml, clipboardText)
+
+				setTimeout(() => {
+					this.$ownerInstance.callMethod('editorPaste', {
+						id: sid,
+						text: clipboardText,
+						html: clipboardHtml,
+						range: quill.getSelection() // 鑾峰彇褰撳墠鍏夋爣浣嶇疆
+					})
+				}, 100);
+			});
+		},
+		/**
+		 * 淇濈暀鏍煎紡绮樿创鍐呭
+		 * @description 姝ゆ柟寮忚櫧鐒跺彲浠ユ瀬澶х▼搴︿繚鐣欐牸寮忥紝浣嗘槸浼氬鑷寸矘璐翠笅鏉ョ殑鍐呭涓轰竴鏁翠釜鍧楋紝涓斾笉鏄撳啀缂栬緫
+		 * @param {String} sid 褰撳墠缂栬緫鍣╥d
+		 */
+		/*
+		addMatcher(sid) {
+			if(this.idStack.includes(sid)) return // 绂佹閲嶅娣诲姞Matcher
+			this.idStack.push(sid)
+
+			// 寮曞叆婧愮爜涓殑BlockEmbed
+			const BlockEmbed = Quill.import('blots/block/embed');
+			// 瀹氫箟鏂扮殑blot绫诲瀷
+			class AppPanelEmbed extends BlockEmbed {
+				static create(value) {
+					const node = super.create(value);
+					node.setAttribute('width', '100%');
+					//   璁剧疆鑷畾涔塰tml
+					node.innerHTML = this.transformValue(value)
+					return node;
+				}
+				static transformValue(value) {
+					let handleArr = value.split('\n')
+					handleArr = handleArr.map(e => e.replace(/^[\s]+/, '').replace(/[\s]+$/, ''))
+					return handleArr.join('')
+				}
+				// 杩斿洖鑺傜偣鑷韩鐨剉alue鍊� 鐢ㄤ簬鎾ら攢鎿嶄綔
+				static value(node) {
+					return node.innerHTML
+				}
+			}
+			// blotName
+			AppPanelEmbed.blotName = 'AppPanelEmbed';
+			// 鏍囩绫诲瀷鑷畾涔�
+			AppPanelEmbed.tagName = 'p';
+			Quill.register(AppPanelEmbed, true);
+
+			const el = document.querySelector(`#${sid}`);
+			const quill = Quill.find(el);
+
+			const cleanClipboardHTML = (html, text) => {
+				if(!html) return text
+				// 浣跨敤姝e垯琛ㄨ揪寮忓尮閰� <!--StartFragment--> 鍜� <!--EndFragment--> 涔嬮棿鐨勫唴瀹�
+				const fragmentRegex = /<!--StartFragment-->([\s\S]*?)<!--EndFragment-->/;
+				const match = html.match(fragmentRegex);
+
+				if (match && match[1]) {
+						// 杩斿洖鍖归厤鍒扮殑鍐呭
+						return match[1].trim();
+				}
+
+				// 濡傛灉娌℃湁鍖归厤鍒扮墖娈靛唴瀹癸紝杩斿洖鍘熷 HTML
+				return html;
+			}
+
+			el.addEventListener('paste', (e) => {
+				e.preventDefault();
+
+				let clipboardText = e.clipboardData.getData('text/plain'); // 鑾峰彇鍓垏鏉夸腑鐨勭函鏂囨湰鍐呭
+				let clipboardHtml = e.clipboardData.getData('text/html'); // 鑾峰彇鍓垏鏉夸腑鐨� HTML 鍐呭锛堝鏋滃瓨鍦級
+				clipboardHtml = cleanClipboardHTML(clipboardHtml, clipboardText)
+
+				this.$ownerInstance.callMethod('editorPaste', {
+					id: sid,
+					text: clipboardText,
+					html: clipboardHtml
+				})
+
+				setTimeout(() => {
+					const range = quill.getSelection(); // 鑾峰彇褰撳墠鍏夋爣浣嶇疆
+					quill.insertEmbed(range.index, 'AppPanelEmbed', clipboardHtml);
+				}, 100);
+			});
+		},
+		*/
+		/**
+		 * 鐢熸垚瑙嗛灏侀潰鍥剧墖锛堜笉鍏煎iOS锛�
+		 * @property {String} videoUrl 瑙嗛鍦板潃
+		 * @returns {Promise} 瑙嗛灏侀潰鍥剧墖 娉ㄦ剰寮傛澶勭悊
+		 */
+		async generateVideoThumbnail(videoUrl) {
+			// 缁樺埗鎾斁鎸夐挳鍥炬爣
+			// @param {CanvasContext} context canvas涓婁笅鏂�
+			// @param {Canvas} canvas
+			const drawPlayButton = (context, canvas) => {
+				// 鍒涘缓涓�涓� <img> 鍏冪礌鏉ュ姞杞芥挱鏀惧浘鏍�
+				const img = new Image();
+				img.src = config.video_playicon;
+
+				// 绛夊緟鍥惧儚鍔犺浇瀹屾垚
+				return new Promise((resolve, reject) => {
+					img.onload = () => {
+						// 璁$畻鎾斁鎸夐挳鐨勪綅缃拰澶у皬
+						// const playButtonSize = Math.min(canvas.width, canvas.height) * 0.15;
+						const playButtonSize = canvas.width * 0.15;
+						const playButtonX = (canvas.width - playButtonSize) / 2;
+						const playButtonY = (canvas.height - playButtonSize) / 2;
+
+						// 缁樺埗鎾斁鎸夐挳鍒� canvas
+						context.drawImage(img, playButtonX, playButtonY, playButtonSize, playButtonSize);
+
+						resolve();
+					};
+
+					img.onerror = (error) => {
+						reject(new Error('Failed to load SVG image.'));
+					};
+				});
+			}
+
+			return new Promise(async (resolve, reject) => {
+				try {
+					// 鍒涘缓涓�涓柊鐨� video 鍏冪礌锛屽苟璁剧疆 crossOrigin 灞炴��
+					const video = document.createElement('video');
+					video.crossOrigin = 'anonymous'; // 娣诲姞 crossOrigin 灞炴��
+					video.preload = 'metadata';
+					video.src = videoUrl;
+
+					// 鍒涘缓涓�涓柊鐨� canvas 鍏冪礌
+					const canvas = document.createElement('canvas');
+					const context = canvas.getContext('2d');
+
+					// 鐩戝惉瑙嗛鍔犺浇鍏冩暟鎹畬鎴�
+					video.onloadedmetadata = async () => {
+						// 璁剧疆 canvas 灏哄涓庤棰戠浉鍚�
+						canvas.width = video.videoWidth;
+						canvas.height = video.videoHeight;
+
+						// 灏濊瘯缁樺埗瑙嗛鐨勭涓�甯у埌 canvas
+						video.currentTime = 0; // 纭繚鎴戜滑浠庤棰戠殑绗竴甯у紑濮�
+						video.onseeked = async () => {
+							try {
+								context.drawImage(video, 0, 0, canvas.width, canvas.height);
+
+								// 缁樺埗鎾斁鎸夐挳
+								await drawPlayButton(context, canvas);
+
+								// 灏� canvas 鍐呭杞崲涓� Data URL
+								// resolve(canvas.toDataURL('image/png')); // base64澶暱浜嗭紝涓嶅缓璁娇鐢�
+
+								// 灏� canvas 鍐呭杞崲涓� Blob 瀵硅薄
+								canvas.toBlob((blob) => {
+									resolve(URL.createObjectURL(blob));
+								}, 'image/png');
+
+							} catch (error) {
+								reject(new Error('Failed to draw image to canvas.'));
+							}
+						};
+
+						// 濡傛灉 seek 鎿嶄綔娌℃湁鎴愬姛锛屽皾璇曠洿鎺ョ粯鍒跺綋鍓嶅抚
+						setTimeout(async () => {
+							if (!video.seeking) {
+								try {
+									context.drawImage(video, 0, 0, canvas.width, canvas.height);
+									// 缁樺埗鎾斁鎸夐挳
+									await drawPlayButton(context, canvas);
+
+									// 灏� canvas 鍐呭杞崲涓� Data URL
+									// resolve(canvas.toDataURL('image/png')); // base64澶暱浜嗭紝涓嶅缓璁娇鐢�
+
+									// 灏� canvas 鍐呭杞崲涓� Blob 瀵硅薄
+									canvas.toBlob((blob) => {
+										resolve(URL.createObjectURL(blob));
+									}, 'image/png');
+
+								} catch (error) {
+									reject(new Error('Failed to draw image to canvas.'));
+								}
+							}
+						}, 1000); // 绛夊緟1绉掑悗灏濊瘯缁樺埗锛岄槻姝� seek 鎿嶄綔鏈畬鎴�
+					};
+
+					// 鐩戝惉瑙嗛鍔犺浇閿欒
+					video.onerror = (error) => {
+						// reject(new Error('Failed to load video or get metadata. PS: Maybe the browser cannot play videos.'));
+
+						// 涓嶇洿鎺ユ姏鍑洪敊璇紝鑰屾槸鎶涘嚭涓�涓粯璁ょ殑灏侀潰鍥剧墖锛屼絾鏄渶瑕佸姞浠ヨ鍛婃彁绀�
+						console.warn('Failed to load video or get metadata. PS: Maybe the browser cannot play videos.');
+						resolve(config.video_thumbnail);
+					};
+				} catch (error) {
+					// reject(error);
+          // 涓嶇洿鎺ユ姏鍑洪敊璇紝鑰屾槸鎶涘嚭涓�涓粯璁ょ殑灏侀潰鍥剧墖锛屼絾鏄渶瑕佸姞浠ヨ鍛婃彁绀�
+          console.warn(error)
+          resolve(config.video_thumbnail);
+				}
+			});
+		},
+    /**
+     * 鐢熸垚灏侀潰鍥剧墖锛孫ffscreenCanvas鏂瑰紡锛堜笉鍏煎iOS锛�
+     * @param {Object} coverUrl 灏侀潰鍥剧墖鍦板潃
+     * @returns {Promise}
+     */
+		async generateCoverThumbnail(coverUrl) {
+      return new Promise((resolve, reject) => {
+
+        // 鍐呰仈 Worker 浠g爜
+        const workerCode = `
+          self.onmessage = async function(e) {
+            const { imageUrl, iconBase64 } = e.data;
+
+            try {
+              // 鍔犺浇鍥剧墖骞跺垱寤� ImageBitmap
+              let imgResponse = await fetch(imageUrl);
+              if (!imgResponse.ok) {
+                throw new Error(\`Failed to load image from \${imageUrl}: \${imgResponse.statusText}\`);
+              }
+              let imgBlob = await imgResponse.blob();
+              let imgBitmap = await createImageBitmap(imgBlob);
+
+              // 鍒涘缓 OffscreenCanvas 骞剁粯鍒跺浘鐗�
+              const offscreen = new OffscreenCanvas(imgBitmap.width, imgBitmap.height);
+              const ctx = offscreen.getContext('2d');
+              ctx.drawImage(imgBitmap, 0, 0);
+
+              // 鍔犺浇鍥炬爣骞跺垱寤� ImageBitmap
+              let iconResponse = await fetch(iconBase64);
+              if (!iconResponse.ok) {
+                throw new Error(\`Failed to load icon from \${iconBase64}: \${iconResponse.statusText}\`);
+              }
+              let iconBlob = await iconResponse.blob();
+              let iconBitmap = await createImageBitmap(iconBlob);
+
+              // 璁$畻鍥炬爣鐨勪腑蹇冧綅缃苟缁樺埗
+              const x = (imgBitmap.width - iconBitmap.width) / 2;
+              const y = (imgBitmap.height - iconBitmap.height) / 2;
+              ctx.drawImage(iconBitmap, x, y);
+
+              // 鑾峰彇澶勭悊鍚庣殑鍥惧儚鏁版嵁
+              const result = await offscreen.convertToBlob();
+
+              // 鍙戦�佺粨鏋滃洖涓荤嚎绋�
+              self.postMessage(result);
+            } catch (error) {
+              console.error('Error processing image:', error.message);
+              self.postMessage({ error: error.message });
+            }
+          };
+        `
+
+        // 鍒涘缓 Blob
+        const blob = new Blob([workerCode], { type: 'application/javascript' });
+
+        // 鍒涘缓涓�涓寚鍚� Blob 鐨� URL
+        const workerUrl = URL.createObjectURL(blob);
+
+        // 瀹炰緥鍖� Worker
+        const worker = new Worker(workerUrl);
+
+        // 鐩戝惉鏉ヨ嚜 Worker 鐨勬秷鎭�
+        worker.onmessage = (e) => {
+          if (e.data instanceof Blob) {
+            resolve(URL.createObjectURL(e.data));
+          } else {
+            console.warn(e.data.error);
+            // 涓嶇洿鎺ユ姏鍑洪敊璇紝鑰屾槸鎶涘嚭涓�涓粯璁ょ殑灏侀潰鍥剧墖锛屼絾鏄渶瑕佸姞浠ヨ鍛婃彁绀�
+            resolve(config.video_thumbnail);
+          }
+          worker.terminate(); // 澶勭悊瀹屾垚鍚庣粓姝� worker
+        };
+
+        // 鍚� Worker 鍙戦�佹秷鎭�
+        worker.postMessage({ imageUrl: coverUrl, iconBase64: config.video_playicon });
+      });
+		},
+    /**
+     * 鐢熸垚灏侀潰鍥剧墖锛屾櫘閫氭柟寮忥紝鍙兘褰卞搷鎬ц兘锛堝吋瀹筰OS锛�
+     * @param {Object} coverUrl 灏侀潰鍥剧墖鍦板潃
+     * @returns {Promise}
+     */
+    async generateCoverThumbnailIOS(coverUrl){
+      return new Promise(async (resolve, reject) => {
+          try {
+            // 鍒涘缓 Image 瀵硅薄骞跺姞杞藉皝闈㈠浘鐗�
+            const img = new Image();
+            img.src = coverUrl;
+            await new Promise(resolve => img.onload = resolve);
+
+            // 鍒涘缓 Canvas 骞剁粯鍒跺皝闈㈠浘鐗�
+            const canvas = document.createElement('canvas');
+            canvas.width = img.width;
+            canvas.height = img.height;
+            const ctx = canvas.getContext('2d');
+            ctx.drawImage(img, 0, 0);
+
+            // 鍔犺浇鎾斁鎸夐挳鍥炬爣骞剁粯鍒�
+            const icon = new Image();
+            icon.src = config.video_playicon; // 鍋囪杩欐槸鎾斁鎸夐挳鍥炬爣鐨� URL
+            await new Promise(resolve => icon.onload = resolve);
+
+            // 璁$畻鎾斁鎸夐挳鐨勪綅缃拰澶у皬
+            // const playButtonSize = Math.min(canvas.width, canvas.height) * 0.15;
+            const playButtonSize = canvas.width * 0.15;
+            const playButtonX = (canvas.width - playButtonSize) / 2;
+            const playButtonY = (canvas.height - playButtonSize) / 2;
+
+            // 纭繚鎾斁鎸夐挳鍥炬爣鎸夋瘮渚嬬缉鏀�
+            const iconAspectRatio = icon.width / icon.height;
+            const iconWidth = playButtonSize;
+            const iconHeight = iconWidth / iconAspectRatio;
+
+            // 缁樺埗鎾斁鎸夐挳鍥炬爣鍒� Canvas
+            ctx.drawImage(icon, playButtonX, playButtonY, iconWidth, iconHeight);
+
+            // 灏� canvas 鍐呭杞崲涓� Blob 瀵硅薄
+            canvas.toBlob((blob) => {
+            	resolve(URL.createObjectURL(blob));
+            }, 'image/png');
+
+          } catch (error) {
+            // iOS Safari 鐨勫畨鍏ㄧ瓥鐣ラ�氬父姣斿叾浠栨祻瑙堝櫒鏇翠弗鏍硷紝鏈湴file://鍗忚涔熶細瀵艰嚧璺ㄥ煙
+            console.warn('iOS createCoverThumbnail error :', error);
+            // reject(error);
+            // 涓嶇洿鎺ユ姏鍑洪敊璇紝鑰屾槸鎶涘嚭涓�涓粯璁ょ殑灏侀潰鍥剧墖锛屼絾鏄渶瑕佸姞浠ヨ鍛婃彁绀�
+            resolve(config.video_thumbnail);
+          }
+      })
+    },
+	}
+}
+</script>
diff --git a/uni_modules/sv-editor/components/backup/sv-editor-wxplugin.js b/uni_modules/sv-editor/components/backup/sv-editor-wxplugin.js
new file mode 100644
index 0000000..a811cb9
--- /dev/null
+++ b/uni_modules/sv-editor/components/backup/sv-editor-wxplugin.js
@@ -0,0 +1,94 @@
+/**
+ * 瀵屾枃鏈琾lugin寰俊灏忕▼搴忕壒娈婃墿灞�
+ * @author sonve
+ * @version 1.0.0
+ * @date 2024-12-17
+ */
+import config from '../common/config.js'
+
+/**
+ * 寰俊灏忕▼搴忕壒鏈夌殑OffscreenCanvas鏂规硶
+ * @param {String} coverImageUrl 灏侀潰璧勬簮鍦板潃
+ * @returns {Promise<String>} 澶勭悊鍚庣殑灏侀潰鍥剧墖鐨勪复鏃舵枃浠惰矾寰�
+ */
+export function wxCreateCoverThumbnail(coverImageUrl) {
+  const loadImage = () => {
+    return new Promise((resolve, reject) => {
+      uni.getImageInfo({
+        src: coverImageUrl,
+        success: (info) => {
+          resolve(info)
+        },
+        fail: (err) => {
+          reject(err)
+        }
+      })
+    })
+  }
+  return new Promise(async (resolve, reject) => {
+    try {
+      const imageInfo = await loadImage()
+
+      // 鍒涘缓绂诲睆 Canvas
+      const canvas = uni.createOffscreenCanvas({
+        type: '2d',
+        width: imageInfo.width,
+        height: imageInfo.height
+      })
+      const ctx = canvas.getContext('2d')
+
+      // 鍒涘缓涓�涓浘鐗�
+      const coverImg = canvas.createImage()
+      // 绛夊緟鍥剧墖鍔犺浇
+      await new Promise((resolve) => {
+        coverImg.onload = resolve
+        coverImg.src = coverImageUrl // 瑕佸姞杞界殑鍥剧墖 url
+      })
+
+      // 缁樺埗灏侀潰鍥剧墖鍒扮灞� Canvas
+      ctx.drawImage(coverImg, 0, 0, canvas.width, canvas.height)
+
+      // 鍔犺浇鎾斁鎸夐挳鍥炬爣
+      const playIcon = canvas.createImage()
+      // 绛夊緟鍥剧墖鍔犺浇
+      await new Promise((resolve) => {
+        playIcon.onload = resolve
+        playIcon.src = config.video_playicon // 瑕佸姞杞界殑鍥剧墖 url
+      })
+
+      // 璁$畻鎾斁鎸夐挳鐨勪綅缃拰澶у皬
+      // const playButtonSize = Math.min(canvas.width, canvas.height) * 0.15
+      const playButtonSize = canvas.width * 0.15
+      const playButtonX = (canvas.width - playButtonSize) / 2
+      const playButtonY = (canvas.height - playButtonSize) / 2
+
+      // 纭繚鎾斁鎸夐挳鍥炬爣鎸夋瘮渚嬬缉鏀�
+      const iconAspectRatio = playIcon.width / playIcon.height
+      const iconWidth = playButtonSize
+      const iconHeight = iconWidth / iconAspectRatio
+
+      // 缁樺埗鎾斁鎸夐挳鍥炬爣鍒扮灞� Canvas
+      ctx.drawImage(playIcon, playButtonX, playButtonY, iconWidth, iconHeight)
+
+      // 鑾峰彇鐢诲畬鍚庣殑鏁版嵁
+      uni.canvasToTempFilePath({
+        canvas: canvas,
+        destWidth: canvas.width,
+        destHeight: canvas.height,
+        fileType: 'png',
+        success: (res) => {
+          resolve(res.tempFilePath)
+        },
+        fail: (err) => {
+          reject(new Error('Failed to convert canvas to image.'))
+        }
+      })
+    } catch (error) {
+      reject(error)
+    }
+  })
+}
+
+export default {
+  wxCreateCoverThumbnail
+}
\ No newline at end of file
diff --git a/uni_modules/sv-editor/components/common/config.js b/uni_modules/sv-editor/components/common/config.js
new file mode 100644
index 0000000..26118ef
--- /dev/null
+++ b/uni_modules/sv-editor/components/common/config.js
@@ -0,0 +1,15 @@
+/**
+ * 鍏叡閰嶇疆鍙傛暟
+ * @author sonve
+ * @version 1.0.0
+ * @date 2024-12-04
+ */
+const config = {
+  // 瑙嗛榛樿灏侀潰 鍙兘浼氬け鏁堬紝鍘熷浘鍦ㄧず渚嬪伐绋嬫牴鐩綍涓媠tatic鏂囦欢澶逛腑
+  video_thumbnail: 'http://qiniu.sonve.asia/assets/images/video-frame-cover.gif',
+  // 瑙嗛灏侀潰鎾斁鍥炬爣
+  video_playicon: 'data:image/png;base64,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',
+  
+}
+
+export default config
\ No newline at end of file
diff --git a/uni_modules/sv-editor/components/common/file-handler.js b/uni_modules/sv-editor/components/common/file-handler.js
new file mode 100644
index 0000000..d2cc3d5
--- /dev/null
+++ b/uni_modules/sv-editor/components/common/file-handler.js
@@ -0,0 +1,261 @@
+/**
+ * 浠ヤ笅鏂规硶鍑鸿嚜 image-tools
+ * @see https://ext.dcloud.net.cn/plugin?id=123
+ */
+
+function getLocalFilePath(path) {
+  if (path.indexOf('_www') === 0 || path.indexOf('_doc') === 0 || path.indexOf('_documents') === 0 || path.indexOf(
+      '_downloads') === 0) {
+    return path
+  }
+  if (path.indexOf('file://') === 0) {
+    return path
+  }
+  if (path.indexOf('/storage/emulated/0/') === 0) {
+    return path
+  }
+  if (path.indexOf('/') === 0) {
+    let localFilePath = plus.io.convertAbsoluteFileSystem(path)
+    if (localFilePath !== path) {
+      return localFilePath
+    } else {
+      path = path.substr(1)
+    }
+  }
+  return '_www/' + path
+}
+
+function dataUrlToBase64(str) {
+  let array = str.split(',')
+  return array[array.length - 1]
+}
+
+let index = 0
+
+function getNewFileId() {
+  return Date.now() + String(index++)
+}
+
+function biggerThan(v1, v2) {
+  let v1Array = v1.split('.')
+  let v2Array = v2.split('.')
+  let update = false
+  for (let index = 0; index < v2Array.length; index++) {
+    let diff = v1Array[index] - v2Array[index]
+    if (diff !== 0) {
+      update = diff > 0
+      break
+    }
+  }
+  return update
+}
+
+export function pathToBase64(path) {
+  return new Promise(function(resolve, reject) {
+    if (typeof window === 'object' && 'document' in window) {
+      if (typeof FileReader === 'function') {
+        let xhr = new XMLHttpRequest()
+        xhr.open('GET', path, true)
+        xhr.responseType = 'blob'
+        xhr.onload = function() {
+          if (this.status === 200) {
+            let fileReader = new FileReader()
+            fileReader.onload = function(e) {
+              resolve(e.target.result)
+            }
+            fileReader.onerror = reject
+            fileReader.readAsDataURL(this.response)
+          }
+        }
+        xhr.onerror = reject
+        xhr.send()
+        return
+      }
+      let canvas = document.createElement('canvas')
+      let c2x = canvas.getContext('2d')
+      let img = new Image
+      img.onload = function() {
+        canvas.width = img.width
+        canvas.height = img.height
+        c2x.drawImage(img, 0, 0)
+        resolve(canvas.toDataURL())
+        canvas.height = canvas.width = 0
+      }
+      img.onerror = reject
+      img.src = path
+      return
+    }
+    if (typeof plus === 'object') {
+      plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), function(entry) {
+        entry.file(function(file) {
+          let fileReader = new plus.io.FileReader()
+          fileReader.onload = function(data) {
+            resolve(data.target.result)
+          }
+          fileReader.onerror = function(error) {
+            reject(error)
+          }
+          fileReader.readAsDataURL(file)
+        }, function(error) {
+          reject(error)
+        })
+      }, function(error) {
+        reject(error)
+      })
+      return
+    }
+    if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
+      wx.getFileSystemManager().readFile({
+        filePath: path,
+        encoding: 'base64',
+        success: function(res) {
+          resolve('data:image/png;base64,' + res.data)
+        },
+        fail: function(error) {
+          reject(error)
+        }
+      })
+      return
+    }
+    reject(new Error('not support'))
+  })
+}
+
+export function base64ToPath(base64) {
+  return new Promise(function(resolve, reject) {
+    if (typeof window === 'object' && 'document' in window) {
+      base64 = base64.split(',')
+      let type = base64[0].match(/:(.*?);/)[1]
+      let str = atob(base64[1])
+      let n = str.length
+      let array = new Uint8Array(n)
+      while (n--) {
+        array[n] = str.charCodeAt(n)
+      }
+      return resolve((window.URL || window.webkitURL).createObjectURL(new Blob([array], {
+        type: type
+      })))
+    }
+    let extName = base64.split(',')[0].match(/data\:\S+\/(\S+);/)
+    if (extName) {
+      extName = extName[1]
+    } else {
+      reject(new Error('base64 error'))
+    }
+    let fileName = getNewFileId() + '.' + extName
+    if (typeof plus === 'object') {
+      let basePath = '_doc'
+      let dirPath = 'uniapp_temp'
+      let filePath = basePath + '/' + dirPath + '/' + fileName
+      if (!biggerThan(plus.os.name === 'Android' ? '1.9.9.80627' : '1.9.9.80472', plus.runtime.innerVersion)) {
+        plus.io.resolveLocalFileSystemURL(basePath, function(entry) {
+          entry.getDirectory(dirPath, {
+            create: true,
+            exclusive: false,
+          }, function(entry) {
+            entry.getFile(fileName, {
+              create: true,
+              exclusive: false,
+            }, function(entry) {
+              entry.createWriter(function(writer) {
+                writer.onwrite = function() {
+                  resolve(filePath)
+                }
+                writer.onerror = reject
+                writer.seek(0)
+                writer.writeAsBinary(dataUrlToBase64(base64))
+              }, reject)
+            }, reject)
+          }, reject)
+        }, reject)
+        return
+      }
+      let bitmap = new plus.nativeObj.Bitmap(fileName)
+      bitmap.loadBase64Data(base64, function() {
+        bitmap.save(filePath, {}, function() {
+          bitmap.clear()
+          resolve(filePath)
+        }, function(error) {
+          bitmap.clear()
+          reject(error)
+        })
+      }, function(error) {
+        bitmap.clear()
+        reject(error)
+      })
+      return
+    }
+    if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) {
+      let filePath = wx.env.USER_DATA_PATH + '/' + fileName
+      wx.getFileSystemManager().writeFile({
+        filePath: filePath,
+        data: dataUrlToBase64(base64),
+        encoding: 'base64',
+        success: function() {
+          resolve(filePath)
+        },
+        fail: function(error) {
+          reject(error)
+        }
+      })
+      return
+    }
+    reject(new Error('not support'))
+  })
+}
+
+/**
+ * 鏈柟娉曚负鏈汉鑷繁鍐欑殑锛屽缓璁繕鏄娇鐢ㄤ笂杩扮殑pathToBase64鏂规硶
+ * @description 鍥剧墖鍦板潃杞崲涓篵ase64鏍煎紡鍥剧墖
+ * @param {string} url 鍥剧墖鍦板潃 缃戠粶鍦板潃 鏈湴鐩稿璺緞
+ * @param {string} type base64鍥剧墖绫诲瀷 榛樿png
+ */
+export function urlToBase64(url, type = 'png') {
+  let promises
+
+  // 缃戠粶鍦板潃 鎴栬�卙5绔湰鍦扮浉瀵硅矾寰� 鍙娇鐢╮equest鏂瑰紡
+  promises = new Promise((resolve, reject) => {
+    uni.request({
+      url: url,
+      method: 'GET',
+      responseType: 'arraybuffer',
+      success: (res) => {
+        const base64 = `data:image/${type};base64,${uni.arrayBufferToBase64(res.data)}`
+        resolve(base64);
+      },
+      fail: (err) => {
+        reject(err);
+      },
+    })
+  })
+
+  // #ifdef APP
+  if (!url.startsWith('http')) {
+    // app鐪熸満鏈湴鐩稿璺緞
+    promises = new Promise((resolve, reject) => {
+      // 浣跨敤compressImage鑾峰彇鍒板畨鍗撴湰鍦拌矾寰刦ile:///...
+      uni.compressImage({
+        src: url,
+        quality: 100,
+        success: (res) => {
+          const tempUrl = res.tempFilePath
+          plus.io.resolveLocalFileSystemURL(tempUrl, (entry) => {
+            entry.file((e) => {
+              let fileReader = new plus.io.FileReader();
+              fileReader.onload = (r) => {
+                resolve(r.target.result)
+              }
+              fileReader.readAsDataURL(e)
+            })
+          })
+        },
+        fail: (err) => {
+          reject(err);
+        },
+      })
+    })
+  }
+  // #endif
+
+  return promises
+}
\ No newline at end of file
diff --git a/uni_modules/sv-editor/components/common/parse.js b/uni_modules/sv-editor/components/common/parse.js
new file mode 100644
index 0000000..bb00c88
--- /dev/null
+++ b/uni_modules/sv-editor/components/common/parse.js
@@ -0,0 +1,179 @@
+/**
+ * 瀵屾枃鏈В鏋愬伐鍏�
+ * @author sonve
+ * @version 1.0.0
+ * @date 2024-12-04
+ */
+
+import config from './config.js'
+
+/**
+ * 灏嗗惈鏈夊皝闈㈠崰浣嶅浘褰㈠紡鐨勮棰戝瘜鏂囨湰杞崲鎴愭甯歌棰戠殑瀵屾枃鏈�
+ * @param {String} richText 瑕佽繘琛屽鐞嗙殑瀵屾枃鏈瓧绗︿覆
+ * @returns {String} 杩斿洖澶勭悊缁撴灉
+ */
+export function parseHtmlWithVideo(richText) {
+	// 姝e垯琛ㄨ揪寮忓尮閰�<img>鏍囩鍙婂叾灞炴��
+	const imgRegex = /<img\s+([^>]+)>/gi;
+	// 姝e垯琛ㄨ揪寮忓尮閰峝ata-custom灞炴�т腑鐨剈rl鍊�
+	const customUrlRegex = /\bdata-custom="[^"]*url=([^&"]+)/i;
+
+	return richText.replace(imgRegex, (match, attrs) => {
+		// 鏌ユ壘data-custom灞炴�т腑鐨剈rl鍊�
+		const urlMatch = attrs.match(customUrlRegex);
+		if (urlMatch) {
+			// 鑾峰彇data-custom涓殑url
+			const videoUrl = urlMatch[1];
+
+			// 瑙f瀽鍑烘墍鏈夊睘鎬�
+			const attrArray = attrs.split(/\s+/).filter(attr => attr.trim() !== '');
+
+			// 杩囨护鎺塻rc灞炴�у拰data-custom灞炴��
+			const newAttrs = attrArray.filter(attr => !attr.startsWith('src=') && !attr.startsWith('data-custom='))
+				.join(' ');
+
+			// 鏋勫缓鏂扮殑video鏍囩锛屼繚鐣欏師鏈夌殑鍏朵粬灞炴�э紝浣嗗幓闄rc鍜宒ata-custom
+			return `<video controls ${newAttrs}><source src="${videoUrl}" /></video>`;
+		}
+		// 濡傛灉娌℃湁鍖归厤鍒癲ata-custom涓殑url锛屽垯淇濇寔鍘熸牱
+		return match;
+	});
+}
+
+/**
+ * 甯︽湁瑙嗛鐨勫瘜鏂囨湰閫嗗悜杞崲
+ * @description 鍙嚜瀹氫箟澶勭悊灏侀潰
+ * @param {Promise} richText 瑕佽浆鎹㈢殑瀵屾枃鏈�
+ * @param {Function<Promise>} customCallback 鑷畾涔夊鐞嗗皝闈㈠洖璋冿紝闇�瑕乺eturn灏侀潰鍥剧墖璧勬簮锛岃嚜甯﹀弬鏁颁负瑙嗛鍦板潃
+ * @returns {Promise} 杞崲鍚庣殑瀵屾枃鏈� 娉ㄦ剰寮傛澶勭悊
+ */
+export async function replaceVideoWithImageRender(richText, customCallback) {
+
+	// 姝e垯琛ㄨ揪寮忕敤浜庡尮閰� <video> 鏍囩浠ュ強鍏跺唴閮ㄧ殑 <source> 鏍囩
+	const videoRegex = /<video\s+([^>]+)>(.*?)<\/video>/gi;
+
+	// 鎵惧埌鎵�鏈夌殑 <video> 鏍囩
+	const matches = [];
+	let match;
+	while ((match = videoRegex.exec(richText)) !== null) {
+		matches.push(match);
+	}
+
+	// 骞惰澶勭悊姣忎釜 <video> 鏍囩锛岀敓鎴愬搴旂殑缂╃暐鍥�
+	const replacements = await Promise.all(
+		matches.map(async (match) => {
+			const [fullMatch, attributes, content] = match;
+
+			// 鍖归厤 <source> 鏍囩涓殑 src 灞炴��
+			const sourceRegex = /<source\s+[^>]*src="([^">]+)"/i;
+			const matchSource = content.match(sourceRegex);
+
+			let videoUrl = '';
+			if (matchSource && matchSource.length > 1) {
+				videoUrl = matchSource[1];
+			}
+
+			// 鐢熸垚瑙嗛灏侀潰鍥�
+			let thumbnailRes
+			if (customCallback) thumbnailRes = await customCallback(videoUrl) // 鑷畾涔夊皝闈㈠鐞�
+			if (!thumbnailRes) thumbnailRes = config.video_thumbnail // 鏃犳晥鍊煎垯榛樿灏侀潰澶勭悊
+
+			// 杩囨护鎺変笉闇�瑕佺殑灞炴�э紝渚嬪 controls
+			const filteredAttributes = attributes
+				.split(/\s+/)
+				.filter(attr => !attr.startsWith('controls'))
+				.join(' ');
+
+			// 鏋勫缓鏂扮殑 img 鏍囩锛岀户鎵� video 鐨勫睘鎬э紙闄や簡 controls锛夊苟娣诲姞 data-custom 灞炴��
+			const imgTag = `<img ${filteredAttributes} src="${thumbnailRes}" data-custom="url=${videoUrl}" />`;
+
+			return { fullMatch, imgTag };
+		}));
+
+	// 浣跨敤 replacements 鏇挎崲鍘熷鐨� <video> 鏍囩
+	let result = richText;
+	for (const { fullMatch, imgTag } of replacements) {
+		result = result.replace(fullMatch, imgTag);
+	}
+
+	return result;
+}
+
+/**
+ * 瑙f瀽鍑哄瘜鏂囨湰涓殑鍥剧墖鍜岃棰�
+ * @param {String} richText 瑕佽В鏋愮殑瀵屾枃鏈�
+ * @returns {Array} 鍥剧墖鍜岃棰戞暟缁�
+ */
+export function parseImagesAndVideos(richText) {
+	// 鍒涘缓涓�涓┖鏁扮粍鐢ㄤ簬瀛樺偍鍥剧墖鍜岃棰戜俊鎭�
+	const result = [];
+
+	// 姝e垯琛ㄨ揪寮忓尮閰� <img> 鏍囩鍙婂叾灞炴��
+	const imgRegex = /<img\s+[^>]*>/gi;
+	// 鍖归厤灞炴�у悕鍜屽�肩殑姝e垯琛ㄨ揪寮忥紝鏀硅繘鍚庣殑鐗堟湰鍙互澶勭悊灞炴�у悕涓寘鍚繛瀛楃鐨勬儏鍐�
+	const attrRegex = /(\w+(-\w+)*)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'<>]+))/gi;
+
+	// 鎵惧埌鎵�鏈夌殑 <img> 鏍囩
+	const matches = richText.match(imgRegex);
+	// 濡傛灉娌℃湁鎵惧埌浠讳綍 <img> 鏍囩锛岃繑鍥炵┖鏁扮粍
+	if (!matches) return [];
+
+	// 閬嶅巻鎵�鏈夌殑 <img> 鏍囩
+	matches.forEach(match => {
+		// 鍒涘缓涓�涓璞$敤浜庡瓨鍌ㄥ崟涓浘鐗囨垨瑙嗛鐨勪俊鎭�
+		const ivInfo = {};
+		// 浣跨敤姝e垯琛ㄨ揪寮忓尮閰嶆瘡涓� <img> 鏍囩鐨勫睘鎬�
+		let attrsMatch;
+		while ((attrsMatch = attrRegex.exec(match)) !== null) {
+			// 灞炴�у悕
+			const name = attrsMatch[1].toLowerCase();
+			// 灞炴�у�煎彲鑳藉瓨鍦ㄤ簬绗笁銆佺鍥涙垨绗簲涓崟鑾风粍涓�
+			let value = attrsMatch[3] || attrsMatch[4] || attrsMatch[5] || '';
+
+			// 鍘婚櫎灞炴�у�间袱绔彲鑳藉瓨鍦ㄧ殑寮曞彿
+			if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
+				value = value.substring(1, value.length - 1);
+			}
+
+			// 灏嗗睘鎬у悕鍜屽�兼坊鍔犲埌 ivInfo 瀵硅薄涓�
+			ivInfo[name] = value;
+		}
+		// 灏嗗崟涓浘鐗囨垨瑙嗛淇℃伅娣诲姞鍒版暟缁勪腑
+		result.push(ivInfo);
+	});
+
+	// 杩斿洖鍖呭惈鎵�鏈夊浘鐗囧拰瑙嗛淇℃伅鐨勬暟缁�
+	return result;
+}
+
+/**
+ * 瑙f瀽鍑哄瘜鏂囨湰涓殑鍥剧墖
+ * @param {String} richText 瑕佽В鏋愮殑瀵屾枃鏈�
+ * @returns {Array} 鍥剧墖鏁扮粍
+ */
+export function parseImages(richText) {
+	let result = []
+	const ivList = parseImagesAndVideos(richText)
+	ivList.forEach(item => {
+		if (!item['data-custom'] || !item['data-custom'].startsWith('url')) {
+			result.push(item)
+		}
+	})
+	return result
+}
+
+/**
+ * 瑙f瀽鍑哄瘜鏂囨湰涓殑瑙嗛
+ * @param {String} richText 瑕佽В鏋愮殑瀵屾枃鏈�
+ * @returns {Array} 瑙嗛鏁扮粍
+ */
+export function parseVideos(richText) {
+	let result = []
+	const ivList = parseImagesAndVideos(richText)
+	ivList.forEach(item => {
+		if (item['data-custom'] && item['data-custom'].startsWith('url')) {
+			result.push(item)
+		}
+	})
+	return result
+}
\ No newline at end of file
diff --git a/uni_modules/sv-editor/components/common/store.js b/uni_modules/sv-editor/components/common/store.js
new file mode 100644
index 0000000..651468a
--- /dev/null
+++ b/uni_modules/sv-editor/components/common/store.js
@@ -0,0 +1,101 @@
+/**
+ * 鎻掍欢鍐呭叏灞�鐘舵�佺鐞�
+ * @author sonve
+ * @version 1.0.0
+ * @date 2024-12-04
+ */
+
+// #ifdef VUE3
+import { reactive } from 'vue';
+// #endif
+
+// #ifdef VUE2
+import Vue from 'vue';
+// #endif
+
+// 瀹氫箟state鐘舵��
+let state = null
+
+// #ifdef VUE3
+// 瀹氫箟鍝嶅簲寮忕姸鎬�
+state = reactive({
+  curEID: '',
+  formats: {},
+  isReadOnly: false,
+  firstInstanceFlag: '' // 棣栨瀹炰緥鍖栨爣蹇楋紝绂佹鎵嬪姩鏇存敼
+})
+// #endif
+
+// #ifdef VUE2
+// 瀹氫箟鍝嶅簲寮忕姸鎬�
+state = Vue.observable({
+  curEID: '',
+  formats: {},
+  isReadOnly: false,
+  firstInstanceFlag: '' // 棣栨瀹炰緥鍖栨爣蹇楋紝绂佹鎵嬪姩鏇存敼
+})
+// #endif
+
+// 瀹氫箟鏂规硶
+function getEditor(eid) {
+  return state[`${eid}-ctx`];
+};
+
+function setEditor(eid, ctx) {
+  state[`${eid}-ctx`] = ctx
+  // #ifdef MP-WEIXIN
+  state[`${eid}-ctx`].id = eid
+  // #endif
+}
+
+function getEID() {
+  return state.curEID
+};
+
+function setEID(eid) {
+  state.curEID = eid
+}
+
+function getFormats() {
+  return state.formats
+}
+
+function setFormats(formats) {
+  state.formats = formats
+}
+
+function getReadOnly() {
+  return state.isReadOnly
+}
+
+function setReadOnly(readOnly) {
+  state.isReadOnly = readOnly
+}
+
+function destroy() {
+  // 閲嶇疆鎵�鏈夌姸鎬�
+  state = {}
+  state.curEID = ''
+  state.formats = {}
+  state.isReadOnly = false
+  state.firstInstanceFlag = '' // 棣栨瀹炰緥鍖栨爣蹇楋紝绂佹鎵嬪姩鏇存敼
+}
+
+// 瀹氫箟options瀵硅薄
+const options = {
+  state,
+  actions: {
+    getEditor,
+    setEditor,
+    getEID,
+    setEID,
+    getFormats,
+    setFormats,
+    getReadOnly,
+    setReadOnly,
+    destroy
+  }
+}
+
+// 瀵煎嚭 
+export default options
\ No newline at end of file
diff --git a/uni_modules/sv-editor/components/common/tool-list.js b/uni_modules/sv-editor/components/common/tool-list.js
new file mode 100644
index 0000000..760d047
--- /dev/null
+++ b/uni_modules/sv-editor/components/common/tool-list.js
@@ -0,0 +1,208 @@
+/**
+ * 宸ュ叿鏍�
+ * @author sonve
+ * @version 1.0.0
+ * @date 2024-12-04
+ */
+
+export const toolList = [
+  { title: '鏍峰紡', name: 'style', icon: 'icon-zitiyanse' },
+  { title: '琛ㄦ儏', name: 'emoji', icon: 'icon-xiaolian' },
+  { title: '鎾ら攢', name: 'undo', icon: 'icon-shangyibu1' },
+  { title: '閲嶅仛', name: 'redo', icon: 'icon-xiayibu1' },
+  { title: '鏇村', name: 'more', icon: 'icon-icon_tianjia' },
+  { title: '鎵╁睍', name: 'setting', icon: 'icon-bianji' },
+]
+
+export const styleToolList = [
+  { title: '鏍囬', name: 'header', value: 2, icon: 'icon-zitibiaoti' },
+  { title: '鍒嗗壊绾�', name: 'divider', icon: 'icon-fengexian' },
+  { title: '绮椾綋', name: 'bold', icon: 'icon-zitijiacu' },
+  { title: '鏂滀綋', name: 'italic', icon: 'icon-zitixieti' },
+  { title: '涓嬪垝绾�', name: 'underline', icon: 'icon-zitixiahuaxian' },
+  { title: '鍒犻櫎绾�', name: 'strike', icon: 'icon-zitishanchuxian' },
+  { title: '宸﹀榻�', name: 'align', value: 'left', icon: 'icon-zuoduiqi' },
+  { title: '灞呬腑', name: 'align', value: 'center', icon: 'icon-juzhongduiqi' },
+  { title: '鍙冲榻�', name: 'align', value: 'right', icon: 'icon-youduiqi' },
+  { title: '鏈夊簭鍒楄〃', name: 'list', value: 'ordered', icon: 'icon-youxupailie' },
+  { title: '鏃犲簭鍒楄〃', name: 'list', value: 'bullet', icon: 'icon-wuxupailie' },
+  { title: '涓婃爣', name: 'script', value: 'super', icon: 'icon-zitishangbiao' },
+  { title: '宸︾缉杩�', name: 'indent', value: '+1', icon: 'icon-zuosuojin' },
+  { title: '鍙崇缉杩�', name: 'indent', value: '-1', icon: 'icon-yousuojin' },
+  { title: '涓嬫爣', name: 'script', value: 'sub', icon: 'icon-ziti-xiabiao' },
+  { title: '鏂囧瓧棰滆壊', name: 'color', icon: 'icon-wenziyanse' },
+  { title: '鑳屾櫙棰滆壊', name: 'backgroundColor', icon: 'icon-beijingyanse' },
+  { title: '娓呴櫎鏍煎紡', name: 'removeformat', icon: 'icon-qingchugeshi' },
+]
+
+export const moreToolList = [
+  { title: '娣诲姞鍥剧墖', name: 'image', value: 'popup', icon: 'icon-charutupian' },
+  { title: '娣诲姞瑙嗛', name: 'video', value: 'popup', icon: 'icon-shexiangji' },
+  { title: '娣诲姞閾炬帴', name: 'link', value: 'popup', icon: 'icon-charulianjie' },
+  { title: '娣诲姞闄勪欢', name: 'attachment', value: 'popup', icon: 'icon-huixingzhen' },
+  { title: '鎻愬強', name: 'at', value: 'popup', icon: 'icon-at' },
+  { title: '璇濋', name: 'topic', value: 'popup', icon: 'icon-huati' },
+  { title: '娓呯┖', name: 'clear', value: 'button', icon: 'icon-shanchu' },
+]
+
+export const emojiToolList = [
+  '馃槉', // 绗戠瑧
+  '馃槂', // 澶х瑧
+  '馃槃', // 寮�蹇冩灉
+  '馃榿', // 鍢茶
+  '馃槅', // 鐖嗙瑧
+  '馃槄', // 鍑烘睏绗�
+  '馃ぃ', // 婊氬湴澶х瑧
+  '馃槀', // 娉祦婊¢潰
+  '馃檪', // 杞绘澗鎰夊揩
+  '馃檭', // 涓婁笅缈荤櫧鐪�
+  '馃槈', // 楝奸绁熺
+  '馃槍', // 瀹夋叞
+  '馃槏', // 蹇冨姩
+  '馃グ', // 娣辨儏
+  '馃槝', // 鍚�
+  '馃槜', // 鎺ュ惢
+  '馃槞', // 浜插惢
+  '馃槡', // 浜插惢
+  '馃構', // 鍝囧
+  '馃槢', // 鑸屽ご澶栦几
+  '馃槤', // 鑸屽ご鍚愬嚭
+  '馃槣', // 椤界毊
+  '馃お', // 鐤媯
+  '馃槑', // 鑷豹
+  '馃', // 瀛︾┒
+  '馃', // 鎬濊��
+  '馃槒', // 鐙$尵
+  '馃槖', // 涓嶉珮鍏�
+  '馃槥', // 涓嶅紑蹇�
+  '馃様', // 鎶掑彂鎯呯华
+  '馃槦', // 鎷呭咖
+  '馃槙', // 鍥版儜
+  '馃檨', // 灏忓け鏈�
+  '鈽癸笍锔�', // 涓嶅ソ鎰忔��
+  '馃槪', // 鑻︽伡
+  '馃槚', // 鎰ゆ��
+  '馃槴', // 绱�
+  '馃槱', // 鎮蹭激
+  '馃槫', // 鐢熸皵
+  '馃槧', // 鐢熸皵
+  '馃槨', // 鏋佺鎰ゆ��
+  '馃が', // 鍙戦
+  '馃く', // 鐖嗙偢澶磋剳
+  '馃槼', // 鍚冩儕
+  '馃槺', // 鎯婂悡
+  '馃槰', // 鎭愭儳
+  '馃槹', // 鎱屽紶
+  '馃槩', // 鍝常
+  '馃槶', // 澶у摥
+  '馃槗', // 鍙楁尗
+  '馃', // 缁欏姏
+  '馃', // 鎬濊��
+  '馃き', // 鎴村彛缃╂崅鍢寸瑧
+  '馃か', // 鎴村彛缃╁仛楝艰劯
+  '馃ぅ', // 璇磋皫
+  '馃槵', // 鏍兼牸涓嶅叆
+  '馃槾', // 鐫¤
+  '馃い', // 鍨傛稁娆叉淮
+  '馃コ', // 搴嗙
+  '馃ズ', // 姹傛眰浣�
+  '馃槇', // 鎭堕瓟
+  '馃懣', // 鎭剁伒
+  '馃ぁ', // 灏忎笐
+  '馃懟', // 楝奸瓊
+  '馃懡', // 澶栨槦浜�
+  '馃懢', // 娓告垙瑙掕壊
+  '馃', // 鏈哄櫒浜�
+  '馃樅', // 绗戠尗
+  '馃樃', // 澶х瑧鐚�
+  '馃樄', // 寮�蹇冪尗
+  '馃樆', // 蹇冨姩鐚�
+  '馃樇', // 鍌插▏鐚�
+  '馃樈', // 浜插惢鐚�
+  '馃檧', // 鎯婂悡鐚�
+  '馃樋', // 鍝尗
+  '馃樉' // 鐢熸皵鐚�
+]
+
+export const colorList = [
+  '#000000',
+  '#222222',
+  '#444444',
+  '#666666',
+  '#999999',
+  '#cccccc',
+  '#eeeeee',
+  '#ffffff',
+
+  '#c92a2a',
+  '#e03131',
+  '#f03e3e',
+  '#fa5252',
+  '#ff6b6b',
+  '#ff8787',
+  '#ffa8a8',
+  '#ffc9c9',
+
+  '#a61e4d',
+  '#c2255c',
+  '#d6336c',
+  '#e64980',
+  '#f06595',
+  '#f783ac',
+  '#faa2c1',
+  '#fcc2d7',
+
+  '#862e9c',
+  '#9c36b5',
+  '#ae3ec9',
+  '#be4bdb',
+  '#cc5de8',
+  '#da77f2',
+  '#e599f7',
+  '#eebefa',
+
+  '#5f3dc4',
+  '#6741d9',
+  '#7048e8',
+  '#7950f2',
+  '#845ef7',
+  '#9775fa',
+  '#b197fc',
+  '#d0bfff',
+
+  '#0b7285',
+  '#0c8599',
+  '#1098ad',
+  '#15aabf',
+  '#22b8cf',
+  '#3bc9db',
+  '#66d9e8',
+  '#99e9f2',
+
+  '#087f5b',
+  '#099268',
+  '#0ca678',
+  '#12b886',
+  '#20c997',
+  '#38d9a9',
+  '#63e6be',
+  '#96f2d7',
+
+  '#5c940d',
+  '#66a80f',
+  '#74b816',
+  '#82c91e',
+  '#94d82d',
+  '#a9e34b',
+  '#c0eb75',
+  '#ffec99',
+
+  '#d9480f',
+  '#e8590c',
+  '#f76707',
+  '#fd7e14',
+  '#ff922b',
+  '#ffa94d',
+  '#ffc078',
+  '#ffd8a8'
+]
\ No newline at end of file
diff --git a/uni_modules/sv-editor/components/common/utils.js b/uni_modules/sv-editor/components/common/utils.js
new file mode 100644
index 0000000..f6fec5b
--- /dev/null
+++ b/uni_modules/sv-editor/components/common/utils.js
@@ -0,0 +1,412 @@
+/**
+ * 閫氱敤宸ュ叿api
+ * @author sonve
+ * @version 1.0.0
+ * @date 2024-12-04
+ */
+
+import store from './store.js'
+
+/**
+ * 娣诲姞鍥剧墖
+ * @param {Function} uploadFunc 鏂囦欢涓婁紶鍑芥暟锛堝紑鍙戣�呰嚜琛岃皟鐢ㄤ笂浼犳帴鍙d笂浼犳湰鍦板浘鐗囪嚦鏈嶅姟鍣ㄥ悗鑾峰彇鏈嶅姟鍣ㄥ浘鐗囩湡瀹炲湴鍧�锛岄渶瑕乺eturn鍖呭惈鍦板潃鐨勬暟缁勶級
+ * @param {Object} options 鍥剧墖閰嶇疆椤�
+ * @property {String} options.srcFiled 鍥剧墖鍦板潃瀛楁鍚嶏紝榛樿鏃犳椂浣跨敤鏁扮粍鍏冪礌鏈韩
+ * @property {String} options.alt 鍥惧儚鏃犳硶鏄剧ず鏃剁殑鏇夸唬鏂囨湰
+ * @property {String} options.width 鍥剧墖瀹藉害锛坧ixels/鐧惧垎姣旓級涓虹┖鏃惰嚜閫傚簲鍥剧墖鏈韩瀹藉害锛岄粯璁ょ┖锛堜笉寤鸿100%锛岄鐣欎竴鐐圭┖闅欎互渚跨敤鎴风紪杈戯級
+ * @property {String} options.height 鍥剧墖楂樺害 (pixels/鐧惧垎姣旓級涓虹┖鏃惰嚜閫傚簲鍥剧墖鏈韩楂樺害锛岄粯璁ょ┖
+ * @property {String} options.extClass 娣诲姞鍒板浘鐗� img 鏍囩涓婄殑绫诲悕
+ * @property {String} options.data 琚簭鍒楀寲涓� v1=1;v2=2 鐨勬牸寮忔寕鍦ㄥ睘鎬� data-custom 涓�
+ * @returns {Array|Promise} 涓婁紶鐨勬枃浠舵暟缁�
+ */
+export async function addImage(uploadFunc, options = {}) {
+  const eid = store.actions.getEID()
+  const editorCtx = store.actions.getEditor(eid)
+
+  // 鏈嶅姟鍣ㄤ笂浼犲浘鐗�
+  if (!uploadFunc) return
+  const upRes = await uploadFunc(editorCtx)
+  if (!upRes || !upRes?.length) return
+
+  // 鍙栨秷閿洏鍓綔鐢�
+  noKeyboardEffect(() => {
+    editorCtx.insertText({ text: '\n' })
+    upRes?.forEach((item) => {
+      editorCtx.insertImage({
+        ...options,
+        src: options.srcFiled ? item[options.srcFiled] : item,
+      })
+    })
+    // 寤鸿鍔犱釜鎹㈣锛岃櫧鐒朵細瀵艰嚧input鍥炶皟鍐嶆瑙﹀彂锛屼笉杩囬棶棰樹笉澶�
+    editorCtx.insertText({ text: '\n' })
+  })
+
+  return upRes
+}
+
+/**
+ * 娣诲姞瑙嗛
+ * @description uni-editor鏆備笉鏀寔鎻掑叆瑙嗛锛屾澶勪娇鐢ㄨ棰戝皝闈㈠崰浣嶏紝灏嗚棰戝湴鍧�浣滀负灞炴�ф寕鍦ㄨ嚦data-custom涓婏紝鎼哄甫瑙嗛鐨勫瘜鏂囨湰闇�瑕佷娇鐢ㄤ笓鐢ㄧ殑api杩涜瑙f瀽瀵煎嚭銆傛敞锛氬缓璁悗绔厤鍚堣繑鍥炶棰戝皝闈㈠浘鐗囧湴鍧�锛屾垨鑰呬娇鐢ㄥ浐瀹氱殑缃戠粶鍥剧墖浣滀负灏侀潰銆�
+ * @param {Function} uploadFunc 鏂囦欢涓婁紶鍑芥暟锛堝紑鍙戣�呰嚜琛岃皟鐢ㄤ笂浼犳帴鍙d笂浼犳湰鍦拌棰戣嚦鏈嶅姟鍣ㄥ悗鑾峰彇鏈嶅姟鍣ㄨ棰戠湡瀹炲湴鍧�锛岄渶瑕乺eturn鍖呭惈鍦板潃鐨勬暟缁勶級
+ * @param {Object} options 瑙嗛灏侀潰鍥剧墖閰嶇疆椤�
+ * @property {String} options.imageFiled 瑙嗛灏侀潰鍥剧墖鍦板潃瀛楁鍚嶏紝榛樿imagePath
+ * @property {String} options.videoFiled 瑙嗛鐪熷疄鍦板潃瀛楁鍚嶏紝榛樿videoPath
+ * @property {String} options.alt 瑙嗛灏侀潰鍥剧墖鏃犳硶鏄剧ず鏃剁殑鏇夸唬鏂囨湰
+ * @property {String} options.width 瑙嗛灏侀潰鍥剧墖瀹藉害锛坧ixels/鐧惧垎姣旓級榛樿绌猴紝浣嗘槸瑕佹敞鎰忥紝涓嶈缃畐idth鐨勮瘽锛寁ideo鏍囩榛樿瀹藉害涓�300px
+ * @property {String} options.height 瑙嗛灏侀潰鍥剧墖楂樺害 (pixels/鐧惧垎姣旓級榛樿绌�
+ * @property {String} options.extClass 娣诲姞鍒拌棰戝皝闈㈠浘鐗� img 鏍囩涓婄殑绫诲悕
+ * @property {String} options.data 璀﹀憡锛氳棰戝湴鍧�宸插瓨鍏ata-custom涓紝璇峰嬁浣跨敤姝ゅ弬鏁板鑷磋棰戝湴鍧�琚鐩�
+ * @returns {Array|Promise} 涓婁紶鐨勬枃浠舵暟缁�
+ */
+export async function addVideo(uploadFunc, options = {}) {
+  const eid = store.actions.getEID()
+  const editorCtx = store.actions.getEditor(eid)
+
+  // 鏈嶅姟鍣ㄤ笂浼犺棰�
+  if (!uploadFunc) return
+  const upRes = await uploadFunc(editorCtx)
+  console.log(upRes);
+  if (!upRes || !upRes?.length) return
+
+  // 鍙栨秷閿洏鍓綔鐢�
+  noKeyboardEffect(() => {
+    editorCtx.insertText({ text: '\n' })
+    upRes?.forEach((item) => {
+      editorCtx.insertImage({
+        ...options,
+        src: item[options.imageFiled || 'imagePath'],
+        data: { url: item[options.videoFiled || 'videoPath'] },
+      })
+    })
+    // 寤鸿鍔犱釜鎹㈣锛岃櫧鐒朵細瀵艰嚧input鍥炶皟鍐嶆瑙﹀彂锛屼笉杩囬棶棰樹笉澶�
+    editorCtx.insertText({ text: '\n' })
+  })
+
+  return upRes
+}
+
+/**
+ * 娣诲姞閾炬帴
+ * @param {Object} options 閾炬帴閰嶇疆椤�
+ * @property {String} options.link 閾炬帴鍦板潃
+ * @property {String} options.text 閾炬帴鏂囨湰 绌虹己鏃朵娇鐢╨ink
+ * @property {String} options.textDecoration 涓嬪垝绾�
+ * @property {String} options.color 棰滆壊 榛樿#007aff
+ * @property {Object} options.style 鍏朵粬鏍峰紡锛屼緥濡� { bold: true, italic: true } 绛夛紝璇﹁锛歨ttps://quilljs.com/docs/delta
+ * @param {Function} callback 娣诲姞閾炬帴鎴愬姛鍚庡洖璋�
+ * @returns {void}
+ */
+export async function addLink(options = {}, callback) {
+  const eid = store.actions.getEID()
+  const editorCtx = store.actions.getEditor(eid)
+
+  // 鍙栨秷閿洏鍓綔鐢�
+  noKeyboardEffect(() => {
+    insertLink(editorCtx, {
+      ...options,
+      link: options.link,
+      text: ` ${options.text || options.link} `, // 鍓嶅悗鍚勫姞涓�涓┖鏍�
+    }, () => {
+      editorCtx.changeInput() // 閫氱煡鏇存柊缂栬緫鍣╥nput浜嬩欢
+      if (callback) callback()
+    })
+  })
+}
+
+/**
+ * 娣诲姞闄勪欢
+ * @param {Function} uploadFunc 鏂囦欢涓婁紶鍑芥暟锛堝紑鍙戣�呰嚜琛岃皟鐢ㄤ笂浼犳帴鍙d笂浼犳湰鍦伴檮浠惰嚦鏈嶅姟鍣ㄥ悗鑾峰彇鏈嶅姟鍣ㄩ檮浠剁湡瀹炲湴鍧�锛岄渶瑕乺eturn鍖呭惈鍦板潃鐨勫璞★級
+ * @param {Object} options 闄勪欢閰嶇疆椤�
+ * @property {String} options.srcFiled 闄勪欢鍦板潃瀛楁鍚嶏紝榛樿path
+ * @property {String} options.link 闄勪欢鍦板潃 娉細涓存椂鍦板潃浼氳嚜鍔ㄨ浆鎴恆bout:blank瀵艰嚧鏃犳晥
+ * @property {String} options.text 闄勪欢鏂囨湰 绌虹己鏃朵娇鐢╨ink
+ * @property {String} options.textDecoration 涓嬪垝绾�
+ * @property {String} options.color 棰滆壊 榛樿#34d19d
+ * @property {Object} options.style 鍏朵粬鏍峰紡锛屼緥濡� { bold: true, italic: true } 绛夛紝璇﹁锛歨ttps://quilljs.com/docs/delta
+ * @param {Function} callback 娣诲姞闄勪欢鎴愬姛鍚庡洖璋�
+ * @returns {Object|Promise} 涓婁紶鐨勬枃浠跺璞�
+ */
+export async function addAttachment(uploadFunc, options = {}, callback) {
+  const eid = store.actions.getEID()
+  const editorCtx = store.actions.getEditor(eid)
+
+  // 鏈嶅姟鍣ㄤ笂浼犻檮浠�
+  if (!uploadFunc) return
+  const upRes = await uploadFunc(editorCtx)
+  if (!upRes) return
+
+  const link = upRes[options.srcFiled || 'path'] || options.link
+  if (!link) return
+  const text = ` 馃搫${upRes.text || options.text || upRes.file?.name || link } ` // 鍔犱笂闄勪欢鍥炬爣鍓嶇疆锛屽苟鍓嶅悗鍚勫姞涓�涓┖鏍�
+  // 鍙栨秷閿洏鍓綔鐢�
+  noKeyboardEffect(() => {
+    insertLink(editorCtx, {
+      color: '#34d19d',
+      ...options,
+      text,
+      link,
+    }, () => {
+      editorCtx.changeInput() // 閫氱煡鏇存柊缂栬緫鍣╥nput浜嬩欢
+      if (callback) callback()
+    })
+  })
+
+  return upRes
+}
+
+/**
+ * 娣诲姞鎻愬強
+ * @param {Object} options 鎻愬強閰嶇疆椤�
+ * @property {String} options.username 鐢ㄦ埛鍚嶇О
+ * @property {String} options.userid 鐢ㄦ埛id
+ * @property {String} options.textDecoration 涓嬪垝绾�
+ * @property {String} options.color 棰滆壊 榛樿#66ccff
+ * @property {Object} options.style 鍏朵粬鏍峰紡锛屼緥濡� { bold: true, italic: true } 绛夛紝璇﹁锛歨ttps://quilljs.com/docs/delta
+ * @param {Function} callback 娣诲姞閾炬帴鎴愬姛鍚庡洖璋�
+ */
+export async function addAt(options = {}, callback) {
+  const eid = store.actions.getEID()
+  const editorCtx = store.actions.getEditor(eid)
+
+  // 鍙栨秷閿洏鍓綔鐢�
+  noKeyboardEffect(() => {
+    insertLink(editorCtx, {
+      color: '#66ccff',
+      ...options,
+      link: `@${options.userid}`, // 娣诲姞鐗规畩鍓嶇紑锛屽悗缁究浜庤В鏋愭爣璇�
+      text: ` @${options.username} `, // 鍓嶅悗鍚勫姞涓�涓┖鏍�
+    }, () => {
+      editorCtx.changeInput() // 閫氱煡鏇存柊缂栬緫鍣╥nput浜嬩欢
+      if (callback) callback()
+    })
+  })
+}
+
+/**
+ * 娣诲姞璇濋
+ * @param {Object} options 璇濋閰嶇疆椤�
+ * @property {String} options.link 璇濋閾炬帴
+ * @property {String} options.topic 璇濋鍚嶇О
+ * @property {String} options.textDecoration 涓嬪垝绾�
+ * @property {String} options.color 棰滆壊 榛樿#909399
+ * @property {Object} options.style 鍏朵粬鏍峰紡锛屼緥濡� { bold: true, italic: true } 绛夛紝璇﹁锛歨ttps://quilljs.com/docs/delta
+ * @param {Function} callback 娣诲姞閾炬帴鎴愬姛鍚庡洖璋�
+ */
+export async function addTopic(options = {}, callback) {
+  const eid = store.actions.getEID()
+  const editorCtx = store.actions.getEditor(eid)
+
+  // 鍙栨秷閿洏鍓綔鐢�
+  noKeyboardEffect(() => {
+    insertLink(editorCtx, {
+      color: '#909399',
+      ...options,
+      link: `#${options.link}`, // 娣诲姞鐗规畩鍓嶇紑锛屽悗缁究浜庤В鏋愭爣璇�
+      text: ` #${options.topic}# `, // 鍓嶅悗鍚勫姞涓�涓┖鏍�
+    }, () => {
+      editorCtx.changeInput() // 閫氱煡鏇存柊缂栬緫鍣╥nput浜嬩欢
+      if (callback) callback()
+    })
+  })
+}
+
+
+/**
+ * 鏍囪瘑蹇呴』鐙竴鏃犱簩 - 鏍囪瘑鏄负浜嗕娇鐢╥nsertText鎻掑叆鏍囪瘑鏂囨湰鍚庯紝鏌ユ壘鍒版爣璇嗘墍鍦╠elta浣嶇疆鐨勭储寮�
+ * 娉細鍥犱负鍋氫簡涓�娆nsertText鎿嶄綔锛屾墍鏈夊彲鑳戒細鏈塴inkFlag鏍囪瘑瀛楁牱闂竴涓嬬殑鍓綔鐢紝娌℃湁鍔炴硶閬垮厤
+ */
+export const linkFlag = '馃敆娣诲姞閾炬帴涓�, 璇风◢鍚�...馃敆' // 寤鸿璇箟鍖栬鏍囪瘑锛屽惁鍒欓棯鐑佺殑鏃跺�欏彲鑳戒細鏈夌偣灏村艾
+/**
+ * 鎻掑叆閾炬帴
+ * @description uni-editor鏆備笉鏀寔鎻掑叆閾炬帴锛屾api浣跨敤delta鏇挎崲閾炬帴鏈枃鏍囪瘑鏂瑰紡瀹炵幇锛屽洜纭�у師鍥犱細瀵艰嚧鍏夋爣澶辩劍
+ * @param {Object} editorCtx 缂栬緫鍣ㄤ笂涓嬫枃
+ * @param {Object} attr 閾炬帴灞炴��
+ * @property {String} attr.link 閾炬帴鍦板潃 娉細涓存椂鍦板潃浼氳嚜鍔ㄨ浆鎴恆bout:blank瀵艰嚧鏃犳晥
+ * @property {String} attr.text 閾炬帴鏂囨湰 绌虹己鏃朵娇鐢╨ink
+ * @property {String} attr.textDecoration 涓嬪垝绾�
+ * @property {String} attr.color 棰滆壊 榛樿#007aff
+ * @property {Object} attr.style 鍏朵粬鏍峰紡锛屼緥濡� { bold: true, italic: true } 绛夛紝璇﹁锛歨ttps://quilljs.com/docs/delta
+ * @param {Object} callback 鎴愬姛鍥炶皟
+ */
+export function insertLink(editorCtx, attr, callback) {
+  // 鍏堟彃鍏ヤ竴娈垫枃鏈唴瀹�
+  editorCtx.insertText({ text: linkFlag })
+  // 蹇呴』鍏堝け鐒︼紝鍚﹀垯鍏夋爣浼氱Щ鑷冲紑濮嬩綅缃�
+  editorCtx.blur()
+  // 鑾峰彇鍏ㄦ枃delta鍐呭
+  editorCtx.getContents({
+    success: (res) => {
+      let options = res.delta.ops
+      const findex = options.findIndex(item => {
+        return item.insert && typeof item.insert !== 'object' && item.insert?.indexOf(linkFlag) !== -1
+      })
+      // 鏍规嵁鏍囪瘑鏌ユ壘鍒版彃鍏ョ殑浣嶇疆
+      if (findex > -1) {
+        const findOption = options[findex]
+        const findAttributes = findOption.attributes
+        // 灏嗚findOption鍒嗘垚涓夐儴鍒嗭細鍓嶅唴瀹� 瑕佹彃鍏ョ殑link 鍚庡唴瀹�
+        const [prefix, suffix] = findOption.insert.split(linkFlag);
+        const handleOps = []
+        // 鍓嶅唴瀹�
+        if (prefix) {
+          const prefixOps = findAttributes ? {
+            insert: prefix,
+            attributes: findAttributes
+          } : {
+            insert: prefix
+          }
+          handleOps.push(prefixOps)
+        }
+        // 鎻掑叆鐨刲ink
+        const linkOps = {
+          insert: attr.text || attr.link,
+          attributes: {
+            link: attr.link,
+            textDecoration: attr.textDecoration || 'none', // 涓嬪垝绾�
+            color: attr.color || '#007aff',
+            ...attr.style
+          }
+        }
+        handleOps.push(linkOps)
+        // 鍚庡唴瀹�
+        if (suffix) {
+          const suffixOps = findAttributes ? {
+            insert: suffix,
+            attributes: findAttributes
+          } : {
+            insert: suffix
+          }
+          handleOps.push(suffixOps)
+        }
+        // 鍒犻櫎鍘無ptions[findex]骞跺湪findex浣嶇疆鎻掑叆涓婅堪涓変釜ops
+        options.splice(findex, 1);
+        options.splice(findex, 0, ...handleOps);
+        // 鏈�鍚庨噸鏂板垵濮嬪寲鍐呭
+        editorCtx.setContents({
+          delta: {
+            ops: options
+          }
+        })
+        // 娓呴櫎鏍煎紡锛屼互闃叉畫鐣欒秴閾炬帴鏍煎紡
+        editorCtx.removeFormat()
+        editorCtx.format('color', 'inherit')
+
+        // 鍚庣画鍥炶皟鎿嶄綔
+        if (callback) callback()
+      }
+    }
+  })
+}
+
+
+/**
+ * 灏介噺娑堥櫎閿洏甯︽潵鐨勫奖鍝嶏紱閲嶈锛氭牳蹇冨姛鑳斤紒锛侊紒
+ * @param {Function} callback 鍥炶皟
+ * @param {Object} options 閰嶇疆椤�
+ * @property {String} options.mode 鍙�夛細setInputMode锛氶�氳繃鎺у埗ql-editor鐨刬nputmode灞炴�ф帶鍒堕敭鐩� [H5 APP] | loseFocus锛氶�氳繃blur澶辩劍闅愯棌閿洏 [MP-WEIXIN] | hideKeyboard锛氶�氳繃hideKeyboard闅愯棌閿洏 | setReadOnly锛氶�氳繃鎺у埗璇诲啓闅愯棌閿洏
+ * @property {Number} options.delay 寤舵椂锛堟绉掞級榛樿50
+ */
+export function noKeyboardEffect(callback, options) {
+  let defaultOpt = { delay: 50 }
+
+  // #ifdef APP  
+  const isIOS = uni.getSystemInfoSync().platform == 'ios'
+  defaultOpt.mode = isIOS ? 'loseFocus' : 'setInputMode' // iOS浣跨敤setInputMode鏃犳晥
+  // #endif
+
+  // #ifdef H5
+  defaultOpt.mode = 'setInputMode'
+  // #endif
+
+  // #ifdef MP-WEIXIN
+  defaultOpt.mode = 'loseFocus'
+  // #endif
+
+  const opt = Object.assign(defaultOpt, options)
+
+  const eid = store.actions.getEID()
+  const editorCtx = store.actions.getEditor(eid)
+
+  // 閫氳繃 uni.hideKeyboard() 闅愯棌閿洏锛屼絾鏄細瀵艰嚧閿洏闂儊
+  // 寰俊灏忕▼搴忓ソ鍍忔棤娉曟甯搁殣钘忛敭鐩�
+  if (opt.mode == 'hideKeyboard') {
+    callback()
+    setTimeout(() => {
+      uni.hideKeyboard()
+    }, opt.delay)
+  }
+
+  // 閫氳繃鎺у埗缂栬緫鍣ㄥけ鐒︽潵闅愯棌閿洏锛屼絾鏄細瀵艰嚧閿洏闂儊
+  // 鍙帹鑽愬井淇″皬绋嬪簭浣跨敤锛堜篃鏄棤鍙浣曪級
+  if (opt.mode == 'loseFocus') {
+    callback()
+    editorCtx.blur()
+  }
+
+  // 閫氳繃鎺у埗缂栬緫鍣ㄨ鍐欐ā寮忚繘琛屽睆钄界劍鐐癸紝铏界劧闅愯棌浜嗛敭鐩橈紝浣嗘槸涔熷け鐒︿簡
+  // 寰俊灏忕▼搴忎腑褰撳彧璇绘椂鏄棤娉曚娇鐢╝pi鍘讳慨鏀瑰唴瀹圭殑
+  if (opt.mode == 'setReadOnly') {
+    store.actions.setReadOnly(true)
+    callback()
+    setTimeout(() => {
+      store.actions.setReadOnly(false)
+    }, opt.delay)
+  }
+
+  // 浣跨敤renderjs缁檘l-editor鑺傜偣璁剧疆inputmode灞炴�ф潵鎺у埗閿洏鏄惁寮瑰嚭
+  // 璁剧疆none鏃跺皢浼氶樆姝㈤敭鐩樺脊鍑猴紝璁剧疆remove灏嗕細鎭㈠锛屽畬缇庨�傞厤H5銆丄pp(Android)锛屼絾鏄笉鏀寔App(iOS)鍜屽井淇″皬绋嬪簭
+  if (opt.mode == 'setInputMode') {
+    // #ifdef APP || H5
+    // 浠ヤ笅涓ユ牸澶勭悊寮傛涓庡欢鏃舵搷浣滐紝缂轰竴涓嶅彲
+    editorCtx.changeInputMode('none')
+    setTimeout(() => {
+      callback()
+      setTimeout(() => {
+        editorCtx.changeInputMode('remove')
+      }, opt.delay)
+    }, opt.delay)
+    // #endif
+  }
+}
+
+/**
+ * 鐗堟潈淇℃伅
+ */
+import packageConfig from '../../package.json'
+export function copyrightPrint() {
+  /* 鏍囬鏍峰紡 */
+  const styleTitle1 = `font-size:16px;font-weight:700;color:#ff4500;`
+  const styleTitle2 = `font-style:oblique;font-size:14px;color:#fb7299;`
+  const styleContent = `color:#66ccff;`
+  /* 鐗堟潈淇℃伅 */
+  const title1 = ` 馃摑 sv-editor v${packageConfig.version} `
+  const title2 = 'by Sonve'
+  const content = `
+  鐗堟潈澹版槑锛�
+  1. 鏈彃浠跺厤璐瑰紑婧愶紝杩樻湜淇濈暀姝ょ増鏉冨0鏄庡湪鎺у埗鍙拌緭鍑�
+  2. 濡傞渶鍊熼壌婧愮爜锛岃繕鏈涙敞鏄庡嚭澶�
+  3. 鏈粡鎺堟潈鎮ㄤ笉寰椾互浠讳綍褰㈠紡杞浇銆佸敭鍗栨湰鎻掍欢锛屾垨浠ュ叾浠栧舰寮忎镜鐘増鏉冨強闄勫睘鏉冨埄
+  4. 浣滆�呭皢淇濈暀瀵规鎻掍欢鐗堟潈淇℃伅鐨勬渶缁堣В閲婃潈
+  馃彔 鍦板潃: https://ext.dcloud.net.cn/plugin?id=21184
+  馃樃 Gitee: https://gitee.com/Sonve/sv-editor
+  馃挰 寰俊: s1051399604
+  馃惂 QQ缇�: 鈶� 852637893 鈶� 816646292
+  `
+  console.log(`%c${title1}%c${title2}%c${content}`, styleTitle1, styleTitle2, styleContent)
+}
+
+export function noAuthorization(name) {
+  /* 鏍囬鏍峰紡 */
+  const styleTitle1 = `font-size:16px;font-weight:700;color:#e6a23c;`
+  const styleTitle2 = `font-style:oblique;font-size:14px;color:#fb7299;`
+  const styleContent = `color:#f56c6c;`
+  /* 鎺堟潈淇℃伅 */
+  const title1 = ` 鉀� sv-editor ${name} `
+  const title2 = 'by Sonve'
+  const content = `
+  鎻愮ず锛氭偍杩樻湭鑾峰彇鎻掍欢鐗规畩鎵╁睍鍔熻兘鎺堟潈锛屽彲鑱旂郴浣滆�呰幏鍙�
+  馃挰 寰俊: s1051399604 | 馃惂 QQ缇�: 鈶� 852637893 鈶� 816646292
+  馃彔 鎻掍欢鍦板潃: https://ext.dcloud.net.cn/plugin?id=21184
+  `
+  console.log(`%c${title1}%c${title2}%c${content}`, styleTitle1, styleTitle2, styleContent)
+}
\ No newline at end of file
diff --git a/uni_modules/sv-editor/components/icons/iconfont.css b/uni_modules/sv-editor/components/icons/iconfont.css
new file mode 100644
index 0000000..a6d4267
--- /dev/null
+++ b/uni_modules/sv-editor/components/icons/iconfont.css
@@ -0,0 +1,233 @@
+@font-face {
+  font-family: "iconfont";
+  /* 鍦╲ue2涓洿鎺ヤ娇鐢� ./iconfont.ttf 浼氭壘涓嶅埌鏂囦欢锛屽緢鍧戯紝闇�瑕佽繑鍥炰笂涓�绾у啀鐐瑰洖鏉� */
+  src: url('../icons/iconfont.ttf') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-zitishangbiao:before {
+  content: "\e8e5";
+}
+
+.icon-ziti-xiabiao:before {
+  content: "\e8ea";
+}
+
+.icon-yousuojin:before {
+  content: "\e6f0";
+}
+
+.icon-zuosuojin:before {
+  content: "\e6f1";
+}
+
+.icon-wenziyanse:before {
+  content: "\e60b";
+}
+
+.icon-beijingyanse:before {
+  content: "\e634";
+}
+
+.icon-qingchugeshi:before {
+  content: "\e6f5";
+}
+
+.icon-tuige:before {
+  content: "\e61a";
+}
+
+.icon-xiajiantou:before {
+  content: "\eb6d";
+}
+
+.icon-shangjiantou:before {
+  content: "\eb6e";
+}
+
+.icon-huati:before {
+  content: "\e659";
+}
+
+.icon-video:before {
+  content: "\e60a";
+}
+
+.icon-jianpan:before {
+  content: "\e636";
+}
+
+.icon-at:before {
+  content: "\e81e";
+}
+
+.icon-bianji:before {
+  content: "\eb61";
+}
+
+.icon-icon_tianjia:before {
+  content: "\eb89";
+}
+
+.icon-xingzhuang-tupian:before {
+  content: "\eb98";
+}
+
+.icon-xingzhuang-wenzi:before {
+  content: "\eb99";
+}
+
+.icon-huixingzhen:before {
+  content: "\ebe6";
+}
+
+.icon-xiayibu:before {
+  content: "\ebef";
+}
+
+.icon-shangyibu:before {
+  content: "\ebf0";
+}
+
+.icon-baocun:before {
+  content: "\ec09";
+}
+
+.icon-xiayibu1:before {
+  content: "\ec0a";
+}
+
+.icon-shangyibu1:before {
+  content: "\ec0b";
+}
+
+.icon-weizhigeshi:before {
+  content: "\ec1a";
+}
+
+.icon-chehuisekuai:before {
+  content: "\ec45";
+}
+
+.icon-shexiangji:before {
+  content: "\ec59";
+}
+
+.icon-fuzhi:before {
+  content: "\ec7a";
+}
+
+.icon-shanchu:before {
+  content: "\ec7b";
+}
+
+.icon-bianjisekuai:before {
+  content: "\ec7c";
+}
+
+.icon-fengexian:before {
+  content: "\ec7f";
+}
+
+.icon-charulianjie:before {
+  content: "\ec80";
+}
+
+.icon-charutupian:before {
+  content: "\ec81";
+}
+
+.icon-quxiaolianjie:before {
+  content: "\ec82";
+}
+
+.icon-wuxupailie:before {
+  content: "\ec83";
+}
+
+.icon-juzhongduiqi:before {
+  content: "\ec84";
+}
+
+.icon-yinyong:before {
+  content: "\ec85";
+}
+
+.icon-youxupailie:before {
+  content: "\ec86";
+}
+
+.icon-youduiqi:before {
+  content: "\ec87";
+}
+
+.icon-zitidaima:before {
+  content: "\ec88";
+}
+
+.icon-xiaolian:before {
+  content: "\ec89";
+}
+
+.icon-zitijiacu:before {
+  content: "\ec8a";
+}
+
+.icon-zitishanchuxian:before {
+  content: "\ec8b";
+}
+
+.icon-zitibiaoti:before {
+  content: "\ec8c";
+}
+
+.icon-zitixiahuaxian:before {
+  content: "\ec8d";
+}
+
+.icon-zitixieti:before {
+  content: "\ec8e";
+}
+
+.icon-zitiyanse:before {
+  content: "\ec8f";
+}
+
+.icon-zuoduiqi:before {
+  content: "\ec90";
+}
+
+.icon-zuoyouduiqi:before {
+  content: "\ec91";
+}
+
+.icon-tianxie:before {
+  content: "\ec92";
+}
+
+.icon-kongxinwenhao:before {
+  content: "\ed19";
+}
+
+.icon-fangkuai:before {
+  content: "\ed1a";
+}
+
+.icon-jia_sekuai:before {
+  content: "\ed21";
+}
+
+.icon-jian_sekuai:before {
+  content: "\ed22";
+}
+
+.icon-fenxiangfangshi:before {
+  content: "\ed2e";
+}
\ No newline at end of file
diff --git a/uni_modules/sv-editor/components/icons/iconfont.ttf b/uni_modules/sv-editor/components/icons/iconfont.ttf
new file mode 100644
index 0000000..0000849
--- /dev/null
+++ b/uni_modules/sv-editor/components/icons/iconfont.ttf
Binary files differ
diff --git a/uni_modules/sv-editor/components/plugins/sv-editor-plugin.vue b/uni_modules/sv-editor/components/plugins/sv-editor-plugin.vue
new file mode 100644
index 0000000..fd7efa5
--- /dev/null
+++ b/uni_modules/sv-editor/components/plugins/sv-editor-plugin.vue
@@ -0,0 +1,52 @@
+<template></template>
+
+<script>
+/**
+ * 瀵屾枃鏈琾lugin鐗规畩鎵╁睍
+ * @author sonve
+ * @version 1.0.0
+ * @date 2024-12-14
+ */
+
+import config from '../common/config'
+import { noAuthorization } from '../common/utils'
+
+export default {
+  props: {
+    sid: {
+      type: String,
+      default: ''
+    },
+    eid: {
+      type: String,
+      default: ''
+    }
+  },
+  data() {
+    return {}
+  },
+  mounted() {},
+  methods: {
+    changePasteMode(e) {
+      return e
+    },
+    editorPaste(e) {
+      this.$emit('epaste', e)
+    },
+    createVideoThumbnail(url) {
+      noAuthorization('createVideoThumbnail')
+      this.getVideoThumbnail(url)
+    },
+    getVideoThumbnail(e) {
+      uni.$emit(`E_EDITOR_GET_VIDEO_THUMBNAIL_${e}`, config.video_thumbnail)
+    },
+    createCoverThumbnail(url) {
+      noAuthorization('createCoverThumbnail')
+      this.getCoverThumbnail(url)
+    },
+    getCoverThumbnail(e) {
+      uni.$emit(`E_EDITOR_GET_COVER_THUMBNAIL_${e}`, e)
+    }
+  }
+}
+</script>
diff --git a/uni_modules/sv-editor/components/plugins/sv-editor-wxplugin.js b/uni_modules/sv-editor/components/plugins/sv-editor-wxplugin.js
new file mode 100644
index 0000000..051b22e
--- /dev/null
+++ b/uni_modules/sv-editor/components/plugins/sv-editor-wxplugin.js
@@ -0,0 +1,10 @@
+import { noAuthorization } from "../common/utils"
+
+export function wxCreateCoverThumbnail(url) {
+  noAuthorization('wxCreateCoverThumbnail')
+  return url
+}
+
+export default {
+  wxCreateCoverThumbnail
+}
\ No newline at end of file
diff --git a/uni_modules/sv-editor/components/sv-editor/sv-choose-file.vue b/uni_modules/sv-editor/components/sv-editor/sv-choose-file.vue
new file mode 100644
index 0000000..52701c1
--- /dev/null
+++ b/uni_modules/sv-editor/components/sv-editor/sv-choose-file.vue
@@ -0,0 +1,122 @@
+<template>
+  <text :data="flag" :props="config" :change:data="fileManager.watchData" :change:props="fileManager.watchProps"></text>
+</template>
+
+<script>
+/**
+ * 鏂囦欢閫夋嫨 - APP绔�
+ * @author sonve
+ * @version 1.0.0
+ * @date 2024-12-04
+ */
+
+export default {
+  props: {
+    /**
+     * 閰嶇疆椤�
+     * @tutorial https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/input/file
+     */
+    config: {
+      type: Object,
+      default: () => {
+        return {
+          accept: `.doc,.docx,.xls,.xlsx,.pdf,.zip,.rar,
+          application/msword,
+          application/vnd.openxmlformats-officedocument.wordprocessingml.document,
+          application/vnd.ms-excel,
+          application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,
+          application/pdf,
+          application/zip,
+          application/x-rar-compressed`,
+          multiple: false
+        }
+      }
+    }
+  },
+  data() {
+    return {
+      flag: 0 // 鐩戝惉鏍囧織
+    }
+  },
+  methods: {
+    chooseFile() {
+      this.flag++ // 淇敼鐩戝惉鏍囧織
+    },
+    rawFile(file) {
+      this.$emit('confirm', file)
+    }
+  }
+}
+</script>
+
+<script module="fileManager" lang="renderjs">
+import { base64ToPath } from '../common/file-handler.js';
+export default {
+  data() {
+    return {
+      configCopy: {}, // 璺熼殢vue涓璸rops鐨勯厤缃�
+    }
+  },
+  methods: {
+    watchData(newValue, oldValue, ownerInstance, instance) {
+      if (newValue) {
+        this.openFileManager()
+      }
+    },
+    watchProps(newValue, oldValue, ownerInstance, instance) {
+      if (newValue) {
+        this.configCopy = newValue
+      }
+    },
+    openFileManager() {
+      try {
+        const { accept, multiple } = this.configCopy
+        // 鍒涘缓鏂囦欢閫夋嫨鍣╥nput
+        let fileInput = document.createElement('input')
+        fileInput.setAttribute('type', 'file')
+        fileInput.setAttribute('accept', accept)
+        // 娉細鏄惁澶氶�変笉瑕佺洿鎺ヨ祴鍊糾ultiple锛屽簲褰撴槸涓篺alse鏃朵笉娣诲姞multiple灞炴��
+        if(multiple) fileInput.setAttribute('multiple', multiple)
+        fileInput.click()
+
+        // 灏佽涓篜romise鐨凢ileReader璇诲彇鏂囦欢
+        const readFileAsDataURL = (file) => {
+          return new Promise((resolve, reject) => {
+            let reader = new FileReader();
+            reader.readAsDataURL(file);
+
+            reader.onload = async (event) => {
+              const base64 = event.target.result
+              const path = await base64ToPath(base64)
+              resolve({
+                name: file.name,
+                type: file.type,
+                size: file.size,
+                base64,
+                path
+              });
+            };
+            reader.onerror = (error) => {
+              reject(error);
+            };
+          });
+        }
+
+        fileInput.addEventListener('change', async (e) => {
+          let files = e.target.files // 娉細姝ゅ涓篎ileList瀵硅薄锛屽苟闈炲父瑙勬暟缁�
+
+          let results = await Promise.all(
+            // Array.from 鏂规硶鍙互灏嗙被鏁扮粍瀵硅薄杞崲涓虹湡姝g殑鏁扮粍
+            Array.from(files).map(item => readFileAsDataURL(item))
+          );
+
+          // callMethod涓嶆敮鎸佹祦鏁版嵁锛屾棤娉曠洿鎺ヤ紶閫掓枃浠舵祦瀵硅薄
+          this.$ownerInstance.callMethod('rawFile', results)
+        })
+      } catch (err) {
+        console.warn('==== openFileManager catch error :', err);
+      }
+    }
+  }
+}
+</script>
diff --git a/uni_modules/sv-editor/components/sv-editor/sv-editor-colorpicker.vue b/uni_modules/sv-editor/components/sv-editor/sv-editor-colorpicker.vue
new file mode 100644
index 0000000..c8f260b
--- /dev/null
+++ b/uni_modules/sv-editor/components/sv-editor/sv-editor-colorpicker.vue
@@ -0,0 +1,178 @@
+<template>
+  <view @touchmove.stop.prevent="moveStop">
+    <view class="sv-editor-colorpicker" v-if="showPicker">
+      <view class="editor-popup-header">
+        <!-- <view class="header-left" @click="cancel">鍙栨秷</view> -->
+        <view class="header-left" @click="reset">閲嶇疆</view>
+        <view class="header-title" :style="{ backgroundColor: selectColor }" v-if="selectColor">{{ selectColor }}</view>
+        <view class="header-right" @click="confirm">纭</view>
+      </view>
+      <view class="sv-editor-colorpicker-container">
+        <view
+          v-for="item in allColors"
+          :key="item"
+          class="color-item"
+          :style="{ backgroundColor: item }"
+          @click="onSelect(item)"
+        ></view>
+      </view>
+    </view>
+    <view class="mask" v-if="showPicker" @click.stop="onMask"></view>
+  </view>
+</template>
+
+<script>
+import { colorList } from '../common/tool-list'
+
+export default {
+  name: 'sv-editor-colorpicker',
+  props: {
+    show: {
+      type: Boolean,
+      default: false
+    },
+    color: {
+      type: String,
+      default: ''
+    },
+    type: {
+      type: String,
+      default: 'color'
+    },
+    // 鐐瑰嚮閬僵灞傝嚜鍔ㄥ叧闂脊绐�
+    maskClose: {
+      type: Boolean,
+      default: true
+    }
+  },
+  emits: ['update:show', 'open', 'close', 'onMask', 'cancel', 'confirm'],
+  // #ifdef VUE2
+  model: {
+    prop: 'show',
+    event: 'update:show'
+  },
+  // #endif
+  data() {
+    return {
+      selectColor: this.color
+    }
+  },
+  watch: {
+    color(newVal) {
+      this.selectColor = newVal
+    }
+  },
+  computed: {
+    showPicker: {
+      set(newVal) {
+        this.$emit('update:show', newVal)
+      },
+      get() {
+        return this.show
+      }
+    },
+    allColors() {
+      return colorList
+    }
+  },
+  methods: {
+    // 闃绘婊戝姩绌块��
+    moveStop() {},
+    open() {
+      this.showPicker = true
+      this.$emit('open')
+    },
+    close() {
+      this.showPicker = false
+      this.$emit('close')
+    },
+    onMask() {
+      if (this.maskClose) this.close()
+      this.$emit('onMask')
+    },
+    cancel() {
+      this.$emit('cancel')
+      this.close()
+    },
+    confirm() {
+      this.$emit('confirm', this.selectColor, this.type)
+    },
+    reset() {
+      this.selectColor = ''
+    },
+    onSelect(e) {
+      this.selectColor = e
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+.sv-editor-colorpicker {
+  --editor-colorpicker-bgcolor: #ffffff;
+  --editor-colorpicker-radius: 30rpx 30rpx 0 0;
+  --editor-colorpicker-confirm: #4d80f0;
+  --editor-colorpicker-cancel: #fa4350;
+  --editor-colorpicker-header-height: 50rpx;
+
+  width: 100%;
+  position: absolute;
+  bottom: 0;
+  z-index: 10000;
+  border-radius: var(--editor-colorpicker-radius);
+  padding: 30rpx;
+  padding-bottom: calc(30rpx + env(safe-area-inset-bottom));
+  background-color: var(--editor-colorpicker-bgcolor);
+  box-sizing: border-box;
+
+  .editor-popup-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 30rpx;
+    box-sizing: border-box;
+    height: var(--editor-colorpicker-header-height);
+
+    .header-left {
+      color: var(--editor-colorpicker-cancel);
+    }
+    .header-title {
+      color: #000000;
+      text-shadow: 1rpx 1rpx #ffffff, -1rpx 1rpx #ffffff, 1rpx -1rpx #ffffff, -1rpx -1rpx #ffffff;
+      padding: 4rpx 12rpx;
+      box-shadow: 0 0 8rpx #cccccc;
+      border-radius: 10rpx;
+    }
+    .header-right {
+      color: var(--editor-colorpicker-confirm);
+    }
+  }
+
+  .sv-editor-colorpicker-container {
+    // max-height: 40vh;
+    overflow: auto;
+    display: grid;
+    grid-template-columns: repeat(8, 1fr);
+    align-items: center; /* 鍨傜洿灞呬腑 */
+    justify-items: center; /* 姘村钩灞呬腑 */
+    gap: 20rpx;
+    box-sizing: border-box;
+
+    .color-item {
+      width: 100%;
+      height: 60rpx;
+      box-shadow: 0 0 8rpx #ccc;
+      border-radius: 10rpx;
+    }
+  }
+}
+.mask {
+  width: 100%;
+  height: 100%;
+  position: fixed;
+  top: 0;
+  left: 0;
+  z-index: 9999;
+  background-color: rgba(0, 0, 0, 0.5);
+}
+</style>
diff --git a/uni_modules/sv-editor/components/sv-editor/sv-editor-popup-more.vue b/uni_modules/sv-editor/components/sv-editor/sv-editor-popup-more.vue
new file mode 100644
index 0000000..2ff4462
--- /dev/null
+++ b/uni_modules/sv-editor/components/sv-editor/sv-editor-popup-more.vue
@@ -0,0 +1,445 @@
+<template>
+  <view @touchmove.stop.prevent="moveStop">
+    <view class="sv-editor-popup" v-if="showPop">
+      <view class="editor-popup-header">
+        <view class="header-left" @click="cancel">鍙栨秷</view>
+        <view class="header-title">{{ title }}</view>
+        <view class="header-right" @click="confirm">纭</view>
+      </view>
+      <view class="sv-editor-popup-container">
+        <!-- 娣诲姞鍥剧墖 -->
+        <view class="popup-image" v-if="toolName == 'image'">
+          <view class="popup-form-input">
+            <text class="form-label">缃戠粶鍥剧墖</text>
+            <input v-model="imageForm.link" type="text" class="form-input" placeholder="璇疯緭鍏ュ浘鐗囧湴鍧�" />
+          </view>
+          <view class="popup-form-input">
+            <text class="form-label">鏈湴鍥剧墖</text>
+            <button size="mini" class="form-button" @click="selectImage">閫夋嫨鏂囦欢</button>
+            <view class="form-thumbnail">
+              <image
+                class="form-thumbnail-item form-thumbnail-image"
+                v-for="(item, index) in imageForm.file"
+                :key="item.path"
+                :src="item.path"
+                @click="deleteImage(index)"
+              ></image>
+            </view>
+          </view>
+        </view>
+        <!-- 娣诲姞瑙嗛 -->
+        <view class="popup-video" v-if="toolName == 'video'">
+          <view class="popup-form-input">
+            <text class="form-label">缃戠粶瑙嗛</text>
+            <input v-model="videoForm.link" type="text" class="form-input" placeholder="璇疯緭鍏ヨ棰戝湴鍧�" />
+          </view>
+          <view class="popup-form-input">
+            <text class="form-label">鏈湴瑙嗛</text>
+            <button size="mini" class="form-button" @click="selectVideo">閫夋嫨鏂囦欢</button>
+            <view class="form-thumbnail" v-if="videoForm.file.tempFilePath">
+              <view class="form-thumbnail-item form-thumbnail-icon" @click="deleteVideo">
+                <text class="iconfont icon-video"></text>
+              </view>
+            </view>
+          </view>
+        </view>
+        <!-- 娣诲姞閾炬帴 -->
+        <view class="popup-link" v-if="toolName == 'link'">
+          <view class="popup-form-input">
+            <text class="form-label">閾炬帴鍦板潃</text>
+            <input v-model="linkForm.link" type="text" class="form-input" placeholder="璇疯緭鍏ラ摼鎺ュ湴鍧� (蹇呭~)" />
+          </view>
+          <view class="popup-form-input">
+            <text class="form-label">閾炬帴鏂囨湰</text>
+            <input v-model="linkForm.text" type="text" class="form-input" placeholder="璇疯緭鍏ラ摼鎺ユ枃鏈� (鍙��)" />
+          </view>
+        </view>
+        <!-- 娣诲姞闄勪欢 -->
+        <view class="popup-attachment" v-if="toolName == 'attachment'">
+          <view class="popup-form-input">
+            <text class="form-label">闄勪欢鍦板潃</text>
+            <input v-model="attachmentForm.link" type="text" class="form-input" placeholder="璇疯緭鍏ラ檮浠跺湴鍧�" />
+          </view>
+          <view class="popup-form-input">
+            <text class="form-label">闄勪欢鎻忚堪</text>
+            <input v-model="attachmentForm.text" type="text" class="form-input" placeholder="璇疯緭鍏ラ檮浠舵弿杩�" />
+          </view>
+          <view class="popup-form-input">
+            <text class="form-label">鏈湴鏂囦欢</text>
+            <button size="mini" class="form-button" @click="selectAttachment">閫夋嫨鏂囦欢</button>
+            <view class="form-thumbnail" v-if="attachmentForm.file.path">
+              <view class="form-thumbnail-item form-thumbnail-icon" @click="deleteAttachment">
+                <text class="iconfont icon-huixingzhen"></text>
+              </view>
+            </view>
+          </view>
+        </view>
+        <!-- 鎻愬強 -->
+        <view class="popup-at" v-if="toolName == 'at'">
+          <slot name="at"></slot>
+        </view>
+        <!-- 璇濋 -->
+        <view class="popup-topic" v-if="toolName == 'topic'">
+          <slot name="topic"></slot>
+        </view>
+      </view>
+    </view>
+    <view class="mask" v-if="showPop" @click.stop="onMask"></view>
+    <!-- #ifdef APP -->
+    <sv-choose-file ref="chooseFileRef" @confirm="selectAppFile"></sv-choose-file>
+    <!-- #endif -->
+  </view>
+</template>
+
+<script>
+/**
+ * 鎵╁睍宸ュ叿闈㈡澘寮圭獥
+ * @author sonve
+ * @version 1.0.0
+ * @date 2024-12-04
+ */
+
+import { moreToolList } from '../common/tool-list.js'
+import SvChooseFile from './sv-choose-file.vue'
+
+export default {
+  name: 'sv-editor-popup-more',
+  // #ifdef MP-WEIXIN
+  // 寰俊灏忕▼搴忕壒娈婇厤缃�
+  options: {
+    addGlobalClass: true,
+    virtualHost: true,
+    styleIsolation: 'shared'
+  },
+  // #endif
+  components: {
+    SvChooseFile
+  },
+  props: {
+    show: {
+      type: Boolean,
+      default: false
+    },
+    toolName: {
+      type: [String, null],
+      default: 'image'
+    },
+    // 鐐瑰嚮閬僵灞傝嚜鍔ㄥ叧闂脊绐�
+    maskClose: {
+      type: Boolean,
+      default: true
+    }
+  },
+  emits: ['update:show', 'open', 'close', 'onMask', 'cancel', 'confirm'],
+  // #ifdef VUE2
+  model: {
+    prop: 'show',
+    event: 'update:show'
+  },
+  // #endif
+  data() {
+    return {
+      imageForm: {
+        link: '',
+        file: []
+      },
+      videoForm: {
+        link: '',
+        file: {}
+      },
+      linkForm: {
+        link: '',
+        text: ''
+      },
+      attachmentForm: {
+        link: '',
+        text: '',
+        file: {}
+      }
+    }
+  },
+  computed: {
+    showPop: {
+      set(newVal) {
+        this.$emit('update:show', newVal)
+      },
+      get() {
+        return this.show
+      }
+    },
+    title() {
+      return moreToolList.find((item) => item.name == this.toolName)?.title
+    }
+  },
+  methods: {
+    // 闃绘婊戝姩绌块��
+    moveStop() {},
+    open() {
+      this.showPop = true
+      this.$emit('open')
+    },
+    close() {
+      this.showPop = false
+      this.$emit('close')
+    },
+    onMask() {
+      if (this.maskClose) this.close()
+      this.$emit('onMask')
+    },
+    cancel() {
+      this.$emit('cancel')
+      this.close()
+    },
+    confirm() {
+      let params = {}
+      params.name = this.toolName
+      switch (this.toolName) {
+        case 'image':
+          Object.assign(params, this.imageForm)
+          break
+        case 'video':
+          Object.assign(params, this.videoForm)
+          break
+        case 'link':
+          Object.assign(params, this.linkForm)
+          break
+        case 'attachment':
+          Object.assign(params, this.attachmentForm)
+          break
+      }
+      this.$emit('confirm', params)
+    },
+    /**
+     * 涓氬姟鏂规硶
+     */
+    // 閫夋嫨鍥剧墖
+    selectImage() {
+      // #ifdef APP || H5
+      uni.chooseImage({
+        count: 5, // 榛樿9锛屾澶勯檺鍒朵负5
+        success: (res) => {
+          this.imageForm.file = res.tempFiles
+        },
+        fail: () => {
+          uni.showToast({
+            title: '鏈巿鏉冭闂浉鍐屾潈闄愶紝璇锋巿鏉冨悗浣跨敤',
+            icon: 'none'
+          })
+        }
+      })
+      // #endif
+
+      // #ifdef MP-WEIXIN
+      uni.chooseMedia({
+        count: 5, // 榛樿9锛屾澶勯檺鍒朵负5
+        mediaType: ['image'],
+        success: (res) => {
+          this.imageForm.file = res.tempFiles
+        },
+        fail: () => {
+          uni.showToast({
+            title: '鏈巿鏉冭闂浉鍐屾潈闄愶紝璇锋巿鏉冨悗浣跨敤',
+            icon: 'none'
+          })
+        }
+      })
+      // #endif
+    },
+    // 鍒犻櫎鎸囧畾鍥剧墖
+    deleteImage(index) {
+      this.imageForm.file.splice(index, 1)
+    },
+    // 閫夋嫨瑙嗛
+    selectVideo() {
+      uni.chooseVideo({
+        sourceType: ['camera', 'album'],
+        success: (res) => {
+          this.videoForm.file = res
+        },
+        fail: () => {
+          uni.showToast({
+            title: '鏈巿鏉冭闂獟浣撴潈闄愶紝璇锋巿鏉冨悗浣跨敤',
+            icon: 'none'
+          })
+        }
+      })
+    },
+    // 鍒犻櫎閫夋嫨鐨勬湰鍦拌棰�
+    deleteVideo() {
+      this.videoForm.file = {}
+    },
+    // 閫夋嫨闄勪欢
+    selectAttachment() {
+      // #ifdef H5
+      uni.chooseFile({
+        count: 1, // 榛樿100锛屾澶勯檺鍒朵负1
+        extension: ['.doc', '.docx', '.xls', '.xlsx', '.pdf', '.zip', '.rar'],
+        success: (res) => {
+          this.attachmentForm.file = res.tempFiles[0]
+        },
+        fail: () => {
+          uni.showToast({
+            title: '鏈巿鏉冭闂枃浠舵潈闄愶紝璇锋巿鏉冨悗浣跨敤',
+            icon: 'none'
+          })
+        }
+      })
+      // #endif
+
+      // #ifdef APP
+      this.$refs.chooseFileRef.chooseFile()
+      // 閫夋嫨鏂囦欢瀹屾垚鍚庤Е鍙憇electAppFile鏂规硶
+      // #endif
+
+      // #ifdef MP-WEIXIN
+      wx.chooseMessageFile({
+        count: 1, // 鏈�澶氬彲浠ラ�夋嫨鐨勬枃浠朵釜鏁帮紝鍙互 0锝�100锛屾澶勯檺鍒朵负1
+        type: 'file', // 鍙互閫夋嫨闄や簡鍥剧墖鍜岃棰戜箣澶栫殑鍏跺畠鐨勬枃浠�
+        extension: ['.doc', '.docx', '.xls', '.xlsx', '.pdf', '.zip', '.rar'],
+        success: (res) => {
+          this.attachmentForm.file = res.tempFiles[0]
+        },
+        fail: () => {
+          uni.showToast({
+            title: '鏈巿鏉冭闂枃浠舵潈闄愶紝璇锋巿鏉冨悗浣跨敤',
+            icon: 'none'
+          })
+        }
+      })
+      // #endif
+    },
+    // 閫夋嫨鏂囦欢瀹屾垚鍚庤Е鍙�
+    selectAppFile(files) {
+      this.attachmentForm.file = files[0]
+    },
+    // 鍒犻櫎鎸囧畾闄勪欢
+    deleteAttachment() {
+      this.attachmentForm.file = {}
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+@import '../icons/iconfont.css';
+
+.sv-editor-popup {
+  --editor-popup-radius: 30rpx 30rpx 0 0;
+  --editor-popup-bgcolor: #ffffff;
+  --editor-popup-confirm: #4d80f0;
+  --editor-popup-cancel: #fa4350;
+  --thumbnail-icon-bgcolor: #cccccc;
+  --editor-popup-header-height: 50rpx;
+
+  width: 100%;
+  position: absolute;
+  bottom: 0;
+  z-index: 10000;
+  border-radius: var(--editor-popup-radius);
+  padding: 30rpx;
+  padding-bottom: calc(30rpx + env(safe-area-inset-bottom));
+  background-color: var(--editor-popup-bgcolor);
+  box-sizing: border-box;
+
+  .editor-popup-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 30rpx;
+    box-sizing: border-box;
+    height: var(--editor-popup-header-height);
+
+    .header-left {
+      color: var(--editor-popup-cancel);
+    }
+    .header-right {
+      color: var(--editor-popup-confirm);
+    }
+  }
+
+  .sv-editor-popup-container {
+    box-sizing: border-box;
+
+    .popup-form-input {
+      display: flex;
+      align-items: center;
+      margin-bottom: 30rpx;
+      box-sizing: border-box;
+
+      .form-label {
+        margin-right: 20rpx;
+        flex-shrink: 0;
+      }
+
+      .form-input {
+        flex: 1;
+        padding: 12rpx;
+        border: 1rpx solid #eeeeee;
+        border-radius: 8rpx;
+        line-height: unset;
+        height: unset;
+        min-height: unset;
+        box-sizing: border-box;
+
+        .uni-input-placeholder {
+          color: #dddddd;
+        }
+      }
+
+      .form-button {
+        margin-left: unset;
+        margin-right: unset;
+      }
+
+      .form-thumbnail {
+        .form-thumbnail-item {
+          width: 25px;
+          height: 25px;
+          margin-left: 20rpx;
+          position: relative;
+          border: 1rpx solid #eeeeee;
+
+          &:active {
+            border-color: #d83b01;
+
+            &::after {
+              content: 'X';
+              font-size: 25px;
+              font-weight: bold;
+              color: #d83b01;
+              width: 100%;
+              height: 100%;
+              position: absolute;
+              top: 0;
+              left: 0;
+              display: flex;
+              align-items: center;
+              justify-content: center;
+            }
+          }
+        }
+
+        .form-thumbnail-image {
+          vertical-align: bottom; // 鍙栨秷image鏍囩搴曢儴鐣欑櫧
+        }
+
+        .form-thumbnail-icon {
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          background-color: var(--form-thumbnail-icon-bgcolor);
+        }
+      }
+    }
+  }
+}
+.mask {
+  width: 100%;
+  height: 100%;
+  position: fixed;
+  top: 0;
+  left: 0;
+  z-index: 9999;
+  background-color: rgba(0, 0, 0, 0.5);
+}
+</style>
diff --git a/uni_modules/sv-editor/components/sv-editor/sv-editor-render.vue b/uni_modules/sv-editor/components/sv-editor/sv-editor-render.vue
new file mode 100644
index 0000000..0bd5bce
--- /dev/null
+++ b/uni_modules/sv-editor/components/sv-editor/sv-editor-render.vue
@@ -0,0 +1,150 @@
+<template>
+	<text
+		:eid="eid"
+		:change:eid="quillEditor.watchEID"
+		:mode="inputmode"
+		:change:mode="quillEditor.watchInputMode"
+		:focus="focusFlag"
+		:change:focus="quillEditor.watchFocus"
+		:backspace="backspaceFlag"
+		:change:backspace="quillEditor.watchBackSpace"
+	></text>
+</template>
+
+<script>
+/**
+ * 瀵屾枃鏈瑀enderjs鎵╁睍
+ * @author sonve
+ * @version 1.0.0
+ * @date 2024-12-04
+ */
+
+export default {
+	props: {
+		eid: {
+			type: String,
+			default: ''
+		}
+	},
+	data() {
+		return {
+			inputmode: '', // none | remove
+			focusFlag: 0, // 涓诲姩鑱氱劍鏍囧織
+			backspaceFlag: 0 // 涓诲姩鍒犻櫎鏍囧織
+		}
+	},
+	methods: {
+		changeInputMode(mode) {
+			this.inputmode = mode
+		},
+		focus() {
+			this.focusFlag++
+		},
+		backspace() {
+			this.backspaceFlag++
+		}
+	}
+}
+</script>
+
+<script module="quillEditor" lang="renderjs">
+export default {
+  data() {
+    return {
+      editorID: ''
+		}
+  },
+  methods: {
+    watchEID(newValue, oldValue, ownerInstance, instance) {
+      if (newValue) {
+        this.editorID = newValue
+      }
+    },
+		watchInputMode(newValue, oldValue, ownerInstance, instance) {
+      if (newValue) {
+        this.changeQuillInputMode(newValue)
+      }
+    },
+    watchFocus(newValue, oldValue, ownerInstance, instance) {
+      if (newValue) {
+        this.changeFocus(newValue)
+      }
+    },
+    watchBackSpace(newValue, oldValue, ownerInstance, instance) {
+      if (newValue) {
+        this.changeBackSpace(newValue)
+      }
+    },
+    /**
+     * 閫氳繃澧炲姞鎴栫Щ鍑篿nputmode灞炴�ф潵鎺у埗鏄惁鍏佽閿洏寮瑰嚭
+     * @param {String} type none | remove
+     * @tutorial https://ask.dcloud.net.cn/article/39915
+     */
+    changeQuillInputMode(type) {
+      try {
+        // 瑕佸叧闂蒋閿洏鐨勮瘽锛岄渶瑕佺粰inputmode灞炴�ц缃畁one
+        // 濡傛灉瑕佹墦寮�杞敭鐩樼殑璇濓紝闇�瑕佺Щ鍑篿nputmode灞炴��
+        const el = document.querySelector(`#${this.editorID} .ql-editor`);
+        if(!el) return console.warn('==== quill dom error ====');
+        if(type == 'none') el.setAttribute('inputmode', 'none')
+        if(type == 'remove') el.removeAttribute('inputmode')
+      } catch (err) {
+        console.warn('==== changeQuillInputMode catch error :', err);
+      }
+    },
+    /**
+     * 閫氳繃quill鑺傜偣瀹炰緥鐨刦ocus鏂规硶鏉ヤ富鍔ㄨЕ鍙戠紪杈戝櫒鑱氱劍
+     */
+    changeFocus() {
+      try {
+        const el = document.querySelector(`#${this.editorID} .ql-editor`);
+        if(!el) return console.warn('==== quill dom error ====');
+        el.focus()
+      } catch (err) {
+        console.warn('==== changeFocus catch error :', err);
+      }
+    },
+    /**
+     * 閫氳繃quill鑺傜偣瀹炰緥鐨刣eleteText鏂规硶鏉ヤ富鍔ㄨЕ鍙戠紪杈戝櫒鍒犻櫎
+     */
+    changeBackSpace() {
+      try {
+        const el = document.querySelector(`#${this.editorID}`);
+        const quill = Quill.find(el);
+        if(!el || !quill) return console.warn('==== quill dom error ====');
+
+        const range = quill.getSelection(); // 鑾峰彇褰撳墠鍏夋爣浣嶇疆
+
+        if (range && range.length === 0) {
+          // 濡傛灉娌℃湁閫変腑鏂囨湰涓斿厜鏍囧瓨鍦紝鍒欏垹闄ゅ墠涓�涓瓧绗︽垨 emoji
+          if (range.index > 0) {
+            // 鑾峰彇鍏夋爣鍓嶇殑鎵�鏈夋枃鏈�
+            const text = quill.getText(0, range.index);
+            // 瑙勮寖鍖� Unicode 瀛楃锛岀‘淇濇纭鐞嗙粍鍚堝瓧绗﹀拰 emoji
+            const normalizedText = text.normalize('NFC');
+            // 灏嗘枃鏈浆鎹负瀛楃鏁扮粍锛岀‘淇濇纭鐞嗗瀛楄妭瀛楃
+            const chars = Array.from(normalizedText);
+            // 璁$畻鍓嶄竴涓瓧绗︾殑绱㈠紩
+            const lastCharIndex = chars.length - 1;
+            if (lastCharIndex >= 0) {
+              // 鍒犻櫎鍓嶄竴涓瓧绗︼紙鍖呮嫭澶氬瓧鑺傚瓧绗︼級
+              const lastChar = chars[lastCharIndex];
+              const lastCharLength = text.slice(-lastChar.length).length;
+              quill.deleteText(range.index - lastCharLength, lastCharLength);
+              quill.setSelection(range.index - lastCharLength); // 鏇存柊鍏夋爣浣嶇疆
+            }
+          }
+        } else if (range && range.length > 0) {
+          // 濡傛灉鏈夐�変腑鏂囨湰锛屽垯鍒犻櫎閫変腑鐨勬枃鏈�
+          quill.deleteText(range.index, range.length);
+          quill.setSelection(range.index); // 鏇存柊鍏夋爣浣嶇疆
+        }
+
+      } catch (err) {
+        console.warn('==== changeBackSpace catch error :', err);
+      }
+    },
+
+  }
+}
+</script>
diff --git a/uni_modules/sv-editor/components/sv-editor/sv-editor-toolbar.vue b/uni_modules/sv-editor/components/sv-editor/sv-editor-toolbar.vue
new file mode 100644
index 0000000..5408d58
--- /dev/null
+++ b/uni_modules/sv-editor/components/sv-editor/sv-editor-toolbar.vue
@@ -0,0 +1,647 @@
+<template>
+  <view class="sv-editor-toolbar">
+    <view class="editor-tools" @tap="onTool">
+      <text
+        v-for="item in allTools"
+        :key="item.title"
+        class="iconfont"
+        :class="item.icon"
+        :data-name="item.name"
+      ></text>
+      <!-- [灞曞紑/鎶樺彔] 涓哄浐瀹氬伐鍏� -->
+      <text v-if="isShowPanel" class="iconfont icon-xiajiantou" data-name="fold" data-value="0"></text>
+      <text v-else class="iconfont icon-shangjiantou" data-name="fold" data-value="1"></text>
+    </view>
+    <!-- 鏍峰紡闈㈡澘 涓嶅缓璁娇鐢� :key="item.name" 鍥犱负 name 鍙兘閲嶅 -->
+    <view class="tool-panel" v-if="curTool == 'style' && isShowPanel">
+      <view class="panel-grid panel-style">
+        <view
+          class="panel-style-item"
+          :class="[(item.value ? formats[item.name] === item.value : formats[item.name]) ? 'ql-active' : '']"
+          :style="{ color: item.name == 'color' ? curTextColor : item.name == 'backgroundColor' ? curBgColor : '' }"
+          v-for="item in allStyleTools"
+          :key="item.title"
+          :title="item.title"
+          :data-name="item.name"
+          :data-value="item.value"
+          @tap="onToolStyleItem"
+        >
+          <text class="iconfont pointer-events-none" :class="item.icon"></text>
+          <text class="tool-item-title pointer-events-none">{{ item.title }}</text>
+        </view>
+      </view>
+    </view>
+    <!-- 琛ㄦ儏闈㈡澘 -->
+    <view class="tool-panel" v-if="curTool == 'emoji' && isShowPanel">
+      <view class="panel-grid panel-emoji">
+        <view
+          class="panel-emoji-item"
+          v-for="item in allEmojiTools"
+          :key="item"
+          :data-name="item"
+          @tap="onToolEmojiItem"
+        >
+          {{ item }}
+        </view>
+      </view>
+      <!-- #ifdef H5 -->
+      <view class="editor-backspace iconfont icon-tuige" @click="onBackSpace"></view>
+      <!-- #endif -->
+      <!-- #ifdef APP -->
+      <view v-if="!isIOS" class="editor-backspace iconfont icon-tuige" @click="onBackSpace"></view>
+      <!-- #endif -->
+    </view>
+    <!-- 鏇村鍔熻兘闈㈡澘 -->
+    <view class="tool-panel" v-if="curTool == 'more' && isShowPanel">
+      <view class="panel-grid panel-more">
+        <view
+          class="panel-more-item"
+          v-for="item in allMoreTools"
+          :key="item.title"
+          :title="item.title"
+          :data-name="item.name"
+          :data-value="item.value"
+          @tap="onToolMoreItem"
+        >
+          <view class="iconfont pointer-events-none" :class="item.icon"></view>
+          <view class="panel-more-item-title pointer-events-none">{{ item.title }}</view>
+        </view>
+      </view>
+    </view>
+    <!-- 鎵╁睍闈㈡澘 -->
+    <view class="tool-panel" v-if="curTool == 'setting' && isShowPanel">
+      <slot name="setting"></slot>
+    </view>
+
+    <!-- 寮圭獥 鍥爒ue2/3鐨剉-model鍐欐硶鏈夊尯鍒紝鏁呴渶瑕佹潯浠剁紪璇戯紝鎴戜篃鏄唹浜� -->
+    <!-- #ifdef VUE3 -->
+    <sv-editor-popup-more v-model:show="showMorePop" :tool-name="curMoreTool" @confirm="moreItemConfirm">
+      <!-- APP绔笉鏀寔寰幆鎻掓Ы锛屾澶勫缓璁尐涓啓 -->
+      <!-- <template v-for="(slot, name) in $slots" #[name]="scope">
+				<slot :name="name" v-bind="scope"></slot>
+			</template> -->
+      <template #at>
+        <slot name="at"></slot>
+      </template>
+      <template #topic>
+        <slot name="topic"></slot>
+      </template>
+    </sv-editor-popup-more>
+    <!-- #endif -->
+
+    <!-- 寮圭獥 鐗瑰埆鏄井淇″皬绋嬪簭绔殑vue2锛屽繀椤讳娇鐢�.sync锛屾湇 -->
+    <!-- #ifdef VUE2 -->
+    <sv-editor-popup-more :show.sync="showMorePop" :tool-name="curMoreTool" @confirm="moreItemConfirm">
+      <template #at>
+        <slot name="at"></slot>
+      </template>
+      <template #topic>
+        <slot name="topic"></slot>
+      </template>
+    </sv-editor-popup-more>
+    <!-- #endif -->
+
+    <!-- 璋冭壊鏉� -->
+    <!-- #ifdef VUE3 -->
+    <sv-editor-colorpicker
+      v-model:show="showColorPicker"
+      :type="colorType"
+      :color="curColor"
+      @confirm="selectColor"
+    ></sv-editor-colorpicker>
+    <!-- #endif -->
+    <!-- #ifdef VUE2 -->
+    <sv-editor-colorpicker
+      :show.sync="showColorPicker"
+      :type="colorType"
+      :color="curColor"
+      @confirm="selectColor"
+    ></sv-editor-colorpicker>
+    <!-- #endif -->
+  </view>
+</template>
+
+<script>
+/**
+ * sv-editor 榛樿宸ュ叿鏍�
+ * @author sonve
+ * @version 1.0.0
+ * @date 2024-12-04
+ */
+
+import store from '../common/store.js'
+import { toolList, emojiToolList, styleToolList, moreToolList } from '../common/tool-list.js'
+import { noKeyboardEffect } from '../common/utils.js'
+import SvEditorPopupMore from './sv-editor-popup-more.vue'
+import SvEditorColorpicker from './sv-editor-colorpicker.vue'
+
+export default {
+  // #ifdef MP-WEIXIN
+  // 寰俊灏忕▼搴忕壒娈婇厤缃�
+  options: {
+    addGlobalClass: true,
+    virtualHost: true,
+    styleIsolation: 'shared'
+  },
+  // #endif
+  components: {
+    SvEditorPopupMore,
+    SvEditorColorpicker
+  },
+  props: {
+    // 宸ュ叿鏍忓垪琛�
+    tools: {
+      type: Array,
+      default: () => {
+        return [] // 绌洪粯璁や负鍏ㄥ垪琛�
+      }
+    },
+    // 鏍峰紡宸ュ叿鍒楄〃
+    styleTools: {
+      type: Array,
+      default: () => {
+        return [] // 绌洪粯璁や负鍏ㄥ垪琛�
+      }
+    },
+    // 鏇村鍔熻兘鍒楄〃
+    moreTools: {
+      type: Array,
+      default: () => {
+        return [] // 绌洪粯璁や负鍏ㄥ垪琛�
+      }
+    }
+  },
+  emits: [
+    'toolMoreItem',
+    'moreItemConfirm',
+    'keyboardChange',
+    'changeMorePop',
+    'changeTool',
+    'tapTool',
+    'tapStyle',
+    'tapEmoji',
+    'backspace'
+  ],
+  data() {
+    return {
+      curTool: '', // 褰撳墠宸ュ叿锛堝ご閮ㄥ伐鍏锋爮锛夐粯璁ょ涓�涓�
+      showPanel: false, // 鏄惁鑳芥樉绀哄伐鍏烽潰鏉匡紝鍖哄埆浜巌sShowPanel
+      showMorePop: false, // 鏄惁寮瑰嚭鏇村鍔熻兘闈㈡澘寮圭獥
+      showColorPicker: false, // 鏄惁寮瑰嚭璋冭壊鏉�
+      curColor: '', // 褰撳墠棰滆壊
+      curTextColor: '', // 褰撳墠鏂囧瓧棰滆壊鏆傚瓨
+      curBgColor: '', // 褰撳墠鑳屾櫙棰滆壊鏆傚瓨
+      colorType: '', // 褰撳墠棰滆壊妯″紡锛屽彲閫� color | backgroundColor
+      curMoreTool: '', // 褰撳墠鎵�閫夌殑鏇村鍔熻兘椤�
+      keyboardHeight: 0 // 閿洏楂樺害
+    }
+  },
+  computed: {
+    isIOS() {
+      return uni.getSystemInfoSync().platform == 'ios'
+    },
+    allTools() {
+      if (this.tools.length == 0) return toolList
+      const indexMap = new Map(this.tools.map((item, index) => [item, index]))
+      const filtered = toolList
+        .filter((item) => indexMap.has(item.name)) // 杩囨护
+        .sort((a, b) => indexMap.get(a.name) - indexMap.get(b.name)) // 鎺掑簭
+      return filtered
+    },
+    allStyleTools() {
+      if (this.styleTools.length == 0) return styleToolList
+      const indexMap = new Map(this.styleTools.map((item, index) => [item, index]))
+      const filtered = styleToolList
+        .filter((item) => indexMap.has(item.name)) // 杩囨护
+        .sort((a, b) => indexMap.get(a.name) - indexMap.get(b.name)) // 鎺掑簭
+      return filtered
+    },
+    allEmojiTools() {
+      return emojiToolList
+    },
+    allMoreTools() {
+      if (this.moreTools.length == 0) return moreToolList
+      const indexMap = new Map(this.moreTools.map((item, index) => [item, index]))
+      const filtered = moreToolList
+        .filter((item) => indexMap.has(item.name)) // 杩囨护
+        .sort((a, b) => indexMap.get(a.name) - indexMap.get(b.name)) // 鎺掑簭
+      return filtered
+    },
+		/**
+		 * 鍦ㄥ井淇″皬绋嬪簭绔殑vue2鐜涓嬫棤娉曠洿鎺ヤ娇鐢ㄨ绠楀睘鎬ц鍙杄ditorCtx
+		 * 涓轰簡缁熶竴鍖栵紝鍙湪鍚勮嚜闇�瑕佷娇鐢ㄧ紪杈戝櫒瀹炰緥鐨勫湴鏂癸紝鎸夐渶閲嶆柊鑾峰彇
+		 */
+    // editorCtx() {
+    //   const eid = store.actions.getEID()
+    //   return store.actions.getEditor(eid)
+    // },
+    formats() {
+      return store.actions.getFormats()
+    },
+    isReadOnly: {
+      set(newVal) {
+        store.actions.setReadOnly(newVal)
+      },
+      get() {
+        return store.actions.getReadOnly()
+      }
+    },
+    isShowPanel() {
+      let show = this.showPanel
+      /**
+       * 瑙勫垯锛�
+       * 1. 褰撻敭鐩樺脊鍑烘椂锛屽繀椤绘姌鍙犻潰鏉�
+       * 2. 褰撶偣鍑绘湁闈㈡澘鐨勫伐鍏锋爮鏃讹紝蹇呴』灞曞紑闈㈡澘
+       * 3. 灞曞紑宸ュ叿鏍忔椂锛屽彲浠ョ偣鍑籪old杩涜灞曞紑鎶樺彔鍒囨崲
+       */
+      if (this.keyboardHeight !== 0) {
+        show = this.showMorePop ? true : false
+      } else {
+        if (!this.curTool) {
+          show = false
+        }
+      }
+      return show
+    }
+  },
+  watch: {
+    curTool(newVal) {
+      this.$emit('changeTool', newVal)
+    }
+  },
+  mounted() {
+    this.curTool = this.allTools[0].name // 褰撳墠宸ュ叿锛堝ご閮ㄥ伐鍏锋爮锛夐粯璁ょ涓�涓�
+
+    uni.$on('E_EDITOR_STATUSCHANGE', (e) => {
+      this.curTextColor = e.detail.color || ''
+      this.curBgColor = e.detail.backgroundColor || ''
+    })
+
+    // #ifndef H5
+    uni.onKeyboardHeightChange(this.keyboardChange)
+    // #endif
+  },
+  destroyed() {
+    // #ifndef H5
+    uni.offKeyboardHeightChange(this.keyboardChange)
+    // #endif
+    uni.$off('E_EDITOR_STATUSCHANGE')
+  },
+  unmounted() {
+    // #ifndef H5
+    uni.offKeyboardHeightChange(this.keyboardChange)
+    // #endif
+    uni.$off('E_EDITOR_STATUSCHANGE')
+  },
+  methods: {
+		getEditorCtx() {
+			const eid = store.actions.getEID()
+			return store.actions.getEditor(eid)
+		},
+    onTool(e) {
+			this.editorCtx = this.getEditorCtx() // 鎸夐渶閲嶆柊鑾峰彇缂栬緫鍣ㄥ疄渚�
+      if (!this.editorCtx) return console.warn('editor is null')
+      const { name, value } = e.target.dataset
+
+      this.$emit('tapTool', { name, value })
+
+      switch (name) {
+        case 'style':
+        case 'emoji':
+        case 'more':
+        case 'setting':
+          this.curTool = name
+          this.showPanel = true
+          break
+        case 'undo':
+          noKeyboardEffect(() => {
+            this.editorCtx.undo()
+          })
+          break
+        case 'redo':
+          noKeyboardEffect(() => {
+            this.editorCtx.redo()
+          })
+          break
+        case 'fold':
+          this.showPanel = value == '1' ? true : false
+          break
+      }
+      // 鐐瑰嚮toolbar闇�瑕佷富鍔ㄨ仛鐒�
+      // #ifdef H5
+      noKeyboardEffect(() => {
+        this.editorCtx.focus()
+      })
+      // #endif
+      // #ifdef APP
+      if (!this.isIOS) {
+        noKeyboardEffect(() => {
+          this.editorCtx.focus()
+        })
+      }
+      // #endif
+    },
+    onToolStyleItem(e) {
+      const { name, value } = e.target.dataset
+      this.$emit('tapStyle', { name, value })
+
+			this.editorCtx = this.getEditorCtx() // 鎸夐渶閲嶆柊鑾峰彇缂栬緫鍣ㄥ疄渚�
+      switch (name) {
+        case 'divider':
+          // 鍒嗗壊绾垮崟鐙娇鐢╥nsertDivider澶勭悊
+          noKeyboardEffect(() => {
+            this.editorCtx.insertDivider()
+          })
+          break
+        case 'color':
+          this.colorType = name
+          this.curColor = this.curTextColor
+          this.showColorPicker = true
+          break
+        case 'backgroundColor':
+          this.colorType = name
+          this.curColor = this.curBgColor
+          this.showColorPicker = true
+          break
+        case 'removeformat':
+          // 娓呴櫎褰撳墠閫夊尯鐨勬牱寮�
+          uni.showModal({
+            title: '绯荤粺鎻愮ず',
+            content: '鏄惁娓呴櫎褰撳墠閫夊尯鏍峰紡',
+            success: ({ confirm }) => {
+              if (confirm) {
+                noKeyboardEffect(() => {
+                  this.editorCtx.removeFormat()
+                })
+              }
+            }
+          })
+          break
+        case 'bold':
+        case 'italic':
+        case 'underline':
+        case 'strike':
+        case 'script':
+          // 閮ㄥ垎鏍煎紡闇�瑕佸脊鍑洪敭鐩橈紝鑻ョ姝㈠脊鍑洪敭鐩橈紝鍒欎細浣挎牸寮忎涪澶�
+          this.editorCtx.format(name, value)
+          break
+        default:
+          noKeyboardEffect(() => {
+            this.editorCtx.format(name, value)
+          })
+          break
+      }
+    },
+    onToolEmojiItem(e) {
+      const { name, value } = e.target.dataset
+
+      this.$emit('tapEmoji', { name, value })
+
+			this.editorCtx = this.getEditorCtx() // 鎸夐渶閲嶆柊鑾峰彇缂栬緫鍣ㄥ疄渚�
+      noKeyboardEffect(() => {
+        this.editorCtx.insertText({
+          text: name
+        })
+      })
+    },
+    onToolMoreItem(e) {
+      const { name, value } = e.target.dataset
+      this.curMoreTool = name
+      if (value == 'popup') this.openMorePop()
+      this.$emit('toolMoreItem', { name, value })
+    },
+    moreItemConfirm(e) {
+      this.$emit('moreItemConfirm', e)
+    },
+    // 鎵撳紑鍐呯疆鏇村鍔熻兘寮圭獥
+    openMorePop() {
+      this.showMorePop = true
+      this.$emit('changeMorePop', this.showMorePop)
+    },
+    // 鍏抽棴鍐呯疆鏇村鍔熻兘寮圭獥
+    closeMorePop() {
+      this.showMorePop = false
+      this.$emit('changeMorePop', this.showMorePop)
+    },
+    /**
+     * 閿洏鐩稿叧鏂规硶
+     */
+    keyboardChange(e) {
+      this.keyboardHeight = e.height
+
+      this.$emit('keyboardChange', e)
+
+      if (this.showMorePop) return
+
+      // #ifdef H5
+      if (this.keyboardHeight > 0) {
+        this.showPanel = false
+      }
+      // #endif
+
+      // 鍙兘瀛樺湪绉掗棯鐨勬儏鍐�, 鍥犳闇�瑕佺煭鏆傚欢鍚庡垽鏂�
+      const timerHandler = () => {
+        if (this.timer) {
+          // 娓呴櫎宸叉湁鐨勮鏃跺櫒
+          clearTimeout(this.timer)
+          this.timer = null
+        }
+        this.timer = setTimeout(() => {
+          if (this.keyboardHeight > 0) {
+            this.showPanel = false
+          }
+          this.timer = null
+        }, 50)
+      }
+
+      // #ifdef APP
+      if (this.isIOS) {
+        timerHandler()
+      } else {
+        if (this.keyboardHeight > 0) {
+          this.showPanel = false
+        }
+      }
+      // #endif
+
+      // #ifdef MP-WEIXIN
+      timerHandler()
+      // #endif
+    },
+    // 閫�鏍�
+    onBackSpace() {
+      this.$emit('backspace')
+      // #ifdef H5 || APP
+			this.editorCtx = this.getEditorCtx() // 鎸夐渶閲嶆柊鑾峰彇缂栬緫鍣ㄥ疄渚�
+      noKeyboardEffect(() => {
+        this.editorCtx.backspace()
+      })
+      // #endif
+    },
+    // 璋冭壊鏉跨‘璁�
+    selectColor(color, type) {
+      this.curColor = color
+      this.showColorPicker = false
+      if (type == 'color') {
+        this.curTextColor = color
+      } else {
+        this.curBgColor = color
+      }
+      // 纭棰滆壊閫夋嫨鍚庝笉瑕乶oKeyboardEffect鍙栨秷閿洏锛屼細閫犳垚棰滆壊鏍煎紡涓㈠け
+			this.editorCtx = this.getEditorCtx() // 鎸夐渶閲嶆柊鑾峰彇缂栬緫鍣ㄥ疄渚�
+      this.editorCtx.format(type, color)
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+@import '../icons/iconfont.css';
+
+.sv-editor-toolbar {
+  --editor-toolbar-height: 88rpx;
+  --editor-toolbar-bgcolor: #ffffff;
+  --editor-toolbar-bordercolor: #eeeeee;
+  --editor-toolbar-iconsize: 32rpx;
+  --tool-panel-height: auto;
+  --tool-panel-bgcolor: #ffffff;
+  --tool-panel-max-height: 400rpx;
+  --tool-style-columns: 3;
+  --tool-style-iconsize: 32rpx;
+  --tool-style-titlesize: 28rpx;
+  --tool-emoji-columns: 8;
+  --tool-more-columns: 4;
+  --tool-more-iconsize: 60rpx;
+  --tool-more-titlesize: 24rpx;
+  --tool-item-bgcolor: #f1f1f1;
+  --editor-backspace-bgcolor: #ffffff;
+  --editor-backspace-shadow: 0 0 8px 6px rgba(0, 0, 0, 0.08);
+
+  .editor-tools {
+    width: 100%;
+    height: var(--editor-toolbar-height);
+    background-color: var(--editor-toolbar-bgcolor);
+    border-top: 1rpx solid var(--editor-toolbar-bordercolor);
+    border-bottom: 1rpx solid var(--editor-toolbar-bordercolor);
+    display: flex;
+    align-items: center;
+    justify-content: space-around;
+    box-sizing: border-box;
+
+    .iconfont {
+      width: 100%;
+      height: 100%;
+      font-size: var(--editor-toolbar-iconsize);
+      flex: 1;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+    }
+  }
+
+  .tool-panel {
+    height: var(--tool-panel-height);
+    max-height: var(--tool-panel-max-height);
+    overflow: auto;
+    padding: 30rpx;
+    box-sizing: border-box;
+    // position: relative;
+    background-color: var(--tool-panel-bgcolor);
+
+    .editor-backspace {
+      width: 80rpx;
+      height: 60rpx;
+      position: absolute;
+      bottom: 30rpx;
+      right: 30rpx;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      font-size: 50rpx;
+      border-radius: 20rpx;
+      background-color: var(--editor-backspace-bgcolor);
+      box-shadow: var(--editor-backspace-shadow);
+
+      &:active {
+        opacity: 0.8;
+        bottom: 32rpx;
+        right: 32rpx;
+      }
+    }
+
+    .panel-grid {
+      width: 100%;
+      display: grid;
+      align-items: center; /* 鍨傜洿灞呬腑 */
+      justify-items: center; /* 姘村钩灞呬腑 */
+      gap: 30rpx;
+      box-sizing: border-box;
+
+      &.panel-style {
+        grid-template-columns: repeat(var(--tool-style-columns), 1fr);
+      }
+
+      &.panel-emoji {
+        grid-template-columns: repeat(var(--tool-emoji-columns), 1fr);
+      }
+
+      &.panel-more {
+        grid-template-columns: repeat(var(--tool-more-columns), 1fr);
+      }
+    }
+
+    .panel-style-item {
+      width: 100%;
+      height: 80rpx;
+      border-radius: 20rpx;
+      display: flex;
+      align-items: center;
+      background-color: var(--tool-item-bgcolor);
+      padding: 0 20rpx;
+      box-sizing: border-box;
+
+      .tool-item-title {
+        font-size: var(--tool-style-titlesize);
+      }
+      .iconfont {
+        font-size: var(--tool-style-iconsize);
+        margin-right: 10rpx;
+      }
+    }
+
+    .panel-emoji-item {
+    }
+
+    .panel-more-item {
+      width: 100%;
+      display: flex;
+      flex-direction: column;
+      justify-content: center;
+      align-items: center;
+      background-color: var(--tool-item-bgcolor);
+      padding: 20rpx;
+      border-radius: 20rpx;
+      box-sizing: border-box;
+
+      &:active {
+        opacity: 0.85;
+      }
+
+      .iconfont {
+        font-size: var(--tool-more-iconsize);
+      }
+      .panel-more-item-title {
+        font-size: var(--tool-more-titlesize);
+        margin-top: 12rpx;
+      }
+    }
+  }
+}
+
+.ql-active {
+  color: #66ccff;
+}
+.pointer-events-none {
+  pointer-events: none;
+}
+</style>
diff --git a/uni_modules/sv-editor/components/sv-editor/sv-editor.vue b/uni_modules/sv-editor/components/sv-editor/sv-editor.vue
new file mode 100644
index 0000000..d3bef09
--- /dev/null
+++ b/uni_modules/sv-editor/components/sv-editor/sv-editor.vue
@@ -0,0 +1,445 @@
+<template>
+  <view class="sv-editor-wrapper" @longpress="eLongpress">
+    <slot name="header"></slot>
+    <editor
+      :id="eid"
+      class="sv-editor-container"
+      show-img-size
+      show-img-toolbar
+      show-img-resize
+      :placeholder="placeholder"
+      :read-only="isReadOnly"
+      @statuschange="onStatusChange"
+      @ready="onEditorReady"
+      @input="onEditorInput"
+      @focus="onEditorFocus"
+      @blur="onEditorBlur"
+    ></editor>
+    <view class="maxlength-tip" v-if="maxlength > 0 && !hideMax">{{ textlength }}/{{ maxlength }}</view>
+    <slot name="footer"></slot>
+    <!-- renderjs杈呭姪鎻掍欢 -->
+    <!-- #ifdef APP || H5 -->
+    <sv-editor-render ref="editorRenderRef" :eid="editorEID"></sv-editor-render>
+    <sv-editor-plugin ref="editorPluginRef" :sid="startID" :eid="editorEID" @epaste="ePaste"></sv-editor-plugin>
+    <!-- #endif -->
+  </view>
+</template>
+
+<script>
+/**
+ * sv-editor
+ * @author sonve
+ * @version 1.0.0
+ * @date 2024-12-04
+ */
+
+import store from '../common/store.js'
+import { linkFlag, copyrightPrint } from '../common/utils.js'
+import { parseHtmlWithVideo, replaceVideoWithImageRender } from '../common/parse.js'
+import SvEditorRender from './sv-editor-render.vue'
+import SvEditorPlugin from '../plugins/sv-editor-plugin.vue'
+import wxplugin from '../plugins/sv-editor-wxplugin.js'
+
+export default {
+  // #ifdef MP-WEIXIN
+  // 寰俊灏忕▼搴忕壒娈婇厤缃�
+  options: {
+    addGlobalClass: true,
+    virtualHost: true,
+    styleIsolation: 'shared'
+  },
+  // #endif
+  components: {
+    SvEditorRender,
+    SvEditorPlugin
+  },
+  props: {
+    // 缂栬緫鍣╥d鍙紶鍏ワ紝浠ヤ究寰幆缁勪欢浣跨敤锛岄槻姝d閲嶅
+    eid: {
+      type: String,
+      default: 'sv-editor' // 鍞竴锛岀姝㈤噸澶�
+    },
+    placeholder: {
+      type: String,
+      default: '鍐欑偣浠�涔堝惂 ~'
+    },
+    // 鏄惁鍙
+    readOnly: {
+      type: Boolean,
+      default: false
+    },
+    // 鏈�澶у瓧鏁伴檺鍒讹紝<=0鏃惰〃绀轰笉闄�
+    maxlength: {
+      type: Number,
+      default: -1
+    },
+    // 鏄惁鍏抽棴鏈�澶у瓧鏁版樉绀�
+    hideMax: {
+      type: Boolean,
+      default: false
+    },
+    // 绮樿创妯″紡锛屽彲閫� text 绾枃鏈�(榛樿) | origin 灏藉彲鑳戒繚鎸佸師鏍煎紡
+    pasteMode: {
+      type: String,
+      default: 'text'
+    }
+  },
+  emits: ['ready', 'input', 'statuschange', 'focus', 'blur', 'overmax', 'epaste'],
+  data() {
+    return {
+      textlength: 0, // 褰撳墠瀛楁暟缁熻
+      startID: '',
+      // #ifdef VUE2
+      // #ifdef MP-WEIXIN
+      editorIns: null // 浠卾ue2鐜涓嬬殑寰俊灏忕▼搴忛渶瑕佸0鏄庡疄渚嬪彉閲忥紝鍚﹀垯鎶ラ敊锛屽睘瀹為�嗗ぉ
+      // #endif
+      // #endif
+    }
+  },
+  computed: {
+    editorEID: {
+      set(newVal) {
+        store.actions.setEID(newVal)
+      },
+      get() {
+        return store.actions.getEID()
+      }
+    },
+    editorCtx: {
+      set(newVal) {
+        store.actions.setEditor(newVal.eid, newVal.ctx)
+        // #ifdef VUE2
+        this.editorIns = newVal.ctx
+        this.editorIns.id = newVal.eid
+        // #endif
+      },
+      get() {
+        let instance = store.actions.getEditor(this.eid)
+        // #ifdef VUE2
+        instance = store.actions.getEditor(this.eid) || this.editorIns
+        // #endif
+        return instance
+      }
+    },
+    isReadOnly: {
+      set(newVal) {
+        store.actions.setReadOnly(newVal)
+      },
+      get() {
+        return store.actions.getReadOnly()
+      }
+    }
+  },
+  watch: {
+    readOnly(newVal) {
+      this.isReadOnly = newVal
+    }
+  },
+  mounted() {
+    // 棣栦釜瀹炰緥鍒濆鍖栨椂鎵ц
+    if (!store.state.firstInstanceFlag) {
+      this.editorEID = this.eid
+      store.state.firstInstanceFlag = this.eid
+      copyrightPrint()
+    }
+  },
+  destroyed() {
+    store.actions.destroy()
+  },
+  unmounted() {
+    store.actions.destroy()
+  },
+  methods: {
+    onEditorReady() {
+      this.$nextTick(() => {
+        uni
+          .createSelectorQuery()
+          .in(this)
+          .select('#' + this.eid)
+          .context((res) => {
+            // 瀛樺偍涓婁笅鏂�
+            this.editorCtx = { eid: this.eid, ctx: res.context }
+            // 鎸傝浇瀹炰緥api
+            this.bindMethods()
+            // 鍒濆鍖栧畬鎴�
+            this.$emit('ready', this.editorCtx)
+
+            // #ifdef APP || H5
+            if (this.pasteMode == 'origin') this.editorCtx.changePasteMode('origin')
+            // #endif
+          })
+          .exec()
+      })
+    },
+    /**
+     * 鎸傝浇瀹炰緥api
+     */
+    bindMethods() {
+      // ===== renderjs鐩稿叧鎵╁睍api =====
+
+      // #ifdef APP || H5
+      /**
+       * 涓诲姩鑱氱劍
+       * @returns {void}
+       */
+      this.editorCtx.focus = this.$refs.editorRenderRef.focus
+
+      /**
+       * 閫�鏍�
+       * @returns {void}
+       */
+      this.editorCtx.backspace = this.$refs.editorRenderRef.backspace
+
+      /**
+       * 閿洏杈撳叆妯″紡
+       * @param {String} type 妯″紡锛屽彲閫夛細none | remove
+       * @returns {void}
+       */
+      this.editorCtx.changeInputMode = this.$refs.editorRenderRef.changeInputMode
+
+      /**
+       * 绮樿创妯″紡
+       * @param {String} type 妯″紡锛屽彲閫夛細text绾枃鏈�(榛樿) | origin灏藉彲鑳戒繚鎸佸師鏍煎紡
+       * @returns {void}
+       */
+      this.editorCtx.changePasteMode = (type) => {
+        // 鍛婄煡plugin鍚姩
+        this.startID = this.eid
+        if (this.$refs.editorPluginRef?.changePasteMode) {
+          this.$refs.editorPluginRef.changePasteMode(type)
+        }
+      }
+
+      /**
+       * 鐢熸垚瑙嗛灏侀潰鍥�
+       * @param {String} url 灏侀潰鍥剧墖鍦板潃
+       * @returns {Promise} 鎼哄甫鎾斁鍥炬爣鐨勫皝闈㈠浘鍦板潃
+       */
+      this.editorCtx.createCoverThumbnail = (url) => {
+        return new Promise((resolve) => {
+          if (this.$refs.editorPluginRef?.createCoverThumbnail) {
+            // 浜嬩欢鍚嶅繀椤诲敮涓�锛屽惁鍒欎細瑕嗙洊
+            uni.$once(`E_EDITOR_GET_COVER_THUMBNAIL_${url}`, (res) => {
+              resolve(res.cover)
+            })
+            setTimeout(() => {
+              this.$refs.editorPluginRef?.createCoverThumbnail(url)
+            })
+          }
+        })
+      }
+
+      /**
+       * 鐢熸垚瑙嗛灏侀潰鍥�
+       * @param {String} url 瑙嗛鍦板潃
+       * @returns {Promise} 灏侀潰鍥惧湴鍧�
+       */
+      this.editorCtx.createVideoThumbnail = (url) => {
+        return new Promise((resolve) => {
+          if (this.$refs.editorPluginRef?.createVideoThumbnail) {
+            // 浜嬩欢鍚嶅繀椤诲敮涓�锛屽惁鍒欎細瑕嗙洊
+            uni.$once(`E_EDITOR_GET_VIDEO_THUMBNAIL_${url}`, (res) => {
+              resolve(res.cover)
+            })
+            setTimeout(() => {
+              this.$refs.editorPluginRef?.createVideoThumbnail(url)
+            })
+          }
+        })
+      }
+
+      // #endif
+
+      // ===== 寰俊灏忕▼搴忔墿灞昦pi =====
+
+      // #ifdef MP-WEIXIN
+
+      /**
+       * 鐢熸垚瑙嗛灏侀潰鍥�
+       * @param {String} url 瑙嗛鍦板潃
+       * @returns {Promise} 灏侀潰鍥惧湴鍧�
+       */
+      this.editorCtx.createCoverThumbnail = wxplugin?.wxCreateCoverThumbnail
+
+      // #endif
+
+      // ===== 閫氱敤鎵╁睍api =====
+
+      /**
+       * 涓诲姩瑙﹀彂input鍥炶皟浜嬩欢
+       * @returns {void}
+       */
+      this.editorCtx.changeInput = () => {
+        this.editorCtx.getContents({
+          success: (res) => {
+            this.$emit('input', { ctx: this.editorCtx, html: res.html, text: res.text })
+          }
+        })
+      }
+
+      /**
+       * 鑾峰彇鏈�鏂板唴瀹�
+       * @returns {Promise} 鍐呭瀵硅薄 { html, text... }
+       */
+      this.editorCtx.getLastContent = async () => {
+        return new Promise((resolve) => {
+          this.editorCtx.getContents({
+            success: (res) => {
+              resolve(res)
+            }
+          })
+        })
+      }
+
+      /**
+       * 瀵屾枃鏈唴瀹瑰垵濮嬪寲
+       * 娉ㄦ剰锛氬井淇″皬绋嬪簭浼氬鑷磋仛鐒︽粴鍔紝寤鸿鍏堝皢缂栬緫鍣╲-show=false锛屽緟initHtml鍐呭鍒濆鍖栧畬鎴愬悗鍐峵rue
+       * 涔熸鏄洜涓哄井淇″皬绋嬪簭绔細鑱氱劍婊氬姩锛屾墍浠ditorEID鍦ㄥ垵濮嬮樁娈典細榛樿淇濇寔鏈�鍚庝竴涓疄渚媏id锛岄渶瑕佹墜鍔ㄩ噸鏂拌仛鐒�
+       * @param {String} html 鍒濆鍖栫殑瀵屾枃鏈�
+       * @param {Function<Promise>} customCallback 鑷畾涔夊鐞嗗皝闈㈠洖璋冿紝闇�瑕佷互Promise褰㈠紡杩斿洖灏侀潰鍥剧墖璧勬簮
+       * @returns {void}
+       */
+      this.editorCtx.initHtml = async (html, customCallback) => {
+        let transHtml = await replaceVideoWithImageRender(html, customCallback)
+        // #ifdef APP || H5
+        this.editorCtx.changePasteMode('text') // text妯″紡涓嬪彲浠ラ槻姝㈠垵濮嬪寲鏃跺鏍煎紡鐨勫奖鍝�
+        // #endif
+        setTimeout(() => {
+          this.editorCtx.setContents({
+            html: transHtml,
+            success: () => {
+              // 涓诲姩瑙﹀彂涓�娆nput鍥炶皟浜嬩欢
+              this.editorCtx.changeInput()
+              // #ifdef APP || H5
+              if (this.pasteMode == 'origin') this.editorCtx.changePasteMode('origin')
+              // #endif
+            }
+          })
+        })
+      }
+
+      /**
+       * 瀵煎嚭澶勭悊
+       * @param {String} html 瑕佸鍑虹殑瀵屾枃鏈�
+       * @returns {String} 澶勭悊鍚庣殑瀵屾枃鏈�
+       */
+      this.editorCtx.exportHtml = (html) => {
+        return parseHtmlWithVideo(html)
+      }
+    },
+    onEditorInput(e) {
+      // 娉ㄦ剰涓嶈浣跨敤getContents鑾峰彇html鍜宼ext锛屼細瀵艰嚧閲嶅瑙﹀彂onStatusChange浠庤�屽け鍘籺oolbar宸ュ叿鐨勯珮浜姸鎬�
+      // 澶嶅埗绮樿创鐨勬椂鍊檇etail浼氫负绌猴紝姝ゆ椂搴斿綋鐩存帴return
+      if (Object.keys(e.detail).length <= 0) return
+      const { html, text } = e.detail
+
+      // 璇嗗埆鍒伴摼鎺ョ壒娈婃爣璇嗙珛鍗硆eturn
+      if (text.indexOf(linkFlag) !== -1) return
+
+      /**
+       * 鍥犱负uni-editor涓嶆彁渚涙渶澶у瓧绗﹂檺鍒讹紝鏁呴渶瑕佹墜鍔ㄨ繘琛屼互涓嬬壒娈婂鐞�
+       */
+      const maxlength = parseInt(this.maxlength)
+      const textStr = text.replace(/[ \t\r\n]/g, '')
+      this.textlength = textStr.length // 褰撳墠瀛楃鏁�
+      if (this.textlength >= maxlength && maxlength > 0) {
+        this.textlength = maxlength // 鍥犱负editor鐗规�э紝闇�瑕佹墜鍔ㄨ祴闃堝��
+        if (!this.lockHtmlFlag) {
+          this.lockHtml = html // 閿佸畾鏈�鍚庝竴娆¤秴鍑哄瓧鏁板墠鐨刪tml
+          this.lockHtmlFlag = true // 閿佸畾鏍囧織
+          // 棣栨鍒拌揪鏈�澶ч檺鍒舵椂杩橀渶鏈�鍚庡洖璋冧竴娆nput浜嬩欢
+          this.$emit('input', { ctx: this.editorCtx, html, text })
+        } else {
+          // 鍦ㄨ秴杩囧瓧鏁版椂閿佸畾锛岃嫢鍐嶇紪杈戝垯鎶涘嚭瓒呭嚭浜嬩欢
+          this.$emit('overmax', { ctx: this.editorCtx })
+        }
+        // 瓒呰繃瀛楁暟鏃讹紝閿佸畾鏈�鍚庝竴娆¤秴鍑哄瓧鏁板墠鐨刪tml
+        this.editorCtx.setContents({ html: this.lockHtml })
+      } else {
+        // 姝e父杈撳叆
+        this.$emit('input', { ctx: this.editorCtx, html, text })
+        this.lockHtmlFlag = false // 閿佸畾鏍囧織
+      }
+    },
+    /**
+     * 鏍峰紡鏍煎紡鏀瑰彉鏃惰Е鍙�
+     * 娉ㄦ剰锛氬井淇″皬绋嬪簭绔湪澶氱紪杈戝櫒瀹炰緥涓嬪垏鎹㈢紪杈戝櫒鍚庡彲鑳戒笉浼氬強鏃惰Е鍙憃nStatusChange
+     */
+    onStatusChange(e) {
+      store.actions.setFormats(e.detail)
+      this.$emit('statuschange', { ...e, ctx: this.editorCtx })
+      uni.$emit('E_EDITOR_STATUSCHANGE', { ...e, ctx: this.editorCtx })
+    },
+    onEditorFocus(e) {
+      this.editorEID = this.eid
+      this.$emit('focus', { ...e, ctx: this.editorCtx })
+    },
+    onEditorBlur(e) {
+      this.$emit('blur', { ...e, ctx: this.editorCtx })
+    },
+    ePaste(e) {
+      this.$emit('epaste', { ...e, ctx: this.editorCtx })
+      uni.$emit('E_EDITOR_PASTE', { ...e, ctx: this.editorCtx })
+    },
+    /**
+     * 寰俊灏忕▼搴忓畼鏂筫ditor鐨勯暱鎸変簨浠舵湁bug锛岄渶瑕侀噸鍐欒鐩栵紝涓嶉渶鍋氫换浣曢�昏緫锛屽彲瑙佷笅闈㈠皬绋嬪簭绀惧尯闂閾炬帴
+     * @tutorial https://developers.weixin.qq.com/community/develop/doc/000c04b3e1c1006f660065e4f61000
+     */
+    eLongpress() {}
+  }
+}
+</script>
+
+<style lang="scss">
+.sv-editor-wrapper {
+  --maxlength-text-color: #666666;
+
+  position: relative;
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+
+  .sv-editor-container {
+    flex: 1;
+  }
+
+  .maxlength-tip {
+    position: absolute;
+    bottom: 0;
+    right: 0;
+    font-size: 24rpx;
+    color: var(--maxlength-text-color);
+    opacity: 0.6;
+  }
+}
+
+// placeholder瀛楁牱
+.sv-editor-container ::v-deep .ql-blank::before {
+  font-style: normal;
+  color: #cccccc;
+}
+
+// 鍥剧墖宸ュ叿鏍峰紡
+::v-deep .ql-container {
+  min-height: unset;
+
+  .ql-image-overlay {
+    pointer-events: none;
+
+    .ql-image-size {
+      right: 28px !important;
+    }
+    .ql-image-toolbar {
+      // 鍒犻櫎鎸夐挳
+      pointer-events: auto;
+    }
+    .ql-image-handle {
+      // 鍥涜缂╂斁鎸夐挳
+      width: 30px;
+      height: 30px;
+      pointer-events: auto;
+    }
+  }
+}
+</style>
diff --git a/uni_modules/sv-editor/package.json b/uni_modules/sv-editor/package.json
new file mode 100644
index 0000000..1851fe9
--- /dev/null
+++ b/uni_modules/sv-editor/package.json
@@ -0,0 +1,87 @@
+{
+  "id": "sv-editor",
+  "displayName": "鍩轰簬瀹樻柟 uni-editor 鐨勫瘜鏂囨湰缂栬緫鍣�",
+  "version": "1.1.2",
+  "description": "鍙彃鍏ュ浘鐗囥�佽棰戙�侀摼鎺ャ�丂鎻愬強銆�#璇濋銆丒moji琛ㄦ儏鍖咃紝涓斾紭鍖栦簡鑱氱劍閿洏闂儊绛夐棶棰�",
+  "keywords": [
+    "瀵屾枃鏈�",
+    "缂栬緫鍣�",
+    "editor",
+    "html"
+],
+  "repository": "https://gitee.com/Sonve/sv-editor",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "鏃�",
+      "data": "鎻掍欢涓嶉噰闆嗕换浣曟暟鎹�",
+      "permissions": "鏃�"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y",
+        "alipay": "y"
+      },
+      "client": {
+        "Vue": {
+          "vue2": "y",
+          "vue3": "y"
+        },
+        "App": {
+            "app-vue": "y",
+            "app-nvue": "u",
+            "app-uvue": "u",
+            "app-harmony": "u"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "寰俊娴忚鍣�(Android)": "y",
+          "QQ娴忚鍣�(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "灏忕▼搴�": {
+          "寰俊": "y",
+          "闃块噷": "u",
+          "鐧惧害": "u",
+          "瀛楄妭璺冲姩": "u",
+          "QQ": "u",
+          "閽夐拤": "u",
+          "蹇墜": "u",
+          "椋炰功": "u",
+          "浜笢": "u"
+        },
+        "蹇簲鐢�": {
+          "鍗庝负": "u",
+          "鑱旂洘": "u"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/uni_modules/sv-editor/readme.md b/uni_modules/sv-editor/readme.md
new file mode 100644
index 0000000..66c8769
--- /dev/null
+++ b/uni_modules/sv-editor/readme.md
@@ -0,0 +1,333 @@
+## 鍩轰簬瀹樻柟 uni-editor 鐨勫瘜鏂囨湰缂栬緫鍣� [sv-editor]
+
+### 涓�銆佸墠瑷�
+棣栧厛锛屼綘闇�瑕佷簡瑙� uni-editor 鐩稿叧娉ㄦ剰浜嬮」锛屼互鍙奱pi
+
+浼犻�侀棬锛�
+
+1. [editor 缁勪欢姒傚喌](https://uniapp.dcloud.net.cn/component/editor.html)
+2. [editorContext api璇︽儏](https://uniapp.dcloud.net.cn/api/media/editor-context.html)
+3. 浠旂粏闃呰 [HTML 鏍囩鍜� style 鍐呰仈鏍峰紡鏀寔鎯呭喌](https://uniapp.dcloud.net.cn/component/editor.html#html-%E6%A0%87%E7%AD%BE%E5%92%8C-style-%E5%86%85%E8%81%94%E6%A0%B7%E5%BC%8F%E6%94%AF%E6%8C%81%E6%83%85%E5%86%B5)
+4. 浠旂粏浜嗚В [娉ㄦ剰浜嬮」](https://uniapp.dcloud.net.cn/component/editor.html#%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9)
+
+
+### 浜屻�佹湰鎻掍欢鍦ㄥ畼鏂� uni-editor 鍩虹涓婂仛浜嗕粈涔�
+
+1. 鎻愪緵鎻掑叆瑙嗛鐨刟pi
+2. 鎻愪緵鎻掑叆閾炬帴鐨刟pi
+3. 鍦ㄦ彃鍏ラ摼鎺ョ殑鍩虹涓婃墿灞曚簡 @鏌愪汉銆�#璇濋#銆佷互鍙� 娣诲姞闄勪欢 鐨刟pi
+4. 鏀寔鎻掑叆emoji琛ㄦ儏鍖咃紝鍙嚜瀹氫箟琛ㄦ儏鍖呴潰鏉�
+5. 瑙e喅浜嗗湪app绔彃鍏ュ唴瀹瑰悗锛岀紪杈戝櫒鑱氱劍鍚庤嚜鍔ㄥ脊鍑洪敭鐩樼殑闂锛屾彁渚沘pi鍙湪鑱氱劍鐨勫悓鏃跺彇娑堥敭鐩樺弽澶嶅脊鍑哄甫鏉ョ殑褰卞搷锛侊紒锛�
+6. 宸ュ叿鏍弔oolbar涓庣紪杈戝櫒editor鍒嗙寮忓啓娉曪紝璁╀綘鐨勪唬鐮佹洿鍔犺嚜鐢�
+7. 鎻掍欢鍐呴儴澶ч儴鍒嗘牱寮忕敱css鍙橀噺鎺у埗锛屾洿鏂逛究浣犱娇鐢ㄦ牱寮忕┛閫忓幓鑷畾涔夛紝瀵规湁鏆楅粦涓婚鐨勯渶姹傛洿鍔犲弸濂�
+8. 鎵�鏈夌粍浠舵坊鍔犱簡 styleIsolation: 'shared' 閰嶇疆椤癸紝鍐嶄篃涓嶇敤鎬曞皬绋嬪簭绔殑鏍峰紡闅旂绌块�忎笉浜�
+9. 閮ㄥ垎鎵╁睍鍩轰簬renderjs锛屽洜姝ゅ皬绋嬪簭绔棤娉曚娇鐢紝鍙涓嬪垪鍏抽敭鍔熻兘姒傚喌璇︽儏
+10. App涓嶩5绔叧閿墿灞昦pi濡備笅锛�
+	- noKeyboardEffect锛氬彇娑堥敭鐩樺奖鍝嶏紝涓嶆兂璁╁瘜鏂囨湰鑱氱劍鍚庢�绘槸鑷姩寮瑰嚭閿洏锛熻繖涓猘pi鍙互瀹岀編瑙e喅浣犵殑闂
+	- focus锛氫富鍔ㄨ仛鐒︼紝浣犲彲浠ョ洿鎺ラ�氳繃 editorCtx 瀹炰緥璋冪敤姝pi锛屼互渚跨洿鎺ヤ富鍔ㄤ娇瀵屾枃鏈仛鐒�
+	- backspace锛氫富鍔ㄩ��鏍�(鍒犻櫎)锛屽笇鏈涘彲浠ユā鎷熼敭鐩樹笂鐨勯��鏍奸敭锛熻繖涓猘pi濡傚悓閿洏鐨� backspace 閿竴鏍凤紝鍒犻櫎鍏夋爣鍓嶄竴涓崟浣嶏紝鎴栬�呭垹闄ゆ墍閫夊尯鍩�
+	- 绛夌瓑鍏朵粬api锛岃瑙佷笅鏂�
+
+### 涓夈�佸吋瀹规��
+
+鉁呭凡鍏煎锛屸潓鏈吋瀹� 
+
+|  VUE2	|  VUE3	|  APP(Android)	| APP(iOS)|  H5						|  寰俊灏忕▼搴�	|  鍏朵粬灏忕▼搴�			|
+|  :---:|  :---:|     :---:			|  :---:	|  :---:				|  :---:			|  :---:					|
+|  鉁� 锔弢  鉁咃笍	|       鉁�				|  鉁�			|  鉁�       锔忥笍	|    鉁咃笍锔�		|  鉂�(娌℃祴杩�)锔忥笍	|
+
+1. 瀹為檯璇蜂互鐪熸満鏁堟灉涓哄噯锛屽苟涓嶈兘淇濊瘉鎵�鏈夋満鍨嬮兘鍏煎锛屽閬囧埌闂杩樿鍔犵兢璁ㄨ
+2. 娉ㄦ剰锛氬洜涓洪儴鍒哸pi鍩轰簬renderjs锛岃�屽皬绋嬪簭鏃犳硶浣跨敤renderjs锛屾晠閮ㄥ垎api鍜屽姛鑳藉苟涓嶉�傞厤灏忕▼搴忥紝鏇村璇︽儏浼氬湪鍚刟pi涓鏄�
+3. 鐗瑰埆娉ㄦ剰锛�**鍦ㄥ井淇″皬绋嬪簭涓紝鐢熸垚鐨� a 鏍囩鐨� href 灞炴�т細琚嚜鍔ㄦ姽鍘伙紝鍥犳鍦ㄥ井淇″皬绋嬪簭涓槸鏃犳硶鐐瑰嚮瓒呴摼鎺ヨ烦杞殑锛岃繖鐐圭洰鍓嶅井淇″皬绋嬪簭瀹樻柟鍥轰欢涓嶆敮鎸侊紝鏆傛椂涔熸病鍟ュソ鐨勫姙娉�**
+
+### 鍥涖�佸叧閿姛鑳芥鍐�
+
+鉁呭畬缇庢敮鎸侊紝鈽戝彲鐢ㄤ絾鎴栨湁鍓綔鐢紝鉂屼笉鏀寔
+
+|  鍔熻兘																			|  VUE2	|  VUE3	|  H5		|  APP(Android)	|  APP(iOS)	|  寰俊灏忕▼搴�	|
+|  :---:																		|  :---:|  :---:|  :---:|  :---:				|  :---:		|  :---:		|
+|  鎻掑叆鍥剧墖																	|  鉁�		|  鉁�		|  鉁�		|  鉁�						|  鉁�				|  鉁�				|
+|  鎻掑叆瑙嗛																	|  鉁�		|  鉁�		|  鉁�		|  鉁�						|  鉁�				|  鉁�				|
+|  鎻掑叆閾炬帴																	|  鉁�		|  鉁�		|  鉁�		|  鉁�						|  鉁�				|   鈽戯笍			|
+|  鎻掑叆鎻愬強																	|  鉁�		|  鉁�		|  鉁�		|  鉁�						|  鉁�				|   鈽戯笍			|
+|  鎻掑叆璇濋																	|  鉁�		|  鉁�		|  鉁�		|  鉁�						|  鉁�				|   鈽戯笍			|
+|  鎻掑叆闄勪欢																	|  鉁�		|  鉁�		|  鉁�		|  鉁�						|  鉁�				|   鈽戯笍			|
+|  涓诲姩鑱氱劍																	|  鉁�		|  鉁�		|  鉁�		|  鉁�						|  鉁�				|   鉂岋笍			|
+|  涓诲姩閫�鏍�																	|  鉁�		|  鉁�		|  鉁�		|  鉁�						|  鉂�				|  鉂�				|
+|  澶氱紪杈戝櫒瀹炰緥															|  鉁�		|  鉁�		|  鉁�		|  鉁�						|  鉁�				|  鉁�				|
+|  娑堥櫎閿洏褰卞搷															|  鉁�		|  鉁�		|  鉁�		|  鉁�						|  鈽�				|   鈽戯笍			|
+|  绮樿创淇濈暀鏍煎紡 <br/> [(*鐗规畩鎵╁睍)](#鐗规畩鎵╁睍)	|  鉁�		|  鉁�		|  鉁�		|  鉁�						|  鉁�				|  鉂�				|
+|  绮樿创浜嬩欢鐩戝惉 <br/> [(*鐗规畩鎵╁睍)](#鐗规畩鎵╁睍)	|  鉁�		|  鉁�		|  鉁�		|  鉁�						|  鉁�				|  鉂�				|
+|  瑙嗛鎴彇灏侀潰															|  鉁�		|  鉁�		|  鉁�		|  鉁�						|  鈽戯笍			|  鈽�				|
+|  瑙嗛鍥炴樉瑙f瀽															|  鉁�		|  鉁�		|  鉁�		|  鉁�						|  鉁�				|  鉁�				|
+|  寰呰ˉ鍏� ...																|				|				|				|								|						|						|
+
+
+### 浜斻�佸紑濮�
+
+1. 鍥犱负鏈彃浠朵笉渚濊禆鍏朵粬绗笁鏂规彃浠讹紝鍥犳鐩存帴鐐瑰嚮鍙充笂瑙� `涓嬭浇骞跺鍏BuilderX` 瀵煎叆鑷充綘鐨勯」鐩腑鍗冲彲
+2. 寮虹儓寤鸿浣犲厛 `浣跨敤HBuilderX瀵煎叆绀轰緥椤圭洰` 锛岃窇涓�涓嬬ず渚嬬湅浜夸笅鍏堬紝閮ㄥ垎鍐欐硶鍙互鐩存帴鎶勭ず渚�
+3. 鍥犱负鏈彃浠舵彁渚涢櫎 [editorContext](https://uniapp.dcloud.net.cn/api/media/editor-context.html) 瀹樻柟api澶栵紝棰濆鎵╁睍鐨刟pi锛岄渶瑕佷綘瀵筳s鏈夌潃鍩烘湰鐨勬帉鎻★紝鐗瑰埆鏄疨romise鍜屽紓姝ュ鐞�
+4. 鏈彃浠朵粎涓哄瘜鏂囨湰缂栬緫鍣紝濡傝瑙f瀽鍥炴樉杩樿鑷瀵绘壘瀵屾枃鏈В鏋愭彃浠讹紙涓嶆帹鑽恟ich-text锛�
+
+### 鍏�佹彃浠剁洰褰曠粨鏋�
+
+```
+uni_modules
+鈹斺攢 sv-editor 
+   鈹溾攢 components 
+   鈹�  鈹溾攢 common 
+   鈹�  鈹�  鈹溾攢 config.js			// 閰嶇疆鏂囦欢
+   鈹�  鈹�  鈹溾攢 file-handler.js		// 鏂囦欢澶勭悊鏂规硶
+   鈹�  鈹�  鈹溾攢 parse.js			// 瀵屾枃鏈В鏋愬伐鍏�
+   鈹�  鈹�  鈹溾攢 store.js			// 鎻掍欢鍐呭叏灞�鐘舵�佺鐞�
+   鈹�  鈹�  鈹溾攢 tool-list.js		// 宸ュ叿鏍忓伐鍏峰垪琛�
+   鈹�  鈹�  鈹斺攢 utils.js			// 閫氱敤宸ュ叿api
+   鈹�  鈹溾攢 icons 
+   鈹�  鈹�  鈹溾攢 iconfont.css		// 瀛椾綋鍥炬爣鏍峰紡
+   鈹�  鈹�  鈹斺攢 iconfont.ttf		// 瀛椾綋鍥炬爣
+   鈹�  鈹斺攢 sv-editor 
+   鈹�     鈹溾攢 sv-choose-file.vue		// 鏂囦欢閫夋嫨鍣�
+   鈹�     鈹溾攢 sv-editor-popup-more.vue	// 鏇村宸ュ叿寮圭獥闈㈡澘
+   鈹�     鈹溾攢 sv-editor-render.vue	// renderjs缁勪欢
+   鈹�     鈹溾攢 sv-editor-toolbar.vue	// 鍐呯疆宸ュ叿鏍�
+   鈹�     鈹斺攢 sv-editor.vue		// 缂栬緫鍣ㄤ富浣�
+   鈹溾攢 changelog.md 
+   鈹溾攢 package.json 
+   鈹斺攢 readme.md 
+```
+
+### 涓冦�佸熀鏈娇鐢�
+
+#### sv-editor 缂栬緫鍣ㄤ富浣�
+
+`绗﹀悎uni_modules瑙勮寖锛屾棤闇�寮曞叆鐩存帴浣跨敤`
+
+1. props
+
+| 灞炴�у悕			| 绫诲瀷			| 榛樿鍊�					| 璇存槑																				|
+| :---				| :---		| :---					| :---																			|
+| eid					| String	|	'sv-editor'		| 缂栬緫鍣╥d锛屽敮涓�锛岀姝㈤噸澶嶏紝澶氱紪杈戝櫒瀹炰緥鏃跺繀濉�	|
+|	placeholder	| String	| '鍐欑偣浠�涔堝惂 ~'	|	鍗犱綅瀛楁牱																		|
+|	readOnly		|	Boolean	|	false					|	鏄惁鍙																		|
+|	maxlength		|	Number	| -1						|	鏈�澶у瓧鏁伴檺鍒讹紝<=0鏃惰〃绀轰笉闄�									|
+|	hideMax			|	Boolean	|	false					|	鏄惁鍏抽棴鏈�澶у瓧鏁版樉绀�												|
+
+2. emits
+
+| 浜嬩欢鍚�																| 鍙傛暟											| 璇存槑																													|鍏煎鎬�		|
+| :---																	| :---										| :---																												| :---		|
+| ready																	| ctx 褰撳墠缂栬緫鍣ㄤ笂涓嬫枃瀹炰緥	| 缂栬緫鍣ㄥ垵濮嬪寲瀹屾垚鏃惰Е鍙�																				|	閫氱敤			|
+| input																	| { ctx, html, text }			| 缂栬緫鍣ㄥ唴瀹规敼鍙樻椂瑙﹀彂																					|	閫氱敤			|
+| focus																	| { ctx, event }					| 缂栬緫鍣ㄨ仛鐒︽椂瑙﹀彂																							|	閫氱敤			|
+| blur																	| { ctx, event }					| 缂栬緫鍣ㄥけ鍘荤劍鐐规椂瑙﹀彂																					|	閫氱敤			|
+| statuschange													| { ctx, event }					| 閫氳繃 Context 鏂规硶鏀瑰彉缂栬緫鍣ㄥ唴鏍峰紡鏃惰Е鍙戯紝杩斿洖閫夊尯宸茶缃殑鏍峰紡	|	閫氱敤			|
+| overmax																|	{ ctx }									| 瓒呰繃鏈�澶у瓧鏁伴檺鍒舵椂鍥炶皟																				|	閫氱敤			|
+| epaste <br/> [(*鐗规畩鎵╁睍)](#鐗规畩鎵╁睍)	|	{ ctx, id, text, html, range }	| 绮樿创鍥炶皟浜嬩欢																									|	H5銆丄PP	|
+
+- statuschange 浜嬩欢杩樻彁渚� uni.$emit('E_EDITOR_STATUSCHANGE', { ctx, event }) 鎶涘嚭锛屼綘鍙互閫氳繃 uni.$on('E_EDITOR_STATUSCHANGE') 杩涜鐩戝惉锛屼絾鏄笉瑕佸繕璁板湪閫傚綋鐨勫湴鏂筼ff鍏虫帀
+- epaste [(*鐗规畩鎵╁睍)](#鐗规畩鎵╁睍) 浜嬩欢杩樻彁渚� uni.$emit('E_EDITOR_PASTE', { ctx, id, text, html, range }) 鎶涘嚭锛屼綘鍙互閫氳繃 uni.$on('E_EDITOR_PASTE') 杩涜鐩戝惉锛屼絾鏄笉瑕佸繕璁板湪閫傚綋鐨勫湴鏂筼ff鍏虫帀
+
+#### sv-editor-toolbar 缂栬緫鍣ㄥ伐鍏锋爮
+
+`涓庣紪杈戝櫒鏈綋鍒嗙锛屾寜闇�寮曞叆浣跨敤`
+
+1. props
+
+| 灞炴�у悕		| 绫诲瀷		| 榛樿鍊�																														| 璇存槑															|
+| :---			| :---	| :---																														| :---														|
+| tools			|	Array	| [] 榛樿绌烘暟缁勫嵆涓哄叏宸ュ叿锛屽彲閫� [璇﹁ toolList](#toolList)						|	宸ュ叿鏍忓垪琛紝渚嬪 ['style', ...]		|
+| styleTools|	Array	|	[] 榛樿绌烘暟缁勫嵆涓哄叏宸ュ叿锛屽彲閫� [璇﹁ styleToolList](#styleToolList)	|	鏍峰紡宸ュ叿鍒楄〃锛屼緥濡� ['header', ...]	|
+| moreTools	|	Array	|	[] 榛樿绌烘暟缁勫嵆涓哄叏宸ュ叿锛屽彲閫� [璇﹁ moreToolList](#moreToolList)		|	鏇村鍔熻兘鍒楄〃锛屼緥濡� ['image', ...]	|
+
+娉ㄦ剰锛�
+  - 姝ゅ toolList 绛変负鍏ㄥ垪琛紝璇﹁ `uni_modules/sv-editor/components/common/tool-list.js` 鏂囦欢銆�
+  - 鑻ュ彧鎯充娇鐢ㄩ儴鍒嗗伐鍏蜂互鍙婁慨鏀归『搴忥紝鍒欑粰缁勪欢瀵瑰簲鐨刾rops灞炴�т緥濡� `:tools="['style', 'undo', 'redo']"` 鍗冲彲鍙娇鐢ㄨ涓夐」宸ュ叿涓旈『搴忎互璇ユ暟缁勯『搴忔帓搴忋��
+  - 鍏充簬鍥炬爣锛屾湰鎻掍欢鍐呯疆浜� [闃块噷宸村反鐭㈤噺鍥炬爣搴揮(https://www.iconfont.cn/) 鐨勫瓧浣撳浘鏍囷紝濡傞渶浣跨敤鍏朵粬鍥炬爣锛岃鑷鏇挎崲銆�
+
+2. emits
+
+|  浜嬩欢鍚�					|  鍙傛暟									|  璇存槑															|
+|  :---						| :---									| :---															|
+| toolMoreItem		|	{ name, value }				|	鐐瑰嚮鏇村鍔熻兘闈㈡澘瀛愰」									|
+|	moreItemConfirm	|	{ link, text, file }	|	鐐瑰嚮鏇村鍔熻兘寮圭獥纭鍚庡洖璋�						|
+|	keyboardChange	|	{ height }						| 閿洏楂樺害鍙樺寲												|
+|	changeMorePop		|	true 鎵撳紑 / false	鍏抽棴	|	鏇村鍔熻兘寮圭獥鎵撳紑/鍏抽棴								|
+|	tapTool					|	{ name, value }				|	鐐瑰嚮宸ュ叿鏍�													|
+|	changeTool			|	宸ュ叿name								|	宸ュ叿鏍忔敼鍙�													|
+|	tapStyle				|	{ name, value }				|	鐐瑰嚮鏍峰紡宸ュ叿												|
+|	tapEmoji				|	{ name, value }				|	鐐瑰嚮Emoji琛ㄦ儏											|
+|	backspace				|												|	瑙﹀彂缂栬緫鍣ㄥ疄渚嬩富鍔ㄤ娇鐢╞ackspace鍚庡洖璋�	|
+
+##### toolList 
+
+| title	| name		| value	| icon							|
+| :---	| :---		| :---	| :---							|
+|	 鏍峰紡	|	style		|				|	icon-zitiyanse		|
+|	 琛ㄦ儏	|	emoji		|				|	icon-xiaolian			|
+|	 鎾ら攢	|	undo		|				|	icon-shangyibu1		|
+|	 閲嶅仛	|	redo		|				|	icon-xiayibu1			|
+|	 鏇村	|	more		|				|	icon-icon_tianjia	|
+|	 鎵╁睍	|	setting	|				|	icon-bianji				|
+
+##### styleToolList
+
+| title			|  name						| value		| icon								|
+| :---			|  :---						| :---		| :---								|
+|	 鏍囬			| header					|	2				|	icon-zitibiaoti			|
+|	 鍒嗗壊绾�		| divider					|					|	icon-fengexian			|
+|	 绮椾綋			| bold						|					|	icon-zitijiacu			|
+|	 鏂滀綋			|	italic					|					|	icon-zitixieti			|
+|	 涓嬪垝绾�		| underline				|					|	icon-zitixiahuaxian	|
+|	 鍒犻櫎绾�		| strike					|					|	icon-zitishanchuxian|
+|	 宸﹀榻�		| align						|	left		|	icon-zuoduiqi				|
+|	 灞呬腑			| align						|	center	|	icon-juzhongduiqi		|
+|	 鍙冲榻�		| align						|	right		|	icon-youduiqi				|
+|	 鏈夊簭鍒楄〃	|	list						|	ordered	|	icon-youxupailie		|
+|	 鏃犲簭鍒楄〃	|	list						|	bullet	|	icon-wuxupailie			|
+|	 涓婃爣			|	script					|	super		|	icon-zitishangbiao	|
+|	 宸︾缉杩�		|	indent					|	+1			|	icon-zuosuojin			|
+|	 鍙崇缉杩�		|	indent					|	-1			|	icon-yousuojin			|
+|	 涓嬫爣			|	script					|	sub			|	icon-ziti-xiabiao		|
+|	 鏂囧瓧棰滆壊	|	color						|					|	icon-wenziyanse			|
+|	 鑳屾櫙棰滆壊	|	backgroundColor	|					|	icon-beijingyanse'	|
+|	 娓呴櫎鏍煎紡	|	removeformat		|					|	icon-qingchugeshi		|
+
+- 浠ヤ笂涓烘彃浠跺唴缃牱寮忓伐鍏凤紝鏇村璇﹁ [鏀寔璁剧疆鐨勬牱寮忓垪琛╙(https://uniapp.dcloud.net.cn/api/media/editor-context.html#editorcontext-format)
+- 缂╄繘鏃讹紝闇�瑕佸湪瑙f瀽鎻掍欢锛堟澶勪互mp-html涓轰緥锛変腑娣诲姞濡備笅缂╄繘鏍峰紡浠ヤ緵璇嗗埆锛�
+    ```
+    // uni_modules/mp-html/components/mp-html/node/node.vue
+    
+    // 涓嶈绠℃彃浠跺唴鍘熷鐨勬牱寮忎唬鐮�
+    <style>...</style>
+    
+    // 鐩存帴鍦ㄨvue鏂囦欢鏈�搴曚笅娣诲姞濡備笅scss鏍峰紡
+    <style lang="scss">
+    @for $i from 1 through 10 {
+      .ql-indent-#{$i} {
+        // 榛樿涓�涓缉杩涗负2涓猠m鍗曚綅锛屾澶勫搴�
+        text-indent: #{$i * 2}em;
+      }
+    }
+    </style>
+    ```
+
+##### moreToolList
+
+| title			|  name			| value	| icon							|
+| :---			|  :---			| :---	| :---							|
+|	 娣诲姞鍥剧墖	|	image			|	popup	|	icon-charutupian	|
+|	 娣诲姞瑙嗛	|	video			|	popup	|	icon-shexiangji		|
+|  娣诲姞閾炬帴	|	link			|	popup	|	icon-charulianjie	|
+|  娣诲姞闄勪欢	|	attachment|	popup	|	icon-huixingzhen	|
+|  鎻愬強			|	at				|	popup	|	icon-at						|
+|  璇濋			|	topic			|	popup	|	icon-huati				|
+|  娓呯┖			|	clear			|	button|	icon-shanchu			|
+
+*鍦ㄥ井淇″皬绋嬪簭涓紝鐢熸垚鐨� a 鏍囩鐨� href 灞炴�т細琚嚜鍔ㄦ姽鍘伙紝鍥犳鍦ㄥ井淇″皬绋嬪簭涓槸鏃犳硶鐐瑰嚮瓒呴摼鎺ヨ烦杞殑锛岃繖鐐圭洰鍓嶅井淇″皬绋嬪簭瀹樻柟鍥轰欢涓嶆敮鎸侊紝鏆傛椂涔熸病鍟ュソ鐨勫姙娉�*
+
+
+##### emojiToolList
+
+emoji榛樿鍒楄〃
+
+##### colorList
+
+璋冭壊鏉块粯璁ら鑹插垪琛�
+
+#### api 鍚堥泦
+
+1. [editorContext 瀹樻柟api](https://uniapp.dcloud.net.cn/api/media/editor-context.html)
+
+2. 鏈彃浠剁紪杈戝櫒瀹炰緥 `editorCtx` 涓紝浣犲彲浠ョ洿鎺ラ�氳繃瀵屾枃鏈疄渚嬭皟鐢�
+
+|  鏂规硶鍚�																						|  鍙傛暟																											| 杩斿洖鍊�															|  璇存槑																																						| 鍏煎鎬�						|
+|  :---																							|  :---																											| :---															| :---																																						| :---						|
+| focus																							|																														|																		| 涓诲姩鑱氱劍																																					|	H5銆丄pp					|
+|	backspace																					|																														|																		|	閫�鏍硷紝浼氳Е鍙憇v-editor-toolbar鐨刡ackspace鍥炶皟鍑芥暟																		|	H5銆丄pp(Android)	|
+|	createVideoThumbnail <br/> [(*鐗规畩鎵╁睍)](#鐗规畩鎵╁睍)| url:string 瑙嗛鍦板潃																				|	灏侀潰鍥惧湴鍧�	Promise									|	浠ヨ棰戣祫婧愬湴鍧�锛岀洿鎺ョ敓鎴愯棰戝皝闈㈠浘锛堥渶瑕佷繚璇佽棰戣祫婧愭甯稿彲浠ユ挱鏀撅級											|	H5銆丄pp(Android)	|
+|	createCoverThumbnail <br/> [(*鐗规畩鎵╁睍)](#鐗规畩鎵╁睍)| url:string 鍥剧墖璧勬簮																				|	灏侀潰鍥惧湴鍧�	Promise									|	鑻ュ悗绔繑鍥炶棰戝皝闈絾鏄病鏈夋挱鏀惧浘鏍囷紝鍙互鐢ㄦ鏂规硶鍦ㄥ浘鐗囦腑澶彔鍔犳挱鏀惧浘鏍囷紝鐢ㄤ簬浣滀负瑙嗛灏侀潰	|	閫氱敤							|
+|	changeInputMode																		|	type:string 妯″紡锛屽彲閫夛細none/remove													|																		|	淇敼杈撳叆妯″紡锛岃api鏄彇娑堥敭鐩橀棯鐑佺殑鍏抽敭锛宯one鏃跺皢绂佹閿洏寮瑰嚭锛宺emove鏃跺皢绉婚櫎璇ラ檺鍒�			|	H5銆丄pp					|
+|	changeInput																				|																														|																		|	涓诲姩瑙﹀彂input鍥炶皟浜嬩欢																															|	閫氱敤							|
+|	getLastContent																		|																														|	{ html, text... } 鍐呭瀵硅薄 Promise	|	鑾峰彇瀵屾枃鏈綋鍓嶆渶鏂板唴瀹�																															|	閫氱敤							|
+|	exportHtml																				|	html:string 瑕佸鍑虹殑瀵屾枃鏈�																	|	澶勭悊鍚庣殑瀵屾枃鏈� String								|	瀵屾枃鏈鍑猴紝鑻ュ瘜鏂囨湰鎼哄甫瑙嗛锛屽垯浼氳嚜鍔ㄨВ鏋愪负video鏍囩																	|	閫氱敤							|
+|	initHtml																					|	html:string 鍒濆鍖栫殑瀵屾枃鏈� <br/> customCallback 璇﹁琛ュ厖璇存槑	|																		|	瀵屾枃鏈唴瀹瑰垵濮嬪寲锛岃嫢瀵屾枃鏈惡甯ideo鏍囩锛屽皢浼氳嚜鍔ㄨ繘琛岃В鏋愯浆鎹�													|	閫氱敤							|
+
+- initHtml 鍦ㄥ井淇″皬绋嬪簭绔細瀵艰嚧鑱氱劍婊氬姩锛屽缓璁厛灏嗙紪杈戝櫒 v-show=false锛屽緟 initHtml 鍐呭鍒濆鍖栧畬鎴愬悗鍐� true銆備篃姝f槸鍥犱负寰俊灏忕▼搴忕浼氳仛鐒︽粴鍔紝鎵�浠� editorEID 鍦ㄥ垵濮嬮樁娈典細榛樿淇濇寔鏈�鍚庝竴涓疄渚� eid锛岄渶瑕佹墜鍔ㄩ噸鏂拌仛鐒�
+- initHtml 绗簩涓弬鏁� customCallback 鍜� api: replaceVideoWithImageRender 涓�鑷达紝customCallback 涓鸿嚜瀹氫箟澶勭悊灏侀潰鍥炶皟锛岃嚜甯﹀弬鏁颁负瑙嗛鍦板潃锛岄渶瑕乺eturn灏侀潰鍥剧墖璧勬簮锛岃嫢鏃犳湁鏁堣繑鍥炲垯璧伴粯璁ゅ皝闈㈠鐞嗭紝寤鸿閰嶅悎鍚庣鐢熸垚瑙嗛灏侀潰浠ュ吋瀹瑰悇绔�� 
+
+3. `uni_modules/sv-editor/components/common/store.js` 鏂囦欢涓紝鎻掍欢鍐呭叏灞�鐘舵�佷粨搴擄紝浣犲彲浠ユ寜闇�寮曞叆鍚庨�氳繃 store.state 涓� store.actions 鏉ヨ闂彉閲�
+
+|  鏂规硶鍚�			|  鍙傛暟							| 杩斿洖鍊�						|  璇存槑									| 鍏煎鎬�	|
+|  :---				|  :---							| :---						| :---									| :---	|
+|	getEditor		|	 eid							|	eid缂栬緫鍣ㄥ疄渚�		|	鑾峰彇鎸囧畾eid鐨勭紪杈戝櫒瀹炰緥	|	閫氱敤		|
+|	setEditor		|	 eid, ctx					|									|	璁剧疆eid缂栬緫鍣ㄥ疄渚�			|	閫氱敤		|
+|	getEID			|										|	褰撳墠缂栬緫鍣╡id		|	鑾峰彇褰撳墠缂栬緫鍣╡id			|	閫氱敤		|
+|	setEID			|	 褰撳墠缂栬緫鍣╡id			|									|	璁剧疆褰撳墠缂栬緫鍣╡id			|	閫氱敤		|
+|	getFormats	|										|	缂栬緫鍣ㄦ牱寮忔牸寮�		|	鑾峰彇缂栬緫鍣ㄦ牱寮忔牸寮�			|	閫氱敤		|
+|	setFormats	|	 缂栬緫鍣ㄦ牱寮忔牸寮�		|									|	璁剧疆缂栬緫鍣ㄦ牱寮忔牸寮�			|	閫氱敤		|
+|	getReadOnly	|										|	鏄惁鍙 Boolean	|	鑾峰彇缂栬緫鍣ㄦ槸鍚﹀彧璇�			|	閫氱敤		|
+|	setReadOnly	|	 鏄惁鍙 Boolean	|									|	璁剧疆缂栬緫鍣ㄦ槸鍚﹀彧璇�			|	閫氱敤		|
+
+4. `uni_modules/sv-editor/components/common/utils.js` 鏂囦欢涓紝闇�瑕佹寜闇�寮曞叆锛屽疄鐢ㄥ伐鍏�
+
+|  鏂规硶鍚�						|  鍙傛暟																|  杩斿洖鍊�										| 璇存槑																																					|  鍏煎鎬�	|
+|  :---							|   :---															|  :---											|  :---																																				|  :---		|
+|  addImage					|	(uploadFunc蹇呭~, options)						|	Array/Promise 涓婁紶鐨勬枃浠�		|	娣诲姞鍥剧墖																																			|	閫氱敤			|
+|	 addVideo					|	(uploadFunc蹇呭~, options)						|	Array/Promise 涓婁紶鐨勬枃浠�		|	娣诲姞瑙嗛																																			|	閫氱敤			|
+|	 addLink					|	(options, callback)									|														|	娣诲姞閾炬帴																																			|	閫氱敤			|
+|	 addAttachment		|	(uploadFunc蹇呭~, options, callback)	|	Object/Promise 涓婁紶鐨勬枃浠�	|	娣诲姞闄勪欢																																			|	閫氱敤			|
+|	 addAt						|	(options, callback)									|														|	娣诲姞鎻愬強																																			|	閫氱敤			|
+|	 addTopic					|	(options, callback)									|														|	娣诲姞璇濋																																			|	閫氱敤			|
+|	 insertLink				|	(editorCtx蹇呭~, options, callback)		|														|	鎻掑叆閾炬帴姣嶆湰锛氭坊鍔犻摼鎺ャ�佹坊鍔犻檮浠躲�佹坊鍔犳彁鍙娿�佹坊鍔犺瘽棰樺潎鍩轰簬姝�										|	閫氱敤			|
+|	 noKeyboardEffect	|	(callback蹇呭~, options)							|														|	鏍稿績锛氭秷闄ら敭鐩樺奖鍝嶏紝浣嗘槸寰俊灏忕▼搴忓彧鑳介�氳繃缂栬緫鍣ㄥけ鐒︾殑鏂瑰紡鍏抽棴閿洏(渚濈劧浼氶棯涓�涓�)	|	閫氱敤			|
+
+5. `uni_modules/sv-editor/components/common/parse.js` 鏂囦欢涓紝闇�瑕佹寜闇�寮曞叆锛屾鍒欒В鏋愬伐鍏�
+
+|  鏂规硶鍚�											|  鍙傛暟																																																												|  杩斿洖鍊�										|  璇存槑																															|  鍏煎鎬�	|
+|  :---												|  :---																																																												|  :---											|  :---																															|  :---		|
+|	 replaceVideoWithImageRender|	richText:string 瑕佽繘琛屽鐞嗙殑瀵屾枃鏈瓧绗︿覆 <br/> customCallback 鑷畾涔夊鐞嗗皝闈㈠洖璋冿紝闇�瑕乺eturn澶勭悊鍚庣殑灏侀潰鍥剧墖锛岃嚜甯﹀弬鏁颁负瑙嗛鍦板潃	|	 澶勭悊缁撴灉	Promise					|	甯︽湁瑙嗛鐨勫瘜鏂囨湰閫嗗悜杞崲锛屽彲閫氳繃customCallback鍥炶皟鍑芥暟鑷畾涔夊鐞嗗皝闈�	| 閫氱敤			|
+|	 parseHtmlWithVideo					|	richText:string 瑕佽繘琛屽鐞嗙殑瀵屾枃鏈瓧绗︿覆																																											|	 澶勭悊缁撴灉	String					|	灏嗗惈鏈夊皝闈㈠崰浣嶅浘褰㈠紡鐨勮棰戝瘜鏂囨湰杞崲鎴愭甯歌棰戠殑瀵屾枃鏈�								|	閫氱敤			|
+|	 parseImagesAndVideos				|	richText:string 瑕佽繘琛屽鐞嗙殑瀵屾枃鏈瓧绗︿覆																																											|	 澶勭悊缁撴灉	Array < Object >|	瑙f瀽褰撳墠瀵屾枃鏈腑鎵�鏈夊浘鐗囧拰瑙嗛																			|	閫氱敤			|
+|	 parseImages								|	richText:string 瑕佽繘琛屽鐞嗙殑瀵屾枃鏈瓧绗︿覆																																											|	 澶勭悊缁撴灉	Array < Object >|	瑙f瀽褰撳墠瀵屾枃鏈腑鎵�鏈夊浘鐗�																						|	閫氱敤			|
+|	 parseVideos								|	richText:string 瑕佽繘琛屽鐞嗙殑瀵屾枃鏈瓧绗︿覆																																											|	 澶勭悊缁撴灉	Array < Object >|	瑙f瀽褰撳墠瀵屾枃鏈腑鎵�鏈夎棰�																						|	閫氱敤			|
+
+6. `uni_modules/sv-editor/components/common/config.js` 閰嶇疆鏂囦欢
+
+|  鍙傛暟						|  璇存槑																																					|
+|  :---						|  :---																																					|
+|	video_thumbnail	|	瑙嗛榛樿灏侀潰锛岄粯璁ゅ皝闈㈠浘鍙兘浼氬け鏁堬紝鍘熷浘鍦ㄧず渚嬪伐绋嬫牴鐩綍涓媠tatic鏂囦欢澶逛腑锛屽缓璁嚜琛屾浛鎹�	|
+|	video_playicon	|	瑙嗛灏侀潰鎾斁鍥炬爣锛堥粯璁や笁瑙掓挱鏀惧浘鏍囷級																								|
+
+7. 鍏蜂綋浣跨敤浠g爜妗堜緥璇�  `浣跨敤HBuilderX瀵煎叆绀轰緥椤圭洰` 瀵煎叆绀轰緥宸ョ▼鍙傝��
+
+### 鍏�佺壒娈婃墿灞�
+
+**鏈彃浠舵彁渚涢儴鍒嗛澶栫壒娈婃墿灞曞姛鑳斤紝鍏蜂綋濡備笅锛�**
+
+|  鍔熻兘								|  璇存槑																																						| 绫诲瀷			| 鍏煎			|
+|  :---								|  :---																																						| :---		| :---		|
+|	绮樿创淇濈暀鏍煎紡					|	绮樿创鏃跺敖鍙兘鐨勪繚鐣欏師鏈夋牸寮忥紙骞堕潪瀹屽叏澶嶅埗锛�																						|	鍥烘湁鍔熻兘	|	H5銆丄PP	|
+|	epaste							|	绮樿创鍥炶皟浜嬩欢																																			|	浜嬩欢			|	H5銆丄PP	|
+|	createVideoThumbnail|	浠ヨ棰戣祫婧愬湴鍧�锛岀洿鎺ョ敓鎴愯棰戝皝闈㈠浘锛堥渶瑕佷繚璇佽棰戣祫婧愭甯稿彲浠ユ挱鏀撅級											|	api			|	H5銆丄PP	|
+|	createCoverThumbnail|	鑻ュ悗绔繑鍥炶棰戝皝闈絾鏄病鏈夋挱鏀惧浘鏍囷紝鍙互鐢ㄦ鏂规硶鍦ㄥ浘鐗囦腑澶彔鍔犳挱鏀惧浘鏍囷紝鐢ㄤ簬浣滀负瑙嗛灏侀潰	|	api			|	閫氱敤			|
+|	寰呰ˉ鍏� ...					|																																									|					|					|
+
+- createCoverThumbnail 鍦╥OS绔彲鑳戒細鎶� `the operation is insecure` 鐨勯敊锛岃繖鏄痠OS鏇村姞涓ユ牸鐨勫畨鍏ㄧ瓥鐣ュ鑷寸殑锛屾湰鍦癴ile://鍗忚涔熶細瀵艰嚧璺ㄥ煙锛屼粠鑰屾薄鏌撲簡鐢诲竷
+
+鍒朵綔涓嶆槗锛岀壒娈婃墿灞曞姛鑳介檺鏃跺厤璐瑰紑鏀撅紝鎰熻阿鏀寔Thanks鈾�(锝ハ夛渐)锞�
+浣跨敤鏂瑰紡锛氬皢鎻掍欢鍐� backup 鏂囦欢澶逛笅鐨勬枃浠跺鍒跺苟绮樿创杩� plugins 鏂囦欢澶逛笅骞惰鐩栧師鏂囦欢
+
+### 涔濄�佺粨璇�
+
+鏈彃浠跺厤璐瑰紑婧愶紙闄ょ壒娈婃墿灞曞锛夛紝濡傝嫢鍊熼壌婧愮爜杩樿娉ㄦ槑鍑哄锛屾湭缁忔巿鏉冪姝㈣浆杞藉敭鍗栫瓑渚电姱鐗堟潈琛屼负锛岃阿璋紒
+
+濡傝嫢鍟嗙敤锛屾湜鎮ㄥ彲浠ヨ仈绯讳綔鑰呮湰浜猴紝鐣欎笅鎮ㄧ殑椤圭洰鍚嶏紝鎴戝笇鏈涜兘浠ユ柟寮忔鎺ㄥ箍锛岃阿璋紒
+
+鎰熻阿鎮ㄤ娇鐢ㄦ湰鎻掍欢锛屽鏋滃湪浣跨敤杩囩▼涓亣鍒颁换浣曢棶棰橈紝娆㈣繋鍦ㄨ瘎璁哄尯鐣欒█锛屾垨鍦� [Gitee](https://gitee.com/Sonve/sv-editor) 涓婃彁浜ssue锛屾垜浼氬敖蹇洖澶嶆偍銆�
+
+鍒朵綔涓嶆槗锛岃繕鏈涗簲鏄熷ソ璇勶紝鑻ヨ兘鍦� [Gitee](https://gitee.com/Sonve/sv-editor) 涓婄偣涓� 猸恠tar锛屼笉鑳滄劅婵�Thanks鈾�(锝ハ夛渐)锞�
+
+娆㈣繋鍔犵兢璁ㄨ锛孮缇わ細
+鈶� [852637893](https://qm.qq.com/cgi-bin/qm/qr?k=R7DHSqqDI4-xRCfwdUB2e3NrTytHpcVe&jump_from=webapi&authKey=2IpufavBOSPOLdncCt7EFnbmbWrUHg1c8iqNEdTzG8zCvnKb8/0aaLXF4HJzlp2R) 
+鈶� [816646292](https://qm.qq.com/cgi-bin/qm/qr?k=ndZIUqx0xctbq8oDQVTiDir7AUO5jq9X&jump_from=webapi&authKey=fgk45wWObUUvig7FIuFUuM+0IFLvOJI7LMc1d4qNbWAIfehakai/ZfckYfAGLPne)

--
Gitblit v1.8.0