xiaodao-spreader 0.1.9 → 0.1.11
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.
- package/README.ZH.md +3 -2
- package/README.md +4 -3
- package/dist/style.css +1 -1
- package/dist/types/components/spreader/components/dropdown.vue.d.ts +3 -0
- package/dist/types/components/spreader/components/pickers/calcPicker.vue.d.ts +29 -0
- package/dist/types/components/spreader/components/pickers/numberFormatDialog.vue.d.ts +23 -0
- package/dist/types/components/spreader/components/toolbar.vue.d.ts +14 -0
- package/dist/types/components/spreader/composables/borders-merge.d.ts +5 -0
- package/dist/types/components/spreader/composables/core-state.d.ts +11 -1
- package/dist/types/components/spreader/composables/interactions.d.ts +4 -0
- package/dist/types/components/spreader/composables/sheets-ops.d.ts +4 -2
- package/dist/types/components/spreader/composables/undo-styles.d.ts +8 -0
- package/dist/types/components/spreader/core/number-format.d.ts +100 -0
- package/dist/xiaodao-spreader.es.js +4305 -2823
- package/dist/xiaodao-spreader.umd.js +9 -9
- package/package.json +1 -1
package/README.ZH.md
CHANGED
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
|
|
41
41
|
- **Canvas 2D 渲染** — 高 DPI 自适应(DPR 缩放),虚拟视口渲染,支持 200 行 × 26 列
|
|
42
42
|
- **多 Sheet 工作簿** — 标签栏支持新建、重命名、复制、删除、拖拽排序
|
|
43
|
-
- **公式引擎** — `=SUM()`
|
|
43
|
+
- **公式引擎** — 支持 `=SUM()`、`=AVERAGE()` 区间统计,支持依赖追踪与循环引用检测;工具栏与右键菜单提供一键求和/平均值
|
|
44
44
|
- **合并单元格** — 合并居中、跨列合并、取消合并,边框自动同步
|
|
45
45
|
- **丰富单元格格式** — 字体、字号(5–72)、加粗、斜体、下划线、删除线、文字颜色、填充颜色、水平/垂直对齐、自动换行
|
|
46
46
|
- **边框** — 上/下/左/右/全部/无,5 种预设样式及自定义颜色
|
|
@@ -291,6 +291,7 @@ src/
|
|
|
291
291
|
| 公式 | 语法 | 说明 |
|
|
292
292
|
|------|------|------|
|
|
293
293
|
| `SUM` | `=SUM(A1:B5)` | 区间求和 |
|
|
294
|
+
| `AVERAGE` | `=AVERAGE(A1:B5)` | 区间平均值 |
|
|
294
295
|
| 绝对引用 | `$A$1` | 锁定列与行 |
|
|
295
296
|
| 混合引用 | `$A1`、`A$1` | 仅锁定列或行 |
|
|
296
297
|
|
|
@@ -399,7 +400,7 @@ pnpm build:demo
|
|
|
399
400
|
|
|
400
401
|
### 近期
|
|
401
402
|
|
|
402
|
-
- [ ] 更多公式:`
|
|
403
|
+
- [ ] 更多公式:`COUNT`、`IF`、`VLOOKUP`、`CONCATENATE`
|
|
403
404
|
- [ ] 单元格背景颜色选择器
|
|
404
405
|
- [ ] 数字格式(货币、百分比、日期、小数位数)
|
|
405
406
|
- [ ] 条件格式规则
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Xiaodao Spreader
|
|
2
2
|
|
|
3
|
-
中文
|
|
3
|
+
[中文](./README.ZH.md) | English
|
|
4
4
|
|
|
5
5
|
A high-performance, canvas-based spreadsheet component for Vue 3 — bringing an Excel-like editing experience to the web.
|
|
6
6
|
|
|
@@ -39,7 +39,7 @@ A high-performance, canvas-based spreadsheet component for Vue 3 — bringing an
|
|
|
39
39
|
### Core Spreadsheet
|
|
40
40
|
- **Canvas 2D Rendering** — High-DPI aware with DPR scaling, virtual viewport rendering for 200 × 26 sheets
|
|
41
41
|
- **Multi-Sheet Workbook** — Tab bar with add, rename, duplicate, delete, reorder
|
|
42
|
-
- **Formula Engine** — `=SUM()` range calculation with dependency tracking and circular-reference detection
|
|
42
|
+
- **Formula Engine** — `=SUM()`, `=AVERAGE()` range calculation with dependency tracking and circular-reference detection; toolbar and context menu provide one-click sum/average
|
|
43
43
|
- **Merge Cells** — Merge & Center, Merge Across, Unmerge with border synchronization
|
|
44
44
|
- **Rich Cell Formatting** — Font family, font size (5–72), bold, italic, underline, strikethrough, text color, fill color, horizontal & vertical alignment, wrap text
|
|
45
45
|
- **Borders** — Top / bottom / left / right / all / none with 5 predefined styles and custom color
|
|
@@ -288,6 +288,7 @@ src/
|
|
|
288
288
|
| Formula | Syntax | Description |
|
|
289
289
|
|---------|--------|-------------|
|
|
290
290
|
| `SUM` | `=SUM(A1:B5)` | Range summation |
|
|
291
|
+
| `AVERAGE` | `=AVERAGE(A1:B5)` | Range average |
|
|
291
292
|
| Absolute ref | `$A$1` | Lock column and row |
|
|
292
293
|
| Mixed ref | `$A1`, `A$1` | Lock column or row only |
|
|
293
294
|
|
|
@@ -396,7 +397,7 @@ The project includes a GitHub Actions workflow (`.github/workflows/publish.yml`)
|
|
|
396
397
|
|
|
397
398
|
### Near-term
|
|
398
399
|
|
|
399
|
-
- [ ] More formulas: `
|
|
400
|
+
- [ ] More formulas: `COUNT`, `IF`, `VLOOKUP`, `CONCATENATE`
|
|
400
401
|
- [ ] Cell background color picker
|
|
401
402
|
- [ ] Number format (currency, percentage, date, number of decimals)
|
|
402
403
|
- [ ] Conditional formatting rules
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.sp-dropdown[data-v-8dc09f5d]{position:relative;display:inline-flex;min-width:0}.sp-dropdown__trigger[data-v-8dc09f5d]{display:flex;align-items:center;justify-content:space-between;gap:4px;width:100%;height:26px;border:1px solid transparent;border-radius:3px;background:transparent;color:var(--sp-toolbar-btn-color, #444);font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;cursor:pointer;padding:0 5px;box-sizing:border-box}.sp-dropdown__trigger[data-v-8dc09f5d]:hover{background:var(--sp-toolbar-btn-hover-bg, #e6e6e6)}.sp-dropdown__trigger--open[data-v-8dc09f5d]{background:var(--sp-toolbar-btn-hover-bg, #e6e6e6);border-color:var(--sp-toolbar-border, #d8d8d8)}.sp-dropdown__value[data-v-8dc09f5d]{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.sp-dropdown__caret[data-v-8dc09f5d]{width:10px;height:10px;min-width:10px;opacity:.7}.sp-dropdown__menu[data-v-8dc09f5d]{position:fixed;z-index:20000;display:flex;flex-direction:column;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;box-shadow:0 4px 12px #0000001f;padding:4px;box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;transform-origin:top center}.sp-dropdown__menu--up[data-v-8dc09f5d]{transform-origin:bottom center}.menu-pop-enter-active[data-v-8dc09f5d],.menu-pop-leave-active[data-v-8dc09f5d]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-8dc09f5d],.menu-pop-leave-to[data-v-8dc09f5d]{opacity:0;transform:scaleY(.85)}.sp-dropdown__nav[data-v-8dc09f5d]{display:flex;align-items:center;justify-content:center;height:15px;min-height:15px;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #666);cursor:pointer;padding:0;border-radius:3px}.sp-dropdown__nav[data-v-8dc09f5d]:hover:not(:disabled){background:#eef3f9}.sp-dropdown__nav[data-v-8dc09f5d]:disabled{color:#ccc;cursor:default}.sp-dropdown__nav svg[data-v-8dc09f5d]{width:10px;height:10px}.sp-dropdown__list[data-v-8dc09f5d]{display:flex;flex-direction:column;overflow:hidden;touch-action:none}.sp-dropdown__icon[data-v-8dc09f5d]{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.sp-dropdown__icon[data-v-8dc09f5d] svg{width:18px;height:18px;display:block}.sp-dropdown__item-icon[data-v-8dc09f5d]{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.sp-dropdown__item-icon[data-v-8dc09f5d] svg{width:16px;height:16px;display:block}.sp-dropdown__item-label[data-v-8dc09f5d]{white-space:nowrap}.sp-dropdown__item[data-v-8dc09f5d]{display:flex;align-items:center;gap:6px;width:100%;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #444);font-size:12px;cursor:pointer;padding:4px 8px;box-sizing:border-box;border-radius:3px}.sp-dropdown__item[data-v-8dc09f5d]:hover{background:#eef3f9}.sp-dropdown__item--active[data-v-8dc09f5d]{background:#e5f1fb;color:#0078d7}.color-picker[data-v-f00d0dae]{position:relative;display:inline-flex;height:26px}.color-picker__menu[data-v-f00d0dae]{position:fixed;z-index:9999;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;padding:6px;box-shadow:0 4px 12px #0000001f;-webkit-user-select:none;user-select:none;transform-origin:top right}.menu-pop-enter-active[data-v-f00d0dae],.menu-pop-leave-active[data-v-f00d0dae]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-f00d0dae],.menu-pop-leave-to[data-v-f00d0dae]{opacity:0;transform:scale(.9)}.color-picker__row[data-v-f00d0dae]{display:flex;gap:4px;margin-bottom:4px}.color-picker__row[data-v-f00d0dae]:last-child{margin-bottom:0}.color-picker__swatch[data-v-f00d0dae]{width:20px;height:20px;padding:0;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:transform .08s,box-shadow .08s;position:relative}.color-picker__swatch[data-v-f00d0dae]:hover{transform:scale(1.18);box-shadow:0 0 0 1px #0003;z-index:1}.color-picker__swatch--selected[data-v-f00d0dae]{box-shadow:0 0 0 2px #0078d7}.border-picker[data-v-3721e5e4]{position:relative;display:inline-flex;height:26px}.border-picker__menu[data-v-3721e5e4]{position:fixed;z-index:9999;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;box-shadow:0 4px 12px #0000001f;-webkit-user-select:none;user-select:none;padding:4px;transform-origin:top right}.border-picker__item[data-v-3721e5e4]{display:flex;align-items:center;gap:6px;width:100%;padding:4px 8px;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #444);cursor:pointer;border-radius:3px;font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;white-space:nowrap}.border-picker__item[data-v-3721e5e4]:hover{background:#eef3f9}.border-picker__icon[data-v-3721e5e4]{width:18px;height:18px;flex-shrink:0}.border-picker__label[data-v-3721e5e4]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-3721e5e4],.menu-pop-leave-active[data-v-3721e5e4]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-3721e5e4],.menu-pop-leave-to[data-v-3721e5e4]{opacity:0;transform:scale(.9)}.merge-picker[data-v-24e4dbe5]{position:relative;display:inline-flex;height:26px}.merge-picker__menu[data-v-24e4dbe5]{position:fixed;z-index:9999;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;box-shadow:0 4px 12px #0000001f;-webkit-user-select:none;user-select:none;padding:4px;transform-origin:top right}.merge-picker__item[data-v-24e4dbe5]{display:flex;align-items:center;gap:6px;width:100%;padding:4px 8px;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #444);cursor:pointer;border-radius:3px;font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;white-space:nowrap}.merge-picker__item[data-v-24e4dbe5]:hover{background:#eef3f9}.merge-picker__icon[data-v-24e4dbe5]{width:18px;height:18px;flex-shrink:0;display:flex;align-items:center;justify-content:center}.merge-picker__icon[data-v-24e4dbe5] svg{width:18px;height:18px}.merge-picker__label[data-v-24e4dbe5]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-24e4dbe5],.menu-pop-leave-active[data-v-24e4dbe5]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-24e4dbe5],.menu-pop-leave-to[data-v-24e4dbe5]{opacity:0;transform:scale(.9)}.toolbar[data-v-7da07fb8]{position:relative;display:flex;align-items:center;height:32px;min-height:32px;gap:2px;padding:0 6px;background:var(--sp-toolbar-bg);border-bottom:1px solid var(--sp-toolbar-border);-webkit-user-select:none;user-select:none}.tb-item[data-v-7da07fb8]{display:flex;align-items:center;flex:0 0 auto}.toolbar-sep[data-v-7da07fb8]{width:1px;height:18px;margin:0 4px;background:var(--sp-toolbar-border)}.toolbar-font[data-v-7da07fb8],.toolbar-align[data-v-7da07fb8]{flex:0 0 auto}.toolbar-font-size[data-v-7da07fb8]{display:inline-flex;align-items:center;gap:0;height:26px;position:relative}.toolbar-font-size__input[data-v-7da07fb8]{width:36px;height:26px;border:1px solid transparent;border-right:none;border-radius:3px 0 0 3px;background:transparent;color:var(--sp-toolbar-btn-color);font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;text-align:left;padding:0 5px;outline:none;box-sizing:border-box;-webkit-appearance:none;appearance:none;-moz-appearance:textfield}.toolbar-font-size__input[data-v-7da07fb8]::-webkit-outer-spin-button,.toolbar-font-size__input[data-v-7da07fb8]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.toolbar-font-size__input[data-v-7da07fb8]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__input[data-v-7da07fb8]:focus{border-color:var(--sp-toolbar-border);background:#fff}.toolbar-font-size__btn[data-v-7da07fb8]{display:flex;align-items:center;justify-content:center;width:16px;height:26px;border:1px solid transparent;border-left:none;border-radius:0 3px 3px 0;background:transparent;color:var(--sp-toolbar-btn-color);cursor:pointer;padding:0}.toolbar-font-size__btn[data-v-7da07fb8]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__btn svg[data-v-7da07fb8]{width:10px;height:10px}.toolbar-font-size__dropdown[data-v-7da07fb8]{position:absolute;width:56px;height:26px;pointer-events:none}.toolbar-btn[data-v-7da07fb8]{display:flex;align-items:center;justify-content:center;width:30px;height:26px;border:none;border-radius:3px;background:transparent;color:var(--sp-toolbar-btn-color);cursor:pointer;padding:0}.toolbar-btn[data-v-7da07fb8]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-btn[data-v-7da07fb8]:active:not(:disabled){opacity:.7}.toolbar-btn--active[data-v-7da07fb8]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-btn--step[data-v-7da07fb8]{width:26px;height:26px}.toolbar-btn--step svg[data-v-7da07fb8]{width:16px;height:16px}.toolbar-btn[data-v-7da07fb8]:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.toolbar-btn__icon[data-v-7da07fb8]{width:18px;height:18px}.toolbar-btn svg[data-v-7da07fb8]:not(.toolbar-btn__icon){width:18px;height:18px}.toolbar-split[data-v-7da07fb8]{display:inline-flex;align-items:center;position:relative;height:26px}.toolbar-split__main[data-v-7da07fb8]{border:1px solid transparent;border-right:none;border-radius:3px 0 0 3px}.toolbar-split__arrow[data-v-7da07fb8]{display:flex;align-items:center;justify-content:center;width:16px;height:26px;border:1px solid transparent;border-radius:0 3px 3px 0;background:transparent;color:var(--sp-toolbar-btn-color);cursor:pointer;padding:0}.toolbar-split__arrow[data-v-7da07fb8]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-split__arrow svg[data-v-7da07fb8]{width:10px!important;height:10px!important}.toolbar-more[data-v-7da07fb8]{display:flex;align-items:center;justify-content:center;width:30px;height:26px;border:none;border-radius:3px;background:transparent;color:var(--sp-toolbar-btn-color);cursor:pointer;padding:0;flex:0 0 auto;margin-left:auto}.toolbar-more[data-v-7da07fb8]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-more--active[data-v-7da07fb8]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-more svg[data-v-7da07fb8]{width:18px;height:18px}.overflow-menu[data-v-7da07fb8]{min-width:180px;max-width:260px;max-height:calc(100vh - 40px);overflow-y:auto;background:var(--sp-toolbar-bg, #fff);border:1px solid var(--sp-toolbar-border);border-radius:4px;box-shadow:0 4px 12px #0000001f;padding:4px 6px;display:flex;flex-direction:column;gap:2px;z-index:1000;transform-origin:top right}.overflow-menu.no-anim[data-v-7da07fb8]{transition:none!important}.overflow-menu .tb-item[data-v-7da07fb8]{width:100%}.overflow-menu .toolbar-sep[data-v-7da07fb8]{width:100%;height:1px;margin:2px 0}.overflow-menu .toolbar-split[data-v-7da07fb8]{width:100%}.overflow-menu .toolbar-split__main[data-v-7da07fb8]{flex:1 1 auto;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-font-size[data-v-7da07fb8]{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font[data-v-7da07fb8],.overflow-menu .toolbar-align[data-v-7da07fb8]{width:100%}.overflow-menu .toolbar-btn[data-v-7da07fb8]:not(.toolbar-btn--step):not(.toolbar-split__arrow){width:100%;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-color[data-v-7da07fb8]{width:100%}.overflow-menu .toolbar-wrap[data-v-7da07fb8]{width:100%;justify-content:flex-start}.menu-pop-enter-active[data-v-7da07fb8],.menu-pop-leave-active[data-v-7da07fb8]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-7da07fb8],.menu-pop-leave-to[data-v-7da07fb8]{opacity:0;transform:scale(.9)}.overflow-menu .tb-item{width:100%}.overflow-menu .toolbar-sep{width:100%;height:1px;margin:2px 0}.overflow-menu .toolbar-split{width:100%}.overflow-menu .toolbar-split__main{flex:1 1 auto;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-font-size{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font,.overflow-menu .toolbar-align{width:100%}.overflow-menu .toolbar-btn:not(.toolbar-btn--step):not(.toolbar-split__arrow){width:100%;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-color{width:100%}.overflow-menu .toolbar-wrap{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font-size__input{flex:1 1 auto;width:auto;min-width:40px}.overflow-menu .toolbar-btn:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-btn:active:not(:disabled){opacity:.7}.overflow-menu .toolbar-btn--active{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.overflow-menu .toolbar-btn:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.overflow-menu .toolbar-split__main:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-split__arrow:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-font-size__input:hover{background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-font-size__input:focus{border-color:var(--sp-toolbar-border);background:#fff}.overflow-menu .toolbar-font-size__btn:hover,.overflow-menu .toolbar-more:hover{background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-more--active{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.tab-bar[data-v-454e1a12]{display:flex;align-items:stretch;height:30px;min-height:30px;background:var(--sp-tab-bar-bg);border-top:1px solid var(--sp-tab-bar-border);-webkit-user-select:none;user-select:none;margin-top:4px}.tab-list[data-v-454e1a12]{display:flex;align-items:flex-start;flex:1;overflow:hidden;gap:1px;padding:0 1px}.tab-item[data-v-454e1a12]{display:flex;align-items:center;height:28px;min-width:0;max-width:120px;padding:0 10px;cursor:pointer;border:1px solid var(--sp-tab-inactive-border);background:var(--sp-tab-inactive-bg);color:var(--sp-tab-inactive-color);font-size:14px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;white-space:nowrap;transition:background .1s}.tab-item[data-v-454e1a12]:hover{background:var(--sp-tab-hover-bg)}.tab-item--active[data-v-454e1a12]{height:28px;background:var(--sp-tab-active-bg);color:var(--sp-tab-active-color);border-color:var(--sp-tab-active-bg) var(--sp-tab-bar-border) var(--sp-tab-bar-border);border-top:2px solid var(--sp-tab-active-border);font-size:16px}.tab-item--active[data-v-454e1a12]:hover{background:var(--sp-tab-active-bg)}.tab-item__name[data-v-454e1a12]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tab-rename-input[data-v-454e1a12]{width:100%;height:18px;border:none;border-radius:0;outline:none;padding:0;font-size:16px;font-family:inherit;background:var(--sp-tab-active-bg);color:var(--sp-tab-active-color);box-sizing:border-box}.tab-bar__add-btn[data-v-454e1a12]{width:24px;min-width:24px;height:24px;margin:0 4px 3px 3px;border:none;background:transparent;color:var(--sp-tab-add-btn-color);font-size:16px;line-height:22px;text-align:center;cursor:pointer;padding:0}.tab-bar__add-btn[data-v-454e1a12]:hover{background:var(--sp-tab-add-btn-hover-bg)}.spreadsheet-outer[data-v-ef18f895]{flex:1;display:flex;flex-direction:column;overflow:hidden;height:100%;min-height:400px;width:100%}.formula-bar[data-v-ef18f895]{display:flex;align-items:start;height:36px;min-height:36px;padding:0;gap:0}.formula-bar__cell-label[data-v-ef18f895]{width:48px;min-width:48px;height:28px;line-height:28px;margin-top:4px;text-align:center;font-size:12px;font-weight:600;color:var(--sp-formula-bar-label-color);background:var(--sp-formula-bar-label-bg);border:1px solid var(--sp-formula-bar-label-border);border-radius:2px;-webkit-user-select:none;user-select:none}.formula-bar__input[data-v-ef18f895]{flex:1;height:28px;margin-top:4px;border:1px solid var(--sp-formula-bar-input-border);border-radius:2px;outline:none;padding:0 6px;margin-left:4px;font-size:13px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;color:var(--sp-formula-bar-input-color);background:var(--sp-formula-bar-input-bg)}.formula-bar__input[data-v-ef18f895]:focus{border-color:var(--sp-formula-bar-input-focus-border);box-shadow:0 0 0 1px var(--sp-formula-bar-input-focus-shadow)}.spreadsheet-wrapper[data-v-ef18f895]{flex:1;position:relative;overflow:hidden;background:var(--sp-wrapper-bg)}.grid-canvas[data-v-ef18f895]{position:absolute;top:0;left:0;display:block;outline:none;cursor:cell}.grid-canvas[data-v-ef18f895]:focus{outline:none}.v-scrollbar[data-v-ef18f895]{position:absolute;right:0;top:0;width:11px;height:calc(100% - 11px);display:flex;flex-direction:column;background:var(--sp-wrapper-bg)}.h-scrollbar[data-v-ef18f895]{position:absolute;left:0;bottom:0;height:11px;width:calc(100% - 11px);display:flex;background:var(--sp-wrapper-bg)}.sb-corner[data-v-ef18f895]{position:absolute;right:0;bottom:0;width:11px;height:11px;background:var(--sp-wrapper-bg)}.sb-btn[data-v-ef18f895]{width:11px;height:11px;min-width:11px;min-height:11px;border:none;background:var(--sp-scroll-btn-bg, #e8e8e8);display:flex;align-items:center;justify-content:center;cursor:pointer;padding:0;-webkit-user-select:none;user-select:none}.sb-btn[data-v-ef18f895]:hover{background:var(--sp-scroll-btn-hover-bg, #d0d0d0)}.sb-btn[data-v-ef18f895]:active{background:var(--sp-scroll-btn-active-bg, #c0c0c0)}.sb-arrow[data-v-ef18f895]{display:block;width:0;height:0}.sb-arrow--up[data-v-ef18f895]{border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:4px solid var(--sp-scroll-btn-color, #666)}.sb-arrow--down[data-v-ef18f895]{border-left:3px solid transparent;border-right:3px solid transparent;border-top:4px solid var(--sp-scroll-btn-color, #666)}.sb-arrow--left[data-v-ef18f895]{border-top:3px solid transparent;border-bottom:3px solid transparent;border-right:4px solid var(--sp-scroll-btn-color, #666)}.sb-arrow--right[data-v-ef18f895]{border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:4px solid var(--sp-scroll-btn-color, #666)}.sb-track[data-v-ef18f895]{flex:1;position:relative;background:var(--sp-scroll-track-bg, rgba(0,0,0,.06))}.sb-track--v[data-v-ef18f895]{width:11px}.sb-track--h[data-v-ef18f895]{height:11px}.sb-thumb[data-v-ef18f895]{position:absolute;border-radius:3px;background:var(--sp-scroll-thumb);cursor:default}.sb-thumb[data-v-ef18f895]:hover{background:var(--sp-scroll-thumb-hover)}.sb-thumb--v[data-v-ef18f895]{left:1px;right:1px;min-height:16px}.sb-thumb--h[data-v-ef18f895]{top:1px;bottom:1px;min-width:16px}.cell-editor[data-v-ef18f895]{position:absolute;border:2px solid var(--sp-cell-editor-border);outline:none;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;font-size:13px;color:var(--sp-cell-editor-color);background:var(--sp-cell-editor-bg);box-shadow:0 0 0 1px var(--sp-cell-editor-shadow);z-index:10;box-sizing:border-box;min-width:0;overflow:hidden;padding:0;margin:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;resize:none;white-space:pre-wrap;word-break:break-all}.context-menu{position:fixed;z-index:10000;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;padding:4px 0;min-width:120px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;font-size:13px;transform-origin:top left}.context-menu__item{padding:6px 20px;cursor:pointer;color:#333;white-space:nowrap;position:relative;display:flex;align-items:center;justify-content:space-between}.context-menu__item:hover{background:#e8f0fe}.context-menu__item--disabled{color:#bbb;cursor:default}.context-menu__item--disabled:hover{background:transparent}.context-menu__arrow{margin-left:16px;margin-right:-5px;width:0;height:0;border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:4px solid #888}.context-submenu{display:none;position:absolute;left:100%;top:-4px;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;padding:4px 0;min-width:100px;z-index:10001}.context-submenu--left{left:auto;right:100%}.context-menu__item:hover>.context-submenu{display:block}.context-submenu .context-menu__item{justify-content:flex-start}.menu-pop-enter-active,.menu-pop-leave-active{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from,.menu-pop-leave-to{opacity:0;transform:scale(.9)}.dim-panel{position:fixed;z-index:10002;width:220px;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;padding:10px 12px;box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;-webkit-user-select:none;user-select:none;transform-origin:top left}.dim-panel__title{font-size:13px;font-weight:600;color:#333;margin-bottom:8px}.dim-panel__body{display:flex;align-items:center;gap:6px}.dim-panel__input{flex:1;height:26px;border:1px solid #c0c0c0;border-radius:3px;outline:none;padding:0 6px;font-size:13px;color:#1a1a1a;background:#fff;box-sizing:border-box}.dim-panel__input:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.dim-panel__input--error{border-color:#d93025;box-shadow:0 0 0 1px #d930254d}.dim-panel__unit{font-size:12px;color:#888}.dim-panel__error{margin-top:6px;font-size:12px;color:#d93025;line-height:1.4}.dim-panel__footer{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}.dim-panel__btn{height:26px;padding:0 14px;border:1px solid #ccc;border-radius:3px;background:#fff;color:#333;font-size:13px;cursor:pointer}.dim-panel__btn:hover{background:#f0f0f0}.dim-panel__btn--primary{border-color:#0078d7;background:#0078d7;color:#fff}.dim-panel__btn--primary:hover{background:#0069c0}
|
|
1
|
+
.sp-dropdown[data-v-77df3baf]{position:relative;display:inline-flex;min-width:0}.sp-dropdown__trigger[data-v-77df3baf]{display:flex;align-items:center;justify-content:space-between;gap:4px;width:100%;height:26px;border:1px solid transparent;border-radius:3px;background:transparent;color:var(--sp-toolbar-btn-color, #444);font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;cursor:pointer;padding:0 5px;box-sizing:border-box}.sp-dropdown__trigger[data-v-77df3baf]:hover{background:var(--sp-toolbar-btn-hover-bg, #e6e6e6)}.sp-dropdown__trigger--open[data-v-77df3baf]{background:var(--sp-toolbar-btn-hover-bg, #e6e6e6);border-color:var(--sp-toolbar-border, #d8d8d8)}.sp-dropdown__value[data-v-77df3baf]{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.sp-dropdown__caret[data-v-77df3baf]{width:10px;height:10px;min-width:10px;opacity:.7}.sp-dropdown__menu[data-v-77df3baf]{position:fixed;z-index:20000;display:flex;flex-direction:column;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;box-shadow:0 4px 12px #0000001f;padding:4px;box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;transform-origin:top center}.sp-dropdown__menu--up[data-v-77df3baf]{transform-origin:bottom center}.menu-pop-enter-active[data-v-77df3baf],.menu-pop-leave-active[data-v-77df3baf]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-77df3baf],.menu-pop-leave-to[data-v-77df3baf]{opacity:0;transform:scaleY(.85)}.sp-dropdown__nav[data-v-77df3baf]{display:flex;align-items:center;justify-content:center;height:15px;min-height:15px;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #666);cursor:pointer;padding:0;border-radius:3px}.sp-dropdown__nav[data-v-77df3baf]:hover:not(:disabled){background:#eef3f9}.sp-dropdown__nav[data-v-77df3baf]:disabled{color:#ccc;cursor:default}.sp-dropdown__nav svg[data-v-77df3baf]{width:10px;height:10px}.sp-dropdown__list[data-v-77df3baf]{display:flex;flex-direction:column;overflow:hidden;touch-action:none}.sp-dropdown__icon[data-v-77df3baf]{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.sp-dropdown__icon[data-v-77df3baf] svg{width:18px;height:18px;display:block}.sp-dropdown__item-icon[data-v-77df3baf]{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.sp-dropdown__item-icon[data-v-77df3baf] svg{width:16px;height:16px;display:block}.sp-dropdown__item-label[data-v-77df3baf]{white-space:nowrap}.sp-dropdown__item[data-v-77df3baf]{display:flex;align-items:center;gap:6px;width:100%;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #444);font-size:12px;cursor:pointer;padding:4px 8px;box-sizing:border-box;border-radius:3px}.sp-dropdown__item[data-v-77df3baf]:hover{background:#eef3f9}.sp-dropdown__item--active[data-v-77df3baf]{background:#e5f1fb;color:#0078d7}.color-picker[data-v-f8fac424]{position:relative;display:inline-flex;height:26px}.color-picker__menu[data-v-f8fac424]{position:fixed;z-index:9999;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;padding:6px;box-shadow:0 4px 12px #0000001f;-webkit-user-select:none;user-select:none;transform-origin:top right}.menu-pop-enter-active[data-v-f8fac424],.menu-pop-leave-active[data-v-f8fac424]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-f8fac424],.menu-pop-leave-to[data-v-f8fac424]{opacity:0;transform:scale(.9)}.color-picker__row[data-v-f8fac424]{display:flex;gap:4px;margin-bottom:4px}.color-picker__row[data-v-f8fac424]:last-child{margin-bottom:0}.color-picker__swatch[data-v-f8fac424]{width:20px;height:20px;padding:0;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:transform .08s,box-shadow .08s;position:relative}.color-picker__swatch[data-v-f8fac424]:hover{transform:scale(1.18);box-shadow:0 0 0 1px #0003;z-index:1}.color-picker__swatch--selected[data-v-f8fac424]{box-shadow:0 0 0 2px #0078d7}.border-picker[data-v-f362abdb]{position:relative;display:inline-flex;height:26px}.border-picker__menu[data-v-f362abdb]{position:fixed;z-index:9999;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;box-shadow:0 4px 12px #0000001f;-webkit-user-select:none;user-select:none;padding:4px;transform-origin:top right}.border-picker__item[data-v-f362abdb]{display:flex;align-items:center;gap:6px;width:100%;padding:4px 8px;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #444);cursor:pointer;border-radius:3px;font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;white-space:nowrap}.border-picker__item[data-v-f362abdb]:hover{background:#eef3f9}.border-picker__icon[data-v-f362abdb]{width:18px;height:18px;flex-shrink:0}.border-picker__label[data-v-f362abdb]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-f362abdb],.menu-pop-leave-active[data-v-f362abdb]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-f362abdb],.menu-pop-leave-to[data-v-f362abdb]{opacity:0;transform:scale(.9)}.merge-picker[data-v-67c0f9e3]{position:relative;display:inline-flex;height:26px}.merge-picker__menu[data-v-67c0f9e3]{position:fixed;z-index:9999;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;box-shadow:0 4px 12px #0000001f;-webkit-user-select:none;user-select:none;padding:4px;transform-origin:top right}.merge-picker__item[data-v-67c0f9e3]{display:flex;align-items:center;gap:6px;width:100%;padding:4px 8px;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #444);cursor:pointer;border-radius:3px;font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;white-space:nowrap}.merge-picker__item[data-v-67c0f9e3]:hover{background:#eef3f9}.merge-picker__icon[data-v-67c0f9e3]{width:18px;height:18px;flex-shrink:0;display:flex;align-items:center;justify-content:center}.merge-picker__icon[data-v-67c0f9e3] svg{width:18px;height:18px}.merge-picker__label[data-v-67c0f9e3]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-67c0f9e3],.menu-pop-leave-active[data-v-67c0f9e3]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-67c0f9e3],.menu-pop-leave-to[data-v-67c0f9e3]{opacity:0;transform:scale(.9)}.calc-picker[data-v-08615aee]{position:relative;display:inline-flex;height:26px}.calc-picker__menu[data-v-08615aee]{position:fixed;z-index:9999;min-width:120px;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;box-shadow:0 4px 12px #0000001f;-webkit-user-select:none;user-select:none;padding:4px;transform-origin:top right}.calc-picker__item[data-v-08615aee]{display:flex;align-items:center;gap:6px;width:100%;padding:4px 8px;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #444);cursor:pointer;border-radius:3px;font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;white-space:nowrap}.calc-picker__item[data-v-08615aee]:hover:not(.calc-picker__item--disabled){background:#eef3f9}.calc-picker__item--disabled[data-v-08615aee]{color:var(--sp-toolbar-btn-disabled-color, #bbb);cursor:default}.calc-picker__label[data-v-08615aee]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-08615aee],.menu-pop-leave-active[data-v-08615aee]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-08615aee],.menu-pop-leave-to[data-v-08615aee]{opacity:0;transform:scale(.9)}.toolbar[data-v-a33ba577]{position:relative;display:flex;align-items:center;height:32px;min-height:32px;gap:2px;padding:0 6px;background:var(--sp-toolbar-bg);border-bottom:1px solid var(--sp-toolbar-border);-webkit-user-select:none;user-select:none}.tb-item[data-v-a33ba577]{display:flex;align-items:center;flex:0 0 auto}.toolbar-sep[data-v-a33ba577]{width:1px;height:18px;margin:0 4px;background:var(--sp-toolbar-border)}.toolbar-font[data-v-a33ba577],.toolbar-number-format[data-v-a33ba577],.toolbar-align[data-v-a33ba577]{flex:0 0 auto}.toolbar-font-size[data-v-a33ba577]{display:inline-flex;align-items:center;gap:0;height:26px;position:relative}.toolbar-font-size__input[data-v-a33ba577]{width:36px;height:26px;border:1px solid transparent;border-right:none;border-radius:3px 0 0 3px;background:transparent;color:var(--sp-toolbar-btn-color);font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;text-align:left;padding:0 5px;outline:none;box-sizing:border-box;-webkit-appearance:none;appearance:none;-moz-appearance:textfield}.toolbar-font-size__input[data-v-a33ba577]::-webkit-outer-spin-button,.toolbar-font-size__input[data-v-a33ba577]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.toolbar-font-size__input[data-v-a33ba577]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__input[data-v-a33ba577]:focus{border-color:var(--sp-toolbar-border);background:#fff}.toolbar-font-size__btn[data-v-a33ba577]{display:flex;align-items:center;justify-content:center;width:16px;height:26px;border:1px solid transparent;border-left:none;border-radius:0 3px 3px 0;background:transparent;color:var(--sp-toolbar-btn-color);cursor:pointer;padding:0}.toolbar-font-size__btn[data-v-a33ba577]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__btn svg[data-v-a33ba577]{width:10px;height:10px}.toolbar-font-size__dropdown[data-v-a33ba577]{position:absolute;width:56px;height:26px;pointer-events:none}.toolbar-btn[data-v-a33ba577]{display:flex;align-items:center;justify-content:center;width:30px;height:26px;border:none;border-radius:3px;background:transparent;color:var(--sp-toolbar-btn-color);cursor:pointer;padding:0}.toolbar-btn[data-v-a33ba577]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-btn[data-v-a33ba577]:active:not(:disabled){opacity:.7}.toolbar-btn--active[data-v-a33ba577]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-btn--step[data-v-a33ba577]{width:26px;height:26px}.toolbar-btn--step svg[data-v-a33ba577]{width:16px;height:16px}.toolbar-btn[data-v-a33ba577]:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.toolbar-btn__icon[data-v-a33ba577]{width:18px;height:18px}.toolbar-btn svg[data-v-a33ba577]:not(.toolbar-btn__icon){width:18px;height:18px}.toolbar-split[data-v-a33ba577]{display:inline-flex;align-items:center;position:relative;height:26px}.toolbar-split__main[data-v-a33ba577]{border:1px solid transparent;border-right:none;border-radius:3px 0 0 3px}.toolbar-split__arrow[data-v-a33ba577]{display:flex;align-items:center;justify-content:center;width:16px;height:26px;border:1px solid transparent;border-radius:0 3px 3px 0;background:transparent;color:var(--sp-toolbar-btn-color);cursor:pointer;padding:0}.toolbar-split__arrow[data-v-a33ba577]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-split__arrow svg[data-v-a33ba577]{width:10px!important;height:10px!important}.toolbar-more[data-v-a33ba577]{display:flex;align-items:center;justify-content:center;width:30px;height:26px;border:none;border-radius:3px;background:transparent;color:var(--sp-toolbar-btn-color);cursor:pointer;padding:0;flex:0 0 auto;margin-left:auto}.toolbar-more[data-v-a33ba577]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-more--active[data-v-a33ba577]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-more svg[data-v-a33ba577]{width:18px;height:18px}.overflow-menu[data-v-a33ba577]{min-width:180px;max-width:260px;max-height:calc(100vh - 40px);overflow-y:auto;background:var(--sp-toolbar-bg, #fff);border:1px solid var(--sp-toolbar-border);border-radius:4px;box-shadow:0 4px 12px #0000001f;padding:4px 6px;display:flex;flex-direction:column;gap:2px;z-index:1000;transform-origin:top right}.overflow-menu.no-anim[data-v-a33ba577]{transition:none!important}.overflow-menu .tb-item[data-v-a33ba577]{width:100%}.overflow-menu .toolbar-sep[data-v-a33ba577]{width:100%;height:1px;margin:2px 0}.overflow-menu .toolbar-split[data-v-a33ba577]{width:100%}.overflow-menu .toolbar-split__main[data-v-a33ba577]{flex:1 1 auto;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-font-size[data-v-a33ba577]{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font[data-v-a33ba577],.overflow-menu .toolbar-number-format[data-v-a33ba577],.overflow-menu .toolbar-align[data-v-a33ba577]{width:100%}.overflow-menu .toolbar-btn[data-v-a33ba577]:not(.toolbar-btn--step):not(.toolbar-split__arrow){width:100%;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-color[data-v-a33ba577]{width:100%}.overflow-menu .toolbar-wrap[data-v-a33ba577]{width:100%;justify-content:flex-start}.menu-pop-enter-active[data-v-a33ba577],.menu-pop-leave-active[data-v-a33ba577]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-a33ba577],.menu-pop-leave-to[data-v-a33ba577]{opacity:0;transform:scale(.9)}.overflow-menu .tb-item{width:100%}.overflow-menu .toolbar-sep{width:100%;height:1px;margin:2px 0}.overflow-menu .toolbar-split{width:100%}.overflow-menu .toolbar-split__main{flex:1 1 auto;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-font-size{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font,.overflow-menu .toolbar-number-format,.overflow-menu .toolbar-align{width:100%}.overflow-menu .toolbar-btn:not(.toolbar-btn--step):not(.toolbar-split__arrow){width:100%;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-color{width:100%}.overflow-menu .toolbar-wrap{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font-size__input{flex:1 1 auto;width:auto;min-width:40px}.overflow-menu .toolbar-btn:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-btn:active:not(:disabled){opacity:.7}.overflow-menu .toolbar-btn--active{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.overflow-menu .toolbar-btn:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.overflow-menu .toolbar-split__main:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-split__arrow:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-font-size__input:hover{background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-font-size__input:focus{border-color:var(--sp-toolbar-border);background:#fff}.overflow-menu .toolbar-font-size__btn:hover,.overflow-menu .toolbar-more:hover{background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-more--active{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.tab-bar[data-v-454e1a12]{display:flex;align-items:stretch;height:30px;min-height:30px;background:var(--sp-tab-bar-bg);border-top:1px solid var(--sp-tab-bar-border);-webkit-user-select:none;user-select:none;margin-top:4px}.tab-list[data-v-454e1a12]{display:flex;align-items:flex-start;flex:1;overflow:hidden;gap:1px;padding:0 1px}.tab-item[data-v-454e1a12]{display:flex;align-items:center;height:28px;min-width:0;max-width:120px;padding:0 10px;cursor:pointer;border:1px solid var(--sp-tab-inactive-border);background:var(--sp-tab-inactive-bg);color:var(--sp-tab-inactive-color);font-size:14px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;white-space:nowrap;transition:background .1s}.tab-item[data-v-454e1a12]:hover{background:var(--sp-tab-hover-bg)}.tab-item--active[data-v-454e1a12]{height:28px;background:var(--sp-tab-active-bg);color:var(--sp-tab-active-color);border-color:var(--sp-tab-active-bg) var(--sp-tab-bar-border) var(--sp-tab-bar-border);border-top:2px solid var(--sp-tab-active-border);font-size:16px}.tab-item--active[data-v-454e1a12]:hover{background:var(--sp-tab-active-bg)}.tab-item__name[data-v-454e1a12]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tab-rename-input[data-v-454e1a12]{width:100%;height:18px;border:none;border-radius:0;outline:none;padding:0;font-size:16px;font-family:inherit;background:var(--sp-tab-active-bg);color:var(--sp-tab-active-color);box-sizing:border-box}.tab-bar__add-btn[data-v-454e1a12]{width:24px;min-width:24px;height:24px;margin:0 4px 3px 3px;border:none;background:transparent;color:var(--sp-tab-add-btn-color);font-size:16px;line-height:22px;text-align:center;cursor:pointer;padding:0}.tab-bar__add-btn[data-v-454e1a12]:hover{background:var(--sp-tab-add-btn-hover-bg)}.nf-dialog__mask[data-v-69cb36b7]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:30000;background:rgba(0,0,0,.25);display:flex;align-items:center;justify-content:center}.nf-dialog[data-v-69cb36b7]{width:380px;max-width:calc(100vw - 32px);max-height:calc(100vh - 48px);overflow-y:auto;background:#fff;border:1px solid #d0d0d0;border-radius:6px;box-shadow:0 8px 24px #0000002e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;color:#1a1a1a;-webkit-user-select:none;user-select:none}.nf-dialog__header[data-v-69cb36b7]{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid #ececec}.nf-dialog__title[data-v-69cb36b7]{font-size:13px;font-weight:600}.nf-dialog__close[data-v-69cb36b7]{display:flex;align-items:center;justify-content:center;width:22px;height:22px;border:none;background:transparent;color:#888;cursor:pointer;border-radius:3px;padding:0}.nf-dialog__close[data-v-69cb36b7]:hover{background:#f0f0f0;color:#444}.nf-dialog__close svg[data-v-69cb36b7]{width:14px;height:14px}.nf-dialog__body[data-v-69cb36b7]{padding:12px 14px;display:flex;flex-direction:column;gap:10px}.nf-field[data-v-69cb36b7]{display:flex;align-items:center;gap:8px}.nf-field--inline[data-v-69cb36b7]{min-height:26px}.nf-field__label[data-v-69cb36b7]{width:88px;min-width:88px;font-size:12px;color:#555}.nf-field__select[data-v-69cb36b7],.nf-field__input[data-v-69cb36b7]{flex:1;height:26px;border:1px solid #c0c0c0;border-radius:3px;background:#fff;font-size:12px;color:#1a1a1a;padding:0 6px;outline:none;box-sizing:border-box;font-family:inherit}.nf-field__select[data-v-69cb36b7]:focus,.nf-field__input[data-v-69cb36b7]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.nf-field__textarea[data-v-69cb36b7]{flex:1;min-height:44px;border:1px solid #c0c0c0;border-radius:3px;background:#fff;font-size:12px;color:#1a1a1a;padding:4px 6px;outline:none;box-sizing:border-box;resize:none;font-family:Consolas,Courier New,monospace}.nf-field__textarea[data-v-69cb36b7]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.nf-checkbox[data-v-69cb36b7]{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:#333;cursor:pointer}.nf-checkbox input[data-v-69cb36b7]{margin:0;cursor:pointer}.nf-dialog__footer[data-v-69cb36b7]{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 14px;border-top:1px solid #ececec}.nf-preview[data-v-69cb36b7]{display:flex;flex-direction:column;gap:2px;min-width:0}.nf-preview__label[data-v-69cb36b7]{font-size:11px;color:#888}.nf-preview__value[data-v-69cb36b7]{font-size:13px;color:#1a1a1a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:180px}.nf-dialog__actions[data-v-69cb36b7]{display:flex;gap:8px}.nf-btn[data-v-69cb36b7]{height:28px;padding:0 16px;border:1px solid #ccc;border-radius:3px;background:#fff;color:#333;font-size:12px;cursor:pointer;font-family:inherit}.nf-btn[data-v-69cb36b7]:hover{background:#f0f0f0}.nf-btn--primary[data-v-69cb36b7]{border-color:#0078d7;background:#0078d7;color:#fff}.nf-btn--primary[data-v-69cb36b7]:hover{background:#0069c0}.nf-dialog-enter-active[data-v-69cb36b7],.nf-dialog-leave-active[data-v-69cb36b7]{transition:opacity .14s ease-out}.nf-dialog-enter-from[data-v-69cb36b7],.nf-dialog-leave-to[data-v-69cb36b7]{opacity:0}.nf-dialog-enter-active .nf-dialog[data-v-69cb36b7],.nf-dialog-leave-active .nf-dialog[data-v-69cb36b7]{transition:transform .14s ease-out}.nf-dialog-enter-from .nf-dialog[data-v-69cb36b7],.nf-dialog-leave-to .nf-dialog[data-v-69cb36b7]{transform:scale(.96)}.spreadsheet-outer[data-v-6321c060]{flex:1;display:flex;flex-direction:column;overflow:hidden;height:100%;min-height:400px;width:100%}.formula-bar[data-v-6321c060]{display:flex;align-items:flex-start;min-height:36px;padding:0;gap:0}.formula-bar--expanded[data-v-6321c060]{min-height:72px}.formula-bar__cell-label[data-v-6321c060]{width:48px;min-width:48px;height:28px;line-height:28px;margin-top:4px;text-align:center;font-size:12px;font-weight:600;color:var(--sp-formula-bar-label-color);background:var(--sp-formula-bar-label-bg);border:1px solid var(--sp-formula-bar-label-border);border-radius:2px;-webkit-user-select:none;user-select:none}.formula-bar__buttons[data-v-6321c060]{display:inline-flex;align-items:stretch;margin-top:4px;margin-left:6px;height:28px;border:1px solid var(--sp-formula-bar-input-border);border-radius:2px;overflow:hidden;background:var(--sp-formula-bar-input-bg)}.formula-bar__btn[data-v-6321c060]{width:22px;height:28px;border:none;border-radius:0;background:transparent;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0;-webkit-user-select:none;user-select:none;color:inherit}.formula-bar__btn+.formula-bar__btn[data-v-6321c060]{border-left:1px solid var(--sp-formula-bar-input-border)}.formula-bar__btn[data-v-6321c060]:hover{background:var(--sp-scroll-btn-hover-bg, #f0f0f0)}.formula-bar__btn--cancel[data-v-6321c060]:hover{color:#e53935;background:#fdecea}.formula-bar__btn--accept[data-v-6321c060]:hover{color:#2e7d32;background:#e8f5e9}.formula-bar__input[data-v-6321c060]{flex:1;min-height:28px;height:28px;line-height:20px;margin-top:4px;border:1px solid var(--sp-formula-bar-input-border);border-radius:2px;outline:none;padding:3px 6px;margin-left:4px;font-size:13px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;color:var(--sp-formula-bar-input-color);background:var(--sp-formula-bar-input-bg);resize:none;overflow:hidden;box-sizing:border-box}.formula-bar__input--expanded[data-v-6321c060]{height:68px;overflow:auto}.formula-bar__input[data-v-6321c060]:focus{border-color:var(--sp-formula-bar-input-focus-border);box-shadow:0 0 0 1px var(--sp-formula-bar-input-focus-shadow)}.formula-bar__toggle[data-v-6321c060]{width:22px;min-width:22px;height:28px;margin-top:4px;margin-left:2px;margin-right:2px;border:1px solid var(--sp-formula-bar-input-border);border-radius:2px;background:var(--sp-formula-bar-input-bg);color:var(--sp-formula-bar-input-color);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0;-webkit-user-select:none;user-select:none}.formula-bar__toggle[data-v-6321c060]:hover{background:var(--sp-scroll-btn-hover-bg, #e8e8e8)}.spreadsheet-wrapper[data-v-6321c060]{flex:1;position:relative;overflow:hidden;background:var(--sp-wrapper-bg)}.grid-canvas[data-v-6321c060]{position:absolute;top:0;left:0;display:block;outline:none;cursor:cell}.grid-canvas[data-v-6321c060]:focus{outline:none}.v-scrollbar[data-v-6321c060]{position:absolute;right:0;top:0;width:11px;height:calc(100% - 11px);display:flex;flex-direction:column;background:var(--sp-wrapper-bg)}.h-scrollbar[data-v-6321c060]{position:absolute;left:0;bottom:0;height:11px;width:calc(100% - 11px);display:flex;background:var(--sp-wrapper-bg)}.sb-corner[data-v-6321c060]{position:absolute;right:0;bottom:0;width:11px;height:11px;background:var(--sp-wrapper-bg)}.sb-btn[data-v-6321c060]{width:11px;height:11px;min-width:11px;min-height:11px;border:none;background:var(--sp-scroll-btn-bg, #e8e8e8);display:flex;align-items:center;justify-content:center;cursor:pointer;padding:0;-webkit-user-select:none;user-select:none}.sb-btn[data-v-6321c060]:hover{background:var(--sp-scroll-btn-hover-bg, #d0d0d0)}.sb-btn[data-v-6321c060]:active{background:var(--sp-scroll-btn-active-bg, #c0c0c0)}.sb-arrow[data-v-6321c060]{display:block;width:0;height:0}.sb-arrow--up[data-v-6321c060]{border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:4px solid var(--sp-scroll-btn-color, #666)}.sb-arrow--down[data-v-6321c060]{border-left:3px solid transparent;border-right:3px solid transparent;border-top:4px solid var(--sp-scroll-btn-color, #666)}.sb-arrow--left[data-v-6321c060]{border-top:3px solid transparent;border-bottom:3px solid transparent;border-right:4px solid var(--sp-scroll-btn-color, #666)}.sb-arrow--right[data-v-6321c060]{border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:4px solid var(--sp-scroll-btn-color, #666)}.sb-track[data-v-6321c060]{flex:1;position:relative;background:var(--sp-scroll-track-bg, rgba(0,0,0,.06))}.sb-track--v[data-v-6321c060]{width:11px}.sb-track--h[data-v-6321c060]{height:11px}.sb-thumb[data-v-6321c060]{position:absolute;border-radius:3px;background:var(--sp-scroll-thumb);cursor:default}.sb-thumb[data-v-6321c060]:hover{background:var(--sp-scroll-thumb-hover)}.sb-thumb--v[data-v-6321c060]{left:1px;right:1px;min-height:16px}.sb-thumb--h[data-v-6321c060]{top:1px;bottom:1px;min-width:16px}.cell-editor[data-v-6321c060]{position:absolute;border:2px solid var(--sp-cell-editor-border);outline:none;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;font-size:13px;color:var(--sp-cell-editor-color);background:var(--sp-cell-editor-bg);box-shadow:0 0 0 1px var(--sp-cell-editor-shadow);z-index:10;box-sizing:border-box;min-width:0;overflow:hidden;padding:0;margin:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;resize:none;white-space:pre-wrap;word-break:break-all}.context-menu{position:fixed;z-index:10000;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;padding:4px 0;min-width:120px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;font-size:13px;transform-origin:top left}.context-menu__item{padding:6px 20px;cursor:pointer;color:#333;white-space:nowrap;position:relative;display:flex;align-items:center;justify-content:space-between}.context-menu__item:hover{background:#e8f0fe}.context-menu__item--disabled{color:#bbb;cursor:default}.context-menu__item--disabled:hover{background:transparent}.context-menu__arrow{margin-left:16px;margin-right:-5px;width:0;height:0;border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:4px solid #888}.context-submenu{display:none;position:absolute;left:100%;top:-4px;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;padding:4px 0;min-width:100px;z-index:10001}.context-submenu--left{left:auto;right:100%}.context-menu__item:hover>.context-submenu{display:block}.context-submenu .context-menu__item{justify-content:flex-start}.menu-pop-enter-active,.menu-pop-leave-active{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from,.menu-pop-leave-to{opacity:0;transform:scale(.9)}.dim-panel{position:fixed;z-index:10002;width:220px;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;padding:10px 12px;box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;-webkit-user-select:none;user-select:none;transform-origin:top left}.dim-panel__title{font-size:13px;font-weight:600;color:#333;margin-bottom:8px}.dim-panel__body{display:flex;align-items:center;gap:6px}.dim-panel__input{flex:1;height:26px;border:1px solid #c0c0c0;border-radius:3px;outline:none;padding:0 6px;font-size:13px;color:#1a1a1a;background:#fff;box-sizing:border-box}.dim-panel__input:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.dim-panel__input--error{border-color:#d93025;box-shadow:0 0 0 1px #d930254d}.dim-panel__unit{font-size:12px;color:#888}.dim-panel__error{margin-top:6px;font-size:12px;color:#d93025;line-height:1.4}.dim-panel__footer{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}.dim-panel__btn{height:26px;padding:0 14px;border:1px solid #ccc;border-radius:3px;background:#fff;color:#333;font-size:13px;cursor:pointer}.dim-panel__btn:hover{background:#f0f0f0}.dim-panel__btn--primary{border-color:#0078d7;background:#0078d7;color:#fff}.dim-panel__btn--primary:hover{background:#0069c0}
|
|
@@ -10,6 +10,8 @@ type __VLS_Props = {
|
|
|
10
10
|
hideTrigger?: boolean;
|
|
11
11
|
align?: 'left' | 'right';
|
|
12
12
|
triggerEl?: HTMLElement | null;
|
|
13
|
+
/** 当前值未命中任何选项时触发器显示的占位文本(如选区格式不一致时的「混合」) */
|
|
14
|
+
fallbackLabel?: string;
|
|
13
15
|
};
|
|
14
16
|
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
15
17
|
"update:modelValue": (v: string | number) => void;
|
|
@@ -28,6 +30,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
|
|
|
28
30
|
hideTrigger: boolean;
|
|
29
31
|
align: "left" | "right";
|
|
30
32
|
triggerEl: HTMLElement | null;
|
|
33
|
+
fallbackLabel: string;
|
|
31
34
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
|
|
32
35
|
rootRef: HTMLDivElement;
|
|
33
36
|
menuRef: HTMLDivElement;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type CalcType = 'sum' | 'avg';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
modelOpen?: boolean;
|
|
4
|
+
locale?: string;
|
|
5
|
+
triggerEl?: HTMLElement | null;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
};
|
|
8
|
+
declare function openMenu(): void;
|
|
9
|
+
declare function close(): void;
|
|
10
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {
|
|
11
|
+
open: import("vue").Ref<boolean, boolean>;
|
|
12
|
+
openMenu: typeof openMenu;
|
|
13
|
+
close: typeof close;
|
|
14
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
15
|
+
change: (v: CalcType) => any;
|
|
16
|
+
"update:modelOpen": (v: boolean) => any;
|
|
17
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
18
|
+
onChange?: ((v: CalcType) => any) | undefined;
|
|
19
|
+
"onUpdate:modelOpen"?: ((v: boolean) => any) | undefined;
|
|
20
|
+
}>, {
|
|
21
|
+
modelOpen: boolean;
|
|
22
|
+
triggerEl: HTMLElement | null;
|
|
23
|
+
disabled: boolean;
|
|
24
|
+
locale: string;
|
|
25
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
|
|
26
|
+
rootRef: HTMLDivElement;
|
|
27
|
+
menuRef: HTMLDivElement;
|
|
28
|
+
}, HTMLDivElement>;
|
|
29
|
+
export default _default;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
modelOpen?: boolean;
|
|
3
|
+
locale?: string;
|
|
4
|
+
/** 当前选区格式(混合时由父组件传入空串,从常规开始) */
|
|
5
|
+
currentFormat?: string;
|
|
6
|
+
/** 预览样例值(默认 1234.5) */
|
|
7
|
+
sampleValue?: string;
|
|
8
|
+
};
|
|
9
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
10
|
+
"update:modelOpen": (v: boolean) => any;
|
|
11
|
+
apply: (formatCode: string) => any;
|
|
12
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
13
|
+
"onUpdate:modelOpen"?: ((v: boolean) => any) | undefined;
|
|
14
|
+
onApply?: ((formatCode: string) => any) | undefined;
|
|
15
|
+
}>, {
|
|
16
|
+
modelOpen: boolean;
|
|
17
|
+
locale: string;
|
|
18
|
+
currentFormat: string;
|
|
19
|
+
sampleValue: string;
|
|
20
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
|
|
21
|
+
customCodeRef: HTMLTextAreaElement;
|
|
22
|
+
}, any>;
|
|
23
|
+
export default _default;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { FontOption, MergeType } from '../core/constants';
|
|
2
|
+
import { type NFOption } from '../core/number-format';
|
|
2
3
|
import { type BorderType } from './pickers/borderPicker.vue';
|
|
3
4
|
type __VLS_Props = {
|
|
4
5
|
locale: string;
|
|
@@ -30,7 +31,11 @@ type __VLS_Props = {
|
|
|
30
31
|
hAlignOptions: FontOption[];
|
|
31
32
|
vAlignOptions: FontOption[];
|
|
32
33
|
mergeMenuOpen: boolean;
|
|
34
|
+
calcMenuOpen: boolean;
|
|
35
|
+
isSingleCell: boolean;
|
|
33
36
|
themeVars?: Record<string, string>;
|
|
37
|
+
selNumberFormat: string;
|
|
38
|
+
nfOptions: NFOption[];
|
|
34
39
|
};
|
|
35
40
|
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
36
41
|
undo: () => void;
|
|
@@ -50,6 +55,8 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
|
|
|
50
55
|
"apply-border": () => void;
|
|
51
56
|
"wrap-toggle": () => void;
|
|
52
57
|
"apply-merge": () => void;
|
|
58
|
+
"calc-sum": () => void;
|
|
59
|
+
"calc-avg": () => void;
|
|
53
60
|
"font-family-change": (v: string | number) => void;
|
|
54
61
|
"font-size-change": (v: string | number) => void;
|
|
55
62
|
"h-align-change": (v: string | number) => void;
|
|
@@ -57,12 +64,14 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
|
|
|
57
64
|
"font-size-input": (v: string) => void;
|
|
58
65
|
"text-color-change": (v: string) => void;
|
|
59
66
|
"fill-color-change": (v: string) => void;
|
|
67
|
+
"number-format-change": (v: string) => void;
|
|
60
68
|
"font-size-keydown": (ev: KeyboardEvent) => void;
|
|
61
69
|
"update:font-size-menu-open": (v: boolean) => void;
|
|
62
70
|
"update:text-color-menu-open": (v: boolean) => void;
|
|
63
71
|
"update:fill-color-menu-open": (v: boolean) => void;
|
|
64
72
|
"update:border-menu-open": (v: boolean) => void;
|
|
65
73
|
"update:merge-menu-open": (v: boolean) => void;
|
|
74
|
+
"update:calc-menu-open": (v: boolean) => void;
|
|
66
75
|
"border-change": (v: BorderType) => void;
|
|
67
76
|
"merge-change": (v: MergeType) => void;
|
|
68
77
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
@@ -83,6 +92,8 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
|
|
|
83
92
|
"onApply-border"?: (() => any) | undefined;
|
|
84
93
|
"onWrap-toggle"?: (() => any) | undefined;
|
|
85
94
|
"onApply-merge"?: (() => any) | undefined;
|
|
95
|
+
"onCalc-sum"?: (() => any) | undefined;
|
|
96
|
+
"onCalc-avg"?: (() => any) | undefined;
|
|
86
97
|
"onFont-family-change"?: ((v: string | number) => any) | undefined;
|
|
87
98
|
"onFont-size-change"?: ((v: string | number) => any) | undefined;
|
|
88
99
|
"onH-align-change"?: ((v: string | number) => any) | undefined;
|
|
@@ -90,12 +101,14 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
|
|
|
90
101
|
"onFont-size-input"?: ((v: string) => any) | undefined;
|
|
91
102
|
"onText-color-change"?: ((v: string) => any) | undefined;
|
|
92
103
|
"onFill-color-change"?: ((v: string) => any) | undefined;
|
|
104
|
+
"onNumber-format-change"?: ((v: string) => any) | undefined;
|
|
93
105
|
"onFont-size-keydown"?: ((ev: KeyboardEvent) => any) | undefined;
|
|
94
106
|
"onUpdate:font-size-menu-open"?: ((v: boolean) => any) | undefined;
|
|
95
107
|
"onUpdate:text-color-menu-open"?: ((v: boolean) => any) | undefined;
|
|
96
108
|
"onUpdate:fill-color-menu-open"?: ((v: boolean) => any) | undefined;
|
|
97
109
|
"onUpdate:border-menu-open"?: ((v: boolean) => any) | undefined;
|
|
98
110
|
"onUpdate:merge-menu-open"?: ((v: boolean) => any) | undefined;
|
|
111
|
+
"onUpdate:calc-menu-open"?: ((v: boolean) => any) | undefined;
|
|
99
112
|
"onBorder-change"?: ((v: BorderType) => any) | undefined;
|
|
100
113
|
"onMerge-change"?: ((v: MergeType) => any) | undefined;
|
|
101
114
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
|
|
@@ -105,6 +118,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
|
|
|
105
118
|
fillColorArrowRef: HTMLButtonElement;
|
|
106
119
|
borderArrowRef: HTMLButtonElement;
|
|
107
120
|
mergeArrowRef: HTMLButtonElement;
|
|
121
|
+
calcArrowRef: HTMLButtonElement;
|
|
108
122
|
moreBtnEl: HTMLButtonElement;
|
|
109
123
|
overflowMenuEl: HTMLDivElement;
|
|
110
124
|
}, any>;
|
|
@@ -44,5 +44,10 @@ export interface BordersMergeState {
|
|
|
44
44
|
cutSelected: () => void;
|
|
45
45
|
clearSelected: () => void;
|
|
46
46
|
sumSelected: () => void;
|
|
47
|
+
avgSelected: () => void;
|
|
48
|
+
calcMenuOpen: Ref<boolean>;
|
|
49
|
+
onCalcMenuToggle: (v: boolean) => void;
|
|
50
|
+
onCalcSum: () => void;
|
|
51
|
+
onCalcAvg: () => void;
|
|
47
52
|
}
|
|
48
53
|
export declare function createBordersMerge(s: CoreState, us: UndoStylesState): BordersMergeState;
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { type ComputedRef, type Ref } from 'vue';
|
|
2
2
|
import { FormulaDeps } from '../core/formula';
|
|
3
3
|
import type { CellCoord, CellData, SelectionRange } from '../core/types';
|
|
4
|
+
/** 选区触发方式,影响「合并单元格是否扩大选区」。
|
|
5
|
+
* - 'cell':单元格点击/拖动(默认)→ 保持现有 expandSelectionForMerges 行为
|
|
6
|
+
* - 'row' :行头点击/拖动 → Excel 风格「穿透」合并,选区矩形保持用户点击的行范围
|
|
7
|
+
* - 'col' :列头点击/拖动 → 同上,选区矩形保持用户点击的列范围
|
|
8
|
+
* - 'all' :左上角全选按钮 → expandSelectionForMerges 行为
|
|
9
|
+
*/
|
|
10
|
+
export type SelectionMode = 'cell' | 'row' | 'col' | 'all';
|
|
4
11
|
export interface CoreState {
|
|
5
12
|
props: {
|
|
6
13
|
rowCount: number;
|
|
@@ -47,9 +54,12 @@ export interface CoreState {
|
|
|
47
54
|
totalWidth: ComputedRef<number>;
|
|
48
55
|
totalHeight: ComputedRef<number>;
|
|
49
56
|
selectCell: (c: number, r: number) => void;
|
|
50
|
-
selectRange: (sC: number, sR: number, eC: number, eR: number) => void;
|
|
57
|
+
selectRange: (sC: number, sR: number, eC: number, eR: number, mode?: SelectionMode) => void;
|
|
51
58
|
selectAll: () => void;
|
|
52
59
|
isSelected: (c: number, r: number) => boolean;
|
|
60
|
+
/** 渲染高亮专用:整行/整列选择模式下「穿透」合并单元格,仅判断 (c,r) 自身是否在选区矩形内 */
|
|
61
|
+
isCellSelected: (c: number, r: number) => boolean;
|
|
62
|
+
selectionMode: Ref<SelectionMode>;
|
|
53
63
|
cellKey: (c: number, r: number) => string;
|
|
54
64
|
delCell: (k: string) => void;
|
|
55
65
|
findMerge: (c: number, r: number) => {
|
|
@@ -9,10 +9,14 @@ export interface InteractionsState {
|
|
|
9
9
|
render: () => void;
|
|
10
10
|
activeCellLabel: ComputedRef<string>;
|
|
11
11
|
formulaBarDisplay: ComputedRef<string>;
|
|
12
|
+
formulaBarDraft: Ref<string>;
|
|
13
|
+
formulaBarExpanded: Ref<boolean>;
|
|
12
14
|
onFormulaBarFocus: () => void;
|
|
13
15
|
onFormulaBarInput: (e: Event) => void;
|
|
14
16
|
onFormulaBarKeydown: (e: KeyboardEvent) => void;
|
|
15
17
|
onFormulaBarBlur: () => void;
|
|
18
|
+
acceptFormulaBarEdit: () => void;
|
|
19
|
+
cancelFormulaBarEdit: () => void;
|
|
16
20
|
renTab: Ref<number | null>;
|
|
17
21
|
renTabVal: Ref<string>;
|
|
18
22
|
onTabClick: (i: number) => void;
|
|
@@ -27,7 +27,7 @@ export interface SheetsOpsState {
|
|
|
27
27
|
wrapperRef: Ref<HTMLDivElement | null>;
|
|
28
28
|
canvasRef: Ref<HTMLCanvasElement | null>;
|
|
29
29
|
editInputRef: Ref<HTMLTextAreaElement | null>;
|
|
30
|
-
formulaBarRef: Ref<
|
|
30
|
+
formulaBarRef: Ref<HTMLTextAreaElement | null>;
|
|
31
31
|
viewSize: {
|
|
32
32
|
w: number;
|
|
33
33
|
h: number;
|
|
@@ -42,4 +42,6 @@ export interface SheetsOpsState {
|
|
|
42
42
|
resetColWidth: () => void;
|
|
43
43
|
modelData: Ref<SheetModelData[]>;
|
|
44
44
|
}
|
|
45
|
-
export declare function createSheetsOps(s: CoreState, us: UndoStylesState, rawModelData: Ref<SheetModelData[]>, _applySizeCallback?: () => void
|
|
45
|
+
export declare function createSheetsOps(s: CoreState, us: UndoStylesState, rawModelData: Ref<SheetModelData[]>, _applySizeCallback?: () => void, lastEmittedDataRef?: {
|
|
46
|
+
value: string;
|
|
47
|
+
}): SheetsOpsState;
|
|
@@ -2,6 +2,7 @@ import { type ComputedRef, type Ref } from 'vue';
|
|
|
2
2
|
import type { FontOption } from '../core/constants';
|
|
3
3
|
import type { CoreState } from './core-state';
|
|
4
4
|
import type { CellData, SheetState } from '../core/types';
|
|
5
|
+
import { type NFOption } from '../core/number-format';
|
|
5
6
|
export interface UndoStylesState {
|
|
6
7
|
undoStack: Ref<UndoSnap[]>;
|
|
7
8
|
redoStack: Ref<UndoSnap[]>;
|
|
@@ -67,6 +68,13 @@ export interface UndoStylesState {
|
|
|
67
68
|
selFillColor: ComputedRef<string>;
|
|
68
69
|
borderMenuOpen?: Ref<boolean>;
|
|
69
70
|
mergeMenuOpen?: Ref<boolean>;
|
|
71
|
+
nfOptions: ComputedRef<NFOption[]>;
|
|
72
|
+
selNumberFormat: ComputedRef<string>;
|
|
73
|
+
NF_NUMBER_FORMAT_MIXED: string;
|
|
74
|
+
nfDialogOpen: Ref<boolean>;
|
|
75
|
+
onNumberFormatChange: (v: string) => void;
|
|
76
|
+
openNumberFormatDialog: () => void;
|
|
77
|
+
applyNumberFormatCode: (code: string) => void;
|
|
70
78
|
}
|
|
71
79
|
interface UndoSnap {
|
|
72
80
|
sheets: SheetState[];
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export declare const NF_CUSTOM = "__nf_custom__";
|
|
2
|
+
export declare const NF_MIXED = "\u0001";
|
|
3
|
+
export declare const NF_GENERAL = "";
|
|
4
|
+
export declare const NF_TEXT = "@";
|
|
5
|
+
/**
|
|
6
|
+
* formatNumber 的特殊返回值:表示"当前格式+数值组合在 Excel 语义下非法",
|
|
7
|
+
* 例如 date 格式 序列号<0/≥2958466、duration 格式 序列号<0。
|
|
8
|
+
* 渲染端必须把该字符串按列宽替换为连续 '#' 填充(不显示此标识符本身)。
|
|
9
|
+
*/
|
|
10
|
+
export declare const NF_INVALID_VALUE = "__NF_INVALID__";
|
|
11
|
+
/** Excel 1900 日期系统最大合法序列号(对应 9999-12-31)。超过或为负 → 整格 ###。 */
|
|
12
|
+
export declare const EXCEL_DATE_MAX_SERIAL = 2958465;
|
|
13
|
+
/** Excel 1900 日期系统最小合法序列号(0 = 1900-01-00,作为下界兜底,实际 UI 一般从 1 开始)。 */
|
|
14
|
+
export declare const EXCEL_DATE_MIN_SERIAL = 0;
|
|
15
|
+
/** 判断格式代码是否为 General(含空串、undefined、'General'、'GENERAL' 等) */
|
|
16
|
+
export declare function isGeneralFormat(format: string | undefined | null): boolean;
|
|
17
|
+
export type NFKind = 'general' | 'text' | 'number' | 'date' | 'duration';
|
|
18
|
+
export interface NFSection {
|
|
19
|
+
/** 是否含有数字占位符(0/#/?);无占位符的区段视为纯文本字面量 */
|
|
20
|
+
hasDigits: boolean;
|
|
21
|
+
/** 小数最大位数(0/#/? 的总数) */
|
|
22
|
+
decimals: number;
|
|
23
|
+
/** 强制小数位数(0 的个数,决定尾随 0 的数量) */
|
|
24
|
+
minDecimals: number;
|
|
25
|
+
/** 整数部分强制最少位数(0 的个数) */
|
|
26
|
+
minIntDigits: number;
|
|
27
|
+
/** 是否使用千位分隔符 */
|
|
28
|
+
thousands: boolean;
|
|
29
|
+
/** 缩放倍数(百分比为 100) */
|
|
30
|
+
scale: number;
|
|
31
|
+
/** 科学计数法 */
|
|
32
|
+
scientific: boolean;
|
|
33
|
+
/** 数字前的字面量(货币符号等) */
|
|
34
|
+
prefix: string;
|
|
35
|
+
/** 数字后的字面量(如 %) */
|
|
36
|
+
suffix: string;
|
|
37
|
+
/** 区段颜色([Red] 等,渲染层可忽略) */
|
|
38
|
+
color?: string;
|
|
39
|
+
}
|
|
40
|
+
export type NFDateTokenType = 'literal' | 'year' | 'month' | 'monthName' | 'day' | 'weekday' | 'hour' | 'minute' | 'second' | 'ampm';
|
|
41
|
+
export interface NFToken {
|
|
42
|
+
type: NFDateTokenType;
|
|
43
|
+
/** literal 类型的原始文本 */
|
|
44
|
+
text?: string;
|
|
45
|
+
/** 占位符长度(如 yyyy → 4) */
|
|
46
|
+
len: number;
|
|
47
|
+
}
|
|
48
|
+
export interface NFParsed {
|
|
49
|
+
kind: NFKind;
|
|
50
|
+
/** 数值区段(number 类型使用;可能含正/负/零/文本多个区段) */
|
|
51
|
+
sections: NFSection[];
|
|
52
|
+
/** 日期/时间/持续时间的 token 序列 */
|
|
53
|
+
tokens: NFToken[];
|
|
54
|
+
/** 是否为持续时间(含 [h]/[mm]/[ss]) */
|
|
55
|
+
isDuration: boolean;
|
|
56
|
+
raw: string;
|
|
57
|
+
}
|
|
58
|
+
export interface NFOption {
|
|
59
|
+
label: string;
|
|
60
|
+
value: string;
|
|
61
|
+
}
|
|
62
|
+
export declare function parseNumberFormat(format: string): NFParsed;
|
|
63
|
+
/** 清空解析缓存(主要用于测试/资源释放) */
|
|
64
|
+
export declare function clearNumberFormatCache(): void;
|
|
65
|
+
/**
|
|
66
|
+
* 将单元格原始字符串值按格式代码格式化为显示文本。
|
|
67
|
+
* 绝不修改传入的 value。
|
|
68
|
+
*/
|
|
69
|
+
export declare function formatNumber(value: string, format: string | undefined | null, locale: string): string;
|
|
70
|
+
export type NFDialogCategory = 'general' | 'number' | 'currency' | 'currencyRounded' | 'accounting' | 'financial' | 'percent' | 'scientific' | 'date' | 'time' | 'dateTime' | 'duration' | 'text' | 'custom';
|
|
71
|
+
export declare const NF_DIALOG_CATEGORIES: NFDialogCategory[];
|
|
72
|
+
/**
|
|
73
|
+
* 判断单元格在「未指定水平对齐」时,是否应该按「数值」默认右对齐显示。
|
|
74
|
+
* 规则(与 Excel 对齐语义保持一致,仅用于显示,不写入存储):
|
|
75
|
+
* 1. 格式代码为 '@'(文本)→ 否,保持左对齐
|
|
76
|
+
* 2. 常规格式(含空串 / undefined / 'General'):对原始 value 做 Number() 解析,
|
|
77
|
+
* 能解析为有限数字且非空字符串 → 视为数值 → 右对齐
|
|
78
|
+
* 3. 显式设置为数值类格式(number/currency/currencyRounded/accounting/financial/
|
|
79
|
+
* percent/scientific 以及 custom 中分类属于数值 kind 并含数字占位符)→ 右对齐
|
|
80
|
+
* 4. 日期、时间、日期时间、持续时间 → 不算数值(按 Excel 默认左对齐或居中,这里保持左对齐默认)
|
|
81
|
+
* 5. 其他 custom 中无法判断的 → 回退左对齐
|
|
82
|
+
*/
|
|
83
|
+
export declare function shouldAlignRightByDefault(value: string, format: string | undefined | null): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* 当前格式在列宽不足时,是否按 Excel 规则替换为连续 '#' 填充:
|
|
86
|
+
* - General / 文本 '@' / 未设置 → 不会(General 自动科学计数或允许裁切;文本就是原样裁切)
|
|
87
|
+
* - date / duration 类格式 → 是
|
|
88
|
+
* - number 类格式且含有数字占位符 → 是
|
|
89
|
+
* - 纯文本区段的自定义 number(如"前缀"无 0/#/?)→ 按纯文本,不需要 #
|
|
90
|
+
*/
|
|
91
|
+
export declare function isFormatOverflowsToHashes(format: string | undefined | null): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* 对给定 (value, format) 快速判断是否是 Excel 语义下的"非法值"(需要渲染为 # 填充)。
|
|
94
|
+
* 主要用于渲染端直接复用,避免再次 parseNumberFormat。
|
|
95
|
+
*/
|
|
96
|
+
export declare function isInvalidDisplayValue(value: string, format: string | undefined | null): boolean;
|
|
97
|
+
/** 根据分类 + 小数位数 + 千位分隔符生成格式代码 */
|
|
98
|
+
export declare function buildNumberFormatCode(locale: string, category: NFDialogCategory, decimals: number, thousands: boolean): string;
|
|
99
|
+
/** 构造工具栏下拉框的选项(含「格式…」自定义项) */
|
|
100
|
+
export declare function buildNumberFormatPresets(locale: string): NFOption[];
|