xiaodao-spreader 0.1.21 → 0.1.26

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
@@ -27,6 +27,8 @@
27
27
  - **撤销 / 重做** — 单元格、列宽、行高的完整状态快照(50 步)
28
28
  - **格式刷** — 复制并应用单元格格式到任意区域
29
29
  - **数字格式** — Excel 风格数字格式(常规 / 文本 / 数值 / 货币 / 会计 / 百分比 / 科学计数 / 日期 / 时间 / 日期时间 / 持续时间),提供自定义格式对话框;仅影响显示,绝不修改底层单元格值
30
+ - **智能数据识别** — 输入 `100%`、`1,234`、`¥1,234.56` 等带符号数字文本时自动识别为数值并套用对应格式;常见日期时间文本自动识别为日期,与 Excel 输入语义一致
31
+ - **排序与排序提醒** — 工具栏与右键菜单按单元格**展示内容**对所有类型(数值 / 日期 / 文本)排序;排序只移动数据、不搬运样式;含合并单元格或公式的区域自动禁用排序;当选区外存在相邻数据时,弹出类 Excel 的「排序提醒」对话框,可选择「扩展选定区域」或「仅对选定区域排序」
30
32
  - **查找与替换** — 工具栏查找按钮或 `Ctrl/Cmd+F`(含 `Ctrl/Cmd+H`)打开;支持「当前工作表 / 整个工作簿 / 当前选区」三种范围,区分大小写、匹配整个单元格;高亮全部匹配并定位当前项、循环查找;单次与全部替换均接入撤销/重做,仅修改单元格原始 `value`(始终保持字符串),不改动格式 / 边框 / 合并
31
33
 
32
34
  ### 交互体验
@@ -462,7 +464,7 @@ pnpm build:demo
462
464
  - [ ] 冻结窗格(冻结行/列)
463
465
  - [ ] 数据验证(下拉列表、输入约束)
464
466
  - [ ] 行列分组与折叠
