xiaodao-spreader 0.1.26 → 0.1.28

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # 小刀电子表格 (Xiaodao Spreader)
2
2
 
3
- **中文** | [English](./README.md)
3
+ **中文** | [English](./README.md) | [演示](https://spreader.xdz.me)
4
4
 
5
5
  [![Downloads](https://img.shields.io/npm/d18m/xiaodao-spreader)](https://www.npmjs.com/package/xiaodao-spreader)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
@@ -18,10 +18,12 @@
18
18
 
19
19
  ### 核心电子表格
20
20
 
21
- - **Canvas 2D 渲染** — 高 DPI 自适应(DPR 缩放),虚拟视口渲染,支持 200 行 × 26 列
21
+ - **动态表格扩展** — Excel 风格动态行列扩展;默认 26 列(A-Z)× 200 行,当滚动接近边界、在边缘输入数据、粘贴超出当前范围、或插入行列会将数据挤出边界时,自动扩展行列数
22
+ - **Canvas 2D 渲染** — 高 DPI 自适应(DPR 缩放),虚拟视口渲染,支持动态大小的工作表
22
23
  - **多 Sheet 工作簿** — 标签栏支持新建、重命名、复制、删除、拖拽排序
23
24
  - **公式引擎** — 支持 `=SUM()`、`=AVERAGE()`、`=COUNT()`、`=IF()`、`=VLOOKUP()`、`=CONCATENATE()`,支持依赖追踪与循环引用检测;工具栏与右键菜单提供一键求和/平均值/计数
24
25
  - **合并单元格** — 合并居中、跨列合并、取消合并;合并区域边框按锚点存储、公共边渲染时统一解析
26
+ - **冻结窗格** — 固定顶部行/左侧列,使其在主体滚动时保持可见。工具栏「冻结窗格」下拉提供「冻结窗格」(以当前选区/活动单元格左上角为冻结点,等同 Excel 的 Freeze Panes)、「冻结首行」、「冻结首列」以及「取消冻结」(仅在已冻结时显示,替换「冻结窗格」项)。冻结状态为按工作表的视图状态(`freeze: { rows, cols }`),通过 v-model 持久化;跨冻结线的合并单元格也能正确处理——仅冻结部分固定,非冻结部分随滚动移出
25
27
  - **丰富单元格格式** — 字体、字号(5–72)、加粗、斜体、下划线、删除线、文字颜色、填充颜色、水平/垂直对齐、自动换行
26
28
  - **边框** — 上/下/左/右/外边框/全部/无,5 种预设样式及自定义颜色;独立边框池存储、公共边渲染时统一解析
27
29
  - **撤销 / 重做** — 单元格、列宽、行高的完整状态快照(50 步)
@@ -130,8 +132,8 @@ const myData = ref<SheetModelData[]>([
130
132
  | 属性 | 类型 | 默认值 | 说明 |
131
133
  |------|------|--------|------|
132
134
  | `data` (v-model) | `SheetModelData[]` | `[]` | 多 Sheet 数据(双向绑定) |
133
- | `rowCount` | `number` | `200` | 每个 Sheet 的总行数 |
134
- | `colCount` | `number` | `26` | 每个 Sheet 的总列数 |
135
+ | `rowCount` | `number` | `200` | 每个 Sheet 的初始行数(可动态扩展) |
136
+ | `colCount` | `number` | `26` | 每个 Sheet 的初始列数(可动态扩展) |
135
137
  | `width` | `number \| string` | — | 组件宽度(像素;传 `string` 或省略则自适应) |
136
138
  | `height` | `number \| string` | — | 组件高度(像素;传 `string` 或省略则自适应) |
137
139
  | `theme` | `'light' \| 'dark'` | `'light'` | 主题模式 |
@@ -155,8 +157,13 @@ interface SheetModelData {
155
157
  styleId?: number;
156
158
  }>;
157
159
  merges?: Record<string, SelectionRange>;
160
+ freeze?: { rows: number; cols: number };
158
161
  colWidths?: Record<number, number>;
159
162
  rowHeights?: Record<number, number>;
163
+ /** 逻辑列数(0 基,不含)。省略时默认为 26。 */
164
+ colCount?: number;
165
+ /** 逻辑行数(0 基,不含)。省略时默认为 200。 */
166
+ rowCount?: number;
160
167
  }
161
168
  ```
162
169
 
@@ -164,6 +171,7 @@ interface SheetModelData {
164
171
  - **`borders`**:边框池 —— `borders[0]` 始终为默认空边框 `{}`。样式通过下标(`borderId`)引用边框;省略时由旧版内联边框属性自动迁移。
165
172
  - **`cells`**:键为 `"列,行"` 格式(如 `"0,0"` 代表 A1 单元格)。`styleId` 引用 `styles` 数组;`styleId=0` 或省略表示默认样式。
166
173
  - **`merges`**:合并单元格定义,以合并锚点单元格为键。
174
+ - **`freeze`**:冻结窗格的视图状态 —— `{ rows, cols }` 冻结顶部 `rows` 行与左侧 `cols` 列;`{ rows: 0, cols: 0 }` 表示无冻结。按工作表持久化,切换工作表时恢复。
167
175
  - **`colWidths` / `rowHeights`**:稀疏映射 — 仅存储非默认值。
168
176
 
169
177
  ### 类型导出
@@ -235,6 +243,8 @@ src/
235
243
 
236
244
  ### 设计原则
237
245
 
246
+ - **稀疏数据模型**:仅存储有实际数据的单元格;扩展逻辑范围不会创建空单元格
247
+ - **动态范围**:每个 Sheet 维护响应式逻辑范围(`colCount`/`rowCount`),从 `colCount`/`rowCount` prop(默认 26/200)起步,通过 `ensureCapacity(minCol, minRow)`按需增长。扩展使用缓冲步长(8 列 / 32 行)以减少频繁调整开销
238
248
  - **组合式 API**:所有业务逻辑抽取到 `composables/`,保持单一职责
239
249
  - **Barrel 导出**:`spreader/index.ts` 集中导出组件和全部类型,`src/index.ts` 再统一 re-export,外部统一从 `xiaodao-spreader` 引入
240
250
  - **Canvas 2D 渲染**:仅绘制可视区域(虚拟渲染),大表流畅
@@ -461,7 +471,7 @@ pnpm build:demo
461
471
 
462
472
  ### 中期
463
473
 
464
- - [ ] 冻结窗格(冻结行/列)
474
+ - [x] 冻结窗格(冻结行/列)—— *见 [冻结窗格](#功能特性)*
465
475
  - [ ] 数据验证(下拉列表、输入约束)
466
476
  - [ ] 行列分组与折叠
467
477
  - [x] 排序与筛选 —— 按展示内容排序,含类 Excel「排序提醒」对话框(扩展选定区域 / 仅对选定区域排序);见 [排序与排序提醒](#功能特性)
@@ -492,20 +502,6 @@ pnpm build:demo
492
502
 
493
503
  ---
494
504
 
495
- ## 贡献指南
496
-
497
- 欢迎贡献代码!请按以下步骤操作:
498
-
499
- 1. Fork 仓库
500
- 2. 创建功能分支(`git checkout -b feature/amazing-feature`)
501
- 3. 提交更改(`git commit -m 'feat: add amazing feature'`)
502
- 4. 推送到分支(`git push origin feature/amazing-feature`)
503
- 5. 提交 Pull Request
504
-
505
- 提交前请确保类型检查通过(`pnpm type-check`)且构建成功(`pnpm build`)。
506
-
507
- ---
508
-
509
505
  ## 开源协议
510
506
 
511
507
  本项目基于 MIT 协议 — 详见 [LICENSE](LICENSE) 文件。
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Xiaodao Spreader
2
2
 
3
- [中文](./README.ZH.md) | **English**
3
+ [中文](./README.ZH.md) | **English** | [Demo](https://spreader.xdz.me)
4
4
 
5
5
  [![Downloads](https://img.shields.io/npm/d18m/xiaodao-spreader)](https://www.npmjs.com/package/xiaodao-spreader)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
@@ -17,10 +17,12 @@ A high-performance, canvas-based spreadsheet component for Vue 3 — bringing an
17
17
  ## Features
18
18
 
19
19
  ### Core Spreadsheet
20
- - **Canvas 2D Rendering** — High-DPI aware with DPR scaling, virtual viewport rendering for 200 × 26 sheets
20
+ - **Dynamic Sheet Expansion** — Excel-like dynamic row/column expansion; default 26 columns (A-Z) × 200 rows, automatically expands when scrolling near boundaries, inputting at edges, pasting beyond current range, or inserting rows/columns that would push data out of bounds
21
+ - **Canvas 2D Rendering** — High-DPI aware with DPR scaling, virtual viewport rendering for dynamically-sized sheets
21
22
  - **Multi-Sheet Workbook** — Tab bar with add, rename, duplicate, delete, reorder
22
23
  - **Formula Engine** — `=SUM()`, `=AVERAGE()`, `=COUNT()`, `=IF()`, `=VLOOKUP()`, `=CONCATENATE()` with dependency tracking and circular-reference detection; toolbar and context menu provide one-click sum/average/count
23
24
  - **Merge Cells** — Merge & Center, Merge Across, Unmerge; merged-region borders stored at the anchor, shared borders resolved at render time
25
+ - **Freeze Panes** — Pin frozen top rows / left columns so they keep visible while the body scrolls. The toolbar "Freeze Panes" dropdown exposes *Freeze Panes* (freezes at the top-left corner of the current selection / active cell — Excel's "Freeze Panes" behavior), *Freeze First Row*, *Freeze First Column*, and *Unfreeze* (shown only when a pane is already frozen, replacing the "Freeze Panes" entry). Per-sheet view state (`freeze: { rows, cols }`) persisted through v-model; merged cells straddling the freeze line are handled correctly — only the frozen portion stays pinned, the rest scrolls away
24
26
  - **Rich Cell Formatting** — Font family, font size (5–72), bold, italic, underline, strikethrough, text color, fill color, horizontal & vertical alignment, wrap text
25
27
  - **Borders** — Top / bottom / left / right / outside / all / none with 5 predefined styles and custom color; stored in a dedicated border pool, shared borders resolved at render time
26
28
  - **Undo / Redo** — Full state snapshots for cells, column widths, and row heights (50 steps)
@@ -127,8 +129,8 @@ const myData = ref<SheetModelData[]>([
127
129
  | Prop | Type | Default | Description |
128
130
  |------|------|---------|-------------|
129
131
  | `data` (v-model) | `SheetModelData[]` | `[]` | Multi-sheet data (two-way binding) |
130
- | `rowCount` | `number` | `200` | Total rows per sheet |
131
- | `colCount` | `number` | `26` | Total columns per sheet |
132
+ | `rowCount` | `number` | `200` | Initial rows per sheet (can be exceeded dynamically) |
133
+ | `colCount` | `number` | `26` | Initial columns per sheet (can be exceeded dynamically) |
132
134
  | `width` | `number \| string` | — | Component width (pixels; omit or pass `string` for responsive) |
133
135
  | `height` | `number \| string` | — | Component height (pixels; omit or pass `string` for responsive) |
134
136
  | `theme` | `'light' \| 'dark'` | `'light'` | Theme mode |
@@ -152,8 +154,13 @@ interface SheetModelData {
152
154
  styleId?: number;
153
155
  }>;
154
156
  merges?: Record<string, SelectionRange>;
157
+ freeze?: { rows: number; cols: number };
155
158
  colWidths?: Record<number, number>;
156
159
  rowHeights?: Record<number, number>;
160
+ /** Logic column count (0-based exclusive). Defaults to 26 when omitted. */
161
+ colCount?: number;
162
+ /** Logic row count (0-based exclusive). Defaults to 200 when omitted. */
163
+ rowCount?: number;
157
164
  }
158
165
  ```
159
166
 
@@ -161,6 +168,7 @@ interface SheetModelData {
161
168
  - **`borders`**: Border pool — `borders[0]` is always the default empty border `{}`. Styles reference borders by index (`borderId`); auto-migrated from legacy inline border props when omitted.
162
169
  - **`cells`**: Key is `"col,row"` (e.g., `"0,0"` for cell A1). `styleId` references into the `styles` array; `styleId=0` or omitted means default style.
163
170
  - **`merges`**: Merge cell definitions, keyed by merge anchor cell.
171
+ - **`freeze`**: View state for frozen panes — `{ rows, cols }` freezes the top `rows` rows and the left `cols` columns; `{ rows: 0, cols: 0 }` means no freeze. Persisted per sheet and restored on sheet switch.
164
172
  - **`colWidths` / `rowHeights`**: Sparse maps — only stores non-default values.
165
173
 
166
174
  ### Type Exports
@@ -232,6 +240,8 @@ src/
232
240
 
233
241
  ### Design Principles
234
242
 
243
+ - **Sparse Data Model**: Only cells with actual data are stored; expanding the logical range does not create empty cells
244
+ - **Dynamic Range**: Each sheet maintains a reactive logical range (`colCount`/`rowCount`) that starts from the `colCount`/`rowCount` props (default 26/200) and grows as needed via `ensureCapacity(minCol, minRow)`. Expansion uses buffer steps (8 columns / 32 rows) to reduce frequent resize overhead
235
245
  - **Composition API**: All business logic extracted into `composables/`, maintaining single-responsibility modules
236
246
  - **Barrel Export**: `spreader/index.ts` centralizes all component and type exports; `src/index.ts` re-exports everything, so consumers import uniformly from `xiaodao-spreader`
237
247
  - **Canvas 2D Rendering**: Only visible cells are drawn (virtual rendering), ensuring smooth performance on large sheets
@@ -458,7 +468,7 @@ The project includes a GitHub Actions workflow (`.github/workflows/publish.yml`)
458
468
 
459
469
  ### Mid-term
460
470
 
461
- - [ ] Frozen panes (freeze rows/columns)
471
+ - [x] Frozen panes (freeze rows/columns) — *see [Freeze Panes](#features)*
462
472
  - [ ] Data validation (dropdown lists, input constraints)
463
473
  - [ ] Column / row grouping and collapsing
464
474
  - [x] Sort & filter — sort by displayed content with Excel-style Sort Warning dialog (expand selection / current selection only); see [Sorting & Sort Warning](#features)
@@ -489,20 +499,6 @@ The project includes a GitHub Actions workflow (`.github/workflows/publish.yml`)
489
499
 
490
500
  ---
491
501
 
492
- ## Contributing
493
-
494
- Contributions are welcome! Please feel free to:
495
-
496
- 1. Fork the repository
497
- 2. Create a feature branch (`git checkout -b feature/amazing-feature`)
498
- 3. Commit your changes (`git commit -m 'feat: add amazing feature'`)
499
- 4. Push to the branch (`git push origin feature/amazing-feature`)
500
- 5. Open a Pull Request
501
-
502
- Before submitting, please ensure the type check passes (`pnpm type-check`) and the build succeeds (`pnpm build`).
503
-
504
- ---
505
-
506
502
  ## License
507
503
 
508
504
  This project is licensed under the MIT License — see the [LICENSE](LICENSE) file for details.
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .sp-dropdown[data-v-ee298762]{position:relative;display:inline-flex;min-width:0}.sp-dropdown__trigger[data-v-ee298762]{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-ee298762]:hover{background:var(--sp-toolbar-btn-hover-bg, #e6e6e6)}.sp-dropdown__trigger--open[data-v-ee298762]{background:var(--sp-toolbar-btn-hover-bg, #e6e6e6);border-color:var(--sp-toolbar-border, #d8d8d8)}.sp-dropdown__value[data-v-ee298762]{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.sp-dropdown__caret[data-v-ee298762]{width:10px;height:10px;min-width:10px;opacity:.7}.sp-dropdown__menu[data-v-ee298762]{position:fixed;z-index:40000;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-ee298762]{transform-origin:bottom center}.menu-pop-enter-active[data-v-ee298762],.menu-pop-leave-active[data-v-ee298762]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-ee298762],.menu-pop-leave-to[data-v-ee298762]{opacity:0;transform:scaleY(.85)}.sp-dropdown__nav[data-v-ee298762]{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-ee298762]:hover:not(:disabled){background:#eef3f9}.sp-dropdown__nav[data-v-ee298762]:disabled{color:#ccc;cursor:default}.sp-dropdown__nav svg[data-v-ee298762]{width:10px;height:10px}.sp-dropdown__list[data-v-ee298762]{display:flex;flex-direction:column;overflow:hidden;touch-action:none}.sp-dropdown__search[data-v-ee298762]{flex:0 0 auto;height:26px;margin-bottom:4px;padding:0 8px;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:3px;font-size:12px;font-family:inherit;color:#1a1a1a;outline:none;box-sizing:border-box}.sp-dropdown__search[data-v-ee298762]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.sp-dropdown__empty[data-v-ee298762]{padding:6px 8px;font-size:12px;color:#999;text-align:center}.sp-dropdown__icon[data-v-ee298762]{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.sp-dropdown__icon[data-v-ee298762] svg{width:18px;height:18px;display:block}.sp-dropdown__item-icon[data-v-ee298762]{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.sp-dropdown__item-icon[data-v-ee298762] svg{width:16px;height:16px;display:block}.sp-dropdown__item-label[data-v-ee298762]{white-space:nowrap}.sp-dropdown__item[data-v-ee298762]{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-ee298762]:hover{background:#eef3f9}.sp-dropdown__item--active[data-v-ee298762]{background:#e5f1fb;color:#0078d7}.color-picker[data-v-70f3dfdc]{position:relative;display:inline-flex;height:26px}.color-picker__menu[data-v-70f3dfdc]{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-70f3dfdc],.menu-pop-leave-active[data-v-70f3dfdc]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-70f3dfdc],.menu-pop-leave-to[data-v-70f3dfdc]{opacity:0;transform:scale(.9)}.color-picker__row[data-v-70f3dfdc]{display:flex;gap:4px;margin-bottom:4px}.color-picker__row[data-v-70f3dfdc]:last-child{margin-bottom:0}.color-picker__swatch[data-v-70f3dfdc]{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-70f3dfdc]:hover{transform:scale(1.18);box-shadow:0 0 0 1px #0003;z-index:1}.color-picker__swatch--selected[data-v-70f3dfdc]{box-shadow:0 0 0 2px #0078d7}.border-picker[data-v-551c0ffe]{position:relative;display:inline-flex;height:26px}.border-picker__menu[data-v-551c0ffe]{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-551c0ffe]{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-551c0ffe]:hover{background:#eef3f9}.border-picker__icon[data-v-551c0ffe]{width:18px;height:18px;flex-shrink:0}.border-picker__label[data-v-551c0ffe]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-551c0ffe],.menu-pop-leave-active[data-v-551c0ffe]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-551c0ffe],.menu-pop-leave-to[data-v-551c0ffe]{opacity:0;transform:scale(.9)}.sort-picker[data-v-45929b74]{position:relative;display:inline-flex;height:26px}.sort-picker__menu[data-v-45929b74]{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}.sort-picker__item[data-v-45929b74]{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}.sort-picker__item[data-v-45929b74]:hover{background:#eef3f9}.sort-picker__icon[data-v-45929b74]{width:18px;height:18px;flex-shrink:0}.sort-picker__label[data-v-45929b74]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-45929b74],.menu-pop-leave-active[data-v-45929b74]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-45929b74],.menu-pop-leave-to[data-v-45929b74]{opacity:0;transform:scale(.9)}.merge-picker[data-v-edd36208]{position:relative;display:inline-flex;height:26px}.merge-picker__menu[data-v-edd36208]{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-edd36208]{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-edd36208]:hover{background:#eef3f9}.merge-picker__icon[data-v-edd36208]{width:18px;height:18px;flex-shrink:0;display:flex;align-items:center;justify-content:center}.merge-picker__icon[data-v-edd36208] svg{width:18px;height:18px}.merge-picker__label[data-v-edd36208]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-edd36208],.menu-pop-leave-active[data-v-edd36208]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-edd36208],.menu-pop-leave-to[data-v-edd36208]{opacity:0;transform:scale(.9)}.calc-picker[data-v-01a18e00]{position:relative;display:inline-flex;height:26px}.calc-picker__menu[data-v-01a18e00]{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-01a18e00]{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-01a18e00]:hover:not(.calc-picker__item--disabled){background:#eef3f9}.calc-picker__item--disabled[data-v-01a18e00]{color:var(--sp-toolbar-btn-disabled-color, #bbb);cursor:default}.calc-picker__label[data-v-01a18e00]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-01a18e00],.menu-pop-leave-active[data-v-01a18e00]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-01a18e00],.menu-pop-leave-to[data-v-01a18e00]{opacity:0;transform:scale(.9)}.toolbar[data-v-4f17f13a]{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-4f17f13a]{display:flex;align-items:center;flex:0 0 auto}.toolbar-sep[data-v-4f17f13a]{width:1px;height:18px;margin:0 4px;background:var(--sp-toolbar-border)}.toolbar-font[data-v-4f17f13a],.toolbar-number-format[data-v-4f17f13a],.toolbar-align[data-v-4f17f13a]{flex:0 0 auto}.toolbar-font-size[data-v-4f17f13a],.toolbar-number-format-group[data-v-4f17f13a]{display:inline-flex;align-items:center;gap:0;height:26px;position:relative}.toolbar-font-size__input[data-v-4f17f13a]{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-4f17f13a]::-webkit-outer-spin-button,.toolbar-font-size__input[data-v-4f17f13a]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.toolbar-font-size__input[data-v-4f17f13a]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__input[data-v-4f17f13a]:focus{border-color:var(--sp-toolbar-border);background:#fff}.toolbar-font-size__btn[data-v-4f17f13a]{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-4f17f13a]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__btn svg[data-v-4f17f13a]{width:10px;height:10px}.toolbar-font-size__dropdown[data-v-4f17f13a]{position:absolute;width:56px;height:26px;pointer-events:none}.toolbar-btn[data-v-4f17f13a]{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-4f17f13a]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-btn[data-v-4f17f13a]:active:not(:disabled){opacity:.7}.toolbar-btn--active[data-v-4f17f13a]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-btn--step[data-v-4f17f13a]{width:26px;height:26px}.toolbar-btn--step svg[data-v-4f17f13a]{width:16px;height:16px}.toolbar-btn[data-v-4f17f13a]:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.toolbar-btn__icon[data-v-4f17f13a]{width:18px;height:18px}.toolbar-btn svg[data-v-4f17f13a]:not(.toolbar-btn__icon){width:18px;height:18px}.toolbar-split[data-v-4f17f13a]{display:inline-flex;align-items:center;position:relative;height:26px}.toolbar-split__main[data-v-4f17f13a]{border:1px solid transparent;border-right:none;border-radius:3px 0 0 3px}.toolbar-split__arrow[data-v-4f17f13a]{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-4f17f13a]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-split__arrow svg[data-v-4f17f13a]{width:10px!important;height:10px!important}.toolbar-more[data-v-4f17f13a]{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-4f17f13a]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-more--active[data-v-4f17f13a]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-more svg[data-v-4f17f13a]{width:18px;height:18px}.overflow-menu[data-v-4f17f13a]{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-4f17f13a]{transition:none!important}.overflow-menu .tb-item[data-v-4f17f13a]{width:100%}.overflow-menu .toolbar-sep[data-v-4f17f13a]{width:100%;height:1px;margin:2px 0}.overflow-menu .toolbar-split[data-v-4f17f13a]{width:100%}.overflow-menu .toolbar-split__main[data-v-4f17f13a]{flex:1 1 auto;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-font-size[data-v-4f17f13a],.overflow-menu .toolbar-number-format-group[data-v-4f17f13a]{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font[data-v-4f17f13a]{width:100%}.overflow-menu .toolbar-number-format[data-v-4f17f13a]{flex:1 1 auto;width:auto!important;min-width:0}.overflow-menu .toolbar-align[data-v-4f17f13a]{width:100%}.overflow-menu .toolbar-btn[data-v-4f17f13a]:not(.toolbar-btn--step):not(.toolbar-split__arrow):not(.toolbar-number-format__btn){width:100%;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-number-format__btn[data-v-4f17f13a]{flex:0 0 auto;width:30px}.overflow-menu .toolbar-color[data-v-4f17f13a]{width:100%}.overflow-menu .toolbar-wrap[data-v-4f17f13a]{width:100%;justify-content:flex-start}.menu-pop-enter-active[data-v-4f17f13a],.menu-pop-leave-active[data-v-4f17f13a]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-4f17f13a],.menu-pop-leave-to[data-v-4f17f13a]{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,.overflow-menu .toolbar-number-format-group{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font{width:100%}.overflow-menu .toolbar-number-format{flex:1 1 auto;width:auto!important;min-width:0}.overflow-menu .toolbar-align{width:100%}.overflow-menu .toolbar-btn:not(.toolbar-btn--step):not(.toolbar-split__arrow):not(.toolbar-number-format__btn){width:100%;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-number-format__btn{flex:0 0 auto;width:30px}.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-ec10bade]{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-ec10bade]{display:flex;align-items:flex-start;flex:1;overflow:hidden;gap:1px;padding:0 1px}.tab-item[data-v-ec10bade]{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-ec10bade]:hover{background:var(--sp-tab-hover-bg)}.tab-item--active[data-v-ec10bade]{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-ec10bade]:hover{background:var(--sp-tab-active-bg)}.tab-item__name[data-v-ec10bade]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tab-rename-input[data-v-ec10bade]{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__list-btn[data-v-ec10bade]{display:flex;align-items:center;justify-content:center;width:24px;min-width:24px;height:24px;margin:0 2px 3px 3px;border:none;background:transparent;color:var(--sp-tab-add-btn-color);cursor:pointer;padding:0;align-self:flex-end}.tab-bar__list-btn[data-v-ec10bade]:hover,.tab-bar__list-btn--active[data-v-ec10bade]{background:var(--sp-tab-add-btn-hover-bg)}.tab-bar__list-btn svg[data-v-ec10bade]{width:14px;height:14px}.tab-bar__add-btn[data-v-ec10bade]{display:flex;align-items:center;justify-content:center;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;align-self:flex-end}.tab-bar__add-btn[data-v-ec10bade]:hover{background:var(--sp-tab-add-btn-hover-bg)}.tab-list-menu{position:fixed;display:flex;flex-direction:column;background:var(--sp-toolbar-bg, #fff);border:1px solid var(--sp-toolbar-border, #d8d8d8);border-radius:4px;box-shadow:0 4px 12px #0000001f;padding:4px;z-index:1000;transform-origin:bottom left;min-width:140px;max-width:260px;box-sizing:border-box}.tab-list-menu__nav{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}.tab-list-menu__nav:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg, #eef3f9)}.tab-list-menu__nav:disabled{color:#ccc;cursor:default}.tab-list-menu__nav svg{width:10px;height:10px}.tab-list-menu__list{display:flex;flex-direction:column;overflow:hidden;touch-action:none}.tab-list-menu__item{display:flex;align-items:center;gap:4px;width:100%;height:28px;padding:0 6px 0 10px;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #444);font-size:13px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;cursor:pointer;white-space:nowrap;border-radius:3px;box-sizing:border-box}.tab-list-menu__item:hover{background:var(--sp-toolbar-btn-hover-bg, #e6e6e6)}.tab-list-menu__item--active{color:var(--sp-tab-active-border, #0078d7);font-weight:500}.tab-list-menu__name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tab-list-menu__del{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex:0 0 auto;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #999);cursor:pointer;padding:0;border-radius:3px;opacity:.55}.tab-list-menu__item:hover .tab-list-menu__del{opacity:1}.tab-list-menu__del:hover:not(:disabled){background:rgba(0,0,0,.08);color:#d9534f}.tab-list-menu__del:disabled{cursor:default;opacity:.25}.tab-list-menu__del svg{width:12px;height:12px}.find-bar[data-v-3120909b]{display:flex;align-items:center;gap:6px;padding:4px 8px;background:var(--sp-toolbar-bg);border-bottom:1px solid var(--sp-toolbar-border);-webkit-user-select:none;user-select:none;flex-wrap:nowrap;overflow-x:auto}.find-bar__input[data-v-3120909b]{height:24px;width:160px;flex:0 0 auto;border:1px solid var(--sp-toolbar-border);border-radius:3px;padding:0 6px;font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;color:var(--sp-formula-bar-input-color, #1a1a1a);background:#fff;outline:none;box-sizing:border-box}.find-bar__input[data-v-3120909b]:focus{border-color:var(--sp-toolbar-btn-active-color)}.find-bar__dropdown[data-v-3120909b]{flex:0 0 auto}.find-bar__dropdown[data-v-3120909b] .sp-dropdown__trigger{height:24px;border:1px solid var(--sp-toolbar-border);background:#fff;color:var(--sp-formula-bar-input-color, #1a1a1a);font-size:12px;padding:0 4px}.find-bar__dropdown[data-v-3120909b] .sp-dropdown__trigger:hover{background:#f5f5f5}.find-bar__dropdown[data-v-3120909b] .sp-dropdown__trigger--open{border-color:var(--sp-toolbar-btn-active-color)}.find-bar__chk[data-v-3120909b]{display:flex;align-items:center;gap:5px;flex:0 0 auto;font-size:12px;color:var(--sp-toolbar-btn-color);white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none}.find-bar__chk-input[data-v-3120909b]{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;pointer-events:none}.find-bar__chk-box[data-v-3120909b]{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;flex:0 0 auto;box-sizing:border-box;border:1px solid var(--sp-toolbar-border);border-radius:3px;background:#fff;transition:background .12s ease,border-color .12s ease}.find-bar__chk-tick[data-v-3120909b]{width:12px;height:12px;color:#fff;opacity:0;transform:scale(.5);transition:opacity .12s ease,transform .12s ease}.find-bar__chk-input:checked+.find-bar__chk-box[data-v-3120909b]{background:#0078d7;border-color:#0078d7}.find-bar__chk-input:checked+.find-bar__chk-box .find-bar__chk-tick[data-v-3120909b]{opacity:1;transform:scale(1)}.find-bar__chk-input:focus-visible+.find-bar__chk-box[data-v-3120909b]{outline:2px solid rgba(0,120,215,.4);outline-offset:1px}.find-bar__count[data-v-3120909b]{flex:0 0 auto;font-size:12px;color:var(--sp-toolbar-btn-color);min-width:44px;text-align:center;white-space:nowrap}.find-bar__btn[data-v-3120909b]{height:24px;flex:0 0 auto;border:1px solid var(--sp-toolbar-border);border-radius:3px;background:transparent;color:var(--sp-toolbar-btn-color);cursor:pointer;font-size:12px;padding:0 8px;display:inline-flex;align-items:center;justify-content:center}.find-bar__btn[data-v-3120909b]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.find-bar__btn[data-v-3120909b]:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.find-bar__btn--icon[data-v-3120909b]{width:26px;padding:0}.find-bar__btn--icon svg[data-v-3120909b]{width:14px;height:14px}.find-bar__btn--close[data-v-3120909b]{width:26px;padding:0;margin-left:auto;border:none}.find-bar__btn--close svg[data-v-3120909b]{width:14px;height:14px}.nf-dialog__mask[data-v-c9c08f15]{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-c9c08f15]{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-c9c08f15]{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid #ececec}.nf-dialog__title[data-v-c9c08f15]{font-size:13px;font-weight:600}.nf-dialog__close[data-v-c9c08f15]{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-c9c08f15]:hover{background:#f0f0f0;color:#444}.nf-dialog__close svg[data-v-c9c08f15]{width:14px;height:14px}.nf-dialog__body[data-v-c9c08f15]{padding:12px 14px;display:flex;flex-direction:column;gap:10px}.nf-field[data-v-c9c08f15]{display:flex;align-items:center;gap:8px}.nf-field--inline[data-v-c9c08f15]{min-height:26px}.nf-field__label[data-v-c9c08f15]{width:88px;min-width:88px;font-size:12px;color:#555}.nf-field__input[data-v-c9c08f15]{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__input[data-v-c9c08f15]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.nf-field__dropdown[data-v-c9c08f15]{flex:1}.nf-field__dropdown[data-v-c9c08f15] .sp-dropdown__trigger{border:1px solid #c0c0c0;background:#fff;color:#1a1a1a;padding:0 6px}.nf-field__dropdown[data-v-c9c08f15] .sp-dropdown__trigger:hover{background:#f5f5f5}.nf-field__dropdown[data-v-c9c08f15] .sp-dropdown__trigger--open{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.nf-field__textarea[data-v-c9c08f15]{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-c9c08f15]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.nf-checkbox[data-v-c9c08f15]{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:#333;cursor:pointer}.nf-checkbox input[data-v-c9c08f15]{margin:0;cursor:pointer}.nf-dialog__footer[data-v-c9c08f15]{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 14px;border-top:1px solid #ececec}.nf-preview[data-v-c9c08f15]{display:flex;flex-direction:column;gap:2px;min-width:0}.nf-preview__label[data-v-c9c08f15]{font-size:11px;color:#888}.nf-preview__value[data-v-c9c08f15]{font-size:13px;color:#1a1a1a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:180px}.nf-dialog__actions[data-v-c9c08f15]{display:flex;gap:8px}.nf-btn[data-v-c9c08f15]{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-c9c08f15]:hover{background:#f0f0f0}.nf-btn--primary[data-v-c9c08f15]{border-color:#0078d7;background:#0078d7;color:#fff}.nf-btn--primary[data-v-c9c08f15]:hover{background:#0069c0}.nf-dialog-enter-active[data-v-c9c08f15],.nf-dialog-leave-active[data-v-c9c08f15]{transition:opacity .14s ease-out}.nf-dialog-enter-from[data-v-c9c08f15],.nf-dialog-leave-to[data-v-c9c08f15]{opacity:0}.nf-dialog-enter-active .nf-dialog[data-v-c9c08f15],.nf-dialog-leave-active .nf-dialog[data-v-c9c08f15]{transition:transform .14s ease-out}.nf-dialog-enter-from .nf-dialog[data-v-c9c08f15],.nf-dialog-leave-to .nf-dialog[data-v-c9c08f15]{transform:scale(.96)}.sort-confirm__mask[data-v-09f7a339]{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}.sort-confirm[data-v-09f7a339]{width:360px;max-width:calc(100vw - 32px);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}.sort-confirm__header[data-v-09f7a339]{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid #ececec}.sort-confirm__title[data-v-09f7a339]{font-size:13px;font-weight:600}.sort-confirm__close[data-v-09f7a339]{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}.sort-confirm__close[data-v-09f7a339]:hover{background:#f0f0f0;color:#444}.sort-confirm__close svg[data-v-09f7a339]{width:14px;height:14px}.sort-confirm__body[data-v-09f7a339]{padding:14px}.sort-confirm__message[data-v-09f7a339]{margin:0 0 12px;font-size:12px;line-height:1.5;color:#333}.sort-confirm__options[data-v-09f7a339]{display:flex;flex-direction:column;gap:8px}.sort-confirm__option[data-v-09f7a339]{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:#333;cursor:pointer}.sort-confirm__option input[data-v-09f7a339]{margin:0;cursor:pointer}.sort-confirm__footer[data-v-09f7a339]{display:flex;justify-content:flex-end;gap:8px;padding:10px 14px;border-top:1px solid #ececec}.sort-confirm__btn[data-v-09f7a339]{height:28px;padding:0 16px;border:1px solid #ccc;border-radius:3px;background:#fff;color:#333;font-size:12px;cursor:pointer;font-family:inherit}.sort-confirm__btn[data-v-09f7a339]:hover{background:#f0f0f0}.sort-confirm__btn--primary[data-v-09f7a339]{border-color:#0078d7;background:#0078d7;color:#fff}.sort-confirm__btn--primary[data-v-09f7a339]:hover{background:#0069c0}.sort-confirm-enter-active[data-v-09f7a339],.sort-confirm-leave-active[data-v-09f7a339]{transition:opacity .14s ease-out}.sort-confirm-enter-from[data-v-09f7a339],.sort-confirm-leave-to[data-v-09f7a339]{opacity:0}.sort-confirm-enter-active .sort-confirm[data-v-09f7a339],.sort-confirm-leave-active .sort-confirm[data-v-09f7a339]{transition:transform .14s ease-out}.sort-confirm-enter-from .sort-confirm[data-v-09f7a339],.sort-confirm-leave-to .sort-confirm[data-v-09f7a339]{transform:scale(.96)}.ifn-dialog__mask[data-v-2eec9073]{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}.ifn-dialog[data-v-2eec9073]{width:440px;max-width:calc(100vw - 32px);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}.ifn-dialog__header[data-v-2eec9073]{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid #ececec}.ifn-dialog__title[data-v-2eec9073]{font-size:13px;font-weight:600}.ifn-dialog__close[data-v-2eec9073]{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}.ifn-dialog__close[data-v-2eec9073]:hover{background:#f0f0f0;color:#444}.ifn-dialog__close svg[data-v-2eec9073]{width:14px;height:14px}.ifn-dialog__body[data-v-2eec9073]{padding:14px;display:flex;flex-direction:column;gap:12px}.ifn-dialog__field[data-v-2eec9073]{display:flex;flex-direction:column;gap:6px}.ifn-dialog__label[data-v-2eec9073]{font-size:12px;color:#333}.ifn-dialog__dropdown[data-v-2eec9073]{width:100%}.ifn-dialog__dropdown[data-v-2eec9073] .sp-dropdown__trigger{border:1px solid #c0c0c0;background:#fff;color:#1a1a1a;padding:0 6px}.ifn-dialog__dropdown[data-v-2eec9073] .sp-dropdown__trigger:hover{background:#f5f5f5}.ifn-dialog__dropdown[data-v-2eec9073] .sp-dropdown__trigger--open{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.ifn-dialog__desc[data-v-2eec9073]{font-size:12px;line-height:1.5;color:#666;-webkit-user-select:text;user-select:text}.ifn-dialog__textarea[data-v-2eec9073]{width:100%;height:84px;border:1px solid #c0c0c0;border-radius:3px;background:#fff;font-size:12px;line-height:1.5;color:#1a1a1a;padding:5px 6px;outline:none;box-sizing:border-box;font-family:Consolas,Menlo,monospace;resize:none;-webkit-user-select:text;user-select:text}.ifn-dialog__textarea[data-v-2eec9073]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.ifn-dialog__footer[data-v-2eec9073]{display:flex;justify-content:flex-end;gap:8px;padding:10px 14px;border-top:1px solid #ececec}.ifn-dialog__btn[data-v-2eec9073]{height:28px;padding:0 16px;border:1px solid #ccc;border-radius:3px;background:#fff;color:#333;font-size:12px;cursor:pointer;font-family:inherit}.ifn-dialog__btn[data-v-2eec9073]:hover{background:#f0f0f0}.ifn-dialog__btn--primary[data-v-2eec9073]{border-color:#0078d7;background:#0078d7;color:#fff}.ifn-dialog__btn--primary[data-v-2eec9073]:hover{background:#0069c0}.ifn-dialog__btn--primary[data-v-2eec9073]:disabled,.ifn-dialog__btn--primary[data-v-2eec9073]:disabled:hover{border-color:#ccc;background:#f0f0f0;color:#a8a8a8;cursor:not-allowed}.ifn-dialog-enter-active[data-v-2eec9073],.ifn-dialog-leave-active[data-v-2eec9073]{transition:opacity .14s ease-out}.ifn-dialog-enter-from[data-v-2eec9073],.ifn-dialog-leave-to[data-v-2eec9073]{opacity:0}.ifn-dialog-enter-active .ifn-dialog[data-v-2eec9073],.ifn-dialog-leave-active .ifn-dialog[data-v-2eec9073]{transition:transform .14s ease-out}.ifn-dialog-enter-from .ifn-dialog[data-v-2eec9073],.ifn-dialog-leave-to .ifn-dialog[data-v-2eec9073]{transform:scale(.96)}.spreadsheet-outer[data-v-86e52c54]{flex:1;display:flex;flex-direction:column;overflow:hidden;height:100%;min-height:400px;width:100%}.formula-bar[data-v-86e52c54]{display:flex;align-items:flex-start;min-height:36px;padding:0;gap:0}.formula-bar--expanded[data-v-86e52c54]{min-height:72px}.formula-bar__cell-label[data-v-86e52c54]{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-86e52c54]{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-86e52c54]{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-86e52c54]{border-left:1px solid var(--sp-formula-bar-input-border)}.formula-bar__btn[data-v-86e52c54]:hover{background:var(--sp-scroll-btn-hover-bg, #f0f0f0)}.formula-bar__btn--cancel[data-v-86e52c54]:hover{color:#e53935;background:#fdecea}.formula-bar__btn--accept[data-v-86e52c54]:hover{color:#2e7d32;background:#e8f5e9}.formula-bar__fx-label[data-v-86e52c54]{font-family:Georgia,Times New Roman,serif;font-style:italic;font-weight:600;font-size:13px;line-height:1;-webkit-user-select:none;user-select:none}.formula-bar__btn--fx[data-v-86e52c54]:hover{background:var(--sp-scroll-btn-hover-bg, #f0f0f0)}.formula-bar__input[data-v-86e52c54]{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-86e52c54]{height:68px;overflow:auto}.formula-bar__input[data-v-86e52c54]: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-86e52c54]{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-86e52c54]:hover{background:var(--sp-scroll-btn-hover-bg, #e8e8e8)}.spreadsheet-wrapper[data-v-86e52c54]{flex:1;position:relative;overflow:hidden;background:var(--sp-wrapper-bg)}.grid-canvas[data-v-86e52c54]{position:absolute;top:0;left:0;display:block;outline:none;cursor:cell}.grid-canvas[data-v-86e52c54]:focus{outline:none}.v-scrollbar[data-v-86e52c54]{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-86e52c54]{position:absolute;left:0;bottom:0;height:11px;width:calc(100% - 11px);display:flex;background:var(--sp-wrapper-bg)}.sb-corner[data-v-86e52c54]{position:absolute;right:0;bottom:0;width:11px;height:11px;background:var(--sp-wrapper-bg)}.sb-btn[data-v-86e52c54]{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-86e52c54]:hover{background:var(--sp-scroll-btn-hover-bg, #d0d0d0)}.sb-btn[data-v-86e52c54]:active{background:var(--sp-scroll-btn-active-bg, #c0c0c0)}.sb-arrow[data-v-86e52c54]{display:block;width:0;height:0}.sb-arrow--up[data-v-86e52c54]{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-86e52c54]{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-86e52c54]{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-86e52c54]{border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:4px solid var(--sp-scroll-btn-color, #666)}.sb-track[data-v-86e52c54]{flex:1;position:relative;background:var(--sp-scroll-track-bg, rgba(0,0,0,.06))}.sb-track--v[data-v-86e52c54]{width:11px}.sb-track--h[data-v-86e52c54]{height:11px}.sb-thumb[data-v-86e52c54]{position:absolute;border-radius:3px;background:var(--sp-scroll-thumb);cursor:default}.sb-thumb[data-v-86e52c54]:hover{background:var(--sp-scroll-thumb-hover)}.sb-thumb--v[data-v-86e52c54]{left:1px;right:1px;min-height:16px}.sb-thumb--h[data-v-86e52c54]{top:1px;bottom:1px;min-width:16px}.cell-editor[data-v-86e52c54]{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 12px;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:8px;margin-right:-2px;width:12px;height:12px;fill:#888;flex:none}.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:not(.context-menu__item--disabled):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__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-804e629f]{position:relative;display:inline-flex;min-width:0}.sp-dropdown__trigger[data-v-804e629f]{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-804e629f]:hover{background:var(--sp-toolbar-btn-hover-bg, #e6e6e6)}.sp-dropdown__trigger--open[data-v-804e629f]{background:var(--sp-toolbar-btn-hover-bg, #e6e6e6);border-color:var(--sp-toolbar-border, #d8d8d8)}.sp-dropdown__value[data-v-804e629f]{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.sp-dropdown__caret[data-v-804e629f]{width:10px;height:10px;min-width:10px;opacity:.7}.sp-dropdown__menu[data-v-804e629f]{position:fixed;z-index:40000;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-804e629f]{transform-origin:bottom center}.menu-pop-enter-active[data-v-804e629f],.menu-pop-leave-active[data-v-804e629f]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-804e629f],.menu-pop-leave-to[data-v-804e629f]{opacity:0;transform:scaleY(.85)}.sp-dropdown__nav[data-v-804e629f]{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-804e629f]:hover:not(:disabled){background:#eef3f9}.sp-dropdown__nav[data-v-804e629f]:disabled{color:#ccc;cursor:default}.sp-dropdown__nav svg[data-v-804e629f]{width:10px;height:10px}.sp-dropdown__list[data-v-804e629f]{display:flex;flex-direction:column;overflow:hidden;touch-action:none}.sp-dropdown__search[data-v-804e629f]{flex:0 0 auto;height:26px;margin-bottom:4px;padding:0 8px;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:3px;font-size:12px;font-family:inherit;color:#1a1a1a;outline:none;box-sizing:border-box}.sp-dropdown__search[data-v-804e629f]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.sp-dropdown__empty[data-v-804e629f]{padding:6px 8px;font-size:12px;color:#999;text-align:center}.sp-dropdown__icon[data-v-804e629f]{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.sp-dropdown__icon[data-v-804e629f] svg{width:18px;height:18px;display:block}.sp-dropdown__item-icon[data-v-804e629f]{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.sp-dropdown__item-icon[data-v-804e629f] svg{width:16px;height:16px;display:block}.sp-dropdown__item-label[data-v-804e629f]{white-space:nowrap}.sp-dropdown__item[data-v-804e629f]{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-804e629f]:hover{background:#eef3f9}.sp-dropdown__item--active[data-v-804e629f]{background:#e5f1fb;color:#0078d7}.color-picker[data-v-70f3dfdc]{position:relative;display:inline-flex;height:26px}.color-picker__menu[data-v-70f3dfdc]{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-70f3dfdc],.menu-pop-leave-active[data-v-70f3dfdc]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-70f3dfdc],.menu-pop-leave-to[data-v-70f3dfdc]{opacity:0;transform:scale(.9)}.color-picker__row[data-v-70f3dfdc]{display:flex;gap:4px;margin-bottom:4px}.color-picker__row[data-v-70f3dfdc]:last-child{margin-bottom:0}.color-picker__swatch[data-v-70f3dfdc]{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-70f3dfdc]:hover{transform:scale(1.18);box-shadow:0 0 0 1px #0003;z-index:1}.color-picker__swatch--selected[data-v-70f3dfdc]{box-shadow:0 0 0 2px #0078d7}.border-picker[data-v-551c0ffe]{position:relative;display:inline-flex;height:26px}.border-picker__menu[data-v-551c0ffe]{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-551c0ffe]{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-551c0ffe]:hover{background:#eef3f9}.border-picker__icon[data-v-551c0ffe]{width:18px;height:18px;flex-shrink:0}.border-picker__label[data-v-551c0ffe]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-551c0ffe],.menu-pop-leave-active[data-v-551c0ffe]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-551c0ffe],.menu-pop-leave-to[data-v-551c0ffe]{opacity:0;transform:scale(.9)}.sort-picker[data-v-45929b74]{position:relative;display:inline-flex;height:26px}.sort-picker__menu[data-v-45929b74]{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}.sort-picker__item[data-v-45929b74]{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}.sort-picker__item[data-v-45929b74]:hover{background:#eef3f9}.sort-picker__icon[data-v-45929b74]{width:18px;height:18px;flex-shrink:0}.sort-picker__label[data-v-45929b74]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-45929b74],.menu-pop-leave-active[data-v-45929b74]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-45929b74],.menu-pop-leave-to[data-v-45929b74]{opacity:0;transform:scale(.9)}.merge-picker[data-v-edd36208]{position:relative;display:inline-flex;height:26px}.merge-picker__menu[data-v-edd36208]{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-edd36208]{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-edd36208]:hover{background:#eef3f9}.merge-picker__icon[data-v-edd36208]{width:18px;height:18px;flex-shrink:0;display:flex;align-items:center;justify-content:center}.merge-picker__icon[data-v-edd36208] svg{width:18px;height:18px}.merge-picker__label[data-v-edd36208]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-edd36208],.menu-pop-leave-active[data-v-edd36208]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-edd36208],.menu-pop-leave-to[data-v-edd36208]{opacity:0;transform:scale(.9)}.calc-picker[data-v-01a18e00]{position:relative;display:inline-flex;height:26px}.calc-picker__menu[data-v-01a18e00]{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-01a18e00]{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-01a18e00]:hover:not(.calc-picker__item--disabled){background:#eef3f9}.calc-picker__item--disabled[data-v-01a18e00]{color:var(--sp-toolbar-btn-disabled-color, #bbb);cursor:default}.calc-picker__label[data-v-01a18e00]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-01a18e00],.menu-pop-leave-active[data-v-01a18e00]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-01a18e00],.menu-pop-leave-to[data-v-01a18e00]{opacity:0;transform:scale(.9)}.toolbar[data-v-a97a071a]{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-a97a071a]{display:flex;align-items:center;flex:0 0 auto}.toolbar-sep[data-v-a97a071a]{width:1px;height:18px;margin:0 4px;background:var(--sp-toolbar-border)}.toolbar-font[data-v-a97a071a],.toolbar-number-format[data-v-a97a071a],.toolbar-align[data-v-a97a071a],.toolbar-freeze[data-v-a97a071a]{flex:0 0 auto}.toolbar-font-size[data-v-a97a071a],.toolbar-number-format-group[data-v-a97a071a]{display:inline-flex;align-items:center;gap:0;height:26px;position:relative}.toolbar-font-size__input[data-v-a97a071a]{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-a97a071a]::-webkit-outer-spin-button,.toolbar-font-size__input[data-v-a97a071a]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.toolbar-font-size__input[data-v-a97a071a]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__input[data-v-a97a071a]:focus{border-color:var(--sp-toolbar-border);background:#fff}.toolbar-font-size__btn[data-v-a97a071a]{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-a97a071a]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__btn svg[data-v-a97a071a]{width:10px;height:10px}.toolbar-font-size__dropdown[data-v-a97a071a]{position:absolute;width:56px;height:26px;pointer-events:none}.toolbar-btn[data-v-a97a071a]{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-a97a071a]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-btn[data-v-a97a071a]:active:not(:disabled){opacity:.7}.toolbar-btn--active[data-v-a97a071a]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-btn--step[data-v-a97a071a]{width:26px;height:26px}.toolbar-btn--step svg[data-v-a97a071a]{width:16px;height:16px}.toolbar-btn[data-v-a97a071a]:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.toolbar-btn__icon[data-v-a97a071a]{width:18px;height:18px}.toolbar-btn svg[data-v-a97a071a]:not(.toolbar-btn__icon){width:18px;height:18px}.toolbar-split[data-v-a97a071a]{display:inline-flex;align-items:center;position:relative;height:26px}.toolbar-split__main[data-v-a97a071a]{border:1px solid transparent;border-right:none;border-radius:3px 0 0 3px}.toolbar-split__arrow[data-v-a97a071a]{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-a97a071a]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-split__arrow svg[data-v-a97a071a]{width:10px!important;height:10px!important}.toolbar-more[data-v-a97a071a]{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-a97a071a]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-more--active[data-v-a97a071a]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-more svg[data-v-a97a071a]{width:18px;height:18px}.overflow-menu[data-v-a97a071a]{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-a97a071a]{transition:none!important}.overflow-menu .tb-item[data-v-a97a071a]{width:100%}.overflow-menu .toolbar-sep[data-v-a97a071a]{width:100%;height:1px;margin:2px 0}.overflow-menu .toolbar-split[data-v-a97a071a]{width:100%}.overflow-menu .toolbar-split__main[data-v-a97a071a]{flex:1 1 auto;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-font-size[data-v-a97a071a],.overflow-menu .toolbar-number-format-group[data-v-a97a071a]{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font[data-v-a97a071a]{width:100%}.overflow-menu .toolbar-number-format[data-v-a97a071a]{flex:1 1 auto;width:auto!important;min-width:0}.overflow-menu .toolbar-align[data-v-a97a071a],.overflow-menu .toolbar-freeze[data-v-a97a071a]{width:100%}.overflow-menu .toolbar-btn[data-v-a97a071a]:not(.toolbar-btn--step):not(.toolbar-split__arrow):not(.toolbar-number-format__btn){width:100%;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-number-format__btn[data-v-a97a071a]{flex:0 0 auto;width:30px}.overflow-menu .toolbar-color[data-v-a97a071a]{width:100%}.overflow-menu .toolbar-wrap[data-v-a97a071a]{width:100%;justify-content:flex-start}.menu-pop-enter-active[data-v-a97a071a],.menu-pop-leave-active[data-v-a97a071a]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-a97a071a],.menu-pop-leave-to[data-v-a97a071a]{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,.overflow-menu .toolbar-number-format-group{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font{width:100%}.overflow-menu .toolbar-number-format{flex:1 1 auto;width:auto!important;min-width:0}.overflow-menu .toolbar-align,.overflow-menu .toolbar-freeze{width:100%}.overflow-menu .toolbar-btn:not(.toolbar-btn--step):not(.toolbar-split__arrow):not(.toolbar-number-format__btn){width:100%;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-number-format__btn{flex:0 0 auto;width:30px}.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-ec10bade]{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-ec10bade]{display:flex;align-items:flex-start;flex:1;overflow:hidden;gap:1px;padding:0 1px}.tab-item[data-v-ec10bade]{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-ec10bade]:hover{background:var(--sp-tab-hover-bg)}.tab-item--active[data-v-ec10bade]{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-ec10bade]:hover{background:var(--sp-tab-active-bg)}.tab-item__name[data-v-ec10bade]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tab-rename-input[data-v-ec10bade]{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__list-btn[data-v-ec10bade]{display:flex;align-items:center;justify-content:center;width:24px;min-width:24px;height:24px;margin:0 2px 3px 3px;border:none;background:transparent;color:var(--sp-tab-add-btn-color);cursor:pointer;padding:0;align-self:flex-end}.tab-bar__list-btn[data-v-ec10bade]:hover,.tab-bar__list-btn--active[data-v-ec10bade]{background:var(--sp-tab-add-btn-hover-bg)}.tab-bar__list-btn svg[data-v-ec10bade]{width:14px;height:14px}.tab-bar__add-btn[data-v-ec10bade]{display:flex;align-items:center;justify-content:center;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;align-self:flex-end}.tab-bar__add-btn[data-v-ec10bade]:hover{background:var(--sp-tab-add-btn-hover-bg)}.tab-list-menu{position:fixed;display:flex;flex-direction:column;background:var(--sp-toolbar-bg, #fff);border:1px solid var(--sp-toolbar-border, #d8d8d8);border-radius:4px;box-shadow:0 4px 12px #0000001f;padding:4px;z-index:1000;transform-origin:bottom left;min-width:140px;max-width:260px;box-sizing:border-box}.tab-list-menu__nav{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}.tab-list-menu__nav:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg, #eef3f9)}.tab-list-menu__nav:disabled{color:#ccc;cursor:default}.tab-list-menu__nav svg{width:10px;height:10px}.tab-list-menu__list{display:flex;flex-direction:column;overflow:hidden;touch-action:none}.tab-list-menu__item{display:flex;align-items:center;gap:4px;width:100%;height:28px;padding:0 6px 0 10px;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #444);font-size:13px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;cursor:pointer;white-space:nowrap;border-radius:3px;box-sizing:border-box}.tab-list-menu__item:hover{background:var(--sp-toolbar-btn-hover-bg, #e6e6e6)}.tab-list-menu__item--active{color:var(--sp-tab-active-border, #0078d7);font-weight:500}.tab-list-menu__name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tab-list-menu__del{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex:0 0 auto;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #999);cursor:pointer;padding:0;border-radius:3px;opacity:.55}.tab-list-menu__item:hover .tab-list-menu__del{opacity:1}.tab-list-menu__del:hover:not(:disabled){background:rgba(0,0,0,.08);color:#d9534f}.tab-list-menu__del:disabled{cursor:default;opacity:.25}.tab-list-menu__del svg{width:12px;height:12px}.find-bar[data-v-3120909b]{display:flex;align-items:center;gap:6px;padding:4px 8px;background:var(--sp-toolbar-bg);border-bottom:1px solid var(--sp-toolbar-border);-webkit-user-select:none;user-select:none;flex-wrap:nowrap;overflow-x:auto}.find-bar__input[data-v-3120909b]{height:24px;width:160px;flex:0 0 auto;border:1px solid var(--sp-toolbar-border);border-radius:3px;padding:0 6px;font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;color:var(--sp-formula-bar-input-color, #1a1a1a);background:#fff;outline:none;box-sizing:border-box}.find-bar__input[data-v-3120909b]:focus{border-color:var(--sp-toolbar-btn-active-color)}.find-bar__dropdown[data-v-3120909b]{flex:0 0 auto}.find-bar__dropdown[data-v-3120909b] .sp-dropdown__trigger{height:24px;border:1px solid var(--sp-toolbar-border);background:#fff;color:var(--sp-formula-bar-input-color, #1a1a1a);font-size:12px;padding:0 4px}.find-bar__dropdown[data-v-3120909b] .sp-dropdown__trigger:hover{background:#f5f5f5}.find-bar__dropdown[data-v-3120909b] .sp-dropdown__trigger--open{border-color:var(--sp-toolbar-btn-active-color)}.find-bar__chk[data-v-3120909b]{display:flex;align-items:center;gap:5px;flex:0 0 auto;font-size:12px;color:var(--sp-toolbar-btn-color);white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none}.find-bar__chk-input[data-v-3120909b]{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;pointer-events:none}.find-bar__chk-box[data-v-3120909b]{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;flex:0 0 auto;box-sizing:border-box;border:1px solid var(--sp-toolbar-border);border-radius:3px;background:#fff;transition:background .12s ease,border-color .12s ease}.find-bar__chk-tick[data-v-3120909b]{width:12px;height:12px;color:#fff;opacity:0;transform:scale(.5);transition:opacity .12s ease,transform .12s ease}.find-bar__chk-input:checked+.find-bar__chk-box[data-v-3120909b]{background:#0078d7;border-color:#0078d7}.find-bar__chk-input:checked+.find-bar__chk-box .find-bar__chk-tick[data-v-3120909b]{opacity:1;transform:scale(1)}.find-bar__chk-input:focus-visible+.find-bar__chk-box[data-v-3120909b]{outline:2px solid rgba(0,120,215,.4);outline-offset:1px}.find-bar__count[data-v-3120909b]{flex:0 0 auto;font-size:12px;color:var(--sp-toolbar-btn-color);min-width:44px;text-align:center;white-space:nowrap}.find-bar__btn[data-v-3120909b]{height:24px;flex:0 0 auto;border:1px solid var(--sp-toolbar-border);border-radius:3px;background:transparent;color:var(--sp-toolbar-btn-color);cursor:pointer;font-size:12px;padding:0 8px;display:inline-flex;align-items:center;justify-content:center}.find-bar__btn[data-v-3120909b]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.find-bar__btn[data-v-3120909b]:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.find-bar__btn--icon[data-v-3120909b]{width:26px;padding:0}.find-bar__btn--icon svg[data-v-3120909b]{width:14px;height:14px}.find-bar__btn--close[data-v-3120909b]{width:26px;padding:0;margin-left:auto;border:none}.find-bar__btn--close svg[data-v-3120909b]{width:14px;height:14px}.nf-dialog__mask[data-v-39792a0b]{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-39792a0b]{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-39792a0b]{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid #ececec}.nf-dialog__title[data-v-39792a0b]{font-size:13px;font-weight:600}.nf-dialog__close[data-v-39792a0b]{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-39792a0b]:hover{background:#f0f0f0;color:#444}.nf-dialog__close svg[data-v-39792a0b]{width:14px;height:14px}.nf-dialog__body[data-v-39792a0b]{padding:12px 14px;display:flex;flex-direction:column;gap:10px}.nf-field[data-v-39792a0b]{display:flex;align-items:center;gap:8px}.nf-field--inline[data-v-39792a0b]{min-height:26px}.nf-field__label[data-v-39792a0b]{width:88px;min-width:88px;font-size:12px;color:#555}.nf-field__input[data-v-39792a0b]{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__input[data-v-39792a0b]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.nf-field__dropdown[data-v-39792a0b]{flex:1}.nf-field__dropdown[data-v-39792a0b] .sp-dropdown__trigger{border:1px solid #c0c0c0;background:#fff;color:#1a1a1a;padding:0 6px}.nf-field__dropdown[data-v-39792a0b] .sp-dropdown__trigger:hover{background:#f5f5f5}.nf-field__dropdown[data-v-39792a0b] .sp-dropdown__trigger--open{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.nf-field__textarea[data-v-39792a0b]{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-39792a0b]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.nf-checkbox[data-v-39792a0b]{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:#333;cursor:pointer}.nf-checkbox input[data-v-39792a0b]{margin:0;cursor:pointer}.nf-dialog__footer[data-v-39792a0b]{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 14px;border-top:1px solid #ececec}.nf-preview[data-v-39792a0b]{display:flex;flex-direction:column;gap:2px;min-width:0}.nf-preview__label[data-v-39792a0b]{font-size:11px;color:#888}.nf-preview__value[data-v-39792a0b]{font-size:13px;color:#1a1a1a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:180px}.nf-dialog__actions[data-v-39792a0b]{display:flex;gap:8px}.nf-btn[data-v-39792a0b]{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-39792a0b]:hover{background:#f0f0f0}.nf-btn--primary[data-v-39792a0b]{border-color:#0078d7;background:#0078d7;color:#fff}.nf-btn--primary[data-v-39792a0b]:hover{background:#0069c0}.nf-dialog-enter-active[data-v-39792a0b],.nf-dialog-leave-active[data-v-39792a0b]{transition:opacity .14s ease-out}.nf-dialog-enter-from[data-v-39792a0b],.nf-dialog-leave-to[data-v-39792a0b]{opacity:0}.nf-dialog-enter-active .nf-dialog[data-v-39792a0b],.nf-dialog-leave-active .nf-dialog[data-v-39792a0b]{transition:transform .14s ease-out}.nf-dialog-enter-from .nf-dialog[data-v-39792a0b],.nf-dialog-leave-to .nf-dialog[data-v-39792a0b]{transform:scale(.96)}.sort-confirm__mask[data-v-d26d5917]{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}.sort-confirm[data-v-d26d5917]{width:360px;max-width:calc(100vw - 32px);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}.sort-confirm__header[data-v-d26d5917]{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid #ececec}.sort-confirm__title[data-v-d26d5917]{font-size:13px;font-weight:600}.sort-confirm__close[data-v-d26d5917]{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}.sort-confirm__close[data-v-d26d5917]:hover{background:#f0f0f0;color:#444}.sort-confirm__close svg[data-v-d26d5917]{width:14px;height:14px}.sort-confirm__body[data-v-d26d5917]{padding:14px}.sort-confirm__message[data-v-d26d5917]{margin:0 0 12px;font-size:12px;line-height:1.5;color:#333}.sort-confirm__options[data-v-d26d5917]{display:flex;flex-direction:column;gap:8px}.sort-confirm__option[data-v-d26d5917]{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:#333;cursor:pointer}.sort-confirm__option input[data-v-d26d5917]{margin:0;cursor:pointer}.sort-confirm__footer[data-v-d26d5917]{display:flex;justify-content:flex-end;gap:8px;padding:10px 14px;border-top:1px solid #ececec}.sort-confirm__btn[data-v-d26d5917]{height:28px;padding:0 16px;border:1px solid #ccc;border-radius:3px;background:#fff;color:#333;font-size:12px;cursor:pointer;font-family:inherit}.sort-confirm__btn[data-v-d26d5917]:hover{background:#f0f0f0}.sort-confirm__btn--primary[data-v-d26d5917]{border-color:#0078d7;background:#0078d7;color:#fff}.sort-confirm__btn--primary[data-v-d26d5917]:hover{background:#0069c0}.sort-confirm-enter-active[data-v-d26d5917],.sort-confirm-leave-active[data-v-d26d5917]{transition:opacity .14s ease-out}.sort-confirm-enter-from[data-v-d26d5917],.sort-confirm-leave-to[data-v-d26d5917]{opacity:0}.sort-confirm-enter-active .sort-confirm[data-v-d26d5917],.sort-confirm-leave-active .sort-confirm[data-v-d26d5917]{transition:transform .14s ease-out}.sort-confirm-enter-from .sort-confirm[data-v-d26d5917],.sort-confirm-leave-to .sort-confirm[data-v-d26d5917]{transform:scale(.96)}.ifn-dialog__mask[data-v-f4e459b6]{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}.ifn-dialog[data-v-f4e459b6]{width:440px;max-width:calc(100vw - 32px);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}.ifn-dialog__header[data-v-f4e459b6]{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid #ececec}.ifn-dialog__title[data-v-f4e459b6]{font-size:13px;font-weight:600}.ifn-dialog__close[data-v-f4e459b6]{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}.ifn-dialog__close[data-v-f4e459b6]:hover{background:#f0f0f0;color:#444}.ifn-dialog__close svg[data-v-f4e459b6]{width:14px;height:14px}.ifn-dialog__body[data-v-f4e459b6]{padding:14px;display:flex;flex-direction:column;gap:12px}.ifn-dialog__field[data-v-f4e459b6]{display:flex;flex-direction:column;gap:6px}.ifn-dialog__label[data-v-f4e459b6]{font-size:12px;color:#333}.ifn-dialog__dropdown[data-v-f4e459b6]{width:100%}.ifn-dialog__dropdown[data-v-f4e459b6] .sp-dropdown__trigger{border:1px solid #c0c0c0;background:#fff;color:#1a1a1a;padding:0 6px}.ifn-dialog__dropdown[data-v-f4e459b6] .sp-dropdown__trigger:hover{background:#f5f5f5}.ifn-dialog__dropdown[data-v-f4e459b6] .sp-dropdown__trigger--open{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.ifn-dialog__desc[data-v-f4e459b6]{font-size:12px;line-height:1.5;color:#666;-webkit-user-select:text;user-select:text}.ifn-dialog__textarea[data-v-f4e459b6]{width:100%;height:84px;border:1px solid #c0c0c0;border-radius:3px;background:#fff;font-size:12px;line-height:1.5;color:#1a1a1a;padding:5px 6px;outline:none;box-sizing:border-box;font-family:Consolas,Menlo,monospace;resize:none;-webkit-user-select:text;user-select:text}.ifn-dialog__textarea[data-v-f4e459b6]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.ifn-dialog__footer[data-v-f4e459b6]{display:flex;justify-content:flex-end;gap:8px;padding:10px 14px;border-top:1px solid #ececec}.ifn-dialog__btn[data-v-f4e459b6]{height:28px;padding:0 16px;border:1px solid #ccc;border-radius:3px;background:#fff;color:#333;font-size:12px;cursor:pointer;font-family:inherit}.ifn-dialog__btn[data-v-f4e459b6]:hover{background:#f0f0f0}.ifn-dialog__btn--primary[data-v-f4e459b6]{border-color:#0078d7;background:#0078d7;color:#fff}.ifn-dialog__btn--primary[data-v-f4e459b6]:hover{background:#0069c0}.ifn-dialog__btn--primary[data-v-f4e459b6]:disabled,.ifn-dialog__btn--primary[data-v-f4e459b6]:disabled:hover{border-color:#ccc;background:#f0f0f0;color:#a8a8a8;cursor:not-allowed}.ifn-dialog-enter-active[data-v-f4e459b6],.ifn-dialog-leave-active[data-v-f4e459b6]{transition:opacity .14s ease-out}.ifn-dialog-enter-from[data-v-f4e459b6],.ifn-dialog-leave-to[data-v-f4e459b6]{opacity:0}.ifn-dialog-enter-active .ifn-dialog[data-v-f4e459b6],.ifn-dialog-leave-active .ifn-dialog[data-v-f4e459b6]{transition:transform .14s ease-out}.ifn-dialog-enter-from .ifn-dialog[data-v-f4e459b6],.ifn-dialog-leave-to .ifn-dialog[data-v-f4e459b6]{transform:scale(.96)}.spreadsheet-outer[data-v-a7c5466d]{flex:1;display:flex;flex-direction:column;overflow:hidden;height:100%;min-height:400px;width:100%}.formula-bar[data-v-a7c5466d]{display:flex;align-items:flex-start;min-height:36px;padding:0;gap:0}.formula-bar--expanded[data-v-a7c5466d]{min-height:72px}.formula-bar__cell-label[data-v-a7c5466d]{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-a7c5466d]{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-a7c5466d]{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-a7c5466d]{border-left:1px solid var(--sp-formula-bar-input-border)}.formula-bar__btn[data-v-a7c5466d]:hover{background:var(--sp-scroll-btn-hover-bg, #f0f0f0)}.formula-bar__btn--cancel[data-v-a7c5466d]:hover{color:#e53935;background:#fdecea}.formula-bar__btn--accept[data-v-a7c5466d]:hover{color:#2e7d32;background:#e8f5e9}.formula-bar__fx-label[data-v-a7c5466d]{font-family:Georgia,Times New Roman,serif;font-style:italic;font-weight:600;font-size:13px;line-height:1;-webkit-user-select:none;user-select:none}.formula-bar__btn--fx[data-v-a7c5466d]:hover{background:var(--sp-scroll-btn-hover-bg, #f0f0f0)}.formula-bar__input[data-v-a7c5466d]{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-a7c5466d]{height:68px;overflow:auto}.formula-bar__input[data-v-a7c5466d]: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-a7c5466d]{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-a7c5466d]:hover{background:var(--sp-scroll-btn-hover-bg, #e8e8e8)}.spreadsheet-wrapper[data-v-a7c5466d]{flex:1;position:relative;overflow:hidden;background:var(--sp-wrapper-bg)}.grid-canvas[data-v-a7c5466d]{position:absolute;top:0;left:0;display:block;outline:none;cursor:cell}.grid-canvas--freeze[data-v-a7c5466d]{pointer-events:none;z-index:1}.grid-canvas[data-v-a7c5466d]:not(.grid-canvas--freeze){z-index:0}.grid-canvas[data-v-a7c5466d]:focus{outline:none}.v-scrollbar[data-v-a7c5466d]{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-a7c5466d]{position:absolute;left:0;bottom:0;height:11px;width:calc(100% - 11px);display:flex;background:var(--sp-wrapper-bg)}.sb-corner[data-v-a7c5466d]{position:absolute;right:0;bottom:0;width:11px;height:11px;background:var(--sp-wrapper-bg)}.sb-btn[data-v-a7c5466d]{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-a7c5466d]:hover{background:var(--sp-scroll-btn-hover-bg, #d0d0d0)}.sb-btn[data-v-a7c5466d]:active{background:var(--sp-scroll-btn-active-bg, #c0c0c0)}.sb-arrow[data-v-a7c5466d]{display:block;width:0;height:0}.sb-arrow--up[data-v-a7c5466d]{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-a7c5466d]{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-a7c5466d]{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-a7c5466d]{border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:4px solid var(--sp-scroll-btn-color, #666)}.sb-track[data-v-a7c5466d]{flex:1;position:relative;background:var(--sp-scroll-track-bg, rgba(0,0,0,.06))}.sb-track--v[data-v-a7c5466d]{width:11px}.sb-track--h[data-v-a7c5466d]{height:11px}.sb-thumb[data-v-a7c5466d]{position:absolute;border-radius:3px;background:var(--sp-scroll-thumb);cursor:default}.sb-thumb[data-v-a7c5466d]:hover{background:var(--sp-scroll-thumb-hover)}.sb-thumb--v[data-v-a7c5466d]{left:1px;right:1px;min-height:16px}.sb-thumb--h[data-v-a7c5466d]{top:1px;bottom:1px;min-width:16px}.cell-editor[data-v-a7c5466d]{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 12px;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:8px;margin-right:-2px;width:12px;height:12px;fill:#888;flex:none}.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:not(.context-menu__item--disabled):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__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}
@@ -16,6 +16,8 @@ type __VLS_Props = {
16
16
  searchable?: boolean;
17
17
  /** 搜索框占位文本 */
18
18
  searchPlaceholder?: string;
19
+ /** 触发器固定图标(SVG 字符串):当 modelValue 未命中任何 option 时显示,优先级低于 current.icon */
20
+ triggerIcon?: string;
19
21
  };
20
22
  declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
21
23
  "update:modelValue": (v: string | number) => void;
@@ -37,6 +39,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
37
39
  fallbackLabel: string;
38
40
  searchable: boolean;
39
41
  searchPlaceholder: string;
42
+ triggerIcon: string;
40
43
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
41
44
  rootRef: HTMLDivElement;
42
45
  menuRef: HTMLDivElement;
@@ -2,14 +2,14 @@ type __VLS_Props = {
2
2
  modelOpen?: boolean;
3
3
  locale?: string;
4
4
  };
5
- declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
6
- cancel: () => any;
7
- "update:modelOpen": (v: boolean) => any;
8
- confirm: (expand: boolean) => any;
5
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
6
+ "update:modelOpen": (v: boolean) => void;
7
+ confirm: (v: boolean) => void;
8
+ cancel: () => void;
9
9
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
10
10
  onCancel?: (() => any) | undefined;
11
11
  "onUpdate:modelOpen"?: ((v: boolean) => any) | undefined;
12
- onConfirm?: ((expand: boolean) => any) | undefined;
12
+ onConfirm?: ((v: boolean) => any) | undefined;
13
13
  }>, {
14
14
  modelOpen: boolean;
15
15
  locale: string;
@@ -37,6 +37,8 @@ type __VLS_Props = {
37
37
  mergeMenuOpen: boolean;
38
38
  calcMenuOpen: boolean;
39
39
  isSingleCell: boolean;
40
+ /** 当前 worksheet 是否已有冻结行或列 */
41
+ hasFreeze: boolean;
40
42
  themeVars?: Record<string, string>;
41
43
  selNumberFormat: string;
42
44
  nfOptions: NFOption[];
@@ -76,6 +78,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
76
78
  "text-color-change": (v: string) => void;
77
79
  "fill-color-change": (v: string) => void;
78
80
  "number-format-change": (v: string) => void;
81
+ "freeze-change": (v: string) => void;
79
82
  "font-size-keydown": (ev: KeyboardEvent) => void;
80
83
  "update:font-size-menu-open": (v: boolean) => void;
81
84
  "update:text-color-menu-open": (v: boolean) => void;
@@ -120,6 +123,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
120
123
  "onText-color-change"?: ((v: string) => any) | undefined;
121
124
  "onFill-color-change"?: ((v: string) => any) | undefined;
122
125
  "onNumber-format-change"?: ((v: string) => any) | undefined;
126
+ "onFreeze-change"?: ((v: string) => any) | undefined;
123
127
  "onFont-size-keydown"?: ((ev: KeyboardEvent) => any) | undefined;
124
128
  "onUpdate:font-size-menu-open"?: ((v: boolean) => any) | undefined;
125
129
  "onUpdate:text-color-menu-open"?: ((v: boolean) => any) | undefined;
@@ -1,6 +1,6 @@
1
1
  import { type ComputedRef, type Ref } from 'vue';
2
2
  import { FormulaDeps } from '../core/formula';
3
- import type { CellCoord, CellData, CellStyle, SelectionRange, BorderStyle, BorderSide } from '../core/types';
3
+ import type { CellCoord, CellData, CellStyle, SelectionRange, BorderStyle, BorderSide, FreezePane, ViewportRegion } from '../core/types';
4
4
  /** 选区触发方式,影响「合并单元格是否扩大选区」。
5
5
  * - 'cell':单元格点击/拖动(默认)→ 保持现有 expandSelectionForMerges 行为
6
6
  * - 'row' :行头点击/拖动 → Excel 风格「穿透」合并,选区矩形保持用户点击的行范围
@@ -18,8 +18,18 @@ export interface CoreState {
18
18
  locale?: string;
19
19
  };
20
20
  locale: ComputedRef<string>;
21
+ /** 当前工作表逻辑有效列数(0-based exclusive),响应式,可在运行期动态增长 */
21
22
  colCount: number;
23
+ /** 当前工作表逻辑有效行数(0-based exclusive),响应式,可在运行期动态增长 */
22
24
  rowCount: number;
25
+ /** 按需扩展工作表逻辑范围:当 minCol+1 > colCount 或 minRow+1 > rowCount 时,
26
+ * 按缓冲增量将 dims 扩展到至少覆盖目标坐标,并用默认值补齐 colWidths/rowHeights。
27
+ * 不创建任何空 Cell,不收缩范围。 */
28
+ ensureCapacity: (minCol: number, minRow: number) => void;
29
+ /** 当前 colCount/rowCount 是否为动态扩展(与初始 props 不同),供加载逻辑判断 */
30
+ hasDynamicDims: () => boolean;
31
+ /** 直接设置当前工作表的逻辑范围(加载/撤销恢复等受控内部场景使用;会同时裁剪或补齐 colWidths/rowHeights) */
32
+ setDims: (colCount: number, rowCount: number) => void;
23
33
  cells: Record<string, CellData>;
24
34
  /** 表格级样式池(reactive 数组),styles[0] 始终为默认空样式 */
25
35
  styles: CellStyle[];
@@ -35,6 +45,33 @@ export interface CoreState {
35
45
  rowHeights: Ref<(number | undefined)[]>;
36
46
  scrollX: Ref<number>;
37
47
  scrollY: Ref<number>;
48
+ freeze: FreezePane;
49
+ setFreeze: (rows: number, cols: number) => void;
50
+ clearFreeze: () => void;
51
+ getFreeze: () => FreezePane;
52
+ /** 基于真实行高/列宽计算冻结区域尺寸 */
53
+ getFrozenMetrics: () => {
54
+ frozenRowsHeight: number;
55
+ frozenColumnsWidth: number;
56
+ };
57
+ /** 返回四个 viewport 区域(未冻结时 corner/rows/columns 尺寸为 0) */
58
+ getViewportRegions: () => ViewportRegion[];
59
+ /** 逻辑单元格 -> Canvas 屏幕矩形 */
60
+ cellToScreenRect: (row: number, col: number) => {
61
+ x: number;
62
+ y: number;
63
+ width: number;
64
+ height: number;
65
+ };
66
+ /** Canvas 屏幕坐标 -> 逻辑单元格 { col, row } | null */
67
+ screenToCell: (x: number, y: number) => {
68
+ col: number;
69
+ row: number;
70
+ } | null;
71
+ /** 判断单元格是否落在冻结区域 */
72
+ isCellFrozen: (row: number, col: number) => boolean;
73
+ /** 将单元格滚入 Body 可视区;冻结区域内不滚动 */
74
+ scrollCellIntoView: (row: number, col: number) => void;
38
75
  BASE_CELL_VPAD: number;
39
76
  fontMetricsCache: Map<string, {
40
77
  ascent: number;
@@ -7,6 +7,7 @@ import type { ContextMenuItem } from '../core/types';
7
7
  export interface InteractionsState {
8
8
  scheduleRender: () => void;
9
9
  render: () => void;
10
+ renderFrozenOverlay: () => void;
10
11
  activeCellLabel: ComputedRef<string>;
11
12
  formulaBarDisplay: ComputedRef<string>;
12
13
  formulaBarDraft: Ref<string>;
@@ -55,6 +56,8 @@ export interface InteractionsState {
55
56
  editInputStyle: ComputedRef<Record<string, string | number | undefined>>;
56
57
  hScrollbarW: ComputedRef<number>;
57
58
  vScrollbarH: ComputedRef<number>;
59
+ hScrollbarLeft: ComputedRef<number>;
60
+ vScrollbarTop: ComputedRef<number>;
58
61
  hTrackW: ComputedRef<number>;
59
62
  vTrackH: ComputedRef<number>;
60
63
  hThumbW: ComputedRef<number>;
@@ -31,7 +31,10 @@ export interface SheetsOpsState {
31
31
  dupSheet: (i: number) => number;
32
32
  moveSheet: (i: number, d: number) => void;
33
33
  sheetCount: ComputedRef<number>;
34
- mkSheet: (name: string) => SheetState;
34
+ mkSheet: (name: string, dims?: {
35
+ colCount?: number;
36
+ rowCount?: number;
37
+ }) => SheetState;
35
38
  emitModelData: () => void;
36
39
  scheduleOptEmit: () => void;
37
40
  themeColors: ComputedRef<ThemeColors>;
@@ -39,6 +42,7 @@ export interface SheetsOpsState {
39
42
  toolbarThemeVars: ComputedRef<Record<string, string>>;
40
43
  wrapperRef: Ref<HTMLDivElement | null>;
41
44
  canvasRef: Ref<HTMLCanvasElement | null>;
45
+ freezeCanvasRef: Ref<HTMLCanvasElement | null>;
42
46
  editInputRef: Ref<HTMLTextAreaElement | null>;
43
47
  formulaBarRef: Ref<HTMLTextAreaElement | null>;
44
48
  viewSize: {
@@ -92,7 +92,10 @@ export declare function createUndoStyles(s: CoreState, sheetsCtx: {
92
92
  activeSheetIndex: Ref<number>;
93
93
  saveSheet: () => void;
94
94
  loadSheet: (i: number) => void;
95
- mkSheet: (name: string) => SheetState;
95
+ mkSheet: (name: string, dims?: {
96
+ colCount?: number;
97
+ rowCount?: number;
98
+ }) => SheetState;
96
99
  }): UndoStylesState;
97
100
  export declare function bindMenuRefs(us: UndoStylesState, refs: {
98
101
  borderMenuOpen?: Ref<boolean>;
@@ -85,6 +85,11 @@ export interface SpreadsheetData {
85
85
  style?: CellStyle;
86
86
  };
87
87
  }
88
+ /** 冻结窗格状态:rows/cols 为冻结的行数/列数(0 表示该方向未冻结) */
89
+ export interface FreezePane {
90
+ rows: number;
91
+ cols: number;
92
+ }
88
93
  export interface SheetModelData {
89
94
  name: string;
90
95
  /** 表格级样式池:styles[0] 始终为默认空样式 {} */
@@ -99,6 +104,12 @@ export interface SheetModelData {
99
104
  merges?: Record<string, SelectionRange>;
100
105
  colWidths?: Record<number, number>;
101
106
  rowHeights?: Record<number, number>;
107
+ /** 工作表逻辑有效列数(0-based exclusive)。缺失时回退到默认 26 */
108
+ colCount?: number;
109
+ /** 工作表逻辑有效行数(0-based exclusive)。缺失时回退到默认 200 */
110
+ rowCount?: number;
111
+ /** 冻结窗格状态;缺省视为未冻结 { rows: 0, cols: 0 } */
112
+ freeze?: FreezePane;
102
113
  }
103
114
  export interface SheetState {
104
115
  id: string;
@@ -115,6 +126,22 @@ export interface SheetState {
115
126
  scrollY: number;
116
127
  colWidths: number[];
117
128
  rowHeights: (number | undefined)[];
129
+ /** 工作表逻辑有效列数(0-based exclusive)。随操作动态增长 */
130
+ colCount: number;
131
+ /** 工作表逻辑有效行数(0-based exclusive)。随操作动态增长 */
132
+ rowCount: number;
133
+ /** 冻结窗格状态(默认 { rows: 0, cols: 0 } 表示未冻结) */
134
+ freeze: FreezePane;
135
+ }
136
+ /** 视口区域:冻结窗格将画布划分为四个独立滚动区域 */
137
+ export interface ViewportRegion {
138
+ kind: 'corner' | 'rows' | 'columns' | 'body';
139
+ x: number;
140
+ y: number;
141
+ width: number;
142
+ height: number;
143
+ scrollLeft: number;
144
+ scrollTop: number;
118
145
  }
119
146
  export interface UndoSnapshot {
120
147
  cells: Record<string, CellData>;