@sl-material/sl-table-sheet 1.1.0-beta0 → 1.1.0-beta2

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/core/Dialog.d.ts CHANGED
@@ -1,7 +1,3 @@
1
- /**
2
- * 查找替换弹窗 - 纯 TypeScript/JavaScript 实现
3
- * 不依赖任何框架,可在任何项目中使用
4
- */
5
1
  export interface MatchPosition {
6
2
  row: number;
7
3
  col: number;
@@ -5,6 +5,7 @@ export interface HeaderDetectionResult {
5
5
  headerRows: number;
6
6
  dataStartRow: number;
7
7
  effectiveHeaderRows: any[][];
8
+ filteredEmptyRows: number;
8
9
  }
9
10
  /**
10
11
  * 智能检测 Excel 表头结构
@@ -14,6 +15,14 @@ export declare class HeaderDetector {
14
15
  * 检测表头行数
15
16
  */
16
17
  static detectHeaderRows(rawData: any[][], userHeaderRows?: number): HeaderDetectionResult;
18
+ /**
19
+ * 过滤掉前三列都为空的前几行
20
+ */
21
+ private static filterEmptyLeadingRows;
22
+ /**
23
+ * 检查行的前三列是否有内容
24
+ */
25
+ private static hasContentInFirstThreeColumns;
17
26
  /**
18
27
  * 自动检测表头行数
19
28
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Dialog 样式
3
3
  */
4
- export declare const DIALOG_STYLES = "\n .find-replace-dialog {\n position: fixed;\n top: 80px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 9999;\n font-size: 14px;\n color: #1D2129;\n pointer-events: auto;\n }\n\n .find-replace-container {\n background: white;\n border-radius: 8px;\n width: 500px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n animation: slideIn 0.2s ease-out;\n }\n\n @keyframes slideIn {\n from { opacity: 0; transform: translateX(20px); }\n to { opacity: 1; transform: translateX(0); }\n }\n\n .find-replace-title {\n font-size: 16px;\n font-weight: 500;\n color: #303133;\n }\n\n .find-replace-body {\n padding: 16px;\n }\n\n .find-replace-group {\n margin-bottom: 16px;\n display: flex;\n align-items: center;\n }\n\n .find-replace-label {\n display: block;\n min-width: 56px;\n margin-right: 8px;\n }\n\n .find-replace-checkbox {\n display: none;\n align-items: center;\n font-weight: normal;\n min-width: auto;\n margin-right: 0;\n }\n\n .find-replace-checkbox input {\n margin-right: 6px;\n }\n\n .find-replace-input-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n height: 32px;\n }\n\n .find-replace-input {\n width: 100%;\n padding: 0px 12px;\n border: 1px solid #dcdfe6;\n border-radius: 4px;\n height: 32px;\n }\n\n .find-replace-input:focus {\n outline: none;\n border-color: #409eff;\n }\n\n .current-position {\n margin-left: 10px;\n color: #409eff;\n font-weight: 500;\n }\n\n .find-replace-footer {\n padding: 0px 16px 16px 16px;\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .find-replace-btn {\n padding: 6px 16px;\n border-radius: 4px;\n height: 32px;\n cursor: pointer;\n background: var(--sl-color-white);\n border: 1px solid var(--sl-border-color);\n }\n\n .find-replace-btn-primary {\n background-color: var(--sl-color-primary);\n color: white;\n }\n\n .find-replace-btn-primary:hover {\n border-color: var(--sl-button-hover-border-color);\n background-color: var(--sl-button-hover-bg-color);\n }\n\n .message-toast {\n height: 40px;\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%) translateY(-100px);\n padding: 11px 15px;\n color: white;\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n z-index: 9999;\n opacity: 0;\n transition: all 0.3s ease-out;\n display: flex;\n align-items: center;\n }\n\n .message-toast--info {\n background-color: var(--sl-color-info-light-9);\n border: 1px solid var(--sl-color-info-light-8);\n color: var(--sl-color-info);\n }\n\n .message-toast--success {\n background-color: var(--sl-color-success-light-9);\n border: 1px solid var(--sl-color-success-light-8);\n color: var(--sl-color-success);\n }\n\n .message-toast--warning {\n background-color: var(--sl-color-warning-light-9);\n border: 1px solid var(--sl-color-warning-light-8);\n color: var(--sl-color-warning);\n }\n\n .message-toast--error {\n background-color: var(--sl-color-error-light-9);\n border: 1px solid var(--sl-color-error-light-8);\n color: var(--sl-color-error);\n }\n\n .message-toast.show {\n transform: translateX(-50%) translateY(0);\n opacity: 1;\n }\n";
5
- export declare const DIALOG_STYLE_ID = "find-replace-styles";
4
+ export declare const DIALOG_STYLES = "\n .sl-excel-find-replace-dialog {\n position: fixed;\n top: 80px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 9999;\n font-size: 14px;\n color: var(--sl-text-color);\n pointer-events: auto;\n }\n\n .sl-excel-find-replace-container {\n background: white;\n border-radius: 8px;\n width: 500px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n animation: slideIn 0.2s ease-out;\n }\n\n @keyframes slideIn {\n from { opacity: 0; transform: translateX(20px); }\n to { opacity: 1; transform: translateX(0); }\n }\n\n .sl-excel-find-replace-title {\n font-size: 16px;\n font-weight: 500;\n color: #303133;\n }\n\n .sl-excel-find-replace-body {\n padding: 16px;\n }\n\n .sl-excel-find-replace-group {\n margin-bottom: 16px;\n display: flex;\n align-items: center;\n }\n\n .sl-excel-find-replace-label {\n display: block;\n min-width: 56px;\n margin-right: 8px;\n }\n\n .sl-excel-find-replace-checkbox {\n display: none;\n align-items: center;\n font-weight: normal;\n min-width: auto;\n margin-right: 0;\n }\n\n .sl-excel-find-replace-checkbox input {\n margin-right: 6px;\n }\n\n .sl-excel-find-replace-input-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n height: 32px;\n }\n\n .sl-excel-find-replace-input {\n width: 100%;\n padding: 0px 12px;\n border: 1px solid var(--sl-border-color);\n border-radius: 4px;\n height: 32px;\n }\n\n .sl-excel-find-replace-input:focus {\n outline: none;\n border-color: var(--sl-color-primary);\n }\n\n\n .sl-excel-find-replace-footer {\n padding: 0px 16px 16px 16px;\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .sl-excel-find-replace-btn {\n padding: 6px 16px;\n border-radius: 4px;\n height: 32px;\n cursor: pointer;\n background: var(--sl-color-white);\n border: 1px solid var(--sl-border-color);\n }\n .sl-excel-find-replace-btn:hover{\n color:var(--sl-text-color-thridary)\n }\n\n .sl-excel-find-replace-btn-primary {\n background-color: var(--sl-color-primary);\n color: var(--sl-color-white);\n }\n\n .sl-excel-find-replace-btn-primary:hover {\n border-color: var(--sl-color-primary-light-3);\n background-color: var(--sl-color-primary-light-3);\n color:var(--sl-color-white);\n }\n\n .sl-excel-message-toast {\n height: 40px;\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%) translateY(-100px);\n padding: 11px 15px;\n color: white;\n border-radius: 4px;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\n z-index: 9999;\n opacity: 0;\n transition: all 0.3s ease-out;\n display: flex;\n align-items: center;\n }\n\n .sl-excel-message-toast--info {\n background-color: var(--sl-color-info-light-9);\n border: 1px solid var(--sl-color-info-light-8);\n color: var(--sl-color-info);\n }\n\n .sl-excel-message-toast--success {\n background-color: var(--sl-color-success-light-9);\n border: 1px solid var(--sl-color-success-light-8);\n color: var(--sl-color-success);\n }\n\n .sl-excel-message-toast--warning {\n background-color: var(--sl-color-warning-light-9);\n border: 1px solid var(--sl-color-warning-light-8);\n color: var(--sl-color-warning);\n }\n\n .sl-excel-message-toast--error {\n background-color: var(--sl-color-error-light-9);\n border: 1px solid var(--sl-color-error-light-8);\n color: var(--sl-color-error);\n }\n\n .sl-excel-message-toast.show {\n transform: translateX(-50%) translateY(0);\n opacity: 1;\n }\n";
5
+ export declare const DIALOG_STYLE_ID = "sl-excel-find-replace-styles";
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Toolbar 样式
3
3
  */
4
- export declare const TOOLBAR_STYLES = "\n .sl-toolbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 16px;\n background: var(--sl-vtable-card-bg-color);\n font-size: 14px;\n color: var(--sl-vtable-content-color);\n flex-shrink: 0;\n border-radius: 4px;\n }\n \n .sl-toolbar-right {\n display: flex;\n align-items: center;\n gap: 24px;\n }\n\n .sl-toolbar-btn {\n padding: 6px 16px;\n height: 32px;\n border: 1px solid var(--sl-vtable-bg-color1);\n border-radius: 4px;\n font-size: 14px;\n color: var(--sl-vtable-content-color);\n cursor: pointer;\n white-space: nowrap;\n }\n\n .sl-toolbar-btn:hover {\n background: #E8E9EB;\n }\n\n .sl-toolbar-btn-icon {\n padding: 6px 10px;\n font-size: 16px;\n min-width: 32px;\n }\n\n .sl-toolbar-btn-complex {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .sl-btn-icon {\n font-size: 14px;\n }\n\n .sl-btn-text {\n font-size: 14px;\n }\n\n .sl-btn-count {\n font-size: 14px;\n font-weight: 600;\n color: var(--sl-vtable-primary-color);\n }\n\n .sl-btn-suffix {\n font-size: 14px;\n }\n\n .sl-freeze-selector {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .sl-freeze-label {\n font-size: 14px;\n color: var(--sl-vtable-content-color);\n white-space: nowrap;\n }\n\n .sl-freeze-input-wrapper {\n position: relative;\n display: inline-flex;\n align-items: center;\n background: var(--sl-vtable-bg-color1);\n border: 1px solid var(--sl-vtable-bg-color1);\n border-radius: 4px;\n transition: all 0.2s;\n height: 32px;\n box-sizing: border-box;\n }\n\n .sl-freeze-input-wrapper:focus-within {\n border-color: var(--sl-vtable-primary-color);\n box-shadow: 0 0 0 2px rgba(40, 120, 255, 0.1);\n }\n\n .sl-freeze-input {\n width: 30px;\n height: 30px;\n padding: 0px 2px;\n border-radius: 4px 0px 0px 4px;\n background: #fff;\n border: none;\n font-size: 14px;\n color: var(--sl-vtable-content-color);\n text-align: center;\n outline: none;\n -moz-appearance: textfield;\n }\n\n .sl-freeze-input::-webkit-outer-spin-button,\n .sl-freeze-input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n\n .sl-freeze-arrows {\n display: flex;\n flex-direction: column;\n border-left: 1px solid #E5E6EB;\n }\n\n .sl-freeze-arrow {\n width: 20px;\n height: 10px;\n padding: 0;\n background: transparent;\n border: none;\n font-size: 14px;\n color: var(--sl-vtable-content-color);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n\n .sl-freeze-arrow-up {\n border-radius: 0 8px 0 0;\n }\n\n .sl-freeze-arrow-down {\n border-radius: 0 0 8px 0;\n transform: rotate(180deg);\n }\n\n .sl-freeze-suffix {\n font-size: 14px;\n color: var(--sl-vtable-content-color);\n }\n\n .sl-error-list-checkbox {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n }\n\n .sl-checkbox-input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n }\n\n .sl-checkbox-custom {\n position: relative;\n width: 16px;\n height: 16px;\n border: 2px solid #C9CDD4;\n border-radius: 4px;\n background: #fff;\n transition: all 0.2s;\n flex-shrink: 0;\n }\n\n .sl-checkbox-input:checked + .sl-checkbox-custom {\n background: var(--sl-vtable-primary-color);\n border-color: var(--sl-vtable-primary-color);\n }\n\n .sl-checkbox-input:checked + .sl-checkbox-custom::after {\n content: \"\";\n position: absolute;\n left: 4px;\n top: 1px;\n width: 4px;\n height: 8px;\n border: solid white;\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n }\n\n .sl-error-list-checkbox:hover .sl-checkbox-custom {\n border-color: var(--sl-vtable-primary-color);\n }\n\n .sl-checkbox-label {\n font-size: 14px;\n color: var(--sl-vtable-content-color);\n }\n\n /* \u54CD\u5E94\u5F0F\u8BBE\u8BA1 */\n @media (max-width: 768px) {\n .sl-toolbar {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .sl-toolbar-left {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n\n .sl-toolbar-right {\n width: 100%;\n justify-content: flex-start;\n flex-wrap: wrap;\n }\n }\n";
5
- export declare const TOOLBAR_STYLE_ID = "sl-toolbar-styles";
4
+ export declare const TOOLBAR_STYLES = "\n .sl-excel-toolbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 16px;\n background: var(--sl-vtable-card-bg-color);\n font-size: 14px;\n color: var(--sl-vtable-content-color);\n flex-shrink: 0;\n border-radius: 4px;\n }\n \n .sl-excel-toolbar-right {\n display: flex;\n align-items: center;\n gap: 24px;\n }\n\n .sl-excel-toolbar-btn {\n padding: 6px 16px;\n height: 32px;\n border: 1px solid var(--sl-vtable-bg-color1);\n border-radius: 4px;\n font-size: 14px;\n color: var(--sl-vtable-content-color);\n cursor: pointer;\n white-space: nowrap;\n }\n\n .sl-excel-toolbar-btn:hover {\n background: #E8E9EB;\n }\n\n .sl-excel-toolbar-btn-icon {\n padding: 6px 10px;\n font-size: 16px;\n min-width: 32px;\n }\n\n .sl-excel-toolbar-btn-complex {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .sl-excel-btn-icon {\n font-size: 14px;\n }\n\n .sl-excel-btn-text {\n font-size: 14px;\n }\n\n .sl-excel-btn-count {\n font-size: 14px;\n font-weight: 600;\n color: var(--sl-vtable-primary-color);\n }\n\n .sl-excel-btn-suffix {\n font-size: 14px;\n }\n\n .sl-excel-freeze-selector {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .sl-excel-freeze-label {\n font-size: 14px;\n color: var(--sl-vtable-content-color);\n white-space: nowrap;\n }\n\n .sl-excel-freeze-input-wrapper {\n position: relative;\n display: inline-flex;\n align-items: center;\n background: var(--sl-vtable-bg-color1);\n border: 1px solid var(--sl-vtable-bg-color1);\n border-radius: 4px;\n transition: all 0.2s;\n height: 32px;\n box-sizing: border-box;\n }\n\n .sl-excel-freeze-input-wrapper:focus-within {\n border-color: var(--sl-vtable-primary-color);\n box-shadow: 0 0 0 2px rgba(40, 120, 255, 0.1);\n }\n\n .sl-excel-freeze-input {\n width: 30px;\n height: 30px;\n padding: 0px 2px;\n border-radius: 4px 0px 0px 4px;\n background: var(--sl-color-white);\n border: none;\n font-size: 14px;\n color: var(--sl-vtable-content-color);\n text-align: center;\n outline: none;\n -moz-appearance: textfield;\n }\n\n .sl-excel-freeze-input::-webkit-outer-spin-button,\n .sl-excel-freeze-input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n\n .sl-excel-freeze-arrows {\n display: flex;\n flex-direction: column;\n border-left: 1px solid #E5E6EB;\n }\n\n .sl-excel-freeze-arrow {\n width: 20px;\n height: 10px;\n padding: 0;\n background: transparent;\n border: none;\n font-size: 14px;\n color: var(--sl-vtable-content-color);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n\n .sl-excel-freeze-arrow-up {\n border-radius: 0 8px 0 0;\n }\n\n .sl-excel-freeze-arrow-down {\n border-radius: 0 0 8px 0;\n transform: rotate(180deg);\n }\n\n .sl-excel-freeze-suffix {\n font-size: 14px;\n color: var(--sl-vtable-content-color);\n }\n\n .sl-excel-error-list-checkbox {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n }\n\n .sl-excel-checkbox-input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n }\n\n .sl-excel-checkbox-custom {\n position: relative;\n width: 16px;\n height: 16px;\n border: 2px solid #C9CDD4;\n border-radius: 4px;\n background: var(--sl-color-white);\n transition: all 0.2s;\n flex-shrink: 0;\n }\n\n .sl-excel-checkbox-input:checked + .sl-excel-checkbox-custom {\n background: var(--sl-vtable-primary-color);\n border-color: var(--sl-vtable-primary-color);\n }\n\n .sl-excel-checkbox-input:checked + .sl-excel-checkbox-custom::after {\n content: \"\";\n position: absolute;\n left: 4px;\n top: 1px;\n width: 4px;\n height: 8px;\n border: solid white;\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n }\n\n .sl-excel-error-list-checkbox:hover .sl-excel-checkbox-custom {\n border-color: var(--sl-vtable-primary-color);\n }\n\n .sl-excel-checkbox-label {\n font-size: 14px;\n color: var(--sl-vtable-content-color);\n }\n\n /* \u54CD\u5E94\u5F0F\u8BBE\u8BA1 */\n @media (max-width: 768px) {\n .sl-excel-toolbar {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .sl-excel-toolbar-left {\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n\n .sl-excel-toolbar-right {\n width: 100%;\n justify-content: flex-start;\n flex-wrap: wrap;\n }\n }\n";
5
+ export declare const TOOLBAR_STYLE_ID = "sl-excel-toolbar-styles";
package/index.d.ts CHANGED
@@ -7,4 +7,6 @@ export { loadExcelFromUrl, parseExcelFile, parseExcelBuffer, fetchExcelFromUrl,
7
7
  export type { ExcelParseOptions, ExcelParseResult, CellStyle, SheetData, MultiSheetParseResult, } from './core/excel';
8
8
  export { SheetTabs } from './core/SheetTabs';
9
9
  export type { SheetTabsConfig } from './core/SheetTabs';
10
+ export { FindReplaceDialog } from './core/Dialog';
11
+ export type { MatchPosition, FindReplaceOptions } from './core/Dialog';
10
12
  export { SlTableSheet as default } from './core/SlTableSheet';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sl-material/sl-table-sheet",
3
- "version": "1.1.0-beta0",
3
+ "version": "1.1.0-beta2",
4
4
  "description": "VTable 组件库 - 支持 npm 和 UMD",
5
5
  "main": "./sl-table-sheet.cjs.js",
6
6
  "module": "./sl-table-sheet.es.js",