@visactor/vtable-sheet 1.20.0-alpha.0
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/cjs/components/vtable-sheet.d.ts +78 -0
- package/cjs/components/vtable-sheet.js +474 -0
- package/cjs/components/vtable-sheet.js.map +1 -0
- package/cjs/core/WorkSheet.d.ts +69 -0
- package/cjs/core/WorkSheet.js +298 -0
- package/cjs/core/WorkSheet.js.map +1 -0
- package/cjs/core/table-plugins.d.ts +3 -0
- package/cjs/core/table-plugins.js +171 -0
- package/cjs/core/table-plugins.js.map +1 -0
- package/cjs/event/event-manager.d.ts +29 -0
- package/cjs/event/event-manager.js +71 -0
- package/cjs/event/event-manager.js.map +1 -0
- package/cjs/event/event-target.d.ts +12 -0
- package/cjs/event/event-target.js +50 -0
- package/cjs/event/event-target.js.map +1 -0
- package/cjs/formula/cell-highlight-manager.d.ts +29 -0
- package/cjs/formula/cell-highlight-manager.js +141 -0
- package/cjs/formula/cell-highlight-manager.js.map +1 -0
- package/cjs/formula/formula-autocomplete.d.ts +39 -0
- package/cjs/formula/formula-autocomplete.js +239 -0
- package/cjs/formula/formula-autocomplete.js.map +1 -0
- package/cjs/formula/formula-editor.d.ts +21 -0
- package/cjs/formula/formula-editor.js +162 -0
- package/cjs/formula/formula-editor.js.map +1 -0
- package/cjs/formula/formula-helper.d.ts +8 -0
- package/cjs/formula/formula-helper.js +66 -0
- package/cjs/formula/formula-helper.js.map +1 -0
- package/cjs/formula/formula-range-selector.d.ts +19 -0
- package/cjs/formula/formula-range-selector.js +201 -0
- package/cjs/formula/formula-range-selector.js.map +1 -0
- package/cjs/formula/formula-throttle.d.ts +10 -0
- package/cjs/formula/formula-throttle.js +39 -0
- package/cjs/formula/formula-throttle.js.map +1 -0
- package/cjs/formula/formula-ui-manager.d.ts +19 -0
- package/cjs/formula/formula-ui-manager.js +226 -0
- package/cjs/formula/formula-ui-manager.js.map +1 -0
- package/cjs/formula/index.d.ts +5 -0
- package/cjs/formula/index.js +23 -0
- package/cjs/formula/index.js.map +1 -0
- package/cjs/index.d.ts +6 -0
- package/cjs/index.js +50 -0
- package/cjs/index.js.map +1 -0
- package/cjs/managers/formula-manager.d.ts +82 -0
- package/cjs/managers/formula-manager.js +445 -0
- package/cjs/managers/formula-manager.js.map +1 -0
- package/cjs/managers/menu-manager.d.ts +12 -0
- package/cjs/managers/menu-manager.js +89 -0
- package/cjs/managers/menu-manager.js.map +1 -0
- package/cjs/managers/sheet-manager.d.ts +21 -0
- package/cjs/managers/sheet-manager.js +74 -0
- package/cjs/managers/sheet-manager.js.map +1 -0
- package/cjs/managers/tab-drag-manager.d.ts +24 -0
- package/cjs/managers/tab-drag-manager.js +121 -0
- package/cjs/managers/tab-drag-manager.js.map +1 -0
- package/cjs/sheet-helper.d.ts +16 -0
- package/cjs/sheet-helper.js +64 -0
- package/cjs/sheet-helper.js.map +1 -0
- package/cjs/styles/common.d.ts +1 -0
- package/cjs/styles/common.js +17 -0
- package/cjs/styles/common.js.map +1 -0
- package/cjs/styles/formula-autocomplete.d.ts +1 -0
- package/cjs/styles/formula-autocomplete.js +17 -0
- package/cjs/styles/formula-autocomplete.js.map +1 -0
- package/cjs/styles/formula-bar.d.ts +1 -0
- package/cjs/styles/formula-bar.js +17 -0
- package/cjs/styles/formula-bar.js.map +1 -0
- package/cjs/styles/menu.d.ts +1 -0
- package/cjs/styles/menu.js +17 -0
- package/cjs/styles/menu.js.map +1 -0
- package/cjs/styles/sheet-tab.d.ts +1 -0
- package/cjs/styles/sheet-tab.js +17 -0
- package/cjs/styles/sheet-tab.js.map +1 -0
- package/cjs/styles/sheet.d.ts +1 -0
- package/cjs/styles/sheet.js +17 -0
- package/cjs/styles/sheet.js.map +1 -0
- package/cjs/styles/style-manager.d.ts +1 -0
- package/cjs/styles/style-manager.js +15 -0
- package/cjs/styles/style-manager.js.map +1 -0
- package/cjs/test/formula-complete.test.d.ts +1 -0
- package/cjs/test/formula-complete.test.js +42 -0
- package/cjs/test/formula-complete.test.js.map +1 -0
- package/cjs/tools/env.d.ts +20 -0
- package/cjs/tools/env.js +59 -0
- package/cjs/tools/env.js.map +1 -0
- package/cjs/tools/index.d.ts +3 -0
- package/cjs/tools/index.js +16 -0
- package/cjs/tools/index.js.map +1 -0
- package/cjs/tools/ui/snackbar.d.ts +1 -0
- package/cjs/tools/ui/snackbar.js +20 -0
- package/cjs/tools/ui/snackbar.js.map +1 -0
- package/cjs/ts-types/base.d.ts +44 -0
- package/cjs/ts-types/base.js +14 -0
- package/cjs/ts-types/base.js.map +1 -0
- package/cjs/ts-types/event.d.ts +79 -0
- package/cjs/ts-types/event.js +6 -0
- package/cjs/ts-types/event.js.map +1 -0
- package/cjs/ts-types/events.d.ts +1 -0
- package/cjs/ts-types/events.js +3 -0
- package/cjs/ts-types/events.js.map +1 -0
- package/cjs/ts-types/filter.d.ts +58 -0
- package/cjs/ts-types/filter.js +16 -0
- package/cjs/ts-types/filter.js.map +1 -0
- package/cjs/ts-types/formula.d.ts +51 -0
- package/cjs/ts-types/formula.js +6 -0
- package/cjs/ts-types/formula.js.map +1 -0
- package/cjs/ts-types/index.d.ts +67 -0
- package/cjs/ts-types/index.js +37 -0
- package/cjs/ts-types/index.js.map +1 -0
- package/cjs/ts-types/sheet.d.ts +45 -0
- package/cjs/ts-types/sheet.js +6 -0
- package/cjs/ts-types/sheet.js.map +1 -0
- package/cjs/vtable.d.ts +1 -0
- package/cjs/vtable.js +35 -0
- package/cjs/vtable.js.map +1 -0
- package/dist/vtable-sheet.js +114494 -0
- package/dist/vtable-sheet.min.js +853 -0
- package/es/components/vtable-sheet.d.ts +78 -0
- package/es/components/vtable-sheet.js +462 -0
- package/es/components/vtable-sheet.js.map +1 -0
- package/es/core/WorkSheet.d.ts +69 -0
- package/es/core/WorkSheet.js +298 -0
- package/es/core/WorkSheet.js.map +1 -0
- package/es/core/table-plugins.d.ts +3 -0
- package/es/core/table-plugins.js +164 -0
- package/es/core/table-plugins.js.map +1 -0
- package/es/event/event-manager.d.ts +29 -0
- package/es/event/event-manager.js +63 -0
- package/es/event/event-manager.js.map +1 -0
- package/es/event/event-target.d.ts +12 -0
- package/es/event/event-target.js +42 -0
- package/es/event/event-target.js.map +1 -0
- package/es/formula/cell-highlight-manager.d.ts +29 -0
- package/es/formula/cell-highlight-manager.js +133 -0
- package/es/formula/cell-highlight-manager.js.map +1 -0
- package/es/formula/formula-autocomplete.d.ts +39 -0
- package/es/formula/formula-autocomplete.js +231 -0
- package/es/formula/formula-autocomplete.js.map +1 -0
- package/es/formula/formula-editor.d.ts +21 -0
- package/es/formula/formula-editor.js +135 -0
- package/es/formula/formula-editor.js.map +1 -0
- package/es/formula/formula-helper.d.ts +8 -0
- package/es/formula/formula-helper.js +60 -0
- package/es/formula/formula-helper.js.map +1 -0
- package/es/formula/formula-range-selector.d.ts +19 -0
- package/es/formula/formula-range-selector.js +195 -0
- package/es/formula/formula-range-selector.js.map +1 -0
- package/es/formula/formula-throttle.d.ts +10 -0
- package/es/formula/formula-throttle.js +31 -0
- package/es/formula/formula-throttle.js.map +1 -0
- package/es/formula/formula-ui-manager.d.ts +19 -0
- package/es/formula/formula-ui-manager.js +218 -0
- package/es/formula/formula-ui-manager.js.map +1 -0
- package/es/formula/index.d.ts +5 -0
- package/es/formula/index.js +10 -0
- package/es/formula/index.js.map +1 -0
- package/es/index.d.ts +6 -0
- package/es/index.js +13 -0
- package/es/index.js.map +1 -0
- package/es/managers/formula-manager.d.ts +82 -0
- package/es/managers/formula-manager.js +441 -0
- package/es/managers/formula-manager.js.map +1 -0
- package/es/managers/menu-manager.d.ts +12 -0
- package/es/managers/menu-manager.js +81 -0
- package/es/managers/menu-manager.js.map +1 -0
- package/es/managers/sheet-manager.d.ts +21 -0
- package/es/managers/sheet-manager.js +66 -0
- package/es/managers/sheet-manager.js.map +1 -0
- package/es/managers/tab-drag-manager.d.ts +24 -0
- package/es/managers/tab-drag-manager.js +113 -0
- package/es/managers/tab-drag-manager.js.map +1 -0
- package/es/sheet-helper.d.ts +16 -0
- package/es/sheet-helper.js +54 -0
- package/es/sheet-helper.js.map +1 -0
- package/es/styles/common.d.ts +1 -0
- package/es/styles/common.js +9 -0
- package/es/styles/common.js.map +1 -0
- package/es/styles/formula-autocomplete.d.ts +1 -0
- package/es/styles/formula-autocomplete.js +9 -0
- package/es/styles/formula-autocomplete.js.map +1 -0
- package/es/styles/formula-bar.d.ts +1 -0
- package/es/styles/formula-bar.js +9 -0
- package/es/styles/formula-bar.js.map +1 -0
- package/es/styles/menu.d.ts +1 -0
- package/es/styles/menu.js +9 -0
- package/es/styles/menu.js.map +1 -0
- package/es/styles/sheet-tab.d.ts +1 -0
- package/es/styles/sheet-tab.js +9 -0
- package/es/styles/sheet-tab.js.map +1 -0
- package/es/styles/sheet.d.ts +1 -0
- package/es/styles/sheet.js +9 -0
- package/es/styles/sheet.js.map +1 -0
- package/es/styles/style-manager.d.ts +1 -0
- package/es/styles/style-manager.js +17 -0
- package/es/styles/style-manager.js.map +1 -0
- package/es/test/formula-complete.test.d.ts +1 -0
- package/es/test/formula-complete.test.js +36 -0
- package/es/test/formula-complete.test.js.map +1 -0
- package/es/tools/env.d.ts +20 -0
- package/es/tools/env.js +53 -0
- package/es/tools/env.js.map +1 -0
- package/es/tools/index.d.ts +3 -0
- package/es/tools/index.js +9 -0
- package/es/tools/index.js.map +1 -0
- package/es/tools/ui/snackbar.d.ts +1 -0
- package/es/tools/ui/snackbar.js +14 -0
- package/es/tools/ui/snackbar.js.map +1 -0
- package/es/ts-types/base.d.ts +44 -0
- package/es/ts-types/base.js +14 -0
- package/es/ts-types/base.js.map +1 -0
- package/es/ts-types/event.d.ts +79 -0
- package/es/ts-types/event.js +2 -0
- package/es/ts-types/event.js.map +1 -0
- package/es/ts-types/events.d.ts +1 -0
- package/es/ts-types/events.js +3 -0
- package/es/ts-types/events.js.map +1 -0
- package/es/ts-types/filter.d.ts +58 -0
- package/es/ts-types/filter.js +16 -0
- package/es/ts-types/filter.js.map +1 -0
- package/es/ts-types/formula.d.ts +51 -0
- package/es/ts-types/formula.js +2 -0
- package/es/ts-types/formula.js.map +1 -0
- package/es/ts-types/index.d.ts +67 -0
- package/es/ts-types/index.js +14 -0
- package/es/ts-types/index.js.map +1 -0
- package/es/ts-types/sheet.d.ts +45 -0
- package/es/ts-types/sheet.js +2 -0
- package/es/ts-types/sheet.js.map +1 -0
- package/es/vtable.d.ts +1 -0
- package/es/vtable.js +2 -0
- package/es/vtable.js.map +1 -0
- package/package.json +120 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sheet-helper.ts"],"names":[],"mappings":"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","file":"sheet-helper.js","sourcesContent":["import { SelectionMode } from './ts-types';\nimport type { SheetConstructorOptions } from './ts-types';\n\n/**\n * Initialize options with defaults for the Sheet component\n * @param options User provided options\n * @returns Parsed options with defaults applied\n */\nexport function initOptions(options: SheetConstructorOptions): {\n defaultRowHeight: number;\n defaultColWidth: number;\n showRowHeader: boolean;\n showColHeader: boolean;\n editable: boolean;\n theme: string;\n selectionMode: SelectionMode;\n pixelRatio: number;\n} {\n return {\n defaultRowHeight: options.defaultRowHeight ?? 25,\n defaultColWidth: options.defaultColWidth ?? 100,\n showRowHeader: options.showRowHeader ?? true,\n showColHeader: options.showColHeader ?? true,\n editable: options.editable ?? true,\n theme: options.theme ?? 'light',\n selectionMode: options.selectionMode ?? SelectionMode.CELL,\n pixelRatio: window.devicePixelRatio || 1\n };\n}\n\n/**\n * Convert A1 notation to column index (0-based)\n * @param colStr Column string (e.g., 'A', 'B', 'AA')\n * @returns Column index (0-based)\n */\nexport function columnStringToIndex(colStr: string): number {\n let col = 0;\n for (let i = 0; i < colStr.length; i++) {\n col = col * 26 + (colStr.charCodeAt(i) - 64);\n }\n return col - 1;\n}\n\n/**\n * Convert column index to A1 notation string\n * @param colIndex Column index (0-based)\n * @returns Column string (e.g., 'A', 'B', 'AA')\n */\nexport function columnIndexToString(colIndex: number): string {\n let colStr = '';\n let tempCol = colIndex + 1;\n\n do {\n tempCol -= 1;\n colStr = String.fromCharCode(65 + (tempCol % 26)) + colStr;\n tempCol = Math.floor(tempCol / 26);\n } while (tempCol > 0);\n\n return colStr;\n}\n\n/**\n * Convert sheet data to VTable records format\n * @param data Sheet data (2D array)\n * @returns VTable records format\n */\nexport function dataToRecords(data: any[][]): any[] {\n if (!data || !data.length) {\n return [];\n }\n\n const records = [];\n const headerRow = data[0];\n\n // Skip header row if it exists\n for (let i = 1; i < data.length; i++) {\n const row = data[i];\n const record: Record<string, any> = {};\n\n for (let j = 0; j < row.length; j++) {\n // Use header row values as field names if available, otherwise use column index\n const fieldName = headerRow && j < headerRow.length ? headerRow[j] : j.toString();\n record[fieldName] = row[j];\n }\n\n records.push(record);\n }\n\n return records;\n}\n\n/**\n * Convert VTable records format to sheet data (2D array)\n * @param records VTable records\n * @param columns VTable columns definition\n * @returns Sheet data (2D array)\n */\nexport function recordsToData(records: any[], columns: any[]): any[][] {\n if (!records || !records.length) {\n return [];\n }\n\n const data: any[][] = [];\n\n // Add header row based on column definitions\n const headerRow = columns.map(col => col.title || col.field);\n data.push(headerRow);\n\n // Add data rows\n for (const record of records) {\n const row = columns.map(col => record[col.field]);\n data.push(row);\n }\n\n return data;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function importStyle(): void;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Env } from "../tools/env";
|
|
2
|
+
|
|
3
|
+
export function importStyle() {
|
|
4
|
+
if ("node" === Env.mode) return;
|
|
5
|
+
const styleElement = document.createElement("style");
|
|
6
|
+
styleElement.id = "vtable-sheet-common-styleSheet", styleElement.textContent = "\n/* 通用样式和变量 */\n:root {\n --border-color: #e0e0e0;\n --primary-color: #1a73e8;\n --hover-color: #f5f5f5;\n --active-color: #e8f0fe;\n --text-color: #333;\n --gray-text: #666;\n --light-gray: #f8f8f8;\n --toolbar-height: 28px;\n --tab-height: 28px;\n\n /* 基础颜色 */\n --primary-color-light: #e8f0fe;\n --secondary-color: #4285f4;\n --success-color: #1e8e3e;\n --warning-color: #ffa000;\n --danger-color: #d93025;\n --info-color: #1a73e8;\n\n /* 中性色 */\n --black: #000;\n --gray-900: #212121;\n --gray-800: #424242;\n --gray-700: #616161;\n --gray-600: #757575;\n --gray-500: #9e9e9e;\n --gray-400: #bdbdbd;\n --gray-300: #e0e0e0;\n --gray-200: #eeeeee;\n --gray-100: #f5f5f5;\n --gray-50: #fafafa;\n --white: #fff;\n\n /* 文本颜色 */\n --text-primary: var(--gray-900);\n --text-secondary: var(--gray-700);\n --text-tertiary: var(--gray-500);\n --text-disabled: var(--gray-400);\n --text-inverse: var(--white);\n\n /* 边框颜色 */\n --border-color-light: var(--gray-200);\n --border-color-dark: var(--gray-400);\n\n /* 背景颜色 */\n --bg-default: var(--white);\n --bg-secondary: var(--gray-100);\n --bg-tertiary: var(--gray-200);\n --bg-selected: var(--primary-color-light);\n --bg-hover: var(--gray-100);\n\n /* 阴影 */\n --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.05);\n --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1);\n --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);\n --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);\n\n /* 尺寸 */\n --formula-bar-height: 30px;\n --icon-size-small: 16px;\n --icon-size-medium: 20px;\n --icon-size-large: 24px;\n\n /* 字体 */\n --font-family-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', \n Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n --font-family-mono: 'Roboto Mono', 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;\n\n /* 间距 */\n --spacing-xs: 4px;\n --spacing-sm: 8px;\n --spacing-md: 12px;\n --spacing-lg: 16px;\n --spacing-xl: 24px;\n\n /* 边框圆角 */\n --border-radius-sm: 2px;\n --border-radius-md: 4px;\n --border-radius-lg: 8px;\n --border-radius-full: 999px;\n\n /* 过渡时间 */\n --transition-fast: 0.1s;\n --transition-normal: 0.2s;\n --transition-slow: 0.3s;\n}\n\n/* 统一的文本与选择 */\n.vtable-sheet-noselect {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.vtable-sheet-allow-select {\n -webkit-touch-callout: text;\n -webkit-user-select: text;\n -khtml-user-select: text;\n -moz-user-select: text;\n -ms-user-select: text;\n user-select: text;\n}\n\n/* 通用样式 */\n.vtable-sheet-flex {\n display: flex;\n}\n\n.vtable-sheet-flex-center {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vtable-sheet-flex-between {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.vtable-sheet-flex-end {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n}\n\n.vtable-sheet-flex-column {\n display: flex;\n flex-direction: column;\n}\n\n.vtable-sheet-flex-1 {\n flex: 1;\n}\n\n.vtable-sheet-flex-grow-0 {\n flex-grow: 0;\n}\n\n.vtable-sheet-flex-shrink-0 {\n flex-shrink: 0;\n}\n\n.vtable-sheet-hidden {\n display: none !important;\n}\n\n.vtable-sheet-invisible {\n visibility: hidden !important;\n}\n\n.vtable-sheet-ellipsis {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* 图标样式 */\n.vtable-sheet-icon {\n width: var(--icon-size-medium);\n height: var(--icon-size-medium);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--gray-700);\n}\n\n.vtable-sheet-icon-sm {\n width: var(--icon-size-small);\n height: var(--icon-size-small);\n}\n\n.vtable-sheet-icon-lg {\n width: var(--icon-size-large);\n height: var(--icon-size-large);\n}\n\n/* 按钮样式 */\n.vtable-sheet-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-xs) var(--spacing-sm);\n border: 1px solid var(--border-color);\n background-color: var(--bg-default);\n color: var(--text-secondary);\n border-radius: var(--border-radius-sm);\n cursor: pointer;\n transition: all var(--transition-normal);\n font-family: var(--font-family-sans);\n font-size: 13px;\n line-height: 1.5;\n}\n\n.vtable-sheet-button:hover {\n background-color: var(--bg-hover);\n}\n\n.vtable-sheet-button:active {\n background-color: var(--bg-tertiary);\n}\n\n.vtable-sheet-button-primary {\n background-color: var(--primary-color);\n color: var(--white);\n border-color: var(--primary-color);\n}\n\n.vtable-sheet-button-primary:hover {\n background-color: var(--secondary-color);\n border-color: var(--secondary-color);\n}\n\n.vtable-sheet-button-icon {\n padding: var(--spacing-xs);\n border: none;\n background: transparent;\n}\n\n.vtable-sheet-button-icon:hover {\n background-color: var(--bg-hover);\n}\n\n/* 工具提示 */\n.vtable-sheet-tooltip {\n position: relative;\n}\n\n.vtable-sheet-tooltip::after {\n content: attr(data-tooltip);\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n padding: 4px 8px;\n background-color: var(--gray-900);\n color: var(--white);\n border-radius: var(--border-radius-sm);\n font-size: 12px;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: opacity var(--transition-normal), visibility var(--transition-normal);\n z-index: 1000;\n}\n\n.vtable-sheet-tooltip:hover::after {\n opacity: 1;\n visibility: visible;\n}\n\n/* 输入框样式 */\n.vtable-sheet-input {\n padding: var(--spacing-xs) var(--spacing-sm);\n border: 1px solid var(--border-color);\n border-radius: var(--border-radius-sm);\n font-family: var(--font-family-sans);\n font-size: 13px;\n outline: none;\n transition: border-color var(--transition-normal);\n}\n\n.vtable-sheet-input:focus {\n border-color: var(--primary-color);\n}\n\n/* 动画和过渡 */\n.vtable-sheet-fade-in {\n animation: vtable-sheet-fade-in var(--transition-normal) ease-in-out;\n}\n\n@keyframes vtable-sheet-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n.vtable-sheet-fade-out {\n animation: vtable-sheet-fade-out var(--transition-normal) ease-in-out;\n}\n\n@keyframes vtable-sheet-fade-out {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n}\n\n/* 滚动条样式 */\n.vtable-sheet-scrollbar {\n scrollbar-width: thin;\n scrollbar-color: var(--gray-400) transparent;\n}\n\n.vtable-sheet-scrollbar::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.vtable-sheet-scrollbar::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.vtable-sheet-scrollbar::-webkit-scrollbar-thumb {\n background-color: var(--gray-400);\n border-radius: 4px;\n}\n\n.vtable-sheet-scrollbar::-webkit-scrollbar-thumb:hover {\n background-color: var(--gray-500);\n} \n",
|
|
7
|
+
document.head.appendChild(styleElement);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,MAAM,UAAU,WAAW;IACzB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;QACvB,OAAO;KACR;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,GAAG,gCAAgC,CAAC;IACnD,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiU5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC","file":"common.js","sourcesContent":["import { Env } from '../tools/env';\n\nexport function importStyle() {\n if (Env.mode === 'node') {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.id = 'vtable-sheet-common-styleSheet';\n styleElement.textContent = `\n/* 通用样式和变量 */\n:root {\n --border-color: #e0e0e0;\n --primary-color: #1a73e8;\n --hover-color: #f5f5f5;\n --active-color: #e8f0fe;\n --text-color: #333;\n --gray-text: #666;\n --light-gray: #f8f8f8;\n --toolbar-height: 28px;\n --tab-height: 28px;\n\n /* 基础颜色 */\n --primary-color-light: #e8f0fe;\n --secondary-color: #4285f4;\n --success-color: #1e8e3e;\n --warning-color: #ffa000;\n --danger-color: #d93025;\n --info-color: #1a73e8;\n\n /* 中性色 */\n --black: #000;\n --gray-900: #212121;\n --gray-800: #424242;\n --gray-700: #616161;\n --gray-600: #757575;\n --gray-500: #9e9e9e;\n --gray-400: #bdbdbd;\n --gray-300: #e0e0e0;\n --gray-200: #eeeeee;\n --gray-100: #f5f5f5;\n --gray-50: #fafafa;\n --white: #fff;\n\n /* 文本颜色 */\n --text-primary: var(--gray-900);\n --text-secondary: var(--gray-700);\n --text-tertiary: var(--gray-500);\n --text-disabled: var(--gray-400);\n --text-inverse: var(--white);\n\n /* 边框颜色 */\n --border-color-light: var(--gray-200);\n --border-color-dark: var(--gray-400);\n\n /* 背景颜色 */\n --bg-default: var(--white);\n --bg-secondary: var(--gray-100);\n --bg-tertiary: var(--gray-200);\n --bg-selected: var(--primary-color-light);\n --bg-hover: var(--gray-100);\n\n /* 阴影 */\n --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.05);\n --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1);\n --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);\n --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);\n\n /* 尺寸 */\n --formula-bar-height: 30px;\n --icon-size-small: 16px;\n --icon-size-medium: 20px;\n --icon-size-large: 24px;\n\n /* 字体 */\n --font-family-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', \n Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n --font-family-mono: 'Roboto Mono', 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;\n\n /* 间距 */\n --spacing-xs: 4px;\n --spacing-sm: 8px;\n --spacing-md: 12px;\n --spacing-lg: 16px;\n --spacing-xl: 24px;\n\n /* 边框圆角 */\n --border-radius-sm: 2px;\n --border-radius-md: 4px;\n --border-radius-lg: 8px;\n --border-radius-full: 999px;\n\n /* 过渡时间 */\n --transition-fast: 0.1s;\n --transition-normal: 0.2s;\n --transition-slow: 0.3s;\n}\n\n/* 统一的文本与选择 */\n.vtable-sheet-noselect {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.vtable-sheet-allow-select {\n -webkit-touch-callout: text;\n -webkit-user-select: text;\n -khtml-user-select: text;\n -moz-user-select: text;\n -ms-user-select: text;\n user-select: text;\n}\n\n/* 通用样式 */\n.vtable-sheet-flex {\n display: flex;\n}\n\n.vtable-sheet-flex-center {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vtable-sheet-flex-between {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.vtable-sheet-flex-end {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n}\n\n.vtable-sheet-flex-column {\n display: flex;\n flex-direction: column;\n}\n\n.vtable-sheet-flex-1 {\n flex: 1;\n}\n\n.vtable-sheet-flex-grow-0 {\n flex-grow: 0;\n}\n\n.vtable-sheet-flex-shrink-0 {\n flex-shrink: 0;\n}\n\n.vtable-sheet-hidden {\n display: none !important;\n}\n\n.vtable-sheet-invisible {\n visibility: hidden !important;\n}\n\n.vtable-sheet-ellipsis {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* 图标样式 */\n.vtable-sheet-icon {\n width: var(--icon-size-medium);\n height: var(--icon-size-medium);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--gray-700);\n}\n\n.vtable-sheet-icon-sm {\n width: var(--icon-size-small);\n height: var(--icon-size-small);\n}\n\n.vtable-sheet-icon-lg {\n width: var(--icon-size-large);\n height: var(--icon-size-large);\n}\n\n/* 按钮样式 */\n.vtable-sheet-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-xs) var(--spacing-sm);\n border: 1px solid var(--border-color);\n background-color: var(--bg-default);\n color: var(--text-secondary);\n border-radius: var(--border-radius-sm);\n cursor: pointer;\n transition: all var(--transition-normal);\n font-family: var(--font-family-sans);\n font-size: 13px;\n line-height: 1.5;\n}\n\n.vtable-sheet-button:hover {\n background-color: var(--bg-hover);\n}\n\n.vtable-sheet-button:active {\n background-color: var(--bg-tertiary);\n}\n\n.vtable-sheet-button-primary {\n background-color: var(--primary-color);\n color: var(--white);\n border-color: var(--primary-color);\n}\n\n.vtable-sheet-button-primary:hover {\n background-color: var(--secondary-color);\n border-color: var(--secondary-color);\n}\n\n.vtable-sheet-button-icon {\n padding: var(--spacing-xs);\n border: none;\n background: transparent;\n}\n\n.vtable-sheet-button-icon:hover {\n background-color: var(--bg-hover);\n}\n\n/* 工具提示 */\n.vtable-sheet-tooltip {\n position: relative;\n}\n\n.vtable-sheet-tooltip::after {\n content: attr(data-tooltip);\n position: absolute;\n bottom: 100%;\n left: 50%;\n transform: translateX(-50%);\n padding: 4px 8px;\n background-color: var(--gray-900);\n color: var(--white);\n border-radius: var(--border-radius-sm);\n font-size: 12px;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: opacity var(--transition-normal), visibility var(--transition-normal);\n z-index: 1000;\n}\n\n.vtable-sheet-tooltip:hover::after {\n opacity: 1;\n visibility: visible;\n}\n\n/* 输入框样式 */\n.vtable-sheet-input {\n padding: var(--spacing-xs) var(--spacing-sm);\n border: 1px solid var(--border-color);\n border-radius: var(--border-radius-sm);\n font-family: var(--font-family-sans);\n font-size: 13px;\n outline: none;\n transition: border-color var(--transition-normal);\n}\n\n.vtable-sheet-input:focus {\n border-color: var(--primary-color);\n}\n\n/* 动画和过渡 */\n.vtable-sheet-fade-in {\n animation: vtable-sheet-fade-in var(--transition-normal) ease-in-out;\n}\n\n@keyframes vtable-sheet-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n.vtable-sheet-fade-out {\n animation: vtable-sheet-fade-out var(--transition-normal) ease-in-out;\n}\n\n@keyframes vtable-sheet-fade-out {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n}\n\n/* 滚动条样式 */\n.vtable-sheet-scrollbar {\n scrollbar-width: thin;\n scrollbar-color: var(--gray-400) transparent;\n}\n\n.vtable-sheet-scrollbar::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.vtable-sheet-scrollbar::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.vtable-sheet-scrollbar::-webkit-scrollbar-thumb {\n background-color: var(--gray-400);\n border-radius: 4px;\n}\n\n.vtable-sheet-scrollbar::-webkit-scrollbar-thumb:hover {\n background-color: var(--gray-500);\n} \n`;\n\n document.head.appendChild(styleElement);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function importStyle(): void;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Env } from "../tools/env";
|
|
2
|
+
|
|
3
|
+
export function importStyle() {
|
|
4
|
+
if ("node" === Env.mode) return;
|
|
5
|
+
const styleElement = document.createElement("style");
|
|
6
|
+
styleElement.id = "vtable-sheet-formula-autocomplete-styleSheet", styleElement.textContent = "\n/* 公式自动补全容器 */\n.vtable-formula-autocomplete {\n position: absolute;\n background: #ffffff;\n border: 1px solid #d9d9d9;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n max-height: 320px;\n overflow-y: auto;\n z-index: 1050;\n font-size: 13px;\n min-width: 300px;\n}\n\n/* 自动补全项 */\n.vtable-formula-autocomplete-item {\n padding: 8px 12px;\n cursor: pointer;\n transition: background-color 0.2s;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.vtable-formula-autocomplete-item:not(:last-child) {\n border-bottom: 1px solid #f0f0f0;\n}\n\n.vtable-formula-autocomplete-item:hover {\n background-color: #f5f7fa;\n}\n\n.vtable-formula-autocomplete-item.selected {\n background-color: #e6f7ff;\n}\n\n/* 函数名称 */\n.vtable-formula-autocomplete-item .item-name {\n font-weight: 600;\n color: #1890ff;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n font-size: 14px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* 函数类型标签 */\n.vtable-formula-autocomplete-item .item-type {\n display: inline-flex;\n align-items: center;\n padding: 0 6px;\n height: 18px;\n background: #f0f0f0;\n border-radius: 2px;\n font-size: 11px;\n color: #666;\n font-weight: normal;\n}\n\n.vtable-formula-autocomplete-item .item-type.function {\n background: #e6f7ff;\n color: #1890ff;\n}\n\n.vtable-formula-autocomplete-item .item-type.cell {\n background: #f6ffed;\n color: #52c41a;\n}\n\n.vtable-formula-autocomplete-item .item-type.range {\n background: #fff7e6;\n color: #fa8c16;\n}\n\n/* 函数签名 */\n.vtable-formula-autocomplete-item .item-signature {\n font-size: 12px;\n color: #595959;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n margin-left: 2px;\n}\n\n/* 函数描述 */\n.vtable-formula-autocomplete-item .item-description {\n font-size: 12px;\n color: #8c8c8c;\n line-height: 1.4;\n margin-top: 2px;\n}\n\n/* 无结果提示 */\n.vtable-formula-autocomplete-empty {\n padding: 20px;\n text-align: center;\n color: #999;\n font-size: 13px;\n}\n\n/* 滚动条样式 */\n.vtable-formula-autocomplete::-webkit-scrollbar {\n width: 6px;\n}\n\n.vtable-formula-autocomplete::-webkit-scrollbar-track {\n background: #f0f0f0;\n border-radius: 3px;\n}\n\n.vtable-formula-autocomplete::-webkit-scrollbar-thumb {\n background: #bfbfbf;\n border-radius: 3px;\n}\n\n.vtable-formula-autocomplete::-webkit-scrollbar-thumb:hover {\n background: #999;\n}\n\n/* 分组标题 */\n.vtable-formula-autocomplete-group {\n padding: 6px 12px;\n font-size: 12px;\n font-weight: 600;\n color: #999;\n background: #fafafa;\n border-bottom: 1px solid #f0f0f0;\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n/* 快捷键提示 */\n.vtable-formula-autocomplete-footer {\n padding: 8px 12px;\n background: #fafafa;\n border-top: 1px solid #f0f0f0;\n font-size: 11px;\n color: #999;\n display: flex;\n gap: 16px;\n position: sticky;\n bottom: 0;\n}\n\n.vtable-formula-autocomplete-footer .shortcut {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.vtable-formula-autocomplete-footer .key {\n display: inline-block;\n padding: 2px 6px;\n background: #fff;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 10px;\n color: #666;\n}\n\n.vtable-formula-autocomplete {\n z-index: 10000 !important;\n}\n\n.vtable-editor-container input {\n font-family: inherit;\n}\n",
|
|
7
|
+
document.head.appendChild(styleElement);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=formula-autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles/formula-autocomplete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,MAAM,UAAU,WAAW;IACzB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;QACvB,OAAO;KACR;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,GAAG,8CAA8C,CAAC;IACjE,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyK5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC","file":"formula-autocomplete.js","sourcesContent":["import { Env } from '../tools/env';\n\nexport function importStyle() {\n if (Env.mode === 'node') {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.id = 'vtable-sheet-formula-autocomplete-styleSheet';\n styleElement.textContent = `\n/* 公式自动补全容器 */\n.vtable-formula-autocomplete {\n position: absolute;\n background: #ffffff;\n border: 1px solid #d9d9d9;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n max-height: 320px;\n overflow-y: auto;\n z-index: 1050;\n font-size: 13px;\n min-width: 300px;\n}\n\n/* 自动补全项 */\n.vtable-formula-autocomplete-item {\n padding: 8px 12px;\n cursor: pointer;\n transition: background-color 0.2s;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.vtable-formula-autocomplete-item:not(:last-child) {\n border-bottom: 1px solid #f0f0f0;\n}\n\n.vtable-formula-autocomplete-item:hover {\n background-color: #f5f7fa;\n}\n\n.vtable-formula-autocomplete-item.selected {\n background-color: #e6f7ff;\n}\n\n/* 函数名称 */\n.vtable-formula-autocomplete-item .item-name {\n font-weight: 600;\n color: #1890ff;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n font-size: 14px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* 函数类型标签 */\n.vtable-formula-autocomplete-item .item-type {\n display: inline-flex;\n align-items: center;\n padding: 0 6px;\n height: 18px;\n background: #f0f0f0;\n border-radius: 2px;\n font-size: 11px;\n color: #666;\n font-weight: normal;\n}\n\n.vtable-formula-autocomplete-item .item-type.function {\n background: #e6f7ff;\n color: #1890ff;\n}\n\n.vtable-formula-autocomplete-item .item-type.cell {\n background: #f6ffed;\n color: #52c41a;\n}\n\n.vtable-formula-autocomplete-item .item-type.range {\n background: #fff7e6;\n color: #fa8c16;\n}\n\n/* 函数签名 */\n.vtable-formula-autocomplete-item .item-signature {\n font-size: 12px;\n color: #595959;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n margin-left: 2px;\n}\n\n/* 函数描述 */\n.vtable-formula-autocomplete-item .item-description {\n font-size: 12px;\n color: #8c8c8c;\n line-height: 1.4;\n margin-top: 2px;\n}\n\n/* 无结果提示 */\n.vtable-formula-autocomplete-empty {\n padding: 20px;\n text-align: center;\n color: #999;\n font-size: 13px;\n}\n\n/* 滚动条样式 */\n.vtable-formula-autocomplete::-webkit-scrollbar {\n width: 6px;\n}\n\n.vtable-formula-autocomplete::-webkit-scrollbar-track {\n background: #f0f0f0;\n border-radius: 3px;\n}\n\n.vtable-formula-autocomplete::-webkit-scrollbar-thumb {\n background: #bfbfbf;\n border-radius: 3px;\n}\n\n.vtable-formula-autocomplete::-webkit-scrollbar-thumb:hover {\n background: #999;\n}\n\n/* 分组标题 */\n.vtable-formula-autocomplete-group {\n padding: 6px 12px;\n font-size: 12px;\n font-weight: 600;\n color: #999;\n background: #fafafa;\n border-bottom: 1px solid #f0f0f0;\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n/* 快捷键提示 */\n.vtable-formula-autocomplete-footer {\n padding: 8px 12px;\n background: #fafafa;\n border-top: 1px solid #f0f0f0;\n font-size: 11px;\n color: #999;\n display: flex;\n gap: 16px;\n position: sticky;\n bottom: 0;\n}\n\n.vtable-formula-autocomplete-footer .shortcut {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.vtable-formula-autocomplete-footer .key {\n display: inline-block;\n padding: 2px 6px;\n background: #fff;\n border: 1px solid #d9d9d9;\n border-radius: 2px;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 10px;\n color: #666;\n}\n\n.vtable-formula-autocomplete {\n z-index: 10000 !important;\n}\n\n.vtable-editor-container input {\n font-family: inherit;\n}\n`;\n\n document.head.appendChild(styleElement);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function importStyle(): void;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Env } from "../tools/env";
|
|
2
|
+
|
|
3
|
+
export function importStyle() {
|
|
4
|
+
if ("node" === Env.mode) return;
|
|
5
|
+
const styleElement = document.createElement("style");
|
|
6
|
+
styleElement.id = "vtable-sheet-formula-bar-styleSheet", styleElement.textContent = "\n /* 公式栏样式 */\n.vtable-sheet-formula-bar {\n height: 30px;\n padding: 0;\n border-bottom: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #fff;\n position: relative;\n z-index: 10;\n box-shadow: 0 1px 2px rgba(0,0,0,0.05);\n flex-grow: 1; /* 占据剩余宽度 */\n height: 100%; /* 确保高度填满父容器 */\n \n}\n\n/* 单元格地址显示 */\n.vtable-sheet-cell-address {\n width: 60px;\n padding: 0 10px;\n display: flex;\n align-items: center;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n color: #333;\n height: 100%;\n border: 1px solid #e0e0e0;\n font-size: 13px;\n}\n\n/* fx图标 */\n.vtable-sheet-formula-icon {\n font-weight: normal;\n font-style: italic;\n margin: 0 8px;\n font-size: 14px;\n color: #666;\n font-family: 'Roboto Mono', monospace;\n width: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* 公式输入框 */\n.vtable-sheet-formula-input {\n flex: 1;\n padding: 0 8px;\n border: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n outline: none;\n font-size: 13px;\n height: 100%;\n color: #333;\n background-color: transparent;\n}\n\n.vtable-sheet-formula-input:focus {\n outline: none;\n}\n\n/* 公式操作按钮容器 */\n.vtable-sheet-formula-actions {\n flex: 0;\n display: flex;\n align-items: right;\n height: 100%;\n width: 100px;\n padding: 0 4px;\n border-left: 1px solid #e0e0e0;\n}\n\n/* 公式操作按钮 */\n.vtable-sheet-formula-button {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 12px;\n color: #666;\n margin: 0 2px;\n padding: 0;\n border-radius: 2px;\n transition: all 0.2s;\n}\n\n/* 取消按钮 */\n.vtable-sheet-formula-cancel:hover {\n color: #d93025;\n background-color: #f8f8f8;\n}\n\n/* 确认按钮 */\n.vtable-sheet-formula-confirm:hover {\n color: #1e8e3e;\n background-color: #f8f8f8;\n}\n\n/* 其他按钮样式 - 当有更多功能时使用 */\n.vtable-sheet-formula-more {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 16px;\n color: #666;\n margin: 0 2px;\n padding: 0;\n}\n\n.vtable-sheet-formula-more:hover {\n color: #1a73e8;\n}\n\n/* 取消之前不需要的工具栏样式 */\n.vtable-sheet-toolbar,\n.vtable-sheet-toolbar-group {\n display: none;\n} \n",
|
|
7
|
+
document.head.appendChild(styleElement);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=formula-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles/formula-bar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,MAAM,UAAU,WAAW;IACzB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;QACvB,OAAO;KACR;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,GAAG,qCAAqC,CAAC;IACxD,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiI5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC","file":"formula-bar.js","sourcesContent":["import { Env } from '../tools/env';\n\nexport function importStyle() {\n if (Env.mode === 'node') {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.id = 'vtable-sheet-formula-bar-styleSheet';\n styleElement.textContent = `\n /* 公式栏样式 */\n.vtable-sheet-formula-bar {\n height: 30px;\n padding: 0;\n border-bottom: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #fff;\n position: relative;\n z-index: 10;\n box-shadow: 0 1px 2px rgba(0,0,0,0.05);\n flex-grow: 1; /* 占据剩余宽度 */\n height: 100%; /* 确保高度填满父容器 */\n \n}\n\n/* 单元格地址显示 */\n.vtable-sheet-cell-address {\n width: 60px;\n padding: 0 10px;\n display: flex;\n align-items: center;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n color: #333;\n height: 100%;\n border: 1px solid #e0e0e0;\n font-size: 13px;\n}\n\n/* fx图标 */\n.vtable-sheet-formula-icon {\n font-weight: normal;\n font-style: italic;\n margin: 0 8px;\n font-size: 14px;\n color: #666;\n font-family: 'Roboto Mono', monospace;\n width: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* 公式输入框 */\n.vtable-sheet-formula-input {\n flex: 1;\n padding: 0 8px;\n border: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n outline: none;\n font-size: 13px;\n height: 100%;\n color: #333;\n background-color: transparent;\n}\n\n.vtable-sheet-formula-input:focus {\n outline: none;\n}\n\n/* 公式操作按钮容器 */\n.vtable-sheet-formula-actions {\n flex: 0;\n display: flex;\n align-items: right;\n height: 100%;\n width: 100px;\n padding: 0 4px;\n border-left: 1px solid #e0e0e0;\n}\n\n/* 公式操作按钮 */\n.vtable-sheet-formula-button {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 12px;\n color: #666;\n margin: 0 2px;\n padding: 0;\n border-radius: 2px;\n transition: all 0.2s;\n}\n\n/* 取消按钮 */\n.vtable-sheet-formula-cancel:hover {\n color: #d93025;\n background-color: #f8f8f8;\n}\n\n/* 确认按钮 */\n.vtable-sheet-formula-confirm:hover {\n color: #1e8e3e;\n background-color: #f8f8f8;\n}\n\n/* 其他按钮样式 - 当有更多功能时使用 */\n.vtable-sheet-formula-more {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 16px;\n color: #666;\n margin: 0 2px;\n padding: 0;\n}\n\n.vtable-sheet-formula-more:hover {\n color: #1a73e8;\n}\n\n/* 取消之前不需要的工具栏样式 */\n.vtable-sheet-toolbar,\n.vtable-sheet-toolbar-group {\n display: none;\n} \n`;\n\n document.head.appendChild(styleElement);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function importStyle(): void;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Env } from "../tools/env";
|
|
2
|
+
|
|
3
|
+
export function importStyle() {
|
|
4
|
+
if ("node" === Env.mode) return;
|
|
5
|
+
const styleElement = document.createElement("style");
|
|
6
|
+
styleElement.id = "vtable-sheet-menu-styleSheet", styleElement.textContent = "\n.vtable-sheet-main-menu {\n display: flex;\n flex-direction: row;\n align-items: center;\n height: 30px;\n padding: 0;\n border-bottom: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #fff;\n width: 50px;\n /* 内容居中 */\n justify-content: center;\n flex-shrink: 0; /* 防止菜单被压缩 */\n}\n.vtable-sheet-main-menu:hover {\n background-color: #f0f0f0;\n}\n\n.vtable-sheet-main-menu-button {\n display: flex;\n align-items: center;\n padding: 0 8px;\n cursor: pointer;\n height: 30px;\n}\n\n/* 菜单项容器 */\n.vtable-sheet-main-menu-container {\n position: absolute;\n top: 100%; /* 显示在按钮下方 */\n left: 0;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n z-index: 100;\n display: none;\n}\n\n.vtable-sheet-main-menu-container.active {\n display: block;\n}\n\n/* 菜单项列表(ul) */\n.vtable-sheet-main-menu-items {\n list-style: none;\n margin: 0;\n padding: 4px 0;\n min-width: 80px;\n /* 删除以下两行 */\n /* max-height: 300px; */\n /* overflow-y: hidden; */\n}\n\n/* 当内容超出时显示滚动条 */\n.vtable-sheet-main-menu-items.scrollable {\n overflow-y: auto;\n}\n\n/* 单个菜单项(li) */\n.vtable-sheet-main-menu-item {\n padding: 6px 12px;\n margin: 0; /* 清除默认外边距 */\n line-height: 1.5; /* 统一行高 */\n cursor: pointer;\n white-space: nowrap;\n color: #333; /* 文字颜色 */\n font-size: 12px; /* 字体大小 */\n transition: background 0.2s; /* 悬停动画 */\n \n /* 禁用文本选中 */\n user-select: none;\n -webkit-user-select: none;\n}\n\n/* 悬停和激活状态 */\n.vtable-sheet-main-menu-item:hover,\n.vtable-sheet-main-menu-item:focus {\n background-color: #f5f5f5; /* 浅灰色背景 */\n}\n\n.vtable-sheet-main-menu-item:active {\n background-color: #e0e0e0; /* 点击时深灰色 */\n}\n\n/* 分隔线(可选) */\n.vtable-sheet-main-menu-item.divider {\n border-top: 1px solid #e0e0e0;\n margin: 4px 0;\n padding: 0;\n height: 1px;\n cursor: default;\n}\n\n.vtable-sheet-main-menu-item-has-children {\n position: relative;\n}\n\n.vtable-sheet-main-menu-item-has-children::after {\n content: '>';\n position: absolute;\n right: 0px;\n top: 50%;\n transform: translateY(-50%);\n margin-right: 10px;\n}\n/* 子菜单容器 */\n.vtable-sheet-submenu-container {\n position: absolute;\n left: 100%; /* 默认向右展开 */\n top: 0;\n min-width: 120px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n z-index: 200; /* 高于主菜单 */\n display: none;\n}\n\n/* 激活时显示 */\n.vtable-sheet-main-menu-item:hover .vtable-sheet-submenu-container {\n display: block;\n}\n\n/* 子菜单项 */\n.vtable-sheet-submenu-item {\n position: relative; /* 为箭头定位 */\n padding: 8px 12px;\n cursor: pointer;\n transition: background 0.2s;\n}\n\n.vtable-sheet-submenu-item:hover {\n background: #f5f5f5;\n}\n\n/* 嵌套子菜单箭头 */\n.submenu-arrow {\n position: absolute;\n right: 8px;\n font-size: 10px;\n color: #999;\n}\n\n/* 响应式调整 */\n@media (max-width: 768px) {\n .vtable-sheet-submenu-container {\n left: auto !important;\n right: 100%; /* 小屏幕改为向左展开 */\n }\n}\n",
|
|
7
|
+
document.head.appendChild(styleElement);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles/menu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,MAAM,UAAU,WAAW;IACzB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;QACvB,OAAO;KACR;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,GAAG,8BAA8B,CAAC;IACjD,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0J5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC","file":"menu.js","sourcesContent":["import { Env } from '../tools/env';\n\nexport function importStyle() {\n if (Env.mode === 'node') {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.id = 'vtable-sheet-menu-styleSheet';\n styleElement.textContent = `\n.vtable-sheet-main-menu {\n display: flex;\n flex-direction: row;\n align-items: center;\n height: 30px;\n padding: 0;\n border-bottom: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #fff;\n width: 50px;\n /* 内容居中 */\n justify-content: center;\n flex-shrink: 0; /* 防止菜单被压缩 */\n}\n.vtable-sheet-main-menu:hover {\n background-color: #f0f0f0;\n}\n\n.vtable-sheet-main-menu-button {\n display: flex;\n align-items: center;\n padding: 0 8px;\n cursor: pointer;\n height: 30px;\n}\n\n/* 菜单项容器 */\n.vtable-sheet-main-menu-container {\n position: absolute;\n top: 100%; /* 显示在按钮下方 */\n left: 0;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n z-index: 100;\n display: none;\n}\n\n.vtable-sheet-main-menu-container.active {\n display: block;\n}\n\n/* 菜单项列表(ul) */\n.vtable-sheet-main-menu-items {\n list-style: none;\n margin: 0;\n padding: 4px 0;\n min-width: 80px;\n /* 删除以下两行 */\n /* max-height: 300px; */\n /* overflow-y: hidden; */\n}\n\n/* 当内容超出时显示滚动条 */\n.vtable-sheet-main-menu-items.scrollable {\n overflow-y: auto;\n}\n\n/* 单个菜单项(li) */\n.vtable-sheet-main-menu-item {\n padding: 6px 12px;\n margin: 0; /* 清除默认外边距 */\n line-height: 1.5; /* 统一行高 */\n cursor: pointer;\n white-space: nowrap;\n color: #333; /* 文字颜色 */\n font-size: 12px; /* 字体大小 */\n transition: background 0.2s; /* 悬停动画 */\n \n /* 禁用文本选中 */\n user-select: none;\n -webkit-user-select: none;\n}\n\n/* 悬停和激活状态 */\n.vtable-sheet-main-menu-item:hover,\n.vtable-sheet-main-menu-item:focus {\n background-color: #f5f5f5; /* 浅灰色背景 */\n}\n\n.vtable-sheet-main-menu-item:active {\n background-color: #e0e0e0; /* 点击时深灰色 */\n}\n\n/* 分隔线(可选) */\n.vtable-sheet-main-menu-item.divider {\n border-top: 1px solid #e0e0e0;\n margin: 4px 0;\n padding: 0;\n height: 1px;\n cursor: default;\n}\n\n.vtable-sheet-main-menu-item-has-children {\n position: relative;\n}\n\n.vtable-sheet-main-menu-item-has-children::after {\n content: '>';\n position: absolute;\n right: 0px;\n top: 50%;\n transform: translateY(-50%);\n margin-right: 10px;\n}\n/* 子菜单容器 */\n.vtable-sheet-submenu-container {\n position: absolute;\n left: 100%; /* 默认向右展开 */\n top: 0;\n min-width: 120px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n z-index: 200; /* 高于主菜单 */\n display: none;\n}\n\n/* 激活时显示 */\n.vtable-sheet-main-menu-item:hover .vtable-sheet-submenu-container {\n display: block;\n}\n\n/* 子菜单项 */\n.vtable-sheet-submenu-item {\n position: relative; /* 为箭头定位 */\n padding: 8px 12px;\n cursor: pointer;\n transition: background 0.2s;\n}\n\n.vtable-sheet-submenu-item:hover {\n background: #f5f5f5;\n}\n\n/* 嵌套子菜单箭头 */\n.submenu-arrow {\n position: absolute;\n right: 8px;\n font-size: 10px;\n color: #999;\n}\n\n/* 响应式调整 */\n@media (max-width: 768px) {\n .vtable-sheet-submenu-container {\n left: auto !important;\n right: 100%; /* 小屏幕改为向左展开 */\n }\n}\n`;\n\n document.head.appendChild(styleElement);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function importStyle(): void;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Env } from "../tools/env";
|
|
2
|
+
|
|
3
|
+
export function importStyle() {
|
|
4
|
+
if ("node" === Env.mode) return;
|
|
5
|
+
const styleElement = document.createElement("style");
|
|
6
|
+
styleElement.id = "vtable-sheet-sheet-tab-styleSheet", styleElement.textContent = "\n/* Sheet标签栏样式 */\n.vtable-sheet-tab-bar {\n height: 32px;\n padding: 0;\n border-top: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #f8f8f8;\n position: relative;\n box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.05);\n z-index: 10;\n width: 100%;\n}\n/* sheet列表样式 */\n.vtable-sheet-menu-list {\n position: absolute;\n right: 0;\n top: -175px;\n height: 174px;\n min-width: 140px;\n background-color: #f8f8f8;\n border: 1px solid #e0e0e0;\n box-sizing: content-box;\n border-radius: 4px;\n display: none;\n margin: 0;\n padding: 0 2px 0 2px;\n box-sizing: border-box;\n list-style: none;\n overflow-y: auto;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar {\n width: 4px;\n margin: 0;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar-thumb {\n background-color: #e0e0e0;\n border-radius: 3px;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar-track {\n background-color: transparent;\n}\n\n.vtable-sheet-menu-list.active {\n display: block;\n}\n/* sheet列表项样式 */\n.vtable-sheet-menu-item {\n display: flex;\n align-items: center;\n /* justify-content: space-between; */\n cursor: pointer;\n text-align: center;\n border-radius: 4px;\n height: 32px;\n line-height: 32px;\n margin: 2px 0;\n padding: 0 8px;\n background-color: #f8f8f840;\n max-width: 150px;\n overflow-x: hidden;\n text-overflow: ellipsis;\n box-sizing: border-box;\n}\n\n.vtable-sheet-menu-item:hover {\n background-color: #e0e0e0;\n}\n.vtable-sheet-menu-item.active {\n color: #1a73e8;\n}\n\n.vtable-sheet-menu-item-title {\n flex: 40px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Sheet标签容器 */\n.vtable-sheet-tabs-container {\n display: flex;\n flex: 1;\n flex-wrap: nowrap;\n /* 超出容器宽度时显示横向滚动条 */\n overflow-x: auto;\n overflow-y: visible; /* 允许Y方向溢出,确保三角标志显示 */\n height: 100%;\n /* 隐藏滚动条样式(可选,如需自定义滚动条可保留原生或用伪元素美化) */\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n/* 隐藏滚动条但保留功能 */\n.vtable-sheet-tabs-container::-webkit-scrollbar {\n display: none;\n}\n\n/* 单个sheet标签 */\n.vtable-sheet-tab {\n width: auto;\n /* 禁止标签压缩,保持内容撑开的宽度 */\n flex-shrink: 0;\n padding: 4px 12px;\n line-height: 24px;\n text-align: center;\n cursor: grab;\n border-right: 1px solid #e0e0e0;\n white-space: nowrap;\n color: #333;\n transition: background 0.1s;\n user-select: none;\n}\n\n.vtable-sheet-tab:hover {\n background-color: #f5f5f5;\n}\n\n.vtable-sheet-tab.active {\n color: #1a73e8;\n background-color: #fff;\n border-top: 2px solid #1a73e8;\n z-index: 2;\n}\n/* 编辑状态样式 */\n.vtable-sheet-tab[contenteditable='true'] {\n outline: inherit !important; /* 移除聚焦时的轮廓线 */\n border-right: 1px solid #e0e0e0;\n cursor: text;\n color: #333;\n}\n.vtable-sheet-tab[contenteditable='true']::selection {\n background-color: #2563eb33; /* 浅蓝色半透明背景(示例) */\n}\n\n/* 兼容 Firefox */\n.vtable-sheet-tab[contenteditable='true']::-moz-selection {\n background-color: #2563eb33;\n}\n\n/* 拖拽中的tab样式 */\n.vtable-sheet-tab.dragging {\n opacity: 0.7;\n transform: scale(1.02);\n background-color: #f0f5ff;\n cursor: grabbing !important;\n z-index: 100;\n position: relative;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n}\n\n/* 拖拽预览样式 */\n.vtable-sheet-drag-preview {\n position: fixed;\n z-index: 10000;\n padding: 4px 12px;\n background: rgba(255, 255, 255, 0.95);\n border: 1px solid #1890ff;\n border-radius: 4px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n opacity: 0.9;\n pointer-events: none;\n white-space: nowrap;\n font-size: 12px;\n line-height: 20px;\n color: #333;\n user-select: none;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* 插入位置指示器 */\n.vtable-sheet-insert-indicator {\n position: absolute;\n top: -4px;\n left: -5px;\n width: 0;\n height: 0;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n border-top: 6px solid black;\n z-index: inherit;\n}\n\n/* 添加sheet按钮 */\n.vtable-sheet-add-button {\n margin: 0 8px;\n padding: 0;\n background: #f8f8f8;\n border: none;\n cursor: pointer;\n font-size: 18px;\n transition: all 0.2s;\n height: 24px;\n width: 24px;\n color: #666;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.vtable-sheet-add-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* Sheet导航按钮容器 */\n.vtable-sheet-nav-buttons {\n display: flex;\n height: 100%;\n align-items: center;\n padding: 0 4px;\n background-color: #f8f8f8;\n flex-shrink: 0;\n}\n\n/* Sheet滚动控制按钮 */\n.vtable-sheet-scroll-button {\n width: 24px;\n height: 24px;\n background: none;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n font-size: 12px;\n margin: 0 2px;\n padding: 0;\n border-radius: 50%;\n}\n\n.vtable-sheet-scroll-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* 渐变阴影,提示可以滚动 */\n.vtable-sheet-fade-left,\n.vtable-sheet-fade-right {\n position: absolute;\n top: 0;\n height: 100%;\n width: 20px;\n pointer-events: none;\n z-index: 3;\n}\n\n.vtable-sheet-fade-left {\n left: 0;\n background: linear-gradient(to right, rgba(248, 248, 248, 1), rgba(248, 248, 248, 0));\n}\n\n.vtable-sheet-fade-right {\n right: 0;\n background: linear-gradient(to left, rgba(248, 248, 248, 1), rgba(248, 248, 248, 0));\n}\n\n/* Sheet菜单按钮 */\n.vtable-sheet-menu-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n margin: 0 4px;\n color: #666;\n background: none;\n border: none;\n cursor: pointer;\n border-radius: 50%;\n font-size: 16px;\n flex-shrink: 0;\n}\n\n.vtable-sheet-menu-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* 底部功能区 */\n.vtable-sheet-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 8px;\n height: var(--toolbar-height);\n border-top: 1px solid var(--border-color);\n background-color: var(--light-gray);\n}\n\n/* 底部左侧按钮组 */\n.vtable-sheet-footer-left {\n display: flex;\n align-items: center;\n}\n\n/* 底部右侧按钮组 */\n.vtable-sheet-footer-right {\n display: flex;\n align-items: center;\n}\n\n/* 删除工作表按钮 */\n.vtable-sheet-menu-delete-button {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 24px;\n height: 24px;\n line-height: 24px;\n color: #666;\n cursor: pointer;\n border: none;\n border-radius: 4px;\n user-select: none;\n}\n.vtable-sheet-menu-delete-button:hover {\n color: #000000;\n background-color: #eaeaea;\n}\n",
|
|
7
|
+
document.head.appendChild(styleElement);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=sheet-tab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles/sheet-tab.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,MAAM,UAAU,WAAW;IACzB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;QACvB,OAAO;KACR;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,GAAG,mCAAmC,CAAC;IACtD,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsU5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC","file":"sheet-tab.js","sourcesContent":["import { Env } from '../tools/env';\n\nexport function importStyle() {\n if (Env.mode === 'node') {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.id = 'vtable-sheet-sheet-tab-styleSheet';\n styleElement.textContent = `\n/* Sheet标签栏样式 */\n.vtable-sheet-tab-bar {\n height: 32px;\n padding: 0;\n border-top: 1px solid #e0e0e0;\n display: flex;\n align-items: center;\n background-color: #f8f8f8;\n position: relative;\n box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.05);\n z-index: 10;\n width: 100%;\n}\n/* sheet列表样式 */\n.vtable-sheet-menu-list {\n position: absolute;\n right: 0;\n top: -175px;\n height: 174px;\n min-width: 140px;\n background-color: #f8f8f8;\n border: 1px solid #e0e0e0;\n box-sizing: content-box;\n border-radius: 4px;\n display: none;\n margin: 0;\n padding: 0 2px 0 2px;\n box-sizing: border-box;\n list-style: none;\n overflow-y: auto;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar {\n width: 4px;\n margin: 0;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar-thumb {\n background-color: #e0e0e0;\n border-radius: 3px;\n}\n.vtable-sheet-menu-list::-webkit-scrollbar-track {\n background-color: transparent;\n}\n\n.vtable-sheet-menu-list.active {\n display: block;\n}\n/* sheet列表项样式 */\n.vtable-sheet-menu-item {\n display: flex;\n align-items: center;\n /* justify-content: space-between; */\n cursor: pointer;\n text-align: center;\n border-radius: 4px;\n height: 32px;\n line-height: 32px;\n margin: 2px 0;\n padding: 0 8px;\n background-color: #f8f8f840;\n max-width: 150px;\n overflow-x: hidden;\n text-overflow: ellipsis;\n box-sizing: border-box;\n}\n\n.vtable-sheet-menu-item:hover {\n background-color: #e0e0e0;\n}\n.vtable-sheet-menu-item.active {\n color: #1a73e8;\n}\n\n.vtable-sheet-menu-item-title {\n flex: 40px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Sheet标签容器 */\n.vtable-sheet-tabs-container {\n display: flex;\n flex: 1;\n flex-wrap: nowrap;\n /* 超出容器宽度时显示横向滚动条 */\n overflow-x: auto;\n overflow-y: visible; /* 允许Y方向溢出,确保三角标志显示 */\n height: 100%;\n /* 隐藏滚动条样式(可选,如需自定义滚动条可保留原生或用伪元素美化) */\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n/* 隐藏滚动条但保留功能 */\n.vtable-sheet-tabs-container::-webkit-scrollbar {\n display: none;\n}\n\n/* 单个sheet标签 */\n.vtable-sheet-tab {\n width: auto;\n /* 禁止标签压缩,保持内容撑开的宽度 */\n flex-shrink: 0;\n padding: 4px 12px;\n line-height: 24px;\n text-align: center;\n cursor: grab;\n border-right: 1px solid #e0e0e0;\n white-space: nowrap;\n color: #333;\n transition: background 0.1s;\n user-select: none;\n}\n\n.vtable-sheet-tab:hover {\n background-color: #f5f5f5;\n}\n\n.vtable-sheet-tab.active {\n color: #1a73e8;\n background-color: #fff;\n border-top: 2px solid #1a73e8;\n z-index: 2;\n}\n/* 编辑状态样式 */\n.vtable-sheet-tab[contenteditable='true'] {\n outline: inherit !important; /* 移除聚焦时的轮廓线 */\n border-right: 1px solid #e0e0e0;\n cursor: text;\n color: #333;\n}\n.vtable-sheet-tab[contenteditable='true']::selection {\n background-color: #2563eb33; /* 浅蓝色半透明背景(示例) */\n}\n\n/* 兼容 Firefox */\n.vtable-sheet-tab[contenteditable='true']::-moz-selection {\n background-color: #2563eb33;\n}\n\n/* 拖拽中的tab样式 */\n.vtable-sheet-tab.dragging {\n opacity: 0.7;\n transform: scale(1.02);\n background-color: #f0f5ff;\n cursor: grabbing !important;\n z-index: 100;\n position: relative;\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n}\n\n/* 拖拽预览样式 */\n.vtable-sheet-drag-preview {\n position: fixed;\n z-index: 10000;\n padding: 4px 12px;\n background: rgba(255, 255, 255, 0.95);\n border: 1px solid #1890ff;\n border-radius: 4px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n opacity: 0.9;\n pointer-events: none;\n white-space: nowrap;\n font-size: 12px;\n line-height: 20px;\n color: #333;\n user-select: none;\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* 插入位置指示器 */\n.vtable-sheet-insert-indicator {\n position: absolute;\n top: -4px;\n left: -5px;\n width: 0;\n height: 0;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n border-top: 6px solid black;\n z-index: inherit;\n}\n\n/* 添加sheet按钮 */\n.vtable-sheet-add-button {\n margin: 0 8px;\n padding: 0;\n background: #f8f8f8;\n border: none;\n cursor: pointer;\n font-size: 18px;\n transition: all 0.2s;\n height: 24px;\n width: 24px;\n color: #666;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.vtable-sheet-add-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* Sheet导航按钮容器 */\n.vtable-sheet-nav-buttons {\n display: flex;\n height: 100%;\n align-items: center;\n padding: 0 4px;\n background-color: #f8f8f8;\n flex-shrink: 0;\n}\n\n/* Sheet滚动控制按钮 */\n.vtable-sheet-scroll-button {\n width: 24px;\n height: 24px;\n background: none;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n font-size: 12px;\n margin: 0 2px;\n padding: 0;\n border-radius: 50%;\n}\n\n.vtable-sheet-scroll-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* 渐变阴影,提示可以滚动 */\n.vtable-sheet-fade-left,\n.vtable-sheet-fade-right {\n position: absolute;\n top: 0;\n height: 100%;\n width: 20px;\n pointer-events: none;\n z-index: 3;\n}\n\n.vtable-sheet-fade-left {\n left: 0;\n background: linear-gradient(to right, rgba(248, 248, 248, 1), rgba(248, 248, 248, 0));\n}\n\n.vtable-sheet-fade-right {\n right: 0;\n background: linear-gradient(to left, rgba(248, 248, 248, 1), rgba(248, 248, 248, 0));\n}\n\n/* Sheet菜单按钮 */\n.vtable-sheet-menu-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n margin: 0 4px;\n color: #666;\n background: none;\n border: none;\n cursor: pointer;\n border-radius: 50%;\n font-size: 16px;\n flex-shrink: 0;\n}\n\n.vtable-sheet-menu-button:hover {\n color: #1a73e8;\n background-color: #e8f0fe;\n}\n\n/* 底部功能区 */\n.vtable-sheet-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 8px;\n height: var(--toolbar-height);\n border-top: 1px solid var(--border-color);\n background-color: var(--light-gray);\n}\n\n/* 底部左侧按钮组 */\n.vtable-sheet-footer-left {\n display: flex;\n align-items: center;\n}\n\n/* 底部右侧按钮组 */\n.vtable-sheet-footer-right {\n display: flex;\n align-items: center;\n}\n\n/* 删除工作表按钮 */\n.vtable-sheet-menu-delete-button {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 24px;\n height: 24px;\n line-height: 24px;\n color: #666;\n cursor: pointer;\n border: none;\n border-radius: 4px;\n user-select: none;\n}\n.vtable-sheet-menu-delete-button:hover {\n color: #000000;\n background-color: #eaeaea;\n}\n`;\n\n document.head.appendChild(styleElement);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function importStyle(): void;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Env } from "../tools/env";
|
|
2
|
+
|
|
3
|
+
export function importStyle() {
|
|
4
|
+
if ("node" === Env.mode) return;
|
|
5
|
+
const styleElement = document.createElement("style");
|
|
6
|
+
styleElement.id = "vtable-sheet-sheet-styleSheet", styleElement.textContent = "\n/* Sheet容器样式 */\n.vtable-sheet-container {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: var(--bg-default);\n font-family: var(--font-family-sans);\n color: var(--text-primary);\n overflow: hidden;\n}\n\n.vtable-sheet-top-container {\n height: 30px;\n padding: 0;\n border: 1px solid #e0e0e0;\n display: flex;\n align-items: center; /* 确保子元素垂直居中 */\n}\n\n/* 主内容区域 */\n.vtable-sheet-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n}\n\n\n/* VTable 容器 */\n.vtable-sheet-table {\n flex: 1;\n position: relative;\n overflow: hidden;\n background-color: var(--bg-default);\n}\n\n/* 表格加载动画 */\n.vtable-sheet-loading {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(255, 255, 255, 0.7);\n z-index: 100;\n}\n\n.vtable-sheet-loading-spinner {\n width: 40px;\n height: 40px;\n border: 3px solid var(--gray-200);\n border-top-color: var(--primary-color);\n border-radius: 50%;\n animation: vtable-sheet-spinner 0.8s linear infinite;\n}\n\n@keyframes vtable-sheet-spinner {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* 状态提示 */\n.vtable-sheet-status {\n position: absolute;\n bottom: 8px;\n right: 8px;\n padding: 4px 8px;\n background-color: var(--gray-800);\n color: var(--white);\n border-radius: var(--border-radius-sm);\n font-size: 12px;\n opacity: 0.8;\n z-index: 50;\n transition: opacity 0.2s;\n}\n\n.vtable-sheet-status:hover {\n opacity: 1;\n}\n\n.vtable-sheet-snackbar-message {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n padding: 12px 24px;\n background-color: #333;\n color: white;\n border-radius: 4px;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n opacity: 0;\n transition: opacity 0.3s ease-in-out;\n z-index: 1000;\n white-space: nowrap;\n}\n\n.vtable-sheet-snackbar-message.show {\n opacity: 1;\n}\n\n/* 选择区域高亮 */\n.vtable-sheet-selection-highlight {\n position: absolute;\n border: 2px solid var(--primary-color);\n background-color: rgba(26, 115, 232, 0.1);\n pointer-events: none;\n z-index: 10;\n}\n\n/* 辅助区域 */\n.vtable-sheet-helper-area {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n pointer-events: none;\n z-index: 20;\n}\n\n/* 调整尺寸标记 */\n.vtable-sheet-resize-marker {\n position: absolute;\n background-color: var(--primary-color);\n z-index: 25;\n}\n\n.vtable-sheet-resize-marker.horizontal {\n height: 2px;\n left: 0;\n right: 0;\n}\n\n.vtable-sheet-resize-marker.vertical {\n width: 2px;\n top: 0;\n bottom: 0;\n}\n\n.vtable-sheet-error {\n padding: 16px;\n color: #d93025;\n text-align: center;\n}\n\n/* 隐藏底部功能区 */\n.vtable-sheet-footer {\n display: none;\n}\n\n",
|
|
7
|
+
document.head.appendChild(styleElement);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=sheet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles/sheet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC,MAAM,UAAU,WAAW;IACzB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;QACvB,OAAO;KACR;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACrD,YAAY,CAAC,EAAE,GAAG,+BAA+B,CAAC;IAClD,YAAY,CAAC,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8J5B,CAAC;IAEA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC","file":"sheet.js","sourcesContent":["import { Env } from '../tools/env';\n\nexport function importStyle() {\n if (Env.mode === 'node') {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.id = 'vtable-sheet-sheet-styleSheet';\n styleElement.textContent = `\n/* Sheet容器样式 */\n.vtable-sheet-container {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n background-color: var(--bg-default);\n font-family: var(--font-family-sans);\n color: var(--text-primary);\n overflow: hidden;\n}\n\n.vtable-sheet-top-container {\n height: 30px;\n padding: 0;\n border: 1px solid #e0e0e0;\n display: flex;\n align-items: center; /* 确保子元素垂直居中 */\n}\n\n/* 主内容区域 */\n.vtable-sheet-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n}\n\n\n/* VTable 容器 */\n.vtable-sheet-table {\n flex: 1;\n position: relative;\n overflow: hidden;\n background-color: var(--bg-default);\n}\n\n/* 表格加载动画 */\n.vtable-sheet-loading {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(255, 255, 255, 0.7);\n z-index: 100;\n}\n\n.vtable-sheet-loading-spinner {\n width: 40px;\n height: 40px;\n border: 3px solid var(--gray-200);\n border-top-color: var(--primary-color);\n border-radius: 50%;\n animation: vtable-sheet-spinner 0.8s linear infinite;\n}\n\n@keyframes vtable-sheet-spinner {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* 状态提示 */\n.vtable-sheet-status {\n position: absolute;\n bottom: 8px;\n right: 8px;\n padding: 4px 8px;\n background-color: var(--gray-800);\n color: var(--white);\n border-radius: var(--border-radius-sm);\n font-size: 12px;\n opacity: 0.8;\n z-index: 50;\n transition: opacity 0.2s;\n}\n\n.vtable-sheet-status:hover {\n opacity: 1;\n}\n\n.vtable-sheet-snackbar-message {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n padding: 12px 24px;\n background-color: #333;\n color: white;\n border-radius: 4px;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n opacity: 0;\n transition: opacity 0.3s ease-in-out;\n z-index: 1000;\n white-space: nowrap;\n}\n\n.vtable-sheet-snackbar-message.show {\n opacity: 1;\n}\n\n/* 选择区域高亮 */\n.vtable-sheet-selection-highlight {\n position: absolute;\n border: 2px solid var(--primary-color);\n background-color: rgba(26, 115, 232, 0.1);\n pointer-events: none;\n z-index: 10;\n}\n\n/* 辅助区域 */\n.vtable-sheet-helper-area {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n pointer-events: none;\n z-index: 20;\n}\n\n/* 调整尺寸标记 */\n.vtable-sheet-resize-marker {\n position: absolute;\n background-color: var(--primary-color);\n z-index: 25;\n}\n\n.vtable-sheet-resize-marker.horizontal {\n height: 2px;\n left: 0;\n right: 0;\n}\n\n.vtable-sheet-resize-marker.vertical {\n width: 2px;\n top: 0;\n bottom: 0;\n}\n\n.vtable-sheet-error {\n padding: 16px;\n color: #d93025;\n text-align: center;\n}\n\n/* 隐藏底部功能区 */\n.vtable-sheet-footer {\n display: none;\n}\n\n`;\n\n document.head.appendChild(styleElement);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function importStyles(): void;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { importStyle as importSheetStyle } from "./sheet";
|
|
2
|
+
|
|
3
|
+
import { importStyle as importSheetTabStyle } from "./sheet-tab";
|
|
4
|
+
|
|
5
|
+
import { importStyle as importMenuStyle } from "./menu";
|
|
6
|
+
|
|
7
|
+
import { importStyle as importFormulaBarStyle } from "./formula-bar";
|
|
8
|
+
|
|
9
|
+
import { importStyle as importCommonStyle } from "./common";
|
|
10
|
+
|
|
11
|
+
import { importStyle as importFormulaAutocompleteStyle } from "./formula-autocomplete";
|
|
12
|
+
|
|
13
|
+
export function importStyles() {
|
|
14
|
+
importCommonStyle(), importSheetStyle(), importSheetTabStyle(), importMenuStyle(),
|
|
15
|
+
importFormulaBarStyle(), importFormulaAutocompleteStyle();
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=style-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/styles/style-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,WAAW,IAAI,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,WAAW,IAAI,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,WAAW,IAAI,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAEvF,MAAM,UAAU,YAAY;IAC1B,iBAAiB,EAAE,CAAC;IACpB,gBAAgB,EAAE,CAAC;IACnB,mBAAmB,EAAE,CAAC;IACtB,eAAe,EAAE,CAAC;IAClB,qBAAqB,EAAE,CAAC;IACxB,8BAA8B,EAAE,CAAC;AACnC,CAAC","file":"style-manager.js","sourcesContent":["import { importStyle as importSheetStyle } from './sheet';\nimport { importStyle as importSheetTabStyle } from './sheet-tab';\nimport { importStyle as importMenuStyle } from './menu';\nimport { importStyle as importFormulaBarStyle } from './formula-bar';\nimport { importStyle as importCommonStyle } from './common';\nimport { importStyle as importFormulaAutocompleteStyle } from './formula-autocomplete';\n\nexport function importStyles() {\n importCommonStyle();\n importSheetStyle();\n importSheetTabStyle();\n importMenuStyle();\n importFormulaBarStyle();\n importFormulaAutocompleteStyle();\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { FormulaManager } from "../managers/formula-manager";
|
|
2
|
+
|
|
3
|
+
describe("FormulaManager.isFormulaComplete", (() => {
|
|
4
|
+
let formulaManager;
|
|
5
|
+
const mockSheet = {
|
|
6
|
+
getActiveSheet: jest.fn().mockReturnValue({
|
|
7
|
+
getKey: jest.fn().mockReturnValue("Sheet1")
|
|
8
|
+
})
|
|
9
|
+
};
|
|
10
|
+
beforeEach((() => {
|
|
11
|
+
formulaManager = new FormulaManager(mockSheet);
|
|
12
|
+
})), test("非公式输入应该返回true", (() => {
|
|
13
|
+
expect(formulaManager.isFormulaComplete("123")).toBe(!0), expect(formulaManager.isFormulaComplete("abc")).toBe(!0),
|
|
14
|
+
expect(formulaManager.isFormulaComplete("")).toBe(!1);
|
|
15
|
+
})), test("完整的公式应该返回true", (() => {
|
|
16
|
+
expect(formulaManager.isFormulaComplete("=A1")).toBe(!0), expect(formulaManager.isFormulaComplete("=SUM(A1:B10)")).toBe(!0),
|
|
17
|
+
expect(formulaManager.isFormulaComplete("=A1+B2")).toBe(!0), expect(formulaManager.isFormulaComplete('=IF(A1>10,"大于10","小于等于10")')).toBe(!0);
|
|
18
|
+
})), test("未完成的公式应该返回false", (() => {
|
|
19
|
+
expect(formulaManager.isFormulaComplete("=SUM(")).toBe(!1), expect(formulaManager.isFormulaComplete("=A1+")).toBe(!1);
|
|
20
|
+
})), test("只有等号的公式应该返回false", (() => {
|
|
21
|
+
expect(formulaManager.isFormulaComplete("=")).toBe(!1), expect(formulaManager.isFormulaComplete("= ")).toBe(!1),
|
|
22
|
+
expect(formulaManager.isFormulaComplete("= ")).toBe(!1);
|
|
23
|
+
})), test("括号不匹配的公式应该返回false", (() => {
|
|
24
|
+
expect(formulaManager.isFormulaComplete("=SUM(A1:B10")).toBe(!1), expect(formulaManager.isFormulaComplete('=IF(A1>10,"大于10"')).toBe(!1);
|
|
25
|
+
})), test("引号不匹配的公式应该返回false", (() => {
|
|
26
|
+
expect(formulaManager.isFormulaComplete('=IF(A1>10,"大于10)')).toBe(!1), expect(formulaManager.isFormulaComplete('=CONCATENATE("Hello)')).toBe(!1);
|
|
27
|
+
})), test("参数不完整的公式应该返回false", (() => {
|
|
28
|
+
expect(formulaManager.isFormulaComplete("=SUM(A1,)")).toBe(!1), expect(formulaManager.isFormulaComplete("=SUM(A1,B2,)")).toBe(!1),
|
|
29
|
+
expect(formulaManager.isFormulaComplete("=SUM()")).toBe(!1), expect(formulaManager.isFormulaComplete("=AVERAGE(,)")).toBe(!1);
|
|
30
|
+
})), test("连续逗号的公式应该返回false", (() => {
|
|
31
|
+
expect(formulaManager.isFormulaComplete("=SUM(A1,,B2)")).toBe(!1), expect(formulaManager.isFormulaComplete('=CONCATENATE("Hello",,"World")')).toBe(!1);
|
|
32
|
+
})), test("以逗号结尾的公式应该返回false", (() => {
|
|
33
|
+
expect(formulaManager.isFormulaComplete("=SUM(A1,")).toBe(!1), expect(formulaManager.isFormulaComplete('=CONCATENATE("Hello",')).toBe(!1);
|
|
34
|
+
}));
|
|
35
|
+
}));
|
|
36
|
+
//# sourceMappingURL=formula-complete.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/test/formula-complete.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG7D,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,IAAI,cAA8B,CAAC;IAGnC,MAAM,SAAS,GAAG;QAChB,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;YACxC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC;SAC5C,CAAC;KACuB,CAAC;IAE5B,UAAU,CAAC,GAAG,EAAE;QACd,cAAc,GAAG,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzE,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClE,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,gCAAgC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjE,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","file":"formula-complete.test.js","sourcesContent":["import { FormulaManager } from '../managers/formula-manager';\nimport type VTableSheet from '../components/vtable-sheet';\n\ndescribe('FormulaManager.isFormulaComplete', () => {\n let formulaManager: FormulaManager;\n\n // 创建一个模拟的VTableSheet实例\n const mockSheet = {\n getActiveSheet: jest.fn().mockReturnValue({\n getKey: jest.fn().mockReturnValue('Sheet1')\n })\n } as unknown as VTableSheet;\n\n beforeEach(() => {\n formulaManager = new FormulaManager(mockSheet);\n });\n\n test('非公式输入应该返回true', () => {\n expect(formulaManager.isFormulaComplete('123')).toBe(true);\n expect(formulaManager.isFormulaComplete('abc')).toBe(true);\n expect(formulaManager.isFormulaComplete('')).toBe(false); // 空字符串特殊处理为false\n });\n\n test('完整的公式应该返回true', () => {\n expect(formulaManager.isFormulaComplete('=A1')).toBe(true);\n expect(formulaManager.isFormulaComplete('=SUM(A1:B10)')).toBe(true);\n expect(formulaManager.isFormulaComplete('=A1+B2')).toBe(true);\n expect(formulaManager.isFormulaComplete('=IF(A1>10,\"大于10\",\"小于等于10\")')).toBe(true);\n });\n\n test('未完成的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=SUM(')).toBe(false);\n expect(formulaManager.isFormulaComplete('=A1+')).toBe(false);\n });\n\n test('只有等号的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=')).toBe(false);\n expect(formulaManager.isFormulaComplete('= ')).toBe(false);\n expect(formulaManager.isFormulaComplete('= ')).toBe(false);\n });\n\n test('括号不匹配的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=SUM(A1:B10')).toBe(false);\n expect(formulaManager.isFormulaComplete('=IF(A1>10,\"大于10\"')).toBe(false);\n });\n\n test('引号不匹配的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=IF(A1>10,\"大于10)')).toBe(false);\n expect(formulaManager.isFormulaComplete('=CONCATENATE(\"Hello)')).toBe(false);\n });\n\n test('参数不完整的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=SUM(A1,)')).toBe(false);\n expect(formulaManager.isFormulaComplete('=SUM(A1,B2,)')).toBe(false);\n expect(formulaManager.isFormulaComplete('=SUM()')).toBe(false);\n expect(formulaManager.isFormulaComplete('=AVERAGE(,)')).toBe(false);\n });\n\n test('连续逗号的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=SUM(A1,,B2)')).toBe(false);\n expect(formulaManager.isFormulaComplete('=CONCATENATE(\"Hello\",,\"World\")')).toBe(false);\n });\n\n test('以逗号结尾的公式应该返回false', () => {\n expect(formulaManager.isFormulaComplete('=SUM(A1,')).toBe(false);\n expect(formulaManager.isFormulaComplete('=CONCATENATE(\"Hello\",')).toBe(false);\n });\n});\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type EnvMode = 'browser' | 'node' | 'worker' | 'miniApp' | 'desktop-miniApp';
|
|
2
|
+
export type LooseFunction = (...args: any) => any;
|
|
3
|
+
export declare class Env {
|
|
4
|
+
static _mode: EnvMode;
|
|
5
|
+
static get mode(): EnvMode;
|
|
6
|
+
static set mode(mode: EnvMode);
|
|
7
|
+
static dpr: number;
|
|
8
|
+
static CreateCanvas?: LooseFunction;
|
|
9
|
+
static LoadImage?: LooseFunction;
|
|
10
|
+
static RequestAnimationFrame?: LooseFunction;
|
|
11
|
+
static CancelAnimationFrame?: LooseFunction;
|
|
12
|
+
static RegisterCreateCanvas(func: LooseFunction): void;
|
|
13
|
+
static RegisterLoadImage(func: LooseFunction): void;
|
|
14
|
+
static GetCreateCanvasFunc(): LooseFunction | undefined;
|
|
15
|
+
static RegisterRequestAnimationFrame(func: LooseFunction): void;
|
|
16
|
+
static GetRequestAnimationFrame(): LooseFunction;
|
|
17
|
+
static RegisterCancelAnimationFrame(func: LooseFunction): void;
|
|
18
|
+
static GetCancelAnimationFrame(): LooseFunction;
|
|
19
|
+
}
|
|
20
|
+
export declare function clearPageSelection(): void;
|
package/es/tools/env.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export class Env {
|
|
2
|
+
static get mode() {
|
|
3
|
+
return Env._mode || (Env._mode = defaultMode()), Env._mode;
|
|
4
|
+
}
|
|
5
|
+
static set mode(mode) {
|
|
6
|
+
Env._mode = mode;
|
|
7
|
+
}
|
|
8
|
+
static RegisterCreateCanvas(func) {
|
|
9
|
+
Env.CreateCanvas = func;
|
|
10
|
+
}
|
|
11
|
+
static RegisterLoadImage(func) {
|
|
12
|
+
Env.LoadImage = func;
|
|
13
|
+
}
|
|
14
|
+
static GetCreateCanvasFunc() {
|
|
15
|
+
return Env.CreateCanvas ? Env.CreateCanvas : "worker" === Env.mode ? (width = 200, height = 200) => new OffscreenCanvas(width, height) : void 0;
|
|
16
|
+
}
|
|
17
|
+
static RegisterRequestAnimationFrame(func) {
|
|
18
|
+
Env.RequestAnimationFrame = func();
|
|
19
|
+
}
|
|
20
|
+
static GetRequestAnimationFrame() {
|
|
21
|
+
if (Env.RequestAnimationFrame) return Env.RequestAnimationFrame;
|
|
22
|
+
}
|
|
23
|
+
static RegisterCancelAnimationFrame(func) {
|
|
24
|
+
Env.CancelAnimationFrame = func();
|
|
25
|
+
}
|
|
26
|
+
static GetCancelAnimationFrame() {
|
|
27
|
+
if (Env.CancelAnimationFrame) return Env.CancelAnimationFrame;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function defaultMode() {
|
|
32
|
+
let mode = "browser";
|
|
33
|
+
try {
|
|
34
|
+
"node" === window.type ? mode = "node" : "undefined" == typeof window || window.performance ? "undefined" == typeof window && (mode = "node") : mode = "miniApp";
|
|
35
|
+
} catch (err) {
|
|
36
|
+
mode = "node";
|
|
37
|
+
}
|
|
38
|
+
return mode;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
Env.dpr = 0;
|
|
42
|
+
|
|
43
|
+
export function clearPageSelection() {
|
|
44
|
+
try {
|
|
45
|
+
const selection = window.getSelection();
|
|
46
|
+
if (selection) {
|
|
47
|
+
if ("function" == typeof selection.removeAllRanges) return void selection.removeAllRanges();
|
|
48
|
+
if ("function" == typeof selection.empty) return void selection.empty();
|
|
49
|
+
if ("function" == typeof selection.collapse) return void selection.collapse(document.body, 0);
|
|
50
|
+
}
|
|
51
|
+
} catch (error) {}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/env.ts"],"names":[],"mappings":"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","file":"env.js","sourcesContent":["export type EnvMode = 'browser' | 'node' | 'worker' | 'miniApp' | 'desktop-miniApp';\nexport type LooseFunction = (...args: any) => any;\n\nexport class Env {\n static _mode: EnvMode;\n public static get mode() {\n if (!Env._mode) {\n Env._mode = defaultMode();\n }\n return Env._mode;\n }\n public static set mode(mode: EnvMode) {\n Env._mode = mode;\n }\n\n static dpr = 0;\n\n static CreateCanvas?: LooseFunction;\n\n static LoadImage?: LooseFunction;\n\n static RequestAnimationFrame?: LooseFunction;\n\n static CancelAnimationFrame?: LooseFunction;\n\n static RegisterCreateCanvas(func: LooseFunction) {\n Env.CreateCanvas = func;\n }\n\n static RegisterLoadImage(func: LooseFunction) {\n Env.LoadImage = func;\n }\n\n static GetCreateCanvasFunc(): LooseFunction | undefined {\n if (Env.CreateCanvas) {\n return Env.CreateCanvas;\n }\n if (Env.mode === 'worker') {\n return (width = 200, height = 200) => new OffscreenCanvas(width, height);\n }\n return undefined;\n }\n\n static RegisterRequestAnimationFrame(func: LooseFunction) {\n Env.RequestAnimationFrame = func();\n }\n\n static GetRequestAnimationFrame() {\n if (Env.RequestAnimationFrame) {\n return Env.RequestAnimationFrame;\n }\n return undefined;\n }\n\n static RegisterCancelAnimationFrame(func: LooseFunction) {\n Env.CancelAnimationFrame = func();\n }\n\n static GetCancelAnimationFrame() {\n if (Env.CancelAnimationFrame) {\n return Env.CancelAnimationFrame;\n }\n return undefined;\n }\n}\n\n/**\n *\n * 这个默认的判断方法并不能区分出不同的环境,所以这里采用是否判断\n * 满足条件为 'browser',不满足则为 'node'\n */\nfunction defaultMode(): EnvMode {\n let mode: EnvMode = 'browser';\n try {\n if ((window as any).type === 'node') {\n mode = 'node';\n } else if (typeof window !== 'undefined' && !window.performance) {\n mode = 'miniApp';\n } else if (typeof window === 'undefined') {\n mode = 'node';\n }\n } catch (err) {\n mode = 'node';\n }\n return mode;\n}\n/**\n * 清空页面上的所有文本选择,使用多种兼容性方法\n */\nexport function clearPageSelection(): void {\n try {\n const selection = window.getSelection();\n if (selection) {\n // 方法1: removeAllRanges() - 标准方法,最广泛支持\n if (typeof selection.removeAllRanges === 'function') {\n selection.removeAllRanges();\n console.log('使用 removeAllRanges() 清空selection');\n return;\n }\n\n // 方法2: empty() - IE 和一些旧浏览器\n if (typeof (selection as any).empty === 'function') {\n (selection as any).empty();\n console.log('使用 empty() 清空selection');\n return;\n }\n\n // 方法3: collapse() - 备用方法\n if (typeof selection.collapse === 'function') {\n selection.collapse(document.body, 0);\n console.log('使用 collapse() 清空selection');\n return;\n }\n\n console.warn('无法清空selection:不支持的浏览器');\n }\n } catch (error) {\n console.warn('清空selection时出错:', error);\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function checkTabTitle(newTitle) {
|
|
2
|
+
return newTitle ? newTitle.length > 100 ? "工作表名称不能超过100个字符" : /[\\/:*?"<>|]/.test(newTitle) ? "工作表名称不能包含特殊字符,如/ \\ ? * [ ] : |" : null : "工作表名称不能为空";
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export function isPropertyWritable(obj, prop) {
|
|
6
|
+
const descriptor = Object.getOwnPropertyDescriptor(obj, prop);
|
|
7
|
+
return !!descriptor && (!!descriptor.set || !0 === descriptor.writable);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/index.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,WAAW,CAAC;KACpB;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE;QACzB,OAAO,iBAAiB,CAAC;KAC1B;IAED,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;QACjC,OAAO,iCAAiC,CAAC;KAC1C;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAGD,MAAM,UAAU,kBAAkB,CAAC,GAAQ,EAAE,IAAqB;IAChE,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9D,IAAI,CAAC,UAAU,EAAE;QAEf,OAAO,KAAK,CAAC;KACd;IAGD,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC;AAC1D,CAAC","file":"index.js","sourcesContent":["/**\n * 工具函数导出\n * @namespace tools\n */\n\n// 暂时没有导出的工具函数\nexport {};\n/**\n * 检查工作表名称\n */\nexport function checkTabTitle(newTitle: string): string | null {\n if (!newTitle) {\n return '工作表名称不能为空';\n }\n if (newTitle.length > 100) {\n return '工作表名称不能超过100个字符';\n }\n // 检查是否包含特殊字符,如/ \\ ? * [ ] : |\n if (/[\\\\/:*?\"<>|]/.test(newTitle)) {\n return '工作表名称不能包含特殊字符,如/ \\\\ ? * [ ] : |';\n }\n // 其他规则待补充...\n return null;\n}\n\n/** 判断对象的属性是否可写 */\nexport function isPropertyWritable(obj: any, prop: string | number) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (!descriptor) {\n // 属性不存在\n return false;\n }\n\n // 检查是否有 setter 方法或 writable 属性为 true\n return !!descriptor.set || descriptor.writable === true;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function showSnackbar(message: string, duration?: number): void;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function showSnackbar(message, duration = 3e3) {
|
|
2
|
+
const snackbarId = `snackbar-${Date.now()}`;
|
|
3
|
+
if (document.getElementById(snackbarId)) return;
|
|
4
|
+
const snackbar = document.createElement("div");
|
|
5
|
+
snackbar.id = snackbarId, snackbar.className = "vtable-sheet-snackbar-message",
|
|
6
|
+
snackbar.textContent = message, document.body.appendChild(snackbar), setTimeout((() => {
|
|
7
|
+
snackbar.classList.add("show");
|
|
8
|
+
}), 10), setTimeout((() => {
|
|
9
|
+
snackbar.classList.remove("show"), snackbar.addEventListener("transitionend", (function handler() {
|
|
10
|
+
snackbar.removeEventListener("transitionend", handler), document.body.contains(snackbar) && document.body.removeChild(snackbar);
|
|
11
|
+
}));
|
|
12
|
+
}), duration);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=snackbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/ui/snackbar.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,QAAQ,GAAG,IAAI;IAC3D,MAAM,UAAU,GAAG,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC5C,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE;QACvC,OAAO;KACR;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC/C,QAAQ,CAAC,EAAE,GAAG,UAAU,CAAC;IACzB,QAAQ,CAAC,SAAS,GAAG,+BAA+B,CAAC;IACrD,QAAQ,CAAC,WAAW,GAAG,OAAO,CAAC;IAE/B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,EAAE,EAAE,CAAC,CAAC;IAGP,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAElC,QAAQ,CAAC,gBAAgB,CAAC,eAAe,EAAE,SAAS,OAAO;YACzD,QAAQ,CAAC,mBAAmB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;gBACpC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;aACrC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,QAAQ,CAAC,CAAC;AACf,CAAC","file":"snackbar.js","sourcesContent":["/**\n * 显示Snackbar消息\n * @param message - 要显示的消息内容\n * @param duration - 显示时长(毫秒),默认3000ms\n */\nexport function showSnackbar(message: string, duration = 3000): void {\n const snackbarId = `snackbar-${Date.now()}`;\n if (document.getElementById(snackbarId)) {\n return;\n }\n const snackbar = document.createElement('div');\n snackbar.id = snackbarId;\n snackbar.className = 'vtable-sheet-snackbar-message';\n snackbar.textContent = message;\n\n document.body.appendChild(snackbar);\n setTimeout(() => {\n snackbar.classList.add('show');\n }, 10);\n\n // 自动隐藏\n setTimeout(() => {\n snackbar.classList.remove('show');\n // 过渡结束后移除DOM\n snackbar.addEventListener('transitionend', function handler() {\n snackbar.removeEventListener('transitionend', handler);\n if (document.body.contains(snackbar)) {\n document.body.removeChild(snackbar);\n }\n });\n }, duration);\n}\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface CellCoord {
|
|
2
|
+
row: number;
|
|
3
|
+
col: number;
|
|
4
|
+
}
|
|
5
|
+
export interface CellRange {
|
|
6
|
+
startRow: number;
|
|
7
|
+
startCol: number;
|
|
8
|
+
endRow: number;
|
|
9
|
+
endCol: number;
|
|
10
|
+
}
|
|
11
|
+
export declare enum SelectionMode {
|
|
12
|
+
CELL = "cell",
|
|
13
|
+
ROW = "row",
|
|
14
|
+
COLUMN = "column",
|
|
15
|
+
RANGE = "range"
|
|
16
|
+
}
|
|
17
|
+
export interface IStyle {
|
|
18
|
+
[key: string]: string | number | boolean | undefined;
|
|
19
|
+
}
|
|
20
|
+
export type CellValue = string | number | boolean | null | undefined;
|
|
21
|
+
export interface CellAddress extends CellCoord {
|
|
22
|
+
sheetId: string;
|
|
23
|
+
}
|
|
24
|
+
export interface IToolbarItem {
|
|
25
|
+
id: string;
|
|
26
|
+
icon?: string;
|
|
27
|
+
text?: string;
|
|
28
|
+
tooltip?: string;
|
|
29
|
+
disabled?: boolean;
|
|
30
|
+
visible?: boolean;
|
|
31
|
+
onClick?: () => void;
|
|
32
|
+
}
|
|
33
|
+
export declare enum MainMenuItemKey {
|
|
34
|
+
IMPORT = "import",
|
|
35
|
+
EXPORT_CURRENT_SHEET_CSV = "export-current-sheet-csv",
|
|
36
|
+
EXPORT_CURRENT_SHEET_XLSX = "export-current-sheet-xlsx"
|
|
37
|
+
}
|
|
38
|
+
export interface MainMenuItem {
|
|
39
|
+
name: string;
|
|
40
|
+
menuKey?: MainMenuItemKey;
|
|
41
|
+
description?: string;
|
|
42
|
+
onClick?: () => void;
|
|
43
|
+
items?: MainMenuItem[];
|
|
44
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export var SelectionMode;
|
|
2
|
+
|
|
3
|
+
!function(SelectionMode) {
|
|
4
|
+
SelectionMode.CELL = "cell", SelectionMode.ROW = "row", SelectionMode.COLUMN = "column",
|
|
5
|
+
SelectionMode.RANGE = "range";
|
|
6
|
+
}(SelectionMode || (SelectionMode = {}));
|
|
7
|
+
|
|
8
|
+
export var MainMenuItemKey;
|
|
9
|
+
|
|
10
|
+
!function(MainMenuItemKey) {
|
|
11
|
+
MainMenuItemKey.IMPORT = "import", MainMenuItemKey.EXPORT_CURRENT_SHEET_CSV = "export-current-sheet-csv",
|
|
12
|
+
MainMenuItemKey.EXPORT_CURRENT_SHEET_XLSX = "export-current-sheet-xlsx";
|
|
13
|
+
}(MainMenuItemKey || (MainMenuItemKey = {}));
|
|
14
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ts-types/base.ts"],"names":[],"mappings":"AAmBA,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,8BAAa,CAAA;IACb,4BAAW,CAAA;IACX,kCAAiB,CAAA;IACjB,gCAAe,CAAA;AACjB,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB;AA0BD,MAAM,CAAN,IAAY,eAOX;AAPD,WAAY,eAAe;IAEzB,oCAAiB,CAAA;IAEjB,wEAAqD,CAAA;IAErD,0EAAuD,CAAA;AACzD,CAAC,EAPW,eAAe,KAAf,eAAe,QAO1B","file":"base.js","sourcesContent":["/**\n * 基础类型定义\n */\n\n/** 单元格坐标 */\nexport interface CellCoord {\n row: number;\n col: number;\n}\n\n/** 单元格范围 */\nexport interface CellRange {\n startRow: number;\n startCol: number;\n endRow: number;\n endCol: number;\n}\n\n/** 选择模式 */\nexport enum SelectionMode {\n CELL = 'cell',\n ROW = 'row',\n COLUMN = 'column',\n RANGE = 'range'\n}\n\n/** 通用样式定义 */\nexport interface IStyle {\n [key: string]: string | number | boolean | undefined;\n}\n\n/** 单元格值类型 */\nexport type CellValue = string | number | boolean | null | undefined;\n\n/** 单元格地址 */\nexport interface CellAddress extends CellCoord {\n sheetId: string;\n}\n\n/** 工具栏项配置 */\nexport interface IToolbarItem {\n id: string;\n icon?: string;\n text?: string;\n tooltip?: string;\n disabled?: boolean;\n visible?: boolean;\n onClick?: () => void;\n}\n\nexport enum MainMenuItemKey {\n /** 需要插件支持,请在plugins中配置 ExcelImportPlugin */\n IMPORT = 'import',\n /** 需要插件支持,请在plugins中配置 TableExportPlugin */\n EXPORT_CURRENT_SHEET_CSV = 'export-current-sheet-csv',\n /** 需要插件支持,请在plugins中配置 TableExportPlugin */\n EXPORT_CURRENT_SHEET_XLSX = 'export-current-sheet-xlsx'\n}\nexport interface MainMenuItem {\n /** 菜单项名称 */\n name: string;\n /** 菜单项唯一标识,如果配置了menuKey,点击菜单项时,会匹配内置逻辑(目前仅支持导入导出相关功能,且需要配置VTablePluginModules来启用) */\n menuKey?: MainMenuItemKey;\n /** 菜单项描述 */\n description?: string;\n /** 菜单项点击回调 */\n onClick?: () => void;\n /** 子菜单项 */\n items?: MainMenuItem[];\n}\n"]}
|