xiaodao-spreader 0.1.10 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Xiaodao Spreader
2
2
 
3
- 中文 | [English](./README.md)
3
+ [中文](./README.ZH.md) | English
4
4
 
5
5
  A high-performance, canvas-based spreadsheet component for Vue 3 — bringing an Excel-like editing experience to the web.
6
6
 
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .sp-dropdown[data-v-67defaed]{position:relative;display:inline-flex;min-width:0}.sp-dropdown__trigger[data-v-67defaed]{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-67defaed]:hover{background:var(--sp-toolbar-btn-hover-bg, #e6e6e6)}.sp-dropdown__trigger--open[data-v-67defaed]{background:var(--sp-toolbar-btn-hover-bg, #e6e6e6);border-color:var(--sp-toolbar-border, #d8d8d8)}.sp-dropdown__value[data-v-67defaed]{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.sp-dropdown__caret[data-v-67defaed]{width:10px;height:10px;min-width:10px;opacity:.7}.sp-dropdown__menu[data-v-67defaed]{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-67defaed]{transform-origin:bottom center}.menu-pop-enter-active[data-v-67defaed],.menu-pop-leave-active[data-v-67defaed]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-67defaed],.menu-pop-leave-to[data-v-67defaed]{opacity:0;transform:scaleY(.85)}.sp-dropdown__nav[data-v-67defaed]{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-67defaed]:hover:not(:disabled){background:#eef3f9}.sp-dropdown__nav[data-v-67defaed]:disabled{color:#ccc;cursor:default}.sp-dropdown__nav svg[data-v-67defaed]{width:10px;height:10px}.sp-dropdown__list[data-v-67defaed]{display:flex;flex-direction:column;overflow:hidden;touch-action:none}.sp-dropdown__icon[data-v-67defaed]{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.sp-dropdown__icon[data-v-67defaed] svg{width:18px;height:18px;display:block}.sp-dropdown__item-icon[data-v-67defaed]{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.sp-dropdown__item-icon[data-v-67defaed] svg{width:16px;height:16px;display:block}.sp-dropdown__item-label[data-v-67defaed]{white-space:nowrap}.sp-dropdown__item[data-v-67defaed]{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-67defaed]:hover{background:#eef3f9}.sp-dropdown__item--active[data-v-67defaed]{background:#e5f1fb;color:#0078d7}.color-picker[data-v-f8fac424]{position:relative;display:inline-flex;height:26px}.color-picker__menu[data-v-f8fac424]{position:fixed;z-index:9999;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;padding:6px;box-shadow:0 4px 12px #0000001f;-webkit-user-select:none;user-select:none;transform-origin:top right}.menu-pop-enter-active[data-v-f8fac424],.menu-pop-leave-active[data-v-f8fac424]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-f8fac424],.menu-pop-leave-to[data-v-f8fac424]{opacity:0;transform:scale(.9)}.color-picker__row[data-v-f8fac424]{display:flex;gap:4px;margin-bottom:4px}.color-picker__row[data-v-f8fac424]:last-child{margin-bottom:0}.color-picker__swatch[data-v-f8fac424]{width:20px;height:20px;padding:0;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:transform .08s,box-shadow .08s;position:relative}.color-picker__swatch[data-v-f8fac424]:hover{transform:scale(1.18);box-shadow:0 0 0 1px #0003;z-index:1}.color-picker__swatch--selected[data-v-f8fac424]{box-shadow:0 0 0 2px #0078d7}.border-picker[data-v-f362abdb]{position:relative;display:inline-flex;height:26px}.border-picker__menu[data-v-f362abdb]{position:fixed;z-index:9999;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;box-shadow:0 4px 12px #0000001f;-webkit-user-select:none;user-select:none;padding:4px;transform-origin:top right}.border-picker__item[data-v-f362abdb]{display:flex;align-items:center;gap:6px;width:100%;padding:4px 8px;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #444);cursor:pointer;border-radius:3px;font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;white-space:nowrap}.border-picker__item[data-v-f362abdb]:hover{background:#eef3f9}.border-picker__icon[data-v-f362abdb]{width:18px;height:18px;flex-shrink:0}.border-picker__label[data-v-f362abdb]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-f362abdb],.menu-pop-leave-active[data-v-f362abdb]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-f362abdb],.menu-pop-leave-to[data-v-f362abdb]{opacity:0;transform:scale(.9)}.merge-picker[data-v-67c0f9e3]{position:relative;display:inline-flex;height:26px}.merge-picker__menu[data-v-67c0f9e3]{position:fixed;z-index:9999;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;box-shadow:0 4px 12px #0000001f;-webkit-user-select:none;user-select:none;padding:4px;transform-origin:top right}.merge-picker__item[data-v-67c0f9e3]{display:flex;align-items:center;gap:6px;width:100%;padding:4px 8px;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #444);cursor:pointer;border-radius:3px;font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;white-space:nowrap}.merge-picker__item[data-v-67c0f9e3]:hover{background:#eef3f9}.merge-picker__icon[data-v-67c0f9e3]{width:18px;height:18px;flex-shrink:0;display:flex;align-items:center;justify-content:center}.merge-picker__icon[data-v-67c0f9e3] svg{width:18px;height:18px}.merge-picker__label[data-v-67c0f9e3]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-67c0f9e3],.menu-pop-leave-active[data-v-67c0f9e3]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-67c0f9e3],.menu-pop-leave-to[data-v-67c0f9e3]{opacity:0;transform:scale(.9)}.calc-picker[data-v-08615aee]{position:relative;display:inline-flex;height:26px}.calc-picker__menu[data-v-08615aee]{position:fixed;z-index:9999;min-width:120px;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;box-shadow:0 4px 12px #0000001f;-webkit-user-select:none;user-select:none;padding:4px;transform-origin:top right}.calc-picker__item[data-v-08615aee]{display:flex;align-items:center;gap:6px;width:100%;padding:4px 8px;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #444);cursor:pointer;border-radius:3px;font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;white-space:nowrap}.calc-picker__item[data-v-08615aee]:hover:not(.calc-picker__item--disabled){background:#eef3f9}.calc-picker__item--disabled[data-v-08615aee]{color:var(--sp-toolbar-btn-disabled-color, #bbb);cursor:default}.calc-picker__label[data-v-08615aee]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-08615aee],.menu-pop-leave-active[data-v-08615aee]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-08615aee],.menu-pop-leave-to[data-v-08615aee]{opacity:0;transform:scale(.9)}.toolbar[data-v-dc556a27]{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-dc556a27]{display:flex;align-items:center;flex:0 0 auto}.toolbar-sep[data-v-dc556a27]{width:1px;height:18px;margin:0 4px;background:var(--sp-toolbar-border)}.toolbar-font[data-v-dc556a27],.toolbar-align[data-v-dc556a27]{flex:0 0 auto}.toolbar-font-size[data-v-dc556a27]{display:inline-flex;align-items:center;gap:0;height:26px;position:relative}.toolbar-font-size__input[data-v-dc556a27]{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-dc556a27]::-webkit-outer-spin-button,.toolbar-font-size__input[data-v-dc556a27]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.toolbar-font-size__input[data-v-dc556a27]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__input[data-v-dc556a27]:focus{border-color:var(--sp-toolbar-border);background:#fff}.toolbar-font-size__btn[data-v-dc556a27]{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-dc556a27]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__btn svg[data-v-dc556a27]{width:10px;height:10px}.toolbar-font-size__dropdown[data-v-dc556a27]{position:absolute;width:56px;height:26px;pointer-events:none}.toolbar-btn[data-v-dc556a27]{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-dc556a27]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-btn[data-v-dc556a27]:active:not(:disabled){opacity:.7}.toolbar-btn--active[data-v-dc556a27]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-btn--step[data-v-dc556a27]{width:26px;height:26px}.toolbar-btn--step svg[data-v-dc556a27]{width:16px;height:16px}.toolbar-btn[data-v-dc556a27]:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.toolbar-btn__icon[data-v-dc556a27]{width:18px;height:18px}.toolbar-btn svg[data-v-dc556a27]:not(.toolbar-btn__icon){width:18px;height:18px}.toolbar-split[data-v-dc556a27]{display:inline-flex;align-items:center;position:relative;height:26px}.toolbar-split__main[data-v-dc556a27]{border:1px solid transparent;border-right:none;border-radius:3px 0 0 3px}.toolbar-split__arrow[data-v-dc556a27]{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-dc556a27]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-split__arrow svg[data-v-dc556a27]{width:10px!important;height:10px!important}.toolbar-more[data-v-dc556a27]{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-dc556a27]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-more--active[data-v-dc556a27]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-more svg[data-v-dc556a27]{width:18px;height:18px}.overflow-menu[data-v-dc556a27]{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-dc556a27]{transition:none!important}.overflow-menu .tb-item[data-v-dc556a27]{width:100%}.overflow-menu .toolbar-sep[data-v-dc556a27]{width:100%;height:1px;margin:2px 0}.overflow-menu .toolbar-split[data-v-dc556a27]{width:100%}.overflow-menu .toolbar-split__main[data-v-dc556a27]{flex:1 1 auto;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-font-size[data-v-dc556a27]{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font[data-v-dc556a27],.overflow-menu .toolbar-align[data-v-dc556a27]{width:100%}.overflow-menu .toolbar-btn[data-v-dc556a27]:not(.toolbar-btn--step):not(.toolbar-split__arrow){width:100%;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-color[data-v-dc556a27]{width:100%}.overflow-menu .toolbar-wrap[data-v-dc556a27]{width:100%;justify-content:flex-start}.menu-pop-enter-active[data-v-dc556a27],.menu-pop-leave-active[data-v-dc556a27]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-dc556a27],.menu-pop-leave-to[data-v-dc556a27]{opacity:0;transform:scale(.9)}.overflow-menu .tb-item{width:100%}.overflow-menu .toolbar-sep{width:100%;height:1px;margin:2px 0}.overflow-menu .toolbar-split{width:100%}.overflow-menu .toolbar-split__main{flex:1 1 auto;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-font-size{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font,.overflow-menu .toolbar-align{width:100%}.overflow-menu .toolbar-btn:not(.toolbar-btn--step):not(.toolbar-split__arrow){width:100%;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-color{width:100%}.overflow-menu .toolbar-wrap{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font-size__input{flex:1 1 auto;width:auto;min-width:40px}.overflow-menu .toolbar-btn:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-btn:active:not(:disabled){opacity:.7}.overflow-menu .toolbar-btn--active{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.overflow-menu .toolbar-btn:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.overflow-menu .toolbar-split__main:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-split__arrow:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-font-size__input:hover{background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-font-size__input:focus{border-color:var(--sp-toolbar-border);background:#fff}.overflow-menu .toolbar-font-size__btn:hover,.overflow-menu .toolbar-more:hover{background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-more--active{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.tab-bar[data-v-454e1a12]{display:flex;align-items:stretch;height:30px;min-height:30px;background:var(--sp-tab-bar-bg);border-top:1px solid var(--sp-tab-bar-border);-webkit-user-select:none;user-select:none;margin-top:4px}.tab-list[data-v-454e1a12]{display:flex;align-items:flex-start;flex:1;overflow:hidden;gap:1px;padding:0 1px}.tab-item[data-v-454e1a12]{display:flex;align-items:center;height:28px;min-width:0;max-width:120px;padding:0 10px;cursor:pointer;border:1px solid var(--sp-tab-inactive-border);background:var(--sp-tab-inactive-bg);color:var(--sp-tab-inactive-color);font-size:14px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;white-space:nowrap;transition:background .1s}.tab-item[data-v-454e1a12]:hover{background:var(--sp-tab-hover-bg)}.tab-item--active[data-v-454e1a12]{height:28px;background:var(--sp-tab-active-bg);color:var(--sp-tab-active-color);border-color:var(--sp-tab-active-bg) var(--sp-tab-bar-border) var(--sp-tab-bar-border);border-top:2px solid var(--sp-tab-active-border);font-size:16px}.tab-item--active[data-v-454e1a12]:hover{background:var(--sp-tab-active-bg)}.tab-item__name[data-v-454e1a12]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tab-rename-input[data-v-454e1a12]{width:100%;height:18px;border:none;border-radius:0;outline:none;padding:0;font-size:16px;font-family:inherit;background:var(--sp-tab-active-bg);color:var(--sp-tab-active-color);box-sizing:border-box}.tab-bar__add-btn[data-v-454e1a12]{width:24px;min-width:24px;height:24px;margin:0 4px 3px 3px;border:none;background:transparent;color:var(--sp-tab-add-btn-color);font-size:16px;line-height:22px;text-align:center;cursor:pointer;padding:0}.tab-bar__add-btn[data-v-454e1a12]:hover{background:var(--sp-tab-add-btn-hover-bg)}.spreadsheet-outer[data-v-562e145a]{flex:1;display:flex;flex-direction:column;overflow:hidden;height:100%;min-height:400px;width:100%}.formula-bar[data-v-562e145a]{display:flex;align-items:start;height:36px;min-height:36px;padding:0;gap:0}.formula-bar__cell-label[data-v-562e145a]{width:48px;min-width:48px;height:28px;line-height:28px;margin-top:4px;text-align:center;font-size:12px;font-weight:600;color:var(--sp-formula-bar-label-color);background:var(--sp-formula-bar-label-bg);border:1px solid var(--sp-formula-bar-label-border);border-radius:2px;-webkit-user-select:none;user-select:none}.formula-bar__input[data-v-562e145a]{flex:1;height:28px;margin-top:4px;border:1px solid var(--sp-formula-bar-input-border);border-radius:2px;outline:none;padding:0 6px;margin-left:4px;font-size:13px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;color:var(--sp-formula-bar-input-color);background:var(--sp-formula-bar-input-bg)}.formula-bar__input[data-v-562e145a]:focus{border-color:var(--sp-formula-bar-input-focus-border);box-shadow:0 0 0 1px var(--sp-formula-bar-input-focus-shadow)}.spreadsheet-wrapper[data-v-562e145a]{flex:1;position:relative;overflow:hidden;background:var(--sp-wrapper-bg)}.grid-canvas[data-v-562e145a]{position:absolute;top:0;left:0;display:block;outline:none;cursor:cell}.grid-canvas[data-v-562e145a]:focus{outline:none}.v-scrollbar[data-v-562e145a]{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-562e145a]{position:absolute;left:0;bottom:0;height:11px;width:calc(100% - 11px);display:flex;background:var(--sp-wrapper-bg)}.sb-corner[data-v-562e145a]{position:absolute;right:0;bottom:0;width:11px;height:11px;background:var(--sp-wrapper-bg)}.sb-btn[data-v-562e145a]{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-562e145a]:hover{background:var(--sp-scroll-btn-hover-bg, #d0d0d0)}.sb-btn[data-v-562e145a]:active{background:var(--sp-scroll-btn-active-bg, #c0c0c0)}.sb-arrow[data-v-562e145a]{display:block;width:0;height:0}.sb-arrow--up[data-v-562e145a]{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-562e145a]{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-562e145a]{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-562e145a]{border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:4px solid var(--sp-scroll-btn-color, #666)}.sb-track[data-v-562e145a]{flex:1;position:relative;background:var(--sp-scroll-track-bg, rgba(0,0,0,.06))}.sb-track--v[data-v-562e145a]{width:11px}.sb-track--h[data-v-562e145a]{height:11px}.sb-thumb[data-v-562e145a]{position:absolute;border-radius:3px;background:var(--sp-scroll-thumb);cursor:default}.sb-thumb[data-v-562e145a]:hover{background:var(--sp-scroll-thumb-hover)}.sb-thumb--v[data-v-562e145a]{left:1px;right:1px;min-height:16px}.sb-thumb--h[data-v-562e145a]{top:1px;bottom:1px;min-width:16px}.cell-editor[data-v-562e145a]{position:absolute;border:2px solid var(--sp-cell-editor-border);outline:none;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;font-size:13px;color:var(--sp-cell-editor-color);background:var(--sp-cell-editor-bg);box-shadow:0 0 0 1px var(--sp-cell-editor-shadow);z-index:10;box-sizing:border-box;min-width:0;overflow:hidden;padding:0;margin:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;resize:none;white-space:pre-wrap;word-break:break-all}.context-menu{position:fixed;z-index:10000;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;padding:4px 0;min-width:120px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;font-size:13px;transform-origin:top left}.context-menu__item{padding:6px 20px;cursor:pointer;color:#333;white-space:nowrap;position:relative;display:flex;align-items:center;justify-content:space-between}.context-menu__item:hover{background:#e8f0fe}.context-menu__item--disabled{color:#bbb;cursor:default}.context-menu__item--disabled:hover{background:transparent}.context-menu__arrow{margin-left:16px;margin-right:-5px;width:0;height:0;border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:4px solid #888}.context-submenu{display:none;position:absolute;left:100%;top:-4px;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;padding:4px 0;min-width:100px;z-index:10001}.context-submenu--left{left:auto;right:100%}.context-menu__item:hover>.context-submenu{display:block}.context-submenu .context-menu__item{justify-content:flex-start}.menu-pop-enter-active,.menu-pop-leave-active{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from,.menu-pop-leave-to{opacity:0;transform:scale(.9)}.dim-panel{position:fixed;z-index:10002;width:220px;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;padding:10px 12px;box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;-webkit-user-select:none;user-select:none;transform-origin:top left}.dim-panel__title{font-size:13px;font-weight:600;color:#333;margin-bottom:8px}.dim-panel__body{display:flex;align-items:center;gap:6px}.dim-panel__input{flex:1;height:26px;border:1px solid #c0c0c0;border-radius:3px;outline:none;padding:0 6px;font-size:13px;color:#1a1a1a;background:#fff;box-sizing:border-box}.dim-panel__input:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.dim-panel__input--error{border-color:#d93025;box-shadow:0 0 0 1px #d930254d}.dim-panel__unit{font-size:12px;color:#888}.dim-panel__error{margin-top:6px;font-size:12px;color:#d93025;line-height:1.4}.dim-panel__footer{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}.dim-panel__btn{height:26px;padding:0 14px;border:1px solid #ccc;border-radius:3px;background:#fff;color:#333;font-size:13px;cursor:pointer}.dim-panel__btn:hover{background:#f0f0f0}.dim-panel__btn--primary{border-color:#0078d7;background:#0078d7;color:#fff}.dim-panel__btn--primary:hover{background:#0069c0}
1
+ .sp-dropdown[data-v-77df3baf]{position:relative;display:inline-flex;min-width:0}.sp-dropdown__trigger[data-v-77df3baf]{display:flex;align-items:center;justify-content:space-between;gap:4px;width:100%;height:26px;border:1px solid transparent;border-radius:3px;background:transparent;color:var(--sp-toolbar-btn-color, #444);font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;cursor:pointer;padding:0 5px;box-sizing:border-box}.sp-dropdown__trigger[data-v-77df3baf]:hover{background:var(--sp-toolbar-btn-hover-bg, #e6e6e6)}.sp-dropdown__trigger--open[data-v-77df3baf]{background:var(--sp-toolbar-btn-hover-bg, #e6e6e6);border-color:var(--sp-toolbar-border, #d8d8d8)}.sp-dropdown__value[data-v-77df3baf]{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.sp-dropdown__caret[data-v-77df3baf]{width:10px;height:10px;min-width:10px;opacity:.7}.sp-dropdown__menu[data-v-77df3baf]{position:fixed;z-index:20000;display:flex;flex-direction:column;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;box-shadow:0 4px 12px #0000001f;padding:4px;box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;transform-origin:top center}.sp-dropdown__menu--up[data-v-77df3baf]{transform-origin:bottom center}.menu-pop-enter-active[data-v-77df3baf],.menu-pop-leave-active[data-v-77df3baf]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-77df3baf],.menu-pop-leave-to[data-v-77df3baf]{opacity:0;transform:scaleY(.85)}.sp-dropdown__nav[data-v-77df3baf]{display:flex;align-items:center;justify-content:center;height:15px;min-height:15px;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #666);cursor:pointer;padding:0;border-radius:3px}.sp-dropdown__nav[data-v-77df3baf]:hover:not(:disabled){background:#eef3f9}.sp-dropdown__nav[data-v-77df3baf]:disabled{color:#ccc;cursor:default}.sp-dropdown__nav svg[data-v-77df3baf]{width:10px;height:10px}.sp-dropdown__list[data-v-77df3baf]{display:flex;flex-direction:column;overflow:hidden;touch-action:none}.sp-dropdown__icon[data-v-77df3baf]{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.sp-dropdown__icon[data-v-77df3baf] svg{width:18px;height:18px;display:block}.sp-dropdown__item-icon[data-v-77df3baf]{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto}.sp-dropdown__item-icon[data-v-77df3baf] svg{width:16px;height:16px;display:block}.sp-dropdown__item-label[data-v-77df3baf]{white-space:nowrap}.sp-dropdown__item[data-v-77df3baf]{display:flex;align-items:center;gap:6px;width:100%;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #444);font-size:12px;cursor:pointer;padding:4px 8px;box-sizing:border-box;border-radius:3px}.sp-dropdown__item[data-v-77df3baf]:hover{background:#eef3f9}.sp-dropdown__item--active[data-v-77df3baf]{background:#e5f1fb;color:#0078d7}.color-picker[data-v-f8fac424]{position:relative;display:inline-flex;height:26px}.color-picker__menu[data-v-f8fac424]{position:fixed;z-index:9999;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;padding:6px;box-shadow:0 4px 12px #0000001f;-webkit-user-select:none;user-select:none;transform-origin:top right}.menu-pop-enter-active[data-v-f8fac424],.menu-pop-leave-active[data-v-f8fac424]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-f8fac424],.menu-pop-leave-to[data-v-f8fac424]{opacity:0;transform:scale(.9)}.color-picker__row[data-v-f8fac424]{display:flex;gap:4px;margin-bottom:4px}.color-picker__row[data-v-f8fac424]:last-child{margin-bottom:0}.color-picker__swatch[data-v-f8fac424]{width:20px;height:20px;padding:0;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:transform .08s,box-shadow .08s;position:relative}.color-picker__swatch[data-v-f8fac424]:hover{transform:scale(1.18);box-shadow:0 0 0 1px #0003;z-index:1}.color-picker__swatch--selected[data-v-f8fac424]{box-shadow:0 0 0 2px #0078d7}.border-picker[data-v-f362abdb]{position:relative;display:inline-flex;height:26px}.border-picker__menu[data-v-f362abdb]{position:fixed;z-index:9999;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;box-shadow:0 4px 12px #0000001f;-webkit-user-select:none;user-select:none;padding:4px;transform-origin:top right}.border-picker__item[data-v-f362abdb]{display:flex;align-items:center;gap:6px;width:100%;padding:4px 8px;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #444);cursor:pointer;border-radius:3px;font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;white-space:nowrap}.border-picker__item[data-v-f362abdb]:hover{background:#eef3f9}.border-picker__icon[data-v-f362abdb]{width:18px;height:18px;flex-shrink:0}.border-picker__label[data-v-f362abdb]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-f362abdb],.menu-pop-leave-active[data-v-f362abdb]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-f362abdb],.menu-pop-leave-to[data-v-f362abdb]{opacity:0;transform:scale(.9)}.merge-picker[data-v-67c0f9e3]{position:relative;display:inline-flex;height:26px}.merge-picker__menu[data-v-67c0f9e3]{position:fixed;z-index:9999;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;box-shadow:0 4px 12px #0000001f;-webkit-user-select:none;user-select:none;padding:4px;transform-origin:top right}.merge-picker__item[data-v-67c0f9e3]{display:flex;align-items:center;gap:6px;width:100%;padding:4px 8px;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #444);cursor:pointer;border-radius:3px;font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;white-space:nowrap}.merge-picker__item[data-v-67c0f9e3]:hover{background:#eef3f9}.merge-picker__icon[data-v-67c0f9e3]{width:18px;height:18px;flex-shrink:0;display:flex;align-items:center;justify-content:center}.merge-picker__icon[data-v-67c0f9e3] svg{width:18px;height:18px}.merge-picker__label[data-v-67c0f9e3]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-67c0f9e3],.menu-pop-leave-active[data-v-67c0f9e3]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-67c0f9e3],.menu-pop-leave-to[data-v-67c0f9e3]{opacity:0;transform:scale(.9)}.calc-picker[data-v-08615aee]{position:relative;display:inline-flex;height:26px}.calc-picker__menu[data-v-08615aee]{position:fixed;z-index:9999;min-width:120px;background:#fff;border:1px solid var(--sp-toolbar-border, #d0d0d0);border-radius:4px;box-shadow:0 4px 12px #0000001f;-webkit-user-select:none;user-select:none;padding:4px;transform-origin:top right}.calc-picker__item[data-v-08615aee]{display:flex;align-items:center;gap:6px;width:100%;padding:4px 8px;border:none;background:transparent;color:var(--sp-toolbar-btn-color, #444);cursor:pointer;border-radius:3px;font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;white-space:nowrap}.calc-picker__item[data-v-08615aee]:hover:not(.calc-picker__item--disabled){background:#eef3f9}.calc-picker__item--disabled[data-v-08615aee]{color:var(--sp-toolbar-btn-disabled-color, #bbb);cursor:default}.calc-picker__label[data-v-08615aee]{overflow:hidden;text-overflow:ellipsis}.menu-pop-enter-active[data-v-08615aee],.menu-pop-leave-active[data-v-08615aee]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-08615aee],.menu-pop-leave-to[data-v-08615aee]{opacity:0;transform:scale(.9)}.toolbar[data-v-a33ba577]{position:relative;display:flex;align-items:center;height:32px;min-height:32px;gap:2px;padding:0 6px;background:var(--sp-toolbar-bg);border-bottom:1px solid var(--sp-toolbar-border);-webkit-user-select:none;user-select:none}.tb-item[data-v-a33ba577]{display:flex;align-items:center;flex:0 0 auto}.toolbar-sep[data-v-a33ba577]{width:1px;height:18px;margin:0 4px;background:var(--sp-toolbar-border)}.toolbar-font[data-v-a33ba577],.toolbar-number-format[data-v-a33ba577],.toolbar-align[data-v-a33ba577]{flex:0 0 auto}.toolbar-font-size[data-v-a33ba577]{display:inline-flex;align-items:center;gap:0;height:26px;position:relative}.toolbar-font-size__input[data-v-a33ba577]{width:36px;height:26px;border:1px solid transparent;border-right:none;border-radius:3px 0 0 3px;background:transparent;color:var(--sp-toolbar-btn-color);font-size:12px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;text-align:left;padding:0 5px;outline:none;box-sizing:border-box;-webkit-appearance:none;appearance:none;-moz-appearance:textfield}.toolbar-font-size__input[data-v-a33ba577]::-webkit-outer-spin-button,.toolbar-font-size__input[data-v-a33ba577]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.toolbar-font-size__input[data-v-a33ba577]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__input[data-v-a33ba577]:focus{border-color:var(--sp-toolbar-border);background:#fff}.toolbar-font-size__btn[data-v-a33ba577]{display:flex;align-items:center;justify-content:center;width:16px;height:26px;border:1px solid transparent;border-left:none;border-radius:0 3px 3px 0;background:transparent;color:var(--sp-toolbar-btn-color);cursor:pointer;padding:0}.toolbar-font-size__btn[data-v-a33ba577]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-font-size__btn svg[data-v-a33ba577]{width:10px;height:10px}.toolbar-font-size__dropdown[data-v-a33ba577]{position:absolute;width:56px;height:26px;pointer-events:none}.toolbar-btn[data-v-a33ba577]{display:flex;align-items:center;justify-content:center;width:30px;height:26px;border:none;border-radius:3px;background:transparent;color:var(--sp-toolbar-btn-color);cursor:pointer;padding:0}.toolbar-btn[data-v-a33ba577]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-btn[data-v-a33ba577]:active:not(:disabled){opacity:.7}.toolbar-btn--active[data-v-a33ba577]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-btn--step[data-v-a33ba577]{width:26px;height:26px}.toolbar-btn--step svg[data-v-a33ba577]{width:16px;height:16px}.toolbar-btn[data-v-a33ba577]:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.toolbar-btn__icon[data-v-a33ba577]{width:18px;height:18px}.toolbar-btn svg[data-v-a33ba577]:not(.toolbar-btn__icon){width:18px;height:18px}.toolbar-split[data-v-a33ba577]{display:inline-flex;align-items:center;position:relative;height:26px}.toolbar-split__main[data-v-a33ba577]{border:1px solid transparent;border-right:none;border-radius:3px 0 0 3px}.toolbar-split__arrow[data-v-a33ba577]{display:flex;align-items:center;justify-content:center;width:16px;height:26px;border:1px solid transparent;border-radius:0 3px 3px 0;background:transparent;color:var(--sp-toolbar-btn-color);cursor:pointer;padding:0}.toolbar-split__arrow[data-v-a33ba577]:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.toolbar-split__arrow svg[data-v-a33ba577]{width:10px!important;height:10px!important}.toolbar-more[data-v-a33ba577]{display:flex;align-items:center;justify-content:center;width:30px;height:26px;border:none;border-radius:3px;background:transparent;color:var(--sp-toolbar-btn-color);cursor:pointer;padding:0;flex:0 0 auto;margin-left:auto}.toolbar-more[data-v-a33ba577]:hover{background:var(--sp-toolbar-btn-hover-bg)}.toolbar-more--active[data-v-a33ba577]{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.toolbar-more svg[data-v-a33ba577]{width:18px;height:18px}.overflow-menu[data-v-a33ba577]{min-width:180px;max-width:260px;max-height:calc(100vh - 40px);overflow-y:auto;background:var(--sp-toolbar-bg, #fff);border:1px solid var(--sp-toolbar-border);border-radius:4px;box-shadow:0 4px 12px #0000001f;padding:4px 6px;display:flex;flex-direction:column;gap:2px;z-index:1000;transform-origin:top right}.overflow-menu.no-anim[data-v-a33ba577]{transition:none!important}.overflow-menu .tb-item[data-v-a33ba577]{width:100%}.overflow-menu .toolbar-sep[data-v-a33ba577]{width:100%;height:1px;margin:2px 0}.overflow-menu .toolbar-split[data-v-a33ba577]{width:100%}.overflow-menu .toolbar-split__main[data-v-a33ba577]{flex:1 1 auto;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-font-size[data-v-a33ba577]{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font[data-v-a33ba577],.overflow-menu .toolbar-number-format[data-v-a33ba577],.overflow-menu .toolbar-align[data-v-a33ba577]{width:100%}.overflow-menu .toolbar-btn[data-v-a33ba577]:not(.toolbar-btn--step):not(.toolbar-split__arrow){width:100%;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-color[data-v-a33ba577]{width:100%}.overflow-menu .toolbar-wrap[data-v-a33ba577]{width:100%;justify-content:flex-start}.menu-pop-enter-active[data-v-a33ba577],.menu-pop-leave-active[data-v-a33ba577]{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from[data-v-a33ba577],.menu-pop-leave-to[data-v-a33ba577]{opacity:0;transform:scale(.9)}.overflow-menu .tb-item{width:100%}.overflow-menu .toolbar-sep{width:100%;height:1px;margin:2px 0}.overflow-menu .toolbar-split{width:100%}.overflow-menu .toolbar-split__main{flex:1 1 auto;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-font-size{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font,.overflow-menu .toolbar-number-format,.overflow-menu .toolbar-align{width:100%}.overflow-menu .toolbar-btn:not(.toolbar-btn--step):not(.toolbar-split__arrow){width:100%;justify-content:flex-start;padding-left:6px}.overflow-menu .toolbar-color{width:100%}.overflow-menu .toolbar-wrap{width:100%;justify-content:flex-start}.overflow-menu .toolbar-font-size__input{flex:1 1 auto;width:auto;min-width:40px}.overflow-menu .toolbar-btn:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-btn:active:not(:disabled){opacity:.7}.overflow-menu .toolbar-btn--active{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.overflow-menu .toolbar-btn:disabled{color:var(--sp-toolbar-btn-disabled-color);cursor:default}.overflow-menu .toolbar-split__main:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-split__arrow:hover:not(:disabled){background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-font-size__input:hover{background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-font-size__input:focus{border-color:var(--sp-toolbar-border);background:#fff}.overflow-menu .toolbar-font-size__btn:hover,.overflow-menu .toolbar-more:hover{background:var(--sp-toolbar-btn-hover-bg)}.overflow-menu .toolbar-more--active{background:var(--sp-toolbar-btn-hover-bg);color:var(--sp-toolbar-btn-active-color)}.tab-bar[data-v-454e1a12]{display:flex;align-items:stretch;height:30px;min-height:30px;background:var(--sp-tab-bar-bg);border-top:1px solid var(--sp-tab-bar-border);-webkit-user-select:none;user-select:none;margin-top:4px}.tab-list[data-v-454e1a12]{display:flex;align-items:flex-start;flex:1;overflow:hidden;gap:1px;padding:0 1px}.tab-item[data-v-454e1a12]{display:flex;align-items:center;height:28px;min-width:0;max-width:120px;padding:0 10px;cursor:pointer;border:1px solid var(--sp-tab-inactive-border);background:var(--sp-tab-inactive-bg);color:var(--sp-tab-inactive-color);font-size:14px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;white-space:nowrap;transition:background .1s}.tab-item[data-v-454e1a12]:hover{background:var(--sp-tab-hover-bg)}.tab-item--active[data-v-454e1a12]{height:28px;background:var(--sp-tab-active-bg);color:var(--sp-tab-active-color);border-color:var(--sp-tab-active-bg) var(--sp-tab-bar-border) var(--sp-tab-bar-border);border-top:2px solid var(--sp-tab-active-border);font-size:16px}.tab-item--active[data-v-454e1a12]:hover{background:var(--sp-tab-active-bg)}.tab-item__name[data-v-454e1a12]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tab-rename-input[data-v-454e1a12]{width:100%;height:18px;border:none;border-radius:0;outline:none;padding:0;font-size:16px;font-family:inherit;background:var(--sp-tab-active-bg);color:var(--sp-tab-active-color);box-sizing:border-box}.tab-bar__add-btn[data-v-454e1a12]{width:24px;min-width:24px;height:24px;margin:0 4px 3px 3px;border:none;background:transparent;color:var(--sp-tab-add-btn-color);font-size:16px;line-height:22px;text-align:center;cursor:pointer;padding:0}.tab-bar__add-btn[data-v-454e1a12]:hover{background:var(--sp-tab-add-btn-hover-bg)}.nf-dialog__mask[data-v-69cb36b7]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:30000;background:rgba(0,0,0,.25);display:flex;align-items:center;justify-content:center}.nf-dialog[data-v-69cb36b7]{width:380px;max-width:calc(100vw - 32px);max-height:calc(100vh - 48px);overflow-y:auto;background:#fff;border:1px solid #d0d0d0;border-radius:6px;box-shadow:0 8px 24px #0000002e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;color:#1a1a1a;-webkit-user-select:none;user-select:none}.nf-dialog__header[data-v-69cb36b7]{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;border-bottom:1px solid #ececec}.nf-dialog__title[data-v-69cb36b7]{font-size:13px;font-weight:600}.nf-dialog__close[data-v-69cb36b7]{display:flex;align-items:center;justify-content:center;width:22px;height:22px;border:none;background:transparent;color:#888;cursor:pointer;border-radius:3px;padding:0}.nf-dialog__close[data-v-69cb36b7]:hover{background:#f0f0f0;color:#444}.nf-dialog__close svg[data-v-69cb36b7]{width:14px;height:14px}.nf-dialog__body[data-v-69cb36b7]{padding:12px 14px;display:flex;flex-direction:column;gap:10px}.nf-field[data-v-69cb36b7]{display:flex;align-items:center;gap:8px}.nf-field--inline[data-v-69cb36b7]{min-height:26px}.nf-field__label[data-v-69cb36b7]{width:88px;min-width:88px;font-size:12px;color:#555}.nf-field__select[data-v-69cb36b7],.nf-field__input[data-v-69cb36b7]{flex:1;height:26px;border:1px solid #c0c0c0;border-radius:3px;background:#fff;font-size:12px;color:#1a1a1a;padding:0 6px;outline:none;box-sizing:border-box;font-family:inherit}.nf-field__select[data-v-69cb36b7]:focus,.nf-field__input[data-v-69cb36b7]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.nf-field__textarea[data-v-69cb36b7]{flex:1;min-height:44px;border:1px solid #c0c0c0;border-radius:3px;background:#fff;font-size:12px;color:#1a1a1a;padding:4px 6px;outline:none;box-sizing:border-box;resize:none;font-family:Consolas,Courier New,monospace}.nf-field__textarea[data-v-69cb36b7]:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.nf-checkbox[data-v-69cb36b7]{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:#333;cursor:pointer}.nf-checkbox input[data-v-69cb36b7]{margin:0;cursor:pointer}.nf-dialog__footer[data-v-69cb36b7]{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 14px;border-top:1px solid #ececec}.nf-preview[data-v-69cb36b7]{display:flex;flex-direction:column;gap:2px;min-width:0}.nf-preview__label[data-v-69cb36b7]{font-size:11px;color:#888}.nf-preview__value[data-v-69cb36b7]{font-size:13px;color:#1a1a1a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:180px}.nf-dialog__actions[data-v-69cb36b7]{display:flex;gap:8px}.nf-btn[data-v-69cb36b7]{height:28px;padding:0 16px;border:1px solid #ccc;border-radius:3px;background:#fff;color:#333;font-size:12px;cursor:pointer;font-family:inherit}.nf-btn[data-v-69cb36b7]:hover{background:#f0f0f0}.nf-btn--primary[data-v-69cb36b7]{border-color:#0078d7;background:#0078d7;color:#fff}.nf-btn--primary[data-v-69cb36b7]:hover{background:#0069c0}.nf-dialog-enter-active[data-v-69cb36b7],.nf-dialog-leave-active[data-v-69cb36b7]{transition:opacity .14s ease-out}.nf-dialog-enter-from[data-v-69cb36b7],.nf-dialog-leave-to[data-v-69cb36b7]{opacity:0}.nf-dialog-enter-active .nf-dialog[data-v-69cb36b7],.nf-dialog-leave-active .nf-dialog[data-v-69cb36b7]{transition:transform .14s ease-out}.nf-dialog-enter-from .nf-dialog[data-v-69cb36b7],.nf-dialog-leave-to .nf-dialog[data-v-69cb36b7]{transform:scale(.96)}.spreadsheet-outer[data-v-6321c060]{flex:1;display:flex;flex-direction:column;overflow:hidden;height:100%;min-height:400px;width:100%}.formula-bar[data-v-6321c060]{display:flex;align-items:flex-start;min-height:36px;padding:0;gap:0}.formula-bar--expanded[data-v-6321c060]{min-height:72px}.formula-bar__cell-label[data-v-6321c060]{width:48px;min-width:48px;height:28px;line-height:28px;margin-top:4px;text-align:center;font-size:12px;font-weight:600;color:var(--sp-formula-bar-label-color);background:var(--sp-formula-bar-label-bg);border:1px solid var(--sp-formula-bar-label-border);border-radius:2px;-webkit-user-select:none;user-select:none}.formula-bar__buttons[data-v-6321c060]{display:inline-flex;align-items:stretch;margin-top:4px;margin-left:6px;height:28px;border:1px solid var(--sp-formula-bar-input-border);border-radius:2px;overflow:hidden;background:var(--sp-formula-bar-input-bg)}.formula-bar__btn[data-v-6321c060]{width:22px;height:28px;border:none;border-radius:0;background:transparent;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0;-webkit-user-select:none;user-select:none;color:inherit}.formula-bar__btn+.formula-bar__btn[data-v-6321c060]{border-left:1px solid var(--sp-formula-bar-input-border)}.formula-bar__btn[data-v-6321c060]:hover{background:var(--sp-scroll-btn-hover-bg, #f0f0f0)}.formula-bar__btn--cancel[data-v-6321c060]:hover{color:#e53935;background:#fdecea}.formula-bar__btn--accept[data-v-6321c060]:hover{color:#2e7d32;background:#e8f5e9}.formula-bar__input[data-v-6321c060]{flex:1;min-height:28px;height:28px;line-height:20px;margin-top:4px;border:1px solid var(--sp-formula-bar-input-border);border-radius:2px;outline:none;padding:3px 6px;margin-left:4px;font-size:13px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;color:var(--sp-formula-bar-input-color);background:var(--sp-formula-bar-input-bg);resize:none;overflow:hidden;box-sizing:border-box}.formula-bar__input--expanded[data-v-6321c060]{height:68px;overflow:auto}.formula-bar__input[data-v-6321c060]:focus{border-color:var(--sp-formula-bar-input-focus-border);box-shadow:0 0 0 1px var(--sp-formula-bar-input-focus-shadow)}.formula-bar__toggle[data-v-6321c060]{width:22px;min-width:22px;height:28px;margin-top:4px;margin-left:2px;margin-right:2px;border:1px solid var(--sp-formula-bar-input-border);border-radius:2px;background:var(--sp-formula-bar-input-bg);color:var(--sp-formula-bar-input-color);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0;-webkit-user-select:none;user-select:none}.formula-bar__toggle[data-v-6321c060]:hover{background:var(--sp-scroll-btn-hover-bg, #e8e8e8)}.spreadsheet-wrapper[data-v-6321c060]{flex:1;position:relative;overflow:hidden;background:var(--sp-wrapper-bg)}.grid-canvas[data-v-6321c060]{position:absolute;top:0;left:0;display:block;outline:none;cursor:cell}.grid-canvas[data-v-6321c060]:focus{outline:none}.v-scrollbar[data-v-6321c060]{position:absolute;right:0;top:0;width:11px;height:calc(100% - 11px);display:flex;flex-direction:column;background:var(--sp-wrapper-bg)}.h-scrollbar[data-v-6321c060]{position:absolute;left:0;bottom:0;height:11px;width:calc(100% - 11px);display:flex;background:var(--sp-wrapper-bg)}.sb-corner[data-v-6321c060]{position:absolute;right:0;bottom:0;width:11px;height:11px;background:var(--sp-wrapper-bg)}.sb-btn[data-v-6321c060]{width:11px;height:11px;min-width:11px;min-height:11px;border:none;background:var(--sp-scroll-btn-bg, #e8e8e8);display:flex;align-items:center;justify-content:center;cursor:pointer;padding:0;-webkit-user-select:none;user-select:none}.sb-btn[data-v-6321c060]:hover{background:var(--sp-scroll-btn-hover-bg, #d0d0d0)}.sb-btn[data-v-6321c060]:active{background:var(--sp-scroll-btn-active-bg, #c0c0c0)}.sb-arrow[data-v-6321c060]{display:block;width:0;height:0}.sb-arrow--up[data-v-6321c060]{border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:4px solid var(--sp-scroll-btn-color, #666)}.sb-arrow--down[data-v-6321c060]{border-left:3px solid transparent;border-right:3px solid transparent;border-top:4px solid var(--sp-scroll-btn-color, #666)}.sb-arrow--left[data-v-6321c060]{border-top:3px solid transparent;border-bottom:3px solid transparent;border-right:4px solid var(--sp-scroll-btn-color, #666)}.sb-arrow--right[data-v-6321c060]{border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:4px solid var(--sp-scroll-btn-color, #666)}.sb-track[data-v-6321c060]{flex:1;position:relative;background:var(--sp-scroll-track-bg, rgba(0,0,0,.06))}.sb-track--v[data-v-6321c060]{width:11px}.sb-track--h[data-v-6321c060]{height:11px}.sb-thumb[data-v-6321c060]{position:absolute;border-radius:3px;background:var(--sp-scroll-thumb);cursor:default}.sb-thumb[data-v-6321c060]:hover{background:var(--sp-scroll-thumb-hover)}.sb-thumb--v[data-v-6321c060]{left:1px;right:1px;min-height:16px}.sb-thumb--h[data-v-6321c060]{top:1px;bottom:1px;min-width:16px}.cell-editor[data-v-6321c060]{position:absolute;border:2px solid var(--sp-cell-editor-border);outline:none;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;font-size:13px;color:var(--sp-cell-editor-color);background:var(--sp-cell-editor-bg);box-shadow:0 0 0 1px var(--sp-cell-editor-shadow);z-index:10;box-sizing:border-box;min-width:0;overflow:hidden;padding:0;margin:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;resize:none;white-space:pre-wrap;word-break:break-all}.context-menu{position:fixed;z-index:10000;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;padding:4px 0;min-width:120px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;font-size:13px;transform-origin:top left}.context-menu__item{padding:6px 20px;cursor:pointer;color:#333;white-space:nowrap;position:relative;display:flex;align-items:center;justify-content:space-between}.context-menu__item:hover{background:#e8f0fe}.context-menu__item--disabled{color:#bbb;cursor:default}.context-menu__item--disabled:hover{background:transparent}.context-menu__arrow{margin-left:16px;margin-right:-5px;width:0;height:0;border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:4px solid #888}.context-submenu{display:none;position:absolute;left:100%;top:-4px;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;padding:4px 0;min-width:100px;z-index:10001}.context-submenu--left{left:auto;right:100%}.context-menu__item:hover>.context-submenu{display:block}.context-submenu .context-menu__item{justify-content:flex-start}.menu-pop-enter-active,.menu-pop-leave-active{transition:opacity .12s ease-out,transform .12s ease-out}.menu-pop-enter-from,.menu-pop-leave-to{opacity:0;transform:scale(.9)}.dim-panel{position:fixed;z-index:10002;width:220px;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;padding:10px 12px;box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;-webkit-user-select:none;user-select:none;transform-origin:top left}.dim-panel__title{font-size:13px;font-weight:600;color:#333;margin-bottom:8px}.dim-panel__body{display:flex;align-items:center;gap:6px}.dim-panel__input{flex:1;height:26px;border:1px solid #c0c0c0;border-radius:3px;outline:none;padding:0 6px;font-size:13px;color:#1a1a1a;background:#fff;box-sizing:border-box}.dim-panel__input:focus{border-color:#0078d7;box-shadow:0 0 0 1px #0078d74d}.dim-panel__input--error{border-color:#d93025;box-shadow:0 0 0 1px #d930254d}.dim-panel__unit{font-size:12px;color:#888}.dim-panel__error{margin-top:6px;font-size:12px;color:#d93025;line-height:1.4}.dim-panel__footer{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}.dim-panel__btn{height:26px;padding:0 14px;border:1px solid #ccc;border-radius:3px;background:#fff;color:#333;font-size:13px;cursor:pointer}.dim-panel__btn:hover{background:#f0f0f0}.dim-panel__btn--primary{border-color:#0078d7;background:#0078d7;color:#fff}.dim-panel__btn--primary:hover{background:#0069c0}
@@ -10,6 +10,8 @@ type __VLS_Props = {
10
10
  hideTrigger?: boolean;
11
11
  align?: 'left' | 'right';
12
12
  triggerEl?: HTMLElement | null;
13
+ /** 当前值未命中任何选项时触发器显示的占位文本(如选区格式不一致时的「混合」) */
14
+ fallbackLabel?: string;
13
15
  };
14
16
  declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
15
17
  "update:modelValue": (v: string | number) => void;
@@ -28,6 +30,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
28
30
  hideTrigger: boolean;
29
31
  align: "left" | "right";
30
32
  triggerEl: HTMLElement | null;
33
+ fallbackLabel: string;
31
34
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
32
35
  rootRef: HTMLDivElement;
33
36
  menuRef: HTMLDivElement;
@@ -0,0 +1,23 @@
1
+ type __VLS_Props = {
2
+ modelOpen?: boolean;
3
+ locale?: string;
4
+ /** 当前选区格式(混合时由父组件传入空串,从常规开始) */
5
+ currentFormat?: string;
6
+ /** 预览样例值(默认 1234.5) */
7
+ sampleValue?: string;
8
+ };
9
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
10
+ "update:modelOpen": (v: boolean) => any;
11
+ apply: (formatCode: string) => any;
12
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
13
+ "onUpdate:modelOpen"?: ((v: boolean) => any) | undefined;
14
+ onApply?: ((formatCode: string) => any) | undefined;
15
+ }>, {
16
+ modelOpen: boolean;
17
+ locale: string;
18
+ currentFormat: string;
19
+ sampleValue: string;
20
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
21
+ customCodeRef: HTMLTextAreaElement;
22
+ }, any>;
23
+ export default _default;
@@ -1,4 +1,5 @@
1
1
  import type { FontOption, MergeType } from '../core/constants';
2
+ import { type NFOption } from '../core/number-format';
2
3
  import { type BorderType } from './pickers/borderPicker.vue';
3
4
  type __VLS_Props = {
4
5
  locale: string;
@@ -33,6 +34,8 @@ type __VLS_Props = {
33
34
  calcMenuOpen: boolean;
34
35
  isSingleCell: boolean;
35
36
  themeVars?: Record<string, string>;
37
+ selNumberFormat: string;
38
+ nfOptions: NFOption[];
36
39
  };
37
40
  declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
38
41
  undo: () => void;
@@ -52,6 +55,8 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
52
55
  "apply-border": () => void;
53
56
  "wrap-toggle": () => void;
54
57
  "apply-merge": () => void;
58
+ "calc-sum": () => void;
59
+ "calc-avg": () => void;
55
60
  "font-family-change": (v: string | number) => void;
56
61
  "font-size-change": (v: string | number) => void;
57
62
  "h-align-change": (v: string | number) => void;
@@ -59,6 +64,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
59
64
  "font-size-input": (v: string) => void;
60
65
  "text-color-change": (v: string) => void;
61
66
  "fill-color-change": (v: string) => void;
67
+ "number-format-change": (v: string) => void;
62
68
  "font-size-keydown": (ev: KeyboardEvent) => void;
63
69
  "update:font-size-menu-open": (v: boolean) => void;
64
70
  "update:text-color-menu-open": (v: boolean) => void;
@@ -68,8 +74,6 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
68
74
  "update:calc-menu-open": (v: boolean) => void;
69
75
  "border-change": (v: BorderType) => void;
70
76
  "merge-change": (v: MergeType) => void;
71
- "calc-sum": () => void;
72
- "calc-avg": () => void;
73
77
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
74
78
  onUndo?: (() => any) | undefined;
75
79
  onRedo?: (() => any) | undefined;
@@ -88,6 +92,8 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
88
92
  "onApply-border"?: (() => any) | undefined;
89
93
  "onWrap-toggle"?: (() => any) | undefined;
90
94
  "onApply-merge"?: (() => any) | undefined;
95
+ "onCalc-sum"?: (() => any) | undefined;
96
+ "onCalc-avg"?: (() => any) | undefined;
91
97
  "onFont-family-change"?: ((v: string | number) => any) | undefined;
92
98
  "onFont-size-change"?: ((v: string | number) => any) | undefined;
93
99
  "onH-align-change"?: ((v: string | number) => any) | undefined;
@@ -95,6 +101,7 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
95
101
  "onFont-size-input"?: ((v: string) => any) | undefined;
96
102
  "onText-color-change"?: ((v: string) => any) | undefined;
97
103
  "onFill-color-change"?: ((v: string) => any) | undefined;
104
+ "onNumber-format-change"?: ((v: string) => any) | undefined;
98
105
  "onFont-size-keydown"?: ((ev: KeyboardEvent) => any) | undefined;
99
106
  "onUpdate:font-size-menu-open"?: ((v: boolean) => any) | undefined;
100
107
  "onUpdate:text-color-menu-open"?: ((v: boolean) => any) | undefined;
@@ -104,8 +111,6 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {
104
111
  "onUpdate:calc-menu-open"?: ((v: boolean) => any) | undefined;
105
112
  "onBorder-change"?: ((v: BorderType) => any) | undefined;
106
113
  "onMerge-change"?: ((v: MergeType) => any) | undefined;
107
- "onCalc-sum"?: (() => any) | undefined;
108
- "onCalc-avg"?: (() => any) | undefined;
109
114
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {
110
115
  rootEl: HTMLDivElement;
111
116
  fontSizeArrowRef: HTMLButtonElement;
@@ -1,6 +1,13 @@
1
1
  import { type ComputedRef, type Ref } from 'vue';
2
2
  import { FormulaDeps } from '../core/formula';
3
3
  import type { CellCoord, CellData, SelectionRange } from '../core/types';
4
+ /** 选区触发方式,影响「合并单元格是否扩大选区」。
5
+ * - 'cell':单元格点击/拖动(默认)→ 保持现有 expandSelectionForMerges 行为
6
+ * - 'row' :行头点击/拖动 → Excel 风格「穿透」合并,选区矩形保持用户点击的行范围
7
+ * - 'col' :列头点击/拖动 → 同上,选区矩形保持用户点击的列范围
8
+ * - 'all' :左上角全选按钮 → expandSelectionForMerges 行为
9
+ */
10
+ export type SelectionMode = 'cell' | 'row' | 'col' | 'all';
4
11
  export interface CoreState {
5
12
  props: {
6
13
  rowCount: number;
@@ -47,9 +54,12 @@ export interface CoreState {
47
54
  totalWidth: ComputedRef<number>;
48
55
  totalHeight: ComputedRef<number>;
49
56
  selectCell: (c: number, r: number) => void;
50
- selectRange: (sC: number, sR: number, eC: number, eR: number) => void;
57
+ selectRange: (sC: number, sR: number, eC: number, eR: number, mode?: SelectionMode) => void;
51
58
  selectAll: () => void;
52
59
  isSelected: (c: number, r: number) => boolean;
60
+ /** 渲染高亮专用:整行/整列选择模式下「穿透」合并单元格,仅判断 (c,r) 自身是否在选区矩形内 */
61
+ isCellSelected: (c: number, r: number) => boolean;
62
+ selectionMode: Ref<SelectionMode>;
53
63
  cellKey: (c: number, r: number) => string;
54
64
  delCell: (k: string) => void;
55
65
  findMerge: (c: number, r: number) => {
@@ -9,10 +9,14 @@ export interface InteractionsState {
9
9
  render: () => void;
10
10
  activeCellLabel: ComputedRef<string>;
11
11
  formulaBarDisplay: ComputedRef<string>;
12
+ formulaBarDraft: Ref<string>;
13
+ formulaBarExpanded: Ref<boolean>;
12
14
  onFormulaBarFocus: () => void;
13
15
  onFormulaBarInput: (e: Event) => void;
14
16
  onFormulaBarKeydown: (e: KeyboardEvent) => void;
15
17
  onFormulaBarBlur: () => void;
18
+ acceptFormulaBarEdit: () => void;
19
+ cancelFormulaBarEdit: () => void;
16
20
  renTab: Ref<number | null>;
17
21
  renTabVal: Ref<string>;
18
22
  onTabClick: (i: number) => void;
@@ -27,7 +27,7 @@ export interface SheetsOpsState {
27
27
  wrapperRef: Ref<HTMLDivElement | null>;
28
28
  canvasRef: Ref<HTMLCanvasElement | null>;
29
29
  editInputRef: Ref<HTMLTextAreaElement | null>;
30
- formulaBarRef: Ref<HTMLInputElement | null>;
30
+ formulaBarRef: Ref<HTMLTextAreaElement | null>;
31
31
  viewSize: {
32
32
  w: number;
33
33
  h: number;
@@ -2,6 +2,7 @@ import { type ComputedRef, type Ref } from 'vue';
2
2
  import type { FontOption } from '../core/constants';
3
3
  import type { CoreState } from './core-state';
4
4
  import type { CellData, SheetState } from '../core/types';
5
+ import { type NFOption } from '../core/number-format';
5
6
  export interface UndoStylesState {
6
7
  undoStack: Ref<UndoSnap[]>;
7
8
  redoStack: Ref<UndoSnap[]>;
@@ -67,6 +68,13 @@ export interface UndoStylesState {
67
68
  selFillColor: ComputedRef<string>;
68
69
  borderMenuOpen?: Ref<boolean>;
69
70
  mergeMenuOpen?: Ref<boolean>;
71
+ nfOptions: ComputedRef<NFOption[]>;
72
+ selNumberFormat: ComputedRef<string>;
73
+ NF_NUMBER_FORMAT_MIXED: string;
74
+ nfDialogOpen: Ref<boolean>;
75
+ onNumberFormatChange: (v: string) => void;
76
+ openNumberFormatDialog: () => void;
77
+ applyNumberFormatCode: (code: string) => void;
70
78
  }
71
79
  interface UndoSnap {
72
80
  sheets: SheetState[];
@@ -0,0 +1,100 @@
1
+ export declare const NF_CUSTOM = "__nf_custom__";
2
+ export declare const NF_MIXED = "\u0001";
3
+ export declare const NF_GENERAL = "";
4
+ export declare const NF_TEXT = "@";
5
+ /**
6
+ * formatNumber 的特殊返回值:表示"当前格式+数值组合在 Excel 语义下非法",
7
+ * 例如 date 格式 序列号<0/≥2958466、duration 格式 序列号<0。
8
+ * 渲染端必须把该字符串按列宽替换为连续 '#' 填充(不显示此标识符本身)。
9
+ */
10
+ export declare const NF_INVALID_VALUE = "__NF_INVALID__";
11
+ /** Excel 1900 日期系统最大合法序列号(对应 9999-12-31)。超过或为负 → 整格 ###。 */
12
+ export declare const EXCEL_DATE_MAX_SERIAL = 2958465;
13
+ /** Excel 1900 日期系统最小合法序列号(0 = 1900-01-00,作为下界兜底,实际 UI 一般从 1 开始)。 */
14
+ export declare const EXCEL_DATE_MIN_SERIAL = 0;
15
+ /** 判断格式代码是否为 General(含空串、undefined、'General'、'GENERAL' 等) */
16
+ export declare function isGeneralFormat(format: string | undefined | null): boolean;
17
+ export type NFKind = 'general' | 'text' | 'number' | 'date' | 'duration';
18
+ export interface NFSection {
19
+ /** 是否含有数字占位符(0/#/?);无占位符的区段视为纯文本字面量 */
20
+ hasDigits: boolean;
21
+ /** 小数最大位数(0/#/? 的总数) */
22
+ decimals: number;
23
+ /** 强制小数位数(0 的个数,决定尾随 0 的数量) */
24
+ minDecimals: number;
25
+ /** 整数部分强制最少位数(0 的个数) */
26
+ minIntDigits: number;
27
+ /** 是否使用千位分隔符 */
28
+ thousands: boolean;
29
+ /** 缩放倍数(百分比为 100) */
30
+ scale: number;
31
+ /** 科学计数法 */
32
+ scientific: boolean;
33
+ /** 数字前的字面量(货币符号等) */
34
+ prefix: string;
35
+ /** 数字后的字面量(如 %) */
36
+ suffix: string;
37
+ /** 区段颜色([Red] 等,渲染层可忽略) */
38
+ color?: string;
39
+ }
40
+ export type NFDateTokenType = 'literal' | 'year' | 'month' | 'monthName' | 'day' | 'weekday' | 'hour' | 'minute' | 'second' | 'ampm';
41
+ export interface NFToken {
42
+ type: NFDateTokenType;
43
+ /** literal 类型的原始文本 */
44
+ text?: string;
45
+ /** 占位符长度(如 yyyy → 4) */
46
+ len: number;
47
+ }
48
+ export interface NFParsed {
49
+ kind: NFKind;
50
+ /** 数值区段(number 类型使用;可能含正/负/零/文本多个区段) */
51
+ sections: NFSection[];
52
+ /** 日期/时间/持续时间的 token 序列 */
53
+ tokens: NFToken[];
54
+ /** 是否为持续时间(含 [h]/[mm]/[ss]) */
55
+ isDuration: boolean;
56
+ raw: string;
57
+ }
58
+ export interface NFOption {
59
+ label: string;
60
+ value: string;
61
+ }
62
+ export declare function parseNumberFormat(format: string): NFParsed;
63
+ /** 清空解析缓存(主要用于测试/资源释放) */
64
+ export declare function clearNumberFormatCache(): void;
65
+ /**
66
+ * 将单元格原始字符串值按格式代码格式化为显示文本。
67
+ * 绝不修改传入的 value。
68
+ */
69
+ export declare function formatNumber(value: string, format: string | undefined | null, locale: string): string;
70
+ export type NFDialogCategory = 'general' | 'number' | 'currency' | 'currencyRounded' | 'accounting' | 'financial' | 'percent' | 'scientific' | 'date' | 'time' | 'dateTime' | 'duration' | 'text' | 'custom';
71
+ export declare const NF_DIALOG_CATEGORIES: NFDialogCategory[];
72
+ /**
73
+ * 判断单元格在「未指定水平对齐」时,是否应该按「数值」默认右对齐显示。
74
+ * 规则(与 Excel 对齐语义保持一致,仅用于显示,不写入存储):
75
+ * 1. 格式代码为 '@'(文本)→ 否,保持左对齐
76
+ * 2. 常规格式(含空串 / undefined / 'General'):对原始 value 做 Number() 解析,
77
+ * 能解析为有限数字且非空字符串 → 视为数值 → 右对齐
78
+ * 3. 显式设置为数值类格式(number/currency/currencyRounded/accounting/financial/
79
+ * percent/scientific 以及 custom 中分类属于数值 kind 并含数字占位符)→ 右对齐
80
+ * 4. 日期、时间、日期时间、持续时间 → 不算数值(按 Excel 默认左对齐或居中,这里保持左对齐默认)
81
+ * 5. 其他 custom 中无法判断的 → 回退左对齐
82
+ */
83
+ export declare function shouldAlignRightByDefault(value: string, format: string | undefined | null): boolean;
84
+ /**
85
+ * 当前格式在列宽不足时,是否按 Excel 规则替换为连续 '#' 填充:
86
+ * - General / 文本 '@' / 未设置 → 不会(General 自动科学计数或允许裁切;文本就是原样裁切)
87
+ * - date / duration 类格式 → 是
88
+ * - number 类格式且含有数字占位符 → 是
89
+ * - 纯文本区段的自定义 number(如"前缀"无 0/#/?)→ 按纯文本,不需要 #
90
+ */
91
+ export declare function isFormatOverflowsToHashes(format: string | undefined | null): boolean;
92
+ /**
93
+ * 对给定 (value, format) 快速判断是否是 Excel 语义下的"非法值"(需要渲染为 # 填充)。
94
+ * 主要用于渲染端直接复用,避免再次 parseNumberFormat。
95
+ */
96
+ export declare function isInvalidDisplayValue(value: string, format: string | undefined | null): boolean;
97
+ /** 根据分类 + 小数位数 + 千位分隔符生成格式代码 */
98
+ export declare function buildNumberFormatCode(locale: string, category: NFDialogCategory, decimals: number, thousands: boolean): string;
99
+ /** 构造工具栏下拉框的选项(含「格式…」自定义项) */
100
+ export declare function buildNumberFormatPresets(locale: string): NFOption[];