@visactor/vtable-sheet 1.20.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/cjs/components/vtable-sheet.d.ts +78 -0
  2. package/cjs/components/vtable-sheet.js +474 -0
  3. package/cjs/components/vtable-sheet.js.map +1 -0
  4. package/cjs/core/WorkSheet.d.ts +69 -0
  5. package/cjs/core/WorkSheet.js +298 -0
  6. package/cjs/core/WorkSheet.js.map +1 -0
  7. package/cjs/core/table-plugins.d.ts +3 -0
  8. package/cjs/core/table-plugins.js +171 -0
  9. package/cjs/core/table-plugins.js.map +1 -0
  10. package/cjs/event/event-manager.d.ts +29 -0
  11. package/cjs/event/event-manager.js +71 -0
  12. package/cjs/event/event-manager.js.map +1 -0
  13. package/cjs/event/event-target.d.ts +12 -0
  14. package/cjs/event/event-target.js +50 -0
  15. package/cjs/event/event-target.js.map +1 -0
  16. package/cjs/formula/cell-highlight-manager.d.ts +29 -0
  17. package/cjs/formula/cell-highlight-manager.js +141 -0
  18. package/cjs/formula/cell-highlight-manager.js.map +1 -0
  19. package/cjs/formula/formula-autocomplete.d.ts +39 -0
  20. package/cjs/formula/formula-autocomplete.js +239 -0
  21. package/cjs/formula/formula-autocomplete.js.map +1 -0
  22. package/cjs/formula/formula-editor.d.ts +21 -0
  23. package/cjs/formula/formula-editor.js +162 -0
  24. package/cjs/formula/formula-editor.js.map +1 -0
  25. package/cjs/formula/formula-helper.d.ts +8 -0
  26. package/cjs/formula/formula-helper.js +66 -0
  27. package/cjs/formula/formula-helper.js.map +1 -0
  28. package/cjs/formula/formula-range-selector.d.ts +19 -0
  29. package/cjs/formula/formula-range-selector.js +201 -0
  30. package/cjs/formula/formula-range-selector.js.map +1 -0
  31. package/cjs/formula/formula-throttle.d.ts +10 -0
  32. package/cjs/formula/formula-throttle.js +39 -0
  33. package/cjs/formula/formula-throttle.js.map +1 -0
  34. package/cjs/formula/formula-ui-manager.d.ts +19 -0
  35. package/cjs/formula/formula-ui-manager.js +226 -0
  36. package/cjs/formula/formula-ui-manager.js.map +1 -0
  37. package/cjs/formula/index.d.ts +5 -0
  38. package/cjs/formula/index.js +23 -0
  39. package/cjs/formula/index.js.map +1 -0
  40. package/cjs/index.d.ts +6 -0
  41. package/cjs/index.js +50 -0
  42. package/cjs/index.js.map +1 -0
  43. package/cjs/managers/formula-manager.d.ts +82 -0
  44. package/cjs/managers/formula-manager.js +445 -0
  45. package/cjs/managers/formula-manager.js.map +1 -0
  46. package/cjs/managers/menu-manager.d.ts +12 -0
  47. package/cjs/managers/menu-manager.js +89 -0
  48. package/cjs/managers/menu-manager.js.map +1 -0
  49. package/cjs/managers/sheet-manager.d.ts +21 -0
  50. package/cjs/managers/sheet-manager.js +74 -0
  51. package/cjs/managers/sheet-manager.js.map +1 -0
  52. package/cjs/managers/tab-drag-manager.d.ts +24 -0
  53. package/cjs/managers/tab-drag-manager.js +121 -0
  54. package/cjs/managers/tab-drag-manager.js.map +1 -0
  55. package/cjs/sheet-helper.d.ts +16 -0
  56. package/cjs/sheet-helper.js +64 -0
  57. package/cjs/sheet-helper.js.map +1 -0
  58. package/cjs/styles/common.d.ts +1 -0
  59. package/cjs/styles/common.js +17 -0
  60. package/cjs/styles/common.js.map +1 -0
  61. package/cjs/styles/formula-autocomplete.d.ts +1 -0
  62. package/cjs/styles/formula-autocomplete.js +17 -0
  63. package/cjs/styles/formula-autocomplete.js.map +1 -0
  64. package/cjs/styles/formula-bar.d.ts +1 -0
  65. package/cjs/styles/formula-bar.js +17 -0
  66. package/cjs/styles/formula-bar.js.map +1 -0
  67. package/cjs/styles/menu.d.ts +1 -0
  68. package/cjs/styles/menu.js +17 -0
  69. package/cjs/styles/menu.js.map +1 -0
  70. package/cjs/styles/sheet-tab.d.ts +1 -0
  71. package/cjs/styles/sheet-tab.js +17 -0
  72. package/cjs/styles/sheet-tab.js.map +1 -0
  73. package/cjs/styles/sheet.d.ts +1 -0
  74. package/cjs/styles/sheet.js +17 -0
  75. package/cjs/styles/sheet.js.map +1 -0
  76. package/cjs/styles/style-manager.d.ts +1 -0
  77. package/cjs/styles/style-manager.js +15 -0
  78. package/cjs/styles/style-manager.js.map +1 -0
  79. package/cjs/test/formula-complete.test.d.ts +1 -0
  80. package/cjs/test/formula-complete.test.js +42 -0
  81. package/cjs/test/formula-complete.test.js.map +1 -0
  82. package/cjs/tools/env.d.ts +20 -0
  83. package/cjs/tools/env.js +59 -0
  84. package/cjs/tools/env.js.map +1 -0
  85. package/cjs/tools/index.d.ts +3 -0
  86. package/cjs/tools/index.js +16 -0
  87. package/cjs/tools/index.js.map +1 -0
  88. package/cjs/tools/ui/snackbar.d.ts +1 -0
  89. package/cjs/tools/ui/snackbar.js +20 -0
  90. package/cjs/tools/ui/snackbar.js.map +1 -0
  91. package/cjs/ts-types/base.d.ts +44 -0
  92. package/cjs/ts-types/base.js +14 -0
  93. package/cjs/ts-types/base.js.map +1 -0
  94. package/cjs/ts-types/event.d.ts +79 -0
  95. package/cjs/ts-types/event.js +6 -0
  96. package/cjs/ts-types/event.js.map +1 -0
  97. package/cjs/ts-types/events.d.ts +1 -0
  98. package/cjs/ts-types/events.js +3 -0
  99. package/cjs/ts-types/events.js.map +1 -0
  100. package/cjs/ts-types/filter.d.ts +58 -0
  101. package/cjs/ts-types/filter.js +16 -0
  102. package/cjs/ts-types/filter.js.map +1 -0
  103. package/cjs/ts-types/formula.d.ts +51 -0
  104. package/cjs/ts-types/formula.js +6 -0
  105. package/cjs/ts-types/formula.js.map +1 -0
  106. package/cjs/ts-types/index.d.ts +67 -0
  107. package/cjs/ts-types/index.js +37 -0
  108. package/cjs/ts-types/index.js.map +1 -0
  109. package/cjs/ts-types/sheet.d.ts +45 -0
  110. package/cjs/ts-types/sheet.js +6 -0
  111. package/cjs/ts-types/sheet.js.map +1 -0
  112. package/cjs/vtable.d.ts +1 -0
  113. package/cjs/vtable.js +35 -0
  114. package/cjs/vtable.js.map +1 -0
  115. package/dist/vtable-sheet.js +114494 -0
  116. package/dist/vtable-sheet.min.js +853 -0
  117. package/es/components/vtable-sheet.d.ts +78 -0
  118. package/es/components/vtable-sheet.js +462 -0
  119. package/es/components/vtable-sheet.js.map +1 -0
  120. package/es/core/WorkSheet.d.ts +69 -0
  121. package/es/core/WorkSheet.js +298 -0
  122. package/es/core/WorkSheet.js.map +1 -0
  123. package/es/core/table-plugins.d.ts +3 -0
  124. package/es/core/table-plugins.js +164 -0
  125. package/es/core/table-plugins.js.map +1 -0
  126. package/es/event/event-manager.d.ts +29 -0
  127. package/es/event/event-manager.js +63 -0
  128. package/es/event/event-manager.js.map +1 -0
  129. package/es/event/event-target.d.ts +12 -0
  130. package/es/event/event-target.js +42 -0
  131. package/es/event/event-target.js.map +1 -0
  132. package/es/formula/cell-highlight-manager.d.ts +29 -0
  133. package/es/formula/cell-highlight-manager.js +133 -0
  134. package/es/formula/cell-highlight-manager.js.map +1 -0
  135. package/es/formula/formula-autocomplete.d.ts +39 -0
  136. package/es/formula/formula-autocomplete.js +231 -0
  137. package/es/formula/formula-autocomplete.js.map +1 -0
  138. package/es/formula/formula-editor.d.ts +21 -0
  139. package/es/formula/formula-editor.js +135 -0
  140. package/es/formula/formula-editor.js.map +1 -0
  141. package/es/formula/formula-helper.d.ts +8 -0
  142. package/es/formula/formula-helper.js +60 -0
  143. package/es/formula/formula-helper.js.map +1 -0
  144. package/es/formula/formula-range-selector.d.ts +19 -0
  145. package/es/formula/formula-range-selector.js +195 -0
  146. package/es/formula/formula-range-selector.js.map +1 -0
  147. package/es/formula/formula-throttle.d.ts +10 -0
  148. package/es/formula/formula-throttle.js +31 -0
  149. package/es/formula/formula-throttle.js.map +1 -0
  150. package/es/formula/formula-ui-manager.d.ts +19 -0
  151. package/es/formula/formula-ui-manager.js +218 -0
  152. package/es/formula/formula-ui-manager.js.map +1 -0
  153. package/es/formula/index.d.ts +5 -0
  154. package/es/formula/index.js +10 -0
  155. package/es/formula/index.js.map +1 -0
  156. package/es/index.d.ts +6 -0
  157. package/es/index.js +13 -0
  158. package/es/index.js.map +1 -0
  159. package/es/managers/formula-manager.d.ts +82 -0
  160. package/es/managers/formula-manager.js +441 -0
  161. package/es/managers/formula-manager.js.map +1 -0
  162. package/es/managers/menu-manager.d.ts +12 -0
  163. package/es/managers/menu-manager.js +81 -0
  164. package/es/managers/menu-manager.js.map +1 -0
  165. package/es/managers/sheet-manager.d.ts +21 -0
  166. package/es/managers/sheet-manager.js +66 -0
  167. package/es/managers/sheet-manager.js.map +1 -0
  168. package/es/managers/tab-drag-manager.d.ts +24 -0
  169. package/es/managers/tab-drag-manager.js +113 -0
  170. package/es/managers/tab-drag-manager.js.map +1 -0
  171. package/es/sheet-helper.d.ts +16 -0
  172. package/es/sheet-helper.js +54 -0
  173. package/es/sheet-helper.js.map +1 -0
  174. package/es/styles/common.d.ts +1 -0
  175. package/es/styles/common.js +9 -0
  176. package/es/styles/common.js.map +1 -0
  177. package/es/styles/formula-autocomplete.d.ts +1 -0
  178. package/es/styles/formula-autocomplete.js +9 -0
  179. package/es/styles/formula-autocomplete.js.map +1 -0
  180. package/es/styles/formula-bar.d.ts +1 -0
  181. package/es/styles/formula-bar.js +9 -0
  182. package/es/styles/formula-bar.js.map +1 -0
  183. package/es/styles/menu.d.ts +1 -0
  184. package/es/styles/menu.js +9 -0
  185. package/es/styles/menu.js.map +1 -0
  186. package/es/styles/sheet-tab.d.ts +1 -0
  187. package/es/styles/sheet-tab.js +9 -0
  188. package/es/styles/sheet-tab.js.map +1 -0
  189. package/es/styles/sheet.d.ts +1 -0
  190. package/es/styles/sheet.js +9 -0
  191. package/es/styles/sheet.js.map +1 -0
  192. package/es/styles/style-manager.d.ts +1 -0
  193. package/es/styles/style-manager.js +17 -0
  194. package/es/styles/style-manager.js.map +1 -0
  195. package/es/test/formula-complete.test.d.ts +1 -0
  196. package/es/test/formula-complete.test.js +36 -0
  197. package/es/test/formula-complete.test.js.map +1 -0
  198. package/es/tools/env.d.ts +20 -0
  199. package/es/tools/env.js +53 -0
  200. package/es/tools/env.js.map +1 -0
  201. package/es/tools/index.d.ts +3 -0
  202. package/es/tools/index.js +9 -0
  203. package/es/tools/index.js.map +1 -0
  204. package/es/tools/ui/snackbar.d.ts +1 -0
  205. package/es/tools/ui/snackbar.js +14 -0
  206. package/es/tools/ui/snackbar.js.map +1 -0
  207. package/es/ts-types/base.d.ts +44 -0
  208. package/es/ts-types/base.js +14 -0
  209. package/es/ts-types/base.js.map +1 -0
  210. package/es/ts-types/event.d.ts +79 -0
  211. package/es/ts-types/event.js +2 -0
  212. package/es/ts-types/event.js.map +1 -0
  213. package/es/ts-types/events.d.ts +1 -0
  214. package/es/ts-types/events.js +3 -0
  215. package/es/ts-types/events.js.map +1 -0
  216. package/es/ts-types/filter.d.ts +58 -0
  217. package/es/ts-types/filter.js +16 -0
  218. package/es/ts-types/filter.js.map +1 -0
  219. package/es/ts-types/formula.d.ts +51 -0
  220. package/es/ts-types/formula.js +2 -0
  221. package/es/ts-types/formula.js.map +1 -0
  222. package/es/ts-types/index.d.ts +67 -0
  223. package/es/ts-types/index.js +14 -0
  224. package/es/ts-types/index.js.map +1 -0
  225. package/es/ts-types/sheet.d.ts +45 -0
  226. package/es/ts-types/sheet.js +2 -0
  227. package/es/ts-types/sheet.js.map +1 -0
  228. package/es/vtable.d.ts +1 -0
  229. package/es/vtable.js +2 -0
  230. package/es/vtable.js.map +1 -0
  231. package/package.json +120 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/styles/formula-autocomplete.ts"],"names":[],"mappings":";;;AAAA,sCAAmC;AAEnC,SAAgB,WAAW;IACzB,IAAI,SAAG,CAAC,IAAI,KAAK,MAAM,EAAE;QACvB,OAAO;KACR;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,GAAG,8CAA8C,CAAC;IACjE,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyK5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC;AAlLD,kCAkLC","file":"formula-autocomplete.js","sourcesContent":["import { Env } from '../tools/env';\n\nexport function importStyle() {\n if (Env.mode === 'node') {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.id = 'vtable-sheet-formula-autocomplete-styleSheet';\n styleElement.textContent = `\n/* 公式自动补全容器 */\n.vtable-formula-autocomplete {\n position: absolute;\n background: #ffffff;\n border: 1px solid #d9d9d9;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n max-height: 320px;\n overflow-y: auto;\n z-index: 1050;\n font-size: 13px;\n min-width: 300px;\n}\n\n/* 自动补全项 */\n.vtable-formula-autocomplete-item {\n padding: 8px 12px;\n cursor: pointer;\n transition: background-color 0.2s;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.vtable-formula-autocomplete-item:not(:last-child) {\n border-bottom: 1px solid #f0f0f0;\n}\n\n.vtable-formula-autocomplete-item:hover {\n background-color: #f5f7fa;\n}\n\n.vtable-formula-autocomplete-item.selected {\n background-color: #e6f7ff;\n}\n\n/* 函数名称 */\n.vtable-formula-autocomplete-item .item-name {\n font-weight: 600;\n color: #1890ff;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n font-size: 14px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* 函数类型标签 */\n.vtable-formula-autocomplete-item .item-type {\n display: inline-flex;\n align-items: center;\n padding: 0 6px;\n height: 18px;\n background: #f0f0f0;\n border-radius: 2px;\n font-size: 11px;\n color: #666;\n font-weight: normal;\n}\n\n.vtable-formula-autocomplete-item .item-type.function {\n background: #e6f7ff;\n color: #1890ff;\n}\n\n.vtable-formula-autocomplete-item .item-type.cell {\n background: #f6ffed;\n color: #52c41a;\n}\n\n.vtable-formula-autocomplete-item .item-type.range {\n background: #fff7e6;\n color: #fa8c16;\n}\n\n/* 函数签名 */\n.vtable-formula-autocomplete-item .item-signature {\n font-size: 12px;\n color: #595959;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n margin-left: 2px;\n}\n\n/* 函数描述 */\n.vtable-formula-autocomplete-item .item-description {\n font-size: 12px;\n color: #8c8c8c;\n line-height: 1.4;\n margin-top: 2px;\n}\n\n/* 无结果提示 */\n.vtable-formula-autocomplete-empty {\n padding: 20px;\n text-align: center;\n color: #999;\n font-size: 13px;\n}\n\n/* 滚动条样式 */\n.vtable-formula-autocomplete::-webkit-scrollbar {\n width: 6px;\n}\n\n.vtable-formula-autocomplete::-webkit-scrollbar-track {\n background: #f0f0f0;\n border-radius: 3px;\n}\n\n.vtable-formula-autocomplete::-webkit-scrollbar-thumb {\n background: #bfbfbf;\n border-radius: 3px;\n}\n\n.vtable-formula-autocomplete::-webkit-scrollbar-thumb:hover {\n background: #999;\n}\n\n/* 分组标题 */\n.vtable-formula-autocomplete-group {\n padding: 6px 12px;\n font-size: 12px;\n font-weight: 600;\n color: #999;\n background: #fafafa;\n border-bottom: 1px solid #f0f0f0;\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n/* 快捷键提示 */\n.vtable-formula-autocomplete-footer {\n padding: 8px 12px;\n background: #fafafa;\n border-top: 1px solid #f0f0f0;\n font-size: 11px;\n color: #999;\n display: flex;\n gap: 16px;\n position: sticky;\n bottom: 0;\n}\n\n.vtable-formula-autocomplete-footer .shortcut {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.vtable-formula-autocomplete-footer .key {\n display: inline-block;\n padding: 2px 6px;\n background: #fff;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 10px;\n color: #666;\n}\n\n.vtable-formula-autocomplete {\n z-index: 10000 !important;\n}\n\n.vtable-editor-container input {\n font-family: inherit;\n}\n`;\n\n document.head.appendChild(styleElement);\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function importStyle(): void;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.importStyle = void 0;
6
+
7
+ const env_1 = require("../tools/env");
8
+
9
+ function importStyle() {
10
+ if ("node" === env_1.Env.mode) return;
11
+ const styleElement = document.createElement("style");
12
+ styleElement.id = "vtable-sheet-formula-bar-styleSheet", styleElement.textContent = "\n /* 公式栏样式 */\n.vtable-sheet-formula-bar {\n height: 30px;\n padding: 0;\n border-bottom: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #fff;\n position: relative;\n z-index: 10;\n box-shadow: 0 1px 2px rgba(0,0,0,0.05);\n flex-grow: 1; /* 占据剩余宽度 */\n height: 100%; /* 确保高度填满父容器 */\n \n}\n\n/* 单元格地址显示 */\n.vtable-sheet-cell-address {\n width: 60px;\n padding: 0 10px;\n display: flex;\n align-items: center;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n color: #333;\n height: 100%;\n border: 1px solid #e0e0e0;\n font-size: 13px;\n}\n\n/* fx图标 */\n.vtable-sheet-formula-icon {\n font-weight: normal;\n font-style: italic;\n margin: 0 8px;\n font-size: 14px;\n color: #666;\n font-family: 'Roboto Mono', monospace;\n width: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* 公式输入框 */\n.vtable-sheet-formula-input {\n flex: 1;\n padding: 0 8px;\n border: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n outline: none;\n font-size: 13px;\n height: 100%;\n color: #333;\n background-color: transparent;\n}\n\n.vtable-sheet-formula-input:focus {\n outline: none;\n}\n\n/* 公式操作按钮容器 */\n.vtable-sheet-formula-actions {\n flex: 0;\n display: flex;\n align-items: right;\n height: 100%;\n width: 100px;\n padding: 0 4px;\n border-left: 1px solid #e0e0e0;\n}\n\n/* 公式操作按钮 */\n.vtable-sheet-formula-button {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 12px;\n color: #666;\n margin: 0 2px;\n padding: 0;\n border-radius: 2px;\n transition: all 0.2s;\n}\n\n/* 取消按钮 */\n.vtable-sheet-formula-cancel:hover {\n color: #d93025;\n background-color: #f8f8f8;\n}\n\n/* 确认按钮 */\n.vtable-sheet-formula-confirm:hover {\n color: #1e8e3e;\n background-color: #f8f8f8;\n}\n\n/* 其他按钮样式 - 当有更多功能时使用 */\n.vtable-sheet-formula-more {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 16px;\n color: #666;\n margin: 0 2px;\n padding: 0;\n}\n\n.vtable-sheet-formula-more:hover {\n color: #1a73e8;\n}\n\n/* 取消之前不需要的工具栏样式 */\n.vtable-sheet-toolbar,\n.vtable-sheet-toolbar-group {\n display: none;\n} \n",
13
+ document.head.appendChild(styleElement);
14
+ }
15
+
16
+ exports.importStyle = importStyle;
17
+ //# sourceMappingURL=formula-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/styles/formula-bar.ts"],"names":[],"mappings":";;;AAAA,sCAAmC;AAEnC,SAAgB,WAAW;IACzB,IAAI,SAAG,CAAC,IAAI,KAAK,MAAM,EAAE;QACvB,OAAO;KACR;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,GAAG,qCAAqC,CAAC;IACxD,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiI5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC;AA1ID,kCA0IC","file":"formula-bar.js","sourcesContent":["import { Env } from '../tools/env';\n\nexport function importStyle() {\n if (Env.mode === 'node') {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.id = 'vtable-sheet-formula-bar-styleSheet';\n styleElement.textContent = `\n /* 公式栏样式 */\n.vtable-sheet-formula-bar {\n height: 30px;\n padding: 0;\n border-bottom: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #fff;\n position: relative;\n z-index: 10;\n box-shadow: 0 1px 2px rgba(0,0,0,0.05);\n flex-grow: 1; /* 占据剩余宽度 */\n height: 100%; /* 确保高度填满父容器 */\n \n}\n\n/* 单元格地址显示 */\n.vtable-sheet-cell-address {\n width: 60px;\n padding: 0 10px;\n display: flex;\n align-items: center;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n color: #333;\n height: 100%;\n border: 1px solid #e0e0e0;\n font-size: 13px;\n}\n\n/* fx图标 */\n.vtable-sheet-formula-icon {\n font-weight: normal;\n font-style: italic;\n margin: 0 8px;\n font-size: 14px;\n color: #666;\n font-family: 'Roboto Mono', monospace;\n width: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* 公式输入框 */\n.vtable-sheet-formula-input {\n flex: 1;\n padding: 0 8px;\n border: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n outline: none;\n font-size: 13px;\n height: 100%;\n color: #333;\n background-color: transparent;\n}\n\n.vtable-sheet-formula-input:focus {\n outline: none;\n}\n\n/* 公式操作按钮容器 */\n.vtable-sheet-formula-actions {\n flex: 0;\n display: flex;\n align-items: right;\n height: 100%;\n width: 100px;\n padding: 0 4px;\n border-left: 1px solid #e0e0e0;\n}\n\n/* 公式操作按钮 */\n.vtable-sheet-formula-button {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 12px;\n color: #666;\n margin: 0 2px;\n padding: 0;\n border-radius: 2px;\n transition: all 0.2s;\n}\n\n/* 取消按钮 */\n.vtable-sheet-formula-cancel:hover {\n color: #d93025;\n background-color: #f8f8f8;\n}\n\n/* 确认按钮 */\n.vtable-sheet-formula-confirm:hover {\n color: #1e8e3e;\n background-color: #f8f8f8;\n}\n\n/* 其他按钮样式 - 当有更多功能时使用 */\n.vtable-sheet-formula-more {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 16px;\n color: #666;\n margin: 0 2px;\n padding: 0;\n}\n\n.vtable-sheet-formula-more:hover {\n color: #1a73e8;\n}\n\n/* 取消之前不需要的工具栏样式 */\n.vtable-sheet-toolbar,\n.vtable-sheet-toolbar-group {\n display: none;\n} \n`;\n\n document.head.appendChild(styleElement);\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function importStyle(): void;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.importStyle = void 0;
6
+
7
+ const env_1 = require("../tools/env");
8
+
9
+ function importStyle() {
10
+ if ("node" === env_1.Env.mode) return;
11
+ const styleElement = document.createElement("style");
12
+ styleElement.id = "vtable-sheet-menu-styleSheet", styleElement.textContent = "\n.vtable-sheet-main-menu {\n display: flex;\n flex-direction: row;\n align-items: center;\n height: 30px;\n padding: 0;\n border-bottom: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #fff;\n width: 50px;\n /* 内容居中 */\n justify-content: center;\n flex-shrink: 0; /* 防止菜单被压缩 */\n}\n.vtable-sheet-main-menu:hover {\n background-color: #f0f0f0;\n}\n\n.vtable-sheet-main-menu-button {\n display: flex;\n align-items: center;\n padding: 0 8px;\n cursor: pointer;\n height: 30px;\n}\n\n/* 菜单项容器 */\n.vtable-sheet-main-menu-container {\n position: absolute;\n top: 100%; /* 显示在按钮下方 */\n left: 0;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n z-index: 100;\n display: none;\n}\n\n.vtable-sheet-main-menu-container.active {\n display: block;\n}\n\n/* 菜单项列表(ul) */\n.vtable-sheet-main-menu-items {\n list-style: none;\n margin: 0;\n padding: 4px 0;\n min-width: 80px;\n /* 删除以下两行 */\n /* max-height: 300px; */\n /* overflow-y: hidden; */\n}\n\n/* 当内容超出时显示滚动条 */\n.vtable-sheet-main-menu-items.scrollable {\n overflow-y: auto;\n}\n\n/* 单个菜单项(li) */\n.vtable-sheet-main-menu-item {\n padding: 6px 12px;\n margin: 0; /* 清除默认外边距 */\n line-height: 1.5; /* 统一行高 */\n cursor: pointer;\n white-space: nowrap;\n color: #333; /* 文字颜色 */\n font-size: 12px; /* 字体大小 */\n transition: background 0.2s; /* 悬停动画 */\n \n /* 禁用文本选中 */\n user-select: none;\n -webkit-user-select: none;\n}\n\n/* 悬停和激活状态 */\n.vtable-sheet-main-menu-item:hover,\n.vtable-sheet-main-menu-item:focus {\n background-color: #f5f5f5; /* 浅灰色背景 */\n}\n\n.vtable-sheet-main-menu-item:active {\n background-color: #e0e0e0; /* 点击时深灰色 */\n}\n\n/* 分隔线(可选) */\n.vtable-sheet-main-menu-item.divider {\n border-top: 1px solid #e0e0e0;\n margin: 4px 0;\n padding: 0;\n height: 1px;\n cursor: default;\n}\n\n.vtable-sheet-main-menu-item-has-children {\n position: relative;\n}\n\n.vtable-sheet-main-menu-item-has-children::after {\n content: '>';\n position: absolute;\n right: 0px;\n top: 50%;\n transform: translateY(-50%);\n margin-right: 10px;\n}\n/* 子菜单容器 */\n.vtable-sheet-submenu-container {\n position: absolute;\n left: 100%; /* 默认向右展开 */\n top: 0;\n min-width: 120px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n z-index: 200; /* 高于主菜单 */\n display: none;\n}\n\n/* 激活时显示 */\n.vtable-sheet-main-menu-item:hover .vtable-sheet-submenu-container {\n display: block;\n}\n\n/* 子菜单项 */\n.vtable-sheet-submenu-item {\n position: relative; /* 为箭头定位 */\n padding: 8px 12px;\n cursor: pointer;\n transition: background 0.2s;\n}\n\n.vtable-sheet-submenu-item:hover {\n background: #f5f5f5;\n}\n\n/* 嵌套子菜单箭头 */\n.submenu-arrow {\n position: absolute;\n right: 8px;\n font-size: 10px;\n color: #999;\n}\n\n/* 响应式调整 */\n@media (max-width: 768px) {\n .vtable-sheet-submenu-container {\n left: auto !important;\n right: 100%; /* 小屏幕改为向左展开 */\n }\n}\n",
13
+ document.head.appendChild(styleElement);
14
+ }
15
+
16
+ exports.importStyle = importStyle;
17
+ //# sourceMappingURL=menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/styles/menu.ts"],"names":[],"mappings":";;;AAAA,sCAAmC;AAEnC,SAAgB,WAAW;IACzB,IAAI,SAAG,CAAC,IAAI,KAAK,MAAM,EAAE;QACvB,OAAO;KACR;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,GAAG,8BAA8B,CAAC;IACjD,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0J5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC;AAnKD,kCAmKC","file":"menu.js","sourcesContent":["import { Env } from '../tools/env';\n\nexport function importStyle() {\n if (Env.mode === 'node') {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.id = 'vtable-sheet-menu-styleSheet';\n styleElement.textContent = `\n.vtable-sheet-main-menu {\n display: flex;\n flex-direction: row;\n align-items: center;\n height: 30px;\n padding: 0;\n border-bottom: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #fff;\n width: 50px;\n /* 内容居中 */\n justify-content: center;\n flex-shrink: 0; /* 防止菜单被压缩 */\n}\n.vtable-sheet-main-menu:hover {\n background-color: #f0f0f0;\n}\n\n.vtable-sheet-main-menu-button {\n display: flex;\n align-items: center;\n padding: 0 8px;\n cursor: pointer;\n height: 30px;\n}\n\n/* 菜单项容器 */\n.vtable-sheet-main-menu-container {\n position: absolute;\n top: 100%; /* 显示在按钮下方 */\n left: 0;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n z-index: 100;\n display: none;\n}\n\n.vtable-sheet-main-menu-container.active {\n display: block;\n}\n\n/* 菜单项列表(ul) */\n.vtable-sheet-main-menu-items {\n list-style: none;\n margin: 0;\n padding: 4px 0;\n min-width: 80px;\n /* 删除以下两行 */\n /* max-height: 300px; */\n /* overflow-y: hidden; */\n}\n\n/* 当内容超出时显示滚动条 */\n.vtable-sheet-main-menu-items.scrollable {\n overflow-y: auto;\n}\n\n/* 单个菜单项(li) */\n.vtable-sheet-main-menu-item {\n padding: 6px 12px;\n margin: 0; /* 清除默认外边距 */\n line-height: 1.5; /* 统一行高 */\n cursor: pointer;\n white-space: nowrap;\n color: #333; /* 文字颜色 */\n font-size: 12px; /* 字体大小 */\n transition: background 0.2s; /* 悬停动画 */\n \n /* 禁用文本选中 */\n user-select: none;\n -webkit-user-select: none;\n}\n\n/* 悬停和激活状态 */\n.vtable-sheet-main-menu-item:hover,\n.vtable-sheet-main-menu-item:focus {\n background-color: #f5f5f5; /* 浅灰色背景 */\n}\n\n.vtable-sheet-main-menu-item:active {\n background-color: #e0e0e0; /* 点击时深灰色 */\n}\n\n/* 分隔线(可选) */\n.vtable-sheet-main-menu-item.divider {\n border-top: 1px solid #e0e0e0;\n margin: 4px 0;\n padding: 0;\n height: 1px;\n cursor: default;\n}\n\n.vtable-sheet-main-menu-item-has-children {\n position: relative;\n}\n\n.vtable-sheet-main-menu-item-has-children::after {\n content: '>';\n position: absolute;\n right: 0px;\n top: 50%;\n transform: translateY(-50%);\n margin-right: 10px;\n}\n/* 子菜单容器 */\n.vtable-sheet-submenu-container {\n position: absolute;\n left: 100%; /* 默认向右展开 */\n top: 0;\n min-width: 120px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n z-index: 200; /* 高于主菜单 */\n display: none;\n}\n\n/* 激活时显示 */\n.vtable-sheet-main-menu-item:hover .vtable-sheet-submenu-container {\n display: block;\n}\n\n/* 子菜单项 */\n.vtable-sheet-submenu-item {\n position: relative; /* 为箭头定位 */\n padding: 8px 12px;\n cursor: pointer;\n transition: background 0.2s;\n}\n\n.vtable-sheet-submenu-item:hover {\n background: #f5f5f5;\n}\n\n/* 嵌套子菜单箭头 */\n.submenu-arrow {\n position: absolute;\n right: 8px;\n font-size: 10px;\n color: #999;\n}\n\n/* 响应式调整 */\n@media (max-width: 768px) {\n .vtable-sheet-submenu-container {\n left: auto !important;\n right: 100%; /* 小屏幕改为向左展开 */\n }\n}\n`;\n\n document.head.appendChild(styleElement);\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function importStyle(): void;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.importStyle = void 0;
6
+
7
+ const env_1 = require("../tools/env");
8
+
9
+ function importStyle() {
10
+ if ("node" === env_1.Env.mode) return;
11
+ const styleElement = document.createElement("style");
12
+ styleElement.id = "vtable-sheet-sheet-tab-styleSheet", styleElement.textContent = "\n/* Sheet标签栏样式 */\n.vtable-sheet-tab-bar {\n height: 32px;\n padding: 0;\n border-top: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #f8f8f8;\n position: relative;\n box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.05);\n z-index: 10;\n width: 100%;\n}\n/* sheet列表样式 */\n.vtable-sheet-menu-list {\n position: absolute;\n right: 0;\n top: -175px;\n height: 174px;\n min-width: 140px;\n background-color: #f8f8f8;\n border: 1px solid #e0e0e0;\n box-sizing: content-box;\n border-radius: 4px;\n display: none;\n margin: 0;\n padding: 0 2px 0 2px;\n box-sizing: border-box;\n list-style: none;\n overflow-y: auto;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar {\n width: 4px;\n margin: 0;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar-thumb {\n background-color: #e0e0e0;\n border-radius: 3px;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar-track {\n background-color: transparent;\n}\n\n.vtable-sheet-menu-list.active {\n display: block;\n}\n/* sheet列表项样式 */\n.vtable-sheet-menu-item {\n display: flex;\n align-items: center;\n /* justify-content: space-between; */\n cursor: pointer;\n text-align: center;\n border-radius: 4px;\n height: 32px;\n line-height: 32px;\n margin: 2px 0;\n padding: 0 8px;\n background-color: #f8f8f840;\n max-width: 150px;\n overflow-x: hidden;\n text-overflow: ellipsis;\n box-sizing: border-box;\n}\n\n.vtable-sheet-menu-item:hover {\n background-color: #e0e0e0;\n}\n.vtable-sheet-menu-item.active {\n color: #1a73e8;\n}\n\n.vtable-sheet-menu-item-title {\n flex: 40px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Sheet标签容器 */\n.vtable-sheet-tabs-container {\n display: flex;\n flex: 1;\n flex-wrap: nowrap;\n /* 超出容器宽度时显示横向滚动条 */\n overflow-x: auto;\n overflow-y: visible; /* 允许Y方向溢出,确保三角标志显示 */\n height: 100%;\n /* 隐藏滚动条样式(可选,如需自定义滚动条可保留原生或用伪元素美化) */\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n/* 隐藏滚动条但保留功能 */\n.vtable-sheet-tabs-container::-webkit-scrollbar {\n display: none;\n}\n\n/* 单个sheet标签 */\n.vtable-sheet-tab {\n width: auto;\n /* 禁止标签压缩,保持内容撑开的宽度 */\n flex-shrink: 0;\n padding: 4px 12px;\n line-height: 24px;\n text-align: center;\n cursor: grab;\n border-right: 1px solid #e0e0e0;\n white-space: nowrap;\n color: #333;\n transition: background 0.1s;\n user-select: none;\n}\n\n.vtable-sheet-tab:hover {\n background-color: #f5f5f5;\n}\n\n.vtable-sheet-tab.active {\n color: #1a73e8;\n background-color: #fff;\n border-top: 2px solid #1a73e8;\n z-index: 2;\n}\n/* 编辑状态样式 */\n.vtable-sheet-tab[contenteditable='true'] {\n outline: inherit !important; /* 移除聚焦时的轮廓线 */\n border-right: 1px solid #e0e0e0;\n cursor: text;\n color: #333;\n}\n.vtable-sheet-tab[contenteditable='true']::selection {\n background-color: #2563eb33; /* 浅蓝色半透明背景(示例) */\n}\n\n/* 兼容 Firefox */\n.vtable-sheet-tab[contenteditable='true']::-moz-selection {\n background-color: #2563eb33;\n}\n\n/* 拖拽中的tab样式 */\n.vtable-sheet-tab.dragging {\n opacity: 0.7;\n transform: scale(1.02);\n background-color: #f0f5ff;\n cursor: grabbing !important;\n z-index: 100;\n position: relative;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n}\n\n/* 拖拽预览样式 */\n.vtable-sheet-drag-preview {\n position: fixed;\n z-index: 10000;\n padding: 4px 12px;\n background: rgba(255, 255, 255, 0.95);\n border: 1px solid #1890ff;\n border-radius: 4px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n opacity: 0.9;\n pointer-events: none;\n white-space: nowrap;\n font-size: 12px;\n line-height: 20px;\n color: #333;\n user-select: none;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* 插入位置指示器 */\n.vtable-sheet-insert-indicator {\n position: absolute;\n top: -4px;\n left: -5px;\n width: 0;\n height: 0;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n border-top: 6px solid black;\n z-index: inherit;\n}\n\n/* 添加sheet按钮 */\n.vtable-sheet-add-button {\n margin: 0 8px;\n padding: 0;\n background: #f8f8f8;\n border: none;\n cursor: pointer;\n font-size: 18px;\n transition: all 0.2s;\n height: 24px;\n width: 24px;\n color: #666;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.vtable-sheet-add-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* Sheet导航按钮容器 */\n.vtable-sheet-nav-buttons {\n display: flex;\n height: 100%;\n align-items: center;\n padding: 0 4px;\n background-color: #f8f8f8;\n flex-shrink: 0;\n}\n\n/* Sheet滚动控制按钮 */\n.vtable-sheet-scroll-button {\n width: 24px;\n height: 24px;\n background: none;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n font-size: 12px;\n margin: 0 2px;\n padding: 0;\n border-radius: 50%;\n}\n\n.vtable-sheet-scroll-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* 渐变阴影,提示可以滚动 */\n.vtable-sheet-fade-left,\n.vtable-sheet-fade-right {\n position: absolute;\n top: 0;\n height: 100%;\n width: 20px;\n pointer-events: none;\n z-index: 3;\n}\n\n.vtable-sheet-fade-left {\n left: 0;\n background: linear-gradient(to right, rgba(248, 248, 248, 1), rgba(248, 248, 248, 0));\n}\n\n.vtable-sheet-fade-right {\n right: 0;\n background: linear-gradient(to left, rgba(248, 248, 248, 1), rgba(248, 248, 248, 0));\n}\n\n/* Sheet菜单按钮 */\n.vtable-sheet-menu-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n margin: 0 4px;\n color: #666;\n background: none;\n border: none;\n cursor: pointer;\n border-radius: 50%;\n font-size: 16px;\n flex-shrink: 0;\n}\n\n.vtable-sheet-menu-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* 底部功能区 */\n.vtable-sheet-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 8px;\n height: var(--toolbar-height);\n border-top: 1px solid var(--border-color);\n background-color: var(--light-gray);\n}\n\n/* 底部左侧按钮组 */\n.vtable-sheet-footer-left {\n display: flex;\n align-items: center;\n}\n\n/* 底部右侧按钮组 */\n.vtable-sheet-footer-right {\n display: flex;\n align-items: center;\n}\n\n/* 删除工作表按钮 */\n.vtable-sheet-menu-delete-button {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 24px;\n height: 24px;\n line-height: 24px;\n color: #666;\n cursor: pointer;\n border: none;\n border-radius: 4px;\n user-select: none;\n}\n.vtable-sheet-menu-delete-button:hover {\n color: #000000;\n background-color: #eaeaea;\n}\n",
13
+ document.head.appendChild(styleElement);
14
+ }
15
+
16
+ exports.importStyle = importStyle;
17
+ //# sourceMappingURL=sheet-tab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/styles/sheet-tab.ts"],"names":[],"mappings":";;;AAAA,sCAAmC;AAEnC,SAAgB,WAAW;IACzB,IAAI,SAAG,CAAC,IAAI,KAAK,MAAM,EAAE;QACvB,OAAO;KACR;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,GAAG,mCAAmC,CAAC;IACtD,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsU5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC;AA/UD,kCA+UC","file":"sheet-tab.js","sourcesContent":["import { Env } from '../tools/env';\n\nexport function importStyle() {\n if (Env.mode === 'node') {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.id = 'vtable-sheet-sheet-tab-styleSheet';\n styleElement.textContent = `\n/* Sheet标签栏样式 */\n.vtable-sheet-tab-bar {\n height: 32px;\n padding: 0;\n border-top: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #f8f8f8;\n position: relative;\n box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.05);\n z-index: 10;\n width: 100%;\n}\n/* sheet列表样式 */\n.vtable-sheet-menu-list {\n position: absolute;\n right: 0;\n top: -175px;\n height: 174px;\n min-width: 140px;\n background-color: #f8f8f8;\n border: 1px solid #e0e0e0;\n box-sizing: content-box;\n border-radius: 4px;\n display: none;\n margin: 0;\n padding: 0 2px 0 2px;\n box-sizing: border-box;\n list-style: none;\n overflow-y: auto;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar {\n width: 4px;\n margin: 0;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar-thumb {\n background-color: #e0e0e0;\n border-radius: 3px;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar-track {\n background-color: transparent;\n}\n\n.vtable-sheet-menu-list.active {\n display: block;\n}\n/* sheet列表项样式 */\n.vtable-sheet-menu-item {\n display: flex;\n align-items: center;\n /* justify-content: space-between; */\n cursor: pointer;\n text-align: center;\n border-radius: 4px;\n height: 32px;\n line-height: 32px;\n margin: 2px 0;\n padding: 0 8px;\n background-color: #f8f8f840;\n max-width: 150px;\n overflow-x: hidden;\n text-overflow: ellipsis;\n box-sizing: border-box;\n}\n\n.vtable-sheet-menu-item:hover {\n background-color: #e0e0e0;\n}\n.vtable-sheet-menu-item.active {\n color: #1a73e8;\n}\n\n.vtable-sheet-menu-item-title {\n flex: 40px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Sheet标签容器 */\n.vtable-sheet-tabs-container {\n display: flex;\n flex: 1;\n flex-wrap: nowrap;\n /* 超出容器宽度时显示横向滚动条 */\n overflow-x: auto;\n overflow-y: visible; /* 允许Y方向溢出,确保三角标志显示 */\n height: 100%;\n /* 隐藏滚动条样式(可选,如需自定义滚动条可保留原生或用伪元素美化) */\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n/* 隐藏滚动条但保留功能 */\n.vtable-sheet-tabs-container::-webkit-scrollbar {\n display: none;\n}\n\n/* 单个sheet标签 */\n.vtable-sheet-tab {\n width: auto;\n /* 禁止标签压缩,保持内容撑开的宽度 */\n flex-shrink: 0;\n padding: 4px 12px;\n line-height: 24px;\n text-align: center;\n cursor: grab;\n border-right: 1px solid #e0e0e0;\n white-space: nowrap;\n color: #333;\n transition: background 0.1s;\n user-select: none;\n}\n\n.vtable-sheet-tab:hover {\n background-color: #f5f5f5;\n}\n\n.vtable-sheet-tab.active {\n color: #1a73e8;\n background-color: #fff;\n border-top: 2px solid #1a73e8;\n z-index: 2;\n}\n/* 编辑状态样式 */\n.vtable-sheet-tab[contenteditable='true'] {\n outline: inherit !important; /* 移除聚焦时的轮廓线 */\n border-right: 1px solid #e0e0e0;\n cursor: text;\n color: #333;\n}\n.vtable-sheet-tab[contenteditable='true']::selection {\n background-color: #2563eb33; /* 浅蓝色半透明背景(示例) */\n}\n\n/* 兼容 Firefox */\n.vtable-sheet-tab[contenteditable='true']::-moz-selection {\n background-color: #2563eb33;\n}\n\n/* 拖拽中的tab样式 */\n.vtable-sheet-tab.dragging {\n opacity: 0.7;\n transform: scale(1.02);\n background-color: #f0f5ff;\n cursor: grabbing !important;\n z-index: 100;\n position: relative;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n}\n\n/* 拖拽预览样式 */\n.vtable-sheet-drag-preview {\n position: fixed;\n z-index: 10000;\n padding: 4px 12px;\n background: rgba(255, 255, 255, 0.95);\n border: 1px solid #1890ff;\n border-radius: 4px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n opacity: 0.9;\n pointer-events: none;\n white-space: nowrap;\n font-size: 12px;\n line-height: 20px;\n color: #333;\n user-select: none;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* 插入位置指示器 */\n.vtable-sheet-insert-indicator {\n position: absolute;\n top: -4px;\n left: -5px;\n width: 0;\n height: 0;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n border-top: 6px solid black;\n z-index: inherit;\n}\n\n/* 添加sheet按钮 */\n.vtable-sheet-add-button {\n margin: 0 8px;\n padding: 0;\n background: #f8f8f8;\n border: none;\n cursor: pointer;\n font-size: 18px;\n transition: all 0.2s;\n height: 24px;\n width: 24px;\n color: #666;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.vtable-sheet-add-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* Sheet导航按钮容器 */\n.vtable-sheet-nav-buttons {\n display: flex;\n height: 100%;\n align-items: center;\n padding: 0 4px;\n background-color: #f8f8f8;\n flex-shrink: 0;\n}\n\n/* Sheet滚动控制按钮 */\n.vtable-sheet-scroll-button {\n width: 24px;\n height: 24px;\n background: none;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n font-size: 12px;\n margin: 0 2px;\n padding: 0;\n border-radius: 50%;\n}\n\n.vtable-sheet-scroll-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* 渐变阴影,提示可以滚动 */\n.vtable-sheet-fade-left,\n.vtable-sheet-fade-right {\n position: absolute;\n top: 0;\n height: 100%;\n width: 20px;\n pointer-events: none;\n z-index: 3;\n}\n\n.vtable-sheet-fade-left {\n left: 0;\n background: linear-gradient(to right, rgba(248, 248, 248, 1), rgba(248, 248, 248, 0));\n}\n\n.vtable-sheet-fade-right {\n right: 0;\n background: linear-gradient(to left, rgba(248, 248, 248, 1), rgba(248, 248, 248, 0));\n}\n\n/* Sheet菜单按钮 */\n.vtable-sheet-menu-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n margin: 0 4px;\n color: #666;\n background: none;\n border: none;\n cursor: pointer;\n border-radius: 50%;\n font-size: 16px;\n flex-shrink: 0;\n}\n\n.vtable-sheet-menu-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* 底部功能区 */\n.vtable-sheet-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 8px;\n height: var(--toolbar-height);\n border-top: 1px solid var(--border-color);\n background-color: var(--light-gray);\n}\n\n/* 底部左侧按钮组 */\n.vtable-sheet-footer-left {\n display: flex;\n align-items: center;\n}\n\n/* 底部右侧按钮组 */\n.vtable-sheet-footer-right {\n display: flex;\n align-items: center;\n}\n\n/* 删除工作表按钮 */\n.vtable-sheet-menu-delete-button {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 24px;\n height: 24px;\n line-height: 24px;\n color: #666;\n cursor: pointer;\n border: none;\n border-radius: 4px;\n user-select: none;\n}\n.vtable-sheet-menu-delete-button:hover {\n color: #000000;\n background-color: #eaeaea;\n}\n`;\n\n document.head.appendChild(styleElement);\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function importStyle(): void;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.importStyle = void 0;
6
+
7
+ const env_1 = require("../tools/env");
8
+
9
+ function importStyle() {
10
+ if ("node" === env_1.Env.mode) return;
11
+ const styleElement = document.createElement("style");
12
+ styleElement.id = "vtable-sheet-sheet-styleSheet", styleElement.textContent = "\n/* Sheet容器样式 */\n.vtable-sheet-container {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: var(--bg-default);\n font-family: var(--font-family-sans);\n color: var(--text-primary);\n overflow: hidden;\n}\n\n.vtable-sheet-top-container {\n height: 30px;\n padding: 0;\n border: 1px solid #e0e0e0;\n display: flex;\n align-items: center; /* 确保子元素垂直居中 */\n}\n\n/* 主内容区域 */\n.vtable-sheet-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n}\n\n\n/* VTable 容器 */\n.vtable-sheet-table {\n flex: 1;\n position: relative;\n overflow: hidden;\n background-color: var(--bg-default);\n}\n\n/* 表格加载动画 */\n.vtable-sheet-loading {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(255, 255, 255, 0.7);\n z-index: 100;\n}\n\n.vtable-sheet-loading-spinner {\n width: 40px;\n height: 40px;\n border: 3px solid var(--gray-200);\n border-top-color: var(--primary-color);\n border-radius: 50%;\n animation: vtable-sheet-spinner 0.8s linear infinite;\n}\n\n@keyframes vtable-sheet-spinner {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* 状态提示 */\n.vtable-sheet-status {\n position: absolute;\n bottom: 8px;\n right: 8px;\n padding: 4px 8px;\n background-color: var(--gray-800);\n color: var(--white);\n border-radius: var(--border-radius-sm);\n font-size: 12px;\n opacity: 0.8;\n z-index: 50;\n transition: opacity 0.2s;\n}\n\n.vtable-sheet-status:hover {\n opacity: 1;\n}\n\n.vtable-sheet-snackbar-message {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n padding: 12px 24px;\n background-color: #333;\n color: white;\n border-radius: 4px;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n opacity: 0;\n transition: opacity 0.3s ease-in-out;\n z-index: 1000;\n white-space: nowrap;\n}\n\n.vtable-sheet-snackbar-message.show {\n opacity: 1;\n}\n\n/* 选择区域高亮 */\n.vtable-sheet-selection-highlight {\n position: absolute;\n border: 2px solid var(--primary-color);\n background-color: rgba(26, 115, 232, 0.1);\n pointer-events: none;\n z-index: 10;\n}\n\n/* 辅助区域 */\n.vtable-sheet-helper-area {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n pointer-events: none;\n z-index: 20;\n}\n\n/* 调整尺寸标记 */\n.vtable-sheet-resize-marker {\n position: absolute;\n background-color: var(--primary-color);\n z-index: 25;\n}\n\n.vtable-sheet-resize-marker.horizontal {\n height: 2px;\n left: 0;\n right: 0;\n}\n\n.vtable-sheet-resize-marker.vertical {\n width: 2px;\n top: 0;\n bottom: 0;\n}\n\n.vtable-sheet-error {\n padding: 16px;\n color: #d93025;\n text-align: center;\n}\n\n/* 隐藏底部功能区 */\n.vtable-sheet-footer {\n display: none;\n}\n\n",
13
+ document.head.appendChild(styleElement);
14
+ }
15
+
16
+ exports.importStyle = importStyle;
17
+ //# sourceMappingURL=sheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/styles/sheet.ts"],"names":[],"mappings":";;;AAAA,sCAAmC;AAEnC,SAAgB,WAAW;IACzB,IAAI,SAAG,CAAC,IAAI,KAAK,MAAM,EAAE;QACvB,OAAO;KACR;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,GAAG,+BAA+B,CAAC;IAClD,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8J5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC;AAvKD,kCAuKC","file":"sheet.js","sourcesContent":["import { Env } from '../tools/env';\n\nexport function importStyle() {\n if (Env.mode === 'node') {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.id = 'vtable-sheet-sheet-styleSheet';\n styleElement.textContent = `\n/* Sheet容器样式 */\n.vtable-sheet-container {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: var(--bg-default);\n font-family: var(--font-family-sans);\n color: var(--text-primary);\n overflow: hidden;\n}\n\n.vtable-sheet-top-container {\n height: 30px;\n padding: 0;\n border: 1px solid #e0e0e0;\n display: flex;\n align-items: center; /* 确保子元素垂直居中 */\n}\n\n/* 主内容区域 */\n.vtable-sheet-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n}\n\n\n/* VTable 容器 */\n.vtable-sheet-table {\n flex: 1;\n position: relative;\n overflow: hidden;\n background-color: var(--bg-default);\n}\n\n/* 表格加载动画 */\n.vtable-sheet-loading {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(255, 255, 255, 0.7);\n z-index: 100;\n}\n\n.vtable-sheet-loading-spinner {\n width: 40px;\n height: 40px;\n border: 3px solid var(--gray-200);\n border-top-color: var(--primary-color);\n border-radius: 50%;\n animation: vtable-sheet-spinner 0.8s linear infinite;\n}\n\n@keyframes vtable-sheet-spinner {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* 状态提示 */\n.vtable-sheet-status {\n position: absolute;\n bottom: 8px;\n right: 8px;\n padding: 4px 8px;\n background-color: var(--gray-800);\n color: var(--white);\n border-radius: var(--border-radius-sm);\n font-size: 12px;\n opacity: 0.8;\n z-index: 50;\n transition: opacity 0.2s;\n}\n\n.vtable-sheet-status:hover {\n opacity: 1;\n}\n\n.vtable-sheet-snackbar-message {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n padding: 12px 24px;\n background-color: #333;\n color: white;\n border-radius: 4px;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n opacity: 0;\n transition: opacity 0.3s ease-in-out;\n z-index: 1000;\n white-space: nowrap;\n}\n\n.vtable-sheet-snackbar-message.show {\n opacity: 1;\n}\n\n/* 选择区域高亮 */\n.vtable-sheet-selection-highlight {\n position: absolute;\n border: 2px solid var(--primary-color);\n background-color: rgba(26, 115, 232, 0.1);\n pointer-events: none;\n z-index: 10;\n}\n\n/* 辅助区域 */\n.vtable-sheet-helper-area {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n pointer-events: none;\n z-index: 20;\n}\n\n/* 调整尺寸标记 */\n.vtable-sheet-resize-marker {\n position: absolute;\n background-color: var(--primary-color);\n z-index: 25;\n}\n\n.vtable-sheet-resize-marker.horizontal {\n height: 2px;\n left: 0;\n right: 0;\n}\n\n.vtable-sheet-resize-marker.vertical {\n width: 2px;\n top: 0;\n bottom: 0;\n}\n\n.vtable-sheet-error {\n padding: 16px;\n color: #d93025;\n text-align: center;\n}\n\n/* 隐藏底部功能区 */\n.vtable-sheet-footer {\n display: none;\n}\n\n`;\n\n document.head.appendChild(styleElement);\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function importStyles(): void;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.importStyles = void 0;
6
+
7
+ const sheet_1 = require("./sheet"), sheet_tab_1 = require("./sheet-tab"), menu_1 = require("./menu"), formula_bar_1 = require("./formula-bar"), common_1 = require("./common"), formula_autocomplete_1 = require("./formula-autocomplete");
8
+
9
+ function importStyles() {
10
+ (0, common_1.importStyle)(), (0, sheet_1.importStyle)(), (0, sheet_tab_1.importStyle)(),
11
+ (0, menu_1.importStyle)(), (0, formula_bar_1.importStyle)(), (0, formula_autocomplete_1.importStyle)();
12
+ }
13
+
14
+ exports.importStyles = importStyles;
15
+ //# sourceMappingURL=style-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/styles/style-manager.ts"],"names":[],"mappings":";;;AAAA,mCAA0D;AAC1D,2CAAiE;AACjE,iCAAwD;AACxD,+CAAqE;AACrE,qCAA4D;AAC5D,iEAAuF;AAEvF,SAAgB,YAAY;IAC1B,IAAA,oBAAiB,GAAE,CAAC;IACpB,IAAA,mBAAgB,GAAE,CAAC;IACnB,IAAA,uBAAmB,GAAE,CAAC;IACtB,IAAA,kBAAe,GAAE,CAAC;IAClB,IAAA,yBAAqB,GAAE,CAAC;IACxB,IAAA,kCAA8B,GAAE,CAAC;AACnC,CAAC;AAPD,oCAOC","file":"style-manager.js","sourcesContent":["import { importStyle as importSheetStyle } from './sheet';\nimport { importStyle as importSheetTabStyle } from './sheet-tab';\nimport { importStyle as importMenuStyle } from './menu';\nimport { importStyle as importFormulaBarStyle } from './formula-bar';\nimport { importStyle as importCommonStyle } from './common';\nimport { importStyle as importFormulaAutocompleteStyle } from './formula-autocomplete';\n\nexport function importStyles() {\n importCommonStyle();\n importSheetStyle();\n importSheetTabStyle();\n importMenuStyle();\n importFormulaBarStyle();\n importFormulaAutocompleteStyle();\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ });
6
+
7
+ const formula_manager_1 = require("../managers/formula-manager");
8
+
9
+ describe("FormulaManager.isFormulaComplete", (() => {
10
+ let formulaManager;
11
+ const mockSheet = {
12
+ getActiveSheet: jest.fn().mockReturnValue({
13
+ getKey: jest.fn().mockReturnValue("Sheet1")
14
+ })
15
+ };
16
+ beforeEach((() => {
17
+ formulaManager = new formula_manager_1.FormulaManager(mockSheet);
18
+ })), test("非公式输入应该返回true", (() => {
19
+ expect(formulaManager.isFormulaComplete("123")).toBe(!0), expect(formulaManager.isFormulaComplete("abc")).toBe(!0),
20
+ expect(formulaManager.isFormulaComplete("")).toBe(!1);
21
+ })), test("完整的公式应该返回true", (() => {
22
+ expect(formulaManager.isFormulaComplete("=A1")).toBe(!0), expect(formulaManager.isFormulaComplete("=SUM(A1:B10)")).toBe(!0),
23
+ expect(formulaManager.isFormulaComplete("=A1+B2")).toBe(!0), expect(formulaManager.isFormulaComplete('=IF(A1>10,"大于10","小于等于10")')).toBe(!0);
24
+ })), test("未完成的公式应该返回false", (() => {
25
+ expect(formulaManager.isFormulaComplete("=SUM(")).toBe(!1), expect(formulaManager.isFormulaComplete("=A1+")).toBe(!1);
26
+ })), test("只有等号的公式应该返回false", (() => {
27
+ expect(formulaManager.isFormulaComplete("=")).toBe(!1), expect(formulaManager.isFormulaComplete("= ")).toBe(!1),
28
+ expect(formulaManager.isFormulaComplete("= ")).toBe(!1);
29
+ })), test("括号不匹配的公式应该返回false", (() => {
30
+ expect(formulaManager.isFormulaComplete("=SUM(A1:B10")).toBe(!1), expect(formulaManager.isFormulaComplete('=IF(A1>10,"大于10"')).toBe(!1);
31
+ })), test("引号不匹配的公式应该返回false", (() => {
32
+ expect(formulaManager.isFormulaComplete('=IF(A1>10,"大于10)')).toBe(!1), expect(formulaManager.isFormulaComplete('=CONCATENATE("Hello)')).toBe(!1);
33
+ })), test("参数不完整的公式应该返回false", (() => {
34
+ expect(formulaManager.isFormulaComplete("=SUM(A1,)")).toBe(!1), expect(formulaManager.isFormulaComplete("=SUM(A1,B2,)")).toBe(!1),
35
+ expect(formulaManager.isFormulaComplete("=SUM()")).toBe(!1), expect(formulaManager.isFormulaComplete("=AVERAGE(,)")).toBe(!1);
36
+ })), test("连续逗号的公式应该返回false", (() => {
37
+ expect(formulaManager.isFormulaComplete("=SUM(A1,,B2)")).toBe(!1), expect(formulaManager.isFormulaComplete('=CONCATENATE("Hello",,"World")')).toBe(!1);
38
+ })), test("以逗号结尾的公式应该返回false", (() => {
39
+ expect(formulaManager.isFormulaComplete("=SUM(A1,")).toBe(!1), expect(formulaManager.isFormulaComplete('=CONCATENATE("Hello",')).toBe(!1);
40
+ }));
41
+ }));
42
+ //# sourceMappingURL=formula-complete.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/test/formula-complete.test.ts"],"names":[],"mappings":"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","file":"formula-complete.test.js","sourcesContent":["import { FormulaManager } from '../managers/formula-manager';\nimport type VTableSheet from '../components/vtable-sheet';\n\ndescribe('FormulaManager.isFormulaComplete', () => {\n let formulaManager: FormulaManager;\n\n // 创建一个模拟的VTableSheet实例\n const mockSheet = {\n getActiveSheet: jest.fn().mockReturnValue({\n getKey: jest.fn().mockReturnValue('Sheet1')\n })\n } as unknown as VTableSheet;\n\n beforeEach(() => {\n formulaManager = new FormulaManager(mockSheet);\n });\n\n test('非公式输入应该返回true', () => {\n expect(formulaManager.isFormulaComplete('123')).toBe(true);\n expect(formulaManager.isFormulaComplete('abc')).toBe(true);\n expect(formulaManager.isFormulaComplete('')).toBe(false); // 空字符串特殊处理为false\n });\n\n test('完整的公式应该返回true', () => {\n expect(formulaManager.isFormulaComplete('=A1')).toBe(true);\n expect(formulaManager.isFormulaComplete('=SUM(A1:B10)')).toBe(true);\n expect(formulaManager.isFormulaComplete('=A1+B2')).toBe(true);\n expect(formulaManager.isFormulaComplete('=IF(A1>10,\"大于10\",\"小于等于10\")')).toBe(true);\n });\n\n test('未完成的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=SUM(')).toBe(false);\n expect(formulaManager.isFormulaComplete('=A1+')).toBe(false);\n });\n\n test('只有等号的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=')).toBe(false);\n expect(formulaManager.isFormulaComplete('= ')).toBe(false);\n expect(formulaManager.isFormulaComplete('= ')).toBe(false);\n });\n\n test('括号不匹配的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=SUM(A1:B10')).toBe(false);\n expect(formulaManager.isFormulaComplete('=IF(A1>10,\"大于10\"')).toBe(false);\n });\n\n test('引号不匹配的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=IF(A1>10,\"大于10)')).toBe(false);\n expect(formulaManager.isFormulaComplete('=CONCATENATE(\"Hello)')).toBe(false);\n });\n\n test('参数不完整的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=SUM(A1,)')).toBe(false);\n expect(formulaManager.isFormulaComplete('=SUM(A1,B2,)')).toBe(false);\n expect(formulaManager.isFormulaComplete('=SUM()')).toBe(false);\n expect(formulaManager.isFormulaComplete('=AVERAGE(,)')).toBe(false);\n });\n\n test('连续逗号的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=SUM(A1,,B2)')).toBe(false);\n expect(formulaManager.isFormulaComplete('=CONCATENATE(\"Hello\",,\"World\")')).toBe(false);\n });\n\n test('以逗号结尾的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=SUM(A1,')).toBe(false);\n expect(formulaManager.isFormulaComplete('=CONCATENATE(\"Hello\",')).toBe(false);\n });\n});\n"]}
@@ -0,0 +1,20 @@
1
+ export type EnvMode = 'browser' | 'node' | 'worker' | 'miniApp' | 'desktop-miniApp';
2
+ export type LooseFunction = (...args: any) => any;
3
+ export declare class Env {
4
+ static _mode: EnvMode;
5
+ static get mode(): EnvMode;
6
+ static set mode(mode: EnvMode);
7
+ static dpr: number;
8
+ static CreateCanvas?: LooseFunction;
9
+ static LoadImage?: LooseFunction;
10
+ static RequestAnimationFrame?: LooseFunction;
11
+ static CancelAnimationFrame?: LooseFunction;
12
+ static RegisterCreateCanvas(func: LooseFunction): void;
13
+ static RegisterLoadImage(func: LooseFunction): void;
14
+ static GetCreateCanvasFunc(): LooseFunction | undefined;
15
+ static RegisterRequestAnimationFrame(func: LooseFunction): void;
16
+ static GetRequestAnimationFrame(): LooseFunction;
17
+ static RegisterCancelAnimationFrame(func: LooseFunction): void;
18
+ static GetCancelAnimationFrame(): LooseFunction;
19
+ }
20
+ export declare function clearPageSelection(): void;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.clearPageSelection = exports.Env = void 0;
6
+
7
+ class Env {
8
+ static get mode() {
9
+ return Env._mode || (Env._mode = defaultMode()), Env._mode;
10
+ }
11
+ static set mode(mode) {
12
+ Env._mode = mode;
13
+ }
14
+ static RegisterCreateCanvas(func) {
15
+ Env.CreateCanvas = func;
16
+ }
17
+ static RegisterLoadImage(func) {
18
+ Env.LoadImage = func;
19
+ }
20
+ static GetCreateCanvasFunc() {
21
+ return Env.CreateCanvas ? Env.CreateCanvas : "worker" === Env.mode ? (width = 200, height = 200) => new OffscreenCanvas(width, height) : void 0;
22
+ }
23
+ static RegisterRequestAnimationFrame(func) {
24
+ Env.RequestAnimationFrame = func();
25
+ }
26
+ static GetRequestAnimationFrame() {
27
+ if (Env.RequestAnimationFrame) return Env.RequestAnimationFrame;
28
+ }
29
+ static RegisterCancelAnimationFrame(func) {
30
+ Env.CancelAnimationFrame = func();
31
+ }
32
+ static GetCancelAnimationFrame() {
33
+ if (Env.CancelAnimationFrame) return Env.CancelAnimationFrame;
34
+ }
35
+ }
36
+
37
+ function defaultMode() {
38
+ let mode = "browser";
39
+ try {
40
+ "node" === window.type ? mode = "node" : "undefined" == typeof window || window.performance ? "undefined" == typeof window && (mode = "node") : mode = "miniApp";
41
+ } catch (err) {
42
+ mode = "node";
43
+ }
44
+ return mode;
45
+ }
46
+
47
+ function clearPageSelection() {
48
+ try {
49
+ const selection = window.getSelection();
50
+ if (selection) {
51
+ if ("function" == typeof selection.removeAllRanges) return void selection.removeAllRanges();
52
+ if ("function" == typeof selection.empty) return void selection.empty();
53
+ if ("function" == typeof selection.collapse) return void selection.collapse(document.body, 0);
54
+ }
55
+ } catch (error) {}
56
+ }
57
+
58
+ exports.Env = Env, Env.dpr = 0, exports.clearPageSelection = clearPageSelection;
59
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/env.ts"],"names":[],"mappings":"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","file":"env.js","sourcesContent":["export type EnvMode = 'browser' | 'node' | 'worker' | 'miniApp' | 'desktop-miniApp';\nexport type LooseFunction = (...args: any) => any;\n\nexport class Env {\n static _mode: EnvMode;\n public static get mode() {\n if (!Env._mode) {\n Env._mode = defaultMode();\n }\n return Env._mode;\n }\n public static set mode(mode: EnvMode) {\n Env._mode = mode;\n }\n\n static dpr = 0;\n\n static CreateCanvas?: LooseFunction;\n\n static LoadImage?: LooseFunction;\n\n static RequestAnimationFrame?: LooseFunction;\n\n static CancelAnimationFrame?: LooseFunction;\n\n static RegisterCreateCanvas(func: LooseFunction) {\n Env.CreateCanvas = func;\n }\n\n static RegisterLoadImage(func: LooseFunction) {\n Env.LoadImage = func;\n }\n\n static GetCreateCanvasFunc(): LooseFunction | undefined {\n if (Env.CreateCanvas) {\n return Env.CreateCanvas;\n }\n if (Env.mode === 'worker') {\n return (width = 200, height = 200) => new OffscreenCanvas(width, height);\n }\n return undefined;\n }\n\n static RegisterRequestAnimationFrame(func: LooseFunction) {\n Env.RequestAnimationFrame = func();\n }\n\n static GetRequestAnimationFrame() {\n if (Env.RequestAnimationFrame) {\n return Env.RequestAnimationFrame;\n }\n return undefined;\n }\n\n static RegisterCancelAnimationFrame(func: LooseFunction) {\n Env.CancelAnimationFrame = func();\n }\n\n static GetCancelAnimationFrame() {\n if (Env.CancelAnimationFrame) {\n return Env.CancelAnimationFrame;\n }\n return undefined;\n }\n}\n\n/**\n *\n * 这个默认的判断方法并不能区分出不同的环境,所以这里采用是否判断\n * 满足条件为 'browser',不满足则为 'node'\n */\nfunction defaultMode(): EnvMode {\n let mode: EnvMode = 'browser';\n try {\n if ((window as any).type === 'node') {\n mode = 'node';\n } else if (typeof window !== 'undefined' && !window.performance) {\n mode = 'miniApp';\n } else if (typeof window === 'undefined') {\n mode = 'node';\n }\n } catch (err) {\n mode = 'node';\n }\n return mode;\n}\n/**\n * 清空页面上的所有文本选择,使用多种兼容性方法\n */\nexport function clearPageSelection(): void {\n try {\n const selection = window.getSelection();\n if (selection) {\n // 方法1: removeAllRanges() - 标准方法,最广泛支持\n if (typeof selection.removeAllRanges === 'function') {\n selection.removeAllRanges();\n console.log('使用 removeAllRanges() 清空selection');\n return;\n }\n\n // 方法2: empty() - IE 和一些旧浏览器\n if (typeof (selection as any).empty === 'function') {\n (selection as any).empty();\n console.log('使用 empty() 清空selection');\n return;\n }\n\n // 方法3: collapse() - 备用方法\n if (typeof selection.collapse === 'function') {\n selection.collapse(document.body, 0);\n console.log('使用 collapse() 清空selection');\n return;\n }\n\n console.warn('无法清空selection:不支持的浏览器');\n }\n } catch (error) {\n console.warn('清空selection时出错:', error);\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export {};
2
+ export declare function checkTabTitle(newTitle: string): string | null;
3
+ export declare function isPropertyWritable(obj: any, prop: string | number): boolean;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ function checkTabTitle(newTitle) {
4
+ return newTitle ? newTitle.length > 100 ? "工作表名称不能超过100个字符" : /[\\/:*?"<>|]/.test(newTitle) ? "工作表名称不能包含特殊字符,如/ \\ ? * [ ] : |" : null : "工作表名称不能为空";
5
+ }
6
+
7
+ function isPropertyWritable(obj, prop) {
8
+ const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
9
+ return !!descriptor && (!!descriptor.set || !0 === descriptor.writable);
10
+ }
11
+
12
+ Object.defineProperty(exports, "__esModule", {
13
+ value: !0
14
+ }), exports.isPropertyWritable = exports.checkTabTitle = void 0, exports.checkTabTitle = checkTabTitle,
15
+ exports.isPropertyWritable = isPropertyWritable;
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/index.ts"],"names":[],"mappings":";;;AAUA,SAAgB,aAAa,CAAC,QAAgB;IAC5C,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,WAAW,CAAC;KACpB;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE;QACzB,OAAO,iBAAiB,CAAC;KAC1B;IAED,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;QACjC,OAAO,iCAAiC,CAAC;KAC1C;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAbD,sCAaC;AAGD,SAAgB,kBAAkB,CAAC,GAAQ,EAAE,IAAqB;IAChE,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9D,IAAI,CAAC,UAAU,EAAE;QAEf,OAAO,KAAK,CAAC;KACd;IAGD,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC;AAC1D,CAAC;AATD,gDASC","file":"index.js","sourcesContent":["/**\n * 工具函数导出\n * @namespace tools\n */\n\n// 暂时没有导出的工具函数\nexport {};\n/**\n * 检查工作表名称\n */\nexport function checkTabTitle(newTitle: string): string | null {\n if (!newTitle) {\n return '工作表名称不能为空';\n }\n if (newTitle.length > 100) {\n return '工作表名称不能超过100个字符';\n }\n // 检查是否包含特殊字符,如/ \\ ? * [ ] : |\n if (/[\\\\/:*?\"<>|]/.test(newTitle)) {\n return '工作表名称不能包含特殊字符,如/ \\\\ ? * [ ] : |';\n }\n // 其他规则待补充...\n return null;\n}\n\n/** 判断对象的属性是否可写 */\nexport function isPropertyWritable(obj: any, prop: string | number) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (!descriptor) {\n // 属性不存在\n return false;\n }\n\n // 检查是否有 setter 方法或 writable 属性为 true\n return !!descriptor.set || descriptor.writable === true;\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function showSnackbar(message: string, duration?: number): void;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ function showSnackbar(message, duration = 3e3) {
4
+ const snackbarId = `snackbar-${Date.now()}`;
5
+ if (document.getElementById(snackbarId)) return;
6
+ const snackbar = document.createElement("div");
7
+ snackbar.id = snackbarId, snackbar.className = "vtable-sheet-snackbar-message",
8
+ snackbar.textContent = message, document.body.appendChild(snackbar), setTimeout((() => {
9
+ snackbar.classList.add("show");
10
+ }), 10), setTimeout((() => {
11
+ snackbar.classList.remove("show"), snackbar.addEventListener("transitionend", (function handler() {
12
+ snackbar.removeEventListener("transitionend", handler), document.body.contains(snackbar) && document.body.removeChild(snackbar);
13
+ }));
14
+ }), duration);
15
+ }
16
+
17
+ Object.defineProperty(exports, "__esModule", {
18
+ value: !0
19
+ }), exports.showSnackbar = void 0, exports.showSnackbar = showSnackbar;
20
+ //# sourceMappingURL=snackbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/ui/snackbar.ts"],"names":[],"mappings":";;;AAKA,SAAgB,YAAY,CAAC,OAAe,EAAE,QAAQ,GAAG,IAAI;IAC3D,MAAM,UAAU,GAAG,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC5C,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE;QACvC,OAAO;KACR;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC/C,QAAQ,CAAC,EAAE,GAAG,UAAU,CAAC;IACzB,QAAQ,CAAC,SAAS,GAAG,+BAA+B,CAAC;IACrD,QAAQ,CAAC,WAAW,GAAG,OAAO,CAAC;IAE/B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,EAAE,EAAE,CAAC,CAAC;IAGP,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAElC,QAAQ,CAAC,gBAAgB,CAAC,eAAe,EAAE,SAAS,OAAO;YACzD,QAAQ,CAAC,mBAAmB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;gBACpC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;aACrC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,QAAQ,CAAC,CAAC;AACf,CAAC;AA1BD,oCA0BC","file":"snackbar.js","sourcesContent":["/**\n * 显示Snackbar消息\n * @param message - 要显示的消息内容\n * @param duration - 显示时长(毫秒),默认3000ms\n */\nexport function showSnackbar(message: string, duration = 3000): void {\n const snackbarId = `snackbar-${Date.now()}`;\n if (document.getElementById(snackbarId)) {\n return;\n }\n const snackbar = document.createElement('div');\n snackbar.id = snackbarId;\n snackbar.className = 'vtable-sheet-snackbar-message';\n snackbar.textContent = message;\n\n document.body.appendChild(snackbar);\n setTimeout(() => {\n snackbar.classList.add('show');\n }, 10);\n\n // 自动隐藏\n setTimeout(() => {\n snackbar.classList.remove('show');\n // 过渡结束后移除DOM\n snackbar.addEventListener('transitionend', function handler() {\n snackbar.removeEventListener('transitionend', handler);\n if (document.body.contains(snackbar)) {\n document.body.removeChild(snackbar);\n }\n });\n }, duration);\n}\n"]}
@@ -0,0 +1,44 @@
1
+ export interface CellCoord {
2
+ row: number;
3
+ col: number;
4
+ }
5
+ export interface CellRange {
6
+ startRow: number;
7
+ startCol: number;
8
+ endRow: number;
9
+ endCol: number;
10
+ }
11
+ export declare enum SelectionMode {
12
+ CELL = "cell",
13
+ ROW = "row",
14
+ COLUMN = "column",
15
+ RANGE = "range"
16
+ }
17
+ export interface IStyle {
18
+ [key: string]: string | number | boolean | undefined;
19
+ }
20
+ export type CellValue = string | number | boolean | null | undefined;
21
+ export interface CellAddress extends CellCoord {
22
+ sheetId: string;
23
+ }
24
+ export interface IToolbarItem {
25
+ id: string;
26
+ icon?: string;
27
+ text?: string;
28
+ tooltip?: string;
29
+ disabled?: boolean;
30
+ visible?: boolean;
31
+ onClick?: () => void;
32
+ }
33
+ export declare enum MainMenuItemKey {
34
+ IMPORT = "import",
35
+ EXPORT_CURRENT_SHEET_CSV = "export-current-sheet-csv",
36
+ EXPORT_CURRENT_SHEET_XLSX = "export-current-sheet-xlsx"
37
+ }
38
+ export interface MainMenuItem {
39
+ name: string;
40
+ menuKey?: MainMenuItemKey;
41
+ description?: string;
42
+ onClick?: () => void;
43
+ items?: MainMenuItem[];
44
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ var SelectionMode, MainMenuItemKey;
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: !0
7
+ }), exports.MainMenuItemKey = exports.SelectionMode = void 0, function(SelectionMode) {
8
+ SelectionMode.CELL = "cell", SelectionMode.ROW = "row", SelectionMode.COLUMN = "column",
9
+ SelectionMode.RANGE = "range";
10
+ }(SelectionMode = exports.SelectionMode || (exports.SelectionMode = {})), function(MainMenuItemKey) {
11
+ MainMenuItemKey.IMPORT = "import", MainMenuItemKey.EXPORT_CURRENT_SHEET_CSV = "export-current-sheet-csv",
12
+ MainMenuItemKey.EXPORT_CURRENT_SHEET_XLSX = "export-current-sheet-xlsx";
13
+ }(MainMenuItemKey = exports.MainMenuItemKey || (exports.MainMenuItemKey = {}));
14
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ts-types/base.ts"],"names":[],"mappings":";;;AAmBA,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,8BAAa,CAAA;IACb,4BAAW,CAAA;IACX,kCAAiB,CAAA;IACjB,gCAAe,CAAA;AACjB,CAAC,EALW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAKxB;AA0BD,IAAY,eAOX;AAPD,WAAY,eAAe;IAEzB,oCAAiB,CAAA;IAEjB,wEAAqD,CAAA;IAErD,0EAAuD,CAAA;AACzD,CAAC,EAPW,eAAe,GAAf,uBAAe,KAAf,uBAAe,QAO1B","file":"base.js","sourcesContent":["/**\n * 基础类型定义\n */\n\n/** 单元格坐标 */\nexport interface CellCoord {\n row: number;\n col: number;\n}\n\n/** 单元格范围 */\nexport interface CellRange {\n startRow: number;\n startCol: number;\n endRow: number;\n endCol: number;\n}\n\n/** 选择模式 */\nexport enum SelectionMode {\n CELL = 'cell',\n ROW = 'row',\n COLUMN = 'column',\n RANGE = 'range'\n}\n\n/** 通用样式定义 */\nexport interface IStyle {\n [key: string]: string | number | boolean | undefined;\n}\n\n/** 单元格值类型 */\nexport type CellValue = string | number | boolean | null | undefined;\n\n/** 单元格地址 */\nexport interface CellAddress extends CellCoord {\n sheetId: string;\n}\n\n/** 工具栏项配置 */\nexport interface IToolbarItem {\n id: string;\n icon?: string;\n text?: string;\n tooltip?: string;\n disabled?: boolean;\n visible?: boolean;\n onClick?: () => void;\n}\n\nexport enum MainMenuItemKey {\n /** 需要插件支持,请在plugins中配置 ExcelImportPlugin */\n IMPORT = 'import',\n /** 需要插件支持,请在plugins中配置 TableExportPlugin */\n EXPORT_CURRENT_SHEET_CSV = 'export-current-sheet-csv',\n /** 需要插件支持,请在plugins中配置 TableExportPlugin */\n EXPORT_CURRENT_SHEET_XLSX = 'export-current-sheet-xlsx'\n}\nexport interface MainMenuItem {\n /** 菜单项名称 */\n name: string;\n /** 菜单项唯一标识,如果配置了menuKey,点击菜单项时,会匹配内置逻辑(目前仅支持导入导出相关功能,且需要配置VTablePluginModules来启用) */\n menuKey?: MainMenuItemKey;\n /** 菜单项描述 */\n description?: string;\n /** 菜单项点击回调 */\n onClick?: () => void;\n /** 子菜单项 */\n items?: MainMenuItem[];\n}\n"]}
@@ -0,0 +1,79 @@
1
+ import type { CellCoord, CellRange, CellValue } from './base';
2
+ export type EventHandler = (...args: any[]) => void;
3
+ export interface IEventMap {
4
+ 'cell:selected': {
5
+ coord: CellCoord;
6
+ };
7
+ 'cell:deselected': {
8
+ coord: CellCoord;
9
+ };
10
+ 'cell:changed': {
11
+ coord: CellCoord;
12
+ oldValue: CellValue;
13
+ newValue: CellValue;
14
+ };
15
+ 'cell:editing': {
16
+ coord: CellCoord;
17
+ };
18
+ 'cell:edited': {
19
+ coord: CellCoord;
20
+ value: CellValue;
21
+ };
22
+ 'selection:changed': {
23
+ range: CellRange;
24
+ };
25
+ 'selection:start': {
26
+ coord: CellCoord;
27
+ };
28
+ 'selection:end': {
29
+ range: CellRange;
30
+ };
31
+ 'sheet:ready': void;
32
+ 'sheet:destroyed': void;
33
+ 'sheet:resized': {
34
+ width: number;
35
+ height: number;
36
+ };
37
+ 'sheet:focused': void;
38
+ 'sheet:blurred': void;
39
+ 'data:changed': {
40
+ changes: Array<{
41
+ coord: CellCoord;
42
+ oldValue: CellValue;
43
+ newValue: CellValue;
44
+ }>;
45
+ };
46
+ 'data:loaded': void;
47
+ 'data:sorted': {
48
+ columnKey: string;
49
+ direction: 'asc' | 'desc';
50
+ };
51
+ 'data:filtered': {
52
+ filters: Array<{
53
+ columnKey: string;
54
+ value: any;
55
+ }>;
56
+ };
57
+ 'toolbar:action': {
58
+ actionId: string;
59
+ };
60
+ 'toolbar:stateChanged': {
61
+ actionId: string;
62
+ enabled: boolean;
63
+ };
64
+ }
65
+ export interface IEventManager {
66
+ on: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;
67
+ off: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;
68
+ emit: <K extends keyof IEventMap>(event: K, payload: IEventMap[K]) => void;
69
+ once: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;
70
+ removeAllListeners: () => void;
71
+ }
72
+ export interface CellValueChangedEvent {
73
+ row: number;
74
+ col: number;
75
+ newValue: CellValue;
76
+ oldValue: CellValue;
77
+ }
78
+ export type CellSelectedEvent = IEventMap['cell:selected'];
79
+ export type SelectionChangedEvent = IEventMap['selection:changed'];
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ });
6
+ //# sourceMappingURL=event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ts-types/event.ts"],"names":[],"mappings":"","file":"event.js","sourcesContent":["import type { CellCoord, CellRange, CellValue } from './base';\n\n/** 事件处理器类型 */\nexport type EventHandler = (...args: any[]) => void;\n\n/** 事件映射表 */\nexport interface IEventMap {\n // 单元格事件\n 'cell:selected': { coord: CellCoord };\n 'cell:deselected': { coord: CellCoord };\n 'cell:changed': { coord: CellCoord; oldValue: CellValue; newValue: CellValue };\n 'cell:editing': { coord: CellCoord };\n 'cell:edited': { coord: CellCoord; value: CellValue };\n\n // 选择事件\n 'selection:changed': { range: CellRange };\n 'selection:start': { coord: CellCoord };\n 'selection:end': { range: CellRange };\n\n // Sheet事件\n 'sheet:ready': void;\n 'sheet:destroyed': void;\n 'sheet:resized': { width: number; height: number };\n 'sheet:focused': void;\n 'sheet:blurred': void;\n\n // 数据事件\n 'data:changed': { changes: Array<{ coord: CellCoord; oldValue: CellValue; newValue: CellValue }> };\n 'data:loaded': void;\n 'data:sorted': { columnKey: string; direction: 'asc' | 'desc' };\n 'data:filtered': { filters: Array<{ columnKey: string; value: any }> };\n\n // 工具栏事件\n 'toolbar:action': { actionId: string };\n 'toolbar:stateChanged': { actionId: string; enabled: boolean };\n}\n\n/** 事件管理器接口 */\nexport interface IEventManager {\n /** 注册事件监听器 */\n on: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;\n\n /** 移除事件监听器 */\n off: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;\n\n /** 触发事件 */\n emit: <K extends keyof IEventMap>(event: K, payload: IEventMap[K]) => void;\n\n /** 一次性事件监听器 */\n once: <K extends keyof IEventMap>(event: K, handler: (payload: IEventMap[K]) => void) => void;\n\n /** 移除所有事件监听器 */\n removeAllListeners: () => void;\n}\n\nexport interface CellValueChangedEvent {\n /** 行索引 */\n row: number;\n /** 列索引 */\n col: number;\n /** 新值 */\n newValue: CellValue;\n /** 旧值 */\n oldValue: CellValue;\n}\n\nexport type CellSelectedEvent = IEventMap['cell:selected'];\nexport type SelectionChangedEvent = IEventMap['selection:changed'];\n"]}
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,3 @@
1
+
2
+
3
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ts-types/events.ts"],"names":[],"mappings":"","file":"events.js","sourcesContent":[""]}