465
- - [ ] 排序与筛选
467
+ - [x] 排序与筛选 —— 按展示内容排序,含类 Excel「排序提醒」对话框(扩展选定区域 / 仅对选定区域排序);见 [排序与排序提醒](#功能特性)
466
468
  - [ ] 单元格批注
467
469
  - [ ] 打印布局
468
470
 
package/README.md CHANGED
@@ -26,6 +26,8 @@ A high-performance, canvas-based spreadsheet component for Vue 3 — bringing an
26
26
  - **Undo / Redo** — Full state snapshots for cells, column widths, and row heights (50 steps)
27
27
  - **Format Painter** — Copy & apply cell formatting across ranges
28
28
  - **Number Format** — Excel-style number formatting (General / Text / Number / Currency / Accounting / Percent / Scientific / Date / Time / DateTime / Duration) with a custom format dialog; display-only, never mutates the stored cell value
29
+ - **Smart Data Recognition** — Typing `100%`, `1,234`, `¥1,234.56` auto-converts the text to a number and applies the matching format; common date/time text auto-converts to dates — matching Excel input behavior
30
+ - **Sorting & Sort Warning** — Sort any column by its **displayed content** (numbers / dates / text); sorting moves data only, never cell styles; ranges containing merged cells or formulas are auto-disabled; when adjacent data sits outside the selection, an Excel-style **Sort Warning** dialog lets you choose "Expand the selection" or "Sort the current selection only"
29
31
  - **Find & Replace** — Open via the toolbar find button or `Ctrl/Cmd+F` (also `Ctrl/Cmd+H`); three scopes — current sheet / entire workbook / current selection; match case and match entire cell; highlights all matches and locates the active one with wrap-around navigation; single and replace-all both integrate with undo/redo, mutating only the raw `value` (always kept a string), never format / border / merge
30
32
 
31
33
  ### Interaction
@@ -459,7 +461,7 @@ The project includes a GitHub Actions workflow (`.github/workflows/publish.yml`)
459
461
  - [ ] Frozen panes (freeze rows/columns)
460
462
  - [ ] Data validation (dropdown lists, input constraints)
461
463
  - [ ] Column / row grouping and collapsing
462
- - [ ] Sort & filter
464
+ - [x] Sort & filter — sort by displayed content with Excel-style Sort Warning dialog (expand selection / current selection only); see [Sorting & Sort Warning](#features)
463
465
  - [ ] Cell comments / notes
464
466
  - [ ] Print layout
465
467
 
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .sp-dropdown[data-v-0152ad1e]{position:relative;display:inline-flex;min-width:0}.sp-dropdown__trigger[data-v-0152ad1e]{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-0152ad1e]:hover{background:var(--sp-toolbar-btn-hover-bg, #e6e6e6)}.sp-dropdown__trigger--open[data-v-0152ad1e]{background:var(--sp-toolbar-btn-hover-bg, #e6e6e6);border-color:var(--sp-toolbar-border, #d8d8d8)}.sp-dropdown__value[data-v-0152ad1e]{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.sp-dropdown__caret[data-v-0152ad1e]{width:10px;height:10px;min-width:10px;opacity:.7}.sp-dropdown__menu[data-v-0152ad1e]{position:fixed;z-index:20000;display:flex;flex-direction:column;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;box-shadow:0 4px 12px #0000001f;padding:4px;box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;transform-origin:top center}.sp-dropdown__menu--up[data-v-0152ad1e]{transform-origin:bottom center}.menu-pop-enter-active[data-v-0152ad1e],.menu-pop-leave-active[data-v-0152ad1e]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-0152ad1e],.menu-pop-leave-to[data-v-0152ad1e]{opacity:0;transform:scaleY(.85)}.sp-dropdown__nav[data-v-0152ad1e]{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-0152ad1e]:hover:not(:disabled){background:#eef3f9}.sp-dropdown__nav[data-v-0152ad1e]:disabled{color:#ccc;cursor:default}.sp-dropdown__nav svg[data-v-0152ad1e]{width:10px;height:10px}.sp-dropdown__list[data-v-0152ad1e]{display:flex;flex-direction:column;overflow:hidden;touch-action:none}.sp-dropdown__icon[data-v-0152ad1e]{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.sp-dropdown__icon[data-v-0152ad1e] svg{width:18px;height:18px;display:block}.sp-dropdown__item-icon[data-v-0152ad1e]{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.sp-dropdown__item-icon[data-v-0152ad1e] svg{width:16px;height:16px;display:block}.sp-dropdown__item-label[data-v-0152ad1e]{white-space:nowrap}.sp-dropdown__item[data-v-0152ad1e]{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-0152ad1e]:hover{background:#eef3f9}.sp-dropdown__item--active[data-v-0152ad1e]{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)}.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-94d2ccc1]{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-94d2ccc1]{display:flex;align-items:center;flex:0 0 auto}.toolbar-sep[data-v-94d2ccc1]{width:1px;height:18px;margin:0 4px;background:var(--sp-toolbar-border)}.toolbar-font[data-v-94d2ccc1],.toolbar-number-format[data-v-94d2ccc1],.toolbar-align[data-v-94d2ccc1]{flex:0 0 auto}.toolbar-font-size[data-v-94d2ccc1]{display:inline-flex;align-items:center;gap:0;height:26px;position:relative}.toolbar-font-size__input[data-v-94d2ccc1]{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-94d2ccc1]::-webkit-outer-spin-button,.toolbar-font-size__input[data-v-94d2ccc1]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.toolbar-font-size__input[data-v-94d2ccc1]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__input[data-v-94d2ccc1]:focus{border-color:var(--sp-toolbar-border);background:#fff}.toolbar-font-size__btn[data-v-94d2ccc1]{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-94d2ccc1]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__btn svg[data-v-94d2ccc1]{width:10px;height:10px}.toolbar-font-size__dropdown[data-v-94d2ccc1]{position:absolute;width:56px;height:26px;pointer-events:none}.toolbar-btn[data-v-94d2ccc1]{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-94d2ccc1]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-btn[data-v-94d2ccc1]:active:not(:disabled){opacity:.7}.toolbar-btn--active[data-v-94d2ccc1]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-btn--step[data-v-94d2ccc1]{width:26px;height:26px}.toolbar-btn--step svg[data-v-94d2ccc1]{width:16px;height:16px}.toolbar-btn[data-v-94d2ccc1]:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.toolbar-btn__icon[data-v-94d2ccc1]{width:18px;height:18px}.toolbar-btn svg[data-v-94d2ccc1]:not(.toolbar-btn__icon){width:18px;height:18px}.toolbar-split[data-v-94d2ccc1]{display:inline-flex;align-items:center;position:relative;height:26px}.toolbar-split__main[data-v-94d2ccc1]{border:1px solid transparent;border-right:none;border-radius:3px 0 0 3px}.toolbar-split__arrow[data-v-94d2ccc1]{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-94d2ccc1]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-split__arrow svg[data-v-94d2ccc1]{width:10px!important;height:10px!important}.toolbar-more[data-v-94d2ccc1]{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-94d2ccc1]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-more--active[data-v-94d2ccc1]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-more svg[data-v-94d2ccc1]{width:18px;height:18px}.overflow-menu[data-v-94d2ccc1]{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-94d2ccc1]{transition:none!important}.overflow-menu .tb-item[data-v-94d2ccc1]{width:100%}.overflow-menu .toolbar-sep[data-v-94d2ccc1]{width:100%;height:1px;margin:2px 0}.overflow-menu .toolbar-split[data-v-94d2ccc1]{width:100%}.overflow-menu .toolbar-split__main[data-v-94d2ccc1]{flex:1 1 auto;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-font-size[data-v-94d2ccc1]{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font[data-v-94d2ccc1],.overflow-menu .toolbar-number-format[data-v-94d2ccc1],.overflow-menu .toolbar-align[data-v-94d2ccc1]{width:100%}.overflow-menu .toolbar-btn[data-v-94d2ccc1]:not(.toolbar-btn--step):not(.toolbar-split__arrow){width:100%;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-color[data-v-94d2ccc1]{width:100%}.overflow-menu .toolbar-wrap[data-v-94d2ccc1]{width:100%;justify-content:flex-start}.menu-pop-enter-active[data-v-94d2ccc1],.menu-pop-leave-active[data-v-94d2ccc1]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-94d2ccc1],.menu-pop-leave-to[data-v-94d2ccc1]{opacity:0;transform:scale(.9)}.overflow-menu .tb-item{width:100%}.overflow-menu .toolbar-sep{width:100%;height:1px;margin:2px 0}.overflow-menu .toolbar-split{width:100%}.overflow-menu .toolbar-split__main{flex:1 1 auto;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-font-size{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font,.overflow-menu .toolbar-number-format,.overflow-menu .toolbar-align{width:100%}.overflow-menu .toolbar-btn:not(.toolbar-btn--step):not(.toolbar-split__arrow){width:100%;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-color{width:100%}.overflow-menu .toolbar-wrap{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font-size__input{flex:1 1 auto;width:auto;min-width:40px}.overflow-menu .toolbar-btn:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-btn:active:not(:disabled){opacity:.7}.overflow-menu .toolbar-btn--active{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.overflow-menu .toolbar-btn:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.overflow-menu .toolbar-split__main:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-split__arrow:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-font-size__input:hover{background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-font-size__input:focus{border-color:var(--sp-toolbar-border);background:#fff}.overflow-menu .toolbar-font-size__btn:hover,.overflow-menu .toolbar-more:hover{background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-more--active{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.tab-bar[data-v-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-8d54f890]{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-8d54f890]{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-8d54f890]:focus{border-color:var(--sp-toolbar-btn-active-color)}.find-bar__select[data-v-8d54f890]{height:24px;flex:0 0 auto;border:1px solid var(--sp-toolbar-border);border-radius:3px;background:#fff;font-size:12px;color:var(--sp-formula-bar-input-color, #1a1a1a);outline:none;padding:0 2px}.find-bar__chk[data-v-8d54f890]{display:flex;align-items:center;gap:3px;flex:0 0 auto;font-size:12px;color:var(--sp-toolbar-btn-color);white-space:nowrap;cursor:pointer}.find-bar__chk input[data-v-8d54f890]{margin:0}.find-bar__count[data-v-8d54f890]{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-8d54f890]{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-8d54f890]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.find-bar__btn[data-v-8d54f890]:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.find-bar__btn--icon[data-v-8d54f890]{width:26px;padding:0}.find-bar__btn--icon svg[data-v-8d54f890]{width:14px;height:14px}.find-bar__btn--close[data-v-8d54f890]{width:26px;padding:0;margin-left:auto}.find-bar__btn--close svg[data-v-8d54f890]{width:14px;height:14px}.nf-dialog__mask[data-v-75101bf8]{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-75101bf8]{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-75101bf8]{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid #ececec}.nf-dialog__title[data-v-75101bf8]{font-size:13px;font-weight:600}.nf-dialog__close[data-v-75101bf8]{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-75101bf8]:hover{background:#f0f0f0;color:#444}.nf-dialog__close svg[data-v-75101bf8]{width:14px;height:14px}.nf-dialog__body[data-v-75101bf8]{padding:12px 14px;display:flex;flex-direction:column;gap:10px}.nf-field[data-v-75101bf8]{display:flex;align-items:center;gap:8px}.nf-field--inline[data-v-75101bf8]{min-height:26px}.nf-field__label[data-v-75101bf8]{width:88px;min-width:88px;font-size:12px;color:#555}.nf-field__select[data-v-75101bf8],.nf-field__input[data-v-75101bf8]{flex:1;height:26px;border:1px solid #c0c0c0;border-radius:3px;background:#fff;font-size:12px;color:#1a1a1a;padding:0 6px;outline:none;box-sizing:border-box;font-family:inherit}.nf-field__select[data-v-75101bf8]:focus,.nf-field__input[data-v-75101bf8]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.nf-field__textarea[data-v-75101bf8]{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-75101bf8]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.nf-checkbox[data-v-75101bf8]{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:#333;cursor:pointer}.nf-checkbox input[data-v-75101bf8]{margin:0;cursor:pointer}.nf-dialog__footer[data-v-75101bf8]{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 14px;border-top:1px solid #ececec}.nf-preview[data-v-75101bf8]{display:flex;flex-direction:column;gap:2px;min-width:0}.nf-preview__label[data-v-75101bf8]{font-size:11px;color:#888}.nf-preview__value[data-v-75101bf8]{font-size:13px;color:#1a1a1a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:180px}.nf-dialog__actions[data-v-75101bf8]{display:flex;gap:8px}.nf-btn[data-v-75101bf8]{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-75101bf8]:hover{background:#f0f0f0}.nf-btn--primary[data-v-75101bf8]{border-color:#0078d7;background:#0078d7;color:#fff}.nf-btn--primary[data-v-75101bf8]:hover{background:#0069c0}.nf-dialog-enter-active[data-v-75101bf8],.nf-dialog-leave-active[data-v-75101bf8]{transition:opacity .14s ease-out}.nf-dialog-enter-from[data-v-75101bf8],.nf-dialog-leave-to[data-v-75101bf8]{opacity:0}.nf-dialog-enter-active .nf-dialog[data-v-75101bf8],.nf-dialog-leave-active .nf-dialog[data-v-75101bf8]{transition:transform .14s ease-out}.nf-dialog-enter-from .nf-dialog[data-v-75101bf8],.nf-dialog-leave-to .nf-dialog[data-v-75101bf8]{transform:scale(.96)}.spreadsheet-outer[data-v-e9e7c7f1]{flex:1;display:flex;flex-direction:column;overflow:hidden;height:100%;min-height:400px;width:100%}.formula-bar[data-v-e9e7c7f1]{display:flex;align-items:flex-start;min-height:36px;padding:0;gap:0}.formula-bar--expanded[data-v-e9e7c7f1]{min-height:72px}.formula-bar__cell-label[data-v-e9e7c7f1]{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-e9e7c7f1]{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-e9e7c7f1]{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-e9e7c7f1]{border-left:1px solid var(--sp-formula-bar-input-border)}.formula-bar__btn[data-v-e9e7c7f1]:hover{background:var(--sp-scroll-btn-hover-bg, #f0f0f0)}.formula-bar__btn--cancel[data-v-e9e7c7f1]:hover{color:#e53935;background:#fdecea}.formula-bar__btn--accept[data-v-e9e7c7f1]:hover{color:#2e7d32;background:#e8f5e9}.formula-bar__input[data-v-e9e7c7f1]{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-e9e7c7f1]{height:68px;overflow:auto}.formula-bar__input[data-v-e9e7c7f1]: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-e9e7c7f1]{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-e9e7c7f1]:hover{background:var(--sp-scroll-btn-hover-bg, #e8e8e8)}.spreadsheet-wrapper[data-v-e9e7c7f1]{flex:1;position:relative;overflow:hidden;background:var(--sp-wrapper-bg)}.grid-canvas[data-v-e9e7c7f1]{position:absolute;top:0;left:0;display:block;outline:none;cursor:cell}.grid-canvas[data-v-e9e7c7f1]:focus{outline:none}.v-scrollbar[data-v-e9e7c7f1]{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-e9e7c7f1]{position:absolute;left:0;bottom:0;height:11px;width:calc(100% - 11px);display:flex;background:var(--sp-wrapper-bg)}.sb-corner[data-v-e9e7c7f1]{position:absolute;right:0;bottom:0;width:11px;height:11px;background:var(--sp-wrapper-bg)}.sb-btn[data-v-e9e7c7f1]{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-e9e7c7f1]:hover{background:var(--sp-scroll-btn-hover-bg, #d0d0d0)}.sb-btn[data-v-e9e7c7f1]:active{background:var(--sp-scroll-btn-active-bg, #c0c0c0)}.sb-arrow[data-v-e9e7c7f1]{display:block;width:0;height:0}.sb-arrow--up[data-v-e9e7c7f1]{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-e9e7c7f1]{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-e9e7c7f1]{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-e9e7c7f1]{border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:4px solid var(--sp-scroll-btn-color, #666)}.sb-track[data-v-e9e7c7f1]{flex:1;position:relative;background:var(--sp-scroll-track-bg, rgba(0,0,0,.06))}.sb-track--v[data-v-e9e7c7f1]{width:11px}.sb-track--h[data-v-e9e7c7f1]{height:11px}.sb-thumb[data-v-e9e7c7f1]{position:absolute;border-radius:3px;background:var(--sp-scroll-thumb);cursor:default}.sb-thumb[data-v-e9e7c7f1]:hover{background:var(--sp-scroll-thumb-hover)}.sb-thumb--v[data-v-e9e7c7f1]{left:1px;right:1px;min-height:16px}.sb-thumb--h[data-v-e9e7c7f1]{top:1px;bottom:1px;min-width:16px}.cell-editor[data-v-e9e7c7f1]{position:absolute;border:2px solid var(--sp-cell-editor-border);outline:none;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;font-size:13px;color:var(--sp-cell-editor-color);background:var(--sp-cell-editor-bg);box-shadow:0 0 0 1px var(--sp-cell-editor-shadow);z-index:10;box-sizing:border-box;min-width:0;overflow:hidden;padding:0;margin:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;resize:none;white-space:pre-wrap;word-break:break-all}.context-menu{position:fixed;z-index:10000;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;padding:4px 0;min-width:120px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;font-size:13px;transform-origin:top left}.context-menu__item{padding:6px 20px;cursor:pointer;color:#333;white-space:nowrap;position:relative;display:flex;align-items:center;justify-content:space-between}.context-menu__item:hover{background:#e8f0fe}.context-menu__item--disabled{color:#bbb;cursor:default}.context-menu__item--disabled:hover{background:transparent}.context-menu__arrow{margin-left:16px;margin-right:-5px;width:0;height:0;border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:4px solid #888}.context-submenu{display:none;position:absolute;left:100%;top:-4px;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;padding:4px 0;min-width:100px;z-index:10001}.context-submenu--left{left:auto;right:100%}.context-menu__item:hover>.context-submenu{display:block}.context-submenu .context-menu__item{justify-content:flex-start}.menu-pop-enter-active,.menu-pop-leave-active{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from,.menu-pop-leave-to{opacity:0;transform:scale(.9)}.dim-panel{position:fixed;z-index:10002;width:220px;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;padding:10px 12px;box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;-webkit-user-select:none;user-select:none;transform-origin:top left}.dim-panel__title{font-size:13px;font-weight:600;color:#333;margin-bottom:8px}.dim-panel__body{display:flex;align-items:center;gap:6px}.dim-panel__input{flex:1;height:26px;border:1px solid #c0c0c0;border-radius:3px;outline:none;padding:0 6px;font-size:13px;color:#1a1a1a;background:#fff;box-sizing:border-box}.dim-panel__input:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.dim-panel__input--error{border-color:#d93025;box-shadow:0 0 0 1px #d930254d}.dim-panel__unit{font-size:12px;color:#888}.dim-panel__error{margin-top:6px;font-size:12px;color:#d93025;line-height:1.4}.dim-panel__footer{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}.dim-panel__btn{height:26px;padding:0 14px;border:1px solid #ccc;border-radius:3px;background:#fff;color:#333;font-size:13px;cursor:pointer}.dim-panel__btn:hover{background:#f0f0f0}.dim-panel__btn--primary{border-color:#0078d7;background:#0078d7;color:#fff}.dim-panel__btn--primary:hover{background:#0069c0}
1
+ .sp-dropdown[data-v-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}
@@ -12,6 +12,10 @@ type __VLS_Props = {
12
12
  triggerEl?: HTMLElement | null;
13
13
  /** 当前值未命中任何选项时触发器显示的占位文本(如选区格式不一致时的「混合」) */
14
14
  fallbackLabel?: string;
15
+ /** 是否启用菜单内搜索框(仅按 label 实时过滤,不改变选中,须点击菜单项才算数) */
16
+ searchable?: boolean;
17
+ /** 搜索框占位文本 */
18
+ searchPlaceholder?: string;
15
19
  };
16
20
  declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
17
21
  "update:modelValue": (v: string | number) => void;
@@ -31,9 +35,12 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
31
35
  align: "left" | "right";
32
36
  triggerEl: HTMLElement | null;
33
37
  fallbackLabel: string;
38
+ searchable: boolean;
39
+ searchPlaceholder: string;
34
40
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
35
41
  rootRef: HTMLDivElement;
36
42
  menuRef: HTMLDivElement;
43
+ searchInputRef: HTMLInputElement;
37
44
  listRef: HTMLDivElement;
38
45
  }, HTMLDivElement>;
39
46
  export default _default;
@@ -0,0 +1,20 @@
1
+ type __VLS_Props = {
2
+ modelOpen?: boolean;
3
+ locale?: string;
4
+ };
5
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
6
+ insert: (text: string) => any;
7
+ cancel: () => any;
8
+ "update:modelOpen": (v: boolean) => any;
9
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
10
+ onInsert?: ((text: string) => any) | undefined;
11
+ onCancel?: (() => any) | undefined;
12
+ "onUpdate:modelOpen"?: ((v: boolean) => any) | undefined;
13
+ }>, {
14
+ modelOpen: boolean;
15
+ locale: string;
16
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
17
+ dialogRef: HTMLDivElement;
18
+ textareaRef: HTMLTextAreaElement;
19
+ }, any>;
20
+ export default _default;
@@ -0,0 +1,19 @@
1
+ type __VLS_Props = {
2
+ modelOpen?: boolean;
3
+ locale?: string;
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;
9
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
10
+ onCancel?: (() => any) | undefined;
11
+ "onUpdate:modelOpen"?: ((v: boolean) => any) | undefined;
12
+ onConfirm?: ((expand: boolean) => any) | undefined;
13
+ }>, {
14
+ modelOpen: boolean;
15
+ locale: string;
16
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
17
+ dialogRef: HTMLDivElement;
18
+ }, any>;
19
+ export default _default;
@@ -0,0 +1,29 @@
1
+ import type { SortOrder } from '../../core/sort-core';
2
+ type __VLS_Props = {
3
+ modelOpen?: boolean;
4
+ locale?: string;
5
+ currentSort?: SortOrder;
6
+ triggerEl?: HTMLElement | null;
7
+ };
8
+ declare function openMenu(): void;
9
+ declare function close(): void;
10
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {
11
+ open: import("vue").Ref<boolean, boolean>;
12
+ openMenu: typeof openMenu;
13
+ close: typeof close;
14
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
15
+ change: (v: SortOrder) => any;
16
+ "update:modelOpen": (v: boolean) => any;
17
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
18
+ onChange?: ((v: SortOrder) => any) | undefined;
19
+ "onUpdate:modelOpen"?: ((v: boolean) => any) | undefined;
20
+ }>, {
21
+ modelOpen: boolean;
22
+ triggerEl: HTMLElement | null;
23
+ locale: string;
24
+ currentSort: SortOrder;
25
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
26
+ rootRef: HTMLDivElement;
27
+ menuRef: HTMLDivElement;
28
+ }, HTMLDivElement>;
29
+ export default _default;
@@ -1,6 +1,7 @@
1
1
  import type { FontOption, MergeType } from '../core/constants';
2
2
  import { type NFOption } from '../core/number-format';
3
3
  import { type BorderType } from './pickers/borderPicker.vue';
4
+ import type { SortOrder } from '../core/sort-core';
4
5
  type __VLS_Props = {
5
6
  locale: string;
6
7
  canUndo: boolean;
@@ -25,6 +26,9 @@ type __VLS_Props = {
25
26
  cachedFillColor: string;
26
27
  borderMenuOpen: boolean;
27
28
  cachedBorder: BorderType;
29
+ sortMenuOpen: boolean;
30
+ cachedSortOrder: SortOrder;
31
+ canSort: boolean;
28
32
  selHAlign: string;
29
33
  selVAlign: string;
30
34
  selWrap: boolean;
@@ -56,6 +60,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
56
60
  "apply-text-color": () => void;
57
61
  "apply-fill-color": () => void;
58
62
  "apply-border": () => void;
63
+ "apply-sort": () => void;
59
64
  "wrap-toggle": () => void;
60
65
  "apply-merge": () => void;
61
66
  "calc-sum": () => void;
@@ -76,9 +81,11 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
76
81
  "update:text-color-menu-open": (v: boolean) => void;
77
82
  "update:fill-color-menu-open": (v: boolean) => void;
78
83
  "update:border-menu-open": (v: boolean) => void;
84
+ "update:sort-menu-open": (v: boolean) => void;
79
85
  "update:merge-menu-open": (v: boolean) => void;
80
86
  "update:calc-menu-open": (v: boolean) => void;
81
87
  "border-change": (v: BorderType) => void;
88
+ "sort-change": (v: SortOrder) => void;
82
89
  "merge-change": (v: MergeType) => void;
83
90
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
84
91
  onUndo?: (() => any) | undefined;
@@ -97,6 +104,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
97
104
  "onApply-text-color"?: (() => any) | undefined;
98
105
  "onApply-fill-color"?: (() => any) | undefined;
99
106
  "onApply-border"?: (() => any) | undefined;
107
+ "onApply-sort"?: (() => any) | undefined;
100
108
  "onWrap-toggle"?: (() => any) | undefined;
101
109
  "onApply-merge"?: (() => any) | undefined;
102
110
  "onCalc-sum"?: (() => any) | undefined;
@@ -117,9 +125,11 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
117
125
  "onUpdate:text-color-menu-open"?: ((v: boolean) => any) | undefined;
118
126
  "onUpdate:fill-color-menu-open"?: ((v: boolean) => any) | undefined;
119
127
  "onUpdate:border-menu-open"?: ((v: boolean) => any) | undefined;
128
+ "onUpdate:sort-menu-open"?: ((v: boolean) => any) | undefined;
120
129
  "onUpdate:merge-menu-open"?: ((v: boolean) => any) | undefined;
121
130
  "onUpdate:calc-menu-open"?: ((v: boolean) => any) | undefined;
122
131
  "onBorder-change"?: ((v: BorderType) => any) | undefined;
132
+ "onSort-change"?: ((v: SortOrder) => any) | undefined;
123
133
  "onMerge-change"?: ((v: MergeType) => any) | undefined;
124
134
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
125
135
  rootEl: HTMLDivElement;
@@ -129,6 +139,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
129
139
  borderArrowRef: HTMLButtonElement;
130
140
  mergeArrowRef: HTMLButtonElement;
131
141
  calcArrowRef: HTMLButtonElement;
142
+ sortArrowRef: HTMLButtonElement;
132
143
  moreBtnEl: HTMLButtonElement;
133
144
  overflowMenuEl: HTMLDivElement;
134
145
  }, any>;
@@ -17,6 +17,7 @@ export interface InteractionsState {
17
17
  onFormulaBarBlur: () => void;
18
18
  acceptFormulaBarEdit: () => void;
19
19
  cancelFormulaBarEdit: () => void;
20
+ insertFunctionIntoCell: (text: string) => void;
20
21
  renTab: Ref<number | null>;
21
22
  renTabVal: Ref<string>;
22
23
  onTabClick: (i: number) => void;
@@ -1,5 +1,6 @@
1
1
  import { type Ref, type ComputedRef } from 'vue';
2
- import type { ThemeColors, SheetState, SheetModelData } from '../core/types';
2
+ import type { ThemeColors, SheetState, SheetModelData, SelectionRange } from '../core/types';
3
+ import { type SortOrder } from '../core/sort-core';
3
4
  import type { CoreState } from './core-state';
4
5
  import type { UndoStylesState } from './undo-styles';
5
6
  export interface SheetsOpsState {
@@ -7,6 +8,18 @@ export interface SheetsOpsState {
7
8
  insertRows: (rS: number, rE: number) => void;
8
9
  insertCols: (cS: number, cE: number) => void;
9
10
  deleteCols: (cS: number, cE: number) => void;
11
+ sortSelectedColumns: (order: SortOrder, range?: SelectionRange) => void;
12
+ canSortColumns: (sC: number, eC: number) => boolean;
13
+ sortMenuOpen: Ref<boolean>;
14
+ /** 上一次使用的排序方向:功能按钮默认升序,从下拉选择后记忆该项 */
15
+ cachedSortOrder: Ref<SortOrder>;
16
+ onSortMenuToggle: (v: boolean) => void;
17
+ onSortChange: (order: SortOrder) => void;
18
+ applyCachedSort: () => void;
19
+ sortConfirmOpen: Ref<boolean>;
20
+ prepareSortConfirmation: (order: SortOrder) => boolean;
21
+ confirmSort: (expand: boolean) => void;
22
+ cancelSortConfirmation: () => void;
10
23
  sheets: Ref<SheetState[]>;
11
24
  activeSheetIndex: Ref<number>;
12
25
  saveSheet: () => void;
@@ -6,6 +6,21 @@ import type { CellData } from './types';
6
6
  * - null:求值时出现错误(循环引用、参数非法、未找到等),渲染为 #ERROR
7
7
  */
8
8
  export type FormulaValue = string | number | null;
9
+ /** 插入函数对话框可选的公式预设(与 dispatch 支持的函数保持一致) */
10
+ export declare const FORMULA_PRESETS: {
11
+ name: string;
12
+ snippet: string;
13
+ }[];
14
+ /** 公式结构校验结果:ok=结构合法可求值;name=顶层函数名(大写),无法识别结构时为 null */
15
+ export interface FormulaCheck {
16
+ ok: boolean;
17
+ name: string | null;
18
+ }
19
+ /**
20
+ * 校验公式文本结构:以 = 开头、=FUNC(args) 顶层结构、FUNC 受支持、
21
+ * 括号配平、顶层参数数量合规且非空。用于插入函数对话框「插入」按钮的可用性判断。
22
+ */
23
+ export declare function checkFormulaStructure(text: string): FormulaCheck;
9
24
  /** 解析区域引用(如 "A1:B5" → {sc, sr, ec, er}) */
10
25
  export declare function parseRangeRef(rangeRef: string, colCount: number, rowCount: number): {
11
26
  sc: number;
@@ -109,7 +109,9 @@ export declare function isNumericValue(value: string): boolean;
109
109
  export declare function isDecimalsAdjustable(format: string | undefined | null, value: string): boolean;
110
110
  /**
111
111
  * 获取单元格当前有效小数位数:
112
- * - 常规(含值为数值的常规)→ 0;文本/日期类 → -1(不支持)
112
+ * - 常规(含值为数值的常规)→ 实际显示值的小数位数(如 =PMT(...) 结果有 11 位小数即 11;
113
+ * 整数 100 即为 0),用于让增减小数位按钮按"当前显示"而非恒为 0 处理;
114
+ * 文本/日期类 → -1(不支持)
113
115
  * - 数值类 → 第一个含数字占位符区段的 decimals(最大允许小数位)
114
116
  */
115
117
  export declare function getEffectiveDecimals(format: string | undefined | null, value: string): number;
@@ -141,7 +143,23 @@ export interface DateTimeParseResult {
141
143
  * 纯数字与公式不会命中;月/日/时/分/秒越界、日期不存在(如 2023-2-29)均不识别。
142
144
  */
143
145
  export declare function parseDateTimeInput(input: string, locale: string, now?: Date): DateTimeParseResult | null;
146
+ /** 数字文本(带千分位/百分比/货币符号)解析结果:数值 + 建议套用的格式代码 */
147
+ export interface NumericTextParseResult {
148
+ /** 解析后的数值(百分比已 ÷100,使其作为序列值正确显示百分比) */
149
+ num: number;
150
+ /** 建议套用的格式代码,如 '0.00%' / '#,##0' / '¥#,##0.00' */
151
+ format: string;
152
+ }
153
+ /**
154
+ * 对常规单元格输入做常见"数字文本"自动识别(对齐 Excel 输入语义):
155
+ * - 带半角千分位逗号的数字:1,234 / 1,234.56 → 数值并套用 #,##0[.00] 格式
156
+ * - 百分比:100% / 3.14% / 1,234.5% → 数值(÷100)并套用 0[.00]% 格式
157
+ * - 货币符号前缀:$1,234.56 / ¥1,234 → 数值并套用「符号#,##0[.00]」格式
158
+ * 仅当字符串含有逗号 / 百分号 / 货币符号时才识别;纯数字(如 "3.14")不命中,保持常规,
159
+ * 避免覆盖用户无需格式的普通数值。公式、日期/时间文本、无法解析的内容均不命中。
160
+ */
161
+ export declare function parseNumericText(input: string, locale: string): NumericTextParseResult | null;
144
162
  /** 根据分类 + 小数位数 + 千位分隔符生成格式代码 */
145
163
  export declare function buildNumberFormatCode(locale: string, category: NFDialogCategory, decimals: number, thousands: boolean): string;
146
- /** 构造工具栏下拉框的选项(含「格式…」自定义项) */
164
+ /** 构造工具栏下拉框的选项(含「其他数字格式…」自定义项) */
147
165
  export declare function buildNumberFormatPresets(locale: string): NFOption[];
@@ -0,0 +1,46 @@
1
+ export type SortOrder = 'asc' | 'desc';
2
+ export type SortKeyKind = 'blank' | 'number' | 'text';
3
+ /** 排序比较键:临时解析结果,不回写到单元格 */
4
+ export interface SortKey {
5
+ kind: SortKeyKind;
6
+ /** kind === 'number' 时的数值(日期/时间为序列值) */
7
+ num?: number;
8
+ /** kind === 'text' 时的原始文本 */
9
+ text?: string;
10
+ }
11
+ /**
12
+ * 将原始值解析为排序比较键。
13
+ * - 空串/纯空白 → blank
14
+ * - 可解析为有限数字(含日期序列值)→ number
15
+ * - 可被 parseDateTimeInput 识别的日期/时间字符串 → number(序列值)
16
+ * - 其余 → text(保留原文用于本地化比较)
17
+ */
18
+ export declare function parseSortKey(value: string | null | undefined, locale: string): SortKey;
19
+ /**
20
+ * 按「展示内容」解析排序比较键(扩展版,支持所有类型单元格):
21
+ * - 显式文本格式('@')→ 文本键 = 原始内容(展示即原文)
22
+ * - 常规(General):数值 → 数值键;日期/时间文本 → 数值键(序列值);其余 → 文本键 = 展示串
23
+ * - 日期/持续时间格式 → 数值键 = 序列值(展示即该序列值)
24
+ * - 数值类格式(数字/百分比/货币等)→ 数值键 = 数值 × 格式缩放(百分比 ÷100 已体现在展示数值中,
25
+ * 这里乘回 scale 使「100%」按其展示数值 100 参与排序,而非存储值 1)
26
+ * - 上述任何类型若格式与值不匹配(如数值格式下是非数字)→ 文本键 = 展示串
27
+ * 与 parseSortKey 的区别:parseSortKey 只看存储原始值(常规下纯数字才算数字),本函数结合单元格
28
+ * 数字格式还原「所见即所排」的语义,满足按展示内容排序的需求。
29
+ */
30
+ export declare function parseSortKeyByDisplay(value: string | null | undefined, format: string | undefined | null, locale: string): SortKey;
31
+ /**
32
+ * 比较两个排序键(均非 blank):
33
+ * - 升序:数字/日期 在前,文本在后;同类内按数值/本地化文本比较
34
+ * - 降序:类型次序反转,同类内逆序
35
+ */
36
+ export declare function compareSortKeys(a: SortKey, b: SortKey, order: SortOrder, locale: string): number;
37
+ /**
38
+ * 对各行比较键做稳定排序,返回置换数组:
39
+ * 结果中 order[i] = 排序后第 i 行应取的原始行下标(以原始下标做 tie-breaker)。
40
+ */
41
+ export declare function buildSortedRowOrder(keys: SortKey[], order: SortOrder, locale: string): number[];
42
+ /**
43
+ * 表头启发式识别(项目无表头数据模型,对齐 Excel 按列排序时的推断):
44
+ * 首行非空且为纯文本,其余行中至少有一个可解析为数字/日期 → 视首行为表头。
45
+ */
46
+ export declare function looksLikeHeader(keys: SortKey[]): boolean;