xiaodao-spreader 0.1.20 → 0.1.25

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-d0b03fba]{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-d0b03fba]{display:flex;align-items:center;flex:0 0 auto}.toolbar-sep[data-v-d0b03fba]{width:1px;height:18px;margin:0 4px;background:var(--sp-toolbar-border)}.toolbar-font[data-v-d0b03fba],.toolbar-number-format[data-v-d0b03fba],.toolbar-align[data-v-d0b03fba]{flex:0 0 auto}.toolbar-font-size[data-v-d0b03fba]{display:inline-flex;align-items:center;gap:0;height:26px;position:relative}.toolbar-font-size__input[data-v-d0b03fba]{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-d0b03fba]::-webkit-outer-spin-button,.toolbar-font-size__input[data-v-d0b03fba]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.toolbar-font-size__input[data-v-d0b03fba]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__input[data-v-d0b03fba]:focus{border-color:var(--sp-toolbar-border);background:#fff}.toolbar-font-size__btn[data-v-d0b03fba]{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-d0b03fba]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__btn svg[data-v-d0b03fba]{width:10px;height:10px}.toolbar-font-size__dropdown[data-v-d0b03fba]{position:absolute;width:56px;height:26px;pointer-events:none}.toolbar-btn[data-v-d0b03fba]{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-d0b03fba]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-btn[data-v-d0b03fba]:active:not(:disabled){opacity:.7}.toolbar-btn--active[data-v-d0b03fba]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-btn--step[data-v-d0b03fba]{width:26px;height:26px}.toolbar-btn--step svg[data-v-d0b03fba]{width:16px;height:16px}.toolbar-btn[data-v-d0b03fba]:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.toolbar-btn__icon[data-v-d0b03fba]{width:18px;height:18px}.toolbar-btn svg[data-v-d0b03fba]:not(.toolbar-btn__icon){width:18px;height:18px}.toolbar-split[data-v-d0b03fba]{display:inline-flex;align-items:center;position:relative;height:26px}.toolbar-split__main[data-v-d0b03fba]{border:1px solid transparent;border-right:none;border-radius:3px 0 0 3px}.toolbar-split__arrow[data-v-d0b03fba]{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-d0b03fba]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-split__arrow svg[data-v-d0b03fba]{width:10px!important;height:10px!important}.toolbar-more[data-v-d0b03fba]{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-d0b03fba]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-more--active[data-v-d0b03fba]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-more svg[data-v-d0b03fba]{width:18px;height:18px}.overflow-menu[data-v-d0b03fba]{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-d0b03fba]{transition:none!important}.overflow-menu .tb-item[data-v-d0b03fba]{width:100%}.overflow-menu .toolbar-sep[data-v-d0b03fba]{width:100%;height:1px;margin:2px 0}.overflow-menu .toolbar-split[data-v-d0b03fba]{width:100%}.overflow-menu .toolbar-split__main[data-v-d0b03fba]{flex:1 1 auto;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-font-size[data-v-d0b03fba]{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font[data-v-d0b03fba],.overflow-menu .toolbar-number-format[data-v-d0b03fba],.overflow-menu .toolbar-align[data-v-d0b03fba]{width:100%}.overflow-menu .toolbar-btn[data-v-d0b03fba]:not(.toolbar-btn--step):not(.toolbar-split__arrow){width:100%;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-color[data-v-d0b03fba]{width:100%}.overflow-menu .toolbar-wrap[data-v-d0b03fba]{width:100%;justify-content:flex-start}.menu-pop-enter-active[data-v-d0b03fba],.menu-pop-leave-active[data-v-d0b03fba]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-d0b03fba],.menu-pop-leave-to[data-v-d0b03fba]{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-69cb36b7]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:30000;background:rgba(0,0,0,.25);display:flex;align-items:center;justify-content:center}.nf-dialog[data-v-69cb36b7]{width:380px;max-width:calc(100vw - 32px);max-height:calc(100vh - 48px);overflow-y:auto;background:#fff;border:1px solid #d0d0d0;border-radius:6px;box-shadow:0 8px 24px #0000002e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;color:#1a1a1a;-webkit-user-select:none;user-select:none}.nf-dialog__header[data-v-69cb36b7]{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid #ececec}.nf-dialog__title[data-v-69cb36b7]{font-size:13px;font-weight:600}.nf-dialog__close[data-v-69cb36b7]{display:flex;align-items:center;justify-content:center;width:22px;height:22px;border:none;background:transparent;color:#888;cursor:pointer;border-radius:3px;padding:0}.nf-dialog__close[data-v-69cb36b7]:hover{background:#f0f0f0;color:#444}.nf-dialog__close svg[data-v-69cb36b7]{width:14px;height:14px}.nf-dialog__body[data-v-69cb36b7]{padding:12px 14px;display:flex;flex-direction:column;gap:10px}.nf-field[data-v-69cb36b7]{display:flex;align-items:center;gap:8px}.nf-field--inline[data-v-69cb36b7]{min-height:26px}.nf-field__label[data-v-69cb36b7]{width:88px;min-width:88px;font-size:12px;color:#555}.nf-field__select[data-v-69cb36b7],.nf-field__input[data-v-69cb36b7]{flex:1;height:26px;border:1px solid #c0c0c0;border-radius:3px;background:#fff;font-size:12px;color:#1a1a1a;padding:0 6px;outline:none;box-sizing:border-box;font-family:inherit}.nf-field__select[data-v-69cb36b7]:focus,.nf-field__input[data-v-69cb36b7]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.nf-field__textarea[data-v-69cb36b7]{flex:1;min-height:44px;border:1px solid #c0c0c0;border-radius:3px;background:#fff;font-size:12px;color:#1a1a1a;padding:4px 6px;outline:none;box-sizing:border-box;resize:none;font-family:Consolas,Courier New,monospace}.nf-field__textarea[data-v-69cb36b7]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.nf-checkbox[data-v-69cb36b7]{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:#333;cursor:pointer}.nf-checkbox input[data-v-69cb36b7]{margin:0;cursor:pointer}.nf-dialog__footer[data-v-69cb36b7]{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 14px;border-top:1px solid #ececec}.nf-preview[data-v-69cb36b7]{display:flex;flex-direction:column;gap:2px;min-width:0}.nf-preview__label[data-v-69cb36b7]{font-size:11px;color:#888}.nf-preview__value[data-v-69cb36b7]{font-size:13px;color:#1a1a1a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:180px}.nf-dialog__actions[data-v-69cb36b7]{display:flex;gap:8px}.nf-btn[data-v-69cb36b7]{height:28px;padding:0 16px;border:1px solid #ccc;border-radius:3px;background:#fff;color:#333;font-size:12px;cursor:pointer;font-family:inherit}.nf-btn[data-v-69cb36b7]:hover{background:#f0f0f0}.nf-btn--primary[data-v-69cb36b7]{border-color:#0078d7;background:#0078d7;color:#fff}.nf-btn--primary[data-v-69cb36b7]:hover{background:#0069c0}.nf-dialog-enter-active[data-v-69cb36b7],.nf-dialog-leave-active[data-v-69cb36b7]{transition:opacity .14s ease-out}.nf-dialog-enter-from[data-v-69cb36b7],.nf-dialog-leave-to[data-v-69cb36b7]{opacity:0}.nf-dialog-enter-active .nf-dialog[data-v-69cb36b7],.nf-dialog-leave-active .nf-dialog[data-v-69cb36b7]{transition:transform .14s ease-out}.nf-dialog-enter-from .nf-dialog[data-v-69cb36b7],.nf-dialog-leave-to .nf-dialog[data-v-69cb36b7]{transform:scale(.96)}.spreadsheet-outer[data-v-dc46aaa8]{flex:1;display:flex;flex-direction:column;overflow:hidden;height:100%;min-height:400px;width:100%}.formula-bar[data-v-dc46aaa8]{display:flex;align-items:flex-start;min-height:36px;padding:0;gap:0}.formula-bar--expanded[data-v-dc46aaa8]{min-height:72px}.formula-bar__cell-label[data-v-dc46aaa8]{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-dc46aaa8]{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-dc46aaa8]{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-dc46aaa8]{border-left:1px solid var(--sp-formula-bar-input-border)}.formula-bar__btn[data-v-dc46aaa8]:hover{background:var(--sp-scroll-btn-hover-bg, #f0f0f0)}.formula-bar__btn--cancel[data-v-dc46aaa8]:hover{color:#e53935;background:#fdecea}.formula-bar__btn--accept[data-v-dc46aaa8]:hover{color:#2e7d32;background:#e8f5e9}.formula-bar__input[data-v-dc46aaa8]{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-dc46aaa8]{height:68px;overflow:auto}.formula-bar__input[data-v-dc46aaa8]: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-dc46aaa8]{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-dc46aaa8]:hover{background:var(--sp-scroll-btn-hover-bg, #e8e8e8)}.spreadsheet-wrapper[data-v-dc46aaa8]{flex:1;position:relative;overflow:hidden;background:var(--sp-wrapper-bg)}.grid-canvas[data-v-dc46aaa8]{position:absolute;top:0;left:0;display:block;outline:none;cursor:cell}.grid-canvas[data-v-dc46aaa8]:focus{outline:none}.v-scrollbar[data-v-dc46aaa8]{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-dc46aaa8]{position:absolute;left:0;bottom:0;height:11px;width:calc(100% - 11px);display:flex;background:var(--sp-wrapper-bg)}.sb-corner[data-v-dc46aaa8]{position:absolute;right:0;bottom:0;width:11px;height:11px;background:var(--sp-wrapper-bg)}.sb-btn[data-v-dc46aaa8]{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-dc46aaa8]:hover{background:var(--sp-scroll-btn-hover-bg, #d0d0d0)}.sb-btn[data-v-dc46aaa8]:active{background:var(--sp-scroll-btn-active-bg, #c0c0c0)}.sb-arrow[data-v-dc46aaa8]{display:block;width:0;height:0}.sb-arrow--up[data-v-dc46aaa8]{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-dc46aaa8]{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-dc46aaa8]{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-dc46aaa8]{border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:4px solid var(--sp-scroll-btn-color, #666)}.sb-track[data-v-dc46aaa8]{flex:1;position:relative;background:var(--sp-scroll-track-bg, rgba(0,0,0,.06))}.sb-track--v[data-v-dc46aaa8]{width:11px}.sb-track--h[data-v-dc46aaa8]{height:11px}.sb-thumb[data-v-dc46aaa8]{position:absolute;border-radius:3px;background:var(--sp-scroll-thumb);cursor:default}.sb-thumb[data-v-dc46aaa8]:hover{background:var(--sp-scroll-thumb-hover)}.sb-thumb--v[data-v-dc46aaa8]{left:1px;right:1px;min-height:16px}.sb-thumb--h[data-v-dc46aaa8]{top:1px;bottom:1px;min-width:16px}.cell-editor[data-v-dc46aaa8]{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-afcb334e]{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-afcb334e]{display:flex;align-items:center;flex:0 0 auto}.toolbar-sep[data-v-afcb334e]{width:1px;height:18px;margin:0 4px;background:var(--sp-toolbar-border)}.toolbar-font[data-v-afcb334e],.toolbar-number-format[data-v-afcb334e],.toolbar-align[data-v-afcb334e]{flex:0 0 auto}.toolbar-font-size[data-v-afcb334e],.toolbar-number-format-group[data-v-afcb334e]{display:inline-flex;align-items:center;gap:0;height:26px;position:relative}.toolbar-font-size__input[data-v-afcb334e]{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-afcb334e]::-webkit-outer-spin-button,.toolbar-font-size__input[data-v-afcb334e]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.toolbar-font-size__input[data-v-afcb334e]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__input[data-v-afcb334e]:focus{border-color:var(--sp-toolbar-border);background:#fff}.toolbar-font-size__btn[data-v-afcb334e]{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-afcb334e]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__btn svg[data-v-afcb334e]{width:10px;height:10px}.toolbar-font-size__dropdown[data-v-afcb334e]{position:absolute;width:56px;height:26px;pointer-events:none}.toolbar-btn[data-v-afcb334e]{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-afcb334e]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-btn[data-v-afcb334e]:active:not(:disabled){opacity:.7}.toolbar-btn--active[data-v-afcb334e]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-btn--step[data-v-afcb334e]{width:26px;height:26px}.toolbar-btn--step svg[data-v-afcb334e]{width:16px;height:16px}.toolbar-btn[data-v-afcb334e]:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.toolbar-btn__icon[data-v-afcb334e]{width:18px;height:18px}.toolbar-btn svg[data-v-afcb334e]:not(.toolbar-btn__icon){width:18px;height:18px}.toolbar-split[data-v-afcb334e]{display:inline-flex;align-items:center;position:relative;height:26px}.toolbar-split__main[data-v-afcb334e]{border:1px solid transparent;border-right:none;border-radius:3px 0 0 3px}.toolbar-split__arrow[data-v-afcb334e]{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-afcb334e]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-split__arrow svg[data-v-afcb334e]{width:10px!important;height:10px!important}.toolbar-more[data-v-afcb334e]{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-afcb334e]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-more--active[data-v-afcb334e]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-more svg[data-v-afcb334e]{width:18px;height:18px}.overflow-menu[data-v-afcb334e]{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-afcb334e]{transition:none!important}.overflow-menu .tb-item[data-v-afcb334e]{width:100%}.overflow-menu .toolbar-sep[data-v-afcb334e]{width:100%;height:1px;margin:2px 0}.overflow-menu .toolbar-split[data-v-afcb334e]{width:100%}.overflow-menu .toolbar-split__main[data-v-afcb334e]{flex:1 1 auto;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-font-size[data-v-afcb334e],.overflow-menu .toolbar-number-format-group[data-v-afcb334e]{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font[data-v-afcb334e]{width:100%}.overflow-menu .toolbar-number-format[data-v-afcb334e]{flex:1 1 auto;width:auto!important;min-width:0}.overflow-menu .toolbar-align[data-v-afcb334e]{width:100%}.overflow-menu .toolbar-btn[data-v-afcb334e]: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-afcb334e]{flex:0 0 auto;width:30px}.overflow-menu .toolbar-color[data-v-afcb334e]{width:100%}.overflow-menu .toolbar-wrap[data-v-afcb334e]{width:100%;justify-content:flex-start}.menu-pop-enter-active[data-v-afcb334e],.menu-pop-leave-active[data-v-afcb334e]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-afcb334e],.menu-pop-leave-to[data-v-afcb334e]{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-1c766a56]{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-1c766a56]{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-1c766a56]:focus{border-color:var(--sp-toolbar-btn-active-color)}.find-bar__dropdown[data-v-1c766a56]{flex:0 0 auto}.find-bar__dropdown[data-v-1c766a56] .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-1c766a56] .sp-dropdown__trigger:hover{background:#f5f5f5}.find-bar__dropdown[data-v-1c766a56] .sp-dropdown__trigger--open{border-color:var(--sp-toolbar-btn-active-color)}.find-bar__chk[data-v-1c766a56]{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-1c766a56]{margin:0}.find-bar__count[data-v-1c766a56]{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-1c766a56]{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-1c766a56]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.find-bar__btn[data-v-1c766a56]:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.find-bar__btn--icon[data-v-1c766a56]{width:26px;padding:0}.find-bar__btn--icon svg[data-v-1c766a56]{width:14px;height:14px}.find-bar__btn--close[data-v-1c766a56]{width:26px;padding:0;margin-left:auto}.find-bar__btn--close svg[data-v-1c766a56]{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-1e9431b0]{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-1e9431b0]{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-1e9431b0]{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid #ececec}.ifn-dialog__title[data-v-1e9431b0]{font-size:13px;font-weight:600}.ifn-dialog__close[data-v-1e9431b0]{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-1e9431b0]:hover{background:#f0f0f0;color:#444}.ifn-dialog__close svg[data-v-1e9431b0]{width:14px;height:14px}.ifn-dialog__body[data-v-1e9431b0]{padding:14px;display:flex;flex-direction:column;gap:12px}.ifn-dialog__field[data-v-1e9431b0]{display:flex;flex-direction:column;gap:6px}.ifn-dialog__label[data-v-1e9431b0]{font-size:12px;color:#333}.ifn-dialog__dropdown[data-v-1e9431b0]{width:100%}.ifn-dialog__dropdown[data-v-1e9431b0] .sp-dropdown__trigger{border:1px solid #c0c0c0;background:#fff;color:#1a1a1a;padding:0 6px}.ifn-dialog__dropdown[data-v-1e9431b0] .sp-dropdown__trigger:hover{background:#f5f5f5}.ifn-dialog__dropdown[data-v-1e9431b0] .sp-dropdown__trigger--open{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.ifn-dialog__desc[data-v-1e9431b0]{font-size:12px;line-height:1.5;color:#666;-webkit-user-select:text;user-select:text}.ifn-dialog__textarea[data-v-1e9431b0]{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:vertical;-webkit-user-select:text;user-select:text}.ifn-dialog__textarea[data-v-1e9431b0]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.ifn-dialog__footer[data-v-1e9431b0]{display:flex;justify-content:flex-end;gap:8px;padding:10px 14px;border-top:1px solid #ececec}.ifn-dialog__btn[data-v-1e9431b0]{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-1e9431b0]:hover{background:#f0f0f0}.ifn-dialog__btn--primary[data-v-1e9431b0]{border-color:#0078d7;background:#0078d7;color:#fff}.ifn-dialog__btn--primary[data-v-1e9431b0]:hover{background:#0069c0}.ifn-dialog__btn--primary[data-v-1e9431b0]:disabled,.ifn-dialog__btn--primary[data-v-1e9431b0]:disabled:hover{border-color:#ccc;background:#f0f0f0;color:#a8a8a8;cursor:not-allowed}.ifn-dialog-enter-active[data-v-1e9431b0],.ifn-dialog-leave-active[data-v-1e9431b0]{transition:opacity .14s ease-out}.ifn-dialog-enter-from[data-v-1e9431b0],.ifn-dialog-leave-to[data-v-1e9431b0]{opacity:0}.ifn-dialog-enter-active .ifn-dialog[data-v-1e9431b0],.ifn-dialog-leave-active .ifn-dialog[data-v-1e9431b0]{transition:transform .14s ease-out}.ifn-dialog-enter-from .ifn-dialog[data-v-1e9431b0],.ifn-dialog-leave-to .ifn-dialog[data-v-1e9431b0]{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;
@@ -3,6 +3,8 @@ type __VLS_Props = {
3
3
  locale?: string;
4
4
  /** 当前选区格式(混合时由父组件传入空串,从常规开始) */
5
5
  currentFormat?: string;
6
+ /** 选区数字格式带自定义分类标记(常规单元格经小数位按钮生成):打开时分类直接显示为「自定义」 */
7
+ isCustom?: boolean;
6
8
  /** 预览样例值(默认 1234.5) */
7
9
  sampleValue?: string;
8
10
  };
@@ -16,6 +18,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
16
18
  modelOpen: boolean;
17
19
  locale: string;
18
20
  currentFormat: string;
21
+ isCustom: boolean;
19
22
  sampleValue: string;
20
23
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
21
24
  customCodeRef: HTMLTextAreaElement;
@@ -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;
@@ -36,6 +40,8 @@ type __VLS_Props = {
36
40
  themeVars?: Record<string, string>;
37
41
  selNumberFormat: string;
38
42
  nfOptions: NFOption[];
43
+ canIncreaseDecimals: boolean;
44
+ canDecreaseDecimals: boolean;
39
45
  };
40
46
  declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
41
47
  undo: () => void;
@@ -54,11 +60,14 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
54
60
  "apply-text-color": () => void;
55
61
  "apply-fill-color": () => void;
56
62
  "apply-border": () => void;
63
+ "apply-sort": () => void;
57
64
  "wrap-toggle": () => void;
58
65
  "apply-merge": () => void;
59
66
  "calc-sum": () => void;
60
67
  "calc-avg": () => void;
61
68
  "calc-count": () => void;
69
+ "increase-decimals": () => void;
70
+ "decrease-decimals": () => void;
62
71
  "font-family-change": (v: string | number) => void;
63
72
  "font-size-change": (v: string | number) => void;
64
73
  "h-align-change": (v: string | number) => void;
@@ -72,9 +81,11 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
72
81
  "update:text-color-menu-open": (v: boolean) => void;
73
82
  "update:fill-color-menu-open": (v: boolean) => void;
74
83
  "update:border-menu-open": (v: boolean) => void;
84
+ "update:sort-menu-open": (v: boolean) => void;
75
85
  "update:merge-menu-open": (v: boolean) => void;
76
86
  "update:calc-menu-open": (v: boolean) => void;
77
87
  "border-change": (v: BorderType) => void;
88
+ "sort-change": (v: SortOrder) => void;
78
89
  "merge-change": (v: MergeType) => void;
79
90
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
80
91
  onUndo?: (() => any) | undefined;
@@ -93,11 +104,14 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
93
104
  "onApply-text-color"?: (() => any) | undefined;
94
105
  "onApply-fill-color"?: (() => any) | undefined;
95
106
  "onApply-border"?: (() => any) | undefined;
107
+ "onApply-sort"?: (() => any) | undefined;
96
108
  "onWrap-toggle"?: (() => any) | undefined;
97
109
  "onApply-merge"?: (() => any) | undefined;
98
110
  "onCalc-sum"?: (() => any) | undefined;
99
111
  "onCalc-avg"?: (() => any) | undefined;
100
112
  "onCalc-count"?: (() => any) | undefined;
113
+ "onIncrease-decimals"?: (() => any) | undefined;
114
+ "onDecrease-decimals"?: (() => any) | undefined;
101
115
  "onFont-family-change"?: ((v: string | number) => any) | undefined;
102
116
  "onFont-size-change"?: ((v: string | number) => any) | undefined;
103
117
  "onH-align-change"?: ((v: string | number) => any) | undefined;
@@ -111,9 +125,11 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
111
125
  "onUpdate:text-color-menu-open"?: ((v: boolean) => any) | undefined;
112
126
  "onUpdate:fill-color-menu-open"?: ((v: boolean) => any) | undefined;
113
127
  "onUpdate:border-menu-open"?: ((v: boolean) => any) | undefined;
128
+ "onUpdate:sort-menu-open"?: ((v: boolean) => any) | undefined;
114
129
  "onUpdate:merge-menu-open"?: ((v: boolean) => any) | undefined;
115
130
  "onUpdate:calc-menu-open"?: ((v: boolean) => any) | undefined;
116
131
  "onBorder-change"?: ((v: BorderType) => any) | undefined;
132
+ "onSort-change"?: ((v: SortOrder) => any) | undefined;
117
133
  "onMerge-change"?: ((v: MergeType) => any) | undefined;
118
134
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
119
135
  rootEl: HTMLDivElement;
@@ -123,6 +139,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
123
139
  borderArrowRef: HTMLButtonElement;
124
140
  mergeArrowRef: HTMLButtonElement;
125
141
  calcArrowRef: HTMLButtonElement;
142
+ sortArrowRef: HTMLButtonElement;
126
143
  moreBtnEl: HTMLButtonElement;
127
144
  overflowMenuEl: HTMLDivElement;
128
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;
@@ -70,11 +70,17 @@ export interface UndoStylesState {
70
70
  mergeMenuOpen?: Ref<boolean>;
71
71
  nfOptions: ComputedRef<NFOption[]>;
72
72
  selNumberFormat: ComputedRef<string>;
73
+ /** 仅供工具栏下拉回显:非预设代码归类到对应预设,避免回显为空 */
74
+ selNumberFormatDisplay: ComputedRef<string>;
73
75
  NF_NUMBER_FORMAT_MIXED: string;
74
76
  nfDialogOpen: Ref<boolean>;
75
77
  onNumberFormatChange: (v: string) => void;
76
78
  openNumberFormatDialog: () => void;
77
79
  applyNumberFormatCode: (code: string) => void;
80
+ canIncreaseDecimals: ComputedRef<boolean>;
81
+ canDecreaseDecimals: ComputedRef<boolean>;
82
+ onIncreaseDecimals: () => void;
83
+ onDecreaseDecimals: () => void;
78
84
  }
79
85
  interface UndoSnap {
80
86
  sheets: SheetState[];
@@ -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;
@@ -94,7 +94,70 @@ export declare function isFormatOverflowsToHashes(format: string | undefined | n
94
94
  * 主要用于渲染端直接复用,避免再次 parseNumberFormat。
95
95
  */
96
96
  export declare function isInvalidDisplayValue(value: string, format: string | undefined | null): boolean;
97
+ /** 最大小数位数(与数字格式对话框一致:0–30) */
98
+ export declare const NF_MAX_DECIMALS = 30;
99
+ /** 最小小数位数 */
100
+ export declare const NF_MIN_DECIMALS = 0;
101
+ /** 判断原始值是否可解析为有限数字(常规格式下的"数值"语义) */
102
+ export declare function isNumericValue(value: string): boolean;
103
+ /**
104
+ * 判断某单元格(格式 + 值)的小数位数是否可调整:
105
+ * - 文本 / 日期 / 时间 / 持续时间 → 不支持
106
+ * - 数值类格式(含数字占位符)→ 支持(与单元格内容无关)
107
+ * - 常规 → 仅当值可解析为数字时支持(识别为数字格式)
108
+ */
109
+ export declare function isDecimalsAdjustable(format: string | undefined | null, value: string): boolean;
110
+ /**
111
+ * 获取单元格当前有效小数位数:
112
+ * - 常规(含值为数值的常规)→ 0;文本/日期类 → -1(不支持)
113
+ * - 数值类 → 第一个含数字占位符区段的 decimals(最大允许小数位)
114
+ */
115
+ export declare function getEffectiveDecimals(format: string | undefined | null, value: string): number;
116
+ /**
117
+ * 将格式代码调整为指定的小数位数,返回新代码;不支持或越界时返回 null。
118
+ * - 常规格式:生成纯数值格式('0' 或 '0.000...')
119
+ * - 文本 / 日期 / 时间 / 持续时间:不支持 → null
120
+ * - 数值类(含百分比/货币/会计/财务/科学计数/多区段自定义):逐区段调整,纯文本区段保留
121
+ */
122
+ export declare function adjustNumberFormatDecimals(format: string | undefined | null, target: number): string | null;
123
+ /**
124
+ * 将任意格式代码归类映射为工具栏下拉的预设值,用于回显:
125
+ * 增减小数位、对话框改符号/日期/自定义代码等产生的代码不在预设列表中,
126
+ * 按分类归到对应预设(分类规则与对话框 detectFromCode 一致),无法识别时返回 NF_CUSTOM。
127
+ * 注意:仅用于显示,不得用于替代真实格式代码存储。
128
+ */
129
+ export declare function normalizeNumberFormatForDisplay(format: string | undefined | null, locale: string): string;
130
+ /** 日期/时间字符串解析结果:Excel 序列号 + 建议套用的格式代码 */
131
+ export interface DateTimeParseResult {
132
+ serial: number;
133
+ format: string;
134
+ }
135
+ /**
136
+ * 对常规单元格的输入做常见日期/时间/日期时间字符串自动识别(对齐 Excel 输入语义):
137
+ * - 日期:yyyy-m-d、yyyy/m/d、yyyy年m月d日、m-d / m/d(年份补当前年)
138
+ * - 时间:h:mm、h:mm:ss
139
+ * - 日期时间:上述日期 + 空格或 T + 时间
140
+ * 识别成功返回序列号 + 建议格式代码(跟随 locale);不识别返回 null。
141
+ * 纯数字与公式不会命中;月/日/时/分/秒越界、日期不存在(如 2023-2-29)均不识别。
142
+ */
143
+ export declare function parseDateTimeInput(input: string, locale: string, now?: Date): DateTimeParseResult | null;
144
+ /** 数字文本(带千分位/百分比/货币符号)解析结果:数值 + 建议套用的格式代码 */
145
+ export interface NumericTextParseResult {
146
+ /** 解析后的数值(百分比已 ÷100,使其作为序列值正确显示百分比) */
147
+ num: number;
148
+ /** 建议套用的格式代码,如 '0.00%' / '#,##0' / '¥#,##0.00' */
149
+ format: string;
150
+ }
151
+ /**
152
+ * 对常规单元格输入做常见"数字文本"自动识别(对齐 Excel 输入语义):
153
+ * - 带半角千分位逗号的数字:1,234 / 1,234.56 → 数值并套用 #,##0[.00] 格式
154
+ * - 百分比:100% / 3.14% / 1,234.5% → 数值(÷100)并套用 0[.00]% 格式
155
+ * - 货币符号前缀:$1,234.56 / ¥1,234 → 数值并套用「符号#,##0[.00]」格式
156
+ * 仅当字符串含有逗号 / 百分号 / 货币符号时才识别;纯数字(如 "3.14")不命中,保持常规,
157
+ * 避免覆盖用户无需格式的普通数值。公式、日期/时间文本、无法解析的内容均不命中。
158
+ */
159
+ export declare function parseNumericText(input: string, locale: string): NumericTextParseResult | null;
97
160
  /** 根据分类 + 小数位数 + 千位分隔符生成格式代码 */
98
161
  export declare function buildNumberFormatCode(locale: string, category: NFDialogCategory, decimals: number, thousands: boolean): string;
99
- /** 构造工具栏下拉框的选项(含「格式…」自定义项) */
162
+ /** 构造工具栏下拉框的选项(含「其他数字格式…」自定义项) */
100
163
  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;
@@ -48,6 +48,11 @@ export interface CellStyle {
48
48
  /** @deprecated 旧版边框颜色,兼容历史数据使用,新代码请通过 BorderStyle.color 访问 */
49
49
  borderColor?: string;
50
50
  numberFormat?: string;
51
+ /**
52
+ * 数字格式分类标记:'custom' 表示该格式由「增加/减少小数位数」等操作在常规单元格上自动生成,
53
+ * 下拉/对话框应按「自定义」展示。仅存标记,渲染不受影响。
54
+ */
55
+ numberFormatCategory?: 'custom';
51
56
  [key: string]: unknown;
52
57
  }
53
58
  /** 单元格数据:value 始终为 string,样式通过 styleId 引用表格级 styles 池 */