@veltra/sheet 2.0.1 → 2.1.1

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 (211) hide show
  1. package/dist/index.d.ts +4 -26
  2. package/dist/index.js +3 -23
  3. package/dist/tools/builtin.js +279 -8
  4. package/dist/tools/context.d.ts +54 -11
  5. package/dist/tools/context.js +28 -5
  6. package/dist/tools/download.js +68 -0
  7. package/dist/tools/export.worker.d.ts +16 -0
  8. package/dist/tools/export.worker.js +29 -0
  9. package/dist/tools/registry.d.ts +7 -4
  10. package/dist/tools/registry.js +1 -3
  11. package/dist/types/index.d.ts +1 -0
  12. package/dist/types/sheet.d.ts +6 -5
  13. package/dist/vue/formula-bar.js +393 -0
  14. package/dist/vue/formula-suggest-list.js +66 -0
  15. package/dist/vue/import-file.js +140 -0
  16. package/dist/vue/insert-count-menu-item.js +68 -0
  17. package/dist/vue/insert-image.js +79 -0
  18. package/dist/vue/popup-helpers.js +73 -0
  19. package/dist/vue/popups/border-popup.js +75 -0
  20. package/dist/vue/popups/border-preset-glyph.js +106 -0
  21. package/dist/vue/popups/export-popup.js +51 -0
  22. package/dist/vue/popups/fill-color-popup.js +37 -0
  23. package/dist/vue/popups/find-popup.js +113 -0
  24. package/dist/vue/popups/font-color-popup.js +37 -0
  25. package/dist/vue/popups/font-size-popup.js +63 -0
  26. package/dist/vue/popups/import.worker.d.ts +21 -0
  27. package/dist/vue/popups/import.worker.js +41 -0
  28. package/dist/vue/popups/insert-image-popup.js +38 -0
  29. package/dist/vue/sheet-context-menu.js +200 -0
  30. package/dist/vue/sheet-tabs.js +162 -0
  31. package/dist/vue/sheet-toolbar.js +106 -0
  32. package/dist/vue/sheet.js +144 -164
  33. package/dist/vue/style.d.ts +11 -1
  34. package/dist/vue/style.js +10 -0
  35. package/dist/vue/style2.css +564 -3
  36. package/dist/vue/use-find-replace.js +161 -0
  37. package/dist/vue/use-formula-ref-select.js +37 -0
  38. package/dist/vue/use-formula-suggest.js +126 -0
  39. package/dist/vue/use-sheet-grid.js +180 -0
  40. package/dist/vue/use-sheet-state.js +122 -0
  41. package/dist/vue/use-sheet-tabs-bar.js +90 -0
  42. package/dist/vue/use-tool-groups.js +42 -0
  43. package/dist/vue/use-tool-popup.js +123 -0
  44. package/dist/vue/use-toolbar-scroll.js +72 -0
  45. package/package.json +12 -7
  46. package/src/env.d.ts +11 -0
  47. package/src/index.ts +203 -14
  48. package/src/tools/__test__/builtin.test.ts +208 -66
  49. package/src/tools/__test__/context.test.ts +62 -2
  50. package/src/tools/builtin.ts +350 -6
  51. package/src/tools/context.ts +89 -11
  52. package/src/tools/download.ts +82 -0
  53. package/src/tools/export.worker.ts +61 -0
  54. package/src/tools/registry.ts +16 -1
  55. package/src/types/index.ts +6 -0
  56. package/src/types/sheet.ts +5 -3
  57. package/src/vue/__test__/formula-bar.test.ts +455 -0
  58. package/src/vue/__test__/import-file.test.ts +183 -0
  59. package/src/vue/__test__/insert-count-menu-item.test.ts +123 -0
  60. package/src/vue/__test__/insert-image-popup.test.ts +89 -0
  61. package/src/vue/__test__/insert-image.test.ts +100 -0
  62. package/src/vue/__test__/sheet-component.test.ts +716 -27
  63. package/src/vue/__test__/sheet-context-menu.test.ts +206 -0
  64. package/src/vue/__test__/use-formula-ref-select.test.ts +35 -0
  65. package/src/vue/__test__/use-formula-suggest.test.ts +83 -0
  66. package/src/vue/formula-bar.vue +473 -0
  67. package/src/vue/formula-suggest-list.vue +64 -0
  68. package/src/vue/import-file.ts +173 -0
  69. package/src/vue/insert-count-menu-item.vue +69 -0
  70. package/src/vue/insert-image.ts +90 -0
  71. package/src/vue/parsing.ts +11 -0
  72. package/src/vue/popup-helpers.ts +50 -0
  73. package/src/vue/popups/border-popup.vue +93 -0
  74. package/src/vue/popups/border-preset-glyph.vue +111 -0
  75. package/src/vue/popups/export-popup.vue +52 -0
  76. package/src/vue/popups/fill-color-popup.vue +39 -0
  77. package/src/vue/popups/find-popup.vue +111 -0
  78. package/src/vue/popups/font-color-popup.vue +39 -0
  79. package/src/vue/popups/font-size-popup.vue +52 -0
  80. package/src/vue/popups/import.worker.ts +66 -0
  81. package/src/vue/popups/insert-image-popup.vue +39 -0
  82. package/src/vue/sheet-context-menu.ts +229 -0
  83. package/src/vue/sheet-tabs.vue +162 -0
  84. package/src/vue/sheet-toolbar.vue +91 -0
  85. package/src/vue/sheet.vue +161 -186
  86. package/src/vue/style.scss +646 -3
  87. package/src/vue/style.ts +11 -0
  88. package/src/vue/use-find-replace.ts +200 -0
  89. package/src/vue/use-formula-ref-select.ts +34 -0
  90. package/src/vue/use-formula-suggest.ts +150 -0
  91. package/src/vue/use-sheet-grid.ts +243 -0
  92. package/src/vue/use-sheet-state.ts +161 -0
  93. package/src/vue/use-sheet-tabs-bar.ts +115 -0
  94. package/src/vue/use-tool-groups.ts +61 -0
  95. package/src/vue/use-tool-popup.ts +150 -0
  96. package/src/vue/use-toolbar-scroll.ts +95 -0
  97. package/dist/core/address.d.ts +0 -60
  98. package/dist/core/address.js +0 -142
  99. package/dist/core/address.js.map +0 -1
  100. package/dist/core/cell-store.d.ts +0 -61
  101. package/dist/core/cell-store.js +0 -135
  102. package/dist/core/cell-store.js.map +0 -1
  103. package/dist/core/command/default-registry.d.ts +0 -10
  104. package/dist/core/command/default-registry.js +0 -18
  105. package/dist/core/command/default-registry.js.map +0 -1
  106. package/dist/core/command/history.d.ts +0 -64
  107. package/dist/core/command/history.js +0 -127
  108. package/dist/core/command/history.js.map +0 -1
  109. package/dist/core/command/merge-cells.d.ts +0 -21
  110. package/dist/core/command/merge-cells.js +0 -74
  111. package/dist/core/command/merge-cells.js.map +0 -1
  112. package/dist/core/command/registry.d.ts +0 -17
  113. package/dist/core/command/registry.js +0 -26
  114. package/dist/core/command/registry.js.map +0 -1
  115. package/dist/core/command/set-cell-formula.d.ts +0 -17
  116. package/dist/core/command/set-cell-formula.js +0 -29
  117. package/dist/core/command/set-cell-formula.js.map +0 -1
  118. package/dist/core/command/set-cell-value.d.ts +0 -22
  119. package/dist/core/command/set-cell-value.js +0 -35
  120. package/dist/core/command/set-cell-value.js.map +0 -1
  121. package/dist/core/command/types.d.ts +0 -68
  122. package/dist/core/events.js +0 -29
  123. package/dist/core/events.js.map +0 -1
  124. package/dist/core/fill.d.ts +0 -34
  125. package/dist/core/fill.js +0 -320
  126. package/dist/core/fill.js.map +0 -1
  127. package/dist/core/formula/ast.d.ts +0 -58
  128. package/dist/core/formula/ast.js +0 -38
  129. package/dist/core/formula/ast.js.map +0 -1
  130. package/dist/core/formula/dependency-graph.d.ts +0 -70
  131. package/dist/core/formula/dependency-graph.js +0 -269
  132. package/dist/core/formula/dependency-graph.js.map +0 -1
  133. package/dist/core/formula/errors.d.ts +0 -25
  134. package/dist/core/formula/errors.js +0 -36
  135. package/dist/core/formula/errors.js.map +0 -1
  136. package/dist/core/formula/evaluator.d.ts +0 -41
  137. package/dist/core/formula/evaluator.js +0 -154
  138. package/dist/core/formula/evaluator.js.map +0 -1
  139. package/dist/core/formula/functions.d.ts +0 -30
  140. package/dist/core/formula/functions.js +0 -209
  141. package/dist/core/formula/functions.js.map +0 -1
  142. package/dist/core/formula/parser.d.ts +0 -7
  143. package/dist/core/formula/parser.js +0 -208
  144. package/dist/core/formula/parser.js.map +0 -1
  145. package/dist/core/formula/tokenizer.d.ts +0 -37
  146. package/dist/core/formula/tokenizer.js +0 -146
  147. package/dist/core/formula/tokenizer.js.map +0 -1
  148. package/dist/core/merge-manager.d.ts +0 -64
  149. package/dist/core/merge-manager.js +0 -111
  150. package/dist/core/merge-manager.js.map +0 -1
  151. package/dist/core/selection.d.ts +0 -31
  152. package/dist/core/selection.js +0 -62
  153. package/dist/core/selection.js.map +0 -1
  154. package/dist/core/sheet.d.ts +0 -116
  155. package/dist/core/sheet.js +0 -224
  156. package/dist/core/sheet.js.map +0 -1
  157. package/dist/core/workbook.d.ts +0 -43
  158. package/dist/core/workbook.js +0 -77
  159. package/dist/core/workbook.js.map +0 -1
  160. package/dist/grid/sheet-grid.d.ts +0 -81
  161. package/dist/grid/sheet-grid.js +0 -331
  162. package/dist/grid/sheet-grid.js.map +0 -1
  163. package/dist/grid/vtable-theme.js +0 -80
  164. package/dist/grid/vtable-theme.js.map +0 -1
  165. package/dist/tools/builtin.js.map +0 -1
  166. package/dist/tools/context.js.map +0 -1
  167. package/dist/tools/registry.js.map +0 -1
  168. package/dist/vue/index.d.ts +0 -2
  169. package/dist/vue/sheet.js.map +0 -1
  170. package/dist/vue/sheet.vue.d.ts +0 -24
  171. package/src/core/__test__/address.test.ts +0 -113
  172. package/src/core/__test__/cell-store.test.ts +0 -97
  173. package/src/core/__test__/command.test.ts +0 -377
  174. package/src/core/__test__/fill.test.ts +0 -140
  175. package/src/core/__test__/formula-adversarial.test.ts +0 -265
  176. package/src/core/__test__/formula-engine.test.ts +0 -470
  177. package/src/core/__test__/formula-functions.test.ts +0 -178
  178. package/src/core/__test__/formula-parser.test.ts +0 -160
  179. package/src/core/__test__/history.test.ts +0 -225
  180. package/src/core/__test__/merge-manager.test.ts +0 -106
  181. package/src/core/__test__/sheet.test.ts +0 -142
  182. package/src/core/address.ts +0 -166
  183. package/src/core/cell-store.ts +0 -173
  184. package/src/core/command/default-registry.ts +0 -15
  185. package/src/core/command/history.ts +0 -167
  186. package/src/core/command/index.ts +0 -7
  187. package/src/core/command/merge-cells.ts +0 -74
  188. package/src/core/command/registry.ts +0 -30
  189. package/src/core/command/set-cell-formula.ts +0 -29
  190. package/src/core/command/set-cell-value.ts +0 -38
  191. package/src/core/command/types.ts +0 -73
  192. package/src/core/events.ts +0 -37
  193. package/src/core/fill.ts +0 -314
  194. package/src/core/formula/ast.ts +0 -66
  195. package/src/core/formula/dependency-graph.ts +0 -329
  196. package/src/core/formula/errors.ts +0 -41
  197. package/src/core/formula/evaluator.ts +0 -219
  198. package/src/core/formula/functions.ts +0 -266
  199. package/src/core/formula/index.ts +0 -7
  200. package/src/core/formula/parser.ts +0 -198
  201. package/src/core/formula/tokenizer.ts +0 -160
  202. package/src/core/merge-manager.ts +0 -158
  203. package/src/core/selection.ts +0 -66
  204. package/src/core/sheet.ts +0 -282
  205. package/src/core/workbook.ts +0 -99
  206. package/src/grid/__test__/canvas-mock.ts +0 -49
  207. package/src/grid/__test__/setup.ts +0 -3
  208. package/src/grid/__test__/sheet-grid-formula.test.ts +0 -140
  209. package/src/grid/__test__/sheet-grid.test.ts +0 -275
  210. package/src/grid/sheet-grid.ts +0 -407
  211. package/src/grid/vtable-theme.ts +0 -61
