refactor:table (#6267)
* refactor:table * docs:update & refactor: table type --------- Co-authored-by: tangjinzhou <415800467@qq.com>pull/6269/head^2
parent
c1ed77f67a
commit
8472c25633
|
@ -37,7 +37,8 @@ import './time-picker/style';
|
|||
import './calendar/style';
|
||||
// import './date-picker/style';
|
||||
// import './slider/style';
|
||||
import './table/style';
|
||||
// import './table/style';
|
||||
|
||||
// import './progress/style';
|
||||
// import './timeline/style';
|
||||
// import './input-number/style';
|
||||
|
|
|
@ -34,7 +34,7 @@ import scrollTo from '../_util/scrollTo';
|
|||
import defaultLocale from '../locale/en_US';
|
||||
import type { SizeType } from '../config-provider';
|
||||
import devWarning from '../vc-util/devWarning';
|
||||
import type { CSSProperties, PropType } from 'vue';
|
||||
import type { CSSProperties } from 'vue';
|
||||
import { nextTick, reactive, ref, computed, defineComponent, toRef, watchEffect, watch } from 'vue';
|
||||
import type { DefaultRecordType } from '../vc-table/interface';
|
||||
import useBreakpoint from '../_util/hooks/useBreakpoint';
|
||||
|
@ -47,6 +47,17 @@ import { useProvideSlots, useProvideTableContext } from './context';
|
|||
import type { ContextSlots } from './context';
|
||||
import useColumns from './hooks/useColumns';
|
||||
import { convertChildrenToColumns } from './util';
|
||||
import {
|
||||
stringType,
|
||||
booleanType,
|
||||
arrayType,
|
||||
someType,
|
||||
functionType,
|
||||
objectType,
|
||||
} from '../_util/type';
|
||||
|
||||
// CSSINJS
|
||||
import useStyle from './style';
|
||||
|
||||
export type { ColumnsType, TablePaginationConfig };
|
||||
|
||||
|
@ -107,128 +118,68 @@ export interface TableProps<RecordType = DefaultRecordType>
|
|||
|
||||
export const tableProps = () => {
|
||||
return {
|
||||
prefixCls: { type: String as PropType<string>, default: undefined },
|
||||
columns: { type: Array as PropType<ColumnsType>, default: undefined },
|
||||
rowKey: { type: [String, Function] as PropType<TableProps['rowKey']>, default: undefined },
|
||||
tableLayout: { type: String as PropType<TableProps['tableLayout']>, default: undefined },
|
||||
rowClassName: {
|
||||
type: [String, Function] as PropType<TableProps['rowClassName']>,
|
||||
default: undefined,
|
||||
},
|
||||
title: { type: Function as PropType<TableProps['title']>, default: undefined },
|
||||
footer: { type: Function as PropType<TableProps['footer']>, default: undefined },
|
||||
id: { type: String as PropType<TableProps['id']>, default: undefined },
|
||||
showHeader: { type: Boolean as PropType<TableProps['showHeader']>, default: undefined },
|
||||
components: { type: Object as PropType<TableProps['components']>, default: undefined },
|
||||
customRow: { type: Function as PropType<TableProps['customRow']>, default: undefined },
|
||||
customHeaderRow: {
|
||||
type: Function as PropType<TableProps['customHeaderRow']>,
|
||||
default: undefined,
|
||||
},
|
||||
direction: { type: String as PropType<TableProps['direction']>, default: undefined },
|
||||
expandFixed: {
|
||||
type: [Boolean, String] as PropType<TableProps['expandFixed']>,
|
||||
default: undefined,
|
||||
},
|
||||
expandColumnWidth: {
|
||||
type: Number as PropType<TableProps['expandColumnWidth']>,
|
||||
default: undefined,
|
||||
},
|
||||
expandedRowKeys: {
|
||||
type: Array as PropType<TableProps['expandedRowKeys']>,
|
||||
default: undefined as TableProps['expandedRowKeys'],
|
||||
},
|
||||
defaultExpandedRowKeys: {
|
||||
type: Array as PropType<TableProps['defaultExpandedRowKeys']>,
|
||||
default: undefined as TableProps['defaultExpandedRowKeys'],
|
||||
},
|
||||
expandedRowRender: {
|
||||
type: Function as PropType<TableProps['expandedRowRender']>,
|
||||
default: undefined,
|
||||
},
|
||||
expandRowByClick: {
|
||||
type: Boolean as PropType<TableProps['expandRowByClick']>,
|
||||
default: undefined,
|
||||
},
|
||||
expandIcon: { type: Function as PropType<TableProps['expandIcon']>, default: undefined },
|
||||
onExpand: { type: Function as PropType<TableProps['onExpand']>, default: undefined },
|
||||
onExpandedRowsChange: {
|
||||
type: Function as PropType<TableProps['onExpandedRowsChange']>,
|
||||
default: undefined,
|
||||
},
|
||||
'onUpdate:expandedRowKeys': {
|
||||
type: Function as PropType<TableProps['onExpandedRowsChange']>,
|
||||
default: undefined,
|
||||
},
|
||||
defaultExpandAllRows: {
|
||||
type: Boolean as PropType<TableProps['defaultExpandAllRows']>,
|
||||
default: undefined,
|
||||
},
|
||||
indentSize: { type: Number as PropType<TableProps['indentSize']>, default: undefined },
|
||||
prefixCls: stringType<string>(),
|
||||
columns: arrayType<ColumnsType>(),
|
||||
rowKey: someType<TableProps['rowKey']>([String, Function]),
|
||||
tableLayout: stringType<TableProps['tableLayout']>(),
|
||||
rowClassName: someType<TableProps['rowClassName']>([String, Function]),
|
||||
title: functionType<TableProps['title']>(),
|
||||
footer: functionType<TableProps['footer']>(),
|
||||
id: stringType<TableProps['id']>(),
|
||||
showHeader: booleanType(),
|
||||
components: objectType<TableProps['components']>(),
|
||||
customRow: functionType<TableProps['customRow']>(),
|
||||
customHeaderRow: functionType<TableProps['customHeaderRow']>(),
|
||||
direction: stringType<TableProps['direction']>(),
|
||||
expandFixed: someType<TableProps['expandFixed']>([Boolean, String]),
|
||||
expandColumnWidth: Number,
|
||||
expandedRowKeys: arrayType<TableProps['expandedRowKeys']>(),
|
||||
defaultExpandedRowKeys: arrayType<TableProps['defaultExpandedRowKeys']>(),
|
||||
expandedRowRender: functionType<TableProps['expandedRowRender']>(),
|
||||
expandRowByClick: booleanType(),
|
||||
expandIcon: functionType<TableProps['expandIcon']>(),
|
||||
onExpand: functionType<TableProps['onExpand']>(),
|
||||
onExpandedRowsChange: functionType<TableProps['onExpandedRowsChange']>(),
|
||||
'onUpdate:expandedRowKeys': functionType<TableProps['onExpandedRowsChange']>(),
|
||||
defaultExpandAllRows: booleanType(),
|
||||
indentSize: Number,
|
||||
/** @deprecated Please use `EXPAND_COLUMN` in `columns` directly */
|
||||
expandIconColumnIndex: {
|
||||
type: Number as PropType<TableProps['expandIconColumnIndex']>,
|
||||
default: undefined,
|
||||
},
|
||||
showExpandColumn: { type: Boolean, default: undefined },
|
||||
expandedRowClassName: {
|
||||
type: Function as PropType<TableProps['expandedRowClassName']>,
|
||||
default: undefined,
|
||||
},
|
||||
childrenColumnName: {
|
||||
type: String as PropType<TableProps['childrenColumnName']>,
|
||||
default: undefined,
|
||||
},
|
||||
rowExpandable: { type: Function as PropType<TableProps['rowExpandable']>, default: undefined },
|
||||
sticky: { type: [Boolean, Object] as PropType<TableProps['sticky']>, default: undefined },
|
||||
expandIconColumnIndex: Number,
|
||||
showExpandColumn: booleanType(),
|
||||
expandedRowClassName: functionType<TableProps['expandedRowClassName']>(),
|
||||
childrenColumnName: stringType<TableProps['childrenColumnName']>(),
|
||||
rowExpandable: functionType<TableProps['rowExpandable']>(),
|
||||
sticky: someType<TableProps['sticky']>([Boolean, Object]),
|
||||
|
||||
dropdownPrefixCls: String,
|
||||
dataSource: { type: Array as PropType<RcTableProps['data']>, default: undefined },
|
||||
pagination: {
|
||||
type: [Boolean, Object] as PropType<false | TablePaginationConfig>,
|
||||
default: undefined,
|
||||
},
|
||||
loading: { type: [Boolean, Object] as PropType<boolean | SpinProps>, default: undefined },
|
||||
size: { type: String as PropType<SizeType>, default: undefined },
|
||||
bordered: Boolean,
|
||||
locale: { type: Object as PropType<TableLocale>, default: undefined },
|
||||
dataSource: arrayType<RcTableProps['data']>(),
|
||||
pagination: someType<false | TablePaginationConfig>([Boolean, Object]),
|
||||
loading: someType<boolean | SpinProps>([Boolean, Object]),
|
||||
size: stringType<SizeType>(),
|
||||
bordered: booleanType(),
|
||||
locale: objectType<TableLocale>(),
|
||||
|
||||
onChange: {
|
||||
type: Function as PropType<
|
||||
onChange:
|
||||
functionType<
|
||||
(
|
||||
pagination: TablePaginationConfig,
|
||||
filters: Record<string, FilterValue | null>,
|
||||
sorter: SorterResult | SorterResult[],
|
||||
extra: TableCurrentDataSource,
|
||||
) => void
|
||||
>,
|
||||
default: undefined,
|
||||
},
|
||||
onResizeColumn: {
|
||||
type: Function as PropType<(w: number, col: ColumnType) => void>,
|
||||
default: undefined,
|
||||
},
|
||||
rowSelection: { type: Object as PropType<TableRowSelection>, default: undefined },
|
||||
getPopupContainer: { type: Function as PropType<GetPopupContainer>, default: undefined },
|
||||
scroll: {
|
||||
type: Object as PropType<
|
||||
>(),
|
||||
onResizeColumn: functionType<(w: number, col: ColumnType) => void>(),
|
||||
rowSelection: objectType<TableRowSelection>(),
|
||||
getPopupContainer: functionType<GetPopupContainer>(),
|
||||
scroll: objectType<
|
||||
RcTableProps['scroll'] & {
|
||||
scrollToFirstRowOnChange?: boolean;
|
||||
}
|
||||
>,
|
||||
default: undefined,
|
||||
},
|
||||
sortDirections: { type: Array as PropType<SortOrder[]>, default: undefined },
|
||||
showSorterTooltip: {
|
||||
type: [Boolean, Object] as PropType<boolean | TooltipProps>,
|
||||
default: true,
|
||||
},
|
||||
contextSlots: {
|
||||
type: Object as PropType<ContextSlots>,
|
||||
},
|
||||
transformCellText: {
|
||||
type: Function as PropType<TableProps['transformCellText']>,
|
||||
},
|
||||
>(),
|
||||
sortDirections: arrayType<SortOrder[]>(),
|
||||
showSorterTooltip: someType<boolean | TooltipProps>([Boolean, Object], true),
|
||||
contextSlots: objectType<ContextSlots>(),
|
||||
transformCellText: functionType<TableProps['transformCellText']>(),
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -287,6 +238,10 @@ const InteralTable = defineComponent<
|
|||
prefixCls,
|
||||
configProvider,
|
||||
} = useConfigInject('table', props);
|
||||
|
||||
// Style
|
||||
const [wrapSSR, hashId] = useStyle(prefixCls);
|
||||
|
||||
const transformCellText = computed(
|
||||
() => props.transformCellText || configProvider.transformCellText?.value,
|
||||
);
|
||||
|
@ -637,9 +592,10 @@ const InteralTable = defineComponent<
|
|||
[`${prefixCls.value}-wrapper-rtl`]: direction.value === 'rtl',
|
||||
},
|
||||
attrs.class,
|
||||
hashId.value,
|
||||
);
|
||||
const tableProps = omit(props, ['columns']);
|
||||
return (
|
||||
return wrapSSR(
|
||||
<div class={wrapperClassNames} style={attrs.style as CSSProperties}>
|
||||
<Spin spinning={false} {...spinProps}>
|
||||
{topPaginationNode}
|
||||
|
@ -677,7 +633,7 @@ const InteralTable = defineComponent<
|
|||
/>
|
||||
{bottomPaginationNode}
|
||||
</Spin>
|
||||
</div>
|
||||
</div>,
|
||||
);
|
||||
};
|
||||
},
|
||||
|
|
|
@ -1,19 +1,19 @@
|
|||
import type { PropType } from 'vue';
|
||||
import { defineComponent } from 'vue';
|
||||
import SearchOutlined from '@ant-design/icons-vue/SearchOutlined';
|
||||
import type { FilterSearchType, TableLocale } from '../../interface';
|
||||
import Input from '../../../input';
|
||||
import { stringType, someType, functionType, objectType } from '../../../_util/type';
|
||||
|
||||
export default defineComponent({
|
||||
compatConfig: { MODE: 3 },
|
||||
name: 'FilterSearch',
|
||||
inheritAttrs: false,
|
||||
props: {
|
||||
value: String,
|
||||
onChange: Function as PropType<(e: InputEvent) => void>,
|
||||
filterSearch: [Boolean, Function] as PropType<FilterSearchType>,
|
||||
tablePrefixCls: String,
|
||||
locale: { type: Object as PropType<TableLocale>, default: undefined as TableLocale },
|
||||
value: stringType(),
|
||||
onChange: functionType<(e: InputEvent) => void>(),
|
||||
filterSearch: someType<FilterSearchType>([Boolean, Function]),
|
||||
tablePrefixCls: stringType(),
|
||||
locale: objectType<TableLocale>(),
|
||||
},
|
||||
setup(props) {
|
||||
return () => {
|
||||
|
|
|
@ -3,7 +3,7 @@ category: Components
|
|||
cols: 1
|
||||
type: Data Display
|
||||
title: Table
|
||||
cover: https://gw.alipayobjects.com/zos/alicdn/f-SbcX2Lx/Table.svg
|
||||
cover: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*3yz3QqMlShYAAAAAAAAAAAAADrJ8AQ/original
|
||||
---
|
||||
|
||||
A table displays rows of data.
|
||||
|
|
|
@ -4,7 +4,7 @@ cols: 1
|
|||
type: 数据展示
|
||||
title: Table
|
||||
subtitle: 表格
|
||||
cover: https://gw.alipayobjects.com/zos/alicdn/f-SbcX2Lx/Table.svg
|
||||
cover: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*3yz3QqMlShYAAAAAAAAAAAAADrJ8AQ/original
|
||||
---
|
||||
|
||||
展示行列数据。
|
||||
|
|
|
@ -1,136 +0,0 @@
|
|||
@import './size';
|
||||
@import (reference) '../../style/themes/index';
|
||||
@table-prefix-cls: ~'@{ant-prefix}-table';
|
||||
|
||||
@table-border: @border-width-base @border-style-base @table-border-color;
|
||||
|
||||
.@{table-prefix-cls}.@{table-prefix-cls}-bordered {
|
||||
// ============================ Title =============================
|
||||
> .@{table-prefix-cls}-title {
|
||||
border: @table-border;
|
||||
border-bottom: 0;
|
||||
}
|
||||
|
||||
> .@{table-prefix-cls}-container {
|
||||
// ============================ Content ============================
|
||||
border-left: @table-border;
|
||||
|
||||
> .@{table-prefix-cls}-content,
|
||||
> .@{table-prefix-cls}-header,
|
||||
> .@{table-prefix-cls}-body,
|
||||
> .@{table-prefix-cls}-summary {
|
||||
> table {
|
||||
// ============================= Cell =============================
|
||||
> thead > tr > th,
|
||||
> tbody > tr > td,
|
||||
> tfoot > tr > th,
|
||||
> tfoot > tr > td {
|
||||
border-right: @table-border;
|
||||
}
|
||||
// ============================ Header ============================
|
||||
> thead {
|
||||
> tr:not(:last-child) > th {
|
||||
border-bottom: @border-width-base @border-style-base @table-border-color;
|
||||
}
|
||||
|
||||
> tr > th {
|
||||
&::before {
|
||||
background-color: transparent !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fixed right should provides additional border
|
||||
> thead > tr,
|
||||
> tbody > tr,
|
||||
> tfoot > tr {
|
||||
> .@{table-prefix-cls}-cell-fix-right-first::after {
|
||||
border-right: @table-border;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========================== Expandable ==========================
|
||||
> table > tbody > tr > td {
|
||||
> .@{table-prefix-cls}-expanded-row-fixed {
|
||||
margin: -@table-padding-vertical (-@table-padding-horizontal - @border-width-base);
|
||||
|
||||
&::after {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: @border-width-base;
|
||||
bottom: 0;
|
||||
border-right: @table-border;
|
||||
content: '';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
> .@{table-prefix-cls}-content,
|
||||
> .@{table-prefix-cls}-header {
|
||||
> table {
|
||||
border-top: @table-border;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.@{table-prefix-cls}-scroll-horizontal {
|
||||
> .@{table-prefix-cls}-container > .@{table-prefix-cls}-body {
|
||||
> table > tbody {
|
||||
> tr.@{table-prefix-cls}-expanded-row,
|
||||
> tr.@{table-prefix-cls}-placeholder {
|
||||
> td {
|
||||
border-right: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Size related
|
||||
&.@{table-prefix-cls}-middle {
|
||||
> .@{table-prefix-cls}-container {
|
||||
> .@{table-prefix-cls}-content,
|
||||
> .@{table-prefix-cls}-body {
|
||||
> table > tbody > tr > td {
|
||||
> .@{table-prefix-cls}-expanded-row-fixed {
|
||||
margin: -@table-padding-vertical-md (-@table-padding-horizontal-md - @border-width-base);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.@{table-prefix-cls}-small {
|
||||
> .@{table-prefix-cls}-container {
|
||||
> .@{table-prefix-cls}-content,
|
||||
> .@{table-prefix-cls}-body {
|
||||
> table > tbody > tr > td {
|
||||
> .@{table-prefix-cls}-expanded-row-fixed {
|
||||
margin: -@table-padding-vertical-sm (-@table-padding-horizontal-sm - @border-width-base);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ============================ Footer ============================
|
||||
> .@{table-prefix-cls}-footer {
|
||||
border: @table-border;
|
||||
border-top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.@{table-prefix-cls}-cell {
|
||||
// ============================ Nested ============================
|
||||
.@{table-prefix-cls}-container:first-child {
|
||||
// :first-child to avoid the case when bordered and title is set
|
||||
border-top: 0;
|
||||
}
|
||||
|
||||
// https://github.com/ant-design/ant-design/issues/35577
|
||||
&-scrollbar:not([rowspan]) {
|
||||
box-shadow: 0 @border-width-base 0 @border-width-base @table-header-bg;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,159 @@
|
|||
import type { CSSObject } from '../../_util/cssinjs';
|
||||
import type { GenerateStyle } from '../../theme/internal';
|
||||
import type { TableToken } from './index';
|
||||
|
||||
const genBorderedStyle: GenerateStyle<TableToken, CSSObject> = token => {
|
||||
const { componentCls } = token;
|
||||
const tableBorder = `${token.lineWidth}px ${token.lineType} ${token.tableBorderColor}`;
|
||||
|
||||
const getSizeBorderStyle = (
|
||||
size: 'small' | 'middle',
|
||||
paddingVertical: number,
|
||||
paddingHorizontal: number,
|
||||
) => ({
|
||||
[`&${componentCls}-${size}`]: {
|
||||
[`> ${componentCls}-container`]: {
|
||||
[`> ${componentCls}-content, > ${componentCls}-body`]: {
|
||||
'> table > tbody > tr > td': {
|
||||
[`> ${componentCls}-expanded-row-fixed`]: {
|
||||
margin: `-${paddingVertical}px -${paddingHorizontal + token.lineWidth}px`,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
[`${componentCls}-wrapper`]: {
|
||||
[`${componentCls}${componentCls}-bordered`]: {
|
||||
// ============================ Title =============================
|
||||
[`> ${componentCls}-title`]: {
|
||||
border: tableBorder,
|
||||
borderBottom: 0,
|
||||
},
|
||||
|
||||
// ============================ Content ============================
|
||||
[`> ${componentCls}-container`]: {
|
||||
borderInlineStart: tableBorder,
|
||||
|
||||
[`
|
||||
> ${componentCls}-content,
|
||||
> ${componentCls}-header,
|
||||
> ${componentCls}-body,
|
||||
> ${componentCls}-summary
|
||||
`]: {
|
||||
'> table': {
|
||||
// ============================= Cell =============================
|
||||
[`
|
||||
> thead > tr > th,
|
||||
> tbody > tr > td,
|
||||
> tfoot > tr > th,
|
||||
> tfoot > tr > td
|
||||
`]: {
|
||||
borderInlineEnd: tableBorder,
|
||||
},
|
||||
|
||||
// ============================ Header ============================
|
||||
'> thead': {
|
||||
'> tr:not(:last-child) > th': {
|
||||
borderBottom: tableBorder,
|
||||
},
|
||||
|
||||
'> tr > th::before': {
|
||||
backgroundColor: 'transparent !important',
|
||||
},
|
||||
},
|
||||
|
||||
// Fixed right should provides additional border
|
||||
[`
|
||||
> thead > tr,
|
||||
> tbody > tr,
|
||||
> tfoot > tr
|
||||
`]: {
|
||||
[`> ${componentCls}-cell-fix-right-first::after`]: {
|
||||
borderInlineEnd: tableBorder,
|
||||
},
|
||||
},
|
||||
|
||||
// ========================== Expandable ==========================
|
||||
'> tbody > tr > td': {
|
||||
[`> ${componentCls}-expanded-row-fixed`]: {
|
||||
margin: `-${token.tablePaddingVertical}px -${
|
||||
token.tablePaddingHorizontal + token.lineWidth
|
||||
}px`,
|
||||
|
||||
'&::after': {
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
insetInlineEnd: token.lineWidth,
|
||||
bottom: 0,
|
||||
borderInlineEnd: tableBorder,
|
||||
content: '""',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
[`
|
||||
> ${componentCls}-content,
|
||||
> ${componentCls}-header
|
||||
`]: {
|
||||
'> table': {
|
||||
borderTop: tableBorder,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
// ============================ Scroll ============================
|
||||
[`&${componentCls}-scroll-horizontal`]: {
|
||||
[`> ${componentCls}-container > ${componentCls}-body`]: {
|
||||
'> table > tbody': {
|
||||
[`
|
||||
> tr${componentCls}-expanded-row,
|
||||
> tr${componentCls}-placeholder
|
||||
`]: {
|
||||
'> td': {
|
||||
borderInlineEnd: 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
// ============================ Size ============================
|
||||
...getSizeBorderStyle(
|
||||
'middle',
|
||||
token.tablePaddingVerticalMiddle,
|
||||
token.tablePaddingHorizontalMiddle,
|
||||
),
|
||||
...getSizeBorderStyle(
|
||||
'small',
|
||||
token.tablePaddingVerticalSmall,
|
||||
token.tablePaddingHorizontalSmall,
|
||||
),
|
||||
|
||||
// ============================ Footer ============================
|
||||
[`> ${componentCls}-footer`]: {
|
||||
border: tableBorder,
|
||||
borderTop: 0,
|
||||
},
|
||||
},
|
||||
|
||||
// ============================ Nested ============================
|
||||
[`${componentCls}-cell`]: {
|
||||
[`${componentCls}-container:first-child`]: {
|
||||
// :first-child to avoid the case when bordered and title is set
|
||||
borderTop: 0,
|
||||
},
|
||||
// https://github.com/ant-design/ant-design/issues/35577
|
||||
'&-scrollbar:not([rowspan])': {
|
||||
boxShadow: `0 ${token.lineWidth}px 0 ${token.lineWidth}px ${token.tableHeaderBg}`,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default genBorderedStyle;
|
|
@ -0,0 +1,37 @@
|
|||
import type { CSSObject } from '../../_util/cssinjs';
|
||||
import { textEllipsis } from '../../_style';
|
||||
import type { GenerateStyle } from '../../theme/internal';
|
||||
import type { TableToken } from './index';
|
||||
|
||||
const genEllipsisStyle: GenerateStyle<TableToken, CSSObject> = token => {
|
||||
const { componentCls } = token;
|
||||
return {
|
||||
[`${componentCls}-wrapper`]: {
|
||||
[`${componentCls}-cell-ellipsis`]: {
|
||||
...textEllipsis,
|
||||
wordBreak: 'keep-all',
|
||||
|
||||
// Fixed first or last should special process
|
||||
[`
|
||||
&${componentCls}-cell-fix-left-last,
|
||||
&${componentCls}-cell-fix-right-first
|
||||
`]: {
|
||||
overflow: 'visible',
|
||||
[`${componentCls}-cell-content`]: {
|
||||
display: 'block',
|
||||
overflow: 'hidden',
|
||||
textOverflow: 'ellipsis',
|
||||
},
|
||||
},
|
||||
|
||||
[`${componentCls}-column-title`]: {
|
||||
overflow: 'hidden',
|
||||
textOverflow: 'ellipsis',
|
||||
wordBreak: 'keep-all',
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default genEllipsisStyle;
|
|
@ -0,0 +1,22 @@
|
|||
import type { CSSObject } from '../../_util/cssinjs';
|
||||
import type { GenerateStyle } from '../../theme/internal';
|
||||
import type { TableToken } from './index';
|
||||
|
||||
// ========================= Placeholder ==========================
|
||||
const genEmptyStyle: GenerateStyle<TableToken, CSSObject> = token => {
|
||||
const { componentCls } = token;
|
||||
return {
|
||||
[`${componentCls}-wrapper`]: {
|
||||
[`${componentCls}-tbody > tr${componentCls}-placeholder`]: {
|
||||
textAlign: 'center',
|
||||
color: token.colorTextDisabled,
|
||||
|
||||
'&:hover > td': {
|
||||
background: token.colorBgContainer,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default genEmptyStyle;
|
|
@ -0,0 +1,152 @@
|
|||
import type { CSSObject } from '../../_util/cssinjs';
|
||||
import type { GenerateStyle } from '../../theme/internal';
|
||||
import type { TableToken } from './index';
|
||||
import { operationUnit } from '../../_style';
|
||||
|
||||
const genExpandStyle: GenerateStyle<TableToken, CSSObject> = token => {
|
||||
const {
|
||||
componentCls,
|
||||
antCls,
|
||||
controlInteractiveSize: checkboxSize,
|
||||
motionDurationSlow,
|
||||
lineWidth,
|
||||
paddingXS,
|
||||
lineType,
|
||||
tableBorderColor,
|
||||
tableExpandIconBg,
|
||||
tableExpandColumnWidth,
|
||||
borderRadius,
|
||||
fontSize,
|
||||
fontSizeSM,
|
||||
lineHeight,
|
||||
tablePaddingVertical,
|
||||
tablePaddingHorizontal,
|
||||
tableExpandedRowBg,
|
||||
paddingXXS,
|
||||
} = token;
|
||||
const halfInnerSize = checkboxSize / 2 - lineWidth;
|
||||
// must be odd number, unless it cannot align center
|
||||
const expandIconSize = halfInnerSize * 2 + lineWidth * 3;
|
||||
const tableBorder = `${lineWidth}px ${lineType} ${tableBorderColor}`;
|
||||
const expandIconLineOffset = paddingXXS - lineWidth;
|
||||
|
||||
return {
|
||||
[`${componentCls}-wrapper`]: {
|
||||
[`${componentCls}-expand-icon-col`]: {
|
||||
width: tableExpandColumnWidth,
|
||||
},
|
||||
|
||||
[`${componentCls}-row-expand-icon-cell`]: {
|
||||
textAlign: 'center',
|
||||
|
||||
[`${componentCls}-row-expand-icon`]: {
|
||||
display: 'inline-flex',
|
||||
float: 'none',
|
||||
verticalAlign: 'sub',
|
||||
},
|
||||
},
|
||||
|
||||
[`${componentCls}-row-indent`]: {
|
||||
height: 1,
|
||||
float: 'left',
|
||||
},
|
||||
|
||||
[`${componentCls}-row-expand-icon`]: {
|
||||
...operationUnit(token),
|
||||
position: 'relative',
|
||||
float: 'left',
|
||||
boxSizing: 'border-box',
|
||||
width: expandIconSize,
|
||||
height: expandIconSize,
|
||||
padding: 0,
|
||||
color: 'inherit',
|
||||
lineHeight: `${expandIconSize}px`,
|
||||
background: tableExpandIconBg,
|
||||
border: tableBorder,
|
||||
borderRadius,
|
||||
transform: `scale(${checkboxSize / expandIconSize})`,
|
||||
transition: `all ${motionDurationSlow}`,
|
||||
userSelect: 'none',
|
||||
|
||||
[`&:focus, &:hover, &:active`]: {
|
||||
borderColor: 'currentcolor',
|
||||
},
|
||||
|
||||
[`&::before, &::after`]: {
|
||||
position: 'absolute',
|
||||
background: 'currentcolor',
|
||||
transition: `transform ${motionDurationSlow} ease-out`,
|
||||
content: '""',
|
||||
},
|
||||
|
||||
'&::before': {
|
||||
top: halfInnerSize,
|
||||
insetInlineEnd: expandIconLineOffset,
|
||||
insetInlineStart: expandIconLineOffset,
|
||||
height: lineWidth,
|
||||
},
|
||||
|
||||
'&::after': {
|
||||
top: expandIconLineOffset,
|
||||
bottom: expandIconLineOffset,
|
||||
insetInlineStart: halfInnerSize,
|
||||
width: lineWidth,
|
||||
transform: 'rotate(90deg)',
|
||||
},
|
||||
|
||||
// Motion effect
|
||||
'&-collapsed::before': {
|
||||
transform: 'rotate(-180deg)',
|
||||
},
|
||||
|
||||
'&-collapsed::after': {
|
||||
transform: 'rotate(0deg)',
|
||||
},
|
||||
|
||||
'&-spaced': {
|
||||
'&::before, &::after': {
|
||||
display: 'none',
|
||||
content: 'none',
|
||||
},
|
||||
background: 'transparent',
|
||||
border: 0,
|
||||
visibility: 'hidden',
|
||||
},
|
||||
},
|
||||
|
||||
[`${componentCls}-row-indent + ${componentCls}-row-expand-icon`]: {
|
||||
marginTop:
|
||||
(fontSize * lineHeight - lineWidth * 3) / 2 -
|
||||
Math.ceil((fontSizeSM * 1.4 - lineWidth * 3) / 2),
|
||||
marginInlineEnd: paddingXS,
|
||||
},
|
||||
|
||||
[`tr${componentCls}-expanded-row`]: {
|
||||
'&, &:hover': {
|
||||
'> td': {
|
||||
background: tableExpandedRowBg,
|
||||
},
|
||||
},
|
||||
|
||||
// https://github.com/ant-design/ant-design/issues/25573
|
||||
[`${antCls}-descriptions-view`]: {
|
||||
display: 'flex',
|
||||
|
||||
table: {
|
||||
flex: 'auto',
|
||||
width: 'auto',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
// With fixed
|
||||
[`${componentCls}-expanded-row-fixed`]: {
|
||||
position: 'relative',
|
||||
margin: `-${tablePaddingVertical}px -${tablePaddingHorizontal}px`,
|
||||
padding: `${tablePaddingVertical}px ${tablePaddingHorizontal}px`,
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default genExpandStyle;
|
|
@ -0,0 +1,172 @@
|
|||
import type { GenerateStyle } from '../../theme/internal';
|
||||
import type { TableToken } from './index';
|
||||
import { resetComponent } from '../../_style';
|
||||
|
||||
const genFilterStyle: GenerateStyle<TableToken> = token => {
|
||||
const {
|
||||
componentCls,
|
||||
antCls,
|
||||
iconCls,
|
||||
tableFilterDropdownWidth,
|
||||
tableFilterDropdownSearchWidth,
|
||||
paddingXXS,
|
||||
paddingXS,
|
||||
colorText,
|
||||
lineWidth,
|
||||
lineType,
|
||||
tableBorderColor,
|
||||
tableHeaderIconColor,
|
||||
fontSizeSM,
|
||||
tablePaddingHorizontal,
|
||||
borderRadius,
|
||||
motionDurationSlow,
|
||||
colorTextDescription,
|
||||
colorPrimary,
|
||||
tableHeaderFilterActiveBg,
|
||||
colorTextDisabled,
|
||||
tableFilterDropdownBg,
|
||||
tableFilterDropdownHeight,
|
||||
controlItemBgHover,
|
||||
controlItemBgActive,
|
||||
boxShadowSecondary,
|
||||
} = token;
|
||||
const dropdownPrefixCls = `${antCls}-dropdown`;
|
||||
const tableFilterDropdownPrefixCls = `${componentCls}-filter-dropdown`;
|
||||
const treePrefixCls = `${antCls}-tree`;
|
||||
const tableBorder = `${lineWidth}px ${lineType} ${tableBorderColor}`;
|
||||
|
||||
return [
|
||||
{
|
||||
[`${componentCls}-wrapper`]: {
|
||||
[`${componentCls}-filter-column`]: {
|
||||
display: 'flex',
|
||||
justifyContent: 'space-between',
|
||||
},
|
||||
|
||||
[`${componentCls}-filter-trigger`]: {
|
||||
position: 'relative',
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
marginBlock: -paddingXXS,
|
||||
marginInline: `${paddingXXS}px ${-tablePaddingHorizontal / 2}px`,
|
||||
padding: `0 ${paddingXXS}px`,
|
||||
color: tableHeaderIconColor,
|
||||
fontSize: fontSizeSM,
|
||||
borderRadius,
|
||||
cursor: 'pointer',
|
||||
transition: `all ${motionDurationSlow}`,
|
||||
|
||||
'&:hover': {
|
||||
color: colorTextDescription,
|
||||
background: tableHeaderFilterActiveBg,
|
||||
},
|
||||
|
||||
'&.active': {
|
||||
color: colorPrimary,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
// Dropdown
|
||||
[`${antCls}-dropdown`]: {
|
||||
[tableFilterDropdownPrefixCls]: {
|
||||
...resetComponent(token),
|
||||
|
||||
minWidth: tableFilterDropdownWidth,
|
||||
backgroundColor: tableFilterDropdownBg,
|
||||
borderRadius,
|
||||
boxShadow: boxShadowSecondary,
|
||||
|
||||
// Reset menu
|
||||
[`${dropdownPrefixCls}-menu`]: {
|
||||
// https://github.com/ant-design/ant-design/issues/4916
|
||||
// https://github.com/ant-design/ant-design/issues/19542
|
||||
maxHeight: tableFilterDropdownHeight,
|
||||
overflowX: 'hidden',
|
||||
border: 0,
|
||||
boxShadow: 'none',
|
||||
|
||||
'&:empty::after': {
|
||||
display: 'block',
|
||||
padding: `${paddingXS}px 0`,
|
||||
color: colorTextDisabled,
|
||||
fontSize: fontSizeSM,
|
||||
textAlign: 'center',
|
||||
content: '"Not Found"',
|
||||
},
|
||||
},
|
||||
|
||||
[`${tableFilterDropdownPrefixCls}-tree`]: {
|
||||
paddingBlock: `${paddingXS}px 0`,
|
||||
paddingInline: paddingXS,
|
||||
|
||||
[treePrefixCls]: {
|
||||
padding: 0,
|
||||
},
|
||||
|
||||
[`${treePrefixCls}-treenode ${treePrefixCls}-node-content-wrapper:hover`]: {
|
||||
backgroundColor: controlItemBgHover,
|
||||
},
|
||||
|
||||
[`${treePrefixCls}-treenode-checkbox-checked ${treePrefixCls}-node-content-wrapper`]: {
|
||||
'&, &:hover': {
|
||||
backgroundColor: controlItemBgActive,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
[`${tableFilterDropdownPrefixCls}-search`]: {
|
||||
padding: paddingXS,
|
||||
borderBottom: tableBorder,
|
||||
|
||||
'&-input': {
|
||||
input: {
|
||||
minWidth: tableFilterDropdownSearchWidth,
|
||||
},
|
||||
[iconCls]: {
|
||||
color: colorTextDisabled,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
[`${tableFilterDropdownPrefixCls}-checkall`]: {
|
||||
width: '100%',
|
||||
marginBottom: paddingXXS,
|
||||
marginInlineStart: paddingXXS,
|
||||
},
|
||||
|
||||
// Operation
|
||||
[`${tableFilterDropdownPrefixCls}-btns`]: {
|
||||
display: 'flex',
|
||||
justifyContent: 'space-between',
|
||||
padding: `${paddingXS - lineWidth}px ${paddingXS}px`,
|
||||
overflow: 'hidden',
|
||||
backgroundColor: 'inherit',
|
||||
borderTop: tableBorder,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
// Dropdown Menu & SubMenu
|
||||
{
|
||||
// submenu of table filter dropdown
|
||||
[`${antCls}-dropdown ${tableFilterDropdownPrefixCls}, ${tableFilterDropdownPrefixCls}-submenu`]:
|
||||
{
|
||||
// Checkbox
|
||||
[`${antCls}-checkbox-wrapper + span`]: {
|
||||
paddingInlineStart: paddingXS,
|
||||
color: colorText,
|
||||
},
|
||||
|
||||
[`> ul`]: {
|
||||
maxHeight: 'calc(100vh - 130px)',
|
||||
overflowX: 'hidden',
|
||||
overflowY: 'auto',
|
||||
},
|
||||
},
|
||||
},
|
||||
];
|
||||
};
|
||||
|
||||
export default genFilterStyle;
|
|
@ -0,0 +1,132 @@
|
|||
import type { CSSObject } from '../../_util/cssinjs';
|
||||
import type { GenerateStyle } from '../../theme/internal';
|
||||
import type { TableToken } from './index';
|
||||
|
||||
const genFixedStyle: GenerateStyle<TableToken, CSSObject> = token => {
|
||||
const {
|
||||
componentCls,
|
||||
lineWidth,
|
||||
colorSplit,
|
||||
motionDurationSlow,
|
||||
zIndexTableFixed,
|
||||
tableBg,
|
||||
zIndexTableSticky,
|
||||
} = token;
|
||||
|
||||
const shadowColor = colorSplit;
|
||||
|
||||
// Follow style is magic of shadow which should not follow token:
|
||||
return {
|
||||
[`${componentCls}-wrapper`]: {
|
||||
[`
|
||||
${componentCls}-cell-fix-left,
|
||||
${componentCls}-cell-fix-right
|
||||
`]: {
|
||||
position: 'sticky !important' as 'sticky',
|
||||
zIndex: zIndexTableFixed,
|
||||
background: tableBg,
|
||||
},
|
||||
|
||||
[`
|
||||
${componentCls}-cell-fix-left-first::after,
|
||||
${componentCls}-cell-fix-left-last::after
|
||||
`]: {
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
right: {
|
||||
_skip_check_: true,
|
||||
value: 0,
|
||||
},
|
||||
bottom: -lineWidth,
|
||||
width: 30,
|
||||
transform: 'translateX(100%)',
|
||||
transition: `box-shadow ${motionDurationSlow}`,
|
||||
content: '""',
|
||||
pointerEvents: 'none',
|
||||
},
|
||||
|
||||
[`${componentCls}-cell-fix-left-all::after`]: {
|
||||
display: 'none',
|
||||
},
|
||||
|
||||
[`
|
||||
${componentCls}-cell-fix-right-first::after,
|
||||
${componentCls}-cell-fix-right-last::after
|
||||
`]: {
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
bottom: -lineWidth,
|
||||
left: {
|
||||
_skip_check_: true,
|
||||
value: 0,
|
||||
},
|
||||
width: 30,
|
||||
transform: 'translateX(-100%)',
|
||||
transition: `box-shadow ${motionDurationSlow}`,
|
||||
content: '""',
|
||||
pointerEvents: 'none',
|
||||
},
|
||||
|
||||
[`${componentCls}-container`]: {
|
||||
'&::before, &::after': {
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
bottom: 0,
|
||||
zIndex: zIndexTableSticky + 1,
|
||||
width: 30,
|
||||
transition: `box-shadow ${motionDurationSlow}`,
|
||||
content: '""',
|
||||
pointerEvents: 'none',
|
||||
},
|
||||
|
||||
'&::before': {
|
||||
insetInlineStart: 0,
|
||||
},
|
||||
|
||||
'&::after': {
|
||||
insetInlineEnd: 0,
|
||||
},
|
||||
},
|
||||
|
||||
[`${componentCls}-ping-left`]: {
|
||||
[`&:not(${componentCls}-has-fix-left) ${componentCls}-container`]: {
|
||||
position: 'relative',
|
||||
|
||||
'&::before': {
|
||||
boxShadow: `inset 10px 0 8px -8px ${shadowColor}`,
|
||||
},
|
||||
},
|
||||
|
||||
[`
|
||||
${componentCls}-cell-fix-left-first::after,
|
||||
${componentCls}-cell-fix-left-last::after
|
||||
`]: {
|
||||
boxShadow: `inset 10px 0 8px -8px ${shadowColor}`,
|
||||
},
|
||||
|
||||
[`${componentCls}-cell-fix-left-last::before`]: {
|
||||
backgroundColor: 'transparent !important',
|
||||
},
|
||||
},
|
||||
|
||||
[`${componentCls}-ping-right`]: {
|
||||
[`&:not(${componentCls}-has-fix-right) ${componentCls}-container`]: {
|
||||
position: 'relative',
|
||||
|
||||
'&::after': {
|
||||
boxShadow: `inset -10px 0 8px -8px ${shadowColor}`,
|
||||
},
|
||||
},
|
||||
|
||||
[`
|
||||
${componentCls}-cell-fix-right-first::after,
|
||||
${componentCls}-cell-fix-right-last::after
|
||||
`]: {
|
||||
boxShadow: `inset -10px 0 8px -8px ${shadowColor}`,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default genFixedStyle;
|
|
@ -1,754 +0,0 @@
|
|||
@import '../../style/themes/index';
|
||||
@import '../../style/mixins/index';
|
||||
@import './size';
|
||||
@import './bordered';
|
||||
|
||||
@table-prefix-cls: ~'@{ant-prefix}-table';
|
||||
@tree-prefix-cls: ~'@{ant-prefix}-tree';
|
||||
@dropdown-prefix-cls: ~'@{ant-prefix}-dropdown';
|
||||
@descriptions-prefix-cls: ~'@{ant-prefix}-descriptions';
|
||||
@table-header-icon-color: #bfbfbf;
|
||||
@table-header-icon-color-hover: darken(@table-header-icon-color, 10%);
|
||||
@table-sticky-zindex: calc(@zindex-table-fixed + 1);
|
||||
@table-sticky-scroll-bar-active-bg: fade(@table-sticky-scroll-bar-bg, 80%);
|
||||
@table-filter-dropdown-max-height: 264px;
|
||||
|
||||
.@{table-prefix-cls}-wrapper {
|
||||
clear: both;
|
||||
max-width: 100%;
|
||||
.clearfix();
|
||||
}
|
||||
|
||||
.@{table-prefix-cls} {
|
||||
.reset-component();
|
||||
position: relative;
|
||||
font-size: @table-font-size;
|
||||
background: @table-bg;
|
||||
border-radius: @table-border-radius-base;
|
||||
|
||||
// https://github.com/ant-design/ant-design/issues/17611
|
||||
table {
|
||||
width: 100%;
|
||||
text-align: left;
|
||||
border-radius: @table-border-radius-base @table-border-radius-base 0 0;
|
||||
border-collapse: separate;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
// ============================= Cell =============================
|
||||
&-thead > tr > th,
|
||||
&-tbody > tr > td,
|
||||
tfoot > tr > th,
|
||||
tfoot > tr > td {
|
||||
position: relative;
|
||||
padding: @table-padding-vertical @table-padding-horizontal;
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
&-cell-ellipsis {
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
word-break: keep-all;
|
||||
|
||||
// Fixed first or last should special process
|
||||
&.@{table-prefix-cls}-cell-fix-left-last,
|
||||
&.@{table-prefix-cls}-cell-fix-right-first {
|
||||
overflow: visible;
|
||||
|
||||
.@{table-prefix-cls}-cell-content {
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
}
|
||||
|
||||
.@{table-prefix-cls}-column-title {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
word-break: keep-all;
|
||||
}
|
||||
}
|
||||
|
||||
// ============================ Title =============================
|
||||
&-title {
|
||||
padding: @table-padding-vertical @table-padding-horizontal;
|
||||
}
|
||||
|
||||
// ============================ Footer ============================
|
||||
&-footer {
|
||||
padding: @table-padding-vertical @table-padding-horizontal;
|
||||
color: @table-footer-color;
|
||||
background: @table-footer-bg;
|
||||
}
|
||||
|
||||
// ============================ Header ============================
|
||||
&-thead {
|
||||
> tr {
|
||||
> th {
|
||||
position: relative;
|
||||
color: @table-header-color;
|
||||
font-weight: 500;
|
||||
text-align: left;
|
||||
background: @table-header-bg;
|
||||
border-bottom: @border-width-base @border-style-base @table-border-color;
|
||||
transition: background 0.3s ease;
|
||||
|
||||
&[colspan]:not([colspan='1']) {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
&:not(:last-child):not(.@{table-prefix-cls}-selection-column):not(.@{table-prefix-cls}-row-expand-icon-cell):not([colspan])::before {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
right: 0;
|
||||
width: 1px;
|
||||
height: 1.6em;
|
||||
background-color: @table-header-cell-split-color;
|
||||
transform: translateY(-50%);
|
||||
transition: background-color 0.3s;
|
||||
content: '';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
> tr:not(:last-child) > th {
|
||||
&[colspan] {
|
||||
border-bottom: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ============================= Body =============================
|
||||
&-tbody {
|
||||
> tr {
|
||||
> td {
|
||||
border-bottom: @border-width-base @border-style-base @table-border-color;
|
||||
transition: background 0.3s;
|
||||
|
||||
// ========================= Nest Table ===========================
|
||||
> .@{table-prefix-cls}-wrapper:only-child,
|
||||
> .@{table-prefix-cls}-expanded-row-fixed > .@{table-prefix-cls}-wrapper:only-child {
|
||||
.@{table-prefix-cls} {
|
||||
margin: -@table-padding-vertical -@table-padding-horizontal -@table-padding-vertical (@table-padding-horizontal +
|
||||
ceil(@font-size-sm * 1.4));
|
||||
|
||||
&-tbody > tr:last-child > td {
|
||||
border-bottom: 0;
|
||||
|
||||
&:first-child,
|
||||
&:last-child {
|
||||
border-radius: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.@{table-prefix-cls}-row:hover > td,
|
||||
> td.@{table-prefix-cls}-cell-row-hover {
|
||||
background: @table-row-hover-bg;
|
||||
}
|
||||
|
||||
&.@{table-prefix-cls}-row-selected {
|
||||
> td {
|
||||
background: @table-selected-row-bg;
|
||||
border-color: rgba(0, 0, 0, 0.03);
|
||||
}
|
||||
|
||||
&:hover {
|
||||
> td {
|
||||
background: @table-selected-row-hover-bg;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// =========================== Summary ============================
|
||||
&-summary {
|
||||
position: relative;
|
||||
z-index: @zindex-table-fixed;
|
||||
background: @table-bg;
|
||||
|
||||
div& {
|
||||
box-shadow: 0 -@border-width-base 0 @table-border-color;
|
||||
}
|
||||
|
||||
> tr {
|
||||
> th,
|
||||
> td {
|
||||
border-bottom: @border-width-base @border-style-base @table-border-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========================== Pagination ==========================
|
||||
&-pagination.@{ant-prefix}-pagination {
|
||||
margin: 16px 0;
|
||||
}
|
||||
|
||||
&-pagination {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
row-gap: @padding-xs;
|
||||
|
||||
> * {
|
||||
flex: none;
|
||||
}
|
||||
|
||||
&-left {
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
&-center {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
&-right {
|
||||
justify-content: flex-end;
|
||||
}
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// = Function =
|
||||
// ================================================================
|
||||
|
||||
// ============================ Sorter ============================
|
||||
&-thead th.@{table-prefix-cls}-column-has-sorters {
|
||||
outline: none;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
|
||||
&:hover {
|
||||
background: @table-header-sort-active-bg;
|
||||
|
||||
&::before {
|
||||
background-color: transparent !important;
|
||||
}
|
||||
}
|
||||
|
||||
&:focus-visible {
|
||||
color: @primary-color;
|
||||
}
|
||||
|
||||
// https://github.com/ant-design/ant-design/issues/30969
|
||||
&.@{table-prefix-cls}-cell-fix-left:hover,
|
||||
&.@{table-prefix-cls}-cell-fix-right:hover {
|
||||
background: @table-fixed-header-sort-active-bg;
|
||||
}
|
||||
}
|
||||
|
||||
&-thead th.@{table-prefix-cls}-column-sort {
|
||||
background: @table-header-sort-bg;
|
||||
|
||||
&::before {
|
||||
background-color: transparent !important;
|
||||
}
|
||||
}
|
||||
|
||||
td&-column-sort {
|
||||
background: @table-body-sort-bg;
|
||||
}
|
||||
|
||||
&-column-title {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
&-column-sorters {
|
||||
display: flex;
|
||||
flex: auto;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
|
||||
&::after {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
content: '';
|
||||
}
|
||||
}
|
||||
|
||||
&-column-sorter {
|
||||
margin-left: 4px;
|
||||
color: @table-header-icon-color;
|
||||
font-size: 0;
|
||||
transition: color 0.3s;
|
||||
|
||||
&-inner {
|
||||
display: inline-flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
&-up,
|
||||
&-down {
|
||||
font-size: 11px;
|
||||
|
||||
&.active {
|
||||
color: @primary-color;
|
||||
}
|
||||
}
|
||||
|
||||
&-up + &-down {
|
||||
margin-top: -0.3em;
|
||||
}
|
||||
}
|
||||
|
||||
&-column-sorters:hover &-column-sorter {
|
||||
color: darken(@table-header-icon-color, 10%);
|
||||
}
|
||||
|
||||
// ============================ Filter ============================
|
||||
&-filter-column {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
&-filter-trigger {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin: -4px (-@table-padding-horizontal / 2) -4px 4px;
|
||||
padding: 0 4px;
|
||||
color: @table-header-icon-color;
|
||||
font-size: @font-size-sm;
|
||||
border-radius: @border-radius-base;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
|
||||
&:hover {
|
||||
color: @text-color-secondary;
|
||||
background: @table-header-filter-active-bg;
|
||||
}
|
||||
|
||||
&.active {
|
||||
color: @primary-color;
|
||||
}
|
||||
}
|
||||
|
||||
// Dropdown
|
||||
&-filter-dropdown {
|
||||
.reset-component();
|
||||
|
||||
min-width: 120px;
|
||||
background-color: @table-filter-dropdown-bg;
|
||||
border-radius: @border-radius-base;
|
||||
box-shadow: @box-shadow-base;
|
||||
|
||||
// Reset menu
|
||||
.@{dropdown-prefix-cls}-menu {
|
||||
// https://github.com/ant-design/ant-design/issues/4916
|
||||
// https://github.com/ant-design/ant-design/issues/19542
|
||||
max-height: @table-filter-dropdown-max-height;
|
||||
overflow-x: hidden;
|
||||
border: 0;
|
||||
box-shadow: none;
|
||||
|
||||
&:empty::after {
|
||||
display: block;
|
||||
padding: 8px 0;
|
||||
color: @disabled-color;
|
||||
font-size: @font-size-sm;
|
||||
text-align: center;
|
||||
content: 'Not Found';
|
||||
}
|
||||
}
|
||||
|
||||
&-tree {
|
||||
padding: 8px 8px 0;
|
||||
|
||||
.@{tree-prefix-cls}-treenode .@{tree-prefix-cls}-node-content-wrapper:hover {
|
||||
background-color: @tree-node-hover-bg;
|
||||
}
|
||||
|
||||
.@{tree-prefix-cls}-treenode-checkbox-checked .@{tree-prefix-cls}-node-content-wrapper {
|
||||
&,
|
||||
&:hover {
|
||||
background-color: @tree-node-selected-bg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-search {
|
||||
padding: 8px;
|
||||
border-bottom: @border-width-base @border-color-split @border-style-base;
|
||||
|
||||
&-input {
|
||||
input {
|
||||
min-width: 140px;
|
||||
}
|
||||
.@{iconfont-css-prefix} {
|
||||
color: @disabled-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-checkall {
|
||||
width: 100%;
|
||||
margin-bottom: 4px;
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
&-submenu > ul {
|
||||
max-height: calc(100vh - 130px);
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
// Checkbox
|
||||
&,
|
||||
&-submenu {
|
||||
.@{ant-prefix}-checkbox-wrapper + span {
|
||||
padding-left: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
// Operation
|
||||
&-btns {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 7px 8px;
|
||||
overflow: hidden;
|
||||
background-color: @table-filter-btns-bg;
|
||||
border-top: @border-width-base @border-style-base @table-border-color;
|
||||
}
|
||||
}
|
||||
|
||||
// ========================== Selections ==========================
|
||||
&-selection-col {
|
||||
width: @table-selection-column-width;
|
||||
}
|
||||
|
||||
&-bordered &-selection-col {
|
||||
width: @table-selection-column-width + 18px;
|
||||
}
|
||||
|
||||
table tr th&-selection-column,
|
||||
table tr td&-selection-column {
|
||||
padding-right: @padding-xs;
|
||||
padding-left: @padding-xs;
|
||||
text-align: center;
|
||||
|
||||
.@{ant-prefix}-radio-wrapper {
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
table tr th&-selection-column&-cell-fix-left {
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
table tr th&-selection-column::after {
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
&-selection {
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
flex-direction: column;
|
||||
|
||||
&-extra {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
margin-inline-start: 100%;
|
||||
padding-inline-start: (@table-padding-horizontal / 4);
|
||||
|
||||
.@{iconfont-css-prefix} {
|
||||
color: @table-header-icon-color;
|
||||
font-size: 10px;
|
||||
|
||||
&:hover {
|
||||
color: @table-header-icon-color-hover;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========================== Expandable ==========================
|
||||
&-expand-icon-col {
|
||||
width: 48px;
|
||||
}
|
||||
|
||||
&-row-expand-icon-cell {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
&-row-indent {
|
||||
float: left;
|
||||
height: 1px;
|
||||
}
|
||||
|
||||
&-row-expand-icon {
|
||||
.operation-unit();
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
float: left;
|
||||
box-sizing: border-box;
|
||||
width: @expand-icon-size;
|
||||
height: @expand-icon-size;
|
||||
padding: 0;
|
||||
color: inherit;
|
||||
line-height: ceil(((@font-size-sm * 1.4 - @border-width-base * 3) / 2)) * 2 + @border-width-base *
|
||||
3;
|
||||
background: @table-expand-icon-bg;
|
||||
border: @border-width-base @border-style-base @table-border-color;
|
||||
border-radius: @border-radius-base;
|
||||
outline: none;
|
||||
transform: scale((unit(@checkbox-size) / unit(@expand-icon-size)));
|
||||
transition: all 0.3s;
|
||||
user-select: none;
|
||||
@expand-icon-size: ceil(((@font-size-sm * 1.4 - @border-width-base * 3) / 2)) * 2 +
|
||||
@border-width-base * 3;
|
||||
|
||||
&:focus,
|
||||
&:hover,
|
||||
&:active {
|
||||
border-color: currentcolor;
|
||||
}
|
||||
|
||||
&::before,
|
||||
&::after {
|
||||
position: absolute;
|
||||
background: currentcolor;
|
||||
transition: transform 0.3s ease-out;
|
||||
content: '';
|
||||
}
|
||||
|
||||
&::before {
|
||||
top: ceil(((@font-size-sm * 1.4 - @border-width-base * 3) / 2));
|
||||
right: 3px;
|
||||
left: 3px;
|
||||
height: @border-width-base;
|
||||
}
|
||||
|
||||
&::after {
|
||||
top: 3px;
|
||||
bottom: 3px;
|
||||
left: ceil(((@font-size-sm * 1.4 - @border-width-base * 3) / 2));
|
||||
width: @border-width-base;
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
|
||||
// Motion effect
|
||||
&-collapsed::before {
|
||||
transform: rotate(-180deg);
|
||||
}
|
||||
|
||||
&-collapsed::after {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
&-spaced {
|
||||
&::before,
|
||||
&::after {
|
||||
display: none;
|
||||
content: none;
|
||||
}
|
||||
background: transparent;
|
||||
border: 0;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.@{table-prefix-cls}-row-indent + & {
|
||||
margin-top: ((@font-size-base * @line-height-base - @border-width-base * 3) / 2) -
|
||||
ceil(((@font-size-sm * 1.4 - @border-width-base * 3) / 2));
|
||||
margin-right: @padding-xs;
|
||||
}
|
||||
}
|
||||
|
||||
tr&-expanded-row {
|
||||
&,
|
||||
&:hover {
|
||||
> td {
|
||||
background: @table-expanded-row-bg;
|
||||
}
|
||||
}
|
||||
|
||||
// https://github.com/ant-design/ant-design/issues/25573
|
||||
.@{descriptions-prefix-cls}-view {
|
||||
display: flex;
|
||||
|
||||
table {
|
||||
flex: auto;
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// With fixed
|
||||
.@{table-prefix-cls}-expanded-row-fixed {
|
||||
position: relative;
|
||||
margin: -@table-padding-vertical -@table-padding-horizontal;
|
||||
padding: @table-padding-vertical @table-padding-horizontal;
|
||||
}
|
||||
|
||||
// ========================= Placeholder ==========================
|
||||
&-tbody > tr&-placeholder {
|
||||
text-align: center;
|
||||
.@{table-prefix-cls}-empty & {
|
||||
color: @disabled-color;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
> td {
|
||||
background: @component-background;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ============================ Fixed =============================
|
||||
&-cell-fix-left,
|
||||
&-cell-fix-right {
|
||||
position: sticky !important;
|
||||
z-index: @zindex-table-fixed;
|
||||
background: @table-bg;
|
||||
}
|
||||
|
||||
&-cell-fix-left-first::after,
|
||||
&-cell-fix-left-last::after {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: -1px;
|
||||
width: 30px;
|
||||
transform: translateX(100%);
|
||||
transition: box-shadow 0.3s;
|
||||
content: '';
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
&-cell-fix-right-first::after,
|
||||
&-cell-fix-right-last::after {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: -1px;
|
||||
left: 0;
|
||||
width: 30px;
|
||||
transform: translateX(-100%);
|
||||
transition: box-shadow 0.3s;
|
||||
content: '';
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.@{table-prefix-cls}-container {
|
||||
&::before,
|
||||
&::after {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
z-index: @zindex-table-fixed;
|
||||
width: 30px;
|
||||
transition: box-shadow 0.3s;
|
||||
content: '';
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
&::before {
|
||||
left: 0;
|
||||
}
|
||||
|
||||
&::after {
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&-ping-left {
|
||||
&:not(.@{table-prefix-cls}-has-fix-left) .@{table-prefix-cls}-container {
|
||||
position: relative;
|
||||
|
||||
&::before {
|
||||
box-shadow: inset 10px 0 8px -8px darken(@shadow-color, 5%);
|
||||
}
|
||||
}
|
||||
|
||||
.@{table-prefix-cls}-cell-fix-left-first::after,
|
||||
.@{table-prefix-cls}-cell-fix-left-last::after {
|
||||
box-shadow: inset 10px 0 8px -8px darken(@shadow-color, 5%);
|
||||
}
|
||||
|
||||
.@{table-prefix-cls}-cell-fix-left-last::before {
|
||||
background-color: transparent !important;
|
||||
}
|
||||
}
|
||||
|
||||
&-ping-right {
|
||||
&:not(.@{table-prefix-cls}-has-fix-right) .@{table-prefix-cls}-container {
|
||||
position: relative;
|
||||
|
||||
&::after {
|
||||
box-shadow: inset -10px 0 8px -8px darken(@shadow-color, 5%);
|
||||
}
|
||||
}
|
||||
|
||||
.@{table-prefix-cls}-cell-fix-right-first::after,
|
||||
.@{table-prefix-cls}-cell-fix-right-last::after {
|
||||
box-shadow: inset -10px 0 8px -8px darken(@shadow-color, 5%);
|
||||
}
|
||||
}
|
||||
|
||||
&-sticky {
|
||||
&-holder {
|
||||
position: sticky;
|
||||
z-index: @table-sticky-zindex;
|
||||
background: @component-background;
|
||||
}
|
||||
|
||||
&-scroll {
|
||||
position: sticky;
|
||||
bottom: 0;
|
||||
z-index: @table-sticky-zindex;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background: lighten(@table-border-color, 80%);
|
||||
border-top: 1px solid @table-border-color;
|
||||
opacity: 0.6;
|
||||
|
||||
&:hover {
|
||||
transform-origin: center bottom;
|
||||
}
|
||||
|
||||
&-bar {
|
||||
height: 8px;
|
||||
background-color: @table-sticky-scroll-bar-bg;
|
||||
border-radius: @table-sticky-scroll-bar-radius;
|
||||
|
||||
&:hover {
|
||||
background-color: @table-sticky-scroll-bar-active-bg;
|
||||
}
|
||||
|
||||
&-active {
|
||||
background-color: @table-sticky-scroll-bar-active-bg;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (-ms-high-contrast: none) {
|
||||
.@{table-prefix-cls} {
|
||||
&-ping-left {
|
||||
.@{table-prefix-cls}-cell-fix-left-last::after {
|
||||
box-shadow: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
&-ping-right {
|
||||
.@{table-prefix-cls}-cell-fix-right-first::after {
|
||||
box-shadow: none !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@import './radius';
|
||||
@import './rtl';
|
|
@ -0,0 +1,409 @@
|
|||
import type { CSSObject } from '../../_util/cssinjs';
|
||||
import { TinyColor } from '@ctrl/tinycolor';
|
||||
import type { FullToken, GenerateStyle } from '../../theme/internal';
|
||||
import { genComponentStyleHook, mergeToken } from '../../theme/internal';
|
||||
import genBorderedStyle from './bordered';
|
||||
import genEllipsisStyle from './ellipsis';
|
||||
import genEmptyStyle from './empty';
|
||||
import genExpandStyle from './expand';
|
||||
import genFilterStyle from './filter';
|
||||
import genFixedStyle from './fixed';
|
||||
import genPaginationStyle from './pagination';
|
||||
import genRadiusStyle from './radius';
|
||||
import genRtlStyle from './rtl';
|
||||
import genSelectionStyle from './selection';
|
||||
import genSizeStyle from './size';
|
||||
import genSorterStyle from './sorter';
|
||||
import genStickyStyle from './sticky';
|
||||
import genSummaryStyle from './summary';
|
||||
import { clearFix, resetComponent } from '../../_style';
|
||||
|
||||
export interface ComponentToken {}
|
||||
|
||||
export interface TableToken extends FullToken<'Table'> {
|
||||
tableFontSize: number;
|
||||
tableBg: string;
|
||||
tableRadius: number;
|
||||
tablePaddingHorizontal: number;
|
||||
tablePaddingVertical: number;
|
||||
tablePaddingHorizontalMiddle: number;
|
||||
tablePaddingVerticalMiddle: number;
|
||||
tablePaddingHorizontalSmall: number;
|
||||
tablePaddingVerticalSmall: number;
|
||||
tableBorderColor: string;
|
||||
tableHeaderTextColor: string;
|
||||
tableHeaderBg: string;
|
||||
tableFooterTextColor: string;
|
||||
tableFooterBg: string;
|
||||
tableHeaderCellSplitColor: string;
|
||||
tableHeaderSortBg: string;
|
||||
tableHeaderSortHoverBg: string;
|
||||
tableHeaderIconColor: string;
|
||||
tableHeaderIconColorHover: string;
|
||||
tableBodySortBg: string;
|
||||
tableFixedHeaderSortActiveBg: string;
|
||||
tableHeaderFilterActiveBg: string;
|
||||
tableFilterDropdownBg: string;
|
||||
tableFilterDropdownHeight: number;
|
||||
tableRowHoverBg: string;
|
||||
tableSelectedRowBg: string;
|
||||
tableSelectedRowHoverBg: string;
|
||||
|
||||
tableFontSizeMiddle: number;
|
||||
tableFontSizeSmall: number;
|
||||
tableSelectionColumnWidth: number;
|
||||
tableExpandIconBg: string;
|
||||
tableExpandColumnWidth: number;
|
||||
tableExpandedRowBg: string;
|
||||
tableFilterDropdownWidth: number;
|
||||
tableFilterDropdownSearchWidth: number;
|
||||
|
||||
// Z-Index
|
||||
zIndexTableFixed: number;
|
||||
zIndexTableSticky: number;
|
||||
|
||||
// Virtual Scroll Bar
|
||||
tableScrollThumbSize: number;
|
||||
tableScrollThumbBg: string;
|
||||
tableScrollThumbBgHover: string;
|
||||
tableScrollBg: string;
|
||||
}
|
||||
|
||||
const genTableStyle: GenerateStyle<TableToken, CSSObject> = token => {
|
||||
const {
|
||||
componentCls,
|
||||
fontWeightStrong,
|
||||
tablePaddingVertical,
|
||||
tablePaddingHorizontal,
|
||||
lineWidth,
|
||||
lineType,
|
||||
tableBorderColor,
|
||||
tableFontSize,
|
||||
tableBg,
|
||||
tableRadius,
|
||||
tableHeaderTextColor,
|
||||
motionDurationMid,
|
||||
tableHeaderBg,
|
||||
tableHeaderCellSplitColor,
|
||||
tableRowHoverBg,
|
||||
tableSelectedRowBg,
|
||||
tableSelectedRowHoverBg,
|
||||
tableFooterTextColor,
|
||||
tableFooterBg,
|
||||
paddingContentVerticalLG,
|
||||
wireframe,
|
||||
} = token;
|
||||
const tableBorder = `${lineWidth}px ${lineType} ${tableBorderColor}`;
|
||||
return {
|
||||
[`${componentCls}-wrapper`]: {
|
||||
clear: 'both',
|
||||
maxWidth: '100%',
|
||||
...clearFix(),
|
||||
|
||||
[componentCls]: {
|
||||
...resetComponent(token),
|
||||
fontSize: tableFontSize,
|
||||
background: tableBg,
|
||||
borderRadius: `${tableRadius}px ${tableRadius}px 0 0`,
|
||||
},
|
||||
// https://github.com/ant-design/ant-design/issues/17611
|
||||
table: {
|
||||
width: '100%',
|
||||
textAlign: 'start',
|
||||
borderRadius: `${tableRadius}px ${tableRadius}px 0 0`,
|
||||
borderCollapse: 'separate',
|
||||
borderSpacing: 0,
|
||||
},
|
||||
|
||||
// ============================= Cell =============================
|
||||
[`
|
||||
${componentCls}-thead > tr > th,
|
||||
${componentCls}-tbody > tr > td,
|
||||
tfoot > tr > th,
|
||||
tfoot > tr > td
|
||||
`]: {
|
||||
position: 'relative',
|
||||
padding: `${paddingContentVerticalLG}px ${tablePaddingHorizontal}px`,
|
||||
overflowWrap: 'break-word',
|
||||
},
|
||||
|
||||
// ============================ Title =============================
|
||||
[`${componentCls}-title`]: {
|
||||
padding: `${tablePaddingVertical}px ${tablePaddingHorizontal}px`,
|
||||
},
|
||||
|
||||
// ============================ Header ============================
|
||||
[`${componentCls}-thead`]: {
|
||||
[`
|
||||
> tr > th,
|
||||
> tr > td
|
||||
`]: {
|
||||
position: 'relative',
|
||||
color: tableHeaderTextColor,
|
||||
fontWeight: fontWeightStrong,
|
||||
textAlign: 'start',
|
||||
background: tableHeaderBg,
|
||||
borderBottom: tableBorder,
|
||||
transition: `background ${motionDurationMid} ease`,
|
||||
|
||||
"&[colspan]:not([colspan='1'])": {
|
||||
textAlign: 'center',
|
||||
},
|
||||
|
||||
[`&:not(:last-child):not(${componentCls}-selection-column):not(${componentCls}-row-expand-icon-cell):not([colspan])::before`]:
|
||||
{
|
||||
position: 'absolute',
|
||||
top: '50%',
|
||||
insetInlineEnd: 0,
|
||||
width: 1,
|
||||
height: '1.6em',
|
||||
backgroundColor: tableHeaderCellSplitColor,
|
||||
transform: 'translateY(-50%)',
|
||||
transition: `background-color ${motionDurationMid}`,
|
||||
content: '""',
|
||||
},
|
||||
},
|
||||
|
||||
'> tr:not(:last-child) > th[colspan]': {
|
||||
borderBottom: 0,
|
||||
},
|
||||
},
|
||||
|
||||
// ============================ Body ============================
|
||||
// Borderless Table has unique hover style, which would be implemented with `borderTop`.
|
||||
[`${componentCls}:not(${componentCls}-bordered)`]: {
|
||||
[`${componentCls}-tbody`]: {
|
||||
'> tr': {
|
||||
'> td': {
|
||||
borderTop: tableBorder,
|
||||
borderBottom: 'transparent',
|
||||
},
|
||||
|
||||
'&:last-child > td': {
|
||||
borderBottom: tableBorder,
|
||||
},
|
||||
|
||||
[`&:first-child > td,
|
||||
&${componentCls}-measure-row + tr > td`]: {
|
||||
borderTop: 'none',
|
||||
borderTopColor: 'transparent',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
// Bordered Table remains simple `borderBottom`.
|
||||
// Ref issue: https://github.com/ant-design/ant-design/issues/38724
|
||||
[`${componentCls}${componentCls}-bordered`]: {
|
||||
[`${componentCls}-tbody`]: {
|
||||
'> tr': {
|
||||
'> td': {
|
||||
borderBottom: tableBorder,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
[`${componentCls}-tbody`]: {
|
||||
'> tr': {
|
||||
'> td': {
|
||||
transition: `background ${motionDurationMid}, border-color ${motionDurationMid}`,
|
||||
|
||||
// ========================= Nest Table ===========================
|
||||
[`
|
||||
> ${componentCls}-wrapper:only-child,
|
||||
> ${componentCls}-expanded-row-fixed > ${componentCls}-wrapper:only-child
|
||||
`]: {
|
||||
[componentCls]: {
|
||||
marginBlock: `-${tablePaddingVertical}px`,
|
||||
marginInline: `${
|
||||
token.tableExpandColumnWidth - tablePaddingHorizontal
|
||||
}px -${tablePaddingHorizontal}px`,
|
||||
[`${componentCls}-tbody > tr:last-child > td`]: {
|
||||
borderBottom: 0,
|
||||
'&:first-child, &:last-child': {
|
||||
borderRadius: 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
[`
|
||||
&${componentCls}-row:hover > td,
|
||||
> td${componentCls}-cell-row-hover
|
||||
`]: {
|
||||
background: tableRowHoverBg,
|
||||
},
|
||||
|
||||
[`&${componentCls}-row-selected`]: {
|
||||
'> td': {
|
||||
background: tableSelectedRowBg,
|
||||
},
|
||||
|
||||
'&:hover > td': {
|
||||
background: tableSelectedRowHoverBg,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
[`${componentCls}:not(${componentCls}-bordered) ${componentCls}-tbody > tr`]: wireframe
|
||||
? undefined
|
||||
: {
|
||||
[`&${componentCls}-row:hover, &${componentCls}-row${componentCls}-row-selected`]: {
|
||||
[`+ tr${componentCls}-row > td`]: {
|
||||
borderTopColor: 'transparent',
|
||||
},
|
||||
},
|
||||
|
||||
[`&${componentCls}-row:last-child:hover > td,
|
||||
&${componentCls}-row${componentCls}-row-selected:last-child > td`]: {
|
||||
borderBottomColor: 'transparent',
|
||||
},
|
||||
|
||||
[`
|
||||
&${componentCls}-row:hover > td,
|
||||
> td${componentCls}-cell-row-hover,
|
||||
&${componentCls}-row${componentCls}-row-selected > td
|
||||
`]: {
|
||||
borderTopColor: 'transparent',
|
||||
|
||||
'&:first-child': {
|
||||
borderStartStartRadius: tableRadius,
|
||||
borderEndStartRadius: tableRadius,
|
||||
},
|
||||
|
||||
'&:last-child': {
|
||||
borderStartEndRadius: tableRadius,
|
||||
borderEndEndRadius: tableRadius,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
// ============================ Footer ============================
|
||||
[`${componentCls}-footer`]: {
|
||||
padding: `${tablePaddingVertical}px ${tablePaddingHorizontal}px`,
|
||||
color: tableFooterTextColor,
|
||||
background: tableFooterBg,
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
// ============================== Export ==============================
|
||||
export default genComponentStyleHook('Table', token => {
|
||||
const {
|
||||
controlItemBgActive,
|
||||
controlItemBgActiveHover,
|
||||
colorTextPlaceholder,
|
||||
colorTextHeading,
|
||||
colorSplit,
|
||||
colorBorderSecondary,
|
||||
fontSize,
|
||||
padding,
|
||||
paddingXS,
|
||||
paddingSM,
|
||||
controlHeight,
|
||||
colorFillAlter,
|
||||
colorIcon,
|
||||
colorIconHover,
|
||||
opacityLoading,
|
||||
colorBgContainer,
|
||||
borderRadiusLG,
|
||||
colorFillContent,
|
||||
colorFillSecondary,
|
||||
controlInteractiveSize: checkboxSize,
|
||||
} = token;
|
||||
|
||||
const baseColorAction = new TinyColor(colorIcon);
|
||||
const baseColorActionHover = new TinyColor(colorIconHover);
|
||||
|
||||
const tableSelectedRowBg = controlItemBgActive;
|
||||
const zIndexTableFixed: number = 2;
|
||||
|
||||
const colorFillSecondarySolid = new TinyColor(colorFillSecondary)
|
||||
.onBackground(colorBgContainer)
|
||||
.toHexString();
|
||||
const colorFillContentSolid = new TinyColor(colorFillContent)
|
||||
.onBackground(colorBgContainer)
|
||||
.toHexString();
|
||||
|
||||
const colorFillAlterSolid = new TinyColor(colorFillAlter)
|
||||
.onBackground(colorBgContainer)
|
||||
.toHexString();
|
||||
|
||||
const tableToken = mergeToken<TableToken>(token, {
|
||||
tableFontSize: fontSize,
|
||||
tableBg: colorBgContainer,
|
||||
tableRadius: borderRadiusLG,
|
||||
|
||||
tablePaddingVertical: padding,
|
||||
tablePaddingHorizontal: padding,
|
||||
tablePaddingVerticalMiddle: paddingSM,
|
||||
tablePaddingHorizontalMiddle: paddingXS,
|
||||
tablePaddingVerticalSmall: paddingXS,
|
||||
tablePaddingHorizontalSmall: paddingXS,
|
||||
tableBorderColor: colorBorderSecondary,
|
||||
tableHeaderTextColor: colorTextHeading,
|
||||
tableHeaderBg: colorFillAlterSolid,
|
||||
tableFooterTextColor: colorTextHeading,
|
||||
tableFooterBg: colorFillAlterSolid,
|
||||
tableHeaderCellSplitColor: colorBorderSecondary,
|
||||
tableHeaderSortBg: colorFillSecondarySolid,
|
||||
tableHeaderSortHoverBg: colorFillContentSolid,
|
||||
tableHeaderIconColor: baseColorAction
|
||||
.clone()
|
||||
.setAlpha(baseColorAction.getAlpha() * opacityLoading)
|
||||
.toRgbString(),
|
||||
tableHeaderIconColorHover: baseColorActionHover
|
||||
.clone()
|
||||
.setAlpha(baseColorActionHover.getAlpha() * opacityLoading)
|
||||
.toRgbString(),
|
||||
tableBodySortBg: colorFillAlterSolid,
|
||||
tableFixedHeaderSortActiveBg: colorFillSecondarySolid,
|
||||
tableHeaderFilterActiveBg: colorFillContent,
|
||||
tableFilterDropdownBg: colorBgContainer,
|
||||
tableRowHoverBg: colorFillAlterSolid,
|
||||
tableSelectedRowBg,
|
||||
tableSelectedRowHoverBg: controlItemBgActiveHover,
|
||||
zIndexTableFixed,
|
||||
zIndexTableSticky: zIndexTableFixed + 1,
|
||||
tableFontSizeMiddle: fontSize,
|
||||
tableFontSizeSmall: fontSize,
|
||||
tableSelectionColumnWidth: controlHeight,
|
||||
tableExpandIconBg: colorBgContainer,
|
||||
tableExpandColumnWidth: checkboxSize + 2 * token.padding,
|
||||
tableExpandedRowBg: colorFillAlter,
|
||||
|
||||
// Dropdown
|
||||
tableFilterDropdownWidth: 120,
|
||||
tableFilterDropdownHeight: 264,
|
||||
tableFilterDropdownSearchWidth: 140,
|
||||
|
||||
// Virtual Scroll Bar
|
||||
tableScrollThumbSize: 8, // Mac scroll bar size
|
||||
tableScrollThumbBg: colorTextPlaceholder,
|
||||
tableScrollThumbBgHover: colorTextHeading,
|
||||
tableScrollBg: colorSplit,
|
||||
});
|
||||
|
||||
return [
|
||||
genTableStyle(tableToken),
|
||||
genPaginationStyle(tableToken),
|
||||
genSummaryStyle(tableToken),
|
||||
genSorterStyle(tableToken),
|
||||
genFilterStyle(tableToken),
|
||||
genBorderedStyle(tableToken),
|
||||
genRadiusStyle(tableToken),
|
||||
genExpandStyle(tableToken),
|
||||
genSummaryStyle(tableToken),
|
||||
genEmptyStyle(tableToken),
|
||||
genSelectionStyle(tableToken),
|
||||
genFixedStyle(tableToken),
|
||||
genStickyStyle(tableToken),
|
||||
genEllipsisStyle(tableToken),
|
||||
genSizeStyle(tableToken),
|
||||
genRtlStyle(tableToken),
|
||||
];
|
||||
});
|
|
@ -1,16 +0,0 @@
|
|||
import '../../style/index.less';
|
||||
import './index.less';
|
||||
|
||||
// style dependencies
|
||||
// deps-lint-skip: menu
|
||||
// deps-lint-skip: grid
|
||||
import '../../button/style';
|
||||
import '../../empty/style';
|
||||
import '../../radio/style';
|
||||
import '../../checkbox/style';
|
||||
import '../../dropdown/style';
|
||||
import '../../spin/style';
|
||||
import '../../pagination/style';
|
||||
import '../../tooltip/style';
|
||||
import '../../input/style';
|
||||
import '../../tree/style';
|
|
@ -0,0 +1,39 @@
|
|||
import type { CSSObject } from '../../_util/cssinjs';
|
||||
import type { GenerateStyle } from '../../theme/internal';
|
||||
import type { TableToken } from './index';
|
||||
|
||||
const genPaginationStyle: GenerateStyle<TableToken, CSSObject> = token => {
|
||||
const { componentCls, antCls } = token;
|
||||
return {
|
||||
[`${componentCls}-wrapper`]: {
|
||||
// ========================== Pagination ==========================
|
||||
[`${componentCls}-pagination${antCls}-pagination`]: {
|
||||
margin: `${token.margin}px 0`,
|
||||
},
|
||||
|
||||
[`${componentCls}-pagination`]: {
|
||||
display: 'flex',
|
||||
flexWrap: 'wrap',
|
||||
rowGap: token.paddingXS,
|
||||
|
||||
'> *': {
|
||||
flex: 'none',
|
||||
},
|
||||
|
||||
'&-left': {
|
||||
justifyContent: 'flex-start',
|
||||
},
|
||||
|
||||
'&-center': {
|
||||
justifyContent: 'center',
|
||||
},
|
||||
|
||||
'&-right': {
|
||||
justifyContent: 'flex-end',
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default genPaginationStyle;
|
|
@ -1,45 +0,0 @@
|
|||
// ================================================================
|
||||
// = Border Radio =
|
||||
// ================================================================
|
||||
.@{table-prefix-cls} {
|
||||
/* title + table */
|
||||
&-title {
|
||||
border-radius: @table-border-radius-base @table-border-radius-base 0 0;
|
||||
}
|
||||
|
||||
&-title + &-container {
|
||||
border-top-left-radius: 0;
|
||||
border-top-right-radius: 0;
|
||||
|
||||
table > thead > tr:first-child {
|
||||
th:first-child {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
th:last-child {
|
||||
border-radius: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* table */
|
||||
&-container {
|
||||
border-top-left-radius: @table-border-radius-base;
|
||||
border-top-right-radius: @table-border-radius-base;
|
||||
|
||||
table > thead > tr:first-child {
|
||||
th:first-child {
|
||||
border-top-left-radius: @table-border-radius-base;
|
||||
}
|
||||
|
||||
th:last-child {
|
||||
border-top-right-radius: @table-border-radius-base;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* table + footer */
|
||||
&-footer {
|
||||
border-radius: 0 0 @table-border-radius-base @table-border-radius-base;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
import type { CSSObject } from '../../_util/cssinjs';
|
||||
import type { GenerateStyle } from '../../theme/internal';
|
||||
import type { TableToken } from './index';
|
||||
|
||||
const genRadiusStyle: GenerateStyle<TableToken, CSSObject> = token => {
|
||||
const { componentCls, tableRadius } = token;
|
||||
return {
|
||||
[`${componentCls}-wrapper`]: {
|
||||
[componentCls]: {
|
||||
// https://github.com/ant-design/ant-design/issues/39115#issuecomment-1362314574
|
||||
[`${componentCls}-title, ${componentCls}-header`]: {
|
||||
borderRadius: `${tableRadius}px ${tableRadius}px 0 0`,
|
||||
},
|
||||
|
||||
[`${componentCls}-title + ${componentCls}-container`]: {
|
||||
borderStartStartRadius: 0,
|
||||
borderStartEndRadius: 0,
|
||||
|
||||
table: {
|
||||
borderRadius: 0,
|
||||
|
||||
'> thead > tr:first-child': {
|
||||
'th:first-child': {
|
||||
borderRadius: 0,
|
||||
},
|
||||
|
||||
'th:last-child': {
|
||||
borderRadius: 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
'&-container': {
|
||||
borderStartStartRadius: tableRadius,
|
||||
borderStartEndRadius: tableRadius,
|
||||
|
||||
'table > thead > tr:first-child': {
|
||||
'> *:first-child': {
|
||||
borderStartStartRadius: tableRadius,
|
||||
},
|
||||
|
||||
'> *:last-child': {
|
||||
borderStartEndRadius: tableRadius,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
'&-footer': {
|
||||
borderRadius: `0 0 ${tableRadius}px ${tableRadius}px`,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default genRadiusStyle;
|
|
@ -1,41 +0,0 @@
|
|||
.@{table-prefix-cls}-resize-handle {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
height: 100% !important;
|
||||
bottom: 0;
|
||||
left: auto !important;
|
||||
right: -8px;
|
||||
cursor: col-resize;
|
||||
touch-action: none;
|
||||
user-select: auto;
|
||||
width: 16px;
|
||||
z-index: 1;
|
||||
&-line {
|
||||
display: block;
|
||||
width: 1px;
|
||||
margin-left: 7px;
|
||||
height: 100% !important;
|
||||
background-color: @primary-color;
|
||||
opacity: 0;
|
||||
}
|
||||
&:hover &-line {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.@{table-prefix-cls}-resize-handle.dragging {
|
||||
overflow: hidden;
|
||||
.@{table-prefix-cls}-resize-handle-line {
|
||||
opacity: 1;
|
||||
}
|
||||
&:before {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
content: ' ';
|
||||
width: 200vw;
|
||||
transform: translateX(-50%);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
|
@ -1,168 +0,0 @@
|
|||
@import '../../style/themes/index';
|
||||
@import '../../style/mixins/index';
|
||||
|
||||
@table-prefix-cls: ~'@{ant-prefix}-table';
|
||||
@table-wrapepr-cls: ~'@{table-prefix-cls}-wrapper';
|
||||
@table-wrapepr-rtl-cls: ~'@{table-prefix-cls}-wrapper-rtl';
|
||||
|
||||
.@{table-prefix-cls}-wrapper {
|
||||
&-rtl {
|
||||
direction: rtl;
|
||||
}
|
||||
}
|
||||
|
||||
.@{table-prefix-cls} {
|
||||
&-rtl {
|
||||
direction: rtl;
|
||||
}
|
||||
|
||||
table {
|
||||
.@{table-wrapepr-rtl-cls} & {
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
|
||||
// ============================ Header ============================
|
||||
&-thead {
|
||||
> tr {
|
||||
> th {
|
||||
&[colspan]:not([colspan='1']) {
|
||||
.@{table-wrapepr-rtl-cls} & {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
&:not(:last-child):not(.@{table-prefix-cls}-selection-column):not(.@{table-prefix-cls}-row-expand-icon-cell):not([colspan])::before {
|
||||
.@{table-wrapepr-rtl-cls} & {
|
||||
right: auto;
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.@{table-wrapepr-rtl-cls} & {
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ============================= Body =============================
|
||||
&-tbody {
|
||||
> tr {
|
||||
// ========================= Nest Table ===========================
|
||||
.@{table-prefix-cls}-wrapper:only-child {
|
||||
.@{table-prefix-cls}.@{table-prefix-cls}-rtl {
|
||||
margin: -@table-padding-vertical (@table-padding-horizontal + ceil(@font-size-sm * 1.4)) -@table-padding-vertical -@table-padding-horizontal;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========================== Pagination ==========================
|
||||
&-pagination {
|
||||
&-left {
|
||||
.@{table-wrapepr-cls}.@{table-wrapepr-rtl-cls} & {
|
||||
justify-content: flex-end;
|
||||
}
|
||||
}
|
||||
|
||||
&-right {
|
||||
.@{table-wrapepr-cls}.@{table-wrapepr-rtl-cls} & {
|
||||
justify-content: flex-start;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// = Function =
|
||||
// ================================================================
|
||||
|
||||
// ============================ Sorter ============================
|
||||
&-column-sorter {
|
||||
.@{table-wrapepr-rtl-cls} & {
|
||||
margin-right: 4px;
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
// ============================ Filter ============================
|
||||
&-filter-column-title {
|
||||
.@{table-wrapepr-rtl-cls} & {
|
||||
padding: @table-padding-vertical @table-padding-horizontal @table-padding-vertical 2.3em;
|
||||
}
|
||||
}
|
||||
|
||||
&-thead tr th.@{table-prefix-cls}-column-has-sorters {
|
||||
.@{table-prefix-cls}-filter-column-title {
|
||||
.@{table-prefix-cls}-rtl & {
|
||||
padding: 0 0 0 2.3em;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-filter-trigger {
|
||||
.@{table-wrapepr-rtl-cls} & {
|
||||
margin: -4px 4px -4px (-@table-padding-horizontal / 2);
|
||||
}
|
||||
}
|
||||
|
||||
// Dropdown
|
||||
&-filter-dropdown {
|
||||
// Checkbox
|
||||
&,
|
||||
&-submenu {
|
||||
.@{ant-prefix}-checkbox-wrapper + span {
|
||||
.@{ant-prefix}-dropdown-rtl &,
|
||||
.@{ant-prefix}-dropdown-menu-submenu-rtl& {
|
||||
padding-right: 8px;
|
||||
padding-left: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========================== Selections ==========================
|
||||
&-selection {
|
||||
.@{table-wrapepr-rtl-cls} & {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
// ========================== Expandable ==========================
|
||||
&-row-indent {
|
||||
.@{table-wrapepr-rtl-cls} & {
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
|
||||
&-row-expand-icon {
|
||||
.@{table-wrapepr-rtl-cls} & {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.@{table-prefix-cls}-row-indent + & {
|
||||
.@{table-wrapepr-rtl-cls} & {
|
||||
margin-right: 0;
|
||||
margin-left: @padding-xs;
|
||||
}
|
||||
}
|
||||
|
||||
&::after {
|
||||
.@{table-wrapepr-rtl-cls} & {
|
||||
transform: rotate(-90deg);
|
||||
}
|
||||
}
|
||||
|
||||
&-collapsed::before {
|
||||
.@{table-wrapepr-rtl-cls} & {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
}
|
||||
|
||||
&-collapsed::after {
|
||||
.@{table-wrapepr-rtl-cls} & {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
import type { CSSObject } from '../../_util/cssinjs';
|
||||
import type { GenerateStyle } from '../../theme/internal';
|
||||
import type { TableToken } from './index';
|
||||
|
||||
const genStyle: GenerateStyle<TableToken, CSSObject> = token => {
|
||||
const { componentCls } = token;
|
||||
return {
|
||||
[`${componentCls}-wrapper-rtl`]: {
|
||||
direction: 'rtl',
|
||||
table: {
|
||||
direction: 'rtl',
|
||||
},
|
||||
|
||||
[`${componentCls}-pagination-left`]: {
|
||||
justifyContent: 'flex-end',
|
||||
},
|
||||
|
||||
[`${componentCls}-pagination-right`]: {
|
||||
justifyContent: 'flex-start',
|
||||
},
|
||||
|
||||
[`${componentCls}-row-expand-icon`]: {
|
||||
'&::after': {
|
||||
transform: 'rotate(-90deg)',
|
||||
},
|
||||
|
||||
'&-collapsed::before': {
|
||||
transform: 'rotate(180deg)',
|
||||
},
|
||||
|
||||
'&-collapsed::after': {
|
||||
transform: 'rotate(0deg)',
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default genStyle;
|
|
@ -0,0 +1,76 @@
|
|||
import type { CSSObject } from '../../_util/cssinjs';
|
||||
import type { GenerateStyle } from '../../theme/internal';
|
||||
import type { TableToken } from './index';
|
||||
|
||||
const genSelectionStyle: GenerateStyle<TableToken, CSSObject> = token => {
|
||||
const {
|
||||
componentCls,
|
||||
antCls,
|
||||
iconCls,
|
||||
fontSizeIcon,
|
||||
paddingXS,
|
||||
tableHeaderIconColor,
|
||||
tableHeaderIconColorHover,
|
||||
} = token;
|
||||
return {
|
||||
[`${componentCls}-wrapper`]: {
|
||||
// ========================== Selections ==========================
|
||||
[`${componentCls}-selection-col`]: {
|
||||
width: token.tableSelectionColumnWidth,
|
||||
},
|
||||
|
||||
[`${componentCls}-bordered ${componentCls}-selection-col`]: {
|
||||
width: token.tableSelectionColumnWidth + paddingXS * 2,
|
||||
},
|
||||
|
||||
[`
|
||||
table tr th${componentCls}-selection-column,
|
||||
table tr td${componentCls}-selection-column
|
||||
`]: {
|
||||
paddingInlineEnd: token.paddingXS,
|
||||
paddingInlineStart: token.paddingXS,
|
||||
textAlign: 'center',
|
||||
|
||||
[`${antCls}-radio-wrapper`]: {
|
||||
marginInlineEnd: 0,
|
||||
},
|
||||
},
|
||||
|
||||
[`table tr th${componentCls}-selection-column${componentCls}-cell-fix-left`]: {
|
||||
zIndex: token.zIndexTableFixed + 1,
|
||||
},
|
||||
|
||||
[`table tr th${componentCls}-selection-column::after`]: {
|
||||
backgroundColor: 'transparent !important',
|
||||
},
|
||||
|
||||
[`${componentCls}-selection`]: {
|
||||
position: 'relative',
|
||||
display: 'inline-flex',
|
||||
flexDirection: 'column',
|
||||
},
|
||||
|
||||
[`${componentCls}-selection-extra`]: {
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
zIndex: 1,
|
||||
cursor: 'pointer',
|
||||
transition: `all ${token.motionDurationSlow}`,
|
||||
marginInlineStart: '100%',
|
||||
paddingInlineStart: `${token.tablePaddingHorizontal / 4}px`,
|
||||
|
||||
[iconCls]: {
|
||||
color: tableHeaderIconColor,
|
||||
fontSize: fontSizeIcon,
|
||||
verticalAlign: 'baseline',
|
||||
|
||||
'&:hover': {
|
||||
color: tableHeaderIconColorHover,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default genSelectionStyle;
|
|
@ -1,51 +0,0 @@
|
|||
@import (reference) '../../style/themes/index';
|
||||
|
||||
@table-prefix-cls: ~'@{ant-prefix}-table';
|
||||
|
||||
.table-size(@size, @padding-vertical, @padding-horizontal, @font-size) {
|
||||
.@{table-prefix-cls}.@{table-prefix-cls}-@{size} {
|
||||
font-size: @font-size;
|
||||
|
||||
.@{table-prefix-cls}-title,
|
||||
.@{table-prefix-cls}-footer,
|
||||
.@{table-prefix-cls}-thead > tr > th,
|
||||
.@{table-prefix-cls}-tbody > tr > td,
|
||||
tfoot > tr > th,
|
||||
tfoot > tr > td {
|
||||
padding: @padding-vertical @padding-horizontal;
|
||||
}
|
||||
|
||||
.@{table-prefix-cls}-filter-trigger {
|
||||
margin-right: -(@padding-horizontal / 2);
|
||||
}
|
||||
|
||||
.@{table-prefix-cls}-expanded-row-fixed {
|
||||
margin: -@padding-vertical -@padding-horizontal;
|
||||
}
|
||||
|
||||
.@{table-prefix-cls}-tbody {
|
||||
// ========================= Nest Table ===========================
|
||||
.@{table-prefix-cls}-wrapper:only-child {
|
||||
.@{table-prefix-cls} {
|
||||
margin: -@padding-vertical -@padding-horizontal -@padding-vertical (@padding-horizontal +
|
||||
ceil((@font-size-sm * 1.4)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// https://github.com/ant-design/ant-design/issues/35167
|
||||
.@{table-prefix-cls}-selection-column {
|
||||
padding-inline-start: (@padding-horizontal / 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// = Middle =
|
||||
// ================================================================
|
||||
.table-size(~'middle', @table-padding-vertical-md, @table-padding-horizontal-md, @table-font-size-md);
|
||||
|
||||
// ================================================================
|
||||
// = Small =
|
||||
// ================================================================
|
||||
.table-size(~'small', @table-padding-vertical-sm, @table-padding-horizontal-sm, @table-font-size-sm);
|
|
@ -0,0 +1,68 @@
|
|||
import type { CSSObject } from '../../_util/cssinjs';
|
||||
import type { GenerateStyle } from '../../theme/internal';
|
||||
import type { TableToken } from './index';
|
||||
|
||||
const genSizeStyle: GenerateStyle<TableToken, CSSObject> = token => {
|
||||
const { componentCls } = token;
|
||||
const getSizeStyle = (
|
||||
size: 'small' | 'middle',
|
||||
paddingVertical: number,
|
||||
paddingHorizontal: number,
|
||||
fontSize: number,
|
||||
) => ({
|
||||
[`${componentCls}${componentCls}-${size}`]: {
|
||||
fontSize,
|
||||
[`
|
||||
${componentCls}-title,
|
||||
${componentCls}-footer,
|
||||
${componentCls}-thead > tr > th,
|
||||
${componentCls}-tbody > tr > td,
|
||||
tfoot > tr > th,
|
||||
tfoot > tr > td
|
||||
`]: {
|
||||
padding: `${paddingVertical}px ${paddingHorizontal}px`,
|
||||
},
|
||||
|
||||
[`${componentCls}-filter-trigger`]: {
|
||||
marginInlineEnd: `-${paddingHorizontal / 2}px`,
|
||||
},
|
||||
|
||||
[`${componentCls}-expanded-row-fixed`]: {
|
||||
margin: `-${paddingVertical}px -${paddingHorizontal}px`,
|
||||
},
|
||||
|
||||
[`${componentCls}-tbody`]: {
|
||||
// ========================= Nest Table ===========================
|
||||
[`${componentCls}-wrapper:only-child ${componentCls}`]: {
|
||||
marginBlock: `-${paddingVertical}px`,
|
||||
marginInline: `${
|
||||
token.tableExpandColumnWidth - paddingHorizontal
|
||||
}px -${paddingHorizontal}px`,
|
||||
},
|
||||
},
|
||||
|
||||
// https://github.com/ant-design/ant-design/issues/35167
|
||||
[`${componentCls}-selection-column`]: {
|
||||
paddingInlineStart: `${paddingHorizontal / 4}px`,
|
||||
},
|
||||
},
|
||||
});
|
||||
return {
|
||||
[`${componentCls}-wrapper`]: {
|
||||
...getSizeStyle(
|
||||
'middle',
|
||||
token.tablePaddingVerticalMiddle,
|
||||
token.tablePaddingHorizontalMiddle,
|
||||
token.tableFontSizeMiddle,
|
||||
),
|
||||
...getSizeStyle(
|
||||
'small',
|
||||
token.tablePaddingVerticalSmall,
|
||||
token.tablePaddingHorizontalSmall,
|
||||
token.tableFontSizeSmall,
|
||||
),
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default genSizeStyle;
|
|
@ -0,0 +1,101 @@
|
|||
import type { CSSObject } from '../../_util/cssinjs';
|
||||
import type { GenerateStyle } from '../../theme/internal';
|
||||
import type { TableToken } from './index';
|
||||
|
||||
const genSorterStyle: GenerateStyle<TableToken, CSSObject> = token => {
|
||||
const { componentCls, marginXXS, fontSizeIcon, tableHeaderIconColor, tableHeaderIconColorHover } =
|
||||
token;
|
||||
return {
|
||||
[`${componentCls}-wrapper`]: {
|
||||
[`${componentCls}-thead th${componentCls}-column-has-sorters`]: {
|
||||
outline: 'none',
|
||||
cursor: 'pointer',
|
||||
transition: `all ${token.motionDurationSlow}`,
|
||||
|
||||
'&:hover': {
|
||||
background: token.tableHeaderSortHoverBg,
|
||||
|
||||
'&::before': {
|
||||
backgroundColor: 'transparent !important',
|
||||
},
|
||||
},
|
||||
|
||||
'&:focus-visible': {
|
||||
color: token.colorPrimary,
|
||||
},
|
||||
|
||||
// https://github.com/ant-design/ant-design/issues/30969
|
||||
[`
|
||||
&${componentCls}-cell-fix-left:hover,
|
||||
&${componentCls}-cell-fix-right:hover
|
||||
`]: {
|
||||
background: token.tableFixedHeaderSortActiveBg,
|
||||
},
|
||||
},
|
||||
|
||||
[`${componentCls}-thead th${componentCls}-column-sort`]: {
|
||||
background: token.tableHeaderSortBg,
|
||||
|
||||
'&::before': {
|
||||
backgroundColor: 'transparent !important',
|
||||
},
|
||||
},
|
||||
|
||||
[`td${componentCls}-column-sort`]: {
|
||||
background: token.tableBodySortBg,
|
||||
},
|
||||
|
||||
[`${componentCls}-column-title`]: {
|
||||
position: 'relative',
|
||||
zIndex: 1,
|
||||
flex: 1,
|
||||
},
|
||||
|
||||
[`${componentCls}-column-sorters`]: {
|
||||
display: 'flex',
|
||||
flex: 'auto',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'space-between',
|
||||
|
||||
'&::after': {
|
||||
position: 'absolute',
|
||||
inset: 0,
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
content: '""',
|
||||
},
|
||||
},
|
||||
|
||||
[`${componentCls}-column-sorter`]: {
|
||||
marginInlineStart: marginXXS,
|
||||
color: tableHeaderIconColor,
|
||||
fontSize: 0,
|
||||
transition: `color ${token.motionDurationSlow}`,
|
||||
|
||||
'&-inner': {
|
||||
display: 'inline-flex',
|
||||
flexDirection: 'column',
|
||||
alignItems: 'center',
|
||||
},
|
||||
|
||||
'&-up, &-down': {
|
||||
fontSize: fontSizeIcon,
|
||||
|
||||
'&.active': {
|
||||
color: token.colorPrimary,
|
||||
},
|
||||
},
|
||||
|
||||
[`${componentCls}-column-sorter-up + ${componentCls}-column-sorter-down`]: {
|
||||
marginTop: '-0.3em',
|
||||
},
|
||||
},
|
||||
|
||||
[`${componentCls}-column-sorters:hover ${componentCls}-column-sorter`]: {
|
||||
color: tableHeaderIconColorHover,
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default genSorterStyle;
|
|
@ -0,0 +1,59 @@
|
|||
import type { CSSObject } from '../../_util/cssinjs';
|
||||
import type { GenerateStyle } from '../../theme/internal';
|
||||
import type { TableToken } from './index';
|
||||
|
||||
const genStickyStyle: GenerateStyle<TableToken, CSSObject> = token => {
|
||||
const {
|
||||
componentCls,
|
||||
opacityLoading,
|
||||
tableScrollThumbBg,
|
||||
tableScrollThumbBgHover,
|
||||
tableScrollThumbSize,
|
||||
tableScrollBg,
|
||||
zIndexTableSticky,
|
||||
} = token;
|
||||
const tableBorder = `${token.lineWidth}px ${token.lineType} ${token.tableBorderColor}`;
|
||||
return {
|
||||
[`${componentCls}-wrapper`]: {
|
||||
[`${componentCls}-sticky`]: {
|
||||
'&-holder': {
|
||||
position: 'sticky',
|
||||
zIndex: zIndexTableSticky,
|
||||
background: token.colorBgContainer,
|
||||
},
|
||||
|
||||
'&-scroll': {
|
||||
position: 'sticky',
|
||||
bottom: 0,
|
||||
height: `${tableScrollThumbSize}px !important`,
|
||||
zIndex: zIndexTableSticky,
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
background: tableScrollBg,
|
||||
borderTop: tableBorder,
|
||||
opacity: opacityLoading,
|
||||
|
||||
'&:hover': {
|
||||
transformOrigin: 'center bottom',
|
||||
},
|
||||
|
||||
// fake scrollbar style of sticky
|
||||
'&-bar': {
|
||||
height: tableScrollThumbSize,
|
||||
backgroundColor: tableScrollThumbBg,
|
||||
borderRadius: 100,
|
||||
transition: `all ${token.motionDurationSlow}, transform none`,
|
||||
position: 'absolute',
|
||||
bottom: 0,
|
||||
|
||||
'&:hover, &-active': {
|
||||
backgroundColor: tableScrollThumbBgHover,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default genStickyStyle;
|
|
@ -0,0 +1,29 @@
|
|||
import type { CSSObject } from '../../_util/cssinjs';
|
||||
import type { GenerateStyle } from '../../theme/internal';
|
||||
import type { TableToken } from './index';
|
||||
|
||||
const genSummaryStyle: GenerateStyle<TableToken, CSSObject> = token => {
|
||||
const { componentCls, lineWidth, tableBorderColor } = token;
|
||||
const tableBorder = `${lineWidth}px ${token.lineType} ${tableBorderColor}`;
|
||||
return {
|
||||
[`${componentCls}-wrapper`]: {
|
||||
[`${componentCls}-summary`]: {
|
||||
position: 'relative',
|
||||
zIndex: token.zIndexTableFixed,
|
||||
background: token.tableBg,
|
||||
|
||||
'> tr': {
|
||||
'> th, > td': {
|
||||
borderBottom: tableBorder,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
[`div${componentCls}-summary`]: {
|
||||
boxShadow: `0 -${lineWidth}px 0 ${tableBorderColor}`,
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
export default genSummaryStyle;
|
|
@ -37,7 +37,7 @@ import type { ComponentToken as SliderComponentToken } from '../../slider/style'
|
|||
import type { ComponentToken as SpaceComponentToken } from '../../space/style';
|
||||
import type { ComponentToken as SpinComponentToken } from '../../spin/style';
|
||||
import type { ComponentToken as StepsComponentToken } from '../../steps/style';
|
||||
// import type { ComponentToken as TableComponentToken } from '../../table/style';
|
||||
import type { ComponentToken as TableComponentToken } from '../../table/style';
|
||||
// import type { ComponentToken as TabsComponentToken } from '../../tabs/style';
|
||||
import type { ComponentToken as TagComponentToken } from '../../tag/style';
|
||||
import type { ComponentToken as TimelineComponentToken } from '../../timeline/style';
|
||||
|
@ -109,7 +109,7 @@ export interface ComponentTokenMap {
|
|||
Message?: MessageComponentToken;
|
||||
Upload?: UploadComponentToken;
|
||||
Tooltip?: TooltipComponentToken;
|
||||
// Table?: TableComponentToken;
|
||||
Table?: TableComponentToken;
|
||||
Space?: SpaceComponentToken;
|
||||
Progress?: ProgressComponentToken;
|
||||
// Tour?: TourComponentToken;
|
||||
|
|
Loading…
Reference in New Issue