ant-design/components/table/style/index.tsx

259 lines
8.9 KiB
TypeScript
Raw Normal View History

refactor: Table to CSS-IN-JS (#35584) * style: add basic styles of table * style: add basic border styles of table * style: add more styles of table * style: add more styles of table * style: add pagination and summary styles * add more styles * style: add cell-ellipsis styles * style: add Radius style * style: add basic styles of table * style: add basic border styles of table * style: add more styles of table * style: add more styles of table * style: add pagination and summary styles * add more styles * style: add cell-ellipsis styles * style: add Radius style * style: add sorter style * style: add sorter style * style: add filter style * style: add filter style * style: add filter style * style: fix filter and sort style * style: fix bordered style * style: fix bordered style * style: fix bordered style * style: add size style * style: fix size style * style: add selection style * style: format code * style: add sticky code * style: add expand code * style: add expand code * style: add expand code * style: add fixed code * add fixed style * style: fix diff place * style: use number as px string * chore: improve function name * chore: use token * style: rtl styles * chore: fix marigin and padding logical properties * fix: rtl styles * fix: table filter dropdown style * chore: remove useStyle * chore: revert classNames * fix: test case * fix shadow in rtl * Apply suggestions from code review * chore: sub filter tree * style: fix tree dropdown padding Co-authored-by: zombiej <smith3816@gmail.com>
2022-05-31 10:10:35 +08:00
// deps-lint-skip-all
import type { CSSObject } from '@ant-design/cssinjs';
import { TinyColor } from '@ctrl/tinycolor';
import type { FullToken, GenerateStyle } from '../../_util/theme';
import { clearFix, genComponentStyleHook, mergeToken, resetComponent } from '../../_util/theme';
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 genPagniationStyle 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';
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;
tableBodySortBg: string;
tableFixedHeaderSortActiveBg: string;
tableHeaderFilterActiveBg: string;
tableFilterDropdownBg: string;
tableFilterDropdownMaxHeight: number;
tableRowHoverBg: string;
tableSelectedRowBg: string;
tableSelectedRowHoverBg: string;
// FIXME: zIndexXxxx 统一提到一个地方
zIndexTableFixed: number;
zIndexTableSticky: number;
tabelFontSizeMiddle: number;
tabelFontSizeSmall: number;
tableSelectionColumnWidth: number;
tableExpandIconBg: string;
tableExpandedRowBg: string;
}
const genTableStyle: GenerateStyle<TableToken, CSSObject> = token => {
const { componentCls } = token;
const tableBorder = `${token.controlLineWidth}px ${token.controlLineType} ${token.tableBorderColor}`;
return {
[`${componentCls}-wrapper`]: {
clear: 'both',
maxWidth: '100%',
...clearFix(),
[componentCls]: {
...resetComponent(token),
fontSize: token.tableFontSize,
background: token.tableBg,
borderRadius: token.tableRadius,
},
// https://github.com/ant-design/ant-design/issues/17611
table: {
width: '100%',
textAlign: 'start',
borderRadius: `${token.tableRadius}px ${token.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: `${token.tablePaddingVertical}px ${token.tablePaddingHorizontal}px`,
overflowWrap: 'break-word',
},
// ============================ Title =============================
[`${componentCls}-title`]: {
padding: `${token.tablePaddingVertical}px ${token.tablePaddingHorizontal}px`,
},
// ============================ Header ============================
[`${componentCls}-thead`]: {
'> tr > th': {
position: 'relative',
color: token.tableHeaderTextColor,
fontWeight: 500,
textAlign: 'start',
background: token.tableHeaderBg,
borderBottom: tableBorder,
transition: `background ${token.motionDurationSlow} 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: token.tableHeaderCellSplitColor,
transform: 'translateY(-50%)',
transition: `background-color ${token.motionDurationSlow}`,
content: '""',
},
},
'> tr:not(:last-child) > th[colspan]': {
borderBottom: 0,
},
},
// ============================ Body ============================
[`${componentCls}-tbody`]: {
'> tr': {
'> td': {
borderBottom: tableBorder,
transition: `background ${token.motionDurationSlow}`,
// ========================= Nest Table ===========================
[`
> ${componentCls}-wrapper:only-child,
> ${componentCls}-expanded-row-fixed > ${componentCls}-wrapper:only-child
`]: {
[componentCls]: {
marginBlock: `-${token.tablePaddingVertical}px`,
marginInline: `${
token.tablePaddingHorizontal + Math.ceil(token.fontSizeSM * 1.4)
}px -${token.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: token.tableRowHoverBg,
},
[`&${componentCls}-row-selected`]: {
'> td': {
background: token.tableSelectedRowBg,
// FIXME
borderColor: 'rgba(0, 0, 0, 0.03)',
},
'&:hover > td': {
background: token.tableSelectedRowHoverBg,
},
},
},
},
// ============================ Footer ============================
[`${componentCls}-footer`]: {
padding: `${token.tablePaddingVertical}px ${token.tablePaddingHorizontal}px`,
color: token.tableFooterTextColor,
background: token.tableFooterBg,
},
},
};
};
// ============================== Export ==============================
export default genComponentStyleHook('Table', token => {
// FIXME: missing tokens
const tableSelectedRowBg = token.controlItemBgActive;
const zIndexTableFixed: number = 2;
const tableToken = mergeToken<TableToken>(token, {
tableFontSize: token.fontSizeBase,
tableBg: token.colorBgComponent,
tableRadius: token.radiusBase,
/*
@table-padding-vertical: 16px;
@table-padding-horizontal: 16px;
@table-padding-vertical-md: (@table-padding-vertical * 3 / 4);
@table-padding-horizontal-md: (@table-padding-horizontal / 2);
@table-padding-vertical-sm: (@table-padding-vertical / 2);
@table-padding-horizontal-sm: (@table-padding-horizontal / 2);
*/
tablePaddingVertical: token.padding,
tablePaddingHorizontal: token.padding,
tablePaddingVerticalMiddle: (token.padding * 3) / 4,
tablePaddingHorizontalMiddle: token.padding / 2,
tablePaddingVerticalSmall: token.padding / 2,
tablePaddingHorizontalSmall: token.padding / 2,
tableBorderColor: token.colorSplit,
tableHeaderTextColor: token.colorTextHeading,
tableHeaderBg: token.colorBgComponentSecondary,
tableFooterTextColor: token.colorTextHeading,
tableFooterBg: token.colorBgComponentSecondary,
tableHeaderCellSplitColor: 'rgba(0, 0, 0, 0.06)',
tableHeaderSortBg: token.colorBgContainer,
tableHeaderSortHoverBg: 'rgba(0, 0, 0, 0.04)',
tableHeaderIconColor: '#bfbfbf',
tableBodySortBg: '#fafafa',
tableFixedHeaderSortActiveBg: 'hsv(0, 0, 96%)',
tableHeaderFilterActiveBg: 'rgba(0, 0, 0, 0.04)',
tableFilterDropdownBg: token.colorBgComponent,
tableFilterDropdownMaxHeight: 264,
tableRowHoverBg: token.colorBgComponentSecondary,
tableSelectedRowBg,
tableSelectedRowHoverBg: new TinyColor(tableSelectedRowBg).darken(2).toHexString(),
zIndexTableFixed,
zIndexTableSticky: zIndexTableFixed + 1,
tabelFontSizeMiddle: token.fontSizeBase,
tabelFontSizeSmall: token.fontSizeBase,
tableSelectionColumnWidth: 32,
tableExpandIconBg: token.colorBgComponent,
tableExpandedRowBg: token.colorBgComponentSecondary,
});
return [
genTableStyle(tableToken),
genPagniationStyle(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),
];
});