@superad/ui 0.1.1 → 0.1.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"option.mjs","names":[],"sources":["../../../src/Table/vtable/option.ts"],"sourcesContent":["import type { ListTableConstructorOptions } from '@visactor/vtable';\nimport type { ThemeConfig } from 'antd';\n\nimport {\n countGroupRecords,\n createGroupTitleTagLayout,\n DEFAULT_HIERARCHY_INDENT,\n getGroupByField,\n getGroupTitleLevel,\n GROUP_TITLE_CHIP_INSET,\n} from '../canvas/groupTitle';\nimport { createRowSeriesHeaderLayout, createRowSeriesLayout } from '../canvas/rowSeries';\nimport {\n resolveGroupFill,\n resolveTableCanvasPalette,\n TABLE_CHROME,\n type TableToken,\n} from '../canvas/theme';\nimport { isGroupTitleRecord, resolveOption } from '../core/cellValue';\nimport { parsePxSize } from '../core/size';\nimport type { TableI18n } from '../core/tableI18n';\nimport {\n TABLE_HEADER_HEIGHT,\n TABLE_ROW_HEIGHT,\n type TableColumnInput,\n type TableHover,\n type TableRecord,\n type TableSize,\n} from '../type';\nimport { compileColumns, withDefaultColumnMinWidths } from './columns';\nimport { isGroupTitleRow, resolveRowSeriesValue } from './seriesSelection';\nimport { getLayoutMapHierarchyIndent } from './vtableAdapter';\n\nexport interface CreateTableOptionInput {\n autoFillWidth?: boolean;\n columns?: TableColumnInput[];\n editable?: boolean;\n /** 编辑器那个独立 React root 要用的 antd 主题(见 `useTableRenderState`)。 */\n editorTheme?: ThemeConfig;\n emptyText?: string;\n frozenColCount?: number;\n groupBy?: string | string[];\n groupTitleColors?: Record<string, string | undefined>;\n headerRowHeight?: number | string;\n hover?: TableHover;\n /** 编辑器 / 空态占位读这份,独立 React root 拿不到外层 i18n。 */\n i18n?: TableI18n;\n option?: ListTableConstructorOptions;\n records?: TableRecord[];\n rowDrag?: boolean;\n rowHeight?: number | string;\n showHeader?: boolean;\n showRowIndex?: boolean;\n showRowSelection?: boolean;\n showVerticalBorder?: boolean;\n size?: TableSize;\n theme?: ListTableConstructorOptions['theme'];\n token?: TableToken;\n tree?: boolean;\n treeExpandLevel?: number;\n treeIndent?: number;\n}\n\nconst hoverOption = (hover?: TableHover): ListTableConstructorOptions['hover'] => {\n if (!hover) return undefined;\n if (hover === 'none') return { disableHover: true };\n return { highlightMode: hover };\n};\n\nconst groupTitleFieldFormat = (groupBy: string | string[], columns?: TableColumnInput[]) => {\n return (\n record: { children?: unknown[]; vtableMergeName?: unknown },\n col?: number,\n row?: number,\n table?: unknown,\n ) => {\n const level = getGroupTitleLevel(table, col ?? 0, row ?? 0);\n const field = getGroupByField(groupBy, level);\n const column = columns?.find((item) => 'field' in item && item.field === field) as\n { options?: { color?: string; label: string; value: string }[] } | undefined;\n const options = column?.options;\n const raw = record?.vtableMergeName;\n const label = options ? resolveOption(raw, options).label : raw == null ? '' : String(raw);\n const count = countGroupRecords(record);\n return count ? `${label} (${count})` : label;\n };\n};\n\n/**\n * VTable 默认会把树/分组的展开图标画进行号列。关闭行选择后行号列退回默认渲染,\n * 分组标题行会被默认样式/展开图标覆盖。这里只接管分组标题行;数据行继续交回\n * 默认渲染,保留 `dragOrder` 手柄与 `format` 序号。\n */\nconst groupTitleSeriesLayout = (\n showIndex: boolean,\n showSelection: boolean,\n): ReturnType<typeof createRowSeriesLayout> => {\n const render = createRowSeriesLayout(showIndex, showSelection);\n\n return (args) =>\n isGroupTitleRow(args.table, args.row ?? 0)\n ? render(args)\n : ({ renderDefault: true } as unknown as ReturnType<typeof render>);\n};\n\ninterface RowSeriesNumberInput {\n dragOrder?: boolean;\n groupBackground?: string;\n grouped?: boolean;\n showIndex?: boolean;\n showSelection?: boolean;\n showVerticalBorder?: boolean;\n token?: TableToken;\n}\n\nconst rowSeriesNumber = ({\n dragOrder,\n groupBackground,\n grouped,\n showIndex,\n showSelection,\n showVerticalBorder,\n token,\n}: RowSeriesNumberInput): NonNullable<ListTableConstructorOptions['rowSeriesNumber']> => ({\n customLayout: showSelection\n ? createRowSeriesLayout(Boolean(showIndex), true, Boolean(dragOrder))\n : grouped\n ? groupTitleSeriesLayout(Boolean(showIndex), Boolean(showSelection))\n : undefined,\n disableColumnResize: true,\n dragOrder: Boolean(dragOrder),\n // 没开行选择时走 VTable `format` 出序号。开了行选择则 painter 自己画数字,\n // format 必须交空串:拖拽列 `renderDefault: true` 会把 format 文字和手柄一起画出来。\n format:\n showSelection !== true\n ? (_col?: number, row?: number, table?: unknown) => {\n if (row == null) return '';\n if (showIndex !== true && dragOrder === true) return '';\n return resolveRowSeriesValue(table, row);\n }\n : dragOrder === true\n ? () => ''\n : undefined,\n headerCustomLayout: showSelection\n ? createRowSeriesHeaderLayout(Boolean(showIndex), Boolean(dragOrder))\n : undefined,\n headerStyle: {\n bgColor: token?.colorBgContainer,\n borderLineWidth: (showVerticalBorder ? [0, 1, 0, 0] : [0, 0, 0, 0]) as [\n number,\n number,\n number,\n number,\n ],\n color: token?.colorTextSecondary ?? TABLE_CHROME.textAux,\n fontSize: 13,\n fontWeight: 500,\n textAlign: 'center',\n },\n style: (args) => {\n const record = args.table.getCellOriginRecord(args.col, args.row) as\n { vtableMerge?: boolean } | undefined;\n const grouped = Boolean(record?.vtableMerge) || isGroupTitleRow(args.table, args.row);\n return {\n bgColor: grouped ? groupBackground : (token?.colorBgContainer ?? '#ffffff'),\n borderLineWidth: (showVerticalBorder ? [1, 1, 0, 0] : [1, 0, 0, 0]) as [\n number,\n number,\n number,\n number,\n ],\n color: showIndex\n ? (token?.colorText ?? TABLE_CHROME.text)\n : (token?.colorTextTertiary ?? TABLE_CHROME.textMuted),\n fontSize: 14,\n textAlign: 'center',\n };\n },\n title: showIndex ? '序号' : '',\n // 行号列只放手柄 / 序号 / 复选框,按内容收,避免在窄 demo 里占掉一整块。\n width: showSelection\n ? showIndex\n ? dragOrder\n ? 64\n : 52\n : dragOrder\n ? 52\n : 44\n : dragOrder && showIndex\n ? 48\n : 36,\n});\n\nexport const createTableOption = ({\n autoFillWidth,\n columns,\n editable,\n emptyText,\n frozenColCount,\n groupBy,\n groupTitleColors,\n headerRowHeight,\n hover,\n option,\n records,\n rowDrag,\n rowHeight,\n showHeader,\n showRowIndex,\n showRowSelection,\n showVerticalBorder,\n size = 'middle',\n theme,\n token,\n editorTheme,\n i18n,\n tree,\n treeExpandLevel,\n treeIndent,\n}: CreateTableOptionInput): ListTableConstructorOptions => {\n const density = parsePxSize(rowHeight) ?? TABLE_ROW_HEIGHT[size];\n const groupTitleBackground = theme?.groupTitleStyle?.bgColor;\n const groupBackground =\n typeof groupTitleBackground === 'string' ? groupTitleBackground : resolveGroupFill(token);\n const hasTree = Boolean(tree || columns?.some((column) => 'tree' in column && column.tree));\n const compiled =\n compileColumns(columns, {\n editable,\n groupedTree: Boolean(hasTree && (groupBy ?? option?.groupBy)),\n i18n,\n token,\n tree: hasTree,\n }) ?? withDefaultColumnMinWidths(option?.columns);\n const shouldEdit = Boolean(\n editable || columns?.some((column) => 'editable' in column && column.editable),\n );\n const grouped = groupBy ?? option?.groupBy;\n // `grouped` 还可能是 VTable 的 GroupConfig 对象;下面几处需要的是「按哪些字段分组」,\n // 拿不到字段时就不接管,交回 option 自己的 groupConfig。\n const groupedFields =\n typeof grouped === 'string' || Array.isArray(grouped)\n ? (grouped as string | string[])\n : undefined;\n\n const compiledWithGroupIndent = (() => {\n if (grouped === undefined || compiled === undefined) return compiled;\n\n const treeColumn = compiled.find((column) => (column as { tree?: boolean }).tree === true);\n const target = treeColumn || compiled[0];\n\n if (target === undefined) return compiled;\n\n const useTreePadding = treeColumn !== undefined;\n\n return compiled.map((column) => {\n if (column !== target) return column;\n\n const define = column as { style?: unknown };\n\n return {\n ...define,\n style: (args: any) => {\n const base = typeof define.style === 'function' ? define.style(args) : define.style || {};\n const record = args.table.getCellOriginRecord(args.col, args.row);\n\n if (isGroupTitleRecord(record) || useTreePadding) return base;\n\n const groupFields = Array.isArray(grouped) ? grouped.length : 1;\n // Read the live indent, not a constant: the canvas chip indents by\n // getGroupTitleIndent, which reads the same value, so a custom hierarchyIndent has\n // to move both or the chip and its cell padding drift apart.\n const indent = getLayoutMapHierarchyIndent(args.table) ?? DEFAULT_HIERARCHY_INDENT;\n\n return {\n ...base,\n padding: [0, 8, 0, GROUP_TITLE_CHIP_INSET + Math.max(0, groupFields - 1) * indent],\n };\n },\n } as never;\n });\n })();\n // 使用方自己传 `option.rowSeriesNumber` 时 VTable 同样会渲出那一列,冻结列数必须一并 +1,\n // 否则冻住的是行号列而不是第一个数据列。\n // 公开类型只收单个对象(`IRowSeriesNumber`)。运行时的 Array.isArray 分支不在这里跟随:\n // 照内部实现去猜一套公开类型没承诺的用法,正是本文件一直在清理的那类耦合。\n const callerSeriesObject = option?.rowSeriesNumber;\n const needSeries = Boolean(\n showRowIndex || rowDrag || showRowSelection || option?.rowSeriesNumber,\n );\n // `frozenColCount` 描述的是冻结多少个数据列;VTable 会把行号/拖动列也算进去,\n // 因此存在行号列时要 +1,使冻结列从内容第一列(视觉上的第二列)开始。\n const seriesColCount = needSeries ? 1 : 0;\n const resolvedFrozenColCount =\n frozenColCount != null && frozenColCount > 0\n ? frozenColCount + seriesColCount\n : (frozenColCount ?? option?.frozenColCount ?? 0);\n const seriesOption = (() => {\n if (needSeries === false) return undefined;\n\n const built = rowSeriesNumber({\n dragOrder: rowDrag,\n groupBackground,\n grouped: grouped !== undefined,\n showIndex: showRowIndex,\n showSelection: showRowSelection,\n showVerticalBorder,\n token,\n });\n // 使用方传进来的字段叠在最上面(与本文其他 `...option?.x` 的方向一致)。之前这里是三元的\n // 另一支,等于整个丢弃 —— 自定义 field / cellType / title 静默失效,而列照样渲出来,最难查。\n const merged = { ...built, ...callerSeriesObject };\n\n // 行号列的复选框(含表头那个)是我们在 canvas 上画的。使用方再传 `cellType: 'checkbox'`\n // 会让引擎按它自己的渲染器**再画一个** —— 实测同一格里同时出现引擎的 \"checkbox\" 与我们的\n // \"rect\"/\"image\"/\"text\" 两套图形。我们自己画的时候就把渲染方式收回来。\n // 注意只在 `built.headerCustomLayout` 存在时收回:`showRowSelection: false` 时\n // 行号列交回引擎,使用方要的正是原生复选框 / `dragOrder` 手柄,必须透传。\n // 开了行选择时即使同时开 `rowDrag`,painter 仍在,只是 `renderDefault: true` 让引擎画手柄。\n if (built.headerCustomLayout != null) {\n merged.cellType = undefined;\n merged.headerType = undefined;\n }\n\n return merged;\n })();\n\n return {\n ...option,\n emptyTip: {\n text: emptyText ?? (option?.emptyTip as { text?: string } | undefined)?.text ?? 'No data',\n },\n autoFillWidth: autoFillWidth ?? option?.autoFillWidth ?? true,\n columns: compiledWithGroupIndent,\n customConfig: {\n ...option?.customConfig,\n __superadPalette: resolveTableCanvasPalette(token),\n // 编辑器在独立 React root 里渲染,取不到外层主题 / i18n,只能从表实例上读回。\n __superadI18n: i18n,\n __superadTheme: editorTheme,\n createReactContainer: true,\n } as never,\n defaultHeaderRowHeight:\n parsePxSize(headerRowHeight) ?? option?.defaultHeaderRowHeight ?? TABLE_HEADER_HEIGHT,\n defaultRowHeight: parsePxSize(rowHeight) ?? option?.defaultRowHeight ?? density,\n editCellTrigger: shouldEdit\n ? (option?.editCellTrigger ?? ['click', 'doubleclick', 'keydown', 'api'])\n : option?.editCellTrigger,\n excelOptions: shouldEdit\n ? { fillHandle: false, ...option?.excelOptions }\n : option?.excelOptions,\n frozenColCount: resolvedFrozenColCount,\n // VTable 默认在冻结区超过表宽 80% 时把冻结列**全部**解冻,`frozenColCount` 于是静默\n // 变成 0 列(窄容器 + 宽列必然踩中)。改走它的另一条路径:冻到装得下为止。\n // 要用回 VTable 的行为,传 `option={{ unfreezeAllOnExceedsMaxWidth: true }}`。\n unfreezeAllOnExceedsMaxWidth: option?.unfreezeAllOnExceedsMaxWidth ?? false,\n groupBy: grouped,\n groupConfig: grouped\n ? {\n ...option?.groupConfig,\n enableTreeStickCell: true,\n groupBy: grouped,\n // VTable 只有在 `titleCheckbox` 为真时才把分组标题的合并起点放到行号列之后。\n // 只要存在行号/拖拽列,就必须抬起合并起点,否则分组标题的 tag 与展开图标\n // 会跨过行号列,覆盖分组行的样式与内容。真正的行选择复选框由行号列自定义渲染接管。\n titleCheckbox: Boolean(showRowSelection) || needSeries,\n titleCustomLayout:\n option?.groupConfig?.titleCustomLayout ||\n (groupedFields\n ? createGroupTitleTagLayout({\n colors: groupTitleColors,\n columns,\n groupBy: groupedFields,\n })\n : undefined),\n titleFieldFormat:\n option?.groupConfig?.titleFieldFormat ||\n (grouped ? () => String.fromCharCode(8203) : undefined),\n }\n : option?.groupConfig,\n groupTitleFieldFormat: groupedFields\n ? groupTitleFieldFormat(groupedFields, columns)\n : option?.groupTitleFieldFormat,\n // 恒开。**行号列的复选框依赖 VTable 的级联模式**:实测把它设成 false 之后,连\n // `stateManager.select.cellPos` 都不再更新 —— 行号列的点选整个失效。\n // 原先的表达式 `Boolean(showRowSelection && (grouped || hasTree)) || option?…` 对平铺表\n // 算出来是 undefined,靠 VTable 的 `(x ?? enableTreeCheckbox) ?? true` 兜成 true 才碰巧可用;\n // 那个「只有分组/树才级联」的条件是错的,级联与是否有层级无关。显式写出来,别让下一个人\n // 以为关掉它是安全的。\n enableCheckboxCascade: option?.enableCheckboxCascade ?? true,\n enableHeaderCheckboxCascade:\n Boolean(showRowSelection && (grouped || hasTree)) ||\n Boolean(option?.enableHeaderCheckboxCascade),\n enableTreeStickCell: Boolean(grouped) || option?.enableTreeStickCell,\n enableTreeNodeMerge: grouped ? true : option?.enableTreeNodeMerge,\n hierarchyExpandLevel: grouped\n ? (option?.hierarchyExpandLevel ?? Number.POSITIVE_INFINITY)\n : hasTree\n ? (treeExpandLevel ?? option?.hierarchyExpandLevel ?? 1)\n : option?.hierarchyExpandLevel,\n hierarchyIndent: hasTree\n ? (treeIndent ?? option?.hierarchyIndent ?? 16)\n : option?.hierarchyIndent,\n hierarchyTextStartAlignment: hasTree ? true : option?.hierarchyTextStartAlignment,\n hover: hoverOption(hover) ?? option?.hover ?? { highlightMode: 'row' },\n keyboardOptions: {\n copySelected: true,\n ...(shouldEdit\n ? { editCellOnEnter: true, pasteValueToCell: true, selectAllOnCtrlA: true }\n : undefined),\n ...option?.keyboardOptions,\n },\n records: records ?? option?.records,\n rowSeriesNumber: seriesOption,\n select: {\n blankAreaClickDeselect: true,\n headerSelectMode: 'cell',\n highlightMode: 'cell',\n ...option?.select,\n // 曾经这里对分组标题行返回 true(禁选)。代价远大于收益:VTable 的拖拽分支一旦命中\n // 禁用格就直接 return,「起点 + 拖到终点」的第二次 updateSelectPos 因此被丢弃,区间\n // 塌回起点那一行;方向键跨分组行也被吞掉。而 theme 里 `groupTitleStyle.select` 本就\n // 定义了选中配色 —— 分组行是允许选中的,只是用分组填充色画出来。\n // 要禁选请走 `option={{ select: { disableSelect } }}`,注意上面的代价同样成立。\n disableSelect: option?.select?.disableSelect,\n },\n showHeader: showHeader ?? option?.showHeader ?? true,\n theme: {\n ...option?.theme,\n ...theme,\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"option.mjs","names":[],"sources":["../../../src/Table/vtable/option.ts"],"sourcesContent":["import type { ListTableConstructorOptions } from '@visactor/vtable';\nimport type { ThemeConfig } from 'antd';\n\nimport {\n countGroupRecords,\n createGroupTitleTagLayout,\n DEFAULT_HIERARCHY_INDENT,\n getGroupByField,\n getGroupTitleLevel,\n GROUP_TITLE_CHIP_INSET,\n} from '../canvas/groupTitle';\nimport { createRowSeriesHeaderLayout, createRowSeriesLayout } from '../canvas/rowSeries';\nimport {\n resolveGroupFill,\n resolveTableCanvasPalette,\n resolveVerticalBorderLineWidth,\n TABLE_CHROME,\n type TableToken,\n} from '../canvas/theme';\nimport { isGroupTitleRecord, resolveOption } from '../core/cellValue';\nimport { parsePxSize } from '../core/size';\nimport type { TableI18n } from '../core/tableI18n';\nimport {\n TABLE_HEADER_HEIGHT,\n TABLE_ROW_HEIGHT,\n type TableColumnInput,\n type TableHover,\n type TableRecord,\n type TableSize,\n} from '../type';\nimport { compileColumns, withDefaultColumnMinWidths } from './columns';\nimport { isGroupTitleRow, resolveRowSeriesValue } from './seriesSelection';\nimport { getLayoutMapHierarchyIndent } from './vtableAdapter';\n\nexport interface CreateTableOptionInput {\n autoFillWidth?: boolean;\n columns?: TableColumnInput[];\n editable?: boolean;\n /** 编辑器那个独立 React root 要用的 antd 主题(见 `useTableRenderState`)。 */\n editorTheme?: ThemeConfig;\n emptyText?: string;\n frozenColCount?: number;\n groupBy?: string | string[];\n groupTitleColors?: Record<string, string | undefined>;\n headerRowHeight?: number | string;\n hover?: TableHover;\n /** 编辑器 / 空态占位读这份,独立 React root 拿不到外层 i18n。 */\n i18n?: TableI18n;\n option?: ListTableConstructorOptions;\n records?: TableRecord[];\n rowDrag?: boolean;\n rowHeight?: number | string;\n showHeader?: boolean;\n showRowIndex?: boolean;\n showRowSelection?: boolean;\n showVerticalBorder?: boolean;\n size?: TableSize;\n theme?: ListTableConstructorOptions['theme'];\n token?: TableToken;\n tree?: boolean;\n treeExpandLevel?: number;\n treeIndent?: number;\n}\n\nconst hoverOption = (hover?: TableHover): ListTableConstructorOptions['hover'] => {\n if (!hover) return undefined;\n if (hover === 'none') return { disableHover: true };\n return { highlightMode: hover };\n};\n\nconst groupTitleFieldFormat = (groupBy: string | string[], columns?: TableColumnInput[]) => {\n return (\n record: { children?: unknown[]; vtableMergeName?: unknown },\n col?: number,\n row?: number,\n table?: unknown,\n ) => {\n const level = getGroupTitleLevel(table, col ?? 0, row ?? 0);\n const field = getGroupByField(groupBy, level);\n const column = columns?.find((item) => 'field' in item && item.field === field) as\n { options?: { color?: string; label: string; value: string }[] } | undefined;\n const options = column?.options;\n const raw = record?.vtableMergeName;\n const label = options ? resolveOption(raw, options).label : raw == null ? '' : String(raw);\n const count = countGroupRecords(record);\n return count ? `${label} (${count})` : label;\n };\n};\n\n/**\n * VTable 默认会把树/分组的展开图标画进行号列。关闭行选择后行号列退回默认渲染,\n * 分组标题行会被默认样式/展开图标覆盖。这里只接管分组标题行;数据行继续交回\n * 默认渲染,保留 `dragOrder` 手柄与 `format` 序号。\n */\nconst groupTitleSeriesLayout = (\n showIndex: boolean,\n showSelection: boolean,\n): ReturnType<typeof createRowSeriesLayout> => {\n const render = createRowSeriesLayout(showIndex, showSelection);\n\n return (args) =>\n isGroupTitleRow(args.table, args.row ?? 0)\n ? render(args)\n : ({ renderDefault: true } as unknown as ReturnType<typeof render>);\n};\n\ninterface RowSeriesNumberInput {\n colCount?: number;\n dragOrder?: boolean;\n groupBackground?: string;\n grouped?: boolean;\n showIndex?: boolean;\n showSelection?: boolean;\n showVerticalBorder?: boolean;\n token?: TableToken;\n}\n\nconst rowSeriesWidth = ({\n dragOrder,\n showIndex,\n showSelection,\n}: Pick<RowSeriesNumberInput, 'dragOrder' | 'showIndex' | 'showSelection'>): number =>\n showSelection\n ? showIndex\n ? dragOrder\n ? 64\n : 52\n : dragOrder\n ? 52\n : 44\n : dragOrder && showIndex\n ? 48\n : 36;\n\nconst rowSeriesNumber = ({\n colCount,\n dragOrder,\n groupBackground,\n grouped,\n showIndex,\n showSelection,\n showVerticalBorder,\n token,\n}: RowSeriesNumberInput): NonNullable<ListTableConstructorOptions['rowSeriesNumber']> => {\n // 行号列只放手柄 / 序号 / 复选框,按内容收,避免在窄 demo 里占掉一整块。\n // 宽度上限不能写在这里:`IRowSeriesNumber` 没有 maxWidth,引擎 handleRowSeriesNumber\n // 也不会把它抄到列对象上。autoFillWidth 读的是 getMaxColWidth,就绪后走\n // `pinRowSeriesMaxWidth`(`setMaxColWidth`)。\n const width = rowSeriesWidth({ dragOrder, showIndex, showSelection });\n\n return {\n customLayout: showSelection\n ? createRowSeriesLayout(Boolean(showIndex), true, Boolean(dragOrder))\n : grouped\n ? groupTitleSeriesLayout(Boolean(showIndex), Boolean(showSelection))\n : undefined,\n disableColumnResize: true,\n dragOrder: Boolean(dragOrder),\n // 没开行选择时走 VTable `format` 出序号。开了行选择则 painter 自己画数字,\n // format 必须交空串:拖拽列 `renderDefault: true` 会把 format 文字和手柄一起画出来。\n format:\n showSelection !== true\n ? (_col?: number, row?: number, table?: unknown) => {\n if (row == null) return '';\n if (showIndex !== true && dragOrder === true) return '';\n return resolveRowSeriesValue(table, row);\n }\n : dragOrder === true\n ? () => ''\n : undefined,\n headerCustomLayout: showSelection\n ? createRowSeriesHeaderLayout(Boolean(showIndex), Boolean(dragOrder))\n : undefined,\n headerStyle: {\n bgColor: token?.colorBgContainer,\n borderLineWidth: resolveVerticalBorderLineWidth(\n { col: 0, table: { colCount } },\n 0,\n Boolean(showVerticalBorder),\n ),\n color: token?.colorTextSecondary ?? TABLE_CHROME.textAux,\n fontSize: 13,\n fontWeight: 500,\n textAlign: 'center',\n },\n style: (args) => {\n const record = args.table.getCellOriginRecord(args.col, args.row) as\n { vtableMerge?: boolean } | undefined;\n const grouped = Boolean(record?.vtableMerge) || isGroupTitleRow(args.table, args.row);\n return {\n bgColor: grouped ? groupBackground : (token?.colorBgContainer ?? '#ffffff'),\n borderLineWidth: resolveVerticalBorderLineWidth(\n { col: args.col ?? 0, row: args.row, table: args.table ?? { colCount } },\n 1,\n Boolean(showVerticalBorder),\n ),\n color: showIndex\n ? (token?.colorText ?? TABLE_CHROME.text)\n : (token?.colorTextTertiary ?? TABLE_CHROME.textMuted),\n fontSize: 14,\n textAlign: 'center',\n };\n },\n title: showIndex ? '序号' : '',\n width,\n };\n};\n\nexport const createTableOption = ({\n autoFillWidth,\n columns,\n editable,\n emptyText,\n frozenColCount,\n groupBy,\n groupTitleColors,\n headerRowHeight,\n hover,\n option,\n records,\n rowDrag,\n rowHeight,\n showHeader,\n showRowIndex,\n showRowSelection,\n showVerticalBorder,\n size = 'middle',\n theme,\n token,\n editorTheme,\n i18n,\n tree,\n treeExpandLevel,\n treeIndent,\n}: CreateTableOptionInput): ListTableConstructorOptions => {\n const density = parsePxSize(rowHeight) ?? TABLE_ROW_HEIGHT[size];\n const groupTitleBackground = theme?.groupTitleStyle?.bgColor;\n const groupBackground =\n typeof groupTitleBackground === 'string' ? groupTitleBackground : resolveGroupFill(token);\n const hasTree = Boolean(tree || columns?.some((column) => 'tree' in column && column.tree));\n const compiled =\n compileColumns(columns, {\n editable,\n groupedTree: Boolean(hasTree && (groupBy ?? option?.groupBy)),\n i18n,\n token,\n tree: hasTree,\n }) ?? withDefaultColumnMinWidths(option?.columns);\n const shouldEdit = Boolean(\n editable || columns?.some((column) => 'editable' in column && column.editable),\n );\n const grouped = groupBy ?? option?.groupBy;\n // `grouped` 还可能是 VTable 的 GroupConfig 对象;下面几处需要的是「按哪些字段分组」,\n // 拿不到字段时就不接管,交回 option 自己的 groupConfig。\n const groupedFields =\n typeof grouped === 'string' || Array.isArray(grouped)\n ? (grouped as string | string[])\n : undefined;\n\n const compiledWithGroupIndent = (() => {\n if (grouped === undefined || compiled === undefined) return compiled;\n\n const treeColumn = compiled.find((column) => (column as { tree?: boolean }).tree === true);\n const target = treeColumn || compiled[0];\n\n if (target === undefined) return compiled;\n\n const useTreePadding = treeColumn !== undefined;\n\n return compiled.map((column) => {\n if (column !== target) return column;\n\n const define = column as { style?: unknown };\n\n return {\n ...define,\n style: (args: any) => {\n const base = typeof define.style === 'function' ? define.style(args) : define.style || {};\n const record = args.table.getCellOriginRecord(args.col, args.row);\n\n if (isGroupTitleRecord(record) || useTreePadding) return base;\n\n const groupFields = Array.isArray(grouped) ? grouped.length : 1;\n // Read the live indent, not a constant: the canvas chip indents by\n // getGroupTitleIndent, which reads the same value, so a custom hierarchyIndent has\n // to move both or the chip and its cell padding drift apart.\n const indent = getLayoutMapHierarchyIndent(args.table) ?? DEFAULT_HIERARCHY_INDENT;\n\n return {\n ...base,\n padding: [0, 8, 0, GROUP_TITLE_CHIP_INSET + Math.max(0, groupFields - 1) * indent],\n };\n },\n } as never;\n });\n })();\n // 使用方自己传 `option.rowSeriesNumber` 时 VTable 同样会渲出那一列,冻结列数必须一并 +1,\n // 否则冻住的是行号列而不是第一个数据列。\n // 公开类型只收单个对象(`IRowSeriesNumber`)。运行时的 Array.isArray 分支不在这里跟随:\n // 照内部实现去猜一套公开类型没承诺的用法,正是本文件一直在清理的那类耦合。\n const callerSeriesObject = option?.rowSeriesNumber;\n const needSeries = Boolean(\n showRowIndex || rowDrag || showRowSelection || option?.rowSeriesNumber,\n );\n // `frozenColCount` 描述的是冻结多少个数据列;VTable 会把行号/拖动列也算进去,\n // 因此存在行号列时要 +1,使冻结列从内容第一列(视觉上的第二列)开始。\n const seriesColCount = needSeries ? 1 : 0;\n const resolvedFrozenColCount =\n frozenColCount != null && frozenColCount > 0\n ? frozenColCount + seriesColCount\n : (frozenColCount ?? option?.frozenColCount ?? 0);\n const seriesOption = (() => {\n if (needSeries === false) return undefined;\n\n const built = rowSeriesNumber({\n colCount: seriesColCount + (compiledWithGroupIndent?.length ?? 0),\n dragOrder: rowDrag,\n groupBackground,\n grouped: grouped !== undefined,\n showIndex: showRowIndex,\n showSelection: showRowSelection,\n showVerticalBorder,\n token,\n });\n // 使用方传进来的字段叠在最上面(与本文其他 `...option?.x` 的方向一致)。之前这里是三元的\n // 另一支,等于整个丢弃 —— 自定义 field / cellType / title 静默失效,而列照样渲出来,最难查。\n const merged = { ...built, ...callerSeriesObject };\n\n // 行号列的复选框(含表头那个)是我们在 canvas 上画的。使用方再传 `cellType: 'checkbox'`\n // 会让引擎按它自己的渲染器**再画一个** —— 实测同一格里同时出现引擎的 \"checkbox\" 与我们的\n // \"rect\"/\"image\"/\"text\" 两套图形。我们自己画的时候就把渲染方式收回来。\n // 注意只在 `built.headerCustomLayout` 存在时收回:`showRowSelection: false` 时\n // 行号列交回引擎,使用方要的正是原生复选框 / `dragOrder` 手柄,必须透传。\n // 开了行选择时即使同时开 `rowDrag`,painter 仍在,只是 `renderDefault: true` 让引擎画手柄。\n if (built.headerCustomLayout != null) {\n merged.cellType = undefined;\n merged.headerType = undefined;\n }\n\n return merged;\n })();\n\n return {\n ...option,\n emptyTip: {\n text: emptyText ?? (option?.emptyTip as { text?: string } | undefined)?.text ?? 'No data',\n },\n autoFillWidth: autoFillWidth ?? option?.autoFillWidth ?? true,\n columns: compiledWithGroupIndent,\n customConfig: {\n ...option?.customConfig,\n __superadPalette: resolveTableCanvasPalette(token),\n // 编辑器在独立 React root 里渲染,取不到外层主题 / i18n,只能从表实例上读回。\n __superadI18n: i18n,\n __superadTheme: editorTheme,\n createReactContainer: true,\n } as never,\n defaultHeaderRowHeight:\n parsePxSize(headerRowHeight) ?? option?.defaultHeaderRowHeight ?? TABLE_HEADER_HEIGHT,\n defaultRowHeight: parsePxSize(rowHeight) ?? option?.defaultRowHeight ?? density,\n editCellTrigger: shouldEdit\n ? (option?.editCellTrigger ?? ['click', 'doubleclick', 'keydown', 'api'])\n : option?.editCellTrigger,\n excelOptions: shouldEdit\n ? { fillHandle: false, ...option?.excelOptions }\n : option?.excelOptions,\n frozenColCount: resolvedFrozenColCount,\n // VTable 默认在冻结区超过表宽 80% 时把冻结列**全部**解冻,`frozenColCount` 于是静默\n // 变成 0 列(窄容器 + 宽列必然踩中)。改走它的另一条路径:冻到装得下为止。\n // 要用回 VTable 的行为,传 `option={{ unfreezeAllOnExceedsMaxWidth: true }}`。\n unfreezeAllOnExceedsMaxWidth: option?.unfreezeAllOnExceedsMaxWidth ?? false,\n groupBy: grouped,\n groupConfig: grouped\n ? {\n ...option?.groupConfig,\n enableTreeStickCell: true,\n groupBy: grouped,\n // VTable 只有在 `titleCheckbox` 为真时才把分组标题的合并起点放到行号列之后。\n // 只要存在行号/拖拽列,就必须抬起合并起点,否则分组标题的 tag 与展开图标\n // 会跨过行号列,覆盖分组行的样式与内容。真正的行选择复选框由行号列自定义渲染接管。\n titleCheckbox: Boolean(showRowSelection) || needSeries,\n titleCustomLayout:\n option?.groupConfig?.titleCustomLayout ||\n (groupedFields\n ? createGroupTitleTagLayout({\n colors: groupTitleColors,\n columns,\n groupBy: groupedFields,\n })\n : undefined),\n titleFieldFormat:\n option?.groupConfig?.titleFieldFormat ||\n (grouped ? () => String.fromCharCode(8203) : undefined),\n }\n : option?.groupConfig,\n groupTitleFieldFormat: groupedFields\n ? groupTitleFieldFormat(groupedFields, columns)\n : option?.groupTitleFieldFormat,\n // 恒开。**行号列的复选框依赖 VTable 的级联模式**:实测把它设成 false 之后,连\n // `stateManager.select.cellPos` 都不再更新 —— 行号列的点选整个失效。\n // 原先的表达式 `Boolean(showRowSelection && (grouped || hasTree)) || option?…` 对平铺表\n // 算出来是 undefined,靠 VTable 的 `(x ?? enableTreeCheckbox) ?? true` 兜成 true 才碰巧可用;\n // 那个「只有分组/树才级联」的条件是错的,级联与是否有层级无关。显式写出来,别让下一个人\n // 以为关掉它是安全的。\n enableCheckboxCascade: option?.enableCheckboxCascade ?? true,\n enableHeaderCheckboxCascade:\n Boolean(showRowSelection && (grouped || hasTree)) ||\n Boolean(option?.enableHeaderCheckboxCascade),\n enableTreeStickCell: Boolean(grouped) || option?.enableTreeStickCell,\n enableTreeNodeMerge: grouped ? true : option?.enableTreeNodeMerge,\n hierarchyExpandLevel: grouped\n ? (option?.hierarchyExpandLevel ?? Number.POSITIVE_INFINITY)\n : hasTree\n ? (treeExpandLevel ?? option?.hierarchyExpandLevel ?? 1)\n : option?.hierarchyExpandLevel,\n hierarchyIndent: hasTree\n ? (treeIndent ?? option?.hierarchyIndent ?? 16)\n : option?.hierarchyIndent,\n hierarchyTextStartAlignment: hasTree ? true : option?.hierarchyTextStartAlignment,\n hover: hoverOption(hover) ?? option?.hover ?? { highlightMode: 'row' },\n keyboardOptions: {\n copySelected: true,\n ...(shouldEdit\n ? { editCellOnEnter: true, pasteValueToCell: true, selectAllOnCtrlA: true }\n : undefined),\n ...option?.keyboardOptions,\n },\n records: records ?? option?.records,\n rowSeriesNumber: seriesOption,\n select: {\n blankAreaClickDeselect: true,\n headerSelectMode: 'cell',\n highlightMode: 'cell',\n ...option?.select,\n // 曾经这里对分组标题行返回 true(禁选)。代价远大于收益:VTable 的拖拽分支一旦命中\n // 禁用格就直接 return,「起点 + 拖到终点」的第二次 updateSelectPos 因此被丢弃,区间\n // 塌回起点那一行;方向键跨分组行也被吞掉。而 theme 里 `groupTitleStyle.select` 本就\n // 定义了选中配色 —— 分组行是允许选中的,只是用分组填充色画出来。\n // 要禁选请走 `option={{ select: { disableSelect } }}`,注意上面的代价同样成立。\n disableSelect: option?.select?.disableSelect,\n },\n showHeader: showHeader ?? option?.showHeader ?? true,\n theme: {\n ...option?.theme,\n ...theme,\n },\n };\n};\n"],"mappings":"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"}
@@ -90,7 +90,20 @@ const clearSelected = (table) => {
90
90
  const selectCells = (table, ranges) => {
91
91
  table?.selectCells?.(ranges);
92
92
  };
93
+ /**
94
+ * `IRowSeriesNumber` 没有 maxWidth,引擎建列时也不抄这个字段。autoFillWidth 的摊宽
95
+ * 读 `getMaxColWidth`,所以用标准 API 把序号列钉在 option 里的固定 width 上。
96
+ */
97
+ const pinRowSeriesMaxWidth = (table) => {
98
+ if (isTableReleased(table)) return;
99
+ if ((table.leftRowSeriesNumberCount ?? 0) <= 0) return;
100
+ const series = table.options?.rowSeriesNumber;
101
+ if (series == null || Array.isArray(series)) return;
102
+ const width = series.width;
103
+ if (typeof width !== "number") return;
104
+ table.setMaxColWidth(0, width);
105
+ };
93
106
  //#endregion
94
- export { clearCheckboxState, clearSelected, fireTableEvent, getAllRowsHeight, getDataSource, getEditCell, getEditingEditor, getIndexKey, getInternalProps, getLayoutMapHierarchyIndent, getLayoutMapRowSeriesField, getRecordIndexByCell, getRecordShowIndexByCell, getRecords, getRowHeight, getScenegraph, getScenegraphComponent, getStateManager, getStickyShadowRoots, getStickyTitleRows, getVisibleRowRange, isTableReleased, selectCells, setCellCheckboxStateByRecordIndex, updateCellContent, updateCellContentRange, updateNextFrame };
107
+ export { clearCheckboxState, clearSelected, fireTableEvent, getAllRowsHeight, getDataSource, getEditCell, getEditingEditor, getIndexKey, getInternalProps, getLayoutMapHierarchyIndent, getLayoutMapRowSeriesField, getRecordIndexByCell, getRecordShowIndexByCell, getRecords, getRowHeight, getScenegraph, getScenegraphComponent, getStateManager, getStickyShadowRoots, getStickyTitleRows, getVisibleRowRange, isTableReleased, pinRowSeriesMaxWidth, selectCells, setCellCheckboxStateByRecordIndex, updateCellContent, updateCellContentRange, updateNextFrame };
95
108
 
96
109
  //# sourceMappingURL=vtableAdapter.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"vtableAdapter.mjs","names":[],"sources":["../../../src/Table/vtable/vtableAdapter.ts"],"sourcesContent":["'use client';\n\nimport type { ListTable as ListTableInstance } from '@visactor/vtable';\n\nexport interface PrivateScenegraph {\n proxy?: { rowEnd?: number; rowStart?: number };\n updateCellContent?: (col: number, row: number) => void;\n updateNextFrame?: () => void;\n}\n\nexport const getScenegraph = (table: ListTableInstance): PrivateScenegraph =>\n table.scenegraph as unknown as PrivateScenegraph;\n\n/**\n * VTable 的 `release()` 会把 `scenegraph` 与 `internalProps` 一起置 null,之后再读任何\n * getter(`columnHeaderLevelCount`、`getCellValue` …)都会抛 TypeError。表实例被 react-vtable\n * 拆掉之后 `tableRef` 仍然指着它,所以持有实例的渲染路径必须先问这一句。\n */\nexport const isTableReleased = (table: unknown): boolean =>\n table == null || getScenegraph(table as ListTableInstance) == null;\n\nexport interface PrivateScenegraphComponent {\n frozenShadowLine?: { setAttribute: (key: string, value: boolean) => void };\n hideFrozenColumnShadow?: () => void;\n showFrozenColumnShadow?: () => void;\n}\n\nexport const getScenegraphComponent = (\n table: ListTableInstance,\n): PrivateScenegraphComponent | undefined =>\n (table.scenegraph as unknown as { component?: PrivateScenegraphComponent }).component;\n\nexport const updateNextFrame = (table: ListTableInstance): void => {\n getScenegraph(table).updateNextFrame?.();\n};\n\nexport const updateCellContent = (table: ListTableInstance, col: number, row: number): void => {\n getScenegraph(table).updateCellContent?.(col, row);\n};\n\nexport const updateCellContentRange = (\n table: ListTableInstance,\n startCol: number,\n startRow: number,\n endCol: number,\n endRow: number,\n): void => {\n (\n table as ListTableInstance & {\n updateCellContentRange?: (\n colStart: number,\n rowStart: number,\n colEnd: number,\n rowEnd: number,\n ) => void;\n }\n ).updateCellContentRange?.(startCol, startRow, endCol, endRow);\n};\n\nexport const getVisibleRowRange = (\n table: ListTableInstance,\n maxRows = 80,\n): { endRow: number; startRow: number } => {\n const scenegraph = getScenegraph(table);\n const headerRows = table.columnHeaderLevelCount ?? 1;\n const startRow = Math.max(headerRows, scenegraph.proxy?.rowStart ?? headerRows);\n const endRow = Math.min(\n scenegraph.proxy?.rowEnd ?? startRow + maxRows,\n startRow + maxRows,\n (table.rowCount ?? 1) - 1,\n );\n\n return { endRow, startRow };\n};\n\nexport interface PrivateLayoutMap {\n hierarchyIndent?: number;\n rowSeriesNumberColumn?: ReadonlyArray<{ field?: unknown }>;\n}\n\nexport const getLayoutMapHierarchyIndent = (table: unknown): number | undefined =>\n (table as { internalProps?: { layoutMap?: PrivateLayoutMap } } | undefined)?.internalProps\n ?.layoutMap?.hierarchyIndent;\n\n/**\n * 行号列复选框状态存在哪个字段下。**不要写死** —— VTable 把字段名解析成\n * `rowSeriesNumber.field ?? '_vtable_rowSeries_number'`(`layout/simple-header-layout.js`\n * 的 `handleRowSeriesNumber`),解析结果就在这里。使用方覆盖了 `field` 时,只有读这里才对。\n */\nexport const getLayoutMapRowSeriesField = (table: unknown): string | undefined => {\n const field = (table as { internalProps?: { layoutMap?: PrivateLayoutMap } } | undefined)\n ?.internalProps?.layoutMap?.rowSeriesNumberColumn?.[0]?.field;\n return typeof field === 'string' && field !== '' ? field : undefined;\n};\n\nexport interface PrivateStickyPlugin {\n showedTitleRows?: readonly number[];\n titleRows?: readonly number[];\n}\n\nexport interface PrivateStickyShadowRoot {\n children?: unknown[];\n forEachChildren?: (callback: (child: unknown) => unknown) => void;\n}\n\nexport interface PrivateStickyScenegraph {\n colHeaderGroup?: { border?: { shadowRoot?: PrivateStickyShadowRoot } };\n cornerHeaderGroup?: { border?: { shadowRoot?: PrivateStickyShadowRoot } };\n}\n\n/**\n * 吸顶插件挂在 `scenegraph.plugins` 里,字段名取自 VTable 1.26.x 的\n * `plugins/list-tree-stick-cell.js`(`showedTitleRows` / `titleRows`)。这是**没有类型声明**\n * 的私有结构,全部走可选链:升版后失效会静默退回 VTable 写死的 40px 行高偏移,而不是报错。\n */\nexport const getStickyTitleRows = (table: unknown): readonly number[] | undefined => {\n const plugin = (table as { listTreeStickCellPlugin?: PrivateStickyPlugin } | undefined)\n ?.listTreeStickCellPlugin;\n return plugin?.showedTitleRows ?? plugin?.titleRows;\n};\n\nexport const getStickyShadowRoots = (table: unknown): PrivateStickyShadowRoot[] => {\n const scenegraph = (table as { scenegraph?: PrivateStickyScenegraph } | undefined)?.scenegraph;\n const roots = [\n scenegraph?.colHeaderGroup?.border?.shadowRoot,\n scenegraph?.cornerHeaderGroup?.border?.shadowRoot,\n ];\n return roots.filter(Boolean) as PrivateStickyShadowRoot[];\n};\n\nexport const getRowHeight = (table: unknown, row: number): number | undefined =>\n (table as { getRowHeight?: (index: number) => number | undefined } | undefined)?.getRowHeight?.(\n row,\n );\n\n/**\n * 引擎当前实际排布出来的总行高(含表头行,不含底部那 8px 的槽)。\n *\n * 折叠 / 展开之后**只有引擎知道现在有多少行**:树节点的 `hierarchyState` 引擎会写回记录,但\n * 分组标题行(`groupBy` 生成的那些)的折叠状态只存在引擎的分组结构里,`records` 上根本没有\n * —— 所以容器高度不能在那之后按数据重算,只能问引擎。\n */\nexport const getAllRowsHeight = (table: unknown): number | undefined => {\n const height = (\n table as { getAllRowsHeight?: () => number | undefined } | undefined\n )?.getAllRowsHeight?.();\n\n return typeof height === 'number' && Number.isFinite(height) && height > 0 ? height : undefined;\n};\n\nexport interface PrivateTableInternalProps {\n bodyHelper?: {\n getHierarchyIcon?: (col: number, row: number) => unknown;\n getHierarchyIconWidth?: () => number;\n };\n enableCheckboxCascade?: boolean;\n groupBy?: string | string[];\n layoutMap?: PrivateLayoutMap;\n}\n\nexport const getInternalProps = (table: unknown): PrivateTableInternalProps | undefined =>\n (table as { internalProps?: PrivateTableInternalProps } | undefined)?.internalProps;\n\n/**\n * VTable 把当前编辑态挂在 `editorManager` 上(d.ts 里是 `ListTableProtected`)。\n * 这些字段在 1.26.x 上核对过;升版后若 `release()` 与 `doExit()` 的语义变化,这里的\n * 读取会静默返回 undefined,表现为「编辑浮层不跟随」。\n */\nexport const getEditingEditor = (table: unknown): any =>\n (table as { editorManager?: { editingEditor?: unknown } } | undefined)?.editorManager\n ?.editingEditor;\n\nexport const getEditCell = (table: unknown): { col: number; row: number } | undefined =>\n (table as { editorManager?: { editCell?: { col: number; row: number } } } | undefined)\n ?.editorManager?.editCell;\n\nexport const getStateManager = (table: unknown): any =>\n (table as { stateManager?: any } | undefined)?.stateManager;\n\nexport const getDataSource = (table: unknown): any =>\n (table as { dataSource?: any } | undefined)?.dataSource;\n\nexport const getRecords = (table: unknown): unknown[] | undefined =>\n (table as { records?: unknown[] } | undefined)?.records;\n\nexport const getRecordIndexByCell = (table: unknown, col: number, row: number): unknown =>\n (\n table as { getRecordIndexByCell?: (col: number, row: number) => unknown } | undefined\n )?.getRecordIndexByCell?.(col, row);\n\nexport const getRecordShowIndexByCell = (\n table: unknown,\n col: number,\n row: number,\n): number | undefined =>\n (\n table as { getRecordShowIndexByCell?: (col: number, row: number) => number } | undefined\n )?.getRecordShowIndexByCell?.(col, row);\n\nexport const getIndexKey = (table: unknown, showIndex: number | undefined): unknown =>\n showIndex == null ? undefined : getDataSource(table)?.getIndexKey?.(showIndex);\n\nexport const getRecordIndexPaths = (table: unknown, showIndex: number | undefined): unknown =>\n showIndex == null ? undefined : getDataSource(table)?.getRecordIndexPaths?.(showIndex);\n\nexport const setCellCheckboxStateByRecordIndex = (\n table: unknown,\n path: unknown,\n field: string,\n checked: boolean,\n): void => {\n (\n table as {\n setCellCheckboxStateByRecordIndex?: (\n recordIndex: unknown,\n field: string,\n checked: boolean,\n ) => void;\n }\n )?.setCellCheckboxStateByRecordIndex?.(path, field, checked);\n};\n\nexport const fireTableEvent = (table: unknown, event: string, payload: unknown): void => {\n (\n table as { fireListeners?: (event: string, payload: unknown) => void } | undefined\n )?.fireListeners?.(event, payload);\n};\n\nexport const clearCheckboxState = (table: unknown, field: string): void => {\n (table as { clearCheckboxState?: (field: string) => void } | undefined)?.clearCheckboxState?.(\n field,\n );\n};\n\nexport const clearSelected = (table: unknown): void => {\n (table as { clearSelected?: () => void } | undefined)?.clearSelected?.();\n};\n\nexport const selectCells = (table: unknown, ranges: unknown[]): void => {\n (table as { selectCells?: (ranges: unknown[]) => void } | undefined)?.selectCells?.(ranges);\n};\n"],"mappings":";;AAUA,MAAa,iBAAiB,UAC5B,MAAM;;;;;;AAOR,MAAa,mBAAmB,UAC9B,SAAS,QAAQ,cAAc,KAA0B,KAAK;AAQhE,MAAa,0BACX,UAEC,MAAM,WAAqE;AAE9E,MAAa,mBAAmB,UAAmC;CACjE,cAAc,KAAK,CAAC,CAAC,kBAAkB;AACzC;AAEA,MAAa,qBAAqB,OAA0B,KAAa,QAAsB;CAC7F,cAAc,KAAK,CAAC,CAAC,oBAAoB,KAAK,GAAG;AACnD;AAEA,MAAa,0BACX,OACA,UACA,UACA,QACA,WACS;CACT,MASE,yBAAyB,UAAU,UAAU,QAAQ,MAAM;AAC/D;AAEA,MAAa,sBACX,OACA,UAAU,OAC+B;CACzC,MAAM,aAAa,cAAc,KAAK;CACtC,MAAM,aAAa,MAAM,0BAA0B;CACnD,MAAM,WAAW,KAAK,IAAI,YAAY,WAAW,OAAO,YAAY,UAAU;CAO9E,OAAO;EAAE,QANM,KAAK,IAClB,WAAW,OAAO,UAAU,WAAW,SACvC,WAAW,UACV,MAAM,YAAY,KAAK,CAGZ;EAAG;CAAS;AAC5B;AAOA,MAAa,+BAA+B,UACzC,OAA4E,eACzE,WAAW;;;;;;AAOjB,MAAa,8BAA8B,UAAuC;CAChF,MAAM,QAAS,OACX,eAAe,WAAW,wBAAwB,EAAE,EAAE;CAC1D,OAAO,OAAO,UAAU,YAAY,UAAU,KAAK,QAAQ,KAAA;AAC7D;;;;;;AAsBA,MAAa,sBAAsB,UAAkD;CACnF,MAAM,SAAU,OACZ;CACJ,OAAO,QAAQ,mBAAmB,QAAQ;AAC5C;AAEA,MAAa,wBAAwB,UAA8C;CACjF,MAAM,aAAc,OAAgE;CAKpF,OAAO,CAHL,YAAY,gBAAgB,QAAQ,YACpC,YAAY,mBAAmB,QAAQ,UAE9B,CAAC,CAAC,OAAO,OAAO;AAC7B;AAEA,MAAa,gBAAgB,OAAgB,QAC1C,OAAgF,eAC/E,GACF;;;;;;;;AASF,MAAa,oBAAoB,UAAuC;CACtE,MAAM,SACJ,OACC,mBAAmB;CAEtB,OAAO,OAAO,WAAW,YAAY,OAAO,SAAS,MAAM,KAAK,SAAS,IAAI,SAAS,KAAA;AACxF;AAYA,MAAa,oBAAoB,UAC9B,OAAqE;;;;;;AAOxE,MAAa,oBAAoB,UAC9B,OAAuE,eACpE;AAEN,MAAa,eAAe,UACzB,OACG,eAAe;AAErB,MAAa,mBAAmB,UAC7B,OAA8C;AAEjD,MAAa,iBAAiB,UAC3B,OAA4C;AAE/C,MAAa,cAAc,UACxB,OAA+C;AAElD,MAAa,wBAAwB,OAAgB,KAAa,QAE9D,OACC,uBAAuB,KAAK,GAAG;AAEpC,MAAa,4BACX,OACA,KACA,QAGE,OACC,2BAA2B,KAAK,GAAG;AAExC,MAAa,eAAe,OAAgB,cAC1C,aAAa,OAAO,KAAA,IAAY,cAAc,KAAK,CAAC,EAAE,cAAc,SAAS;AAK/E,MAAa,qCACX,OACA,MACA,OACA,YACS;CACT,OAQG,oCAAoC,MAAM,OAAO,OAAO;AAC7D;AAEA,MAAa,kBAAkB,OAAgB,OAAe,YAA2B;CACvF,OAEG,gBAAgB,OAAO,OAAO;AACnC;AAEA,MAAa,sBAAsB,OAAgB,UAAwB;CACzE,OAAyE,qBACvE,KACF;AACF;AAEA,MAAa,iBAAiB,UAAyB;CACrD,OAAuD,gBAAgB;AACzE;AAEA,MAAa,eAAe,OAAgB,WAA4B;CACtE,OAAsE,cAAc,MAAM;AAC5F"}
1
+ {"version":3,"file":"vtableAdapter.mjs","names":[],"sources":["../../../src/Table/vtable/vtableAdapter.ts"],"sourcesContent":["'use client';\n\nimport type { ListTable as ListTableInstance } from '@visactor/vtable';\n\nexport interface PrivateScenegraph {\n proxy?: { rowEnd?: number; rowStart?: number };\n updateCellContent?: (col: number, row: number) => void;\n updateNextFrame?: () => void;\n}\n\nexport const getScenegraph = (table: ListTableInstance): PrivateScenegraph =>\n table.scenegraph as unknown as PrivateScenegraph;\n\n/**\n * VTable 的 `release()` 会把 `scenegraph` 与 `internalProps` 一起置 null,之后再读任何\n * getter(`columnHeaderLevelCount`、`getCellValue` …)都会抛 TypeError。表实例被 react-vtable\n * 拆掉之后 `tableRef` 仍然指着它,所以持有实例的渲染路径必须先问这一句。\n */\nexport const isTableReleased = (table: unknown): boolean =>\n table == null || getScenegraph(table as ListTableInstance) == null;\n\nexport interface PrivateScenegraphComponent {\n frozenShadowLine?: { setAttribute: (key: string, value: boolean) => void };\n hideFrozenColumnShadow?: () => void;\n showFrozenColumnShadow?: () => void;\n}\n\nexport const getScenegraphComponent = (\n table: ListTableInstance,\n): PrivateScenegraphComponent | undefined =>\n (table.scenegraph as unknown as { component?: PrivateScenegraphComponent }).component;\n\nexport const updateNextFrame = (table: ListTableInstance): void => {\n getScenegraph(table).updateNextFrame?.();\n};\n\nexport const updateCellContent = (table: ListTableInstance, col: number, row: number): void => {\n getScenegraph(table).updateCellContent?.(col, row);\n};\n\nexport const updateCellContentRange = (\n table: ListTableInstance,\n startCol: number,\n startRow: number,\n endCol: number,\n endRow: number,\n): void => {\n (\n table as ListTableInstance & {\n updateCellContentRange?: (\n colStart: number,\n rowStart: number,\n colEnd: number,\n rowEnd: number,\n ) => void;\n }\n ).updateCellContentRange?.(startCol, startRow, endCol, endRow);\n};\n\nexport const getVisibleRowRange = (\n table: ListTableInstance,\n maxRows = 80,\n): { endRow: number; startRow: number } => {\n const scenegraph = getScenegraph(table);\n const headerRows = table.columnHeaderLevelCount ?? 1;\n const startRow = Math.max(headerRows, scenegraph.proxy?.rowStart ?? headerRows);\n const endRow = Math.min(\n scenegraph.proxy?.rowEnd ?? startRow + maxRows,\n startRow + maxRows,\n (table.rowCount ?? 1) - 1,\n );\n\n return { endRow, startRow };\n};\n\nexport interface PrivateLayoutMap {\n hierarchyIndent?: number;\n rowSeriesNumberColumn?: ReadonlyArray<{ field?: unknown }>;\n}\n\nexport const getLayoutMapHierarchyIndent = (table: unknown): number | undefined =>\n (table as { internalProps?: { layoutMap?: PrivateLayoutMap } } | undefined)?.internalProps\n ?.layoutMap?.hierarchyIndent;\n\n/**\n * 行号列复选框状态存在哪个字段下。**不要写死** —— VTable 把字段名解析成\n * `rowSeriesNumber.field ?? '_vtable_rowSeries_number'`(`layout/simple-header-layout.js`\n * 的 `handleRowSeriesNumber`),解析结果就在这里。使用方覆盖了 `field` 时,只有读这里才对。\n */\nexport const getLayoutMapRowSeriesField = (table: unknown): string | undefined => {\n const field = (table as { internalProps?: { layoutMap?: PrivateLayoutMap } } | undefined)\n ?.internalProps?.layoutMap?.rowSeriesNumberColumn?.[0]?.field;\n return typeof field === 'string' && field !== '' ? field : undefined;\n};\n\nexport interface PrivateStickyPlugin {\n showedTitleRows?: readonly number[];\n titleRows?: readonly number[];\n}\n\nexport interface PrivateStickyShadowRoot {\n children?: unknown[];\n forEachChildren?: (callback: (child: unknown) => unknown) => void;\n}\n\nexport interface PrivateStickyScenegraph {\n colHeaderGroup?: { border?: { shadowRoot?: PrivateStickyShadowRoot } };\n cornerHeaderGroup?: { border?: { shadowRoot?: PrivateStickyShadowRoot } };\n}\n\n/**\n * 吸顶插件挂在 `scenegraph.plugins` 里,字段名取自 VTable 1.26.x 的\n * `plugins/list-tree-stick-cell.js`(`showedTitleRows` / `titleRows`)。这是**没有类型声明**\n * 的私有结构,全部走可选链:升版后失效会静默退回 VTable 写死的 40px 行高偏移,而不是报错。\n */\nexport const getStickyTitleRows = (table: unknown): readonly number[] | undefined => {\n const plugin = (table as { listTreeStickCellPlugin?: PrivateStickyPlugin } | undefined)\n ?.listTreeStickCellPlugin;\n return plugin?.showedTitleRows ?? plugin?.titleRows;\n};\n\nexport const getStickyShadowRoots = (table: unknown): PrivateStickyShadowRoot[] => {\n const scenegraph = (table as { scenegraph?: PrivateStickyScenegraph } | undefined)?.scenegraph;\n const roots = [\n scenegraph?.colHeaderGroup?.border?.shadowRoot,\n scenegraph?.cornerHeaderGroup?.border?.shadowRoot,\n ];\n return roots.filter(Boolean) as PrivateStickyShadowRoot[];\n};\n\nexport const getRowHeight = (table: unknown, row: number): number | undefined =>\n (table as { getRowHeight?: (index: number) => number | undefined } | undefined)?.getRowHeight?.(\n row,\n );\n\n/**\n * 引擎当前实际排布出来的总行高(含表头行,不含底部那 8px 的槽)。\n *\n * 折叠 / 展开之后**只有引擎知道现在有多少行**:树节点的 `hierarchyState` 引擎会写回记录,但\n * 分组标题行(`groupBy` 生成的那些)的折叠状态只存在引擎的分组结构里,`records` 上根本没有\n * —— 所以容器高度不能在那之后按数据重算,只能问引擎。\n */\nexport const getAllRowsHeight = (table: unknown): number | undefined => {\n const height = (\n table as { getAllRowsHeight?: () => number | undefined } | undefined\n )?.getAllRowsHeight?.();\n\n return typeof height === 'number' && Number.isFinite(height) && height > 0 ? height : undefined;\n};\n\nexport interface PrivateTableInternalProps {\n bodyHelper?: {\n getHierarchyIcon?: (col: number, row: number) => unknown;\n getHierarchyIconWidth?: () => number;\n };\n enableCheckboxCascade?: boolean;\n groupBy?: string | string[];\n layoutMap?: PrivateLayoutMap;\n}\n\nexport const getInternalProps = (table: unknown): PrivateTableInternalProps | undefined =>\n (table as { internalProps?: PrivateTableInternalProps } | undefined)?.internalProps;\n\n/**\n * VTable 把当前编辑态挂在 `editorManager` 上(d.ts 里是 `ListTableProtected`)。\n * 这些字段在 1.26.x 上核对过;升版后若 `release()` 与 `doExit()` 的语义变化,这里的\n * 读取会静默返回 undefined,表现为「编辑浮层不跟随」。\n */\nexport const getEditingEditor = (table: unknown): any =>\n (table as { editorManager?: { editingEditor?: unknown } } | undefined)?.editorManager\n ?.editingEditor;\n\nexport const getEditCell = (table: unknown): { col: number; row: number } | undefined =>\n (table as { editorManager?: { editCell?: { col: number; row: number } } } | undefined)\n ?.editorManager?.editCell;\n\nexport const getStateManager = (table: unknown): any =>\n (table as { stateManager?: any } | undefined)?.stateManager;\n\nexport const getDataSource = (table: unknown): any =>\n (table as { dataSource?: any } | undefined)?.dataSource;\n\nexport const getRecords = (table: unknown): unknown[] | undefined =>\n (table as { records?: unknown[] } | undefined)?.records;\n\nexport const getRecordIndexByCell = (table: unknown, col: number, row: number): unknown =>\n (\n table as { getRecordIndexByCell?: (col: number, row: number) => unknown } | undefined\n )?.getRecordIndexByCell?.(col, row);\n\nexport const getRecordShowIndexByCell = (\n table: unknown,\n col: number,\n row: number,\n): number | undefined =>\n (\n table as { getRecordShowIndexByCell?: (col: number, row: number) => number } | undefined\n )?.getRecordShowIndexByCell?.(col, row);\n\nexport const getIndexKey = (table: unknown, showIndex: number | undefined): unknown =>\n showIndex == null ? undefined : getDataSource(table)?.getIndexKey?.(showIndex);\n\nexport const getRecordIndexPaths = (table: unknown, showIndex: number | undefined): unknown =>\n showIndex == null ? undefined : getDataSource(table)?.getRecordIndexPaths?.(showIndex);\n\nexport const setCellCheckboxStateByRecordIndex = (\n table: unknown,\n path: unknown,\n field: string,\n checked: boolean,\n): void => {\n (\n table as {\n setCellCheckboxStateByRecordIndex?: (\n recordIndex: unknown,\n field: string,\n checked: boolean,\n ) => void;\n }\n )?.setCellCheckboxStateByRecordIndex?.(path, field, checked);\n};\n\nexport const fireTableEvent = (table: unknown, event: string, payload: unknown): void => {\n (\n table as { fireListeners?: (event: string, payload: unknown) => void } | undefined\n )?.fireListeners?.(event, payload);\n};\n\nexport const clearCheckboxState = (table: unknown, field: string): void => {\n (table as { clearCheckboxState?: (field: string) => void } | undefined)?.clearCheckboxState?.(\n field,\n );\n};\n\nexport const clearSelected = (table: unknown): void => {\n (table as { clearSelected?: () => void } | undefined)?.clearSelected?.();\n};\n\nexport const selectCells = (table: unknown, ranges: unknown[]): void => {\n (table as { selectCells?: (ranges: unknown[]) => void } | undefined)?.selectCells?.(ranges);\n};\n\n/**\n * `IRowSeriesNumber` 没有 maxWidth,引擎建列时也不抄这个字段。autoFillWidth 的摊宽\n * 读 `getMaxColWidth`,所以用标准 API 把序号列钉在 option 里的固定 width 上。\n */\nexport const pinRowSeriesMaxWidth = (table: ListTableInstance): void => {\n if (isTableReleased(table)) return;\n if ((table.leftRowSeriesNumberCount ?? 0) <= 0) return;\n const series = table.options?.rowSeriesNumber;\n if (series == null || Array.isArray(series)) return;\n const width = series.width;\n if (typeof width !== 'number') return;\n table.setMaxColWidth(0, width);\n};\n"],"mappings":"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"}
@@ -25,7 +25,9 @@ var antdOverride_default = (token) => {
25
25
  border-color: ${onPrimary} !important;
26
26
  }
27
27
 
28
- .${prefixCls}-radio-wrapper .${prefixCls}-radio-checked .${prefixCls}-radio-inner::after {
28
+ .${prefixCls}-radio-wrapper
29
+ .${prefixCls}-radio-checked
30
+ .${prefixCls}-radio-inner::after {
29
31
  background: ${onPrimary};
30
32
  }
31
33
 
@@ -36,7 +38,8 @@ var antdOverride_default = (token) => {
36
38
  max-width: 320px;
37
39
  }
38
40
 
39
- .${prefixCls}-dropdown-menu, .${prefixCls}-select-dropdown {
41
+ .${prefixCls}-dropdown-menu,
42
+ .${prefixCls}-select-dropdown {
40
43
  border-radius: ${token.borderRadius}px !important;
41
44
  box-shadow:
42
45
  0 0 15px 0 #00000008,
@@ -50,8 +53,8 @@ var antdOverride_default = (token) => {
50
53
 
51
54
  /* 图片预览的控制按钮:圆形毛玻璃 */
52
55
  .${prefixCls}-image-preview-close,
53
- .${prefixCls}-image-preview-switch-right,
54
- .${prefixCls}-image-preview-switch-left {
56
+ .${prefixCls}-image-preview-switch-right,
57
+ .${prefixCls}-image-preview-switch-left {
55
58
  display: flex;
56
59
  align-items: center;
57
60
  justify-content: center;
@@ -1 +1 @@
1
- {"version":3,"file":"antdOverride.mjs","names":[],"sources":["../../../src/ThemeProvider/GlobalStyle/antdOverride.ts"],"sourcesContent":["import { css, type Theme } from 'antd-style';\nimport { rgba } from 'polished';\n\nimport { safeReadableColor } from '@/utils/safeReadableColor';\n\n/** 对 antd 组件的覆写:只动必要的细节,尽量走 token 而不是硬编码。 */\nexport default (token: Theme) => {\n const { prefixCls } = token;\n // 主色按钮/单选上的前景色,按主色亮度取黑或白\n const onPrimary = safeReadableColor(token.colorPrimary);\n\n return css`\n /* 按钮:去掉默认投影,主色按钮前景色锁死 */\n .${prefixCls}-btn {\n box-shadow: none;\n }\n\n .${prefixCls}-btn-primary:not(:disabled) {\n &,\n &:hover,\n &:active {\n color: ${onPrimary} !important;\n }\n }\n\n /* 勾选标记同样跟随主色对比色 */\n .${prefixCls}-checkbox-inner::after {\n border-color: ${onPrimary} !important;\n }\n\n .${prefixCls}-radio-wrapper .${prefixCls}-radio-checked .${prefixCls}-radio-inner::after {\n background: ${onPrimary};\n }\n\n /* 浮层:箭头跟随抬升底色,限制提示宽度 */\n .${prefixCls}-tooltip {\n --antd-arrow-background-color: ${token.colorBgElevated};\n\n max-width: 320px;\n }\n\n .${prefixCls}-dropdown-menu, .${prefixCls}-select-dropdown {\n border-radius: ${token.borderRadius}px !important;\n box-shadow:\n 0 0 15px 0 #00000008,\n 0 2px 30px 0 #00000014,\n 0 0 0 1px ${token.isDarkMode ? token.colorFillTertiary : token.colorBorder} inset !important;\n }\n\n .${prefixCls}-modal-content {\n border: 1px solid ${token.colorBorderSecondary} !important;\n }\n\n /* 图片预览的控制按钮:圆形毛玻璃 */\n .${prefixCls}-image-preview-close,\n .${prefixCls}-image-preview-switch-right,\n .${prefixCls}-image-preview-switch-left {\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 32px;\n height: 32px;\n padding: 0;\n border-radius: ${token.borderRadiusLG}px;\n\n background: ${rgba(token.colorBgMask, 0.1)};\n\n ${token.stylish.blur};\n }\n `;\n};\n"],"mappings":";;;;;AAMA,IAAA,wBAAgB,UAAiB;CAC/B,MAAM,EAAE,cAAc;CAEtB,MAAM,YAAY,kBAAkB,MAAM,YAAY;CAEtD,OAAO,GAAG;;OAEL,UAAU;;;;OAIV,UAAU;;;;iBAIA,UAAU;;;;;OAKpB,UAAU;sBACK,UAAU;;;OAGzB,UAAU,kBAAkB,UAAU,kBAAkB,UAAU;oBACrD,UAAU;;;;OAIvB,UAAU;uCACsB,MAAM,gBAAgB;;;;;OAKtD,UAAU,mBAAmB,UAAU;uBACvB,MAAM,aAAa;;;;oBAItB,MAAM,aAAa,MAAM,oBAAoB,MAAM,YAAY;;;OAG5E,UAAU;0BACS,MAAM,qBAAqB;;;;OAI9C,UAAU;SACR,UAAU;SACV,UAAU;;;;;;;;uBAQI,MAAM,eAAe;;oBAExB,KAAK,MAAM,aAAa,EAAG,EAAE;;QAEzC,MAAM,QAAQ,KAAK;;;AAG3B"}
1
+ {"version":3,"file":"antdOverride.mjs","names":[],"sources":["../../../src/ThemeProvider/GlobalStyle/antdOverride.ts"],"sourcesContent":["import { css, type Theme } from 'antd-style';\nimport { rgba } from 'polished';\n\nimport { safeReadableColor } from '@/utils/safeReadableColor';\n\n/** 对 antd 组件的覆写:只动必要的细节,尽量走 token 而不是硬编码。 */\nexport default (token: Theme) => {\n const { prefixCls } = token;\n // 主色按钮/单选上的前景色,按主色亮度取黑或白\n const onPrimary = safeReadableColor(token.colorPrimary);\n\n return css`\n /* 按钮:去掉默认投影,主色按钮前景色锁死 */\n .${prefixCls}-btn {\n box-shadow: none;\n }\n\n .${prefixCls}-btn-primary:not(:disabled) {\n &,\n &:hover,\n &:active {\n color: ${onPrimary} !important;\n }\n }\n\n /* 勾选标记同样跟随主色对比色 */\n .${prefixCls}-checkbox-inner::after {\n border-color: ${onPrimary} !important;\n }\n\n .${prefixCls}-radio-wrapper\n .${prefixCls}-radio-checked\n .${prefixCls}-radio-inner::after {\n background: ${onPrimary};\n }\n\n /* 浮层:箭头跟随抬升底色,限制提示宽度 */\n .${prefixCls}-tooltip {\n --antd-arrow-background-color: ${token.colorBgElevated};\n\n max-width: 320px;\n }\n\n .${prefixCls}-dropdown-menu,\n .${prefixCls}-select-dropdown {\n border-radius: ${token.borderRadius}px !important;\n box-shadow:\n 0 0 15px 0 #00000008,\n 0 2px 30px 0 #00000014,\n 0 0 0 1px ${token.isDarkMode ? token.colorFillTertiary : token.colorBorder} inset !important;\n }\n\n .${prefixCls}-modal-content {\n border: 1px solid ${token.colorBorderSecondary} !important;\n }\n\n /* 图片预览的控制按钮:圆形毛玻璃 */\n .${prefixCls}-image-preview-close,\n .${prefixCls}-image-preview-switch-right,\n .${prefixCls}-image-preview-switch-left {\n display: flex;\n align-items: center;\n justify-content: center;\n\n width: 32px;\n height: 32px;\n padding: 0;\n border-radius: ${token.borderRadiusLG}px;\n\n background: ${rgba(token.colorBgMask, 0.1)};\n\n ${token.stylish.blur};\n }\n `;\n};\n"],"mappings":";;;;;AAMA,IAAA,wBAAgB,UAAiB;CAC/B,MAAM,EAAE,cAAc;CAEtB,MAAM,YAAY,kBAAkB,MAAM,YAAY;CAEtD,OAAO,GAAG;;OAEL,UAAU;;;;OAIV,UAAU;;;;iBAIA,UAAU;;;;;OAKpB,UAAU;sBACK,UAAU;;;OAGzB,UAAU;SACR,UAAU;SACV,UAAU;oBACC,UAAU;;;;OAIvB,UAAU;uCACsB,MAAM,gBAAgB;;;;;OAKtD,UAAU;OACV,UAAU;uBACM,MAAM,aAAa;;;;oBAItB,MAAM,aAAa,MAAM,oBAAoB,MAAM,YAAY;;;OAG5E,UAAU;0BACS,MAAM,qBAAqB;;;;OAI9C,UAAU;OACV,UAAU;OACV,UAAU;;;;;;;;uBAQM,MAAM,eAAe;;oBAExB,KAAK,MAAM,aAAa,EAAG,EAAE;;QAEzC,MAAM,QAAQ,KAAK;;;AAG3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/color/colors/index.ts"],"sourcesContent":["import type { ColorScaleItem } from '../types';\nimport blue from './blue';\nimport cyan from './cyan';\nimport geekblue from './geekblue';\nimport gold from './gold';\nimport gray from './gray';\nimport green from './green';\nimport lime from './lime';\nimport magenta from './magenta';\nimport orange from './orange';\nimport primary from './primary';\nimport purple from './purple';\nimport red from './red';\nimport volcano from './volcano';\nimport yellow from './yellow';\n\nexport type ColorScaleName =\n | 'blue'\n | 'cyan'\n | 'geekblue'\n | 'gold'\n | 'gray'\n | 'green'\n | 'lime'\n | 'magenta'\n | 'orange'\n | 'primary'\n | 'purple'\n | 'red'\n | 'volcano'\n | 'yellow';\n\nexport type ColorScales = Record<ColorScaleName, ColorScaleItem>;\n\nexport const colorScales: ColorScales = {\n blue,\n cyan,\n geekblue,\n gold,\n gray,\n green,\n lime,\n magenta,\n orange,\n primary,\n purple,\n red,\n volcano,\n yellow,\n};\n\nexport { colorScales as colors };\n\nexport {\n blue,\n cyan,\n geekblue,\n gold,\n gray,\n green,\n lime,\n magenta,\n orange,\n primary,\n purple,\n red,\n volcano,\n yellow,\n};\n"],"mappings":";;;;;;;;;;;;;;;AAkCA,MAAa,cAA2B;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/color/colors/index.ts"],"sourcesContent":["import type { ColorScaleItem } from '../types';\nimport blue from './blue';\nimport cyan from './cyan';\nimport geekblue from './geekblue';\nimport gold from './gold';\nimport gray from './gray';\nimport green from './green';\nimport lime from './lime';\nimport magenta from './magenta';\nimport orange from './orange';\nimport primary from './primary';\nimport purple from './purple';\nimport red from './red';\nimport volcano from './volcano';\nimport yellow from './yellow';\n\nexport type ColorScaleName =\n | 'blue'\n | 'cyan'\n | 'geekblue'\n | 'gold'\n | 'gray'\n | 'green'\n | 'lime'\n | 'magenta'\n | 'orange'\n | 'primary'\n | 'purple'\n | 'red'\n | 'volcano'\n | 'yellow';\n\nexport type ColorScales = Record<ColorScaleName, ColorScaleItem>;\n\nexport const colorScales: ColorScales = {\n blue,\n cyan,\n geekblue,\n gold,\n gray,\n green,\n lime,\n magenta,\n orange,\n primary,\n purple,\n red,\n volcano,\n yellow,\n};\n\nexport { colorScales as colors };\n\nexport { blue, cyan, geekblue, gold, gray, green, lime, magenta, orange, primary, purple, red, volcano, yellow };\n"],"mappings":";;;;;;;;;;;;;;;AAkCA,MAAa,cAA2B;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superad/ui",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "SuperAd UI 组件库,基于 antd + antd-style 的可扩展 React 组件框架",
5
5
  "keywords": [
6
6
  "superad",