fl-web-component 2.1.20 → 2.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,124 @@
1
1
  import { gunzipSync } from 'fflate';
2
2
  import StreamLoaderParserWorker from './StreamLoaderParser.worker.js';
3
3
 
4
+ const STREAM_LOADER_DB_NAME = 'StreamLoaderDB';
5
+ const STREAM_LOADER_BOX_STORE = 'boxCache';
6
+
7
+ // IndexedDB 连接在模块级复用,保证没有 StreamLoader 实例时也能读写缓存
8
+ let streamLoaderDbReady = null;
9
+
10
+ /**
11
+ * 生成包围盒缓存主键,必须与写入时保持完全一致
12
+ * @param {string|number} projectId - 项目ID
13
+ * @param {string|number} documentId - 模型文档ID
14
+ * @returns {string} 形如 `${projectId}:${documentId}` 的主键
15
+ */
16
+ function buildBoxCacheKey(projectId, documentId) {
17
+ return `${projectId || 0}:${documentId}`;
18
+ }
19
+
20
+ /**
21
+ * 打开并缓存 StreamLoader 使用的 IndexedDB
22
+ * @returns {Promise<IDBDatabase|null>} 环境不支持或打开失败时返回 null
23
+ */
24
+ function openStreamLoaderDB() {
25
+ if (streamLoaderDbReady) return streamLoaderDbReady;
26
+ streamLoaderDbReady = new Promise(resolve => {
27
+ if (typeof indexedDB === 'undefined') {
28
+ resolve(null);
29
+ return;
30
+ }
31
+ // 打开数据库
32
+ const request = indexedDB.open(STREAM_LOADER_DB_NAME, 1);
33
+ request.onerror = () => {
34
+ console.warn('IndexedDB open failed');
35
+ resolve(null);
36
+ };
37
+ request.onsuccess = () => resolve(request.result);
38
+ request.onupgradeneeded = event => {
39
+ const db = event.target.result;
40
+ if (!db.objectStoreNames.contains(STREAM_LOADER_BOX_STORE)) {
41
+ db.createObjectStore(STREAM_LOADER_BOX_STORE);
42
+ }
43
+ };
44
+ });
45
+ return streamLoaderDbReady;
46
+ }
47
+
48
+ /**
49
+ * 删除指定项目下的全部包围盒缓存
50
+ * @param {string|number} [projectId] - 项目ID,缺省时按 0 处理(与写入默认值一致)
51
+ * @returns {Promise<boolean>}
52
+ * cleared 为该项目下是否已确认无缓存残留(原本就没有缓存时同样为 true);
53
+ * deletedCount 为本次实际删除条数,环境不支持 IndexedDB 或事务失败时 cleared 为 false
54
+ */
55
+ export async function clearProjectBoxCache(projectId) {
56
+ const keyPrefix = `${projectId || 0}:`;
57
+ const matchPrefix = keys => (keys || []).filter(key => String(key).startsWith(keyPrefix));
58
+ let deletedCount = 0;
59
+ let remainingCount = -1;
60
+ try {
61
+ const db = await openStreamLoaderDB();
62
+ if (!db) return { cleared: false, deletedCount };
63
+ await new Promise((resolve, reject) => {
64
+ const transaction = db.transaction([STREAM_LOADER_BOX_STORE], 'readwrite');
65
+ const store = transaction.objectStore(STREAM_LOADER_BOX_STORE);
66
+ const keysRequest = store.getAllKeys();
67
+ keysRequest.onsuccess = () => {
68
+ // 主键带 projectId 前缀与冒号,因此不会误删相邻 ID(如 1 与 12)
69
+ const keys = matchPrefix(keysRequest.result);
70
+ deletedCount = keys.length;
71
+ keys.forEach(key => store.delete(key));
72
+ // 同一事务内请求按发起顺序执行,回查可确认该项目下是否真的清空
73
+ const verifyRequest = store.getAllKeys();
74
+ verifyRequest.onsuccess = () => {
75
+ remainingCount = matchPrefix(verifyRequest.result).length;
76
+ };
77
+ verifyRequest.onerror = () => reject(verifyRequest.error);
78
+ };
79
+ keysRequest.onerror = () => reject(keysRequest.error);
80
+ transaction.oncomplete = () => resolve();
81
+ transaction.onabort = () => reject(transaction.error);
82
+ });
83
+ return remainingCount === 0;
84
+ } catch (e) {
85
+ console.warn('Error clearing IndexedDB box cache:', e);
86
+ return false;
87
+ }
88
+ }
89
+
90
+ /**
91
+ * 删除指定项目下单条包围盒缓存
92
+ * @param {string|number} documentId - 模型文档ID
93
+ * @param {string|number} [projectId] - 项目ID,缺省时按 0 处理(与写入默认值一致)
94
+ * @returns {Promise<boolean>} 命中的缓存是否存在并被删除
95
+ */
96
+ export async function clearDocumentBoxCache(documentId, projectId) {
97
+ if (documentId === undefined || documentId === null || documentId === '') return false;
98
+ const key = buildBoxCacheKey(projectId, documentId);
99
+ try {
100
+ const db = await openStreamLoaderDB();
101
+ if (!db) return false;
102
+ let existed = false;
103
+ await new Promise((resolve, reject) => {
104
+ const transaction = db.transaction([STREAM_LOADER_BOX_STORE], 'readwrite');
105
+ const store = transaction.objectStore(STREAM_LOADER_BOX_STORE);
106
+ const countRequest = store.count(key);
107
+ countRequest.onsuccess = () => {
108
+ existed = countRequest.result > 0;
109
+ if (existed) store.delete(key);
110
+ };
111
+ countRequest.onerror = () => reject(countRequest.error);
112
+ transaction.oncomplete = () => resolve();
113
+ transaction.onabort = () => reject(transaction.error);
114
+ });
115
+ return existed;
116
+ } catch (e) {
117
+ console.warn('Error clearing IndexedDB box cache:', e);
118
+ return false;
119
+ }
120
+ }
121
+
4
122
  /**
5
123
  * StreamLoader 类
6
124
  * 封装流式加载、解析与渲染调度的核心逻辑
@@ -1771,27 +1889,7 @@ export class StreamLoader {
1771
1889
  // ----------------------------------------------------------------
1772
1890
 
1773
1891
  _initDB() {
1774
- if (this._dbReady) return this._dbReady;
1775
- this._dbReady = new Promise((resolve, reject) => {
1776
- if (typeof indexedDB === 'undefined') {
1777
- resolve(null);
1778
- return;
1779
- }
1780
- // 打开数据库
1781
- const request = indexedDB.open('StreamLoaderDB', 1);
1782
- request.onerror = () => {
1783
- console.warn('IndexedDB open failed');
1784
- resolve(null);
1785
- };
1786
- request.onsuccess = () => resolve(request.result);
1787
- request.onupgradeneeded = event => {
1788
- const db = event.target.result;
1789
- if (!db.objectStoreNames.contains('boxCache')) {
1790
- db.createObjectStore('boxCache');
1791
- }
1792
- };
1793
- });
1794
- return this._dbReady;
1892
+ return openStreamLoaderDB();
1795
1893
  }
1796
1894
 
1797
1895
  async _getFromDB(id, projectId = this.projectId || 0) {
@@ -1801,7 +1899,7 @@ export class StreamLoader {
1801
1899
  return new Promise(resolve => {
1802
1900
  const transaction = db.transaction(['boxCache'], 'readonly');
1803
1901
  const store = transaction.objectStore('boxCache');
1804
- const request = store.get(`${projectId}:${id}`);
1902
+ const request = store.get(buildBoxCacheKey(projectId, id));
1805
1903
  request.onsuccess = () => resolve(request.result);
1806
1904
  request.onerror = () => resolve(null);
1807
1905
  });
@@ -1817,9 +1915,28 @@ export class StreamLoader {
1817
1915
  if (!db) return;
1818
1916
  const transaction = db.transaction(['boxCache'], 'readwrite');
1819
1917
  const store = transaction.objectStore('boxCache');
1820
- store.put(data, `${projectId}:${id}`);
1918
+ store.put(data, buildBoxCacheKey(projectId, id));
1821
1919
  } catch (e) {
1822
1920
  console.warn('Error saving to IndexedDB:', e);
1823
1921
  }
1824
1922
  }
1923
+
1924
+ /**
1925
+ * 清除指定项目下的全部包围盒缓存
1926
+ * @param {string|number} [projectId=this.projectId] - 项目ID
1927
+ * @returns {Promise<{cleared: boolean, deletedCount: number}>} 该项目下是否已清空及实际删除条数
1928
+ */
1929
+ clearBoxCacheByProject(projectId = this.projectId || 0) {
1930
+ return clearProjectBoxCache(projectId);
1931
+ }
1932
+
1933
+ /**
1934
+ * 清除指定项目下单条包围盒缓存
1935
+ * @param {string|number} documentId - 模型文档ID
1936
+ * @param {string|number} [projectId=this.projectId] - 项目ID
1937
+ * @returns {Promise<boolean>} 命中的缓存是否存在并被删除
1938
+ */
1939
+ clearBoxCacheByDocumentId(documentId, projectId = this.projectId || 0) {
1940
+ return clearDocumentBoxCache(documentId, projectId);
1941
+ }
1825
1942
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["webpack://fl-web-component/packages/components/com-graphics/index.vue?vue&type=style&index=0&id=f8ae62c2&lang=scss&scoped=true","webpack://fl-web-component/packages/components/com-graphics/index.vue?vue&type=style&index=1&id=f8ae62c2&lang=css","webpack://fl-web-component/packages/components/com-flcanvas/index.vue?vue&type=style&index=0&id=9a4a041c&lang=scss&scoped=true","webpack://fl-web-component/packages/components/com-graphics/per-control.vue?vue&type=style&index=0&id=5dd9113a&lang=scss&scoped=true","webpack://fl-web-component/packages/components/com-graphics/component/ann-tool.vue?vue&type=style&index=0&id=5006df4e&scoped=true&lang=scss","webpack://fl-web-component/packages/components/com-graphics/pid.vue?vue&type=style&index=0&id=3951dc18&lang=scss&scoped=true"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,C;;ACzIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1KA;AACA;AACA;AACA;AACA;AACA;AACA,C;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,C;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,C;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,C","file":"fl-web-component.css","sourcesContent":["@charset \"UTF-8\";\n.fl-model-containor[data-v-f8ae62c2] {\n width: 100%;\n height: 100%;\n position: relative;\n cursor: pointer;\n}\n[data-v-f8ae62c2] .tips-label {\n width: 60px;\n color: #000;\n font: 12px Helvetica;\n margin-top: -3em;\n padding: 5px;\n text-align: center;\n vertical-align: middle;\n background-color: khaki;\n}\n[data-v-f8ae62c2] .measure-label {\n max-width: 100px;\n margin-top: -1em;\n border: 10px;\n border-radius: 5px;\n padding: 3px 10px;\n cursor: pointer;\n color: #009bea;\n background-color: #f4f4f4;\n -webkit-box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.25);\n box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.25);\n}\n[data-v-f8ae62c2] .circle-tag {\n width: 10px;\n height: 10px;\n margin-top: 0;\n border-radius: 50%;\n background-color: #ff5000;\n}\n[data-v-f8ae62c2] .measure-label-font {\n word-break: break-all;\n}\n[data-v-f8ae62c2] .mark-label-img {\n padding-top: 5px;\n width: 20px;\n height: 20px;\n}\n\n/* 加载指示器样式 */\n.loading-overlay[data-v-f8ae62c2] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.7);\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n z-index: 1000;\n opacity: 0;\n visibility: hidden;\n -webkit-transition: opacity 0.3s ease, visibility 0.3s ease;\n transition: opacity 0.3s ease, visibility 0.3s ease;\n}\n.loading-overlay--visible[data-v-f8ae62c2] {\n opacity: 1;\n visibility: visible;\n}\n.loading-content[data-v-f8ae62c2] {\n background: white;\n border-radius: 12px;\n padding: 30px;\n text-align: center;\n -webkit-box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);\n min-width: 300px;\n max-width: 400px;\n}\n.loading-spinner[data-v-f8ae62c2] {\n width: 40px;\n height: 40px;\n border: 4px solid #f3f3f3;\n border-top: 4px solid #409eff;\n border-radius: 50%;\n -webkit-animation: spin-f8ae62c2 1s linear infinite;\n animation: spin-f8ae62c2 1s linear infinite;\n margin: 0 auto 20px;\n}\n@-webkit-keyframes spin-f8ae62c2 {\n0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n}\n100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n}\n}\n@keyframes spin-f8ae62c2 {\n0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n}\n100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n}\n}\n.loading-text[data-v-f8ae62c2] {\n font-size: 16px;\n font-weight: 500;\n color: #333;\n margin-bottom: 20px;\n}\n.loading-this.progress-bar[data-v-f8ae62c2] {\n width: 100%;\n height: 8px;\n background-color: #f0f0f0;\n border-radius: 4px;\n overflow: hidden;\n margin-bottom: 15px;\n}\n.loading-this.progress-fill[data-v-f8ae62c2] {\n height: 100%;\n background: -webkit-gradient(linear, left top, right top, from(#409eff), to(#67c23a));\n background: linear-gradient(90deg, #409eff 0%, #67c23a 100%);\n border-radius: 4px;\n -webkit-transition: width 0.3s ease;\n transition: width 0.3s ease;\n}\n.loading-details[data-v-f8ae62c2] {\n font-size: 12px;\n color: #666;\n line-height: 1.5;\n}","\r\n/* 自定义lil-gui样式 - 浅色主题 */\n.lil-this.gui {\r\n background: rgba(255, 255, 255, 0.95) !important;\r\n border: 1px solid #e0e0e0 !important;\r\n border-radius: 8px !important;\r\n -webkit-box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important;\r\n backdrop-filter: blur(10px) !important;\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;\n}\n.lil-this.gui .title {\r\n background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%) !important;\r\n color: #495057 !important;\r\n border-bottom: 1px solid #dee2e6 !important;\r\n font-weight: 600 !important;\r\n padding: 0px 12px !important;\r\n border-radius: 8px 8px 0 0 !important;\n}\n.lil-this.gui .controller {\r\n border-bottom: 1px solid #f1f3f4 !important;\r\n background: transparent !important;\n}\n.lil-this.gui .controller:last-child {\r\n border-bottom: none !important;\n}\n.lil-this.gui .controller .name {\r\n color: #495057 !important;\r\n font-weight: 500 !important;\r\n font-size: 12px !important;\n}\n.lil-this.gui .controller .widget {\r\n background: #f8f9fa !important;\r\n border: 1px solid #ced4da !important;\r\n border-radius: 4px !important;\r\n color: #495057 !important;\n}\n.lil-this.gui .controller .widget:hover {\r\n border-color: #80bdff !important;\r\n -webkit-box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25) !important;\r\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25) !important;\n}\n.lil-this.gui .controller .widget:focus {\r\n border-color: #80bdff !important;\r\n -webkit-box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25) !important;\r\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25) !important;\r\n outline: none !important;\n}\n.lil-this.gui .controller input[type='range'] {\r\n background: #e9ecef !important;\r\n height: 4px !important;\r\n -webkit-appearance: none !important;\r\n -moz-appearance: none !important;\r\n appearance: none !important;\r\n border-radius: 2px !important;\n}\n.lil-this.gui .controller.number .fill {\r\n border-right: solid #008de9;\n}\n.lil-this.gui .controller input[type='range']::-webkit-slider-thumb {\r\n background: #007bff !important;\r\n border: 2px solid #ffffff !important;\r\n -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2) !important;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2) !important;\r\n width: 16px !important;\r\n height: 16px !important;\r\n border-radius: 50% !important;\r\n -webkit-appearance: none !important;\r\n appearance: none !important;\r\n cursor: pointer !important;\n}\n.lil-this.gui .controller input[type='range']::-moz-range-thumb {\r\n background: #007bff !important;\r\n border: 2px solid #ffffff !important;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2) !important;\r\n width: 16px !important;\r\n height: 16px !important;\r\n border-radius: 50% !important;\r\n cursor: pointer !important;\n}\n.lil-this.gui .controller .option {\r\n background: #ffffff !important;\r\n color: #495057 !important;\r\n border-bottom: 1px solid #f1f3f4 !important;\n}\n.lil-this.gui .controller .option:hover {\r\n background: #f8f9fa !important;\n}\n.lil-this.gui .controller .option:last-child {\r\n border-bottom: none !important;\n}\n.lil-this.gui input:active {\r\n background: #e6eff4;\n}\n.lil-this.gui .controller button {\r\n background: linear-gradient(135deg, #007bff 0%, #0056b3 100%) !important;\r\n color: #ffffff !important;\r\n border: none !important;\r\n border-radius: 4px !important;\r\n font-weight: 500 !important;\r\n -webkit-transition: all 0.2s ease !important;\r\n transition: all 0.2s ease !important;\n}\n.lil-this.gui .controller button:hover {\r\n background: linear-gradient(135deg, #0056b3 0%, #004085 100%) !important;\r\n -webkit-transform: translateY(-1px) !important;\r\n transform: translateY(-1px) !important;\r\n -webkit-box-shadow: 0 4px 8px rgba(0, 123, 255, 0.3) !important;\r\n box-shadow: 0 4px 8px rgba(0, 123, 255, 0.3) !important;\n}\n.lil-this.gui .controller .color {\r\n border: 2px solid #ffffff !important;\r\n border-radius: 4px !important;\r\n -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1) !important;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1) !important;\n}\n.lil-this.gui .controller.number .slider {\r\n background-color: #e6eff4;\n}\n.lil-this.gui .controller.number .slider:hover {\r\n background-color: #e6eff4;\n}\n.lil-this.gui input:hover {\r\n background: #e6eff4;\n}\n.lil-this.gui input[type='number']:focus,\r\n.lil-this.gui input[type='text']:focus,\r\n.lil-this.gui input {\r\n background: #e6eff4;\n}\n.lil-this.gui .controller > .name {\r\n min-width: 25px;\n}\n.lil-this.gui .controller.number input {\r\n color: #2e3136;\n}\n.lil-this.gui .controller.number .slider:active {\r\n background-color: #e6eff4;\n}\n.lil-this.gui .folder > .title {\r\n background: linear-gradient(135deg, #f1f3f4 0%, #e9ecef 100%) !important;\r\n color: #495057 !important;\r\n border-bottom: 1px solid #dee2e6 !important;\n}\n.lil-this.gui .folder > .title:before {\r\n color: #6c757d !important;\n}\n.lil-this.gui .folder.closed > .children {\r\n display: none !important;\n}\n.lil-gui button {\r\n -webkit-tap-highlight-color: transparent;\r\n background: none;\r\n border: none;\r\n color: #000000;\r\n cursor: pointer;\r\n font-family: var(--font-family);\r\n font-size: var(--font-size);\r\n height: var(--widget-height);\r\n line-height: calc(var(--widget-height) - 4px);\r\n outline: none;\r\n text-align: right;\r\n text-transform: none;\r\n width: 70%;\n}\n@media (hover: hover) {\n.lil-gui button:hover {\r\n background: none;\r\n border-color: none;\n}\n}\r\n","#konva-container[data-v-9a4a041c] {\n z-index: 3;\n width: 100%;\n height: 100%;\n cursor: pointer;\n overflow: hidden;\n}","@charset \"UTF-8\";\nspan[data-v-5dd9113a] {\n font-weight: bolder;\n}\n.text[data-v-5dd9113a] {\n margin-top: 20px;\n}\n.description[data-v-5dd9113a] {\n margin-bottom: 20px;\n}\n.line[data-v-5dd9113a] {\n border-bottom: 1px solid #dcdfe6;\n margin: 20px 0;\n}\n.center[data-v-5dd9113a] {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n}\n.center .top span[data-v-5dd9113a],\n.center .cen span[data-v-5dd9113a] {\n color: #53a8ff;\n display: inline-block;\n width: 40px;\n height: 40px;\n text-align: center;\n line-height: 30px;\n border: 1px solid #53a8ff;\n padding: 5px;\n margin-bottom: 10px;\n background-color: #e9f3ff;\n}\n.center .cen span[data-v-5dd9113a] {\n margin: 10px;\n}\n.button[data-v-5dd9113a] {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-pack: end;\n -ms-flex-pack: end;\n justify-content: end;\n margin-top: 20px;\n}\n@font-face {\n font-family: \"iconfont\";\n /* Project id 3226805 */\n src: url(\"//at.alicdn.com/t/font_3226805_qqvo3ag3r8.woff2?t=1646635700216\") format(\"woff2\"), url(\"//at.alicdn.com/t/font_3226805_qqvo3ag3r8.woff?t=1646635700216\") format(\"woff\"), url(\"//at.alicdn.com/t/font_3226805_qqvo3ag3r8.ttf?t=1646635700216\") format(\"truetype\");\n}\n.iconfont[data-v-5dd9113a] {\n font-family: \"iconfont\" !important;\n font-size: 50px;\n font-style: normal;\n color: #53a8ff;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.icon-shubiao[data-v-5dd9113a]:before {\n content: \"\";\n}",".main_body[data-v-5006df4e] {\n position: relative;\n width: 100%;\n height: 100%;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n overflow: hidden;\n}\n.classification_title[data-v-5006df4e] {\n margin: 0 0 10px 0;\n color: #fff;\n font-size: 14px;\n cursor: default;\n}\n.toolbar[data-v-5006df4e] {\n z-index: 10;\n position: absolute;\n width: 520px;\n padding: 8px 16px;\n border-radius: 6px;\n -webkit-box-shadow: 0px 2px 10px 0px rgba(6, 29, 44, 0.25);\n box-shadow: 0px 2px 10px 0px rgba(6, 29, 44, 0.25);\n background-color: #fff;\n top: 10px;\n left: 50%;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n -webkit-transform: translateX(-50%);\n transform: translateX(-50%);\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: distribute;\n justify-content: space-around;\n}\n.icon_toolbar[data-v-5006df4e],\n.text_toolbar[data-v-5006df4e] {\n float: left;\n width: 32px;\n height: 32px;\n padding: 0px !important;\n background-repeat: no-repeat;\n background-size: 24px;\n background-position: center;\n}\n.icon_toolbar[data-v-5006df4e]:hover,\n.text_toolbar[data-v-5006df4e]:hover,\n.icon_active[data-v-5006df4e] {\n background-color: #eeeeee;\n}\n[data-v-5006df4e].icon_color .el-color-picker__trigger {\n height: 24px;\n margin-top: 4px;\n width: 24px !important;\n}\n[data-v-5006df4e].el-color-picker--medium,[data-v-5006df4e].el-color-picker--medium .el-color-picker__trigger {\n width: 24px !important;\n height: 24px !important;\n}\n.canvas_container[data-v-5006df4e] {\n position: relative;\n width: 100%;\n height: 100%;\n overflow: auto;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n}\n.canvas_container canvas[data-v-5006df4e] {\n position: absolute;\n left: 0;\n}\n.canvas_container #ctx_front[data-v-5006df4e] {\n z-index: 5;\n background-color: transparent;\n}\n.canvas_container #ctx_back[data-v-5006df4e] {\n z-index: 3;\n}\n.canvas_container #ctx_base[data-v-5006df4e] {\n z-index: 1;\n}\n#text[data-v-5006df4e] {\n position: absolute;\n z-index: -1;\n resize: none;\n outline: none;\n border: 1px dashed #9c9c9c;\n overflow: hidden;\n background: transparent;\n line-height: 30px;\n display: none;\n}\n#text[data-v-5006df4e]:hover {\n border: 1px dashed #53a8ff;\n}","#svg-component[data-v-3951dc18],\n#svg-tigger[data-v-3951dc18] {\n cursor: pointer;\n height: 100%;\n width: 100%;\n position: relative;\n}\n#toolbar-show[data-v-3951dc18] {\n z-index: 20;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n overflow: hidden;\n background: #fff;\n}"],"sourceRoot":""}