@@ -16,6 +16,7 @@
16
16
  */
17
17
  /** 暗色:data-theme 与系统偏好,与 UITheme.injectBuiltInThemes 选择器策略一致 */
18
18
  .u-sheet {
19
+ position: relative;
19
20
  display: flex;
20
21
  flex-direction: column;
21
22
  overflow: hidden;
@@ -23,14 +24,58 @@
23
24
  border-radius: var(--u-radius-default);
24
25
  background-color: var(--u-bg-color-top);
25
26
  }
27
+ .u-sheet__toolbar-wrap {
28
+ position: relative;
29
+ }
26
30
  .u-sheet__toolbar {
27
31
  display: flex;
28
32
  align-items: center;
29
- flex-wrap: wrap;
30
33
  gap: var(--u-gap-small);
31
34
  padding: var(--u-gap-small);
32
35
  border-bottom: 1px solid var(--u-border-muted-color);
33
36
  }
37
+ .u-sheet {
38
+ /* 单行滚动视口:工具超出视口时左右箭头导航(不再换行挤压 grid) */
39
+ }
40
+ .u-sheet__toolbar-scroll {
41
+ flex: 1;
42
+ min-width: 0;
43
+ overflow-x: auto;
44
+ overscroll-behavior-x: contain;
45
+ scrollbar-width: none; /* Firefox */
46
+ }
47
+ .u-sheet__toolbar-scroll::-webkit-scrollbar {
48
+ display: none;
49
+ }
50
+ .u-sheet__toolbar-list {
51
+ display: inline-flex;
52
+ align-items: center;
53
+ gap: var(--u-gap-small);
54
+ }
55
+ .u-sheet__toolbar-nav {
56
+ display: inline-flex;
57
+ flex: 0 0 auto;
58
+ align-items: center;
59
+ justify-content: center;
60
+ width: var(--u-form-component-height-small);
61
+ height: var(--u-form-component-height-small);
62
+ padding: 0;
63
+ border: none;
64
+ border-radius: var(--u-radius-small);
65
+ background: transparent;
66
+ color: var(--u-text-color-second);
67
+ cursor: pointer;
68
+ user-select: none;
69
+ transition: background-color var(--u-transition-fast) var(--u-transition-ease), color var(--u-transition-fast) var(--u-transition-ease);
70
+ }
71
+ .u-sheet__toolbar-nav:hover:not(:disabled) {
72
+ background-color: var(--u-bg-color-hover);
73
+ color: var(--u-color-primary);
74
+ }
75
+ .u-sheet__toolbar-nav:disabled {
76
+ color: var(--u-text-color-disabled);
77
+ cursor: not-allowed;
78
+ }
34
79
  .u-sheet__toolbar-divider {
35
80
  width: 1px;
36
81
  align-self: stretch;
@@ -40,9 +85,11 @@
40
85
  .u-sheet__tool {
41
86
  display: inline-flex;
42
87
  align-items: center;
88
+ justify-content: center;
43
89
  gap: 4px;
90
+ min-width: var(--u-form-component-height-small);
44
91
  height: var(--u-form-component-height-small);
45
- padding: 0 8px;
92
+ padding: 0 6px;
46
93
  border: none;
47
94
  border-radius: var(--u-radius-small);
48
95
  background: transparent;
@@ -55,33 +102,515 @@
55
102
  .u-sheet__tool:hover:not(:disabled) {
56
103
  background-color: var(--u-bg-color-hover);
57
104
  }
105
+ .u-sheet__tool.is-active {
106
+ background-color: var(--u-bg-color-hover);
107
+ color: var(--u-color-primary);
108
+ }
58
109
  .u-sheet__tool:disabled {
59
110
  color: var(--u-text-color-disabled);
60
111
  cursor: not-allowed;
61
112
  }
62
113
  .u-sheet__tool-icon {
63
- font-size: calc(var(--u-font-size-main-small) + 2px);
114
+ display: block;
115
+ width: 16px;
116
+ height: 16px;
117
+ font-size: 16px;
118
+ }
119
+ .u-sheet__export-menu {
120
+ display: flex;
121
+ flex-direction: column;
122
+ min-width: 180px;
123
+ padding: 4px 0;
124
+ }
125
+ .u-sheet__export-option {
126
+ display: block;
127
+ width: 100%;
128
+ padding: 6px 12px;
129
+ border: none;
130
+ background: transparent;
131
+ color: var(--u-text-color-main);
132
+ font-size: var(--u-font-size-main-small);
133
+ text-align: left;
134
+ cursor: pointer;
135
+ }
136
+ .u-sheet__export-option:hover {
137
+ background-color: var(--u-bg-color-hover);
138
+ }
139
+ .u-sheet__formula-bar {
140
+ display: flex;
141
+ align-items: center;
142
+ gap: var(--u-gap-small);
143
+ padding: var(--u-gap-small);
144
+ border-bottom: 1px solid var(--u-border-muted-color);
145
+ position: relative;
146
+ z-index: 30;
147
+ }
148
+ .u-sheet__fx-editor {
149
+ position: relative;
150
+ flex: 1;
151
+ min-width: 0;
152
+ height: var(--u-form-component-height-small);
153
+ }
154
+ .u-sheet__fx-input-panel {
155
+ position: absolute;
156
+ top: 0;
157
+ right: 0;
158
+ left: 0;
159
+ z-index: 1;
160
+ border-radius: var(--u-radius-small);
161
+ }
162
+ .u-sheet__fx-input-panel.is-expanded {
163
+ box-shadow: var(--u-shadow-sm);
164
+ }
165
+ .u-sheet__fx-suggest {
166
+ position: absolute;
167
+ top: calc(100% + 2px);
168
+ left: 0;
169
+ z-index: 20;
170
+ min-width: 280px;
171
+ border: 1px solid var(--u-border-muted-color);
172
+ border-radius: var(--u-radius-small);
173
+ background-color: var(--u-bg-color-top);
174
+ box-shadow: var(--u-shadow-sm);
175
+ }
176
+ .u-sheet {
177
+ /* UScroll 容器:滚动条由 desktop scroll 承担(不再用原生 overflow) */
178
+ }
179
+ .u-sheet__fx-suggest-scroll {
180
+ width: 100%;
181
+ }
182
+ .u-sheet__fx-suggest-list {
183
+ margin: 0;
184
+ padding: 4px 0;
185
+ list-style: none;
186
+ }
187
+ .u-sheet__fx-suggest-item {
188
+ display: flex;
189
+ flex-direction: column;
190
+ gap: 2px;
191
+ padding: 6px 10px;
192
+ cursor: pointer;
193
+ }
194
+ .u-sheet__fx-suggest-item:hover {
195
+ background-color: var(--u-bg-color-hover);
196
+ }
197
+ .u-sheet__fx-suggest-item.is-active {
198
+ background-color: var(--u-bg-color-hover);
199
+ }
200
+ .u-sheet__fx-suggest-sig {
201
+ color: var(--u-text-color-main);
202
+ font-size: var(--u-font-size-main-small);
203
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
204
+ }
205
+ .u-sheet__fx-suggest-desc {
206
+ color: var(--u-text-color-second);
207
+ font-size: var(--u-font-size-main-small);
208
+ }
209
+ .u-sheet__name-box {
210
+ width: 110px;
211
+ height: var(--u-form-component-height-small);
212
+ flex-shrink: 0;
213
+ padding: 0 6px;
214
+ border: 1px solid var(--u-border-muted-color);
215
+ border-radius: var(--u-radius-small);
216
+ background: transparent;
217
+ color: var(--u-text-color-main);
218
+ font-size: var(--u-font-size-main-small);
219
+ outline: none;
220
+ }
221
+ .u-sheet__name-box:focus {
222
+ border-color: var(--u-color-primary);
223
+ }
224
+ .u-sheet__fx-label {
225
+ display: inline-flex;
226
+ flex-shrink: 0;
227
+ align-items: center;
228
+ height: var(--u-form-component-height-small);
229
+ color: var(--u-text-color-second);
230
+ font-size: var(--u-font-size-main-small);
231
+ font-style: italic;
232
+ user-select: none;
233
+ }
234
+ .u-sheet__fx-input {
235
+ display: block;
236
+ box-sizing: border-box;
237
+ width: 100%;
238
+ min-height: var(--u-form-component-height-small);
239
+ max-height: calc(var(--u-form-component-height-small) * 8);
240
+ padding: 2px 6px;
241
+ border: 1px solid var(--u-border-muted-color);
242
+ border-radius: var(--u-radius-small);
243
+ background-color: var(--u-bg-color-top);
244
+ color: var(--u-text-color-main);
245
+ font-size: var(--u-font-size-main-small);
246
+ line-height: 1.4;
247
+ resize: none;
248
+ overflow-x: hidden;
249
+ overflow-y: auto;
250
+ outline: none;
251
+ }
252
+ .u-sheet__fx-input:focus {
253
+ border-color: var(--u-color-primary);
254
+ }
255
+ .u-sheet__fx-input:disabled {
256
+ color: var(--u-text-color-disabled);
257
+ }
258
+ .u-sheet__fx-btn {
259
+ display: inline-flex;
260
+ align-items: center;
261
+ justify-content: center;
262
+ width: 22px;
263
+ height: 22px;
264
+ flex-shrink: 0;
265
+ padding: 0;
266
+ border: 1px solid var(--u-border-muted-color);
267
+ border-radius: var(--u-radius-small);
268
+ background: transparent;
269
+ color: var(--u-text-color-main);
270
+ font-size: var(--u-font-size-main-small);
271
+ line-height: 1;
272
+ cursor: pointer;
273
+ transition: background-color var(--u-transition-fast) var(--u-transition-ease), color var(--u-transition-fast) var(--u-transition-ease);
274
+ }
275
+ .u-sheet__fx-btn:hover {
276
+ background-color: var(--u-bg-color-hover);
277
+ }
278
+ .u-sheet__popup {
279
+ /* UDropdown content 内层内容容器:定位/边框/背景/阴影由 dropdown 弹层提供 */
280
+ display: flex;
281
+ flex-direction: column;
282
+ gap: var(--u-gap-small);
283
+ padding: var(--u-gap-small);
284
+ }
285
+ .u-sheet__popup-row {
286
+ display: flex;
287
+ flex-wrap: wrap;
288
+ align-items: center;
289
+ gap: 6px;
290
+ max-width: 360px;
291
+ }
292
+ .u-sheet__popup-label {
293
+ color: var(--u-text-color-second);
294
+ font-size: var(--u-font-size-main-small);
295
+ }
296
+ .u-sheet__popup-line {
297
+ display: inline-flex;
298
+ align-items: center;
299
+ justify-content: center;
300
+ width: 24px;
301
+ height: 20px;
302
+ padding: 0 4px;
303
+ border: 1px solid var(--u-border-muted-color);
304
+ border-radius: var(--u-radius-small);
305
+ background: transparent;
306
+ cursor: pointer;
307
+ }
308
+ .u-sheet__popup-line.is-active {
309
+ border-color: var(--u-color-primary);
310
+ }
311
+ .u-sheet__popup-line-swatch {
312
+ width: 100%;
313
+ height: 4px;
314
+ }
315
+ .u-sheet__popup-preset {
316
+ display: inline-flex;
317
+ align-items: center;
318
+ justify-content: center;
319
+ width: 28px;
320
+ height: 28px;
321
+ padding: 0;
322
+ border: 1px solid var(--u-border-muted-color);
323
+ border-radius: var(--u-radius-small);
324
+ background: transparent;
325
+ color: var(--u-text-color-main);
326
+ cursor: pointer;
327
+ }
328
+ .u-sheet__popup-preset:hover {
329
+ background-color: var(--u-bg-color-hover);
330
+ }
331
+ .u-sheet__popup-preset.is-active {
332
+ border-color: var(--u-color-primary);
333
+ }
334
+ .u-sheet__popup-preset-glyph {
335
+ display: block;
336
+ flex-shrink: 0;
337
+ }
338
+ .u-sheet {
339
+ /* UScroll 容器:滚动条/滚动由 desktop scroll 组件承担(popup-size-list 不再自滚) */
340
+ }
341
+ .u-sheet__popup-size-scroll {
342
+ width: 48px;
343
+ }
344
+ .u-sheet__popup-size-list {
345
+ display: flex;
346
+ flex-direction: column;
347
+ gap: 2px;
348
+ }
349
+ .u-sheet__popup-size-item {
350
+ padding: 5px 12px;
351
+ border: none;
352
+ border-radius: var(--u-radius-small);
353
+ background: transparent;
354
+ color: var(--u-text-color-main);
355
+ font-size: var(--u-font-size-main-small);
356
+ text-align: left;
357
+ white-space: nowrap;
358
+ cursor: pointer;
359
+ }
360
+ .u-sheet__popup-size-item:hover {
361
+ background-color: var(--u-bg-color-hover);
362
+ }
363
+ .u-sheet__popup-size-item.is-active {
364
+ background-color: var(--u-bg-color-hover);
365
+ color: var(--u-color-primary);
366
+ }
367
+ .u-sheet__insert-count-menu {
368
+ display: flex;
369
+ align-items: center;
370
+ gap: 4px;
371
+ flex-shrink: 0;
372
+ user-select: none;
373
+ }
374
+ .u-sheet__insert-count-prefix, .u-sheet__insert-count-suffix {
375
+ flex-shrink: 0;
376
+ white-space: nowrap;
377
+ font-size: var(--u-font-size-main-small);
378
+ }
379
+ .u-sheet__insert-count-input {
380
+ width: 72px;
381
+ flex-shrink: 0;
382
+ }
383
+ .u-sheet__find-row {
384
+ display: flex;
385
+ align-items: center;
386
+ gap: 6px;
387
+ }
388
+ .u-sheet__find-input {
389
+ width: 140px;
390
+ }
391
+ .u-sheet__find-count {
392
+ min-width: 44px;
393
+ color: var(--u-text-color-second);
394
+ font-size: var(--u-font-size-main-small);
395
+ text-align: center;
396
+ white-space: nowrap;
397
+ }
398
+ .u-sheet__find-nav {
399
+ width: 22px;
400
+ height: 22px;
401
+ padding: 0;
402
+ border: 1px solid var(--u-border-muted-color);
403
+ border-radius: var(--u-radius-small);
404
+ background: transparent;
405
+ color: var(--u-text-color-main);
406
+ line-height: 1;
407
+ cursor: pointer;
408
+ }
409
+ .u-sheet__find-nav:hover:not(:disabled) {
410
+ background-color: var(--u-bg-color-hover);
411
+ }
412
+ .u-sheet__find-nav:disabled {
413
+ color: var(--u-text-color-disabled);
414
+ cursor: not-allowed;
415
+ }
416
+ .u-sheet__find-close {
417
+ width: 22px;
418
+ height: 22px;
419
+ margin-left: auto;
420
+ padding: 0;
421
+ border: none;
422
+ border-radius: var(--u-radius-small);
423
+ background: transparent;
424
+ color: var(--u-text-color-second);
425
+ line-height: 1;
426
+ cursor: pointer;
427
+ }
428
+ .u-sheet__find-close:hover {
429
+ background-color: var(--u-bg-color-hover);
430
+ color: var(--u-text-color-main);
431
+ }
432
+ .u-sheet__find-btn {
433
+ padding: 3px 10px;
434
+ border: 1px solid var(--u-border-muted-color);
435
+ border-radius: var(--u-radius-small);
436
+ background: transparent;
437
+ color: var(--u-text-color-main);
438
+ font-size: var(--u-font-size-main-small);
439
+ white-space: nowrap;
440
+ cursor: pointer;
441
+ }
442
+ .u-sheet__find-btn:hover:not(:disabled) {
443
+ background-color: var(--u-bg-color-hover);
444
+ }
445
+ .u-sheet__find-btn:disabled {
446
+ color: var(--u-text-color-disabled);
447
+ cursor: not-allowed;
448
+ }
449
+ .u-sheet__find-option {
450
+ display: inline-flex;
451
+ align-items: center;
452
+ gap: 4px;
453
+ color: var(--u-text-color-second);
454
+ font-size: var(--u-font-size-main-small);
455
+ white-space: nowrap;
456
+ cursor: pointer;
457
+ }
458
+ .u-sheet__find-select {
459
+ border: 1px solid var(--u-border-muted-color);
460
+ border-radius: var(--u-radius-small);
461
+ background: transparent;
462
+ color: var(--u-text-color-main);
463
+ font-size: var(--u-font-size-main-small);
464
+ }
465
+ .u-sheet__insert-image-picker {
466
+ min-width: 220px;
467
+ cursor: pointer;
468
+ }
469
+ .u-sheet__insert-image-picker:hover {
470
+ color: var(--u-color-primary);
471
+ }
472
+ .u-sheet__insert-image-hint {
473
+ padding: 8px 10px;
474
+ border: 1px dashed var(--u-border-muted-color);
475
+ border-radius: var(--u-radius-small);
476
+ text-align: center;
477
+ font-size: var(--u-font-size-main-small);
478
+ }
479
+ .u-sheet__insert-image-sub {
480
+ margin-top: 4px;
481
+ color: var(--u-text-color-second);
482
+ font-size: var(--u-font-size-assist-small);
64
483
  }
65
484
  .u-sheet__grid {
485
+ position: relative;
66
486
  flex: 1;
67
487
  min-height: 0;
488
+ overflow: hidden;
489
+ }
490
+ .u-sheet {
491
+ /* 导入解析覆盖层(自绘:遮罩 + 动画 + 文字同一层,不依赖 desktop Loading 的
492
+ text 能力;层级高于 v-loading 遮罩与 grid 实例,文字不被掩盖) */
493
+ }
494
+ .u-sheet__loading-mask {
495
+ position: absolute;
496
+ inset: 0;
497
+ z-index: 10;
498
+ background-color: var(--u-bg-color-top-alpha);
499
+ display: flex;
500
+ justify-content: center;
501
+ align-items: center;
502
+ flex-wrap: nowrap;
503
+ flex-direction: column;
504
+ }
505
+ .u-sheet {
506
+ /* 旋转圈动画(与 desktop dual-ring 同风格:border 圆环 + 顶部高亮 + 旋转) */
507
+ }
508
+ .u-sheet__loading-spinner {
509
+ width: 36px;
510
+ aspect-ratio: 1;
511
+ border-radius: 50%;
512
+ border: 3px solid var(--u-color-primary-a-22);
513
+ border-top-color: currentColor;
514
+ color: var(--u-color-primary);
515
+ animation: u-sheet-loading-spin 0.8s linear infinite;
516
+ }
517
+ .u-sheet__loading-spinner::after {
518
+ content: "";
519
+ position: absolute;
520
+ inset: 5px;
521
+ border-radius: 50%;
522
+ border: 2px solid var(--u-color-primary-a-22);
523
+ border-bottom-color: currentColor;
524
+ animation: u-sheet-loading-spin 1.2s linear infinite reverse;
525
+ }
526
+ .u-sheet__loading-text {
527
+ margin-top: var(--u-gap-small);
528
+ color: var(--u-text-color-secondary);
529
+ font-size: 12px;
530
+ line-height: 1.5;
531
+ text-align: center;
532
+ white-space: nowrap;
533
+ }
534
+ @keyframes u-sheet-loading-spin {
535
+ to {
536
+ transform: rotate(360deg);
537
+ }
538
+ }
539
+ .u-sheet {
540
+ /* LRU 缓存实例容器:absolute 堆叠于 grid 区,非激活实例 visibility:hidden
541
+ (保持尺寸不触发 VTable resize,切回仅翻转可见性 + 选区回驱) */
542
+ }
543
+ .u-sheet__grid-instance {
544
+ position: absolute;
545
+ inset: 0;
546
+ visibility: hidden;
68
547
  }
69
548
  .u-sheet__tabs {
70
549
  display: flex;
71
550
  align-items: center;
72
551
  gap: 2px;
552
+ min-width: 0;
73
553
  padding: 2px var(--u-gap-small);
74
554
  border-top: 1px solid var(--u-border-muted-color);
75
555
  background-color: var(--u-bg-color-middle);
76
556
  }
557
+ .u-sheet__tabs-nav {
558
+ display: inline-flex;
559
+ flex: 0 0 auto;
560
+ align-items: center;
561
+ justify-content: center;
562
+ width: 22px;
563
+ height: 22px;
564
+ padding: 0;
565
+ border: none;
566
+ border-radius: var(--u-radius-small);
567
+ background: transparent;
568
+ color: var(--u-text-color-second);
569
+ cursor: pointer;
570
+ user-select: none;
571
+ transition: background-color var(--u-transition-fast) var(--u-transition-ease), color var(--u-transition-fast) var(--u-transition-ease);
572
+ }
573
+ .u-sheet__tabs-nav:hover:not(:disabled) {
574
+ background-color: var(--u-bg-color-hover);
575
+ color: var(--u-color-primary);
576
+ }
577
+ .u-sheet__tabs-nav:disabled {
578
+ color: var(--u-text-color-disabled);
579
+ cursor: not-allowed;
580
+ }
581
+ .u-sheet__tabs-viewport {
582
+ flex: 0 1 auto;
583
+ min-width: 0;
584
+ max-width: 100%;
585
+ overflow-x: auto;
586
+ overflow-y: hidden;
587
+ overscroll-behavior-x: contain;
588
+ scrollbar-width: none; /* Firefox */
589
+ }
590
+ .u-sheet__tabs-viewport::-webkit-scrollbar {
591
+ display: none;
592
+ }
593
+ .u-sheet__tabs-list {
594
+ display: inline-flex;
595
+ flex-wrap: nowrap;
596
+ flex-shrink: 0;
597
+ align-items: center;
598
+ gap: 2px;
599
+ width: max-content;
600
+ }
77
601
  .u-sheet__tab {
602
+ display: inline-flex;
603
+ flex-shrink: 0;
604
+ align-items: center;
78
605
  padding: 4px 12px;
79
606
  border: none;
80
607
  border-radius: var(--u-radius-small);
81
608
  background: transparent;
82
609
  color: var(--u-text-color-second);
83
610
  font-size: var(--u-font-size-main-small);
611
+ white-space: nowrap;
84
612
  cursor: pointer;
613
+ user-select: none;
85
614
  transition: background-color var(--u-transition-fast) var(--u-transition-ease), color var(--u-transition-fast) var(--u-transition-ease);
86
615
  }
87
616
  .u-sheet__tab:hover {
@@ -91,3 +620,35 @@
91
620
  background-color: var(--u-bg-color-top);
92
621
  color: var(--u-color-primary);
93
622
  }
623
+ .u-sheet__tab-rename-input {
624
+ width: 96px;
625
+ height: 20px;
626
+ padding: 0 4px;
627
+ border: 1px solid var(--u-color-primary);
628
+ border-radius: var(--u-radius-small);
629
+ outline: none;
630
+ color: var(--u-text-color-main);
631
+ font-size: var(--u-font-size-main-small);
632
+ }
633
+ .u-sheet__tab-add {
634
+ display: inline-flex;
635
+ flex: 0 0 auto;
636
+ align-items: center;
637
+ justify-content: center;
638
+ width: 24px;
639
+ height: 24px;
640
+ margin-left: 2px;
641
+ padding: 0;
642
+ border: none;
643
+ border-radius: var(--u-radius-small);
644
+ background: transparent;
645
+ color: var(--u-text-color-second);
646
+ font-size: var(--u-font-size-main-small);
647
+ line-height: 1;
648
+ cursor: pointer;
649
+ transition: background-color var(--u-transition-fast) var(--u-transition-ease), color var(--u-transition-fast) var(--u-transition-ease);
650
+ }
651
+ .u-sheet__tab-add:hover {
652
+ background-color: var(--u-bg-color-hover);
653
+ color: var(--u-color-primary);
654
+ }